LINUX.ORG.RU
решено ФорумAdmin

Read-only root on NFS

 , , , ,


0

0

Попробовал обеспечить загрузку системы с read-only /, смонтированному по NFS.

Исходные данные:

  • Ubuntu 18.04 Mate, установлена в виртуалку, rootfs перенесен с виртуального диска на NFS-сервер
  • Изменён конфиг initramfs для загрузки с NFS, изменён fstab, initramfs и ядро закинуты в каталог tfpt-сервера

Система типа грузится по NFS, но ожидаемо обламывается куча юнитов (Failed to start Create Volatile Files and Directories, Failed to start Load/Save Random Seed, Failed to start Network Time Synchronization и т.д.), т.к. им нужен / в rw. Логин не работает, даже автологин.

Нашёл такую штуку, как overlayroot: https://spin.atomicobject.com/2015/03/10/protecting-ubuntu-root-filesystem/ Монтирует / как overlayfs с нижним ro-слоем и верхним rw. Я использовал описанный по ссылке вариант с rw-слоем в tmpfs.

Поставил, настроил. Судя по логам загрузки, скрипты overlayroot отрабатывают на стадии initramfs. Но дальше лог загрузки тот же: те же юниты не стартуют, залогиниться не получается. Есть подозрение, что systemd обнуляет все усилия скриптов overlayroot по созданию rw-корня с помощью overlayfs перемонтируя / (Starting Remount Root and Kernel File Systems...)

Какие идеи?

не могут создать файлы.
смотреть что за файлы в каких директориях и прописать в инит-скрипт инитрнамфса команды на создание онных директорий/файлов и прописывания необходимых юзеров и прав.

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

Не знаю, что делать ТСу, а тебе рекомендую научиться читать.

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

Неважно. Можно и в tmpfs, но, поскольку в /var должна существовать определенная структура каталогов, проще будет смонтировать ее с локального диска или тоже по NFS. Потом, если (когда) всё будет уже работать, можно смонтировать и tmpfs, создав в ней нужные каталоги.

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

Может проще повторить то, что делают скрипты overlayroot, только вручную через fstab?

Загрузился с init=/bin/bash. Вот вывод mount:

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=1002528k,nr_inodes=250632,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=204116k,mode=755)
192.168.54.8:/scratch/nfsroot/ubuntu1804 on /media/root-ro type nfs (ro,<много опций>)
tmpfs-root on /media/root-rw type tmpfs (rw,relatime)
overlayroot on / type overlay (rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_)

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

Может проще повторить то, что делают скрипты overlayroot, только вручную через fstab?

Не думаю. По-моему, проще всего для начала вручную создать структуру в /var, и смонтировать /var через fstab. Но я никогда не занимался загрузкой по NFS систем с systemd, так что могу ошибаться.

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

Убедился, что я скопировал rootfs из виртуалки на NFS-сервер без потери ACL, что ACL видно через NFS (монтировал локально с vers=3,acl,rw, ACL на /var/log/journal/ в порядке), смонтировал в fstab весь / с теми же опциями (vers=3,acl,rw).

Обламываются всё те же юниты, логин не работает.

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

Логи где? systemd.debug-shell в параметры ядра, а дальше иди на tty9 и смотри, что где сломалось.

Есть подозрение, что systemd обнуляет все усилия скриптов overlayroot по созданию rw-корня с помощью overlayfs перемонтируя / (Starting Remount Root and Kernel File Systems...)

Корень нельзя просто так перемонтировать на что угодно. Для большей уверенности можешь убрать строчку про корень из fstab.

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

Логи где?

Не знаю. Вряд ли они пишутся в /var/log/journal/, т.к. с ним, похоже, проблемы.

Отлаживаю загрузку в VirtualBox, добавил COM-порт и отправил его в сокет. Сокет вывожу на STDIO socat-ом.

systemd.debug-shell в параметры ядра, а дальше иди на tty9 и смотри, что где сломалось.

И там сразу же: bash: /root/.bashrc: Permission denied. Но консоль есть. Думаю, это из-за отсутствия no_root_squash в NFS-экспорте.

Для большей уверенности можешь убрать строчку про корень из fstab.

Пробовал, не помогает.

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

Вряд ли они пишутся в /var/log/journal

Значит, пишутся в /run/log/journal. А ты просто journalctl пробовал?

Но консоль есть.

Ну тогда в чём проблемы? systemctl list-jobs, systemctl status, systemctl --failed, вот это всё где?

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

Так. Дело было в отсутствии no_root_squash при экспорте rootfs, я думал его покрывает no_all_squash.

Сейчас получилось загрузиться, но с rw-корнем, без overlayroot.

Конечная цель это экспорт корня по NFS в ro-режиме.

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

Итак, корень в RO с overlayroot. Опять валится загрузка (но логин работает). При пустом /etc/fstab корень перемонтируется с overlayfs в rw на nfs в ro.

systemctl list-jobs

No jobs running

