Jak korzystać z OverlayFS?

53

Ta odpowiedź i wiadomość e - mail wskazują, że coś o nazwie „OverlayFS” jest dostępne w Ubuntu 11.10 i wymusi zastąpienie aufs w Ubuntu 12.04.

Jak z tego korzystać? Gdzie jest jego dokumentacja?

ændrük
źródło
1
Ty i ja, bracie. Natknąłem się to do tej pory: mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Poza tym nie mam pojęcia. Majstruję przy tym w systemie na żywo, ale jeszcze nie udało mi się go uruchomić. Chciałbym dowiedzieć się dokładnie, co oznaczają „górny katalog” i „dolny katalog”. Nic nie znalazłem
Chuck R

Odpowiedzi:

63

Edycja: Od czasu napisania tej odpowiedzi niektóre zmiany uległy zmianie w nakładkach, a mianowicie dodanie wymaganego parametru workdir, patrz odpowiedź totti poniżej, aby uzyskać szczegółowy opis tego nowego parametru.

W końcu udało mi się go znaleźć. Znalazłem odniesienia do niego w źródle jądra, ale z jakiegoś powodu nie pojawia się w drzewie git na kernel.org. Ale! Jeśli wyciągniesz źródło jądra Ubuntu w ten sposób: apt-get source linux-image-3.0.0-16-genericmożesz je znaleźć linux-3.0.0/Documentation/overlayfs.txt. Jest również dostępny w pakiecie linux-doc w /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Ponieważ faktyczna dokumentacja pomocy jest bardziej „sposobem działania” zamiast „jak się z nim zamontować”, oto krótkie podsumowanie (istnieje jeden przykład w dokumentacji jądra):

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

Gdzie [opcje montowania] mogą być:

  • lowerdir = somedir: lowerdir to katalog, na którym chcesz położyć swój nowy system plików, jeśli istnieją duplikaty, zostaną one nadpisane przez (w rzeczywistości ukrytą na korzyść) wersję Upperdir
  • Upperdir = somedir: Upperdir to katalog, w którym chcesz nakładać lowerdir. Jeśli w katalogach lowerdir i upperdir istnieją zduplikowane nazwy plików, pierwszeństwo ma wersja Upperdir.
  • standardowe opcje montażu. Jedyny, który widziałem z kodu, to ro / rw, ale możesz eksperymentować.

Jedną z rzeczy, która mnie na początku pomyliła, więc powinienem chyba wyjaśnić, jest to, że zamontowanie overlayfs nie powoduje zamontowania systemu plików. Próbowałem zamontować system plików squashfs za pomocą montowania overlayfs, ale nie tak to działa. Najpierw musisz zamontować system plików (w moim przypadku squashfs) w dowolnym katalogu, a następnie użyć overlayfs, aby scalić punkt montowania (katalog) i inny katalog w katalogu trzeciorzędnym (punkt montowania overlayfs) (edycja: ten katalog „trzeciorzędowy” może to być katalog Upperdir =). Trzeci katalog to miejsce, w którym zobaczysz scalone systemy plików (lub drzewa katalogów - jest elastyczny).

Przykład 1, nakładanie głównego systemu plików

Pracowałem na hybrydowym dysku rozruchowym Ubuntu, na którym podstawowy system Ubuntu istnieje jako filesystem.squashfs i mam pliki o nazwie ubuntu.overlay kubuntu.overlay xubuntu.overlay i lubuntu.overlay. Pliki .overlay to podstawowe instalacje wymienionych systemów z przyciętą zawartością fileystem.squashfs (w celu zaoszczędzenia miejsca). Następnie zmodyfikowałem skrypty inicjujące, aby nałożyć plik .overlay prawidłowej dystrybucji (z parametru rozruchowego) za pomocą overlayfs i powyższych opcji i działa jak urok!

Oto linie, których użyłem w moich skryptach init (po przetłumaczeniu wszystkich zmiennych):

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

Zauważ, że fileystem.squashfs powyżej to katalog utworzony przez casper, a nie plik.

Te trzy instrukcje tworzą /overlaykatalog, montują system plików squashfs w /overlaykatalogu, a następnie używają OverlayFS do scalenia zawartości /overlayover /.

Przykład 2, przezroczyste połączenie dwóch katalogów

W trakcie przebudowy mojego Live USB dla każdej wersji używam OverlayFS, aby zaoszczędzić sporo czasu. Zaczynam od katalogu o nazwie ubuntu-base, który zawiera zawartość obrazu ubuntu-core, który jest najbardziej podstawową instalacją. Następnie utworzę katalogi o nazwach ubuntu, kubuntu, lubuntu i xubuntu.

Następnie używam OverlayFS, aby pliki z bazy ubuntu były wyświetlane w poszczególnych katalogach. Użyłbym czegoś takiego:

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

To sprawia, że ​​pliki z Ubuntu-base pojawiają się w folderze Kubuntu. Następnie mogę chrootprzejść do folderu kubuntu i zrobić coś takiego apt-get install kubuntu-desktop. Wszelkie zmiany dokonane podczas instalacji OverlayFS pozostaną w górnym katalogu, w tym przypadku w folderze kubuntu. Następnie, po odmontowaniu OverlayFS montuje pliki, które naprawdę istnieją w Ubuntu-base, ale są „dublowane” w folderze kubuntu, znikają, chyba że zostały zmienione. To powstrzymuje mnie od konieczności posiadania wielu kopii plików w Ubuntu-base, a jednocześnie mogę ich używać tak, jakby fizycznie istniały w każdej lokalizacji.

