Před měsícem jsem dostal nový pracovní notebook a řešil, jak dostat data z jednoho na druhý. Poprvé jsem prováděl přechod mezi dvěma počítači, na kterých běží Silverblue, a zjistil jsem, že migrace s „wow“ efektem, kdy se přesunou jak aplikace, tak jejich data, není vlastně tak těžké dosáhnout.
K migraci dat mezi počítači existuje řada individuálních přístupů. Znám lidi, kteří rsyncem přesunou obsah celého disku na nový počítač. Pro mě je ale nový počítač taky tak trochu nový začátek. Spravuji počítače, kde je stejná instalace Fedory už 10 let, má za sebou řadu upgradů a pořád funguje bez problémů. Myslím si ale, že životnost instalace nemá smysl hrotit a nový počítač si zaslouží novou instalaci. Beru to taky jako příležitost, jak počítač vyčistit od pracovních souborů, které můžu nechat za sebou.
Výchozím bodem migrace dat tak pro mě je čistě nainstalovaný systém. Silverblue má tu výhodu, že nově nainstalovaný systém se také hodně blíží tomu na starém počítači. Minimálně já se snažím držet myšlenky neměnného základního obrazu a dělám do něj pokud možno minimum vlastních změn. Zatímco u systému s klasickým balíčkovacím systémem se člověk po několika letech dopracuje k unikátní podobě OS, kterou není úplně triviální znovu vytvořit na novém počítači.
Pokud máte všechny aplikace ve Flatpaku, je jejich migrace jednoduchá. Na původním počítači si můžete jejich seznam uložit do souboru a na novém počítači ho použít jako vstup pro instalaci flatpaků. Ještě jednodušší to je u dat jednotlivých aplikací. Ty totiž nejsou rozházené různě po domovském adresáři, ale nacházejí se pouze ve ~/.var/app. Stačí tedy tento adresář přesunout na nový počítač. Nově nainstalovanou aplikaci pak otevřete a ta bude mít stejná nastavení a data jako ta na starém počítači.
U Silverblue je také jednodušší přesun vývojových prostředí. Jelikož do samotného systému nemůžete normálně zapisovat, jakoukoliv práci děláte typicky v kontejnerech. V Silverblue je na tuto práci připravený Toolbx. Ten není nic jiného než kontejnery Podmanu nakonfigurované pro práci na desktopu. A Podman umožňuje kontejnery uložit jako obrazy a exportovat a importovat v podobě taru, takže je stačí na starém počítači vyexportovat, přesunout na nový a importovat. Okamžitě máte k dispozici staré známé prostředí, kde máte nainstalované potřebné balíčky, nastavení atd.
Přesun ostatních dat uživatele v domovském adresáři pak lze jednoduše provézt např. pomocí rsyncu. Přemigrovat ze starého počítače na nový v případě Silverblue opravdu není složité. Vzhledem k tomu, že to nedělám jen pro sebe, ale i pro ostatní lidi, kterým spravuji počítač, hodilo by se to mít všechno zautomatizované. Spustit, zadat pár údajů, vybrat, co se má přesunout, a nechat to pracovat.
Díval jsem se, jestli něco takového existuje, ale byl jsme překvapený, že jsem vlastně nic nenašel. Hodně lidí má své migrační skripty, ale ty jsou většinou cestou nejmenšího podporu: hardcodované cesty, jména, nebo dokonce hesla, takže to ani nechtějí sdílet a stejně by to jinde úplně nefungovalo.
Před časem jsme i v našem týmu zvažovali, že bychom nějaký migrační nástroj udělali. Ideálně takový, který by dokázal vybraná data průběžně ukládat někam na server a ta by byla jednoduše obnovitelná z jiného počítače s Fedorou. V komunitě převládal názor, že to elegantně vyřeší systemd-homed s šifrovanými domovskými adresáři, které lze libovolně přesouvat mezi systémy, takže se do toho nikdo nehrnul a u nás to nakonec převálcovaly jiné priority. I po letech je ale systemd-homed pořád jen experiment, který se nasazení v běžné linuxové distribuci moc nepřiblížil.
Proto jsem se rozhodl, že tuto myšlenku trochu víc prozkoumám v podobě vlastního malého projektu. Ideálně bych si pro to představoval pěknou desktopovou aplikaci, ale to je momentálně nad moje schopnosti a čas, který tomu můžu věnovat. Proto jsem si vybral cestu shellového skriptu, který je uživatelsky méně přívětivý, ale práci odvede taky a k cíli mě dovede mnohem rychleji.
Vydal jsem první verzi, která umí základní věci: umí migrovat data v XDG adresářích (Dokumenty, Obrázky, Videa, Stažené…), přeinstalovat aplikace ve Flatpaku a přesunout data těchto aplikací. Jedná se zatím o celkem krátký skript, ale jak člověk chce, aby to fungovalo na libovolném počítači (zaměřuji se na Silverblue, ale momentálně by to mělo fungovat asi s každou moderní desktopovou distribucí), čas nad tím strávený roste. Skript je navržený tak, aby byl interaktivní pouze v první fázi. Zeptá se na potřebné údaje a pak už žádný vstup nevyžaduje.
Původní návrh počítal s tím, že skript poběží na původním počítači a bude data přesouvat na nový. Narazil jsem ale na omezení, které jsem původně nepředpokládal. „flatpak install“ sice nevyžaduje administrátorská práva, ale pouze v případě lokálního uživatele. Pokud se jej pokoušíte spustit přes ssh, potřebujete sudo, což je u neinteraktivního skriptu celkem problém, pokud to sudo potřebuje pro operaci, kterou provádí přes ssh na vzdáleném počítači. Nakonec jsem to vyřešil tak, že skript pouštím na cílovém počítači. To vyřešilo nejen tento problém, ale ukázalo se, že to je celkově lepší nápad, protože mi to pomohlo zjednodušit kód na dalších místech a taky zjednodušilo testování, protože jako cílové zařízení můžu mít teď cokoliv, klidně i kontejner, aniž bych musel řešit, jak se do něj vzdáleně dostat přes ssh.
Dalším problémem, na který jsem narazil, bylo, že „flatpak install“ skončil s chybou, když narazil na flatpak, který už byl nainstalovaný. Normálně by se měl chovat tak, že ho prostě přeskočí a pokračuje s instalací dalších. Až u vývojářů flatpaku jsem se dozvěděl, že to může nastat v případě, kdy nainstalovaný flatpak pochází z jiného repozitáře, než z kterého instaluji. A to je přesně můj případ. Silverblue má několik flatpaků předinstalovaných z repozitářů Fedory a skript je instaluje z Flathubu. Workaroundem je parametr –reinstall, který již nainstalované flatpaky přeinstaluje těmi z Flathubu. Řešením by asi byla funkce, která bude flatpaky instalovat jeden po druhém a první si ověří, jestli už není nainstalovaný, než se ho pokusí nainstalovat. Tohle ale pro mě zatím není priorita, zvlášť když mi aktuální chování vyhovuje víc.
Na samotné přesouvání dat používám rsync. Z nějakého důvodu jsem měl dojem, že rsync není na Silverblue předinstalovaný, takže jsem původně používal sftp. Jak jsem ale zjistil, že rsync ve skutečnosti k dispozici je, s velkou radostí jsem přešel k němu.
První verze je venku, umí spolehlivě dělat základní funkcionalitu, kterou jsem si vytyčil. Do budoucna plánuji zapracovat na jeho robustnosti (ošetřování vstupů, zpracování chyb z jednotlivých operací) a přidávat další věci: migrace dalších adresářů, Toolbx kontejnerů, osobních certifikátů, reinstalace balíčků do overlay systémového obrazu…
Skript dělám primárně pro vlastní potřebu, ale pokud to využije někdo další, ať už jako celek, nebo jako základ pro vlastní migrační nástroj, budu jen rád. Stejně tak ocením zpětnou vazbu a případné příspěvky v podobě kódu. 😉
P.S. jako domov pro projekt jsem vybral Codeberg.org, evropskou alternativu ke Githubu. Hlavně proto, že jsem tu službu chtěl vyzkoušet. Zatím mi vyhovuje (mimo příšerných překladů do češtiny) a nenarazil jsem na nic, co by mi chybělo, ale je mi jasné, že každý je na Githubu. Kdyby snad projekt přitáhl nějaké lidi ochotné do něj přispět a Codeberg by byl pro něj problém, asi bych neměl problém s přesunem nebo zrcadlením.
Napsat komentář