Как загрузить Raspberry Pi по сети с помощью TFTP и NFS на Synology NAS?

Я могу загрузить Ubuntu20.04 по сети на Raspberry Pi 4b через NFS, используя Synology DS 1618+ в качестве сервера TFTP и NFS. Но я хотел бы защитить корневую файловую систему, чтобы несколько машин могли одновременно работать из одного корня. Это просто не сработает для меня. Несколько дней назад я задал вопрос на Ask Ubuntu, но не получил никакой полезной информации. Теперь я также лучше понимаю эту проблему и хотел бы перефразировать вопрос для более широкой аудитории.

Проблема

Хотя я могу загрузить Ubuntu20.04 по сети на RPi4 с помощью NFS, как только включу (overlayroot="tmpfs:recurse=0") система запускается вdegradedсостояние (systemctl is-system-running). Кажется очевидным, что это как-то связано с .

В этом состоянии толькоrootможет войти в систему. Другие пользователи не смогут пройти мимо запроса на ввод логина/пароля.

Экспертизаsyslogпоказывает, что первое, что идет не так во время загрузки, — это запускsystem-networkd, что приводит к сбою с сообщением («Операция не поддерживается»). Более внимательное рассмотрение показывает, чтоsystemd-networkdпытается запуститься от имени пользователя (system-network). Сsystem-netwworkdне запускается, как и ряд других служб:

        UNIT                      LOAD   ACTIVE SUB    DESCRIPTION                   
● atd.service               loaded failed failed Deferred execution scheduler  
● avahi-daemon.service      loaded failed failed Avahi mDNS/DNS-SD Stack       
● systemd-networkd.service  loaded failed failed Network Service               
● systemd-resolved.service  loaded failed failed Network Name Resolution       
● systemd-timesyncd.service loaded failed failed Network Time Synchronization  
● systemd-networkd.socket   loaded failed failed Network Service Netlink Socket

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

6 loaded units listed.

Конфигурация

DHCPd

У меня есть пара DHCP-серверов ISC, которые работают хорошо уже больше года. Я внес следующие изменения в их конфигурацию для поддержки сетевой загрузки:

      # DHCP configuration for PXE boot of RPI4

option tftp-server-name "192.168.8.20"; #option 66
option bootfile-name "bootcode.bin"; #option 67

option vendor-class-identifier code 60 = string;
option vendor-encapsulated-options code 43 = string;
option space RPi code width 1 length width 1;
option RPi.discovery code 6 = unsigned integer 8;
option RPi.menu-prompt code 10 = text;
option RPi.menu-item code 9 = text;

option vendor-class-identifier "PXEClient";
option vendor-encapsulated-options "Raspberry Pi Boot";
vendor-option-space RPi;
option RPi.discovery 3;
option RPi.menu-prompt "PXE";
option RPi.menu-item "Raspberry Pi Boot";

filename "pxelinux.0";

next-server 192.168.8.20;
option tftp-server-address 192.168.8.20;

Признаюсь, я не совсем это понимаю, но это работает :-) Я уверен, что там есть вещи, которые RPi4 не использует.

Малиновый Пи 4б

Я настроил загрузчик RPi4 следующим образом:

      $ sudo rpi-eeprom-config 
