Cross-grading linuxu z 32-bit na 64-bit

Obecné tlachy aneb úvod

Operační systém, který na svém počítači aktuálně používám, jsem nainstaloval před dvanácti lety. Od té doby jsem nepotřeboval jej ani jednou přeinstalovat. Jak šel čas, průběžně jsem aktualizoval používaný software, případně jádro systému. Když bylo potřeba, překopíroval jsem celý systém ze starého disku na nový, nebo disk se systémem přendal do nového počítače. Takto za těch dvanáct let prošel můj operační systém šesti pevnými disky a čtyřmi různými počítači. Prostým kopírováním vznikl i přibližně tucet "klonů", kdy jsem někomu poskytl kopii svého funkčního systému, v němž jsem jen změnil uživatele a hesla. Takovou flexibilitu umožňují linuxové systémy. S postupem doby se však začaly objevovat různé a sílící potíže s tím, že je můj systém pouze 32-bitový. Začal jsem tak řešit, jak jej bez reinstalace povýšit, i s nainstalovaným softwarem, z 32 bitů na bitů 64.

Když jsem se o podobné téma zběžně zajímal dříve, existovaly jen podivné způsoby, které vesměs operovaly s tvrdou náhradou funkčních částí systému, ručním rozbalování systémových balíků a následnou reinstalací zbytku systému s využitím chroot prostředí. Nic elegantního. Nic, čemu bych chtěl svůj produkční systém podrobovat.

Dnes je tomu naštěstí jinak. Linuxová jádra i linuxové distribuce podporují tzv. Multiarch, tedy umožňují v rámci jednoho operačního systému používat software pro více architektur, pokud to procesor a jádro podporují. A protože současné 64-bitové procesory umožňují běh i 32-bitovým programům, dá se celý cross-grading 32-bitového systému zvládnout na jednom počítači, při běhu právě toho systému, jehož architekturu měníme. A lze provést jen se dvěma restarty.

Z množství zdrojů, které lze na internetu nalézt, uvádím na konci textu ty, které byly pro můj postup nejrelevantnější inspirací.

Nyní tedy obraťme pozornost ke způsobu, jakým jsem u sebe cross-grading architektury operačního systému provedl já na své Debian GNU/Linux distribuci... Alespoň tedy nakolik si tu operaci ještě pamatuji a nakolik přesné byly moje průběžné zápisky ;-).

Konkrétní tlachy aneb jak na to

Následující kroky popisují obecnou cestu, jak lze cross-grading provést. Předpokládají obeznámenost se systémovými nástroji a schopnost řešit různá selhání, například řešení kolizí balíků. Následování uvedené cesty je věcí svobodného rozhodnutí s vědomím všech možných následků. Neručím za úplnost postupu ani úspěšný výsledek, odmítám i odpovědnost za veškeré škody či zranění, které si následováním následujících kroků můžete přivodit. Kdo linuxovou magií nevládne, její síly nezvládne ;-). To jen aby bylo jasno. Byli jste varováni.

1. Záloha

Nelze dostatečně zdůraznit, že před takovouto operací je naprosto nezbytné pořídit si zálohu funkčního systému. Je třeba pojistit si možnost návratu systému do funkčního stavu v případě, že něco krutě nevyjde.

2. Přidání architektury amd64

Přidat novou architekturu do systému s podporou Multiarch je jednoduché. Stačí k tomu jeden příkaz.

# dpkg --add-architecture amd64

Nyní by měl dpkg znát dvě architekrury.

# dpkg --print-architecture
i386
# dpkg --print-foreign-architectures
amd64

Aktualizujeme seznamy balíků, aby se stáhly informace o dostupných balících distribuce pro amd64.

# apt-get update

3. Příprava a aktualizace systému

Velmi žádoucím krokem je připravit systém do stavu, v němž potenciálně hrozí co nejméně kolizí. Doporučuji se zamyslet a jako první krok prostě nějaký software odinstalovat, především velké balíky (jako třeba libreoffice, texlive, apod.). Není to nutné, ale zkrátí to celkově čas. Není nic snazšího, než dané balíky na konci procesu znovu z repositářů doinstalovat.

Klíčovým krokem nyní je aktualizovat svůj systém, aby pokud možno všechny balíky byly v aktuální verzi — a aby tak nainstalovaný balík měl stejnou verzi v repositáři druhé architektury.

# apt-get dist-upgrade

