Snažím se nastavit pracovní prostředí ve virtuálním počítači, abych otestoval aktualizace před jejich použitím na můj hlavní systém.
Abych to mohl udělat, provedl jsem základní instalaci Debian Wheezy (stejné jako na hlavním systému) do virtuálního počítače a poté jsem jej spustil jako root z virtuálního počítače:
# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh [email protected] 'dpkg --get-selections | grep -v deinstall' |
dpkg --set-selections
Architektura i386 je v mém případě bohužel potřeba; systém je nativní amd64.
Problém je s dpkg --set-selections
spustit ve VM. Mám nějaké balíčky, které vyžadují speciální zacházení (to jsou vlastně hlavní důvod, proč chci pracovní prostředí na prvním místě), ale když spustím poslední příkaz výše, dostanu asi gazilión řádků výstupu jako:
dpkg: warning: package not in database at line NNN: package-name
pro balíčky, které by skutečně měly být dostupné v základním systému. Příklady zahrnují xterm
, yelp
a zip
.
Nyní k mé otázce:
Jaký je konkrétní proces přenosu seznamu pro výběr balíčků z jednoho systému Debianu do druhého (za předpokladu stejné úrovně vydání Debianu ve Wheezy) a následně tyto změny použít? Cílem je, aby oba měly stejný seznam nainstalovaných balíčků, ideálně takový, že provedete diff
mezi výstupy dpkg --get-selections
nebo dpkg --list
na dvou se vrací bez rozdílů.
grep -v deinstall
část je vypůjčena z Zabránit odstranění balíčků po provedení dpkg --set-selections
na Ask Ubuntu.
Změnil jsem zdroj ve virtuálním počítači tak, aby byl stejný jako v hlavním systému, a také jsem nainstaloval 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
Když se podívám na výstup –set-selections, vidím:
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
...
Čísla řádků vypadala podivně a odpovídající část výstupu –get-selections je:
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
Všimněte si, že mezi acl
a aglfn
jsou acpi-support-base
, acpid
a adduser
pro které nejsou hlášeny žádné chyby . Zdá se, že balíčky, u kterých jsou hlášeny chyby, jsou buď un
podle dpkg -l
, nebo dpkg -l
nemá o nich vůbec žádnou představu (dpkg-query: no packages found matching ...
). Vím, že existují nějaké lokálně nainstalované balíčky, ale není jich mnoho. i386
se nezobrazí, dokud gcc-4.7-base:i386 install
hodně dále v seznamu (řádek 342 ve výstupu –get-selections).
Přijatá odpověď:
Chcete-li naklonovat instalaci Debianu, použijte apt-clone
užitečnost. Je k dispozici (jako samostatný balíček, který není součástí výchozí instalace) v Debianu od wheezy a v Ubuntu od 12.04. Na stávajícím počítači spusťte
apt-clone clone foo
Tím se vytvoří soubor foo.apt-clone.tar.gz
. Zkopírujte jej do cílového počítače a spusťte
apt-get install apt-clone
apt-clone restore foo.apt-clone.tar.gz
Pokud pracujete se starým systémem, kde apt-clone
není k dispozici, nebo pokud chcete pouze replikovat seznam nainstalovaných balíčků, ale nechcete žádný konfigurační soubor, zde jsou ruční kroky.
-
Na zdrojovém počítači:
cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list dpkg --get-selections >selections.list apt-mark showauto >auto.list
-
Na cílovém počítači:
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
Domnívám se, že jste ovlivněni nekompatibilní změnou v dpkg, která z něj nejprve udělala sípavý. Pozadí viz chyba #703092.
Stručný příběh je, že dpkg --set-selections
nyní přijímá pouze názvy balíčků, které jsou přítomny v souboru /var/lib/dpkg/status
nebo /var/lib/dpkg/available
. Pokud používáte APT pouze ke správě balíčků, jako většina lidí, pak /var/lib/dpkg/available
není aktualizován.
Po spuštění apt-get update
a před spuštěním dpkg --set-selections
a apt-get -u dselect-upgrade
, spusťte následující příkaz:
apt-cache dumpavail >/tmp/apt.avail
dpkg --merge-avail /tmp/apt.avail
Od jessie to můžete zjednodušit na
apt-cache dumpavail | dpkg --merge-avail
Případně spustit
/usr/lib/dpkg/methods/apt/update /var/lib/dpkg/
nebo ještě jednodušší
apt-get install dctrl-tools
sync-available
Další jednoduchá metoda, která nevyžaduje instalaci dalšího balíčku, ale stáhne znovu seznamy balíčků, je
dselect update
Další informace najdete v dpkg FAQ. (To je zmíněno v manuálové stránce dpkg, ale spíše způsobem, který by vám připomněl problém, pokud jste si toho byli vědomi, nikoli způsobem, který vysvětluje, jak problém vyřešit!)
Všimněte si, že klonování instalace balíčku pomocí dpkg --set-selections
neobnoví automatickou/ruční značku v APT. Další podrobnosti najdete v části Obnovení všech dat a závislostí z dpkg –set-selections ‚*‘. Značky ve zdrojovém systému můžete uložit pomocí
apt-mark showauto >auto.list
a obnovte je v cílovém systému pomocí
xargs apt-mark auto <auto.list