Como criar um repositório local do APT?

103

Gostaria de criar meu próprio repositório local na minha LAN, para que as máquinas na LAN possam atualizar e atualizar a partir dele. Quero baixar os pacotes e armazená-los no meu servidor local para que eu possa atualizar, atualizar, instalar etc. dele sem usar a Internet.

grooveplex
fonte
2
Possível duplicata: askubuntu.com/questions/974/…
stephenmyall
3
Eu não acho que é uma duplicata. O que maythux deseja realizar é criar seu próprio servidor de repositório para uso com o aptitude. O que o Keryx faz é substituir o aptitude como gerenciador de pacotes e criar fontes externas para os pacotes.
con-f-use

Respostas:

80

No wiki de ajuda do Ubuntu :

Existem 4 etapas para configurar um repositório simples para si mesmo

1.Install dpkg-dev
2.Put os pacotes em um diretório
3.Create um script que irá analisar os pacotes e criar uma atualização de arquivo apt-get pode ler
4. Adicione uma linha ao seu sources.list apontando para seu repositório

Instale o dpkg-dev

Digite um terminal

sudo apt-get install dpkg-dev

O diretório

Crie um diretório onde você manterá seus pacotes. Neste exemplo, usaremos/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Agora mova seus pacotes para o diretório que você acabou de criar.

Pacotes baixados anteriormente geralmente são armazenados em seu sistema no /var/cache/apt/archivesdiretório Se você instalou o apt-cacher, você terá pacotes adicionais armazenados em seu diretório / packages.

O script update-mydebs

É um forro simples de três:

#! /bin/bash
 cd /usr/local/mydebs
 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

Recorte e cole o que foi dito acima no gedit e salve-o como update-mydebs em ~ / bin. (o til '~' significa o diretório inicial. Se o ~ / bin não existir, crie-o: o Ubuntu colocará esse diretório no seu PATH. É um bom lugar para colocar scripts pessoais). Em seguida, torne o script executável:

chmod u+x ~/bin/update-mydebs

How the script works:

O dpkg-scanpackages analisa todos os pacotes nos mydebs e a saída é compactada e gravada em um arquivo (Packages.gz) que o apt-get update pode ler (veja abaixo uma referência que explica isso com detalhes excruciantes). / dev / null é um arquivo vazio; é um substituto para um arquivo de substituição que contém algumas informações adicionais sobre os pacotes, que neste caso não são realmente necessárias. Veja deb-override (5) se você quiser saber sobre isso.

Sources.list

adicione a linha

deb file:/usr/local/mydebs ./

ao seu /etc/apt/sources.list e pronto.

Opção de CD

Você pode gravar o diretório que contém as debs em um CD e usá-lo também como repositório (bom para compartilhar entre computadores). Para usar o CD como repositório, basta executar

sudo apt-cdrom add

Usando o Repositório

Sempre que você colocar uma nova deb no diretório mydebs, execute

sudo update-mydebs
sudo apt-get update

Agora, seus pacotes locais podem ser manipulados com Synaptic, aptitude e os comandos apt: apt-get, apt-cache, etc. Quando você tenta instalar o apt-get, todas as dependências serão resolvidas por você, desde que possam ser atendidas. .

Pacotes mal feitos provavelmente falharão, mas você não terá suportado o dpkg.

BigSack
fonte
3
Você poderia explicar a sintaxe na linha dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz. O que está /dev/nullfazendo lá. Também li a página de manual, mas não estava bem claro.
sayantankhan
@ blade19899 Preciso de um pouco de esclarecimento, por favor. Quero um repositório com apenas alguns pacotes selecionados, nem todos os pacotes que já toquei. Estou certo de que essa técnica me dará essa capacidade? O objetivo aqui é ter um repositório que um grupo de instalação de software possa usar em uma LAN isolada, longe das tentações de obter o desnecessário.
28813 Wes Miller
@WesMiller Eu acho que você precisa, acabei de editar o seu post!
blade19899
@ blade19899 Me desculpe, eu não entendo sua resposta.
Wes Miller
@WesMiller u precisa BigSack I acabou de editar o seu posto para questões de gramática (eu acho que é bin algum tempo) esta não é minha resposta, mas de BigSack
blade19899
41

* Para criar um repositório offline pela LAN *

