Bagaimana cara menggunakan OverlayFS?

54

Ini jawaban dan pesan email menunjukkan bahwa sesuatu yang disebut "OverlayFS" yang tersedia di Ubuntu 11.10 dan tegas akan menggantikan aufs di Ubuntu 12.04.

Bagaimana saya menggunakannya? Di mana dokumentasinya?

ændrük
sumber
1
Anda dan saya berdua, saudara. Aku datang di ini sejauh ini: mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Di luar itu saya tidak tahu apa-apa. Saya mengutak-atiknya dalam sistem live, tetapi saya belum berhasil membuatnya bekerja. Saya berharap saya bisa mengetahui apa arti "upperdir" dan "lowerdir". Saya tidak menemukan apa pun.
Chuck R

Jawaban:

63

Sunting: Sejak menulis jawaban ini, beberapa hal telah berubah dalam overlayfs, yaitu penambahan parameter yang diperlukan workdir, lihat jawaban totti di bawah ini untuk penjelasan terperinci tentang parameter baru ini.

Saya akhirnya berhasil menemukannya. Saya menemukan referensi untuk itu di sumber kernel, tetapi untuk beberapa alasan itu tidak muncul di pohon git di kernel.org. Tapi! Jika Anda menarik sumber kernel Ubuntu seperti ini: apt-get source linux-image-3.0.0-16-genericAnda dapat menemukannya di linux-3.0.0/Documentation/overlayfs.txt. Ini juga tersedia dalam paket linux-doc di /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Karena dokumentasi bantuan yang sebenarnya lebih merupakan "cara kerjanya" dan bukan "cara me-mount dengannya," inilah ikhtisar singkat (ada satu contoh dalam dokumentasi kernel):

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

Di mana [opsi pemasangan] dapat:

  • lowerdir = somedir: lowerdir adalah direktori di mana Anda akan meletakkan sistem file baru Anda, jika ada duplikat ini ditimpa oleh (sebenarnya, disembunyikan untuk) versi upperdir
  • upperdir = somedir: upperdir adalah direktori yang ingin Anda overlay lowerdir. Jika nama file duplikat ada di lowerdir dan upperdir, versi upperdir diutamakan.
  • opsi pemasangan standar. Satu-satunya yang saya lihat dari kode adalah ro / rw, tetapi Anda dapat melakukan percobaan.

Satu hal yang membingungkan saya pada awalnya, jadi saya mungkin harus mengklarifikasi, adalah bahwa pemasangan overlay tidak benar-benar me-mount sistem file. Saya mencoba me-mount filesystem squashfs menggunakan mount overlayfs, tapi itu bukan cara kerjanya. Anda pertama-tama harus me-mount sistem file (dalam kasus saya squashfs) ke direktori arbitrer, kemudian menggunakan overlayfs untuk menggabungkan titik mount (direktori) dan direktori lain ke direktori tersier (titik mount overlayfs) (edit: direktori "tersier" ini) sebenarnya bisa menjadi upperdir = direktori). Direktori tersier adalah tempat Anda akan melihat filesystem yang digabung (atau pohon direktori - fleksibel).

Contoh 1, overlay sistem file root

Saya telah bekerja pada disk boot hibrida Ubuntu di mana sistem Ubuntu dasar ada sebagai filesystem.squashfs dan saya memiliki file yang disebut ubuntu.overlay kubuntu.overlay xubuntu.overlay dan lubuntu.overlay. File .overlay adalah instalasi dasar dari sistem tersebut dengan isi filesystem.squashfs dipangkas (untuk menghemat ruang). Kemudian saya memodifikasi skrip init untuk overlay file .overlay distro yang benar (dari parameter boot) menggunakan overlayfs dan opsi di atas dan berfungsi seperti pesona!

Ini adalah baris yang saya gunakan dalam skrip init saya (setelah semua variabel diterjemahkan):

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

Perhatikan bahwa filesystem.squashfs di atas adalah direktori yang dibuat oleh casper, bukan file.

Ketiga pernyataan membuat /overlaydirektori, mount squashfs filesystem pada /overlaydirektori dan kemudian menggunakan OverlayFS pada dasarnya menggabungkan isi /overlaylebih /.

Contoh 2, penggabungan dua direktori secara transparan

Dalam proses membangun kembali USB langsung saya untuk setiap rilis, saya menggunakan OverlayFS untuk menghemat banyak waktu. Saya mulai dengan direktori bernama ubuntu-base yang berisi konten gambar ubuntu-core yang merupakan instalasi paling dasar. Saya kemudian akan membuat direktori yang disebut ubuntu, kubuntu, lubuntu, dan xubuntu.

Kemudian, saya menggunakan OverlayFS untuk membuat file-file dari basis-Ubuntu muncul di direktori individual. Saya akan menggunakan sesuatu seperti ini:

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

Ini membuat file-file dari ubuntu-base muncul di folder kubuntu. Lalu, saya bisa chrootke folder kubuntu dan melakukan sesuatu seperti apt-get install kubuntu-desktop. Setiap perubahan yang dibuat saat dalam mount OverlayFS ini akan tetap berada di direktori atas, dalam hal ini folder kubuntu. Kemudian, setelah saya unmount mount OverlayFS file yang benar-benar ada di ubuntu-base tetapi "dicerminkan" ke folder kubuntu lenyap kecuali mereka telah diubah. Ini membuat saya tidak perlu memiliki banyak salinan file di basis-ubuntu sementara masih dapat menggunakannya seolah-olah mereka secara fisik ada di setiap lokasi.

