Как создать локальный репозиторий APT?

93

Я хотел бы создать собственный локальный репозиторий в своей локальной сети, чтобы машины в локальной сети могли обновлять и обновлять его. Я хочу загрузить пакеты и сохранить их на своем локальном сервере, чтобы я мог обновлять, обновлять, устанавливать и т. Д., Не используя Интернет.

    
задан grooveplex 31.07.2012 в 11:15
источник

10 ответов

39

* Сделать автономный репозиторий через локальную сеть *

Установить локальный веб-сервер Apache >

# apt-get install apache2

По умолчанию в пакете Apache Apache будет установлен веб-сайт в /var/www в вашей системе. Для наших целей это прекрасно, поэтому нет причин делать что-то еще. Вы можете легко протестировать его, указав свой любимый браузер на http://localhost . Вы должны увидеть веб-страницу после установки по умолчанию, которая фактически хранится в /var/www/index.html


Создайте каталог репозитория пакетов Debian

выбрал для этого каталог /var/www/debs . Под ним вы должны создать каталоги «архитектуры», по одному для каждой архитектуры, которую необходимо поддерживать. Если вы используете только один компьютер (или тип компьютера), вам понадобится только один - обычно «i386» для 32-разрядных систем или «amd64» для 64 бит. Если вы используете какую-либо другую архитектуру, я предположим, что вы, вероятно, уже знаете об этом. Теперь просто скопируйте файлы пакета «.deb» для данной архитектуры в соответствующие каталоги. Если вы сейчас укажете свой любимый веб-браузер на http://localhost/debs/amd64 (например), вы увидите список пакетов для 64-битных систем.


Создать файл Packages.gz

Теперь нам нужно создать файл каталога для использования APT. Это делается с помощью утилиты, называемой «dpkg-scanpackages». Вот команды, которые я использую для обновления пакетов AMD64 в локальной сети:

# cd /var/www/debs/

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




Сделать известный репозиторий APT

Теперь остается только сообщить APT о вашем репозитории. Вы делаете это, обновляя файл /etc/apt/sources.list. Вам понадобится запись, подобная этой:

deb http://localhost/debs/ amd64/

Я использовал фактическое имя хоста моей системы вместо localhost - таким образом, код будет одинаковым для всех компьютеров в моей локальной сети, но localhost будет отлично работать, если вы используете только один компьютер.
Теперь обновите APT:

# apt-get update
    
ответ дан user61928 05.09.2012 в 14:43
источник
74

В вики-странице справки Ubuntu :

There are 4 steps to setting up a simple repository for yourself

1.Install dpkg-dev
2.Put the packages in a directory
3.Create a script that will scan the packages and create a file apt-get update can read
4. Add a line to your sources.list pointing at your repository

Install dpkg-dev

Type in a terminal

sudo apt-get install dpkg-dev

The Directory

Create a directory where you will keep your packages. For this example, we'll use /usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs

Now move your packages into the directory you've just created.

Previously downloaded Packages are generally stored on your system in the /var/cache/apt/archives directory. If you have installed apt-cacher you will have additional packages stored in its /packages directory.

The Script update-mydebs

It's a simple three liner:

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