[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=1
BOOT_ORDER=0xf21
TFTP_PREFIX=1
TFTP_PREFIX_STR=RPi4-Ubuntu/

Synology DS 1618+ NAS

ТФТП-сервер

При запуске RPi4 отправляетTFTP_PREFIX_STRвыше, и получает следующие файлы обратно с TFTP-сервера Synology NAS:

      bcm2710-rpi-2-b.dtb       bootcode.bin  initrd.img
bcm2710-rpi-3-b.dtb       boot.scr      overlay_map.dtb
bcm2710-rpi-3-b-plus.dtb  cmdline.txt   overlays
bcm2710-rpi-cm3.dtb       config.txt    start4cd.elf
bcm2710-rpi-zero-2.dtb    fixup4cd.dat  start4db.elf
bcm2711-rpi-400.dtb       fixup4.dat    start4.elf
bcm2711-rpi-4-b.dtb       fixup4db.dat  start4x.elf
bcm2711-rpi-cm4.dtb       fixup4x.dat   start_cd.elf
bcm2837-rpi-3-a-plus.dtb  fixup_cd.dat  start_db.elf
bcm2837-rpi-3-b.dtb       fixup.dat     start.elf
bcm2837-rpi-3-b-plus.dtb  fixup_db.dat  start_x.elf
bcm2837-rpi-cm3-io3.dtb   fixup_x.dat   vmlinuz

Это из установочного образа Ubuntu20.04 для RPi (раздел). Я внес следующие изменения вconfig.txt:

      [pi4]
# Run as fast as firmware / board allows
arm_boost=1

[all]
arm_64bit=1
device_tree_address=0x03000000
enable_uart=1
cmdline=cmdline.txt
kernel=vmlinuz
initramfs initrd.img followkernel

include syscfg.txt
include usercfg.txt

и :

      dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.8.20:/volume3/pxe/nfs/RPi4-Ubuntu/OS,tcp,rw ip=dhcp rootfstype=nfs elevator=deadline rootwait

NFS-сервер

Сервер NFS обслуживаетnfsrootупомянуто вcmdline.txtкак корень (/). Это в основномrootfsраздел из дистрибутива Ubuntu. Он также обслуживает файлы из дистрибутива Ubuntu.bootраздел, которые монтируются в/boot.

exports -vпоказывает следующее:

      /volume3/pxe    192.168.0.0/21(rw,async,no_wdelay,hide,crossmnt,no_subtree_check,insecure_locks,anonuid=1024,anongid=100,sec=sys,insecure,root_squash,no_all_squash)
/volume3/pxe    192.168.8.0/21(rw,async,no_wdelay,hide,crossmnt,no_subtree_check,insecure_locks,anonuid=1024,anongid=100,sec=sys,insecure,root_squash,no_all_squash)
/volume3/pxe    192.168.32.0/21(rw,async,no_wdelay,hide,crossmnt,no_subtree_check,insecure_locks,anonuid=1024,anongid=100,sec=sys,insecure,root_squash,no_all_squash)
/volume3/pxe    192.168.72.0/21(rw,async,no_wdelay,hide,crossmnt,no_subtree_check,insecure_locks,anonuid=1024,anongid=100,sec=sys,insecure,root_squash,no_all_squash)

Во время процесса загрузки кажется, что Synology NFS и RPi4 будут использовать только NFSv3. В/etc/fstabоднако они оба, похоже, с удовольствием используют NFSv4/NFSv4.1.

Вернемся к Пи

При таком созвездии RPi загружается и хорошо работает через сеть с файловой системой NFS в качестве root. Однако на этом этапе, желая защитить корневую файловую систему от записи, я приступаю к изменению файла конфигурации по адресу/etc/overlayroot.confпоэтому это выглядит следующим образом:

      overlayroot_cfgdisk="disabled"
#overlayroot=""
overlayroot="tmpfs:recurse=0,debug=1"

(Я пропустил более 160 строк комментариев перед этим.)

При перезагрузке возникает описанная выше проблема.

Помощь! Пожалуйста?

Я попробовал описанное выше с 32-битной и 64-битной Ubuntu22.04 с точно таким же результатом. Я попробовал Raspberry OS 11 (64-разрядную версию), но она не предлагается в качестве опции. Его альтернатива, встроенная вraspi-config, не работает с NFS. Так что я не преследовал этого.

Однако я значительно упростил конфигурацию TFTP для Ubuntu, основываясь на том, что делает Raspberry OS.

Я не удивлюсь, если проблема связана с сервером Synology NFS, но я не знаю, с чего начать поиск.

Я, конечно, не исключаю, что где-то допустил ошибку, поэтому буду признателен, если кто-нибудь укажет на нее.

Как только выйдет Ubuntu22.04, я тоже попробую.

В сети много людей, которые говорили об этом. Я прочитал много статей и попытался принять их идеи. Я видел один или два намека на возможные проблемы с корневыми файловыми системами NFS иoverlayroot. Но я не видел ничего, что бы точно описывало то, что я пытаюсь сделать.

2 ответа

Ответ относительно прост, хотя его поиск занял много времени.

Если вы загружаете Ubuntu по сети с помощью NFS на RPi4, входящий в комплект поставкиklibc(в версии Ubuntu) поддерживает только NFS v2 и v3. Если вы замените этоnfsmountтот, который поддерживает NFSv4, и ваша корневая файловая система успешно смонтирована с помощью NFSv4,overlayrootработает так, как должно.

Спойлер: это ошибка исходной версии (т. е. Debian) , которая существует с 2007 года. Повтор: 2007 год.

Скопировано из того же вопроса в Askubuntu:

Основная проблема, по-видимому, заключается в том, что в некоторых конфигурациях сервера NFS он ведет себя некорректно. А именно, что-то идет не так, когда используется поверх экспорта NFSv3 на сервере, который не реализует дополнительные расширения протокола NFSACL для v3. Похоже, это не единственный случай overlayfsбудучи очень хрупким по отношению к ACL. Судя по всему, были (и остаются?) проблемы с NFS v3 и v4.

Мне удалось упростить проблему до уровня, не связанного с загрузкой, а просто с наложением файлов и экспортом NFS. С помощью NFS-экспорта образа Ubuntu, обслуживаемого с компьютера Ubuntu (который реализует NFSACLv3), и каталога с именем/tmp/overlaygames/с пустымupper,work, иoverlayвнутри каталогов, следующий скрипт будет выполнен без ошибок:

      #!/bin/bash
sudo mount -t nfs -o ro,vers=3 10.99.0.1:/srv/nfs/ubuntu-20.04.3 /media/nfs/
sudo mount -t overlay -o lowerdir=/media/nfs,upperdir=/tmp/overlaygames/upper,workdir=/tmp/overlaygames/workdir/ overlay /tmp/overlaygames/overlay
ls /tmp/overlaygames/overlay/home

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

      #!/bin/bash
pushd /tmp/overlaygames
sudo umount overlay
rm -rf workdir
mkdir workdir
sudo umount /media/nfs
popd

Теперь запускаем тот же сценарий, но отключаем клиентскую часть NFSACLv3 с помощью опции noacl:

      #!/bin/bash
sudo mount -t nfs -o ro,noacl,vers=3 10.99.0.1:/srv/nfs/ubuntu-20.04.3 /media/nfs/
sudo mount -t overlay -o lowerdir=/media/nfs,upperdir=/tmp/overlaygames/upper,workdir=/tmp/overlaygames/workdir/ overlay /tmp/overlaygames/overlay
ls /tmp/overlaygames/overlay/home

вернет знакомое

      ls: cannot open directory '/tmp/overlaygames/overlay/home': Operation not supported

Аналогично, если начать с первого сценария, но поместить экспорт NFS на компьютер с FreeNAS/TrueNAS (FreeBSD), вы также получите возврат.Operation not supportedпотому что FreeBSD не реализует NFSACLv3 (проверено перехватом пакетов).

Интересно, уточнивvers=2при работе с общим ресурсом NFS во FreeBSD все работает нормально. Конечно, NFSv2 имеет некоторые ограничения по сравнению с NFSv3.

Другие вопросы по тегам