58 lines
2 KiB
Shell
Executable file
58 lines
2 KiB
Shell
Executable file
#!/usr/bin/env bash
|
|
set -Eeuo pipefail
|
|
|
|
[[ $# == 3 ]] || {
|
|
echo 'usage: build-guanghu-cross-root-fixture.sh <output-image> <config> <root-supervisor>' >&2
|
|
exit 64
|
|
}
|
|
|
|
output=$(readlink -m "$1")
|
|
config=$(readlink -f "$2")
|
|
supervisor=$(readlink -f "$3")
|
|
root_uuid=$(sed -n 's/^root_uuid=//p' "${config}")
|
|
[[ ${root_uuid} =~ ^[0-9a-f-]{36}$ ]]
|
|
[[ -x /bin/busybox && -x ${supervisor} ]]
|
|
command -v mkfs.ext4 >/dev/null
|
|
|
|
staging=$(mktemp -d)
|
|
trap 'rm -rf "${staging}"' EXIT
|
|
mkdir -p "${staging}/bin" "${staging}/sbin" "${staging}/usr/lib/guanghu" \
|
|
"${staging}/etc/guanghu" "${staging}/run" "${staging}/dev" \
|
|
"${staging}/proc" "${staging}/sys" "${staging}/lib/modules" \
|
|
"$(dirname "${output}")"
|
|
install -m 0755 /bin/busybox "${staging}/bin/busybox"
|
|
for applet in sh sleep cat grep tr stat mkdir mv chmod readlink kill sync poweroff; do
|
|
ln -s busybox "${staging}/bin/${applet}"
|
|
done
|
|
install -m 0755 "${supervisor}" "${staging}/usr/lib/guanghu/guanghu-root-supervisor"
|
|
install -m 0600 "${config}" "${staging}/etc/guanghu/first-boot-supervisor.conf"
|
|
printf '%s\n' 'guanghu.cross-root-fixture/v1' >"${staging}/etc/guanghu/rootfs.marker"
|
|
|
|
cat >"${staging}/sbin/init" <<'EOF'
|
|
#!/bin/sh
|
|
set -eu
|
|
export PATH=/bin:/sbin
|
|
echo 'GUANGHU_SWITCH_ROOT_INIT_ACTIVE marker=guanghu.cross-root-fixture/v1'
|
|
/usr/lib/guanghu/guanghu-root-supervisor run &
|
|
supervisor_pid=$!
|
|
attempt=0
|
|
while [ ! -s /run/guanghu/root-supervisor/state.json ] && [ "${attempt}" -lt 100 ]; do
|
|
sleep 0.05
|
|
attempt=$((attempt + 1))
|
|
done
|
|
kill -0 "${supervisor_pid}"
|
|
grep -Fq '"stage":"ROOT_SUPERVISOR_ACTIVE"' /run/guanghu/root-supervisor/state.json
|
|
echo "GUANGHU_CROSS_ROOT_PERSISTENCE_VERIFIED pid=${supervisor_pid}"
|
|
kill "${supervisor_pid}"
|
|
wait "${supervisor_pid}"
|
|
sync
|
|
poweroff -f
|
|
while :; do sleep 30; done
|
|
EOF
|
|
chmod 0755 "${staging}/sbin/init"
|
|
|
|
truncate -s 128M "${output}"
|
|
mkfs.ext4 -q -F -U "${root_uuid}" -L GUANGHU_XROOT -d "${staging}" "${output}"
|
|
chmod 0600 "${output}"
|
|
sha256sum "${output}" >"${output}.sha256"
|
|
printf 'GUANGHU_CROSS_ROOT_FIXTURE_BUILT output=%s root_uuid=%s\n' "${output}" "${root_uuid}"
|