Chuck R.
źródło
3
„ale z jakiegoś powodu nie pojawia się w drzewie git na kernel.org” - To dlatego, że overlayfs nie znajduje się w jądrze, tak jak aufs nie jest (i nigdy nie będzie). Takie unijne systemy plików są zintegrowane przez zespół jądra Ubuntu.
MestreLion
2
OverlayFS najwyraźniej dostaje się do jądra 3.10.
David C. Bishop
8
Na koniec powinienem przejść do wersji 3.18 lwn.net/Articles/617099
Rmano
4
@Rmano: na mojej maszynie działa tylko z overlaynieoverlayfs
Janus Troelsen
1
Dziękuję @austinmarton, znalazłem to też jakiś czas temu i totti opisał to poniżej, zanim zaktualizowałem swoją odpowiedź, więc podziękowałem jego odpowiedzi na górze mojej.
Chuck R
20

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

Wyżej i niżej

Nakładkowy system plików łączy dwa systemy plików - „górny” i „dolny”. Gdy nazwa istnieje w obu systemach plików, obiekt w „górnym” systemie plików jest widoczny, podczas gdy obiekt w „dolnym” systemie plików jest ukryty lub, w przypadku katalogów, scalony z „górnym” obiektem.

Bardziej właściwe byłoby odwołanie się do górnego i dolnego „drzewa katalogów” zamiast do „systemu plików”, ponieważ jest całkiem możliwe, że oba drzewa katalogów znajdują się w tym samym systemie plików i nie ma wymogu podawania katalogu głównego systemu plików dla górna lub dolna.

Niższy system plików może być dowolnym systemem plików obsługiwanym przez Linux i nie musi być zapisywalny. Niższy system plików może być nawet kolejną nakładką. Górny system plików zwykle nadaje się do zapisu, a jeśli tak, musi obsługiwać tworzenie atrybutów zaufanych. * Rozszerzonych i musi zapewniać poprawny typ d w odpowiedziach readdir, więc NFS nie jest odpowiedni.

Nakładka tylko do odczytu dwóch systemów plików tylko do odczytu może wykorzystywać dowolny typ systemu plików.

Katalogi

Nakładanie dotyczy głównie katalogów. Jeśli dana nazwa pojawia się zarówno w górnym, jak i dolnym systemie plików i odnosi się do innego niż katalog w którymkolwiek z nich, wówczas dolny obiekt jest ukryty - nazwa odnosi się tylko do górnego obiektu.

Gdzie zarówno górne, jak i dolne obiekty są katalogami, tworzony jest scalony katalog.

W czasie montowania dwa katalogi podane jako opcje montowania „katalog dolny” i „katalog górny” są łączone w połączony katalog:

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

„Katalog roboczy” musi być pustym katalogiem w tym samym systemie plików, co katalog górny.

Następnie za każdym razem, gdy wymagane jest wyszukiwanie w takim scalonym katalogu, wyszukiwanie jest przeprowadzane w każdym rzeczywistym katalogu, a połączony wynik jest buforowany w dentystyce należącej do systemu plików nakładki. Jeśli oba rzeczywiste wyszukiwania znajdują katalogi, oba są przechowywane i tworzony jest scalony katalog, w przeciwnym razie przechowywany jest tylko jeden: górny, jeśli istnieje, w przeciwnym razie dolny.

Scalane są tylko listy nazw z katalogów. Inne treści, takie jak metadane i atrybuty rozszerzone, są zgłaszane tylko w górnym katalogu. Te atrybuty niższego katalogu są ukryte.

Totti
źródło
4
Dziękuję za wyjaśnienie dotyczące workdir. To była dość niedawna zmiana iz jakiegokolwiek powodu nigdy nie byłem w stanie znaleźć żadnej dokumentacji na temat tego, co faktycznie zrobił „workdir”. To nie było w pomocy jądra ani razu, kiedy patrzyłem. Dodaje warstwę zamieszania do nakładki IMO, chciałbym, żeby bez niej można było korzystać z nowszych wersji - to w pewnym sensie zakłóca mój przepływ pracy.
Chuck R
7

Rozszerzyłem te artykuły, aby zawierały skrypt dla nakładek, który konfiguruje root tylko do odczytu.

Mam nadzieję, że to pomoże.

Floyd42
źródło
1
Dzięki pracy, którą wykonali inni, Dustin i ja dodaliśmy banalny pakiet o nazwie „overlayroot” do quantal, który jest częścią pakietu źródłowego cloud-initramfs-tools . Zobacz dokumentację użytkowania w /etc/overlayroot.conf
smoser
2

Minimalny możliwy do uruchomienia przykład

# 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 w górę .

Wyjście pierwszego lsz montażem:

lower:
lost+found  lower-file

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

upper/upper:
overlay-file  upper-file

upper/work:
work

Wyjście drugiego lsbez uchwytu:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Interpretacja:

  • niższe: nie uległo zmianie po napisaniu do nakładki
  • górny: otrzymał modyfikację nakładki
  • nakładka: pokazuje pliki zarówno górne, jak i dolne
  • praca: zawiera losowe treści ( work/katalog), na których nie powinniśmy się przejmować

Przykład dostosowany z: Przykład użycia OverlayFS

Oto bardziej złożony przykład z wieloma niższymi warstwami: Overlayfs przeładowuje z wieloma warstwami (migracja z dala od aufs)

Testowany na Ubuntu 18.04, jądro Linux 4.15.0.

Ciro Santilli
źródło