Raspberry Pi - Ubuntu 20.04.1을 사용하는 디스크 없는 클러스터

Raspberry Pi - Ubuntu 20.04.1을 사용하는 디스크 없는 클러스터

클러스터에서 Ubuntu를 실행할 수 있도록 Raspberry PI에서 Ubuntu 20.04를 디스크 없이 부팅하려고 합니다.

지금까지 Ubuntu가 설치된 RPi4b의 부팅 파티션에서 Raspberry Pi의 기본값인 dnsmasq/TFTP 서버로 이미지를 옮겼고, /srv/tftpboot/<serial>/부트로더를 업데이트하고 PI를 부팅했습니다.

dnsmasq 로그는 부팅 시 로드되는 파일을 보여줍니다.

/var/log/dnsmasq.log

==> /var/log/dnsmasq.log <==
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 available DHCP subnet: 192.168.254.254/255.255.255.0
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 vendor class: PXEClient:Arch:00000:UNDI:002001
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 PXE(eth0) dc:a6:32:b4:48:4f proxy
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 tags: eth0
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 broadcast response
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 sent size:  1 option: 53 message-type  2
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 sent size:  4 option: 54 server-identifier  192.168.254.254
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 sent size:  9 option: 60 vendor-class  50:58:45:43:6c:69:65:6e:74
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 sent size: 17 option: 97 client-machine-id  00:52:50:69:34:14:31:d0:00:32:b4:48:4f:f6...
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 sent size: 32 option: 43 vendor-encap  06:01:03:0a:04:00:50:58:45:09:14:00:00:11...
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 available DHCP subnet: 192.168.254.254/255.255.255.0
Sep  6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 vendor class: PXEClient:Arch:00000:UNDI:002001
Sep  6 14:25:03 dnsmasq-tftp[4799]: error 0 Early terminate received from 192.168.254.253
Sep  6 14:25:03 dnsmasq-tftp[4799]: failed sending /srv/tftpboot/6b0bb1f6/start4.elf to 192.168.254.253
Sep  6 14:25:03 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/config.txt to 192.168.254.253
Sep  6 14:25:03 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/pieeprom.sig not found
Sep  6 14:25:03 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/recover4.elf not found
Sep  6 14:25:03 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/recovery.elf not found
Sep  6 14:25:04 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/start4.elf to 192.168.254.253
Sep  6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/fixup4.dat to 192.168.254.253
Sep  6 14:25:05 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/recovery.elf not found
Sep  6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/config.txt to 192.168.254.253
Sep  6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/syscfg.txt to 192.168.254.253
Sep  6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/usercfg.txt to 192.168.254.253
Sep  6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/dt-blob.bin to 192.168.254.253
Sep  6 14:25:05 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/recovery.elf not found
Sep  6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/config.txt to 192.168.254.253
Sep  6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/syscfg.txt to 192.168.254.253
Sep  6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/usercfg.txt to 192.168.254.253
Sep  6 14:25:05 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/bootcfg.txt not found
Sep  6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/bcm2711-rpi-4-b.dtb to 192.168.254.253
Sep  6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/overlays/overlay_map.dtb to 192.168.254.253
Sep  6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/config.txt to 192.168.254.253
Sep  6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/syscfg.txt to 192.168.254.253
Sep  6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/usercfg.txt to 192.168.254.253
Sep  6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/cmdline.txt to 192.168.254.253
Sep  6 14:25:08 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/armstub8-gic.bin not found
Sep  6 14:25:08 dnsmasq-tftp[4799]: error 0 Early terminate received from 192.168.254.253
Sep  6 14:25:08 dnsmasq-tftp[4799]: failed sending /srv/tftpboot/6b0bb1f6/uboot_rpi_4.bin to 192.168.254.253
Sep  6 14:25:08 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/uboot_rpi_4.bin to 192.168.254.253

일반적으로 NFS 서버를 사용하고 cmdline.txt를 업데이트하여 rootfs의 위치를 ​​포함하므로 initrd가 로드되면 네트워크에 저장된 루트 FS를 사용할 수 있습니다.

