Come posso usare OverlayFS?


54

Questa risposta e questo messaggio e -mail indicano che qualcosa chiamato "OverlayFS" è disponibile in Ubuntu 11.10 e sostituirà aufs con forza in Ubuntu 12.04.

Come lo uso? Dov'è la sua documentazione?


1
Entrambi, fratello. Ho incontrato questo finora: mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Oltre a ciò sono all'oscuro. Sto armeggiando con esso in un sistema live, ma non sono ancora riuscito a farlo funzionare. Vorrei poter scoprire esattamente cosa significano "upperdir" e "lowerdir". Non ho trovato niente
Chuck R

Risposte:


63

Modifica: da quando ho scritto questa risposta, alcune cose sono cambiate in overlayfs, vale a dire l'aggiunta di un parametro richiesto workdir, vedere la risposta di totti di seguito per una descrizione dettagliata di questo nuovo parametro.

Finalmente sono riuscito a trovarlo. Ho trovato riferimenti ad esso nel sorgente del kernel, ma per qualche ragione non appare nell'albero git su kernel.org. Ma! Se estraete il sorgente del kernel Ubuntu in questo modo: apt-get source linux-image-3.0.0-16-genericlo potete trovare in linux-3.0.0/Documentation/overlayfs.txt. È anche disponibile nel pacchetto linux-doc in /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Dato che la documentazione di aiuto reale è più un "come funziona" invece di un "come montarlo," ecco un breve riassunto (c'è un esempio nella documentazione del kernel):

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

Dove [opzioni di montaggio] possono essere:

  • lowerdir = somedir: lowerdir è la directory su cui poserai il tuo nuovo filesystem, se ci sono duplicati questi vengono sovrascritti da (in realtà, nascosti a favore) della versione di upperdir
  • upperdir = somedir: upperdir è la directory con cui si desidera sovrapporre lowerdir. Se esistono nomi di file duplicati in lowerdir e upperdir, la versione di upperdir ha la precedenza.
  • opzioni di montaggio standard. L'unico che ho visto dal codice è ro / rw, ma puoi sperimentare.

Una cosa che inizialmente mi ha confuso, quindi probabilmente dovrei chiarire, è che montare un overlayfs non monta effettivamente un filesystem. Stavo cercando di montare un filesystem squashfs usando un mount overlayfs, ma non è così che funziona. Devi prima montare il filesystem (nel mio caso squashfs) su una directory arbitraria, quindi usare overlayfs per unire il punto di mount (una directory) e un'altra directory su una directory terziaria (il mount point di overlayfs) (modifica: questa directory "terziaria" può effettivamente essere la directory upperdir =). La directory terziaria è dove vedrai i filesystem uniti (o gli alberi delle directory - è flessibile).

Esempio 1, sovrapposizione del filesystem di root

Ho lavorato su un disco di avvio ibrido Ubuntu in cui il sistema Ubuntu di base esiste come filesystem.squashfs e ho file chiamati ubuntu.overlay kubuntu.overlay xubuntu.overlay e lubuntu.overlay. I file .overlay sono installazioni di base di detti sistemi con il contenuto di filesystem.squashfs eliminato (per risparmiare spazio). Quindi ho modificato gli script init per sovrapporre il file .overlay della distro corretto (da un parametro di avvio) usando overlayfs e le opzioni sopra e funziona come un incantesimo!

Queste sono le righe che ho usato nei miei script init (una volta che tutte le variabili sono state tradotte):

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

Si noti che filesystem.squashfs sopra è una directory creata da casper, non un file.

Queste tre istruzioni creano una /overlaydirectory, montano un filesystem squashfs sulla /overlaydirectory e quindi usano OverlayFS per fondere essenzialmente il contenuto di /overlayover /.

Esempio 2, fusione trasparente di due directory

Nel processo di ricostruzione della mia USB live per ogni versione, utilizzo OverlayFS per risparmiare un sacco di tempo. Comincio con una directory chiamata ubuntu-base che contiene il contenuto dell'immagine ubuntu-core che è l'installazione più semplice. Creerò quindi directory chiamate ubuntu, kubuntu, lubuntu e xubuntu.

Quindi, utilizzo OverlayFS per visualizzare i file dalla base Ubuntu nelle singole directory. Vorrei usare qualcosa del genere:

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

Questo fa apparire i file da Ubuntu-Base nella cartella di Kubuntu. Quindi, posso chrootaccedere alla cartella di Kubuntu e fare qualcosa di simile apt-get install kubuntu-desktop. Eventuali modifiche apportate durante questo montaggio OverlayFS rimarranno nella directory superiore, in questo caso la cartella kubuntu. Quindi, una volta smontato OverlayFS, i file che esistono realmente in Ubuntu-Base ma che vengono "rispecchiati" nella cartella di Kubuntu scompaiono a meno che non siano stati modificati. Questo mi impedisce di dover avere più copie dei file in ubuntu-base pur essendo in grado di usarli come se esistessero fisicamente in ogni posizione.


