Jak zreplikować wybrane pakiety zainstalowane z jednego systemu Debian na inny? (Debian Wheezy)

19

Usiłuję skonfigurować środowisko pomostowe na maszynie wirtualnej, aby przetestować aktualizacje przed zastosowaniem ich w moim głównym systemie.

W tym celu wykonałem podstawową instalację Debian Wheezy (taką samą jak w systemie głównym) na maszynie wirtualnej, a następnie uruchomiłem jako root z poziomu maszyny wirtualnej:

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

Niestety architektura i386 jest w moim przypadku potrzebna; system jest natywny dla amd64.

Problem dotyczy dpkg --set-selectionsuruchomienia na maszynie wirtualnej. Mam kilka pakietów, które wymagają specjalnej obsługi (są to tak naprawdę główny powód, dla którego chcę przede wszystkim środowisko pomostowe), ale kiedy uruchomię ostatnie polecenie powyżej, otrzymuję około miliardów wierszy wyników, takich jak:

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

dla pakietów, które naprawdę powinny być dostępne w systemie podstawowym. Przykłady obejmują xterm, yelpi zip.

Teraz moje pytanie:

Jaki jest specyficzny proces przenoszenia listy wyboru pakietów z jednego systemu Debian na inny (przy założeniu tego samego poziomu wydania Debiana, w Wheezy), a następnie zastosowania tych zmian? Chodzi o to, aby oba miały tę samą listę zainstalowanych pakietów, idealnie, aby powrót diffmiędzy wyjściami dpkg --get-selectionslub dpkg --listna obu nie powrócił bez żadnych różnic.

grep -v deinstallCzęść jest zapożyczona z pakietów uniemożliwić są usuwane po wykonaniudpkg --set-selections ponad Zapytaj na Ubuntu.

Zmieniłem źródło w maszynie wirtualnej na to samo, co w systemie głównym, instalując również 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

Patrząc na wynik --set-selections, widzę:

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

Numery linii wyglądały dziwnie, a odpowiadająca im część wyniku --get-selections to:

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

Zauważ, że pomiędzy acli aglfnacpi-support-base, acpidi adduser dla których nie są zgłaszane żadne błędy . Wygląda na to, że pakiety, dla których zgłaszane są błędy, są albo unzgodne dpkg -l, albo dpkg -lnie mają o nich pojęcia ( dpkg-query: no packages found matching ...). Wiem, że jest kilka zainstalowanych lokalnie pakietów, ale nie wiele. i386nie pojawia się, dopóki nie będzie gcc-4.7-base:i386 install dużo dalej w dół listy (wiersz 342 w wyjściu --get-selections).

CVn
źródło
dpkg --get-selections … | … dpkg --set-selectionsjest sposobem na replikację wybranych pakietów. Jeśli to się nie powiedzie, musisz podać więcej informacji o tym, dlaczego. Zamieść pełny zestaw źródeł w obu systemach, dane wyjściowe dpkg --get-selectionsi pełny transkrypt z dpkg --get-selections(być może możemy rozpoznać wzór, sprawdzając, co działa, a co nie). Jeśli główny system amd64 lub i386? Czy to działa, jeśli nie dodasz architektury i386?
Gilles „SO- przestań być zły”
@Gilles Czy naprawdę musi to być pełny wynik dpkg --get-selections(i zakładam, że miałeś na myśli dpkg --set-selectionszapis?)? Nawet ten pierwszy ma ponad 3600 linii i około 100 KB.
CVn
Musisz opublikować wystarczająco dużo, abyśmy mogli rozpoznać, które pakiety powodują błędy, a które nie (chyba że sam możesz to ustalić). /var/lib/dpkg/PackagesPrzydatna może być również kopia (która jest jeszcze dłuższa) - może to być objaw uszkodzonego pliku Packages.
Gilles „SO- przestań być zły”
@Gilles Ciekawy punkt. Tak naprawdę nie zastanawiałem się nad taką możliwością, ale używam do tego różnych mirrorów. Pokażę, czy nadal tak się dzieje, jeśli skieruję maszynę wirtualną na to samo lustro Debiana. Czekaj.
CVn
@Gilles To naprawdę nie robiło żadnej zauważalnej różnicy, ale znalazłem coś innego. Zobacz zaktualizowane pytanie.
CVn

Odpowiedzi:

17