Ubuntu에 필요한 옵션에 대한 많은 정보를 찾을 수 없으므로 다음 커널 문서에서 직접 가져왔습니다.https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt

그래서 TFTP 서버의 cmdline.txt를 다음과 같이 업데이트했습니다.

cmdline.txt

net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 nfsrootdebug elevator=deadline rootwait fixrtc init=initrd.img ip=dhcp rootfstype=nfs4 root=/dev/nfs nfsroot=192.168.254.254/srv/nfs/6b0bb1f6 rw

U-Boot 콘솔까지만 도달했습니다. vmlinuz 이미지가 로드되지 않아서 sdcard에서 실행되는 설치된 pi에서 vmlinuz-5.4.0-1016-raspi의 압축을 vmlinux로 풀었습니다.

zcat /boot/vmlinuz-5.4.0-1016-raspi > vmlinux

이를 TFTP 서버에 배치한 다음 [all] 섹션에서 내 config.txt를 업데이트하여 압축 해제된 이미지를 활용했습니다.

구성.txt

[all]
arm_64bit=1
device_tree_address=0x03000000
enable_uart=1
cmdline=cmdline.txt
include syscfg.txt
include usercfg.txt
kernel=vmlinux
initramfs initrd.img followkernel

initrd 로딩이 완료되었고 NFS 마운트 스크립트가 NFS 공유를 마운트하지 않습니다....

nfsmount: need a path
Begin: Retrying nfs mount ...

initrd 추출:

mkdir /root/initrd-expanded
cd /root/initrd-expanded
lz4 -cd /boot/initrd.img-5.4.0-1016-raspi | cpio -id

nfs 스크립트 내부를 살펴보면 다음과 같습니다.

# NFS root mounting
nfs_mount_root()
{

    nfs_top

    # For DHCP
    modprobe af_packet

    wait_for_udev 10

    # Default delay is around 180s
    delay=${ROOTDELAY:-180}

    # loop until nfsmount succeeds
    nfs_mount_root_impl
    ret=$?
    nfs_retry_count=0
    while [ ${nfs_retry_count} -lt "${delay}" ] \
        && [ $ret -ne 0 ] ; do
        [ "$quiet" != "y" ] && log_begin_msg "Retrying nfs mount"
        sleep 1
        nfs_mount_root_impl
        ret=$?
        nfs_retry_count=$(( nfs_retry_count + 1 ))
        [ "$quiet" != "y" ] && log_end_msg
    done
}

NFS 서버에 아무 것도 도달하지 않았 tcpdump port nfs으며 디버그 로깅도 추가되었습니다.

/etc/default/nfs-커널-서버

RPCMOUNTDOPTS="--manage-gids --debug all"

nfsroot에 전달되는 경로가 잘못된 것 같습니다. 이제 약간 혼란스러워집니다.

기본 이미지 설치 시 nfsroot= 처리

nfsroot=192.168.254.254/srv/nfs/6b0bb1f6 -> works
nfsroot=192.168.254.254:/srv/nfs/6b0bb1f6 -> fails

적절한 업데이트를 수행한 후 설치된 SDCard에서 설치를 수행하는 경우:

nfsroot=192.168.254.254/srv/nfs/6b0bb1f6 -> fails
nfsroot=192.168.254.254:/srv/nfs/6b0bb1f6 -> works

머리 뽑는 데 5시간 걸렸어요.

Ubuntu에서 Raspberry PI용으로 제공한 이미지에서 부팅 가능한 NFS 설치 시스템을 생성할 수 없습니다(또는 적어도 저는 생성할 수 없습니다). 그림을 이동! 시도하면 서비스가 시작되지 않는다는 온갖 종류의 오류가 발생합니다.

그래서 나는 내 자신의 질문에 답할 것입니다.

답변1

Raspberry PI 4b의 Ubuntu 20.04.1에서 완전 디스크 없는 시스템 생성

1)SDCard에 RaspberryPi Lite 설치

