annotate pi-setup/setup_pi.py @ 313:b3acb9fff274

updates for new ga-iot (pi reformat of host=garage)
author drewp@bigasterisk.com
date Mon, 23 Sep 2024 00:32:36 -0700
parents 957eb07e06e6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
279
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
1 import asyncio
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
2 import logging
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
3 import re
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
4 import sys
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
5 import time
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
6 from pathlib import Path
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
7 from functools import wraps
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
8 from runner import get_output, iscsi_login, mount, run, sshfs
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
9
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
10 logging.basicConfig(level=logging.INFO, format='%(asctime)s.%(msecs)03d %(levelname)s %(filename) 12s:%(lineno)d %(message)s', datefmt='%H:%M:%S')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
11 log = logging.getLogger()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
12
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
13 WORK = Path('/tmp/pi-setup')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
14 LITE_PREFIX = '2024-03-15-raspios-bookworm'
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
15
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
16 # These come from fdisk -l on the img:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
17 IMG_BOOT_OFFSET = 512 * 8192
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
18 IMG_ROOT_OFFSET = 512 * 1056768
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
19
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
20 TFTP_SPEC = 'root@pipe:/opt/dnsmasq/tftp/'
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
21
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
22
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
23 def step(func):
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
24 name = func.__name__
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
25
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
26 @wraps(func)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
27 async def wrapper(*a, **kw):
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
28 print("", file=sys.stderr)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
29 log.info(f'👣 step {name}')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
30 t1 = time.time()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
31 ret = await func(*a, **kw)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
32 dt = time.time() - t1
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
33 log.info(f' -> step {name} took {dt:3} seconds')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
34 return ret
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
35
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
36 return wrapper
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
37
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
38
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
39 @step
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
40 async def init_work_dir():
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
41 WORK.mkdir(exist_ok=True)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
42 await run(
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
43 'wget', '--continue', '--no-verbose', '-O', WORK / 'raspios.img.xz',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
44 f'https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2024-03-15/{LITE_PREFIX}-arm64-lite.img.xz'
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
45 )
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
46
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
47
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
48 @step
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
49 async def unpack_fresh_img_copy():
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
50 await run('xz', '-dkf', WORK / 'raspios.img.xz')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
51 await run('qemu-img', 'resize', ['-f', 'raw'], WORK / 'raspios.img', '4G')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
52
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
53
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
54 @step
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
55 async def extract_boot_files():
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
56 async with mount(WORK, WORK / 'raspios.img', IMG_BOOT_OFFSET) as img_boot:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
57 await run('cp', img_boot / 'bcm2710-rpi-3-b-plus.dtb', WORK)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
58 await run('cp', img_boot / 'kernel8.img', WORK)
313
b3acb9fff274 updates for new ga-iot (pi reformat of host=garage)
drewp@bigasterisk.com
parents: 281
diff changeset
59 await run('cp', img_boot / 'bootcode.bin', WORK)
279
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
60
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
61
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
62 @step
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
63 async def setup_ssh_login():
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
64 async with mount(WORK, WORK / 'raspios.img', IMG_ROOT_OFFSET) as img_root:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
65 root_pub_key = Path('/root/.ssh/id_ecdsa.pub').read_text()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
66 (img_root / 'root/.ssh/authorized_keys').write_text(root_pub_key)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
67 # (img_root / 'etc/iscsi/initiatorname.iscsi').write_text(f"InitiatorName=iqn.2024-03.com.bigasterisk:{PI_HOSTNAME}\n")
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
68
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
69 async with mount(WORK, WORK / 'raspios.img', IMG_BOOT_OFFSET) as img_boot:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
70 await run('touch', img_boot / 'ssh')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
71
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
72
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
73 @step
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
74 async def qemu():
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
75 await run(
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
76 'qemu-system-aarch64',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
77 ['-machine', 'raspi3b'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
78 ['-cpu', 'cortex-a72'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
79 ['-nographic'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
80 ['-dtb', WORK / 'bcm2710-rpi-3-b-plus.dtb'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
81 ['-m', '1G'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
82 ['-smp', '4'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
83 ['-kernel', WORK / 'kernel8.img'],
313
b3acb9fff274 updates for new ga-iot (pi reformat of host=garage)
drewp@bigasterisk.com
parents: 281
diff changeset
84 ['-drive', 'file=' + str(WORK / 'raspios.img') + ',format=raw'],
279
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
85 ['-append', "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootdelay=1"],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
86 ['-device', 'usb-net,netdev=net0'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
87 ['-netdev', 'user,id=net0,hostfwd=tcp::2222-:22'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
88 )
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
89
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
90
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
91 @step
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
92 async def setup_pi_in_emulator():
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
93 src_path = Path(__file__).parent / 'on_pi_setup.sh'
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
94 path_on_pi = '/tmp/on_pi_setup.sh'
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
95
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
96 ssh_opts = [
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
97 '-oPort=2222',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
98 '-oConnectTimeout=2',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
99 '-oBatchMode=yes',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
100 '-oNoHostAuthenticationForLocalHost=yes',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
101 ]
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
102 give_up = time.time() + 60
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
103 final_err = ValueError("timed out")
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
104 while time.time() < give_up:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
105 try:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
106 await run('scp', ssh_opts, src_path, f'root@localhost:{path_on_pi}')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
107 except ValueError as err:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
108 final_err = err
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
109 log.info('waiting for qemu to boot...')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
110 await asyncio.sleep(8)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
111 continue
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
112 break
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
113 else:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
114 raise final_err
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
115
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
116 cmd_on_pi = ['sh', path_on_pi, PI_HOSTNAME]
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
117 await run('ssh', ssh_opts, 'root@localhost', *cmd_on_pi)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
118
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
119
313
b3acb9fff274 updates for new ga-iot (pi reformat of host=garage)
drewp@bigasterisk.com
parents: 281
diff changeset
120 async def _get_iscsi_device(better_be_the_iscsi_device='sdh') -> Path:
279
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
121 # don't screw up- this device is about to get formatted!
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
122 dev_path = Path(f'/dev/{better_be_the_iscsi_device}')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
123
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
124 iscsi = await get_output('iscsiadm', '-m', 'session', '-P3')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
125 for m in re.findall(r'Attached scsi disk (\S+)', iscsi):
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
126 if f'/dev/{m}' != str(dev_path):
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
127 raise ValueError(f'surprised by attached iscsi disk {m!r} (try `iscsiadm -m node --logoutall=all`)')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
128
313
b3acb9fff274 updates for new ga-iot (pi reformat of host=garage)
drewp@bigasterisk.com
parents: 281
diff changeset
129 # the following might no longer work. check /dev/disk/by-path/*scsi* too.
279
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
130 fdisk = await get_output('fdisk', '-l', dev_path)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
131 for m in re.findall(r'Disk model: (\S+)', fdisk):
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
132 if m != 'VIRTUAL-DISK':
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
133 raise ValueError(f'surprised that {dev_path} is model {m!r} instead of "VIRTUAL-DISK"')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
134
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
135 return dev_path
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
136
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
137
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
138 @step
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
139 async def fs_to_iscsi():
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
140 async with mount(WORK, WORK / 'raspios.img', IMG_ROOT_OFFSET) as img_root:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
141 async with iscsi_login('-m', 'node', '-T', f'iqn.2024-03.com.bigasterisk:{PI_HOSTNAME}.target', '-p', '10.2.0.133'):
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
142 dev = await _get_iscsi_device()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
143 await run('mkfs.ext4', '-F', dev)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
144 async with mount(WORK, dev, 0) as iscsi_root:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
145 await run(
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
146 'rsync',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
147 '-r', # recurs
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
148 '-l', # symlinks as symlinks
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
149 '-p', # perms
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
150 '-t', # mtimes
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
151 '-g', # group
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
152 '-o', # owner
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
153 '-D', # devices + specials
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
154 '-H', # hard links
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
155 ['--exclude', '/boot'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
156 ['--exclude', '/dev'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
157 ['--exclude', '/mnt'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
158 ['--exclude', '/proc'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
159 ['--exclude', '/sys'],
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
160 str(img_root) + '/',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
161 str(iscsi_root) + '/',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
162 )
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
163 for d in [
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
164 'boot',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
165 'dev',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
166 'mnt',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
167 'proc',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
168 'sys',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
169 ]:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
170 (iscsi_root / d).mkdir()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
171 (iscsi_root / 'etc/fstab').write_text('''
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
172 proc /proc proc defaults 0 0
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
173 /dev/sda / ext4 defaults,noatime 0 1
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
174 ''')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
175 # don't open cursesui for making first user
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
176 (iscsi_root / 'etc/systemd/system/multi-user.target.wants/userconfig.service').unlink()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
177 log.info("there may be a delay here for flushing all the new files")
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
178
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
179
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
180 @step
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
181 async def setup_tftp():
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
182 async with sshfs(WORK, TFTP_SPEC) as tftp:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
183 tftp_host_dir = tftp / f'{PI_HOSTNAME}-boot'
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
184 async with mount(WORK, WORK / 'raspios.img', IMG_ROOT_OFFSET) as img_root:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
185 await run(
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
186 'rsync',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
187 '-r', # recurs
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
188 '-l', # symlinks as symlinks
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
189 '-p', # perms
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
190 #'-t', # mtimes
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
191 '-g', # group
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
192 '-o', # owner
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
193 '-D', # devices + specials
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
194 #'-H', # hard links
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
195 '--delete',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
196 str(img_root) + '/boot/',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
197 str(tftp_host_dir) + '/',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
198 )
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
199 async with mount(WORK, WORK / 'raspios.img', IMG_BOOT_OFFSET) as img_boot:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
200 await run(
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
201 'rsync',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
202 '-r', # recurs
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
203 '-l', # symlinks as symlinks
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
204 '-p', # perms
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
205 '-t', # mtimes
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
206 '-g', # group
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
207 '-o', # owner
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
208 '-D', # devices + specials
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
209 '-H', # hard links
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
210 # (no delete)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
211 str(img_boot) + '/',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
212 str(tftp_host_dir) + '/firmware/',
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
213 )
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
214 await run('ln', '-sf', f'{PI_HOSTNAME}-boot/firmware/', str(tftp / PI_SERIAL))
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
215 kernel_cmdline = [
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
216 "console=serial0,115200",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
217 "console=tty1",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
218 f"ip=::::{PI_HOSTNAME}:eth0:dhcp",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
219 "root=/dev/sda",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
220 f"ISCSI_INITIATOR=iqn.2024-03.com.bigasterisk:{PI_HOSTNAME}.initiator",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
221 f"ISCSI_TARGET_NAME=iqn.2024-03.com.bigasterisk:{PI_HOSTNAME}.target",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
222 "ISCSI_TARGET_IP=10.2.0.133",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
223 "ISCSI_TARGET_PORT=3260",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
224 "rw",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
225 "rootfstype=ext4",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
226 "fsck.repair=yes",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
227 "rootwait",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
228 "cgroup_enable=cpuset",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
229 "cgroup_memory=1",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
230 "cgroup_enable=memory",
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
231 ]
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
232 (tftp_host_dir/'firmware/cmdline.txt').write_text(' '.join(kernel_cmdline))
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
233
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
234
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
235 async def main():
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
236 global PI_HOSTNAME, PI_SERIAL
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
237
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
238 if sys.argv[1:] == ['--init']:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
239 await init_work_dir()
281
957eb07e06e6 iscsi-mount mode, for inspecting the iscsi fs
drewp@bigasterisk.com
parents: 279
diff changeset
240 elif sys.argv[1] == '--iscsi':
957eb07e06e6 iscsi-mount mode, for inspecting the iscsi fs
drewp@bigasterisk.com
parents: 279
diff changeset
241 [PI_HOSTNAME] = sys.argv[2:]
957eb07e06e6 iscsi-mount mode, for inspecting the iscsi fs
drewp@bigasterisk.com
parents: 279
diff changeset
242 async with iscsi_login('-m', 'node', '-T', f'iqn.2024-03.com.bigasterisk:{PI_HOSTNAME}.target', '-p', '10.2.0.133'):
957eb07e06e6 iscsi-mount mode, for inspecting the iscsi fs
drewp@bigasterisk.com
parents: 279
diff changeset
243 dev = await _get_iscsi_device()
957eb07e06e6 iscsi-mount mode, for inspecting the iscsi fs
drewp@bigasterisk.com
parents: 279
diff changeset
244 async with mount(WORK, dev, 0) as iscsi_root:
957eb07e06e6 iscsi-mount mode, for inspecting the iscsi fs
drewp@bigasterisk.com
parents: 279
diff changeset
245 input(f"mounted {PI_HOSTNAME}'s iscsi drive at {iscsi_root}: ")
279
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
246 else:
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
247 PI_HOSTNAME, PI_SERIAL = sys.argv[1:]
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
248 # todo: dd and add iscsi volume (handled by pyinfra)
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
249 # dd if=/dev/zero of={out} count=0 bs=1 seek=5G conv=excl || true
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
250 # edit /etc/tgt/conf.d/{pi_hostname}.conf etc
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
251
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
252 await unpack_fresh_img_copy()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
253 await extract_boot_files()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
254 await setup_ssh_login()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
255
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
256 qemu_task = asyncio.create_task(qemu())
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
257 await asyncio.sleep(20) # inital qemu startup delay
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
258 await setup_pi_in_emulator() # finishes with a poweroff
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
259 log.info('waiting for qemu to exit')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
260 await qemu_task
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
261
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
262 await fs_to_iscsi()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
263 await setup_tftp()
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
264
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
265 log.info(f'🎉 {PI_HOSTNAME} is ready for net boot')
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
266
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
267
1cb4aeec8fc6 pi_setup code to prepare a pi for netboot
drewp@bigasterisk.com
parents:
diff changeset
268 asyncio.run(main())