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.