2)Raspberry OS SDCard로 Rpi4를 부팅하고 로그인한 후 다음을 실행하여 SSH를 활성화합니다.

cd /boot
touch ssh
reboot

삼)다른 머신에서 부트로더를 업데이트합니다. PI의 IP 주소를 알고 있고 SSH(위)를 활성화한 경우 이 스크립트는 부팅 코드를 0xf12로 설정합니다. 이는 네트워크, sdcard, 재부팅을 이 순서대로 반복해서 시도한다는 의미입니다. 이 게시물이 오래되면 펌웨어 버전을 확인하고 싶을 수도 있습니다. 또한 <uuid>.rpi.env파일 에 저장된 편리한 일련번호 및 Mac 주소가 포함된 env 파일을 제공합니다.

./update-bootloader.sh <ip-address-of-the-pi> <ip-address-of-your-nfs-server>

예를 들어

./update-bootloader.sh 192.168.0.254 192.169.0.254

#!/usr/bin/env bash
# update-bootloader.sh - update the boot loader for Rpi4
RPI_IP=$1
KICKSTART_IP=$2
RPI_DEFAULT_PASS="raspberry"
PI_EEPROM_DATE="2020-07-31"
PI_EEPROM_VERSION="pieeprom-${PI_EEPROM_DATE}"
PI_EEPROM_FILE="${PI_EEPROM_VERSION}.bin"
PI_EEPROM_LINK="https://github.com/raspberrypi/rpi-eeprom/raw/master/firmware/stable/${PI_EEPROM_FILE}"
UBUNTU_IMAGE_NAME="ubuntu-20.04.1-preinstalled-server-arm64+raspi.img"
UBUNTU_IMAGE_FILE="${UBUNTU_IMAGE_NAME}.xz"
UUID=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)

ssh-keygen -R ${RPI_IP}
ssh-keyscan -H ${RPI_IP} >> ~/.ssh/known_hosts
sshpass -p "${RPI_DEFAULT_PASS}" ssh pi@${RPI_IP} << EOF
if [[ -f ${PI_EEPROM_FILE} ]];then
  rm ${PI_EEPROM_FILE}
  echo 'removed eeprom file'
fi

rm *.rpi.env
echo 'removed old env'

rm bootconf.txt
echo 'removed bootconf.txt'

if [[ ! -f ${PI_EEPROM_FILE} ]];then
  wget ${PI_EEPROM_LINK}
fi

echo "extracting boot config from eeprom"
sudo rpi-eeprom-config ${PI_EEPROM_FILE} > bootconf.txt

echo "updating bootconfig"
sed -i 's/BOOT_ORDER=.*/BOOT_ORDER=0xf12/g' bootconf.txt
echo "MAX_RESTARTS=5" | sudo tee -a bootconf.txt

echo "writing eeprom"
sudo rpi-eeprom-config --out ${PI_EEPROM_VERSION}-netboot.bin --config bootconf.txt ${PI_EEPROM_FILE}

echo "updating eeprom on rpi"
sudo rpi-eeprom-update -d -f ./${PI_EEPROM_VERSION}-netboot.bin

echo "getting serial and mac"
cat /proc/cpuinfo | grep Serial | awk -F ': ' '{print \$2}' | tail -c 9 | awk '{print "RPI_SERIAL="\$1}' > ${UUID}.rpi.env
ip addr show eth0 | grep ether | awk '{print \$2}' | awk '{print "RPI_MAC="\$1}' >> ${UUID}.rpi.env
EOF

# copy the pi env back to get the serial and mac
sshpass -p "${RPI_DEFAULT_PASS}" scp -r pi@${RPI_IP}:~/${UUID}.rpi.env ~/${UUID}.rpi.env

sshpass -p "${RPI_DEFAULT_PASS}" ssh pi@${RPI_IP} << EOF
sudo reboot
EOF
cat ~/${UUID}.rpi.env

이제 pi가 재부팅되었으며 DHCP 응답을 위해 네트워크에 ping을 보냅니다.

