Как мне скопировать выбранные пакеты из одной системы Debian в другую? (Debian Wheezy)

19

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

Для этого я выполнил базовую установку Debian Wheezy (так же, как в основной системе) на виртуальной машине, затем запустил ее с правами root:

# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh me@main-system 'dpkg --get-selections | grep -v deinstall' | \
  dpkg --set-selections

В моем случае, к сожалению, нужна архитектура i386; система amd64 родная.

Проблема с dpkg --set-selectionsзапуском в ВМ. У меня есть некоторые пакеты, которые требуют особой обработки (это на самом деле главная причина, по которой я в первую очередь хочу промежуточную среду), но когда я запускаю последнюю команду, приведенную выше, я получаю около тысячи строк вывода, например:

dpkg: warning: package not in database at line NNN: package-name

для пакетов, которые действительно должны быть доступны в базовой системе. Примеры включают в себя xterm, yelpи zip.

Теперь на мой вопрос:

Каков конкретный процесс переноса списка выбора пакетов из одной системы Debian в другую (при условии того же уровня выпуска Debian в Wheezy) и последующего применения этих изменений? Цель состоит в том, чтобы у обоих был один и тот же список установленных пакетов, в идеале такой, чтобы выполнение diffмежду выходами dpkg --get-selectionsили dpkg --listна двух возвращалось без различий.

Эта grep -v deinstallчасть заимствована из пакета Prevent для удаления после выполнения операцииdpkg --set-selections над Ask Ubuntu.

Я изменил источник в ВМ, чтобы он был таким же, как в основной системе, а также установил apt-transport-https:

deb https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb [arch=amd64] http://archive.zfsonlinux.org/debian wheezy main

Глядя на вывод --set-selections, я вижу:

dpkg: warning: package not in database at line 1: a2ps
dpkg: warning: package not in database at line 1: abiword
dpkg: warning: package not in database at line 1: abiword-common
dpkg: warning: package not in database at line 1: abiword-plugin-grammar
dpkg: warning: package not in database at line 1: abiword-plugin-mathview
dpkg: warning: package not in database at line 1: accountsservice
dpkg: warning: package not in database at line 1: acl
dpkg: warning: package not in database at line 4: aglfn
dpkg: warning: package not in database at line 4: aisleriot
dpkg: warning: package not in database at line 4: alacarte
dpkg: warning: package not in database at line 4: alien
...

Номера строк выглядели странно, и соответствующая часть вывода --get-selections:

a2ps install
abiword install
abiword-common install
abiword-plugin-grammar install
abiword-plugin-mathview install
accountsservice install
acl install
acpi-support-base install
acpid install
adduser install
aglfn install
aisleriot install
alacarte install
alien install

Обратите внимание, что между aclи aglfnесть acpi-support-base, acpidи adduser для которых нет сообщений об ошибках . Похоже, что пакеты, для которых сообщается об ошибках, либо unсоответствуют dpkg -l, либо dpkg -lне имеют о них никакого представления ( dpkg-query: no packages found matching ...). Я знаю, что есть несколько локально установленных пакетов, но не так много. i386отображается не gcc-4.7-base:i386 install намного дальше вниз по списку (строка 342 в выводе --get-selections).

CVn
источник
dpkg --get-selections … | … dpkg --set-selectionsспособ репликации выбранных пакетов Если это не помогло вам, вам нужно будет предоставить больше информации о том, почему. Разместите свой полный набор источников в обеих системах, выходные данные dpkg --get-selectionsи полную расшифровку dpkg --get-selections(возможно, мы сможем определить образец, посмотрев, что работает, а что нет). Если основная система amd64 или i386? Это работает, если вы не добавите архитектуру i386?
Жиль "ТАК - перестань быть злым"
@ Жиль Действительно ли это должен быть полный вывод dpkg --get-selections(и я полагаю, вы имели в виду dpkg --set-selectionsрасшифровку стенограммы?)? Даже первый из них содержит более 3600 строк и около 100 КБ.
CVn
Вам необходимо опубликовать достаточно, чтобы мы могли определить, какие пакеты вызывают ошибки, а какие нет (если вы сами не можете это выяснить). Копия /var/lib/dpkg/Packages(которая еще длиннее) также может быть полезной - это может быть признаком испорченного файла Packages.
Жиль "ТАК - перестань быть злым"
@ Жиль Интересный момент. Я на самом деле не рассматривал возможность, но я использую разные зеркала на них. Давайте посмотрим, произойдет ли это, если я укажу виртуальную машину на то же зеркало Debian. Ожидать.
CVn
@ Жиль: На самом деле ничего не изменилось, но я нашел кое-что еще. Смотрите обновленный вопрос.
CVn

Ответы:

17

Чтобы клонировать установку Debian, используйте apt-cloneутилиту. Он доступен (как отдельный пакет, не является частью установки по умолчанию) в Debian начиная с wheezy и в Ubuntu с 12.04. На существующей машине запустите

apt-clone clone foo

Это создает файл foo.apt-clone.tar.gz. Скопируйте его на целевой компьютер и запустите

apt-get install apt-clone
apt-clone restore foo.apt-clone.tar.gz

Если вы работаете со старой системой, apt-cloneкоторая недоступна, или если вы просто хотите скопировать список установленных пакетов, но не какой-либо файл конфигурации, выполните шаги вручную.

  • На исходном компьютере:

    cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list
    dpkg --get-selections >selections.list
    apt-mark showauto >auto.list
    
  • На целевой машине:

    cp sources.list /etc/apt/
    apt-get update
    /usr/lib/dpkg/methods/apt/update /var/lib/dpkg/
    dpkg --set-selections <selections.list
    apt-get dselect-upgrade
    xargs apt-mark auto <auto.list
    

Я полагаю, что на вас повлияло несовместимое изменение в dpkg, которое сначала превратило его в wheezy. Смотрите ошибка # 703092 для фона.

Короткая история заключается в том, что dpkg --set-selectionsтеперь принимаются только имена пакетов, которые присутствуют в файле /var/lib/dpkg/statusили /var/lib/dpkg/available. Если вы используете APT только для управления пакетами, как и большинство людей, /var/lib/dpkg/availableэто не обновляется.

После запуска apt-get updateи перед запуском dpkg --set-selectionsи apt-get -u dselect-upgradeвыполните следующую команду:

apt-cache dumpavail >/tmp/apt.avail
dpkg --merge-avail /tmp/apt.avail

С Джесси, вы можете упростить это до

apt-cache dumpavail | dpkg --merge-avail

Или запустить

/usr/lib/dpkg/methods/apt/update /var/lib/dpkg/

или даже проще

apt-get install dctrl-tools
sync-available

Другой простой метод, который не требует установки дополнительного пакета, но будет загружать списки пакетов снова:

dselect update

См. Dpkg FAQ для получения дополнительной информации. (Это упомянуто на странице справки dpkg, но в большей степени напоминает вам о проблеме, если вы уже знали, а не объясняет, как решить проблему!)

Обратите внимание, что клонирование установки пакета с помощью dpkg --set-selectionsне восстанавливает автоматическую / ручную отметку в APT. См. Восстановление всех данных и зависимостей из dpkg --set-selections '*' для получения более подробной информации. Вы можете сохранить отметки в исходной системе с помощью

apt-mark showauto >auto.list

и восстановить их в целевой системе с

xargs apt-mark auto <auto.list
Жиль "ТАК - прекрати быть злым"
источник
3
Эта проблема должна быть гораздо более заметной, чем она есть. Я не могу поверить, что я не слышал об этом раньше!
Фахим Митха
Интересный. Собираюсь дать этому шанс. Благодарность!
CVn
@FaheemMitha Да, я удивлен, что никогда не слышал об этом до сегодняшнего дня. Я не могу поверить, что я не использовал dpkg --set-selectionsс момента pre-wheezy!
Жиль "ТАК - перестань быть злым"
Хорошо, это дало намного более короткий список предупреждений от --set-selections. Теперь, как я могу применить изменения? Даже apt-get -u dist-upgradeупоминается лишь несколько пакетов (все связанные с ZFS), в которых должны быть затронуты сотни, если не тысячи пакетов.
CVn
@ MichaelKjörling Этоapt-get -u dselect-upgrade
Жиль "ТАК - перестань быть злым"
0

Как я это сделал

  1. На исходном хосте:

    apt-get update && apt-get dist-upgrade
    dpkg --get-selection >/tmp/source.sel
    cat /etc/apt/sources.list
    

    заботиться о том, /etc/apt/sources.list.dесли используется ...

    Затем скопируйте source.selфайл на хост назначения.

  2. На хосте назначения :

    vi /etc/apt/sources.list 
    

    адаптировать sources.list даже с разными зеркалами, но с тем же списком компонентов .

    apt-get update
    dselect upgrade
    dpkg --set-selection </tmp/source.sel
    dselect install
    

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

техно
источник
Возможно, «dselect upgrade» должно быть «dselect update» в описании «Как я это сделал» выше.
Джонатан Киммитт