Inspiration from hiroom2.com. Kudos!
These steps are meant to be completed on a Linux computer that serves as a netboot server of the MicroMEC cluster. The steps can of course be adopted for other use cases.
Our netboot server (ie. iscsi target server) is called bootserv
.
The netboot server is available on the LAN and can be pinged using the name bootserv
.
We refer to the RPi 3B+ with an id: 07f32691
and a name: rpi3-1
.
We use sudo and start the preparations in /tmp on the netboot server.
Security Note
The setup is meant for a private lab. Security considerations for exposing the rootfs via the LAN are not discussed in this how-to as of now.
A computer running Debian Linux. Any Linux flavor can be used, but our instructions refer to Debian.
15GB free space on the hard drive.
Installed packages: tgt, open-iscsi.
Fast LAN (preferably Gigabit Ethernet).
Download a ready made rootfs from the Open Build Service.
We will use openSUSE Tumbleweed on our RPi 3B+: openSUSE-Tumbleweed-ARM-JeOS.aarch64-rootfs
Extract the downloaded rootfs
$ cd /tmp
$ mkdir openSUSE_Tumbleweed
$ xz -d /tmp/openSUSE-Tumbleweed-ARM-JeOS.aarch64-rootfs.aarch64-2020.05.10-Snapshot20200526.tar.xz
$ cd openSUSE_Tumbleweed
$ tar xvf /tmp/openSUSE-Tumbleweed-ARM-JeOS.aarch64-rootfs.aarch64-2020.05.10-Snapshot20200526.tar.xz
Create a virtual loop back device that will hold the rootfs:
$ cd /tmp
$ dd if=/dev/zero of=07f32691-opensuse-rootfs.img bs=400M count=10
$ sudo mkfs.ext4 07f32691-opensuse-rootfs.img
$ sudo losetup -fP 07f32691-opensuse-rootfs.img
Check which loopback devices are allocated by the kernel:
$ losetup -a
/dev/loop0: []: (/tmp/07f32691-opensuse-rootfs.img)
Mount the virtual block device
$ mkdir 07f32691-rootfs-mount
$ sudo mount -o loop /dev/loop0 07f32691-rootfs-mount
Copy the content of an existing rootfs image to the mounted block device
$ cp -R /tmp/downloaded_rootfs/* 07f32691-rootfs-mount/
Unmount the file and move it to the place where it will be served.
$ sudo umount 07f32691-rootfs-mount
$ sudo losetup -D
$ sudo mkdir /srv/iscsi
$ sudo mv 07f32691-opensuse-rootfs.img /srv/iscsi
Prepare the iscsi target and publish it
$ sudo tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.org.micromec:rpi3-1-opensuse-rootfs
$ sudo tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /srv/iscsi/07f32691-opensuse-rootfs.img
$ sudo tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL
Note
If your iscsi server has other targets then you will need to pick a different tid.
At this point the rootfs is available on the local network.
Save the configuration on the netboot server to remain persistent
$ sudo tgt-admin --dump | sudo tee /etc/tgt/conf.d/micromec-cluster.conf
Check the iscsi target locally
Discover the iscsi target
$ sudo iscsiadm --mode discovery --op update --type sendtargets --portal localhost
127.0.0.1:3260,1 iqn.org.micromec:rpi3-1-opensuse-rootfs
Login to the iscsi target
$ sudo iscsiadm -m node --targetname iqn.org.micromec:rpi3-1-opensuse-rootfs -p localhost -l
Logging in to [iface: default, target: iqn.org.micromec:rpi3-1-opensuse-rootfs, portal: 127.0.0.1,3260] (multiple)
Login to [iface: default, target: iqn.org.micromec:rpi3-1-opensuse-rootfs, portal: 127.0.0.1,3260] successful.
Check if a new partition appears in the list:
$ cat /proc/partitions
major minor #blocks name
.....
8 32 4096000 sdc
Mount the partition to a mount point
$ mkdir /tmp/test-rootfs
$ sudo mount /dev/sdc /tmp/test-rootfs
$ ls -alrt /tmp/test-rootfs
Umount the partition
$ sudo umount /tmp/test-rootfs
Logout from all iscsi targets
$ sudo iscsiadm -m node -U all
Check the iscsi target remotely
Login to an other Linux computer which also has the open-iscsi tools installed.
Discover the iscsi target
$ sudo iscsiadm --mode discovery --op update --type sendtargets --portal bootserv
192.168.4.1:3260,1 iqn.org.micromec:rpi3-1-opensuse-rootfs
Login to the iscsi target
$ sudo iscsiadm -m node --targetname iqn.org.micromec:rpi3-1-opensuse-rootfs -p bootserv -l
Logging in to [iface: default, target: iqn.org.micromec:rpi3-1-opensuse-rootfs, portal: 192.168.4.1,3260]
Login to [iface: default, target: iqn.org.micromec:rpi3-1-opensuse-rootfs, portal: 192.168.4.1,3260] successful.
Check the available partitions
$ cat /proc/partitions
major minor #blocks name
.....
8 16 4096000 sdb
Mount the partition to a mount point
$ mkdir /tmp/test-rootfs
$ sudo mount /dev/sdb /tmp/test-rootfs
$ ls -alrt /tmp/test-rootfs
Umount the partition
$ sudo umount /tmp/test-rootfs
Logout from all iscsi targets
$ sudo iscsiadm -m node -U all