Files
fds-os/tools/make-stage0-vm
T
2026-09-21 22:29:23 +08:00

43 lines
1.8 KiB
Python
Executable File

#!/usr/bin/env python3
"""Build an isolated EROFS boot fixture using the exported s6 graph unchanged."""
import io
from pathlib import Path
import subprocess
import sys
import tarfile
project = Path(__file__).resolve().parents[1]
if len(sys.argv) != 2:
sys.exit('Usage: tools/make-stage0-vm EMPTY_WORK_DIRECTORY')
work = Path(sys.argv[1]).resolve(strict=True)
if not work.is_dir() or any(work.iterdir()):
sys.exit('ERROR: expected an existing empty work directory')
stage2 = 'etc/s6-linux-init/current/scripts/rc.init'
wrapper = (f'#!/bin/bash\nset -euo pipefail\n/{stage2}.fds-base "$@"\n'
'export FDS_TEST_ROOT_TYPE=erofs\n'
'/usr/libexec/fds/m4-guest\n'
'exec /usr/libexec/fds/m2-guest\n').encode()
found = False
with tarfile.open(project/'out/rootfs-cli.tar') as source, tarfile.open(work/'test-rootfs.tar', 'w', format=tarfile.PAX_FORMAT) as output:
for member in source:
if member.name == stage2:
member.name += '.fds-base'
found = True
output.addfile(member, source.extractfile(member) if member.isfile() else None)
if not found:
sys.exit('ERROR: native stage-2 script missing')
hook = tarfile.TarInfo(stage2)
hook.mode = 0o755
hook.size = len(wrapper)
output.addfile(hook, io.BytesIO(wrapper))
def root_owned(info):
info.uid = info.gid = 0
info.uname = info.gname = ''
return info
for name in ('m2-guest', 'm4-guest'):
output.add(project/'tests/integration'/name, arcname='usr/libexec/fds/'+name, filter=root_owned)
(work/'system').mkdir()
subprocess.run([str(project/'image/build-system-cartridge'), '--rootfs', str(work/'test-rootfs.tar'),
'--output-directory', str(work/'system')], check=True)
print(f'PASS: stage0 VM fixture created at {work}')