3
"ma per qualche ragione non appare nell'albero git su kernel.org" - Questo perché overlayfs non è nel kernel upstream, proprio come aufs non lo è (e non lo sarà mai). Tali filesystem sindacali sono integrati da Ubuntu Kernel Team.
MestreLion,

2
Sembra che OverlayFS stia entrando nel kernel 3.10.
David C. Bishop,

8
Infine, dovrebbe andare in 3.18 lwn.net/Articles/617099
Rmano,

4
@Rmano: sulla mia macchina funziona solo con overlaynon conoverlayfs
Janus Troelsen

1
Grazie @austinmarton, ho trovato anche questo un po 'di tempo fa e totti lo ha coperto prima di aggiornare la mia risposta, quindi ho dato credito alla sua risposta nella parte superiore della mia.
Chuck R,

20

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

Più sopra e più sotto

Un filesystem overlay combina due filesystem: un filesystem "superiore" e un filesystem "inferiore". Quando esiste un nome in entrambi i filesystem, l'oggetto nel filesystem "superiore" è visibile mentre l'oggetto nel filesystem "inferiore" è nascosto o, nel caso delle directory, unito all'oggetto "superiore".

Sarebbe più corretto fare riferimento a un "albero di directory" superiore e inferiore piuttosto che a "filesystem" poiché è del tutto possibile che entrambi gli alberi di directory si trovino nello stesso filesystem e non è necessario fornire la radice di un filesystem per superiore o inferiore.

Il filesystem inferiore può essere qualsiasi filesystem supportato da Linux e non deve essere scrivibile. Il filesystem inferiore può anche essere un altro overlayfs. Il file system superiore sarà normalmente scrivibile e, se lo è, deve supportare la creazione di attributi estesi. * Attendibili e deve fornire d_type valido nelle risposte readdir, quindi NFS non è adatto.

Un overlay di sola lettura di due filesystem di sola lettura può utilizzare qualsiasi tipo di filesystem.

Elenchi

La sovrapposizione coinvolge principalmente le directory. Se un dato nome appare sia nel filesystem superiore che in quello inferiore e fa riferimento a una non directory in uno dei due, allora l'oggetto inferiore è nascosto - il nome si riferisce solo all'oggetto superiore.

Dove entrambi gli oggetti superiore e inferiore sono directory, viene formata una directory unita.

Al momento del montaggio, le due directory fornite come opzioni di montaggio "lowerdir" e "upperdir" sono combinate in una directory unita:

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

"Workdir" deve essere una directory vuota sullo stesso filesystem di upperdir.

Quindi, ogni volta che viene richiesta una ricerca in una tale directory unita, la ricerca viene eseguita in ciascuna directory effettiva e il risultato combinato viene memorizzato nella memoria dentale appartenente al filesystem overlay. Se entrambe le ricerche effettive trovano directory, entrambe vengono archiviate e viene creata una directory unita, altrimenti ne viene memorizzata solo una: la parte superiore se esiste, altrimenti la parte inferiore.

Vengono uniti solo gli elenchi di nomi delle directory. Altri contenuti come metadati e attributi estesi sono riportati solo per la directory superiore. Questi attributi della directory inferiore sono nascosti.


4
Grazie per il chiarimento su workdir. Si è trattato di un cambiamento abbastanza recente e per qualsiasi motivo non sono mai stato in grado di trovare alcuna documentazione su cosa facesse realmente "workdir". L'ultima volta che ho guardato non era nell'aiuto del kernel. Aggiunge un livello di confusione agli overlay di IMO, desiderando che le versioni più recenti possano essere utilizzate senza di esso - in qualche modo incasina il mio flusso di lavoro.
Chuck R,

7

Ho esteso questi artikels per includere uno script per overlayfs che imposta un root fs di sola lettura.

Spero che sia d'aiuto.


1
Grazie al lavoro svolto da altri, Dustin e io abbiamo aggiunto un pacchetto banale chiamato 'overlayroot' a quantal, che fa parte del pacchetto sorgente cloud-initramfs-tools . Vedere la documentazione di utilizzo in /etc/overlayroot.conf
smoser

2

Esempio eseguibile minimo

# 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 a monte .

Uscita del primo lscon il mount:

lower:
lost+found  lower-file

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

upper/upper:
overlay-file  upper-file

upper/work:
work

Uscita del secondo lssenza l'attacco:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Interpretazione:

  • inferiore: è rimasto invariato dopo aver scritto in overlay
  • superiore: ha ricevuto la modifica da sovrapporre
  • overlay: mostra i file sia in alto che in basso
  • lavoro: contiene alcuni contenuti casuali (una work/directory) di cui non dovremmo preoccuparci

Esempio adattato da: esempio di overlayFS

Ecco un esempio più complesso con più livelli inferiori: Sovrapposizioni ricaricate con più livelli (migrazione da aufs)

Testato su Ubuntu 18.04, kernel Linux 4.15.0.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.