LINUX.ORG.RU

Как грамотно смонтировать overlayfs поверх корня?

 , ,


0

2

Здравствуйте. На девайсе стоит Ubuntu. Хочу смонтировать поверх ридонли корневой системы оверлей. Initramfs не используется. Сейчас делаю так, но как-то некрасиво получается: в выводе mount торчат старые точки монтирования и будто-бы old_root — какая-то лишняя сущность.

root=/dev/mmcblk0p1 ro init=/init_overlay
# /init_overlay

mount -t proc proc /proc
mount /dev/mmcblk0p2 /mnt/
mkdir -p /mnt/{lower,upper,work,root}

mount --bind / /mnt/lower
mount -t overlay overlay \
      -o lowerdir=/mnt/lower,upperdir=/mnt/upper,workdir=/mnt/work \
      /mnt/root

umount /dev
umount /proc

cd /mnt/root
pivot_root . old_root

exec /sbin/init   # systemd

А как нормальные люди это делают? Спасибо.

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

Смотрел в скриптах пакета overlayroot но ничего не понял. Там лапша какая-то. Кстати, в скриптах initramfs используют switch_root, но, насколько я понимаю, он мне не подходит. Цитата из мана:

WARNING: switch_root removes recursively all files and directories on the current root filesystem.

Если мне не нужно удалять корневую ФС :)

У меня же система без initramfs.

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

После pivot_root надо реекзекнуть все процессы, чтобы они пересели на новый корень. А потом можно отмонтировать маунтпоинт old_root и удалить каталог old_root. Такими фокусами обычно занимаются, пока процесс всего один —PID 1.

iliyap ★★★★★
()
Последнее исправление: iliyap (всего исправлений: 1)
Ответ на: комментарий от iliyap

Да, у меня как раз этот скрипт выполняется с PID=1. Его запускает ядро по параметру init. Других процессов, вроде бы, больше нет.

Пробовал отмонтировать old_root но пишет, что ресурс занят или что-то типа этого. То есть, из-за того, видимо, что корень биндится в /mnt/lower, он не может быть потом отмонтирован. Это как я понял. А передвинуть его (mount --move) у меня не получилось.

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

Выполняешь man mount и читаешь:

   The move operation
       Move a mounted tree to another place (atomically). The call is:

          mount --move olddir newdir

       This will cause the contents which previously appeared under olddir to now be accessible under newdir. The physical location of the files is not changed. Note that olddir has to be a mountpoint.

       Note also that moving a mount residing under a shared mount is invalid and unsupported. Use findmnt -o TARGET,PROPAGATION to see the current propagation flags.

Аналогично для squashfs или другой RO ФС и /proc, /sys, /dev, /run (если есть).

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)

А switch_root как раз делает то, что тебе нужно, man switch_root:

SWITCH_ROOT(8)                                                                                           System Administration                                                                                           SWITCH_ROOT(8)

NAME
       switch_root - switch to another filesystem as the root of the mount tree

SYNOPSIS
       switch_root [-hV]

       switch_root newroot init [arg...]

DESCRIPTION
       switch_root moves already mounted /proc, /dev, /sys and /run to newroot and makes newroot the new root filesystem and starts init process.
WARNING: switch_root removes recursively all files and directories on the current root filesystem.

Хотя да, значит пробуй move.

Возможно, придётся делать ленивое размонтирование umotun -l /old_root.

Зачем тебе такой велосипед?

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 3)
Ответ на: комментарий от kostik87

Хорошо, Константин, заврта попробую с --move ещё раз. Спасибо! ❤️

Зачем тебе такой велосипед?

Очень не хочу заморачиваться с initramfs, а систему надо сделать по возможности неубиваемой.

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

После pivot_root у твоего PID 1 рабочий каталог стал /old_root. И бинарник, из которого сделан процесс, это /old_root/bin/bash. Это не даёт отмонтировать /old_root, маунтпоинт занят. Надо в PID 1 после pivot_root сменить рабочий каталог на / и сделать exec скрипта из /. Например, разбить твой скрипт на два: первый делает монтирования, pivot_root, смену рабочего каталога, и exec второго скрипта, второй скрипт отмонтирует old_root и делает exec настоящего инита. Либо скрипт один, и он экзекает себя же из нового рута с каким-то параметром, чтобы он мог отличить первый запуск от второго.

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

Либо скрипт один, и он экзекает себя же из нового рута

Да, точно. Отличная идея! Почему-то мне не пришло в голову, что мой скрипт может мешать отмонтировать /old_root.

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

С --move не получилось. И это, вроде бы, логично. Как я передвину rootfs, если я в данный момент нахожусь в ней и запускаю оттуда утилиты?

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

Идея с реекзком тоже не сработала, по непонятной причине. /old_root так и не получилось отмонтировать.

В итоге пока остановился на простом chroot. Вроде всё работает и вывод mount чистенький.

exec chroot /mnt/root /sbin/init

вместо pivot_root. Надеюсь это надёжно :)

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

В Debian есть пакет live-boot кот. помогает делать ro root.

Параметры ядра приблизительно такие(кусок grub.cfg):

linux /boot/vmlinuz-generic \
   root=/dev/disk/by-label/rootfs \
   boot=live toram plainroot live-boot.debug

Это смонтирует root=/dev/disk/by-label/rootfs в ro. Сверху сделает rw оверлей в RAM.

Получится rw root все изменения в котором исчезают после перезагрузки.

imatveev13
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.