4)PI Imager를 사용하여 SD 카드에 Ubuntu 20.04.1을 설치합니다.

5)SDCard를 Pi에 연결하고 부팅하세요.

6)을 하세요

apt update -y; apt upgrade -y

패스를 설정하고, 일부 패키지를 설치하고, 거기에 vim을 넣으세요(분명히 누가 emacs나 nano를 사용합니까??)

7)파이를 종료해

halt -p

귀하의 서버에서

8)Ubuntu 20.04.1이 설치된 SDCard를 서버에 연결하고, 드라이브를 마운트하고, 파티션 2의 OS 파일을 nfs 위치로 복사하여 루트를 PI에 공유합니다(예: /srv/nfs/<serial>/).

# find the partition where your CD card is (mine was sda on a rpi)
fdisk -l 

# mount the sdcard - copy the second partition off (should contain the boot files, you can ignore the boot partition, we can use the files off the root partition)
mkdir /root/p2
mount /dev/sda2 /root/p2
# cp using using -ax will give you a correct copy, man cp if needed
cp -vax /root/p2/. /srv/nfs/<serial>/.
# clean up
umount /root/p2
rm -rf /root/p2

9)TFTP가 부팅 파일을 제공할 수 있도록 Rpi 파일(NFS 공유에 저장됨)의 부팅 폴더를 TFTP 위치에 마운트합니다. 여기에서는 PI를 사용하여 다른 PI를 제공하므로 필요에 따라 편집합니다.

#/etc/fstab
LABEL=writable  /        ext4   defaults        0 0
LABEL=system-boot       /boot/firmware  vfat    defaults        0       1
/srv/nfs/<serial>/boot /srv/tftpboot/<serial> none defaults,bind 0 0

그런 다음 새 위치를 마운트하십시오.

mount -a

10)pi가 vmlinuz 커널의 압축을 풀지 않으므로 nfs 공유의 부팅 폴더에 있는 vmlinuz를 vmlinux로 추출합니다.

zcat /srv/nfs/<serial>/boot/vmlinuz-5.4.0-1016-raspi > /src/nfs/<serial>/boot/vmlinux-5.4.0-1016-raspi

11)TFTP가 찾을 수 있도록 부팅 폴더에 누락된 bcm2711-rpi-4-b.dtb, start4.elf, fixup4.dat 파일을 가리키도록 /srv/nfs/<serial>/boot 파티션 내부에 심볼릭 링크를 만듭니다. dtb 및 펌웨어 폴더에

선택 사항 - 더 이상 필요하지 않은 모든 정크를 제거합니다. 내 ls -al출력을 보고 거기에 있어야 할 것과 제거한 것을 확인합니다.

lrwxrwxrwx 1 root root       41 Sep  7 08:19 bcm2711-rpi-4-b.dtb -> dtbs/5.4.0-1016-raspi/bcm2711-rpi-4-b.dtb
-rw-r--r-- 1 root root      216 Sep  7 08:23 cmdline.txt
-rw-r--r-- 1 root root   220286 Aug 13 15:09 config-5.4.0-1016-raspi
-rw-r--r-- 1 root root      231 Sep  7 08:45 config.txt
lrwxrwxrwx 1 root root       43 Sep  6 20:34 dtb -> dtbs/5.4.0-1016-raspi/./bcm2711-rpi-4-b.dtb
lrwxrwxrwx 1 root root       43 Sep  6 20:34 dtb-5.4.0-1016-raspi -> dtbs/5.4.0-1016-raspi/./bcm2711-rpi-4-b.dtb
drwxr-xr-x 3 root root     4096 Sep  7 07:27 dtbs
drwxr-xr-x 2 root root     4096 Sep  7 07:56 firmware
lrwxrwxrwx 1 root root       19 Sep  7 08:15 fixup4.dat -> firmware/fixup4.dat
lrwxrwxrwx 1 root root       27 Sep  6 20:32 initrd.img -> initrd.img-5.4.0-1016-raspi
-rw-r--r-- 1 root root 29579888 Sep  6 20:34 initrd.img-5.4.0-1016-raspi
lrwxrwxrwx 1 root root       19 Sep  7 07:26 start4.elf -> firmware/start4.elf
-rw-r--r-- 1 root root      327 Sep  7 08:04 syscfg.txt
-rw-r--r-- 1 root root  4162247 Aug 13 15:09 System.map-5.4.0-1016-raspi
-rw-r--r-- 1 root root      200 Sep  7 08:04 usercfg.txt
-rw-r--r-- 1 root root 25907712 Sep  7 08:13 vmlinux-5.4.0-1016-raspi
lrwxrwxrwx 1 root root       24 Sep  6 20:32 vmlinuz -> vmlinuz-5.4.0-1016-raspi
-rw-r--r-- 1 root root  8420251 Aug 13 15:09 vmlinuz-5.4.0-1016-raspi

12)/srv/nfs/<serial>/boot파티션 의 일부 구성 업데이트

#/srv/nfs/<serial>/boot/config.txt
[pi4]
max_framebuffers=2

[all]
arm_64bit=1
device_tree_address=0x03000000
enable_uart=1
cmdline=cmdline.txt
include syscfg.txt
include usercfg.txt
kernel=vmlinux-5.4.0-1016-raspi
initramfs initrd.img-5.4.0-1016-raspi followkernel
#/srv/nfs/<serial>/boot/cmdline.txt
net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 nfsrootdebug elevator=deadline rootwait fixrtc init=initrd.img ip=dhcp rootfstype=nfs4 root=/dev/nfs nfsroot=<nfs ip>:/srv/nfs/<serial> rw

13)fstab 업데이트 - 이것은 pi로 전송되는 fstab입니다.

#/srv/nfs/<serial>/etc/fstab
proc            /proc           proc    defaults        0       0
<nfs ip>:/srv/nfs/<serial> /       nfs4     defaults,rw,nolock             0       0 # data to be shared to server
<nfs ip>:/srv/nfs/<serial>/boot/firmware /boot/firmware       nfs4     defaults,rw,nolock             0       1 # data to be shared to server
none            /tmp            tmpfs   defaults        0       0
none            /var/run        tmpfs   defaults        0       0
none            /var/lock       tmpfs   defaults        0       0
none            /var/tmp        tmpfs   defaults        0       0

14)Pi를 제공하기 위해 NFS 서버(google this)를 설치하십시오.

#/etc/exports
/srv/nfs/<serial> *(insecure,rw,async,no_root_squash)
exportfs -ra

15)dhcp 옵션을 제공하고 부팅 이미지를 tftp로 전송하려면 dnsmasq 서버(google이 여러분의 친구입니다)를 설치하세요.

#/etc/dnsmasq.conf
dhcp-range=<your network subnet>,proxy # e.g. 192.168.254.254,proxy
log-dhcp
enable-tftp
tftp-root=/srv/tftpboot
pxe-service=0,"Raspberry Pi Boot"
log-facility=/var/log/dnsmasq.log

16)클러스터? Pi가 두 개 이상 있나요? 서버에서 overlayfs 마운트를 사용하면 단일 기본 루트 파일 시스템을 사용하여 여러 Pi에 운영 체제를 제공한 다음 오버레이를 사용하여 각 Pi에 저장 및 FS 수정을 위한 자체 공간을 제공할 수 있습니다.

여기까지 이해했다면 다음은 쉬울 것입니다.

적절한 서버에서 - 파이가 아님

17)루트 fs를 하위 디렉토리로 사용할 수 있도록 오버레이 fs 기반 마운트에 대한 마운트를 만듭니다(google overlayfs)

#/etc/fstab
overlay /srv/nfs/6b0bb1f6 overlay defaults,lowerdir=/srv/nfs/ubuntu-rpi4-lower,upperdir=/srv/nfs/6b0bb1f6-upper,workdir=/srv/nfs/6b0bb1f6-work,nfs_export=on,index=on 0 0
overlay /srv/nfs/68e71308 overlay defaults,lowerdir=/srv/nfs/ubuntu-rpi4-lower,upperdir=/srv/nfs/68e71308-upper,workdir=/srv/nfs/68e71308-work,nfs_export=on,index=on 0 0

