Як використовувати OverlayFS?


53

Ця відповідь та повідомлення електронної пошти означають, що те, що називається "OverlayFS", доступне в Ubuntu 11.10 і змушує замінити aufs в Ubuntu 12.04.

Як я ним користуюся? Де знаходиться його документація?


1
І ти, і я, брате. Я прийшов через це до сих пір: mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Поза цим я незрозумілий. Я розмовляю з нею в живій системі, але мені ще не вдалося змусити її працювати. Я б хотів, щоб я міг точно дізнатися, що означають "верхній" та "нижній". Я нічого не знайшов.
Чак Р

Відповіді:


63

Редагувати: з моменту написання цієї відповіді деякі елементи змінилися в накладках, а саме додавання необхідного параметра workdir, див. Відповідь totti нижче для детального опису цього нового параметра.

Нарешті мені вдалося його знайти. Я знайшов посилання на нього у джерелі ядра, але він чомусь не відображається у дереві git на kernel.org. Але! Якщо ви витягнете джерело ядра Ubuntu таким чином: apt-get source linux-image-3.0.0-16-genericви можете його знайти linux-3.0.0/Documentation/overlayfs.txt. Він також доступний в пакеті linux-doc в /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Оскільки фактична довідкова документація - це скоріше "як вона працює", а не "як її встановити", ось короткий перебіг (у документації на ядро ​​є один приклад):

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

Де [параметри кріплення] можуть бути:

  • downdir = somedir: lowerdir - це каталог, в який ви збираєтеся закласти нову файлову систему, якщо є дублікати, вони перезаписуються (фактично приховані на користь) версії
  • topdir = somedir: upperdir - це каталог, з яким ви хочете перекрити нижній. Якщо дублікати імен файлів існують у нижньому та надмірному, версія версії має перевагу.
  • стандартні параметри кріплення. Єдине, що я бачив з коду, це ro / rw, але ви можете експериментувати.

Одне, що мене спочатку збентежило, тому я, мабуть, повинен уточнити, - це те, що монтаж накладки насправді не монтує файлову систему. Я намагався змонтувати файлову систему squashfs за допомогою кріплення накладення, але це не так, як це працює. Спочатку потрібно встановити (у моєму випадку squashfs) файлову систему до довільної каталогів, а потім використати накладки, щоб об'єднати точку монтування (каталог) та інший каталог у третинний каталог (точка монтажу накладень) (редагувати: цей "третій" каталог насправді може бути верхній каталог =). У третинному каталозі ви побачите об'єднані файлові системи (або дерева каталогів - це гнучко).

Приклад 1, накладання кореневої файлової системи

Я працював на гібридному завантажувальному диску Ubuntu, де база Ubuntu існує як filesystem.squashfs, і у мене є файли під назвою ubuntu.overlay kubuntu.overlay xubuntu.overlay та lubuntu.overlay. Файли .overlay - це базові встановлення згаданих систем із вмістом fileystem.squashfs, підрізаними (для економії місця). Потім я змінив скрипти init, щоб накласти. Overlay файл правильного дистрибутива (від параметра завантаження), використовуючи накладки та вищевказані параметри, і це працює як шарм!

Це рядки, які я використовував у своїх сценаріях init (коли всі змінні будуть переведені):

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

Зауважте, що файли system.squashfs вище - це каталог, створений Casper, а не файл.

Ці три оператора створити /overlayкаталог, змонтувати Squashfs файлову систему на /overlayкаталог , а потім використовувати OverlayFS по суті об'єднати вміст /overlayбільш /.

Приклад 2, прозоре злиття двох каталогів

У процесі відновлення мого живого USB для кожного випуску я використовую OverlayFS, щоб заощадити купу часу. Я починаю з каталогу під назвою ubuntu-base, яка містить вміст ядра ubuntu-ядра, яке є найпростішою установкою. Тоді я буду створювати каталоги під назвою ubuntu, kubuntu, lubuntu та xubuntu.

Потім я використовую OverlayFS, щоб змусити файли з бази ubuntu відображатися в окремих каталогах. Я б використав щось подібне:

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

Це змушує файли з ubuntu-бази відображатися у папці kubuntu. Потім я можу chrootперейти в папку kubuntu і зробити щось подібне apt-get install kubuntu-desktop. Будь-які зміни, які вносяться під час цього кріплення OverlayFS, залишатимуться у верхньому каталозі, у цьому випадку - папці kubuntu. Потім, як тільки я відключу монтування OverlayFS, файли, які дійсно існують у ubuntu-базі, але "відображені" у папці kubuntu, зникають, якщо вони не були змінені. Це не дозволяє мені мати декілька копій файлів у ubuntu-базі, поки все ще в змозі використовувати їх так, ніби вони фізично існують у кожному місці.