Aby sklonować instalację Debiana, użyj apt-clonenarzędzia. Jest dostępny (jako oddzielny pakiet, nie jest częścią domyślnej instalacji) w Debianie od wheezy i w Ubuntu od 12.04. Na istniejącej maszynie uruchom

apt-clone clone foo

Spowoduje to utworzenie pliku foo.apt-clone.tar.gz. Skopiuj go na komputer docelowy i uruchom

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

Jeśli pracujesz ze starym systemem, który apt-clonenie jest dostępny, lub jeśli chcesz po prostu zreplikować listę zainstalowanych pakietów, ale nie plik konfiguracyjny, wykonaj poniższe instrukcje.

  • Na maszynie źródłowej:

    cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list
    dpkg --get-selections >selections.list
    apt-mark showauto >auto.list
    
  • Na maszynie docelowej:

    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
    

Uważam, że masz wpływ niekompatybilnej zmiany dpkg, która po raz pierwszy zmieniła się w świszczący oddech. Zobacz błąd # 703092 jako tło.

Krótka historia jest taka, że dpkg --set-selectionsteraz akceptuje tylko nazwy pakietów obecne w pliku /var/lib/dpkg/statuslub /var/lib/dpkg/available. Jeśli używasz APT tylko do zarządzania pakietami, jak większość ludzi, /var/lib/dpkg/availablenie jest on aktualizowany.

Po uruchomieniu apt-get updatei przed uruchomieniem dpkg --set-selectionsi apt-get -u dselect-upgradeuruchom następujące polecenie:

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

Od jessie możesz to uprościć

apt-cache dumpavail | dpkg --merge-avail

Alternatywnie, uruchom

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

lub nawet prościej

apt-get install dctrl-tools
sync-available

Inną prostą metodą, która nie wymaga instalowania dodatkowego pakietu, ale spowoduje ponowne pobranie list pakietów, jest

dselect update

Aby uzyskać więcej informacji, zobacz często zadawane pytania dotyczące dpkg . (Jest to wspomniane na stronie podręcznika dpkg, ale bardziej w sposób, który przypominałby ci problem, gdybyś był już tego świadomy, a nie w sposób, który wyjaśnia, jak rozwiązać problem!)

Zauważ, że klonowanie instalacji pakietu dpkg --set-selectionsnie przywraca automatycznego / ręcznego znaku w APT. Zobacz Przywracanie wszystkich danych i zależności z dpkg --set-selections '*', aby uzyskać więcej informacji. Możesz zapisać znaki w systemie źródłowym za pomocą

apt-mark showauto >auto.list

i przywróć je w systemie docelowym za pomocą

xargs apt-mark auto <auto.list
Gilles „SO- przestań być zły”
źródło
3
Ten problem powinien być znacznie bardziej widoczny niż jest. Nie mogę uwierzyć, że wcześniej o tym nie słyszałem!
Faheem Mitha
Ciekawy. Zamierzam dać temu szansę. Dzięki!
CVn
@FaheemMitha Tak, jestem zaskoczony, że nigdy wcześniej o tym nie słyszałem. Nie mogę uwierzyć, że nie używałam dpkg --set-selectionsod pre-wheezy!
Gilles „SO- przestań być zły”
Okej, to dało znacznie krótszą listę ostrzeżeń od --set-selections. Jak teraz zastosować zmiany? Nawet apt-get -u dist-upgradewspomina tylko o kilku pakietach (wszystkie związane z ZFS), w których powinny znaleźć się setki, jeśli nie tysiące pakietów.
CVn
@ MichaelKjörling That'sapt-get -u dselect-upgrade
Gilles 'SO- przestań być zły'
0

Jak to zrobiłem

  1. Na hoście źródłowym :

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

    dbać o to, /etc/apt/sources.list.dczy zostanie użyty ...

    Następnie skopiuj source.selplik do hosta docelowego.

  2. Na hoście docelowym :

    vi /etc/apt/sources.list 
    

    dostosuj sources.list nawet z różnymi serwerami lustrzanymi, ale tą samą listą komponentów .

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

    A teraz mój docelowy host instaluje obecnie wiele rzeczy, więc może trochę czasu to opublikować.

techno
źródło
Być może „dselect upgrade” powinno być „dselect update” w powyższym opisie „Jak to zrobiłem”.
Jonathan Kimmitt