Hlavní navigace

Zbavte se konfigurace v ~ pomocí rewritefs

29. 2. 2016
Doba čtení: 5 minut

Sdílet

Domovský adresář bývá plný konfiguračních souborů. Rewritefs je umožňuje všechny přesunout na jiné místo, aniž bychom při tom museli složitě upravovat nastavení jakékoliv aplikace.

Upozornění: před provedením jakýchkoliv kroků pečlivě zazálohujte svůj domovský adresář, především konfigurační soubory. Data, která smažete na virtuálním disku, se smažou i na reálném disku.

Princip

Domovské adresáře uživatelů přesuneme do /mnt/home. Poté připojíme virtuální souborový systém rewritefs do adresáře /home, který je postavený na FUSE (viz článek FUSE: celý svět je souborový systém). Za pomoci regulárních výrazů nadefinujeme, jak budeme měnit cesty k souborům. Pokud budeme chtít přečíst soubor /home/cesta/jmeno, rewritefs vrátí file deskriptor souboru /mnt/home/cesta/jmeno. Pokud se navíc ptáme na skrytý systémový soubor (začínající tečkou) s adresou /home/user/.soubor, přeložíme jeho adresu na  /mnt/home/user/.config/soubor.

Z našeho pohledu soubory vypadají, jako kdyby byly umístěné v adresáři /home, ale ve skutečnosti je čteme odjinud. K libovolnému souboru umístěnému v adresáři .config budeme moci přistupovat, jako kdyby byl umístěn přímo v adresáři uživatele. Protože tam ale ve skutečnosti není, neobjeví se ani ve výpisu adresáře. Tedy nás nebude otravovat a zároveň všechny aplikace budou mít přístup ke svým konfiguračním souborům.

Instalace

V Arch Linuxu stačí nainstalovat balíček rewritefs-git v AUR. Pro ostatní distribuce je nutno zkompilovat kód. Nainstalujeme závislosti FUSE a PCRE, které by měly být v hlavních repozitářích. Poté naklonujeme gitový repozitář https://github.com/sloonz/rewritefs a spustíme make && sudo make install. Poté by již měl být příkaz rewritefs v shellu dostupný.

Ještě je nutné přidat do souboru /etc/fuse.conf řádek user_allow_other, aby k souborům mohli přistupovat i jiní uživatelé než vlastník procesu rewritefs.

Automatické spuštění po startu

Rewritefs sice není nutné spustit až po té, co je připojen oddíl /mnt/home, ale rozhodně musí být zapnutý ještě před tím, než nějaká aplikace bude přistupovat k datům. Vytvoříme démona v systemd a protože můžeme snadno nastavit, které disky potřebuje mít připojené ještě před spuštěním, můžeme umístit bez obav svůj konfigurační soubor do domovského adresáře. Démon rewritefs.service bude sídlit v /etc/systemd/system (bude systémový a bude spouštěn ještě před načtením uživatelského prostoru) a vypadá následovně:

[Unit]
Description=rewritefs daemon
RequiresMountsFor=/mnt/home

[Service]
Type=forking
ExecStart=/usr/local/bin/rewritefs -o config=/mnt/home/knezi/config/rewritefs,allow_other /mnt/home/knezi /home/knezi


[Install]
WantedBy=default.target

V příkladu připojujeme oddíl /mnt/home/knezi do /home/knezi, rewritefs při spuštění provede fork. Rewritefs zachovává práva uživatele, který čte, upravuje nebo spouští soubory. Z tohoto důvodu musí démon běžet s právy superuživatele. Pokud z nějakého důvodu démona chceme pustit s oprávněními běžného uživatele, přidáme do sekce [Service] řádku User=uživatel. Pak ale nebude možné přistupovat k souborům v /home, k nimž má přístup pouze root. Přes /mnt/home to samozřejmě možné bude.

Konfigurace

Pokud chcete konfiguraci nějak více upravovat, doporučuji si ji nejdříve zkoušet na nějakých jiných adresářích. Rewritefs bere jako parametr dvě libovolné cesty. Tedy není potřeba mít více oddílů.

Za přepínačem -o následuje seznam nastavení oddělených čárkami. Využíváme dvě, cestu ke konfiguračnímu souboru a volbu allow_other, která umožňuje přístup i ostatním uživatelům do VFS. Pozor: i když volbu allow_other neuvedeme, ostatní uživatelé stále mohou mít práva číst /mnt/home/knezi. Seznam dalších voleb vypíše příkaz  rewritefs -h.

Konfigurační soubor vypadá následovně:

m#^(?!\.)# .
m#^\.(cache|config|local)# .
m#^\.# .config/

Obecná struktura regulárního výrazu je m#vzor# náhrada, kde # je libovolný oddělovač. Pokud je náhrada tečka, pak se soubor nechá beze změny. První řádka tedy říká, že libovolné soubory, které nezačínají tečkou se mají předat rovnou (tedy se v našem případě konfigurace jen přidá na začátek absolutní cesty /mnt), stejně tak mají zůstat stejné adresáře .cache, .config, .local. V .config  budeme mít přímo uloženy své soubory, takže bychom se zacyklili. Poslední řádka říká, že každý tečkový soubor se bude hledat v  .config.

Celou konfiguraci je nutné pečlivě si promyslet. Podle námi definovaných pravidel se totiž i například .localbin nebude překládat. Buď je tedy nutno přidat za local lomítko, nebo nechat .localbin v domovském adresáři.

Jediný program, u kterého jsem narazil na problém, byl ncmpcpp. Tento program standardně hledá konfigurační soubor v ~/.ncmpcpp/config  a v ~/.config/ncmpcpp/config. V obou lokacích samozřejmě našel stejný soubor a při čtení druhé konfiguračního souboru skončil s chybou: daná vlastnost je již definována. Řešením může být překládat adresy do jiného adresáře, nebo pouštět  ncmpcpp -c ~/.ncmpcpp/config.

Migrace dat

Odsud už je nutné změny provádět bez procesů, které mají otevřené nějaké soubory v domovském adresáři. Je tedy nutné všechny uživatele kompletně odhlásit a další úpravy provádět z terminálu pod superuživatelem (do terminálu se přepneme pomocí Ctrl+Alt+F2). Doporučuji si nejdříve celý článek dočíst a poté provést uvedené změny.

Musíme všechny své tečkové soubory přesunout z domovského adresáře do ~/.config/. S tím nám pomůže následující skript (není zcela univerzální, například soubor obsahující mezeru nepřesune; jedná se spíše o ilustraci):

CS24_early

for x in `ls -A|grep "^\." | grep -v "^.\(config\|local\|cache\)$"`; do
    mv "$x" .config/`echo "$x" | sed s/^.//`
done

Zbývá ještě správné připojení disků. Pokud pro domovský adresář není vyhrazen speciální oddíl, stačí přesunout /home do /mnt/home. V opačném případě je nutno v souboru /etc/fstab nahradit bod připojení /home za /mnt/home. Problém by ještě mohl nastat, pokud používáme GPT. Pak má domovský oddíl příznak Linux home a skript systemd-gpt-auto-generator jej připojí bez ohledu na fstab. Příznak odstraníme pomocí programu cgdisk. Spustíme cgdisk zařízení a nastavíme typ 8300 – Linux filesystem. Nyní by se po restartu počítače měl VFS oddíl správně připojit a příkaz df by jej vypsat:

Souborový systém  1K bloků     Užito    Volné Uži% Připojeno do
...
rewritefs        218267540 186067508 21720608  90% /home

Závěr

Rewritefs je efektivní způsob, jak se zbavit konfiguračních souborů. Používám jej delší dobu bez problému s přístupem k souborům či nějakým znatelným zpomalením. Pokud by jakýkoliv program přestal fungovat, podělte se s námi v diskusi.

Byl pro vás článek přínosný?

Autor článku

Autor studuje na Matematicko-fyzikální fakultě. Ve svém volném čase se kromě Linuxu věnuje také vlastní 3D tiskárně.