Hlavní navigace

Zbavte se konfigurace v ~ pomocí rewritefs

Jan Knížek 29. 2. 2016

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):

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.

Našli jste v článku chybu?

29. 2. 2016 8:16

bflmpsvz (neregistrovaný)

Vypadá to sice na hezkou hračku, ale popravdě moc nechápu, proč by někdo měl dělat takovou šílenost, aby dával konfigurační soubory mimo $HOME. Přijde mi to totálně na hlavu...

29. 2. 2016 10:50

asdasd (neregistrovaný)

Preco to nespravit presne naopak? Spravim si $HOME/DATA a tam si mozem dat co budem chciet. Za normalnych okolnosti mi tam ziadna aplikacia nic sama od seba nezapise. Funguje to aj na nelinuxoch, dokonca aj na tych prehistorickych. Nebude to mat problem so ziadnymi aplikaciami.

Ale nie, my si radsej pridame noveho FUSE daemona, ktory bude bezat ako root a iba pod Linuxom. Co tak si zbastlit hypervizora, ktory bude spustat binarku kernelu a prepisovat tam rovno cesty za spravne? Nic ine a horsie…

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně