Linuxový desktop a migrace dat mezi počítači

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.

7 komentářů: „Linuxový desktop a migrace dat mezi počítači“

  1. Ralf Hersel avatar

    Hi Jiří

    Would you like me to re-post your nice article at https://gnulinux.ch/ under our name, translated to German and with a reference to the article in your blog?

    Best regards
    Ralf Hersel
    GNU/Linux.ch

      1. Ralf Hersel avatar

        Thank you.
        Will be published tomorrow morning at 10:00 h.
        Have a nice evening.

  2. Robert avatar
    Robert

    I found it on Gnu/Linux.ch, liked it and directly created a pull request with some minor improvements 😉

    1. Jiří Eischmann avatar

      Thank you! I’ll take a look at it once I have time.

  3. Robert avatar
    Robert

    Really a great idea, because there is a real and probably very big need for such thing!

    IMHO a task that the operating system can and should actually provide OOTB. It’s a shame that such a basic function doesn’t already exist directly in Linux. But you can’t even do that 100% with smartphones these days – or you’re stuck in the CLOUD of a certain provider. A few weeks ago there was an interesting article in the german magazine ct called „Don’t be afraid of changing your smartphone“, which generated quite a few critical comments.

    QUESTIONS: Do I understand correctly that your script so far only takes care of $HOME and Flatpacks? What about other formats like AppImage, Snap, Docker etc. are they more difficult to implement? And what about the transfer of settings and configuration files from the desktop environments in use, especially when migrating from an older to a newer version? Is the script „tested“ only for Fedora Silverblue or can it be used on any Linux distro in general?

    1. Jiří Eischmann avatar

      It doesn’t support AppImage, Snap and Docker because I don’t use them and have close-to-zero knowledge of them, so I can’t tell how easily they can be migrated. I have almost finished support for Toolbx container migration, Toolbx containers are essencially Podman containers and Podman is fairly similar to Docker, so I guess Docker would be doable in a similar way. They’re all somewhat relevant to Silverblue, so I don’t rule out future implementation of their support although they’re not on my todo list now. Settings definitely are.

      The script is only tested on Silverblue, but I’m fairly sure it works on any modern desktop distribution at the moment, there is nothing Silverblue-specific. If someone reports that something doesn’t work on a different distribution, I’ll be happy to fix it, but at the moment on the roadmap I only have things that are relevant to Silverbue.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *