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
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.