Důležité: Pokud používáte, jako třeba já, balíky pro více verzí/vydání systému, doporučuji dostat systém do stavu, kdy má, pokud možno, balíky z jedné konkrétní verze. Například ve svém případě, kdy základ systému je z vydání stable, ale běžně používám některý software z testing a příležitostně unstable i experimental, jsem před celou operací ze seznamu zdrojů v /etc/apt/sources.list vyřadil (zakomentoval) všechna ostatní vydání s výjimkou testing. Přes apt-get dist-upgrade jsem tak povýšil základ systému o jednu "verzi", abych dosáhl co nejlepší shody mezi instalovanými balíky a těmi v repositáři.

Doporučuji skutečně zdroje pro ostatní verze v sources.list zakomentovat, aby se všechny operace s balíky řešily výhradně v rámci této jedné verze systému.

4. Vyřešení problémových balíků

Nyní bychom měli mít systém víceméně připravený. Je ale třeba ještě vyřešit ty balíky z architektury i386, které jsou stále nainstalované, ale mají jinou verzi, než jaká je v používaném repositáři. Jejich seznam získáme příkazem (pokud aptitude nemáme, doinstalujeme příkazem apt-get install aptitude):

# aptitude search '?narrow(?not(?archive("^[^n][^o].*$")),?version(CURRENT))?architecture(i386)'

Všechny tyto balíky je velmi doporučeno buď odinstalovat a nebo nainstalovat jejich verzi z aktuálního repositáře.

5. Instalace 64-bit jádra

Přichází na řadu první operace s "cizí" architekturou. Nainstalujeme 64-bitové jádro z 64-bitového repositáře.

# apt-get install linux-image-amd64:amd64

Nemělo by dojít k tomu, aby systém požadoval odstranění aktuálně běžícího jádra, pokud by se tak stalo, nainstalujeme konkrétní verzi balíku. Například:

# apt-get install linux-image-4.7.0-1-amd64:amd64

Po instalaci restartujeme systém, nabootujeme do nového jádra a zkontrolujeme, že skutečně běží.

# uname -a
Linux boaz 4.7.0-1-amd64 #1 SMP Debian 4.7.5-1 (2016-09-26) x86_64 GNU/Linux

Pokud je v názvu běžícího jádra "amd64", pak máme nyní funkční 64-bitové jádro, nad nímž běží 32-bitový systém. V tuto chvíli je možné (a asi bych i doporučil) původní 32-bitové jádro odinstalovat (a případně doinstalovat obecný balík jádra linux-image-amd64:amd64, pokud jsme jej kvůli konfliktu se 32-bitovým jádrem neinstalovali). Čím méně balíků k řešení, tím lépe.

6. Instalace klíčových systémových nástrojů

Nyní je potřeba nainstalovat 64-bitové verze apt a dpkg a tar. Přesuneme se do adresáře s archivem stažených deb balíků, odkud provedeme zbytek operace.

# cd /var/cache/apt/archives/

Před samotnou instalací balíky nejprve z repositáře pouze stáhneme a poté nainstalujeme přes dpkg.

# apt-get clean
# apt-get --download-only install dpkg:amd64 apt:amd64 tar:amd64
# dpkg -i ./*_amd64.deb

Balíčkovací systém si nyní na základě vlastní architektury "myslí", že hlavní architekturou systému je amd64. Aneb, jak se říká, podle sebe soudím tebe.

# dpkg --print-architecture
amd64
# dpkg --print-foreign-architectures
i386

7. Stažení balíků k instalaci

Dále na disk stáhneme 64-bitové verze všech aktuálně nainstalovaných balíků. Ty budeme po stažení hromadně instalovat. Necháme tedy apt stáhnout všechny potřebné soubory.

# aptitude search --disable-columns -F%p '~ri386~i!~o' | \
        xargs -n1 apt-get -o APT::Architecture=amd64 download

8. Instalace knihoven

S tímto krokem konečně začíná ta správná legrace, spojená se stejně správným rizikem. Pokud se chcete pomodlit nebo třeba provést nějaký rituál, nyní je ta správná chvíle.

Můj postup se zde začíná lišit od návodů ostatních, jimiž jsem se inspiroval.

Začneme tím relativně bezpečnějším krokem a hromadně nainstalujeme všechny knihovny, bez ohledu na závislosti — ty by měly být víceméně splněny, jelikož v systému pouze nahrazujeme stejné balíky a knihovny jejich verzemi v jiné architektuře. V případě knihoven se většinou původní balíky nenahrazují, pouze se do systému navíc doinstalují jejich 64-bitové alternativy.