18)오버레이를 지원하기 위해 FS 시스템을 만듭니다. 내 시스템은 3pi에 대해 다음과 같습니다.

# this is inside /srv/nfs
drwxr-xr-x  1 root root 4096 Sep  7 12:47 68e71308
drwxr-xr-x  3 root root 4096 Sep  7 12:47 68e71308-upper
drwxr-xr-x  3 root root 4096 Sep  7 13:25 68e71308-work
drwxr-xr-x  1 root root 4096 Sep  7 12:13 6b0bb1f6
drwxr-xr-x  2 root root 4096 Sep  7 12:13 6b0bb1f6-upper
drwxr-xr-x  4 root root 4096 Sep  7 13:25 6b0bb1f6-work
drwxr-xr-x  1 root root 4096 Sep  7 12:47 917c9833
drwxr-xr-x  2 root root 4096 Sep  7 11:49 917c9833-upper
drwxr-xr-x  2 root root 4096 Sep  7 11:34 917c9833-work
drwxr-xr-x 21 root root 4096 Sep  6 19:58 ubuntu-rpi4-lower

19)/etc/fstab마운트를 위해 병합된 폴더(상위 또는 작업 디렉토리가 아닌 일반 직렬 이름의 디렉토리)를 넣어야 합니다 . 그러면 ubuntu-rpi4-lower에서 제공하는 디렉토리가 재정의됩니다. 자세한 내용은 Google 퓨즈 또는 오버레이를 참조하세요. (도커 컨테이너가 작동하는 방식은 모르겠습니다.)

20)/srv/nfs/<serial>/boot/cmdline.txt 내의 병합된 각 폴더 안에 cmdline.txt를 생성합니다.

21)pis가 이전과 같이 사용할 수 있도록 병합된 폴더를 nfs를 통해 내보냅니다.

#/etc/exports
/srv/nfs/6b0bb1f6 *(rw,sync,no_subtree_check,no_root_squash,fsid=1)
/srv/nfs/917c9833 *(rw,sync,no_subtree_check,no_root_squash,fsid=2)
/srv/nfs/68e71308 *(rw,sync,no_subtree_check,no_root_squash,fsid=3)
exportfs -ra

22)새로운 Pi를 추가하는 것은 단지 하나의 사례일 뿐입니다.

22.0)부트로더 업데이트

22.1서버에 세 개의 빈 폴더 만들기

mkdir /srv/nfs/<serial>
mkdir /srv/nfs/<serial>-work
mkdir /srv/nfs/<serial>-upper

22.2)새로운 직렬 및 상위/작업 디렉토리에 대한 마운트 옵션을 사용하여 fstab 추가

22.3)올바른 NFS 위치로 cmdline.txt 추가

23)Uber 자동화 원하는 경우 RaspberryPi SD 카드의 initrd 내에 부트로더를 업데이트하고 해당 직렬로 웹 서버에 핑을 보내는 후크 스크립트를 생성할 수 있습니다. 그런 다음 Pi가 재부팅될 때까지 마운트를 추가합니다. 네트워크에서 부팅 중입니다. 언젠가는 그것을 제공하겠습니다.

답변2

매뉴얼 감사합니다. 몇 가지를 추가하겠습니다. 최신 버전은 firmwares커널 압축을 풀면 괜찮은 것 같습니다. (5.8 이상에서 테스트됨) vmlinuz하지만 저에게는 파일에 대한 권한 문제가 있었습니다.

또한 이것은 스냅을 엉망으로 만들고 있습니다. 어차피 반대하는 사람도 많겠지만, 필요하다면요. 당신은 추가할 수 있습니다

network inet,
network inet6,

~ 안으로/etc/apparmor.d/usr.lib.snapd.snap-confine.real

관련 정보