{_obsidian_pattern_tag_public}
My notes for using rpi 3B+, dnsmasq, and iSCSI, all on linux (no NAS).
Other guides:
* https://warmestrobot.com/blog/2021/6/21/raspberry-pi-network-boot-guide
* https://www.server-world.info/en/note?os=Ubuntu_22.04&p=iscsi&f=2
In dnsmasq config, add this:
log=dhcp
enable-tftp
tftp-root=/opt/dnsmasq/tftp
pxe-service=0,"Raspberry Pi Boot"
dhcp-mac=set:net-booting-rpi,b8:27:eb:*:*:*
dhcp-reply-delay=tag:net-booting-rpi,2
15:01:13 dnsmasq-dhcp: vendor class: PXEClient:Arch:00000:UNDI:002001
15:01:13 dnsmasq-dhcp: DHCPDISCOVER(eth1) b8:27:eb:ab:cd:ef
15:01:13 dnsmasq-dhcp: reply delay: 2
15:01:16 dnsmasq-dhcp: tags: net-booting-rpi, eth1
15:01:16 dnsmasq-dhcp: requested options: 43:vendor-encap, 60:vendor-class, 67:bootfile-name,
15:01:16 dnsmasq-dhcp: requested options: 128, 129, 130, 131, 132, 133, 134, 135, 66:tftp-server,
15:01:16 dnsmasq-tftp: file /opt/dnsmasq/tftp/f63f14b6/start.elf not found for 10.2.0.110
15:01:16 dnsmasq-tftp: file /opt/dnsmasq/tftp/autoboot.txt not found for 10.2.0.110
...
Needs rpi 3 B+ maybe. For k8s, use Pi{3A+,3B,3B+,...} for 64-bit.
On linux desktop:
1. Get rpi-imager
(ubuntu package)
2. Insert a scratch SD card (at least 2GB)
3. sudo rpi-imager
4. OS: Raspberry Pi OS (other) -> Raspberry Pi OS Lite (64-bit)
5. Storage: (pick SD card)
6. Write.
Put SD card in pi and boot.
1. (some first-boot keys are generated, etc)
2. raspi-config
system -> hostname
that just runs
hostnamectl set-hostname "$NEW_HOSTNAME"
sed -i "s/127\.0\.1\.1.*$CURRENT_HOSTNAME/127.0.1.1\t$NEW_HOSTNAME/g" /etc/hosts
(and reboots)
Interfaces -> ssh -> yes
that just runs
ssh-keygen -A
update-rc.d ssh enableinvoke-rc.d ssh start`
vcgencmd otp_dump | grep 17:
17:1020000a
17:3020000a
My Pi3B+ already were set. Pi3B needed program_usb_boot_mode=1
appended to /boot/firmware/config.txt
then a reboot.
On linux server (this is pyinfra code):
apt-get install -y tgt
iscsi_dir = '/d2/rpi-iscsi'
out= f'{iscsi_dir}/{pi_hostname}.disk'
files.directory(path=iscsi_dir)
server.shell(f'dd if=/dev/zero of={out} count=0 bs=1 seek=5G conv=excl || true')
files.put(dest=f"/etc/tgt/conf.d/{pi_hostname}.conf", src=StringIO(f"""
<target iqn.2024-03.com.bigasterisk:{pi_hostname}.target>
backing-store {out}
initiator-name iqn.2024-03.com.bigasterisk:{pi_hostname}.initiator
</target>
"""))
systemd.service(service='tgt.service', running=True, restarted=True)
tgtadm --mode target --op show
Target 1: iqn.2024-03.com.bigasterisk:dlp.target01
System information:
Driver: iscsi
State: ready
LUN information:
LUN: 0
Type: controller
LUN: 1
Type: disk
Size: 10 MB, Block size: 512
apt-get install -y open-iscsi
Set /etc/iscsi/initiatorname.iscsi
to:
InitiatorName=iqn.2024-03.com.bigasterisk:ws-printer.initiator
systemctl restart iscsid open-iscsi
iscsiadm -m discovery -t sendtargets -p 10.2.0.133
127.0.0.1:3260,1 iqn.2024-03.com.bigasterisk:dlp.target01
...
iscsiadm -m node -o show
node.name = iqn.2024-03.com.bigasterisk:dlp.target01
node.conn[0].address = 127.0.0.1
node.conn[0].port = 3260
node.conn[0].startup = manual
iscsiadm -m node --login -p 10.2.0.133
Logging in to [iface: default, target: iqn.2024-03.com.bigasterisk:dlp.target01, portal: 127.0.0.1,3260]
Login to [iface: default, target: iqn.2024-03.com.bigasterisk:dlp.target01, portal: 127.0.0.1,3260] successful.
tcp: [1] 127.0.0.1:3260,1 iqn.2024-03.com.bigasterisk:dlp.target01 (non-flash)
cat /proc/partitions
major minor #blocks name
...
8 16 10240 sdb
All commands on pi as root:
apt-get install -y open-iscsi
(this may do the update-initramfs described below- not sure)
echo "InitiatorName=iqn.2024-03.com.bigasterisk:`hostname`" > /etc/iscsi/initiatorname.iscsi
iscsiadm -m discovery -t sendtargets -p 10.2.0.133
</div>
echo "ISCSI_INITIATOR=iqn.2024-03.com.bigasterisk:`hostname`.initiator" > /etc/iscsi/iscsi.initramfs
echo "ISCSI_TARGET_NAME=iqn.2024-03.com.bigasterisk:`hostname`.target" >> /etc/iscsi/iscsi.initramfs
echo 'ISCSI_TARGET_IP=10.2.0.133' >> /etc/iscsi/iscsi.initramfs
<div class="lang-general">
</div>
proc /proc proc defaults 0 0
/dev/sda / ext4 defaults,noatime 0 1
<div class="lang-general">