systemctl status

Failed: 6 units

systemctl --failed

anacron, systemd-{hostnamed,resolved,timesyncd,tmpfiles-setup,update-utmp}

(Надо бы debug-консоль вывести на ttyS0 логин в ttyS0 работает)

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

Корень нельзя просто так перемонтировать на что угодно.

Как видно, именно это и происходит.

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

Как видно, именно это и происходит.

Ну блин, чудес не бывает. Нельзя отмонтировать ФС, на которой что-то открыто.

При пустом /etc/fstab корень перемонтируется с overlayfs в rw на nfs в ro.

Ты точно уверен, что перемонтируется (а не что просто твой скрипт не срабатывает)? Логи где?

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

Ты точно уверен, что перемонтируется (а не что просто твой скрипт не срабатывает)?

Read-only root on NFS (комментарий)

Логи где?

Чего именно? Зачем? Ясно же, в чём проблема.

P.S. Попробовал загрузиться с systemd.volatile=state вместо использования overlayroot. Всё равно куча юнитов ломается. Они, судя по https://wiki.debian.org/ReadonlyRoot, хотят /etc в rw. /var в rw им недостаточно.

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

Read-only root on NFS (комментарий)

Это интересно, но я не могу себе представить, что может быть ответственным за такое поведение. По крайней мере, без логов. «Remount Root and Kernel File Systems» — это именно то, что сказано, с -o remount. Там нечему заменять корневую ФС на другую, даже если бы это было возможно.

Чего именно?

Загрузки.

Зачем?

Чтобы починить.

Ясно же, в чём проблема.

Ну раз тебе ясно, в чём проблема, что ты здесь забыл? :)

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

Это интересно, но я не могу себе представить, что может быть ответственным за такое поведение.

Какой-то ранний юнит systemd. Парсит commandline ядра и монтирует / в соответствии с ним. Даже если в fstab про / ничего нет.

Ну раз тебе ясно, в чём проблема, что ты здесь забыл?

Ясно в чём проблема, а не как решать.

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

Какой-то ранний юнит systemd. Парсит commandline ядра и монтирует / в соответствии с ним.

Тогда покажи вывод mount в проблемном случае.

Ясно в чём проблема, а не как решать.

Без логов тебе никто ничего не скажет.

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

Тогда покажи вывод mount в проблемном случае.

После загрузки с systemd? По памяти: nfs подмонтирован в /, overlayfs и её upper/lower-слоями из Read-only root on NFS (комментарий) и не пахнет. Ну плюс ещё куча всего намонтировано как обычно: cgroupfs и т.д.

Без логов тебе никто ничего не скажет.

Мне нужно поднять dhcp+tftp+NFS у себя на лэптопе, т.к. доступа к «боевому» NFS-серверу у меня уже нет.

utf8nowhere ★★ ()

мне в похожей ситуации пришлось откатиться на sysvinit, но systemd вроде как должен нормально работать с ro root при условии что /run /tmp и /var rw.

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

overlayfs и её upper/lower-слоями из Read-only root on NFS (комментарий) и не пахнет

Тогда, я ещё раз повторяю, ищи проблему до запуска systemd с реального корня, т. е. внутри initramfs. ФС невозможно отмонтировать, пока с неё что-либо исполняется (например, инит).

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

Когда начинает исполняться /bin/bash, который мы прописали как init=, разве скребты с initramfs не заканчивают к этому моменту свою работу?

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

Конечно, заканчивают. Я не могу сказать, что у тебя там происходит и почему init=/bin/bash на что-то влияет, но могу с почти абсолютной уверенностью сказать, что если ты не видишь overlayfs у себя в выводе mount, то он оттуда исчез до запуска systemd с корня.

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

У меня есть ещё одна стрёмная гипотеза, которую я не могу проверить, поскольку не знаю, как устроен initramfs в Ubuntu.

Гипотеза следующая: в systemd есть режим работы из initramfs. Если в Ubuntu этот режим задействован и в initramfs запускается своя копия systemd, и если она запускается между скриптотой (init-bottom) и инитом с реального корня, то вот она как раз может посмотреть на эти маунты, сказать «что за херня?», отмонтировать всё к чёртям и смонтировать заново согласно cmdline.

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

Чёт я даже не знаю, в чём дело.

Наконец-то локально настроил dhcp+tftp+nfs, загрузился с включённым overlayroot и… никто rootfs не перемонтировал.

Завтра буду смотреть, в чём дело на «боевом» сервере.

utf8nowhere ★★ ()

Всё работает. Проблема была только в отсутствии no_root_squash.

intelfx спасибо за беспокойство.

P.S. Не ожидал, что сделать / на NFS будет так просто: всего-то нужно изменить одну строчку в update-initramfs.conf, убрать / из fstab, поставить overlayroot и изменить одну строчку в его конфиге.
Я думал геморроя будет на порядок больше.

utf8nowhere ★★ ()
Последнее исправление: utf8nowhere (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.