3
", але чомусь воно не відображається в дереві git на kernel.org" - Це тому, що накладення не знаходиться у верхньому ядрі, так як ауфи не є (і ніколи не будуть). Такі файлові системи об'єднання інтегровані командою Ubuntu Kernel.
MestreLion

2
OverlayFS, мабуть, потрапляє в ядро ​​3.10.
Девід К. Єпископ

8
Нарешті, має вийти в 3.18 lwn.net/Articles/617099
Rmano

4
@Rmano: на моїй машині він працює лише з overlayне зoverlayfs
Янус Трольсен

1
Дякую @austinmarton, я знайшов це ще деякий час назад, і Тотті висвітлював це внизу, перш ніж я оновив свою відповідь, тож я вдячний його відповіді у верхній частині моєї.
Чак R

20

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

Верхня і Нижня

Файлова система, що накладається, поєднує дві файлові системи - «верхню» файлову систему та «нижню» файлову систему. Коли ім’я існує в обох файлових системах, об’єкт у 'верхній' файловій системі видно, тоді як об’єкт у 'нижній' файловій системі або прихований, або, у випадку каталогів, об'єднаний з 'верхнім' об'єктом.

Правильніше було б посилатися на верхнє і нижнє 'дерево каталогів', а не на 'файлову систему', оскільки цілком можливо, що обидва дерева каталогів знаходяться в одній файловій системі, і немає жодної вимоги, щоб корі файлової системи не було вказано для або верхній, або нижній.

Нижньою файловою системою може бути будь-яка файлова система, що підтримується Linux, і вона не потребує запису. Нижня файлова система може бути навіть іншим накладом. Верхня файлова система, як правило, може бути доступною для запису, і якщо вона є, вона повинна підтримувати створення надійних. * Розширених атрибутів і повинна надавати дійсні d_type у відповідях readdir, тому NFS не підходить.

Накладення двох файлових систем лише для читання може використовувати будь-який тип файлової системи.

Довідники

Накладання в основному стосується каталогів. Якщо задане ім’я з'являється у верхній та нижній файлових системах і посилається на не-каталог у будь-якій, то нижній об’єкт приховано - ім'я стосується лише верхнього об'єкта.

Там, де і верхній, і нижній об’єкти є каталогами, утворюється об'єднаний каталог.

Під час монтажу два каталоги, наведені як параметри монтажу "downdir" і "upperdir", об'єднуються в об'єднаний каталог:

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

"Workdir" повинен бути порожнім каталогом у тій же файловій системі, що і upperdir.

Потім, коли запит на пошук у такому об'єднаному каталозі, пошук виконується у кожному фактичному каталозі, а об'єднаний результат кешується в стоматології, що належить файловій системі накладення. Якщо обидва фактичні пошукові файли знаходять каталоги, обидва зберігаються та створюється об'єднаний каталог, інакше зберігається лише один: верхній, якщо він існує, інший нижній.

З’єднуються лише списки імен із каталогів. Інший вміст, такий як метадані та розширені атрибути, повідомляється лише для верхнього каталогу. Ці атрибути нижнього каталогу приховані.


4
Дякуємо за роз’яснення щодо workdir. Це була досить недавня зміна, і з будь-якої причини мені так і не вдалося знайти жодної документації про те, що насправді робив «workdir». Це не було в допомозі ядра ні в останній раз, коли я дивився. Додає шар заплутаності в накладення IMO, бажаю, щоб новіші версії могли бути використані без нього - це на зразок заплутало мій робочий процес.
Чак R

7

Я розширив ці артекелі, щоб включити Скрипт для накладень, який встановлює кореневий файл, доступний лише для читання.

Сподіваюся, це допомагає.


1
Завдяки роботі, яку виконували інші, ми з Дастіном додали пакет квітів з назвою 'overlayroot' до кванталу, який є частиною вихідного пакета хмарних програм initramfs-tools . Дивіться документацію щодо використання в /etc/overlayroot.conf
smoser

2

Приклад мінімальної експлуатації

# 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 вище за течією .

Вихід першого lsз кріпленням:

lower:
lost+found  lower-file

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

upper/upper:
overlay-file  upper-file

upper/work:
work

Вихід другого lsбез кріплення:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Інтерпретація:

  • нижня: не змінювалася після написання накладання
  • верхня: отримана модифікація для накладання
  • накладання: показує файли як верхнього, так і нижнього
  • робота: містить деякий випадковий вміст ( work/каталог), про який ми не повинні піклуватися

Приклад адаптований з: Приклад використання OverlayFS

Ось більш складний приклад з кількома нижніми шарами: Overlayfs перезавантажується декількома шарами (міграція подалі від aufs)

Тестовано на Ubuntu 18.04, ядрі Linux 4.15.0.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.