#!/usr/bin/env bash set -Eeuo pipefail [[ $# == 3 ]] || { echo 'usage: build-guanghu-cross-root-fixture.sh ' >&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}"