Inspiration from hiroom2.com. Kudos!
Foreword
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.
Prerequisites
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).
Steps
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
Local Testing
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
Remote Testing
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