Как загрузить 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.