Mercurial > code > home > repos > infra
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 |
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()) |