Зеркальное подмножество репозитория для amd64 Гостеприимных 16.04 только *без* хост Ubuntu

Я пытаюсь сохранить офлайновую машину (16,04 amd64 ноутбуков) актуальный путем зеркального отражения репозиториев программного обеспечения Ubuntu. К сожалению, у меня есть много ограничений вне моего управления:

  1. Хост-машина (подключенный к Интернету) является CentOS 7. Я не имею apt-mirror, debmirror, или права администратора. Я действительно имею wget, rsync, и я скомпилировал lftp
  2. Хотя я действительно имею rsync, rsyncd.service не работает.

    $ systemctl list-unit-files | grep rsync
    ...
    rsyncd.service                                disabled
    ...
    

    Таким образом, я не уверен, что могу даже использовать rsync использование инструкций в документации Rsyncmirror согласно этому ответу.

  3. Портативный диск составляет только 1 ТБ со свободным ~850Gb. Мне не нужен никакой исходный код от repos, просто двоичные файлы, но даже все еще, у меня даже есть достаточно пространства?
  4. Медленная сеть. Едва ли ограничение, но раздражение. У меня есть способность позволить этой загрузке пойти за выходные или, пока она берет, но предпочла бы что-то, что поддерживает параллельные загрузки.

Что я попробовал:

  1. rsync -a --bwlimit=128 rsync://archive.ubuntu.com/ubuntu /media/mirror/ubuntu Это перестало работать с теми же ошибками как показано в показанном в этом ответе. Я не могу запустить rsynd.service без администратора, таким образом, я думаю, что это не, идут.
  2. Наивный wget --recursive http://se.archive.ubuntu.com/ubuntu/. Это втягивает слишком много материала и довольно медленно. Не уверенный в любом способе отфильтровать файлы я не нуждаюсь или делаю любую параллельную загрузку.
  3. lftp. Я думаю, что это показывает большую часть обещания в данный момент. Например:

    $ lftp http://mirror.math.princeton.edu/pub/ubuntu/
    cd ok, cwd=/pub/ubuntu
    lftp mirror.math.princeton.edu:/pub/ubuntu> mirror -n -parallel=10
    

    работает отлично, но конечно также просто собирается вытянуть во всем. Я могу исключить то, с чем я хочу --exclude-globs (например. --exclude-glob "*trusty*/" --exclude-glob "*artful*/" --exclude-glob "*bionic*/" --exclude-glob "*precise*/" --exclude-glob "*.tar.gz"), но что должно я исключать для обрезки размера, все еще заставляя содержание создать рабочий репозиторий.

Я знаю что после того, как я сделан, получив все пакеты, при помощи которых я оказываюсь перед необходимостью на самом деле делать это работой repo dpkg-scanpackages или что-то подобное. Я могу сделать это от офлайнового ноутбука с помощью инструментов Ubuntu/Debian, так, чтобы не касался меня так же. Я действительно просто хочу надеть некоторый совет, как только загрузить пакеты, которые важны для моей машины.

1
задан 10 October 2018 в 17:05

1 ответ

Я понял, что могло бы иметь больше смысла идти с аддитивным подходом, а не субтрактивным; то есть, получите список всех файлов/пакетов, я нуждаюсь и затем загружаю только те (вместо того, чтобы пытаться отфильтровать всех тех, я не хочу).

Списки пакетов хранятся в Packages.gz, таким образом, я записал сценарий для загрузки всех сжатых списков пакетов, я хочу, извлекаю имена пакета из списков, составляю этот список в lftp сценарий, и затем запускается lftp.

Я думаю, что это было бы достаточно как минимум, но я также синхронизирую несколько других папок с некоторыми метаданными, которые кажутся важными.

#!/bin/sh
remote="http://mirror.math.princeton.edu"
dists=( xenial xenial-security xenial-updates)
repos=( main restricted universe multiverse)
package_lists=()

printf "open %s \ncd /pub/ubuntu/\n" "$remote" > sync-mirror.lftp

echo "mirror -n -v -O ubuntu/indices -f indices/md5sums.gz" >> sync-mirror.lftp

for dist in "${dists[@]}"; do
    for repo in "${repos[@]}"; do
        pkg_lists+=("$remote/pub/ubuntu/dists/$dist/$repo")
        echo "mirror -n -v --parallel=10 -O ubuntu/indices -f indices/override.$dist.$repo" >> sync-mirror.lftp
        echo "mirror -n -v --parallel=10 -O ubuntu/dists/$dist/$repo -F dists/$dist/$repo/binary-amd64" >> sync-mirror.lftp
        echo "mirror -n -v --parallel=10 -O ubuntu/dists/$dist/$repo -F dists/$dist/$repo/dep11" >> sync-mirror.lftp
        echo "mirror -n -v --parallel=10 -O ubuntu/dists/$dist/$repo -F dists/$dist/$repo/i18n" >> sync-mirror.lftp
    done
done

for pkg_list in "${pkg_lists[@]}"; do
    curl "$pkg_list/binary-amd64/Packages.gz" | \
        gunzip | \
        grep Filename | \
        sed 's|Filename: \(.*\)|mirror -n -v --parallel=10 -O ubuntu/\1 -f \1 |g' >> sync-mirror.lftp

done

printf "\n exit\n" >> sync-mirror.lftp

 lftp -f sync-mirror.lftp

Я хотел бы просто питаться mirror список файлов и говорит этому загружать параллельно, но я не нашел способ сделать это. Я думаю, что существующий метод занимает больше времени, чем он должен из-за всех отдельных вызовов к mirror. Кроме того, я не уверен --parallel флаг делает что-либо в сочетании с -f так как это только получает единственный файл.

Запущение скрипта за выходные и протестирует, когда я возвращусь. Обновит ответ с результатами.

0
ответ дан 7 December 2019 в 22:59

Другие вопросы по тегам:

Похожие вопросы: