Raspberry Pi – Festplattenloser Cluster mit Ubuntu 20.04.1

Raspberry Pi – Festplattenloser Cluster mit Ubuntu 20.04.1

Ich versuche, Ubuntu 20.04 auf einem Raspberry PI ohne Festplatte zu booten, damit ich Ubuntu auf einem Cluster ausführen kann.

Bisher habe ich die Bilder von der Boot-Partition auf einem installierten RPi4b mit Ubuntu in einen DNSMASQ/TFTP-Server verschoben, was /srv/tftpboot/<serial>/die Standardeinstellung für einen Raspberry Pi ist. Ich habe den Bootloader aktualisiert und den PI zum Booten gebracht.

Das dnsmasq-Protokoll zeigt die Dateien, die beim Booten geladen werden:

/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

Normalerweise würden Sie einen NFS-Server verwenden und Ihre cmdline.txt aktualisieren, sodass sie die Speicherorte des Root-FS enthält, sodass Sie nach dem Laden des Initrd ein im Netzwerk gespeichertes Root-FS verwenden können.

Ich kann nicht viele Informationen zu den für Ubuntu erforderlichen Optionen finden, daher habe ich sie direkt aus den Kernel-Dokumenten unter folgender Adresse übernommen:https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt

Daher habe ich meine cmdline.txt auf dem TFTP-Server wie folgt aktualisiert:

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

Ich bin nur bis zur U-Boot-Konsole gekommen. Das vmlinuz-Image wurde nicht geladen, also habe ich mein vmlinuz-5.4.0-1016-raspi auf meinem installierten Pi, der von der SD-Karte läuft, in vmlinux dekomprimiert:

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

und habe dies in den TFTP-Server eingefügt und dann meine config.txt im Abschnitt [all] aktualisiert, um das dekomprimierte Bild zu verwenden.

config.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

Ich habe es bis zum Laden des Initrd geschafft, aber die NFS-Mount-Skripte mounten die NFS-Freigabe nicht …

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

Extrahieren des initrd:

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

und ein Blick in das NFS-Skript:

# 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
}

Der NFS-Server wurde nicht angegriffen tcpdump port nfsund es wurde auch das Debug-Protokoll hinzugefügt:

/etc/default/nfs-kernel-server

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

Es scheint, dass der an das NFS-Stammverzeichnis übergebene Pfad falsch ist. Das ist jetzt ein wenig verwirrend.

Die Handhabung für nfsroot= bei einer Basis-Image-Installation

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

Wenn Sie die Installation von einer installierten SD-Karte übernehmen, nachdem Sie ein Apt-Update durchgeführt haben:

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

Das waren 5 Stunden, in denen ich mir die Haare gerauft habe.

Sie können (oder zumindest ich konnte) aus den von Ubuntu für Raspberry PI bereitgestellten Images kein bootfähiges NFS-installiertes System erstellen. Das muss man sich mal vorstellen! Wenn Sie es versuchen, werden Sie alle möglichen Fehlermeldungen über nicht startende Dienste erhalten.

Also beantworte ich meine eigene Frage.

Antwort1

Erstellen Sie ein vollständig festplattenloses System unter Ubuntu 20.04.1 auf einem Raspberry PI 4b

1)Installieren Sie einen RaspberryPi Lite auf einer SD-Karte

2)Booten Sie den Rpi4 mit der Raspberry OS SD-Karte, melden Sie sich an und führen Sie Folgendes aus, um SSH zu aktivieren:

cd /boot
touch ssh
reboot

3)Aktualisieren Sie den Bootloader von einem anderen Computer aus. Wenn Sie die IP-Adresse des PI kennen und SSH aktiviert haben (siehe oben), setzt dieses Skript den Bootcode auf 0xf12, was bedeutet, dass es das Netzwerk, die SD-Karte und den Neustart in dieser Reihenfolge immer wieder versucht. Sie sollten die Firmware-Version überprüfen, wenn dieser Beitrag veraltet ist. Außerdem erhalten Sie eine Env-Datei mit der Serien- und Mac-Adresse, die praktischerweise in einer <uuid>.rpi.envDatei gespeichert ist

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

z.B

./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

Ihr Pi wurde jetzt neu gestartet und pingt Ihr Netzwerk an, um die DHCP-Antwort abzurufen.

4)Installieren Sie Ubuntu 20.04.1 mit dem PI Imager auf der SD-Karte

5)Stecken Sie die SD-Karte in Ihren Pi und starten Sie ihn

6)Machen Sie eine

apt update -y; apt upgrade -y

Richten Sie Ihren Pass ein, installieren Sie einige Pakete und fügen Sie Vim dort hinzu (natürlich, wer verwendet schon Emacs oder Nano??)

7)schalte den Pi ab

halt -p

Auf Ihrem Server

8)Nehmen Sie die mit Ubuntu 20.04.1 installierte SD-Karte, stecken Sie sie in Ihren Server, mounten Sie das Laufwerk, kopieren Sie die Betriebssystemdateien von Partition 2 an Ihren NFS-Speicherort, um das Stammverzeichnis für den PI freizugeben, wahrscheinlich /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)Hängen Sie den Startordner der Rpi-Dateien (gespeichert in der NFS-Freigabe) an Ihren TFTP-Speicherort ein, damit Ihr TFTP die Startdateien bereitstellen kann. Ich verwende hier einen PI, um die anderen PIs bereitzustellen, bearbeiten Sie ihn also nach Bedarf.)

#/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

Mounten Sie dann den neuen Standort

mount -a

10)Extrahieren Sie Ihr vmlinuz im Boot-Ordner Ihrer NFS-Freigabe in vmlinux, da der Pi den vmlinuz-Kernel nicht dekomprimiert

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

11)Erstellen Sie symbolische Links innerhalb der Partition /srv/nfs/<serial>/boot, um auf die Dateien bcm2711-rpi-4-b.dtb, start4.elf und fixup4.dat zu verweisen, die im Boot-Ordner fehlen, damit TFTP sie in den Ordnern dtb und Firmware finden kann.

Optional: Entfernen Sie den gesamten Müll, der nicht mehr benötigt wird. Sehen Sie sich meine ls -alAusgabe an, um zu sehen, was da sein sollte und was ich entfernt habe.

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)Aktualisieren Sie einige Konfigurationen in der /srv/nfs/<serial>/bootPartition

#/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)Aktualisieren Sie die fstab - dies ist die fstab, die an den Pi gesendet wird

#/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)Installieren Sie einen NFS-Server (googlen Sie dies), um den Pi zu bedienen

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

15)Installieren Sie einen DNSMASQ-Server (Google ist Ihr Freund), um die DHCP-Optionen bereitzustellen und die Boot-Images per TFTP zu übertragen.

#/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)Cluster? Sie haben mehr als einen Pi? Sie können eine Overlayfs-Einbindung auf Ihrem Server verwenden, um mehreren Pis ihr Betriebssystem über ein einzelnes Basis-Root-Dateisystem bereitzustellen und dann mithilfe von Overlays jedem Pi seinen eigenen Speicherplatz für Speicher- und FS-Änderungen zu geben.

Wenn Sie es bis hierhin geschafft haben, sollte das Folgende einfach sein:

Auf Ihrem richtigen Server - nicht auf einem Pi

17)Erstellen Sie Mounts für Overlay-FS-basierte Mounts, damit wir das Stamm-FS als unteres Verzeichnis verwenden können (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)Erstellen Sie das FS-System zur Unterstützung der Overlays, meines sieht für 3 Pis so aus.

# 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)Sie müssen eins /etc/fstabin den zusammengeführten Ordner für die Bereitstellung einfügen (nicht in die oberen oder Arbeitsverzeichnisse, nur in das mit dem einfachen Seriennamen), wodurch die von ubuntu-rpi4-lower bereitgestellten Ordner überschrieben werden. Weitere Informationen finden Sie bei Google unter fusefs oder overlayfs (so funktionieren Docker-Container, wissen Sie das nicht?)

20)Erstellen Sie eine cmdline.txt in jedem zusammengeführten Ordner in /srv/nfs/<serial>/boot/cmdline.txt

21)Exportieren Sie die zusammengeführten Ordner über NFS, damit unsere PIS sie wie zuvor verwenden können:

#/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)Das Hinzufügen eines neuen Pi ist dann nur noch ein Fall:

22,0)Aktualisieren Sie den Bootloader

22.1Erstellen von drei leeren Ordnern auf dem Server

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

22.2)Hinzufügen einer fstab mit den Mount-Optionen für die neuen seriellen und oberen/Arbeitsverzeichnisse

22.3)Hinzufügen einer cmdline.txt mit dem richtigen NFS-Speicherort

23)Über Automatisierung Wenn Sie möchten, können Sie ein Hook-Skript im initrd Ihrer RaspberryPi-SD-Karte erstellen, das den Bootloader für Sie aktualisiert und einen Webserver mit seiner Seriennummer anpingt, der dann die Mounts hinzufügt, wenn der Pi sich selbst neu gestartet hat, da er bereits über das Netzwerk bootet. Ich werde das irgendwann bereitstellen.

Antwort2

Vielen Dank für das Handbuch. Ich würde noch ein paar Dinge hinzufügen. Neuere firmwaresscheinen mit dem Dekomprimieren des Kernels kein Problem zu haben. (getestet auf 5.8 und höher) Ich hatte vmlinuzallerdings Probleme mit den Berechtigungen für die Datei.

Außerdem bringt das Snap durcheinander. Ich schätze, es gibt sowieso viele Leute, die dagegen sind, aber wenn Sie es brauchen würden. Sie können hinzufügen

network inet,
network inet6,

hinein/etc/apparmor.d/usr.lib.snapd.snap-confine.real

verwandte Informationen