Chuck R
sumber
3
"tetapi karena alasan tertentu ia tidak muncul di pohon git di kernel.org" - Itu karena overlayfs tidak ada di kernel upstream, sama seperti aufs tidak (dan tidak akan pernah ada). Sistem file gabungan seperti itu diintegrasikan oleh Tim Kernel Ubuntu.
MestreLion
2
OverlayFS tampaknya memasuki kernel 3.10.
David C. Bishop
8
Akhirnya, harus masuk 3.18 lwn.net/Articles/617099
Rmano
4
@Rmano: pada mesin saya hanya berfungsi dengan overlaytidak denganoverlayfs
Janus Troelsen
1
Terima kasih @ austinmarton, saya menemukan ini beberapa waktu lalu dan totti menutupnya di bawah sebelum saya memperbarui jawaban saya, jadi saya memberi penghargaan untuk jawabannya di bagian atas milik saya.
Chuck R
20

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

Atas dan Bawah

Sistem file overlay menggabungkan dua sistem file - sistem file 'atas' dan sistem file 'lebih rendah'. Ketika nama ada di kedua sistem file, objek di sistem file 'atas' terlihat sementara objek di sistem file 'lebih rendah' ​​disembunyikan atau, dalam kasus direktori, digabung dengan objek 'atas'.

Akan lebih tepat untuk merujuk ke 'pohon direktori' atas dan bawah daripada 'sistem file' karena sangat mungkin untuk kedua pohon direktori berada di sistem file yang sama dan tidak ada persyaratan bahwa akar dari sistem file diberikan untuk baik atas atau bawah.

Filesystem yang lebih rendah dapat berupa filesystem apa saja yang didukung oleh Linux dan tidak perlu ditulis. Sistem file yang lebih rendah bahkan bisa menjadi overlayfs lain. Sistem file bagian atas biasanya dapat ditulisi dan jika itu harus mendukung pembuatan atribut extended. * Extended, dan harus memberikan d_type yang valid dalam respons readdir, sehingga NFS tidak cocok.

Hamparan read-only dari dua filesystem read-only dapat menggunakan tipe filesystem apa saja.

Direktori

Overlay terutama melibatkan direktori. Jika nama yang diberikan muncul di kedua filesystem atas dan bawah dan merujuk ke non-direktori di salah satu, maka objek yang lebih rendah disembunyikan - namanya hanya merujuk ke objek atas.

Di mana kedua objek atas dan bawah adalah direktori, direktori gabungan dibentuk.

Pada waktu mount, dua direktori yang diberikan sebagai opsi mount "lowerdir" dan "upperdir" digabungkan ke dalam direktori gabungan:

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

"Workdir" harus berupa direktori kosong pada sistem file yang sama dengan upperdir.

Kemudian setiap kali pencarian diminta dalam direktori yang digabungkan, pencarian dilakukan di setiap direktori aktual dan hasil gabungan di-cache dalam dentry milik sistem file overlay. Jika kedua pencarian aktual menemukan direktori, keduanya disimpan dan direktori gabungan dibuat, jika tidak hanya satu yang disimpan: bagian atas jika ada, atau bagian bawah.

Hanya daftar nama dari direktori yang digabung. Konten lain seperti metadata dan atribut diperluas dilaporkan hanya untuk direktori atas. Atribut direktori bawah ini disembunyikan.

totti
sumber
4
Terima kasih atas klarifikasi pada workdir. Itu adalah perubahan yang cukup baru dan untuk alasan apa pun saya tidak pernah dapat menemukan dokumentasi tentang apa yang sebenarnya 'workdir' lakukan. Itu tidak ada dalam bantuan kernel baik terakhir kali saya melihat. Menambahkan lapisan kebingungan ke IMO overlay, berharap versi yang lebih baru dapat digunakan tanpanya - ini mengacaukan alur kerja saya.
Chuck R
7

Saya telah memperluas artikel ini untuk menyertakan Script untuk overlay yang menetapkan root read-only fs.

Semoga ini bisa membantu.

Floyd42
sumber
1
Berkat pekerjaan yang dilakukan orang lain, Dustin dan saya telah menambahkan paket banary bernama 'overlayroot' ke quantal, yang merupakan bagian dari paket sumber cloud-initramfs-tools . Lihat dokumentasi penggunaan di /etc/overlayroot.conf
smoser
2

Contoh runnable minimal

# 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 hulu .

Output pertama lsdengan mount:

lower:
lost+found  lower-file

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

upper/upper:
overlay-file  upper-file

upper/work:
work

Output dari yang kedua lstanpa mount:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Interpretasi:

  • lebih rendah: tidak berubah setelah menulis untuk overlay
  • atas: menerima modifikasi untuk overlay
  • overlay: menampilkan file dari atas dan bawah
  • work: berisi beberapa konten acak ( work/direktori) yang seharusnya tidak kita pedulikan

Contoh diadaptasi dari: Contoh Penggunaan OverlayFS

Berikut adalah contoh yang lebih kompleks dengan beberapa lapisan bawah: Reload overlay dengan banyak lapisan (migrasi jauh dari aufs)

Diuji pada Ubuntu 18.04, kernel Linux 4.15.0.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber