Como criar um repositório local do APT?

94

Eu gostaria de construir 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., sem usar a Internet.

    
por grooveplex 31.07.2012 / 11:15

10 respostas

39

* Para fazer um repositório offline sobre a LAN *

Instale um servidor Web local do Apache

# apt-get install apache2

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


Crie um diretório do repositório de pacotes Debian

escolheu criar um diretório /var/www/debs para isso. 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), você só precisará de um - normalmente "i386" para sistemas de 32 bits ou "amd64" para sistemas de 64 bits. Se você estiver usando alguma outra arquitetura, eu suponho que você provavelmente já saiba disso. Agora, basta copiar os arquivos de pacote ".deb" de uma determinada arquitetura nos diretórios apropriados. Se você apontar agora seu navegador da Web favorito em http://localhost/debs/amd64 (por exemplo), verá uma listagem 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 estão os comandos que uso para atualizar os pacotes AMD64 na minha LAN:

# cd /var/www/debs/

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




Tornar o repositório conhecido para o APT

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

% bl0ck_qu0te%

Eu usei o nome do host real do meu sistema em vez do host local - assim o código é o mesmo para todos os computadores na minha LAN, mas o localhost vai se sair bem se você estiver executando apenas um computador. Agora atualize o APT:

# apt-get update
    
por user61928 05.09.2012 / 14:43
74

Do wiki da Ajuda do Ubuntu :

% bl0ck_qu0te%     
por BigSack 16.08.2012 / 13:45
13

Como criar um repositório autenticado

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

Note que eu não cobri aqui como disponibilizá-lo através da LAN, mas é uma configuração bastante genérica usando Apache ou nginx (veja as outras respostas aqui).

Configurar o diretório repo

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

Em seguida, adicione uma linha como esta ao 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 / distribuições

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

Links

link

link

link

    
por happyskeptic 15.05.2016 / 09:33
7

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 / distribuições

    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, crie-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. Otimizar o tamanho do depósito:

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

    server_names_hash_bucket_size 64;
    

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

    
por elprup 03.07.2013 / 11:18
5

Você pode querer dar uma olhada em apt-mirror e apt-cacher .

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

    
por con-f-use 31.07.2012 / 13:02
4
% bl0ck_qu0te%

Leia em

1 Fonte: Crie um repositório do Ubuntu

    
por Mitch 17.08.2012 / 00:29
3

Para criar um repositório local off-line
1. tornar um dir acessível (pelo menos pela raiz)

% bl0ck_qu0te%
  1. copie todos os arquivos deb para este diretório.
  2. verificar o diretório
% bl0ck_qu0te%
  1. adicione o repositório local a fontes
% bl0ck_qu0te%     
por user61928 05.09.2012 / 14:32
1

Eu tentei usar apt-rdepends como na resposta selecionada, mas quando tentei instalar o pacote do meu repositório local, ele reclamou sobre a falta de dependências.

apt-rdepends não estava listando algumas das dependências do meu pacote. Eu suspeito que tenha algo a ver com o fato de que apt-cache show mostra vários registros para ele.

Em vez disso, usei apt-cache depends , e isso funcionou:

Como obter uma lista recursiva de dependências

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

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

Transforme-o em uma lista de fácil digestão

  • Como remover símbolos e amp; espaços: | tr -d "|,<,>, "
  • Remoção Depende: & amp; PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Classificando a lista: | sort
  • Apenas valores únicos: | uniq > list.txt

Complete o comando:

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;

Procure pelos pacotes e transforme-os em Packages.gz

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
    
por Simon 08.06.2016 / 15:55
1

As instruções em resposta do BigSack acima - e o postagem original do wiki da qual ele citou - não funcionou para mim até que eu fiz duas alterações:


1) Gerei um arquivo "Packages" simples em vez de uma versão gzip'd:

% bl0ck_qu0te%


2) Adicionei [trusted=yes] à entrada do repo em sources.list,

% bl0ck_qu0te%


Eu suspeito que o # 2 é simplesmente uma questão de o wiki do Ubuntu estar desatualizado. Não sei ao certo por que motivo # 1 era necessário, mas como não consegui encontrá-lo documentado em nenhum outro lugar, queria garantir que a solução estivesse disponível publicamente.

    
por Wowfunhappy 28.04.2018 / 20:33
-1

Eu fiz usando o apt-mirror.

É bom, mas você precisa ter mais espaço no disco rígido, pois ele será sincronizado com o servidor repos.

    
por Caterpillar 31.07.2012 / 13:25