diff --git a/experiments/alpine-standalone/.gitignore b/experiments/alpine-standalone/.gitignore index 075442d..b0e1b71 100644 --- a/experiments/alpine-standalone/.gitignore +++ b/experiments/alpine-standalone/.gitignore @@ -1,2 +1,7 @@ -vmlinuz-virt +disk.img +etc_syndicate.tar.gz +initramfs-syndicate-system newroot/ +syndicate-server +synit-pid1 +vmlinuz-virt diff --git a/experiments/alpine-standalone/Makefile b/experiments/alpine-standalone/Makefile index 2d85657..f8c19bd 100644 --- a/experiments/alpine-standalone/Makefile +++ b/experiments/alpine-standalone/Makefile @@ -1,12 +1,22 @@ all: run +.PHONY: syndicate-server synit-pid1 +.PHONY: all run clean veryclean veryveryclean + clean: rm -f initramfs-syndicate-system + rm -f etc_syndicate.tar.gz veryclean: clean rm -f disk.img + rm -f syndicate-server synit-pid1 + +veryveryclean: veryclean + sudo rm -rf newroot ALPINE_VERSION=v3.14 +SYNDICATE_RS=~/src/syndicate-rs +SYNIT_PID1=$(CURDIR)/../../synit-pid1 # 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: 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 +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 run: initramfs-syndicate-system disk.img qemu-system-aarch64 \ diff --git a/experiments/alpine-standalone/etc_syndicate/configdirs.pr b/experiments/alpine-standalone/etc_syndicate/configdirs.pr new file mode 100644 index 0000000..90f19b7 --- /dev/null +++ b/experiments/alpine-standalone/etc_syndicate/configdirs.pr @@ -0,0 +1,2 @@ +> +> diff --git a/experiments/alpine-standalone/etc_syndicate/getty.pr b/experiments/alpine-standalone/etc_syndicate/getty.pr new file mode 100644 index 0000000..29301fa --- /dev/null +++ b/experiments/alpine-standalone/etc_syndicate/getty.pr @@ -0,0 +1,2 @@ +> + diff --git a/experiments/alpine-standalone/etc_syndicate/network.pr b/experiments/alpine-standalone/etc_syndicate/network.pr new file mode 100644 index 0000000..6c6464c --- /dev/null +++ b/experiments/alpine-standalone/etc_syndicate/network.pr @@ -0,0 +1,11 @@ + >> + + >> + boot> + + + + >> + boot> + >> + diff --git a/experiments/alpine-standalone/etc_syndicate/packages.pr b/experiments/alpine-standalone/etc_syndicate/packages.pr new file mode 100644 index 0000000..dbe8a62 --- /dev/null +++ b/experiments/alpine-standalone/etc_syndicate/packages.pr @@ -0,0 +1,3 @@ +> + >> + diff --git a/experiments/alpine-standalone/etc_syndicate/sshd.pr b/experiments/alpine-standalone/etc_syndicate/sshd.pr new file mode 100644 index 0000000..cc97c03 --- /dev/null +++ b/experiments/alpine-standalone/etc_syndicate/sshd.pr @@ -0,0 +1,10 @@ +> + + >> + >>> + + + >>> + + + "apk add openssh"> diff --git a/experiments/alpine-standalone/init.sh b/experiments/alpine-standalone/init.sh index 95452b2..d87ed49 100644 --- a/experiments/alpine-standalone/init.sh +++ b/experiments/alpine-standalone/init.sh @@ -33,14 +33,7 @@ then modprobe virtio_blk echo "Loading btrfs." - modprobe btrfs & - - echo "Configuring network." - ifconfig lo 127.0.0.1 up - ifconfig eth0 up - udhcpc -i eth0 & - - wait + modprobe btrfs echo "Attempting to mount ${ROOTDEV} on ${NEWROOT} ..." if mount ${ROOTDEV} ${NEWROOT} @@ -48,13 +41,25 @@ then echo "Mount successful." else 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 \ --root ${NEWROOT} --initdb add $(cat /package-list) 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 echo "Updating $f." cp -a $f ${NEWROOT}$f @@ -67,6 +72,12 @@ then mount -o move $mp ${NEWROOT}$mp 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." kill -15 -1 sleep 0.2 @@ -76,19 +87,11 @@ then exec switch_root -c ${CONSOLE} ${NEWROOT} /init else 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 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 -exec setsid sh -c "exec sh -i <${CONSOLE} >${CONSOLE} 2>&1" +RUST_LOG=trace exec /sbin/synit-pid1 diff --git a/experiments/alpine-standalone/pack-image.sh b/experiments/alpine-standalone/pack-image.sh index c77f7bc..d4efb61 100755 --- a/experiments/alpine-standalone/pack-image.sh +++ b/experiments/alpine-standalone/pack-image.sh @@ -11,8 +11,8 @@ set -xe INITRAMFS=${INITRAMFS:-initramfs-syndicate-system} NATIVE_COMMANDS=${NATIVE_COMMANDS:-no} -DOCKER_ARCH=${DOCKER_ARCH:-aarch64} -ALPINE_VERSION=${ALPINE_VERSION:-v3.14} +DOCKER_PLATFORM=${DOCKER_PLATFORM:-linux/arm64} +ALPINE_VERSION=${ALPINE_VERSION:-3.14} VERSION=${VERSION:-0.1.0} MOUNTPOINT=${MOUNTPOINT:-`pwd`/newroot} @@ -33,6 +33,8 @@ die_if_empty () { die_if_empty PACKAGES "$PACKAGES" die_if_empty VERSION "$VERSION" +docker pull --platform ${DOCKER_PLATFORM} alpine:${ALPINE_VERSION} + invoke_command () { # Shell quoting is a nightmare. Beware spaces. # @@ -44,7 +46,8 @@ invoke_command () { echo "$@" > $tmpscript docker run -it --rm -v `pwd`:`pwd` \ ${DOCKER_PROXY_ARGS} \ - multiarch/alpine:${DOCKER_ARCH}-${ALPINE_VERSION} \ + --platform ${DOCKER_PLATFORM} \ + alpine:${ALPINE_VERSION} \ /bin/sh -c "cd `pwd`; sh $tmpscript" rm -f $tmpscript fi @@ -63,8 +66,8 @@ trap cleanup 0 cat < /dev/null > ${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/${ALPINE_VERSION}/community" >> ${TMP_REPO_FILE} +echo "https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/main" >> ${TMP_REPO_FILE} +echo "https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/community" >> ${TMP_REPO_FILE} # Create root file system. # @@ -90,11 +93,13 @@ BUILT_TIMESTAMP=$(date +%s) COMMIT=$(git rev-parse HEAD) 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 < 15:03:25 < okeuday> tonyg: OTP behaviors were attributed to Lennart > Öhman (working at Sjöland & Thyselius Telecom AB) in the past, but > 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. diff --git a/notes/statefulness.md b/notes/statefulness.md new file mode 100644 index 0000000..0a4b3ec --- /dev/null +++ b/notes/statefulness.md @@ -0,0 +1,4 @@ +--- +--- + +https://grahamc.com/blog/erase-your-darlings diff --git a/protocols/Makefile b/protocols/Makefile deleted file mode 100644 index 1efe0bd..0000000 --- a/protocols/Makefile +++ /dev/null @@ -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 $@ diff --git a/synit-pid1/.gitignore b/synit-pid1/.gitignore index 2f7896d..80fa08d 100644 --- a/synit-pid1/.gitignore +++ b/synit-pid1/.gitignore @@ -1 +1,2 @@ +localdev/ target/ diff --git a/synit-pid1/Cargo.lock b/synit-pid1/Cargo.lock index 5b02e77..e431d48 100644 --- a/synit-pid1/Cargo.lock +++ b/synit-pid1/Cargo.lock @@ -590,9 +590,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "preserves" -version = "0.20.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca71b439b659a3fa05449daa8ac227389ae9c519a288f63d3e584a6ca6106c2f" +checksum = "cb9b4e6da51a363e60d03c2e5a2c6fd2cc501f52415c72779fd2238f28c95fc1" dependencies = [ "base64", "dtoa", @@ -604,9 +604,9 @@ dependencies = [ [[package]] name = "preserves-schema" -version = "0.8.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b4241a53a227d239226114962024c04568504c75953d1ff74be6b8dacc4af7" +checksum = "b7fa4b81122d3bf688629f1b9c97af5061b6a1410eb805f69a836bdd1095b8ed" dependencies = [ "convert_case", "glob", @@ -841,14 +841,13 @@ dependencies = [ [[package]] name = "syndicate" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07595147fa698bc920d9e13a88c33dd7b0cb701560d44ac94b41b7faaee6aa" +version = "0.12.0" dependencies = [ "bytes", "futures", "getrandom", "hmac", + "lazy_static", "preserves", "preserves-schema", "sha2", @@ -861,9 +860,7 @@ dependencies = [ [[package]] name = "syndicate-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6d9fc2bfa1af6581b041e91d4c3d65ee6e6f0a0f9d78c7c38e930d66296e459" +version = "0.7.0" dependencies = [ "proc-macro2", "quote", diff --git a/synit-pid1/Cargo.toml b/synit-pid1/Cargo.toml index b2b2e92..7372b8e 100644 --- a/synit-pid1/Cargo.toml +++ b/synit-pid1/Cargo.toml @@ -9,13 +9,19 @@ homepage = "https://syndicate-lang.org/synit/" repository = "https://git.syndicate-lang.org/syndicate-lang/syndicate-system" license = "Apache-2.0" -# [patch.crates-io] -# syndicate = { path = "/home/tonyg/src/syndicate-rs/syndicate" } -# syndicate-macros = { path = "/home/tonyg/src/syndicate-rs/syndicate-macros" } +[patch.crates-io] +# +# 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] -syndicate = "0.10.0" -syndicate-macros = "0.5.0" +syndicate = "0.12.0" +syndicate-macros = "0.7.0" clap = "3.0.0-beta.2" clap_generate = "3.0.0-beta.2" diff --git a/synit-pid1/Makefile b/synit-pid1/Makefile new file mode 100644 index 0000000..429abb8 --- /dev/null +++ b/synit-pid1/Makefile @@ -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 diff --git a/synit-pid1/rust-toolchain b/synit-pid1/rust-toolchain new file mode 100644 index 0000000..bf867e0 --- /dev/null +++ b/synit-pid1/rust-toolchain @@ -0,0 +1 @@ +nightly diff --git a/synit-pid1/src/main.rs b/synit-pid1/src/main.rs index c4a7c41..8cdc427 100644 --- a/synit-pid1/src/main.rs +++ b/synit-pid1/src/main.rs @@ -100,10 +100,8 @@ async fn main() -> Result<(), Box> { let server = process::Command::new(&config.server_path) .arg("--inferior") - .arg("--port") - .arg("1") - .arg("--socket") - .arg("/run/ds") + .arg("--config") + .arg("/etc/syndicate") .stdin(std::process::Stdio::piped()) .stdout(std::process::Stdio::piped()) // .stderr(std::process::Stdio::null())