Risposte:
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-generic
lo 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:
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).
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 /overlay
directory, montano un filesystem squashfs sulla /overlay
directory e quindi usano OverlayFS per fondere essenzialmente il contenuto di /overlay
over /
.
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 chroot
accedere 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.
overlay
non conoverlayfs
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.
Ho esteso questi artikels per includere uno script per overlayfs che imposta un root fs di sola lettura.
Spero che sia d'aiuto.
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
Uscita del primo ls
con 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 ls
senza l'attacco:
lower:
lost+found lower-file
upper/upper:
overlay-file upper-file
upper/work:
work
Interpretazione:
work/
directory) di cui non dovremmo preoccuparciEsempio 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.
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