Experiment with synit-pid1 as pid 1, with syndicate-server orchestrating
This commit is contained in:
parent
9441c737c1
commit
bf0fa58e1f
|
@ -1,2 +1,7 @@
|
||||||
vmlinuz-virt
|
disk.img
|
||||||
|
etc_syndicate.tar.gz
|
||||||
|
initramfs-syndicate-system
|
||||||
newroot/
|
newroot/
|
||||||
|
syndicate-server
|
||||||
|
synit-pid1
|
||||||
|
vmlinuz-virt
|
||||||
|
|
|
@ -1,12 +1,22 @@
|
||||||
all: run
|
all: run
|
||||||
|
|
||||||
|
.PHONY: syndicate-server synit-pid1
|
||||||
|
.PHONY: all run clean veryclean veryveryclean
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f initramfs-syndicate-system
|
rm -f initramfs-syndicate-system
|
||||||
|
rm -f etc_syndicate.tar.gz
|
||||||
|
|
||||||
veryclean: clean
|
veryclean: clean
|
||||||
rm -f disk.img
|
rm -f disk.img
|
||||||
|
rm -f syndicate-server synit-pid1
|
||||||
|
|
||||||
|
veryveryclean: veryclean
|
||||||
|
sudo rm -rf newroot
|
||||||
|
|
||||||
ALPINE_VERSION=v3.14
|
ALPINE_VERSION=v3.14
|
||||||
|
SYNDICATE_RS=~/src/syndicate-rs
|
||||||
|
SYNIT_PID1=$(CURDIR)/../../synit-pid1
|
||||||
|
|
||||||
# vmlinuz-lts:
|
# vmlinuz-lts:
|
||||||
# wget http://dl-cdn.alpinelinux.org/alpine/$(ALPINE_VERSION)/releases/aarch64/netboot/vmlinuz-lts
|
# wget http://dl-cdn.alpinelinux.org/alpine/$(ALPINE_VERSION)/releases/aarch64/netboot/vmlinuz-lts
|
||||||
|
@ -16,9 +26,20 @@ ALPINE_VERSION=v3.14
|
||||||
disk.img:
|
disk.img:
|
||||||
qemu-img create -f qcow2 $@ 8G
|
qemu-img create -f qcow2 $@ 8G
|
||||||
|
|
||||||
initramfs-syndicate-system: pack-image.sh init.sh package-list
|
initramfs-syndicate-system: pack-image.sh init.sh package-list syndicate-server synit-pid1 etc_syndicate.tar.gz
|
||||||
sudo PACKAGES="$$(cat package-list)" ./pack-image.sh
|
sudo PACKAGES="$$(cat package-list)" ./pack-image.sh
|
||||||
|
|
||||||
|
etc_syndicate.tar.gz: etc_syndicate/*
|
||||||
|
tar -zcvf $@ etc_syndicate/*
|
||||||
|
|
||||||
|
syndicate-server:
|
||||||
|
$(MAKE) -C $(SYNDICATE_RS) aarch64-binary-release
|
||||||
|
rsync -av $(SYNDICATE_RS)/target/aarch64-unknown-linux-musl/release/syndicate-server .
|
||||||
|
|
||||||
|
synit-pid1:
|
||||||
|
$(MAKE) -C $(SYNIT_PID1) aarch64-binary-release
|
||||||
|
rsync -av $(SYNIT_PID1)/target/aarch64-unknown-linux-musl/release/synit-pid1 .
|
||||||
|
|
||||||
# See https://superuser.com/questions/1397991/running-alpine-linux-on-qemu-arm-guests
|
# See https://superuser.com/questions/1397991/running-alpine-linux-on-qemu-arm-guests
|
||||||
run: initramfs-syndicate-system disk.img
|
run: initramfs-syndicate-system disk.img
|
||||||
qemu-system-aarch64 \
|
qemu-system-aarch64 \
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
<require-service <config-watcher "/run/etc/syndicate">>
|
||||||
|
<require-service <config-watcher "/usr/local/etc/syndicate">>
|
|
@ -0,0 +1,2 @@
|
||||||
|
<require-service <daemon getty-console>>
|
||||||
|
<daemon getty-console "getty 115200 /dev/ttyAMA0">
|
|
@ -0,0 +1,11 @@
|
||||||
|
<depends-on <milestone core> <service-running <milestone network>>>
|
||||||
|
|
||||||
|
<depends-on <milestone network> <service-running <daemon interfaces>>>
|
||||||
|
<service-milestone <daemon interfaces> boot>
|
||||||
|
<daemon interfaces "ifconfig lo 127.0.0.1 up">
|
||||||
|
<daemon interfaces "ifconfig eth0 up">
|
||||||
|
|
||||||
|
<depends-on <milestone network> <service-running <daemon udhcpc>>>
|
||||||
|
<service-milestone <daemon udhcpc> boot>
|
||||||
|
<depends-on <daemon udhcpc> <service-running <daemon interfaces>>>
|
||||||
|
<daemon udhcpc "udhcpc -i eth0 -fR">
|
|
@ -0,0 +1,3 @@
|
||||||
|
<require-service <daemon core-packages>>
|
||||||
|
<depends-on <daemon core-packages> <service-running <milestone network>>>
|
||||||
|
<daemon core-packages "apk add $(cat /package-list)">
|
|
@ -0,0 +1,10 @@
|
||||||
|
<require-service <daemon sshd>>
|
||||||
|
|
||||||
|
<depends-on <daemon sshd> <service-running <daemon ssh-host-keys>>>
|
||||||
|
<depends-on <daemon sshd> <service-running <daemon <install openssh>>>>
|
||||||
|
<daemon sshd "/usr/sbin/sshd -D">
|
||||||
|
|
||||||
|
<depends-on <daemon ssh-host-keys> <service-running <daemon <install openssh>>>>
|
||||||
|
<daemon ssh-host-keys "ssh-keygen -A">
|
||||||
|
|
||||||
|
<daemon <install openssh> "apk add openssh">
|
|
@ -33,14 +33,7 @@ then
|
||||||
modprobe virtio_blk
|
modprobe virtio_blk
|
||||||
|
|
||||||
echo "Loading btrfs."
|
echo "Loading btrfs."
|
||||||
modprobe btrfs &
|
modprobe btrfs
|
||||||
|
|
||||||
echo "Configuring network."
|
|
||||||
ifconfig lo 127.0.0.1 up
|
|
||||||
ifconfig eth0 up
|
|
||||||
udhcpc -i eth0 &
|
|
||||||
|
|
||||||
wait
|
|
||||||
|
|
||||||
echo "Attempting to mount ${ROOTDEV} on ${NEWROOT} ..."
|
echo "Attempting to mount ${ROOTDEV} on ${NEWROOT} ..."
|
||||||
if mount ${ROOTDEV} ${NEWROOT}
|
if mount ${ROOTDEV} ${NEWROOT}
|
||||||
|
@ -48,13 +41,25 @@ then
|
||||||
echo "Mount successful."
|
echo "Mount successful."
|
||||||
else
|
else
|
||||||
echo "Mount unsuccessful. Building new root."
|
echo "Mount unsuccessful. Building new root."
|
||||||
mkfs.btrfs ${ROOTDEV}
|
(
|
||||||
mount ${ROOTDEV} ${NEWROOT}
|
mkfs.btrfs ${ROOTDEV}
|
||||||
|
mount ${ROOTDEV} ${NEWROOT}
|
||||||
|
) &
|
||||||
|
|
||||||
|
echo "Configuring network."
|
||||||
|
(
|
||||||
|
ifconfig lo 127.0.0.1 up
|
||||||
|
ifconfig eth0 up
|
||||||
|
udhcpc -i eth0
|
||||||
|
) &
|
||||||
|
|
||||||
|
wait
|
||||||
|
|
||||||
apk --repositories-file /etc/apk/repositories -U --allow-untrusted \
|
apk --repositories-file /etc/apk/repositories -U --allow-untrusted \
|
||||||
--root ${NEWROOT} --initdb add $(cat /package-list)
|
--root ${NEWROOT} --initdb add $(cat /package-list)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for f in /etc/apk/repositories /init /package-list /usr/bin/syndicate-server
|
for f in /etc/apk/repositories /init /package-list /sbin/syndicate-server /sbin/synit-pid1
|
||||||
do
|
do
|
||||||
echo "Updating $f."
|
echo "Updating $f."
|
||||||
cp -a $f ${NEWROOT}$f
|
cp -a $f ${NEWROOT}$f
|
||||||
|
@ -67,6 +72,12 @@ then
|
||||||
mount -o move $mp ${NEWROOT}$mp
|
mount -o move $mp ${NEWROOT}$mp
|
||||||
done
|
done
|
||||||
|
|
||||||
|
echo "Setting up syndicate configuration."
|
||||||
|
rm -rf ${NEWROOT}/etc/syndicate
|
||||||
|
(cd ${NEWROOT} && tar -zxvf /etc_syndicate.tar.gz && mv etc_syndicate ${NEWROOT}/etc/syndicate)
|
||||||
|
mkdir -p ${NEWROOT}/run/etc/syndicate
|
||||||
|
mkdir -p ${NEWROOT}/usr/local/etc/syndicate
|
||||||
|
|
||||||
echo "Killing leftovers."
|
echo "Killing leftovers."
|
||||||
kill -15 -1
|
kill -15 -1
|
||||||
sleep 0.2
|
sleep 0.2
|
||||||
|
@ -76,19 +87,11 @@ then
|
||||||
exec switch_root -c ${CONSOLE} ${NEWROOT} /init
|
exec switch_root -c ${CONSOLE} ${NEWROOT} /init
|
||||||
else
|
else
|
||||||
echo "Initializing with real rootfs."
|
echo "Initializing with real rootfs."
|
||||||
|
|
||||||
echo "Re-configuring network."
|
|
||||||
ifconfig lo 127.0.0.1 up
|
|
||||||
ifconfig eth0 up
|
|
||||||
udhcpc -i eth0
|
|
||||||
|
|
||||||
echo "Ensuring installation of /package-list."
|
|
||||||
apk add $(cat /package-list)
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sync
|
sync
|
||||||
|
|
||||||
echo "Dropping to shell."
|
# # setsid creates a "session", which allows job control to work
|
||||||
|
# exec setsid sh -c "exec sh -i <${CONSOLE} >${CONSOLE} 2>&1"
|
||||||
|
|
||||||
# setsid creates a "session", which allows job control to work
|
RUST_LOG=trace exec /sbin/synit-pid1
|
||||||
exec setsid sh -c "exec sh -i <${CONSOLE} >${CONSOLE} 2>&1"
|
|
||||||
|
|
|
@ -11,8 +11,8 @@ set -xe
|
||||||
|
|
||||||
INITRAMFS=${INITRAMFS:-initramfs-syndicate-system}
|
INITRAMFS=${INITRAMFS:-initramfs-syndicate-system}
|
||||||
NATIVE_COMMANDS=${NATIVE_COMMANDS:-no}
|
NATIVE_COMMANDS=${NATIVE_COMMANDS:-no}
|
||||||
DOCKER_ARCH=${DOCKER_ARCH:-aarch64}
|
DOCKER_PLATFORM=${DOCKER_PLATFORM:-linux/arm64}
|
||||||
ALPINE_VERSION=${ALPINE_VERSION:-v3.14}
|
ALPINE_VERSION=${ALPINE_VERSION:-3.14}
|
||||||
VERSION=${VERSION:-0.1.0}
|
VERSION=${VERSION:-0.1.0}
|
||||||
MOUNTPOINT=${MOUNTPOINT:-`pwd`/newroot}
|
MOUNTPOINT=${MOUNTPOINT:-`pwd`/newroot}
|
||||||
|
|
||||||
|
@ -33,6 +33,8 @@ die_if_empty () {
|
||||||
die_if_empty PACKAGES "$PACKAGES"
|
die_if_empty PACKAGES "$PACKAGES"
|
||||||
die_if_empty VERSION "$VERSION"
|
die_if_empty VERSION "$VERSION"
|
||||||
|
|
||||||
|
docker pull --platform ${DOCKER_PLATFORM} alpine:${ALPINE_VERSION}
|
||||||
|
|
||||||
invoke_command () {
|
invoke_command () {
|
||||||
# Shell quoting is a nightmare. Beware spaces.
|
# Shell quoting is a nightmare. Beware spaces.
|
||||||
#
|
#
|
||||||
|
@ -44,7 +46,8 @@ invoke_command () {
|
||||||
echo "$@" > $tmpscript
|
echo "$@" > $tmpscript
|
||||||
docker run -it --rm -v `pwd`:`pwd` \
|
docker run -it --rm -v `pwd`:`pwd` \
|
||||||
${DOCKER_PROXY_ARGS} \
|
${DOCKER_PROXY_ARGS} \
|
||||||
multiarch/alpine:${DOCKER_ARCH}-${ALPINE_VERSION} \
|
--platform ${DOCKER_PLATFORM} \
|
||||||
|
alpine:${ALPINE_VERSION} \
|
||||||
/bin/sh -c "cd `pwd`; sh $tmpscript"
|
/bin/sh -c "cd `pwd`; sh $tmpscript"
|
||||||
rm -f $tmpscript
|
rm -f $tmpscript
|
||||||
fi
|
fi
|
||||||
|
@ -63,8 +66,8 @@ trap cleanup 0
|
||||||
|
|
||||||
cat < /dev/null > ${TMP_REPO_FILE}
|
cat < /dev/null > ${TMP_REPO_FILE}
|
||||||
echo "`pwd`/apks/target/packages" >> ${TMP_REPO_FILE}
|
echo "`pwd`/apks/target/packages" >> ${TMP_REPO_FILE}
|
||||||
echo "https://dl-cdn.alpinelinux.org/alpine/${ALPINE_VERSION}/main" >> ${TMP_REPO_FILE}
|
echo "https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/main" >> ${TMP_REPO_FILE}
|
||||||
echo "https://dl-cdn.alpinelinux.org/alpine/${ALPINE_VERSION}/community" >> ${TMP_REPO_FILE}
|
echo "https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/community" >> ${TMP_REPO_FILE}
|
||||||
|
|
||||||
# Create root file system.
|
# Create root file system.
|
||||||
#
|
#
|
||||||
|
@ -90,11 +93,13 @@ BUILT_TIMESTAMP=$(date +%s)
|
||||||
COMMIT=$(git rev-parse HEAD)
|
COMMIT=$(git rev-parse HEAD)
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cp -a syndicate-server ${MOUNTPOINT}/usr/bin/.
|
cp -a syndicate-server ${MOUNTPOINT}/sbin/.
|
||||||
|
cp -a synit-pid1 ${MOUNTPOINT}/sbin/.
|
||||||
|
cp -a etc_syndicate.tar.gz ${MOUNTPOINT}/.
|
||||||
|
|
||||||
cat > ${MOUNTPOINT}/etc/apk/repositories <<EOF
|
cat > ${MOUNTPOINT}/etc/apk/repositories <<EOF
|
||||||
https://dl-cdn.alpinelinux.org/alpine/${ALPINE_VERSION}/main
|
https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/main
|
||||||
https://dl-cdn.alpinelinux.org/alpine/${ALPINE_VERSION}/community
|
https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/community
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cp package-list ${MOUNTPOINT}/package-list
|
cp package-list ${MOUNTPOINT}/package-list
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
- set hostname
|
||||||
|
- fsck -A
|
||||||
|
- mount of the /proc-like things
|
||||||
|
- mount -a
|
||||||
|
- dhcp
|
||||||
|
- modprobes
|
||||||
|
- getty
|
||||||
|
- ssh-keygen
|
||||||
|
- sshd
|
||||||
|
- check for updates
|
|
@ -114,3 +114,12 @@ source of inspiration, but I want to know more..."
|
||||||
> 15:03:25 < okeuday> tonyg: OTP behaviors were attributed to Lennart
|
> 15:03:25 < okeuday> tonyg: OTP behaviors were attributed to Lennart
|
||||||
> Öhman (working at Sjöland & Thyselius Telecom AB) in the past, but
|
> Öhman (working at Sjöland & Thyselius Telecom AB) in the past, but
|
||||||
> there are likely more details involved
|
> there are likely more details involved
|
||||||
|
|
||||||
|
Restart policies and lifecycles: daemontools-encore and nosh both use
|
||||||
|
|
||||||
|
stopped, starting, started, running, failed, and stopping.
|
||||||
|
|
||||||
|
(https://unix.stackexchange.com/questions/271413/is-there-a-retry-count-setting-for-svscan)
|
||||||
|
|
||||||
|
Daemontools just always restarts `./run` (after pausing 1 second). s6
|
||||||
|
is similar, but runs `./finish` if it exists, before restarting.
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
---
|
||||||
|
|
||||||
|
https://grahamc.com/blog/erase-your-darlings
|
|
@ -1,8 +0,0 @@
|
||||||
all: schema-bundle.bin
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f schema-bundle.bin
|
|
||||||
|
|
||||||
schema-bundle.bin: schemas/*.prs
|
|
||||||
preserves-schemac schemas/*.prs > $@.tmp
|
|
||||||
mv $@.tmp $@
|
|
|
@ -1 +1,2 @@
|
||||||
|
localdev/
|
||||||
target/
|
target/
|
||||||
|
|
|
@ -590,9 +590,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "preserves"
|
name = "preserves"
|
||||||
version = "0.20.0"
|
version = "2.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ca71b439b659a3fa05449daa8ac227389ae9c519a288f63d3e584a6ca6106c2f"
|
checksum = "cb9b4e6da51a363e60d03c2e5a2c6fd2cc501f52415c72779fd2238f28c95fc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"dtoa",
|
"dtoa",
|
||||||
|
@ -604,9 +604,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "preserves-schema"
|
name = "preserves-schema"
|
||||||
version = "0.8.0"
|
version = "2.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "38b4241a53a227d239226114962024c04568504c75953d1ff74be6b8dacc4af7"
|
checksum = "b7fa4b81122d3bf688629f1b9c97af5061b6a1410eb805f69a836bdd1095b8ed"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"convert_case",
|
"convert_case",
|
||||||
"glob",
|
"glob",
|
||||||
|
@ -841,14 +841,13 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syndicate"
|
name = "syndicate"
|
||||||
version = "0.10.0"
|
version = "0.12.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5a07595147fa698bc920d9e13a88c33dd7b0cb701560d44ac94b41b7faaee6aa"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"futures",
|
"futures",
|
||||||
"getrandom",
|
"getrandom",
|
||||||
"hmac",
|
"hmac",
|
||||||
|
"lazy_static",
|
||||||
"preserves",
|
"preserves",
|
||||||
"preserves-schema",
|
"preserves-schema",
|
||||||
"sha2",
|
"sha2",
|
||||||
|
@ -861,9 +860,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syndicate-macros"
|
name = "syndicate-macros"
|
||||||
version = "0.5.0"
|
version = "0.7.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c6d9fc2bfa1af6581b041e91d4c3d65ee6e6f0a0f9d78c7c38e930d66296e459"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
|
@ -9,13 +9,19 @@ homepage = "https://syndicate-lang.org/synit/"
|
||||||
repository = "https://git.syndicate-lang.org/syndicate-lang/syndicate-system"
|
repository = "https://git.syndicate-lang.org/syndicate-lang/syndicate-system"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
|
||||||
# [patch.crates-io]
|
[patch.crates-io]
|
||||||
# syndicate = { path = "/home/tonyg/src/syndicate-rs/syndicate" }
|
#
|
||||||
# syndicate-macros = { path = "/home/tonyg/src/syndicate-rs/syndicate-macros" }
|
# Use a bind mount for localdev:
|
||||||
|
#
|
||||||
|
# mkdir localdev
|
||||||
|
# sudo mount --bind /home/tonyg/src localdev
|
||||||
|
#
|
||||||
|
syndicate = { path = "localdev/syndicate-rs/syndicate" }
|
||||||
|
syndicate-macros = { path = "localdev/syndicate-rs/syndicate-macros" }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
syndicate = "0.10.0"
|
syndicate = "0.12.0"
|
||||||
syndicate-macros = "0.5.0"
|
syndicate-macros = "0.7.0"
|
||||||
|
|
||||||
clap = "3.0.0-beta.2"
|
clap = "3.0.0-beta.2"
|
||||||
clap_generate = "3.0.0-beta.2"
|
clap_generate = "3.0.0-beta.2"
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
all:
|
||||||
|
cargo build --all-targets
|
||||||
|
|
||||||
|
aarch64-binary: aarch64-binary-release
|
||||||
|
|
||||||
|
aarch64-binary-release:
|
||||||
|
cross build --target=aarch64-unknown-linux-musl --release --all-targets
|
|
@ -0,0 +1 @@
|
||||||
|
nightly
|
|
@ -100,10 +100,8 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
let server = process::Command::new(&config.server_path)
|
let server = process::Command::new(&config.server_path)
|
||||||
.arg("--inferior")
|
.arg("--inferior")
|
||||||
.arg("--port")
|
.arg("--config")
|
||||||
.arg("1")
|
.arg("/etc/syndicate")
|
||||||
.arg("--socket")
|
|
||||||
.arg("/run/ds")
|
|
||||||
.stdin(std::process::Stdio::piped())
|
.stdin(std::process::Stdio::piped())
|
||||||
.stdout(std::process::Stdio::piped())
|
.stdout(std::process::Stdio::piped())
|
||||||
// .stderr(std::process::Stdio::null())
|
// .stderr(std::process::Stdio::null())
|
||||||
|
|
Loading…
Reference in New Issue