it-swarm.dev

Jak mohu použít OverlayFS?

Tato odpověď a e-mailová zpráva znamená, že v Ubuntu 11.10 je k dispozici něco, co se nazývá „OverlayFS“, a v Ubuntu 12.04 bude silně nahrazovat aufs.

Jak to mohu použít? Kde je jeho dokumentace?

57
ændrük

Úpravy: Od psaní této odpovědi se v překryvech změnily některé věci, konkrétně přidání požadovaného parametru workdir, podrobnější popis tohoto nového parametru viz odpověď totti níže.

Nakonec se mi to podařilo najít. Odkazy jsem na to našel ve zdroji jádra, ale z nějakého důvodu se neobjevuje ve stromu git na kernel.org. Ale! Pokud stáhnete zdroj jádra Ubuntu takto: apt-get source linux-image-3.0.0-16-generic najdete ji v linux-3.0.0/Documentation/overlayfs.txt. Je také k dispozici v balíčku linux-doc v /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Protože skutečná dokumentace nápovědy je spíše „jak to funguje“ namísto „jak se s ní připojit“, je zde stručné shrnutí (v dokumentaci k jádru je jeden příklad):

mount -t overlayfs -o [mount options] overlayfs [mountpoint for merged system]

Kde mohou být [možnosti připojení]:

  • lowerdir = somedir: Lowerdir je adresář, do kterého položíte svůj nový souborový systém, pokud existují duplikáty, které jsou přepsány (vlastně skryté ve prospěch) verze Upperdir
  • upperdir = somedir: upperdir je adresář, se kterým chcete překrýt Lowerdir. Pokud existují duplicitní názvy souborů v dolním a horním adresáři, má přednost verze horního adresáře.
  • standardní možnosti připojení. Jediný, co jsem viděl z kódu, je ro/rw, ale můžete experimentovat.

Jedna věc, která mě zpočátku zmátla, takže bych měl pravděpodobně vyjasnit, že připojení překryvných souborů ve skutečnosti nepřipojuje souborový systém. Snažil jsem se připojit souborový systém squashfs pomocí připojení overlayfs, ale tak to nefunguje. Nejprve musíte připojit (v mém případě squashfs) souborový systém k libovolnému adresáři, pak pomocí overlayfs sloučit přípojný bod (adresář) a další adresář do terciárního adresáře (připojovací bod overlayfs) (upravit: tento „terciární“ adresář) ve skutečnosti může být adresář upperdir =). V terciárním adresáři uvidíte sloučené souborové systémy (nebo adresářové stromy - je to flexibilní).

Příklad 1, překrývání kořenového souborového systému

Pracoval jsem na hybridním zaváděcím disku Ubuntu, kde základní systém Ubuntu existuje jako filesystem.squashfs a mám soubory nazvané ubuntu.overlay kubuntu.overlay xubuntu.overlay a lubuntu.overlay. Soubory .overlay jsou základní instalace uvedených systémů s ořezaným obsahem filesystem.squashfs (pro úsporu místa). Pak jsem upravil init skripty tak, aby překrýval správný soubor .overlay distro (z bootovacího parametru) pomocí overlayfs a výše uvedených možností a funguje to jako kouzlo!

Toto jsou řádky, které jsem použil v mých iniciačních skriptech (jakmile jsou přeloženy všechny proměnné):

mkdir -p /overlay
mount -t squashfs /cdrom/casper/ubuntu.overlay /overlay
mount -t overlayfs -o lowerdir=/filesystem.squashfs,upperdir=/overlay overlayfs /

Všimněte si, že filesystem.squashfs výše je adresář vytvořený kasperem, nikoli soubor.

Tyto tři příkazy vytvářejí /overlay adresář, připojte squashfs souborový systém na /overlay adresář a potom pomocí OverlayFS v podstatě sloučit obsah /overlay přes /.

Příklad 2, transparentní sloučení dvou adresářů

Při rekonstrukci mého živého USB pro každé vydání používám OverlayFS, abych ušetřil spoustu času. Začínám adresářem nazvaným ubuntu-base, který obsahuje obsah obrazu jádra Ubuntu, který je nejzákladnější instalací. Poté vytvořím adresáře s názvem ubuntu, kubuntu, lubuntu a xubuntu.

Poté pomocí OverlayFS vytvořím soubory z ubuntu-base v jednotlivých adresářích. Použil bych něco takového:

mount -t overlayfs -o lowerdir=ubuntu-base,upperdir=kubuntu overlayfs kubuntu

To způsobí, že se soubory z Ubuntu-Base zobrazí ve složce kubuntu. Poté mohu chroot do složky kubuntu a udělat něco jako apt-get install kubuntu-desktop. Jakékoli změny, které jsou provedeny během tohoto připojení OverlayFS, zůstanou v horním adresáři, v tomto případě ve složce kubuntu. Poté, co odpojím připojování OverlayFS, soubory, které skutečně existují v ubuntu-base, ale jsou "zrcadleny" do složky kubuntu, zmizí, pokud nebyly změněny. To mi brání v tom, abych musel mít více kopií souborů v ubuntu-base, a přitom je stále používat, jako by existovaly fyzicky v každém umístění.

