LINUX.ORG.RU

Отмонтирование upperdir в overlay (systemd-volatile-root)

 , ,


0

1

Всем привет. Ищу закладки в systemd. Занятие увлекательное, но я туповат, поэтому нужна ваша помощь. Сейчас пытаюсь разобраться с небольшим сервисом volatile-root.

Пару водных для начала. Моё внимание привлекла функция make_overlay. В сухом остатке эта функция делает следующее:

mkdir -p /run/systemd/overlay-sysroot
mount -t tmpfs tmpfs /run/systemd/overlay-sysroot

mkdir /run/systemd/overlay-sysroot/upper
mkdir /run/systemd/overlay-sysroot/work
mount -t overlay overlay -o lowerdir=/sysroot,upperdir=/run/systemd/overlay-sysroot/upper,workdir=/run/systemd/overlay-sysroot/work /sysroot

umount /run/systemd/overlay-sysroot
rmdir /run/systemd/overlay-sysroot

Как это работает (особенно последний пункт)? Это точно законно?

  1. Если overlay перекрывает собой lowerdir, то как сам overlay продолжает правильно работать с lowerdir?
  2. Почему размонтирование в предпоследней строке ничего не ломает? Сперва думал, что это приколы tmpfs, но оно работает, даже если создать upper и work на втором жёстком диске.

overlay буферизует inode, поэтому ему плевать, смонтировано ли само устройство? Или что происходит? Если тыкнете в код или документацию overlayfs, где эта механика описывается, буду благодарен.

Видимо, особенности oberlayfs.

Примерно аналогичное поведение происходит в initramfs, точка монтирования будущего корня изначально в файловой системе initramfs, например в /mnt/root, потом происходит переключение на новый корень. В результате /mnt/root становится новым корнем (/).

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

switch_root я ещё могу понять. Там rootfs не отмонтируется, поэтому файлы из initrd просто рекурсивно удаляются, а всякие /proc, /sys, /dev, /run переносятся в новый корень. В overlay совсем другая магия происходит.

ilovepoettering2
() автор топика
Ответ на: комментарий от ilovepoettering2

Там rootfs не отмонтируется

Как это не монтируется. При использовании initramfs / initrd в качестве корня выступает содержимое initramfs / initrd, а перед выполнением switch_root / pivot_root будущий корень монтируется в директорию текущего корня, т.е. в initramfs / initrd, а потом происходит переключение.

В overlay совсем другая магия происходит.

Вот именно, но не совсем, у тебя собирается новая файловая система, возможно сам драйвер overlayfs переносит точки монтирования верхней и нижней файловой системы в другое место.

Проверь сам содержимое директорий с точками монтирования слоёв после монтирования overlayfs.

А так, за подробностями - в исходный код / документацию.

kostik87 ★★★★★
()

IMHO последние 2 команды не позволят ковыряться в кишках overlayfs и после размонтирования /sysroot не нужно будет самостоятельно ничего удалять из /run/systemd/overlay-sysroot
Это чем-то напоминает приём, когда программа создаёт файл и не закрывая его удаляет. Такой файл будет удалён автоматически после закрытия всех файловых дескрипторов связанных с ним (обычно после завершения процесса).
А тут примерно тоже самое делают с каталогами.

Пока больше всего удивляет возможность отмонтировать /run/systemd/overlay-sysroot при занятых upper и work.

vel ★★★★★
()
Ответ на: комментарий от kostik87

Там rootfs не отмонтируется

Как это не монтируется.

Ты, видимо, не понял. Я про то, что после монтирования rootfs не происходит его размонтирование. Вместо этого все точки монтирования переносятся в новый корень, а содержимое rootfs просто рекурсивно удаляется.

Вот именно, но не совсем, у тебя собирается новая файловая система, возможно сам драйвер overlayfs переносит точки монтирования верхней и нижней файловой системы в другое место.

Тоже думал об этом, но никаких подтверждений не нашёл. findmnt не выдаёт ничего лишнего. Можно даже без заморочек с systemd и initramfs воспроизвести такое поведение на двух разных жёстких дисках.

# монтируем раздел на втором жёстком диске и создаём директории
mount /dev/sdb1 /mnt
mkdir /mnt/upper
mkdir /mnt/work
mkdir /merged
mkdir /lower

# поднимаем overlay
mount -t overlay overlay -o lowerdir=/lower,upperdir=/mnt/upper,workdir=/mnt/work /merged

# дальше магия
umount /mnt
echo 1234 > /merged/txt
umount /merged
mount /dev/sdb1 /mnt
cat /mnt/upper/file
ilovepoettering2
() автор топика
Ответ на: комментарий от vel

Пока больше всего удивляет возможность отмонтировать /run/systemd/overlay-sysroot при занятых upper и work.

Да, это мне и непонятно. Я бы ожидал открытых дескрипторов, которые бы не позволили отмонтировать точки, но нет. В документации ничего путного не вижу про это. Пёттеринг использует недокументированные возможности?

ilovepoettering2
() автор топика
Ответ на: комментарий от ilovepoettering2

lsof/fuser не показывает используемых файлов/каталогов в /run/systemd/overlay-sysroot, значит нет повода для отказа в размонтировании.

Судя по всему это фича overlayfs, а не tmpfs.

vel ★★★★★
()

В сухом остатке…

…а младенца выплеснул с водой.

Как это работает (особенно последний пункт)?

mkdir -p /run/systemd/overlay-sysroot
...
rmdir /run/systemd/overlay-sysroot

Весьма благородно, сам намусорил, сам убрал.

Если overlay перекрывает собой lowerdir, то как сам overlay продолжает правильно работать с lowerdir?

lowerdir всегда «только чтение», самой overlay там не изменяется ничего.

Почему размонтирование в предпоследней строке ничего не ломает?

Значит к этому моменту всё уже сделано и сделано правильно.

andytux ★★★★★
()
Ответ на: комментарий от andytux

Почему размонтирование в предпоследней строке ничего не ломает?

Значит к этому моменту всё уже сделано и сделано правильно.

сделано правильно

Мне неочевидно. Это поведение, на которое можно полагаться? Ничего не нашёл в документации к overlayfs. Если можно выстрелить себе в ногу, это же не значит, что так нужно делать. Я примерно понял, что overlayfs буферизует иноды директорий, поэтому не держит десприкторы, но всё это пока очень мутно для меня выглядит.

ilovepoettering2
() автор топика