Як реплікувати вибір встановленого пакету з однієї системи Debian в іншу? (Debian Wheezy)


19

Я намагаюся створити середовище інсценування у віртуальній машині, щоб перевірити оновлення, перш ніж застосовувати їх до моєї основної системи.

Для цього я здійснив базову установку Debian Wheezy (те саме, що і в основній системі) у VM, після чого запустив як root зсередини VM:

# 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запуску в VM. У мене є кілька пакетів, які вимагають спеціального керування (саме це є основною причиною, чому я хочу в першу чергу середовище інсценізації), але коли я запускаю останню команду вище, я отримую приблизно газільйонні рядки виводу, наприклад:

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Частина запозичена з пакетів Запобігання від видалення після виконанняdpkg --set-selections над на Ask Ubuntu.

Я змінив джерело в VM таким чином, що і в основній системі, також встановивши 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-selects, я бачу:

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-selects:

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-selection).


dpkg --get-selections … | … dpkg --set-selectionsце спосіб повторити вибір пакета. Якщо це не вдається для вас, вам потрібно буде надати більше інформації щодо того, чому. Опублікуйте свій повний набір джерел на обох системах, вихідні дані dpkg --get-selectionsта повний стенограму з dpkg --get-selections(можливо, ми можемо розпізнати шаблон, побачивши, що працює, а що ні). Якщо основна система amd64 або i386? Чи працює, якщо не додати архітектуру i386?
Жил "ТАК - перестань бути злим"

@Gilles Чи справді потрібно отримати повний висновок dpkg --get-selections(і я припускаю, що ви мали на увазі dpkg --set-selectionsстенограму?)? Навіть у першої є понад 3600 рядків і близько 100 КБ.
CVn

Вам потрібно розмістити достатньо, щоб ми могли розпізнати схему, які пакети викликають помилки, а які - не (якщо ви самі не зможете розібратися). Також /var/lib/dpkg/Packagesможе бути корисною копія (яка навіть довша) - це може бути симптомом зламаного файлу Packages.
Жил "ТАК - перестань бути злим"

@Gilles Цікавий момент. Я не дуже розглядав таку можливість, але на них я використовую різні дзеркала. Дозвольте мені побачити, чи все-таки це станеться, якщо я вкажу VM на те саме дзеркало Debian. Очікуйте.
CVn

@Gilles Це насправді не мало помітної різниці, але я знайшов щось інше. Дивіться оновлене запитання.
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, яка вперше перетворила його на хрипку. Дивіться помилку №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 . (Це згадується на сторінці dpkg man, але більше таким чином, що нагадувало б про проблему, якщо ви вже знали, а не способом, який пояснює, як вирішити проблему!)

Зауважте, що клонування установки пакета за допомогою dpkg --set-selectionsне відновлює автоматичну / ручну позначку в APT. Докладніші відомості див. У розділі Відновлення всіх даних та залежностей від dpkg --set-select '*' . Ви можете зберегти позначки у вихідній системі за допомогою

apt-mark showauto >auto.list

і відновити їх у цільовій системі за допомогою

xargs apt-mark auto <auto.list

3
Ця проблема повинна бути набагато помітнішою, ніж є. Я не можу повірити, що я не чув про це раніше!
Faheem Mitha

Цікаво. Збираюся на це постріл. Спасибі!
CVn

@FaheemMitha Так, я здивований, що раніше цього не чув. Я не можу повірити, що не користувався dpkg --set-selectionsз попереднього хрипу!
Жил 'ТАК - перестань бути злим'

Гаразд, це дало дуже коротший список попереджень від --set-selections. Тепер, як застосувати зміни? Навіть apt-get -u dist-upgradeзгадується лише декілька пакунків (всі пов'язані з ZFS), де має бути сотні, якщо не тисячі пакунків.
CVn

@ MichaelKjörling Цеapt-get -u dselect-upgrade
"SO- перестань бути злим"

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 
    

    адаптувати source.list навіть з різними дзеркалами, але однаковим списком компонентів .

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

    І тепер мій цільовий хост наразі встановлює багато речей, тож я міг би зайняти деякий час, щоб опублікувати це.


Можливо, "оновлення dselect" має бути "оновлення dselect" в описі "Як я це зробив" вище.
Джонатан Кіммітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.