66
Chuck R

Od https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt :

Horní a dolní

Překryvný souborový systém kombinuje dva souborové systémy - „horní“ souborový systém a „dolní“ souborový systém. Pokud název existuje v obou souborových systémech, je objekt v „horním“ souborovém systému viditelný, zatímco objekt v „dolním“ souborovém systému je buď skrytý, nebo v případě adresářů sloučen s „horním“ objektem.

Bylo by správnější odkazovat spíše na horní a dolní „adresářový strom“ než na „souborový systém“, protože je docela možné, aby oba adresářové stromy byly ve stejném souborovém systému a není vyžadováno, aby byl kořen souborového systému uveden pro buď horní nebo dolní.

Nižší souborový systém může být jakýkoli souborový systém podporovaný Linuxem a nemusí být zapisovatelný. Dolní souborový systém může být dokonce dalším překryvem. Horní souborový systém bude normálně zapisovatelný a pokud je, musí podporovat vytváření důvěryhodných. * Rozšířených atributů a musí poskytovat platné d_type v odpovědích readdir, takže NFS není vhodný.

Překrytí dvou souborových systémů jen pro čtení může použít jakýkoli typ souborového systému.

Adresáře

Překrývání zahrnuje hlavně adresáře. Pokud se dané jméno objeví v horních i dolních souborových systémech a odkazuje na ne-adresář v jednom, pak je spodní objekt skrytý - název odkazuje pouze na horní objekt.

Pokud jsou horní i dolní objekty adresáři, vytvoří se sloučený adresář.

V době připojení jsou dva adresáře zadané jako možnosti připojení „Lowerdir“ a „Upperdir“ sloučeny do sloučeného adresáře:

mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged

"Workdir" musí být prázdný adresář na stejném souborovém systému jako Upperdir.

Poté, kdy je v takovém sloučeném adresáři požadováno vyhledávání, je vyhledávání provedeno v každém skutečném adresáři a kombinovaný výsledek je uložen do mezipaměti v dentry patřící do překryvného souborového systému. Pokud oba skutečné vyhledávání vyhledají adresáře, oba jsou uloženy a je vytvořen sloučený adresář, jinak je uložen pouze jeden: horní, pokud existuje, jinak nižší.

Sloučeny jsou pouze seznamy jmen z adresářů. Ostatní obsah, například metadata a rozšířené atributy, jsou hlášeny pouze pro horní adresář. Tyto atributy dolního adresáře jsou skryté.

24
totti

Tyto články jsem rozšířil o skript pro overlayfs, který nastavuje root root pro čtení.

Doufám, že to pomůže.

7
Floyd42

Příklad minimálního běhu

# Create the filesystems.
dd if=/dev/zero of=lower.ext4 bs=1024 count=102400
mkfs -t ext4 lower.ext4
cp lower.ext4 upper.ext4
mkdir lower upper overlay
Sudo mount lower.ext4 lower
Sudo mount upper.ext4 upper
Sudo chown "$USER:$USER" lower upper
printf lower-content > lower/lower-file
# Upper and work must be on the same filesystem.
mkdir upper/upper upper/work
printf upper-content > upper/upper/upper-file
# Work must be empty. E.g. this would be bad:
#printf work-content > upper/work/work-file
# Make the lower readonly to show that that is possible:
# writes actually end up on the upper filesystem.
Sudo mount -o remount,ro lower.ext4 lower

# Create the overlay mount.
Sudo mount \
  -t overlay \
  -o lowerdir=lower,upperdir=upper/upper,workdir=upper/work \
  none \
  overlay \
;

# Interact with the mount.
printf 'overlay-content' > overlay/overlay-file
ls lower upper/upper upper/work overlay

# Write to underlying directories while mounted
# gives undefined behaviour.
#printf lower-content-2 > lower/lower-file-2
#printf upper-content-2 > upper/upper-file-2

# Unmount the overlay and observe state.
Sudo umount overlay
ls lower upper/upper upper/work

# Cleanup.
Sudo umount upper lower

GitHub proti proud .

Výstup prvního ls s připojením:

lower:
lost+found  lower-file

overlay:
lost+found  lower-file  overlay-file  upper-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Výstup druhého ls bez připojení:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Tlumočení:

  • nižší: po zápisu do překrytí se nezměnil
  • upper: obdržela úpravu překryvu
  • overlay: zobrazí soubory z horního i dolního souboru
  • work: obsahuje nějaký náhodný obsah (a work/ adresář), o které bychom se neměli starat

Příklad upraven z: Příklad použití overlayFS

Tady je složitější příklad s více nižšími vrstvami: Overlayfs se znovu načte s více vrstvami (migrace mimo aufs)

Testováno na Ubuntu 18.04, linuxové jádro 4.15.0.