Instale um servidor Web Apache local

# apt-get install apache2

Por padrão, o pacote Apache do Debian configurará um site /var/wwwno seu sistema. Para nossos propósitos, tudo bem, então não há razão para fazer mais nada. Você pode testá-lo facilmente apontando o seu navegador favorito em http://localhostVocê deve ver a página da Web pós-instalação padrão que está realmente armazenada em /var/www/index.html


Criar um Diretório de Repositório de Pacotes Debian,

escolhido para criar um diretório/var/www/debspor esta. Sob ele, você deve criar diretórios de "arquitetura", um para cada arquitetura que você precisa suportar. Se você estiver usando apenas um computador (ou tipo de computador), precisará apenas de um - normalmente "i386" para sistemas de 32 bits ou "amd64" para 64 bits. Se você estiver usando alguma outra arquitetura, presumo que você provavelmente já saiba disso. Agora, basta copiar os arquivos do pacote ".deb" para uma determinada arquitetura nos diretórios apropriados. Se você apontar seu navegador da Web favorito para http://localhost/debs/amd64(por exemplo), verá uma lista dos pacotes para sistemas de 64 bits.


Crie um arquivo Packages.gz

Agora, precisamos criar um arquivo de catálogo para o APT usar. Isso é feito com um utilitário chamado "dpkg-scanpackages". Aqui'

# cd /var/www/debs/

# dpkg-scanpackages amd64 | gzip -9c > amd64/Packages.gz




Tornar o repositório conhecido pelo APT

Agora, a única coisa que resta a fazer é informar o APT sobre o seu repositório. Você faz isso atualizando seu arquivo /etc/apt/sources.list. Você precisará de uma entrada como esta:

deb http://localhost/debs/ amd64/

Usei o nome do host real do meu sistema em vez do localhost - dessa maneira, o código é o mesmo para todos os computadores da minha LAN, mas o localhost funcionará bem se você estiver executando apenas um computador.
Agora, atualize o APT:

# apt-get update

fonte
2
Adicionar essa linha ao /etc/apt/sources.list interromperá as atualizações quando não estiver na LAN, não é?
Felix
2
Para o Ubuntu 16.04, pode ser necessário substituir /var/www/debsnesta resposta por /var/www/html/debs. Ou você precisará de etapas extras para editar manualmente sua configuração do apache em/etc/apache2
Erik
18

Criando um repositório autenticado

Eu dei uma olhada nas respostas aqui e em outros sites e a maioria tem a (grande IMHO) desvantagem de que você está configurando um repositório não autenticado. Isto significa que você precisa executar apt-getcom --allow-unauthenticatedpara instalar pacotes a partir dele. Isso pode ser um risco à segurança, especialmente em scripts nos quais os pacotes que você está instalando podem não ser do seu repositório local.

Observe que eu não mencionei aqui como disponibilizá-lo pela LAN, mas essa é uma configuração bastante genérica usando Apache ou nginx (consulte as outras respostas aqui).

Configure o diretório repo

mkdir /home/srv/packages/local-xenial
cd /home/srv/packages/local-xenial

Em seguida, adicione uma linha como esta para sources.list:

deb file:/home/srv/packages/local-xenial/ ./

Adicionando e removendo pacotes

remover pacotes

rm /home/srv/packages/local-xenial/some_package_idont_like

adicionar pacotes

cp /some/dir/apackage.deb /home/srv/packages/local-xenial

Agora, execute o seguinte script que gera os arquivos Packages, Release e InRelease e assina-os com sua chave privada gpg:

#!/bin/bash

if [ -z "$1" ]; then
       echo -e "usage: `basename $0` DISTRO
where DISTRO is the Ubuntu version codename (e.g. 14.04 is trusty)\n
The way to use this script is to do the changes to the repo first, i.e. delete or copy in the .deb file to /srv/packages/local-DISTRO, and then run this script\n
This script can be run as an unprivileged user - root is not needed so long as your user can write to the local repository directory"
else
    cd /srv/packages/local-"$1"

    # Generate the Packages file
    dpkg-scanpackages . /dev/null > Packages
    gzip --keep --force -9 Packages

    # Generate the Release file
    cat conf/distributions > Release
    # The Date: field has the same format as the Debian package changelog entries,
    # that is, RFC 2822 with time zone +0000
    echo -e "Date: `LANG=C date -Ru`" >> Release
    # Release must contain MD5 sums of all repository files (in a simple repo just the Packages and Packages.gz files)
    echo -e 'MD5Sum:' >> Release
    printf ' '$(md5sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release
    printf '\n '$(md5sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages' $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release
    # Release must contain SHA256 sums of all repository files (in a simple repo just the Packages and Packages.gz files)
    echo -e '\nSHA256:' >> Release
    printf ' '$(sha256sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release
    printf '\n '$(sha256sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages' $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release

    # Clearsign the Release file (that is, sign it without encrypting it)
    gpg --clearsign --digest-algo SHA512 --local-user $USER -o InRelease Release
    # Release.gpg only need for older apt versions
    # gpg -abs --digest-algo SHA512 --local-user $USER -o Release.gpg Release

    # Get apt to see the changes
    sudo apt-get update
fi

Exemplo de conteúdo do arquivo conf / distributions

Origin: My_Local_Repo Label: My_Local_Repo Codename: xenial Architectures: i386 amd64 Components: main Description: My local APT repository SignWith: 12345ABC

Ligações

https://wiki.debian.org/RepositoryFormat

http://ubuntuforums.org/showthread.php?t=1090731

https://help.ubuntu.com/community/CreateAuthenticatedRepository

happyskeptic
fonte
@Phillip sua edição usado date -Rc, eu corrigi-lo para date -Ruassumir que é o que você quis dizer a partir da descrição de edição
Muru
Obrigado, só recentemente comecei a receber avisos do apt sobre isso devido à data gerada na TZ local e não no UTC. Eu fixo-lo em meu próprio roteiro, mas se esqueça de editá-lo aqui
happyskeptic
1
@KevinJohnson Eu atualizei a resposta principal agora com um exemplo desse arquivo do meu repo apt locais
happyskeptic
8

Você também pode configurar o servidor de origem local por nginx e reprepro:

  1. Instale pacotes debian

    sudo apt-get install reprepro nginx 
    
  2. crie diretórios para reprepro e edite-os

    sudo mkdir -p /srv/reprepro/ubuntu/{conf,dists,incoming,indices,logs,pool,project,tmp}
    
    $ cd /srv/reprepro/ubuntu/
    $ sudo chown -R `whoami` . # changes the repository owner to the current user
    

    / srv / reprepro / ubuntu / conf / distributions

    Origin: Your Name
    Label: Your repository name
    Codename: karmic
    Architectures: i386 amd64 source
    Components: main
    Description: Description of repository you are creating
    SignWith: YOUR-KEY-ID
    

    / srv / reprepro / ubuntu / conf / options

    ask-passphrase
    basedir .
    
  3. Inclua-o no reprepro, construa-o

    $ reprepro includedeb karmic /path/to/my-package_0.1-1.deb \
    # change /path/to/my-package_0.1-1.deb to the path to your package
    
  4. Config nginx:

    /etc/nginx/sites-available/vhost-packages.conf

    server {
      listen 80;
      server_name packages.internal;
    
      access_log /var/log/nginx/packages-access.log;
      error_log /var/log/nginx/packages-error.log;
    
      location / {
        root /srv/reprepro;
        index index.html;
      }
    
      location ~ /(.*)/conf {
        deny all;
      }
    
      location ~ /(.*)/db {
        deny all;
      }
    }
    
  5. Otimize o tamanho da caçamba:

    /etc/nginx/conf.d/server_names_hash_bucket_size.conf

    server_names_hash_bucket_size 64;
    

Referência ao Link do Guia de Instalação

elprup
fonte
4
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
gertvdijk
@elprup: você deve ter esquecido de atualizar essa resposta :)
0xC0000022L
O reprepor não suporta várias versões do mesmo pacote. Parece estranho, mas é assim que o reprepro funciona
maxadamo
6

Você pode dar uma olhada em apt-mirrore apt-cacher.

Aqui está um guia sobre como instalar e usá-lo.

confundir
fonte
Uma resposta sua com cinco anos de idade está sendo sinalizada como LQ. Se for excluído, vá para a meta e peça uma exclusão. Votei para manter aberto , mas ele precisa de uma edição! ;-)
Fabby
5

As instruções na resposta do @ BigSack e na postagem wiki oficial do Ubuntu não funcionaram para mim no Ubuntu 18.04, até que eu fiz essas duas alterações:

  1. Gere um Packagesarquivo simples e não compactado (ao executar isso, o diretório de trabalho deve estar onde todos os pacotes estão localizados)

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. Adicione a seguinte entrada em /etc/apt/sources.list

    deb [trusted=yes] file:/usr/local/mydebs ./
    
Wowfunhappy
fonte
4

Há vários motivos pelos quais você pode querer criar um repositório local. A primeira é que você deseja economizar largura de banda se tiver várias máquinas Ubuntu para atualizar. Por exemplo, se você tivesse 25 máquinas Ubuntu que precisavam ser atualizadas pelo menos uma vez por semana, economizaria significativamente a largura de banda porque poderia fazer tudo, exceto o repositório localmente.

A maioria das organizações possui largura de banda decente para seus gateways de rede, mas essa largura de banda é uma mercadoria preciosa que precisa ser usada com sabedoria.

Muitas organizações ainda têm roteadores com limites de 10 MB ou 100 MB no gateway, mas conexões de rede de 1 GB internamente, para que a largura de banda possa ser melhor usada internamente. A segunda razão para criar seu próprio repositório é que você pode controlar quais aplicativos são carregados em suas máquinas Ubuntu internas.

Você pode remover todos os aplicativos que sua organização não deseja usar na rede local do repositório que atualiza as máquinas. Ainda melhor, você pode criar uma caixa de teste e testar aplicativos e versões antes de permitir que eles sejam lançados em sua rede, garantindo segurança e estabilidade.

Você primeiro precisa configurar um espelho, para isso basta pressionar Ctrl+ Alt+ Tno teclado para abrir o Terminal. Quando abrir, execute o comando abaixo.

apt-get install apt-mirror 

Depois de configurar o apt-mirror, você pode iniciar o download do repositório com este comando.

apt-mirror /etc/apt/mirror.list 1

Leia

1 Fonte: Crie um Repositório Ubuntu

Mitch
fonte
Desculpe, ligação está morto
xamiro
3

Para criar um repositório local offline
1. torne um diretório acessível (pelo menos por raiz)

sudo mkdir / var / meu-local-repo

  1. copie todos os arquivos deb para este diretório.
  2. varre o diretório

sudo dpkg-scanpackages / var / meu-local-repo / dev / null> / var / meu-local-repo / Pacotes

  1. adicione o repositório local às fontes

echo "arquivo deb: / var / my-local-repo ./"> /tmp/my-local.list

sudo mv /tmp/my-local.list /etc/apt/sources.list.d/my-local.list

sudo apt-get update


fonte
A mesma coisa também está no wiki oficial: Repositórios / Pessoais - Community Help Wiki
sdaau 23/02/14
1

Tentei usar apt-rdependscomo na resposta selecionada, mas quando tentei instalar o pacote do meu repositório local, ele se queixou de dependências ausentes.

apt-rdependsnão estava listando algumas das dependências do meu pacote. Eu suspeito que tem algo a ver com o fato, que apt-cache showmostra vários registros para ele.

Em vez disso, usei apt-cache depends, e isso fez o truque:

Obtendo uma lista recursiva de dependências

apt-cache depends <packagename> -i --recurse

-i: somente dependências importantes --recurse: recursiva

Transforme-o em uma lista digerível

  • Removendo símbolos e espaços: | tr -d "|,<,>, "
  • Removendo Depende: & PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Classificando a lista: | sort
  • Somente valores exclusivos: | uniq > list.txt

Comando completo:

apt-cache depends <packagename> -i --recurse | tr -d "|,<,>, " | sed -e \
's/^Depends://g' | sed -e 's/^PreDepends://g' | sort | uniq > list.txt

Faça o download dos pacotes

for i in $( cat list.txt ); do apt-get download $i; done;

Examine os pacotes e transforme-os em Packages.gz

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
Simon
fonte
1
Pode ser uma boa idéia para fazer referência que responder que você está falando ...
anonymous2
-1

Eu fiz usando o apt-mirror.

É bom, mas você precisa ter mais espaço no disco rígido, pois estará sincronizando com o servidor de repositórios.

Lagarta
fonte