Cut and paste the above into gedit, and save it as update-mydebs in ~/bin. (the tilde '~' means your home directory. If ~/bin does not exist, create it: Ubuntu will put that directory in your PATH. It's a good place to put personal scripts). Next, make the script executable:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages looks at all the packages in mydebs, and the output is compressed and written to a file (Packages.gz) that apt-get update can read (see below for a reference that explains this in excruciating detail). /dev/null is an empty file; it is a substitute for an override file which holds some additional information about the packages, which in this case is not really needed. See deb-override(5) if you want to know about it.

Sources.list

add the line

deb file:/usr/local/mydebs ./

to your /etc/apt/sources.list, and you're done.

CD Option

You can burn the directory containing the debs to a CD and use that as a repository as well (good for sharing between computers). To use the CD as a repository, simply run

sudo apt-cdrom add

Using the Repository

Whenever you put a new deb in the mydebs directory, run

sudo update-mydebs
sudo apt-get update

Now your local packages can be manipulated with Synaptic, aptitude and the apt commands: apt-get, apt-cache, etc. When you attempt to apt-get install, any dependencies will be resolved for you, as long as they can be met.

Badly made packages will probably fail, but you won't have endured dpkg hell.

    
ответ дан BigSack 16.08.2012 в 13:45
13

Создание аутентифицированного репозитория

Я рассмотрел ответы здесь и на других сайтах, и большинство из них (недостаток IMHO) - это то, что вы настраиваете не прошедший проверку подлинность репозиторий. Это означает, что вам нужно запустить apt-get с --allow-unauthenticated для установки пакетов из него. Это может представлять угрозу безопасности, особенно в сценариях, в которых пакеты, которые вы устанавливаете, могут быть не все из вашего локального репозитория.

Обратите внимание, что я не рассматривал здесь, как сделать его доступным по локальной сети, но это довольно общая конфигурация с использованием Apache или nginx (см. другие ответы здесь).

Настройка каталога репо

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

Затем добавьте такую строку в sources.list :

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

Добавление и удаление пакетов

удалить пакеты

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

добавить пакеты

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

теперь запускается следующий скрипт, который генерирует файлы Packages, Release и InRelease и подписывает их с помощью закрытого ключа 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

Пример содержимого файла conf / distributions

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

Ссылки

Ссылка

Ссылка

Ссылка

    
ответ дан happyskeptic 15.05.2016 в 09:33
7

Вы также можете настроить локальный исходный сервер на nginx и reprepro:

  1. Установить пакеты debian

    sudo apt-get install reprepro nginx 
    
  2. создавать каталоги для reprepro и редактировать его

    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 / убунту / CONF / распределения

    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 / убунт / CONF / опции

    ask-passphrase
    basedir .
    
  3. Включить его в reprepro, построить его

    $ 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. Конфигурация 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. Оптимизируйте размер ковша:

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

    server_names_hash_bucket_size 64;
    

Ссылка на Установить ссылку на руководство

    
ответ дан elprup 03.07.2013 в 11:18
5

Возможно, вы захотите взглянуть на apt-mirror и apt-cacher .

Вот руководство по как установить и используйте его.

    
ответ дан con-f-use 31.07.2012 в 13:02
4

There are several reasons you may want to create a local repository. The first is that you want to save on bandwidth if you have multiple Ubuntu machines to update. For example if you had 25 Ubuntu machines that all needed updating at least once a week, you would significantly save bandwidth because you could do all but the repository locally.

Most organizations have decent bandwidth for their network gateways but this bandwidth is a precious commodity that needs to be used wisely.

Many organizations still have routers with 10MB or 100MB limits at the gateway but 1 GB network connections internally so bandwidth could be better used internally. The second reason for creating your own repository is that you can control what applications are loaded on your internal Ubuntu machines.

You can remove any applications your organization does not want to use on the local network from the repository that updates the machines. Even better, you can create a test box and test applications and versions before you allow them to roll out into your network assuring security and stability.

You first have to setup a mirror, to do that you need to Just press Ctrl+Alt+T on your keyboard to open Terminal. When it opens, run the command below.

apt-get install apt-mirror 

Once you have your set up apt-mirror you can start your download of the repository with this command.

apt-mirror /etc/apt/mirror.list1

Читать дальше

1 Источник: Создание репозитория Ubuntu

    
ответ дан Mitch 17.08.2012 в 00:29
3

Сделать автономный локальный репозиторий
1. Сделать доступным dir (по крайней мере, root)

sudo mkdir /var/my-local-repo

  1. скопируйте все файлы deb в этот каталог.
  2. сканировать каталог

sudo dpkg-scanpackages /var/my-local-repo /dev/null > /var/my-local-repo/Packages

  1. добавить локальный репозиторий в источники

echo "deb file:/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

    
ответ дан user61928 05.09.2012 в 14:32
1

Я попытался использовать apt-rdepends , как в выбранном ответе, но когда я попытался установить пакет из своего локального репозитория, он жаловался на отсутствие зависимостей.

apt-rdepends не перечисляло некоторые зависимости для моего пакета. Я подозреваю, что это имеет какое-то отношение к факту, что apt-cache show показывает несколько записей для него.

Вместо этого я использовал apt-cache depends , и это сделало трюк:

Получение рекурсивного списка зависимостей

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

-i : только важные зависимости --recurse : рекурсивный

превратить его в удобоваримый список

  • Удаление символов & amp; пробелы: | tr -d "|,<,>, "
  • Извлечение зависимостей: & amp; PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • Сортировка списка: | sort
  • Только уникальные значения: | uniq > list.txt

Завершить команду:

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

Загрузите пакеты

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

Сканировать пакеты и превращать их в Packages.gz

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
    
ответ дан Simon 08.06.2016 в 15:55
1

Инструкции в ответе BigSack выше и оригинал wiki, который он цитировал, не работал для меня, пока я не сделал два изменения:


1) Я создал плоский файл «Пакеты» вместо версии gzip'd:

dpkg-scanpackages -m . > Packages


2) Я добавил [trusted=yes] к записи репо в sources.list,

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


Я подозреваю, что # 2 - это просто вопрос устаревания вики Ubuntu. Я не уверен, почему № 1 был необходим, но поскольку я не мог найти его документированным где-либо еще, я хотел убедиться, что решение было общедоступным.

    
ответ дан Wowfunhappy 28.04.2018 в 20:33
-1

Я сделал, используя apt-mirror.

Хорошо, но вам нужно иметь больше места на жестком диске, поскольку он будет синхронизироваться с сервером репозитория.

    
ответ дан Caterpillar 31.07.2012 в 13:25