(Jsme se stále v adresáři /var/cache/apt/archives/.)

# dpkg -i --force-depends lib*_amd64.deb

Pak právě nainstalované balíky knihoven přesuneme dočasně stranou.

# mkdir libs
# mv lib*_amd64.deb libs/

9. Instalace hlavních balíků

Hromadnou kaskadérskou operaci dokončíme instalací všech zbylých balíků.

# dpkg -i --force-depends *_amd64.deb

Po skočení můžeme knihovny přesunout zpět. Stažené balíky zatím ponecháme na místě v archivu, mohou se totiž hodit v konečné fázi, kdy některé z nich bude možná zapotřebí reinstalovat a zbytečně bychom je stahovali znovu.

# mv libs/* ./
# rmdir libs

10. Vyřešení závislostí a problémů

Kritická fáze celé operace, pomyslný okamžik pravdy, přichází na řadu nyní. Jsme ve fázi, kdy jsme ke všem knihovnám nainstalovali jejich 64-bitové verze a všechny balíky jejich 64-bitovými verzemi nahradili. Teoreticky by mělo být hotovo. Prakticky je nyní třeba opravit všechny rozbité závislosti a vyřešit kolize mezi balíky, které téměř stoprocentně nastanou.

Znamená to kombinovat několik nástrojů a postupů, z nichž nejužitečnější je asi automatická oprava závislostí příkazem

# apt-get -f install

Příkaz v lepším případě nabídne instalaci či odinstalaci nějakých balíků, v horším skončí chybou, kterou je nutné řešit využitím apt-get, aptitude, nebo "ručně" pomocí dpkg.

Horní příkaz je vhodné střídat s

# dpkg --configure -a

který spouští konfiguraci zatím nezkonfigurovaných balíků a v případě selhání celkem kompetentně vypisuje jeho důvod.

Klíčové zde je kontrolovat, abychom si neodinstalovali apt, případně dpkg. Navrhované změny, zvláště u apt-get -f install je proto nutné pečlivě kontrolovat. Naštěstí je apt natolik kompetentní, že v podobných případech vyhazuje varování, které nelze jen tak jednoduše přehlédnout nebo "odklepnout".

V případě vzpírajícího se balíku, který se brání odinstalaci, je možné si jeho odebrání vynutit

# dpkg -r --force-remove-reinstreq jmeno-baliku

Za zmínku stojí problém, který jsem při cross-gradingu mého systému řešil u balíků python-pil:i386 a python3-pil:i386. Balíky zůstaly v systému nainstalovány zároveň s jejich amd64 verzemi a výše uvedený příkaz je odmítal odstranit, jelikož se oba balíky odkazovaly na identické soubory. Balíky z obou architektur nešly odstranit, jelikož se přes identické soubory blokovaly navzájem.

Zde pomohl až zásah v adresáři /var/lib/dpkg/info, kde bylo nutné ručně odstranit všechny soubory dotyčných balíků pro architekturu i386. Teprve poté šly balíky přes # dpkg -r --force-remove-reinstreq python-pil:i386 python3-pil:i386 odstranit.

Jakmile dostaneme stav balíčkovacího systému do konzistentního stavu, tedy apt-get -f install prochází beze změn, můžeme přistoupit k poslednímu kroku.

11. Čistka a reboot do 64-bitového systému

Na tomto místě, pokud máme stále funkční systém, je v podstatě vyhráno. Zbývá již jen odinstalovat zbylé balíky i386 architektury a odebrat druhou architekturu.

Odinstalovat nepotřebné a nežádoucí balíky je možné různě, já použil

# aptitude purge `dpkg -l | grep "i386" | awk '{print $2}'`

Jakmile bude filtrovaný výpis balíků pro architekturu i386

# dpkg -l | grep "i386"

prázdný, můžeme ji celou ze systému odebrat a provést aktualizaci seznamu balíků (případně můžeme již odkomentovat předtím zakomentované ostatní verze repositářů).

# dpkg --remove-architecture i386
# apt-get update

A nakonec můžeme vyčistit cache stažených balíků.

# apt-get clean

Tímto je proces cross-gradingu, snad úspěšně, ukončen.

# reboot

— snílek

Reference

Komentáře

Comments powered by Disqus