mirror of
https://github.com/clearlinux/rkt.git
synced 2026-09-01 11:26:05 +00:00
stage1: componentize stage1 rootfs construction and use make
* Move stage1/*.go to stage1/init/
* Split stage1/mkrootfs.sh's logical components into subdirs of
stage1/rootfs:
- Deriving tree from CoreOS image and caching: rootfs/usr
* Cache management in cache.sh
* File extraction and picking in mkbase.sh
* File inclusions split under usr/manifest.d
- Fakesdboot: rootfs/shim/
* Renamed to 'shim' since we've gone past just tricking nspawn
- Root compositing and aggregation of odds and ends: rootfs/aggregate
* Introduction of Makefiles for every component and a simple recursive
parallel-capable make for the rootfs tip.
* Update toplevel build script to invoke make on stage1/rootfs and find
init sources in stage1/init, .gitignore additions as well.
* Removed stage1/mkrootfs.sh
Since the image cache has moved there will be an image download on first build
in the new arrangement. The caching has also been improved to handle CoreOS
image revision changes by naming the cached signature with a hash of the URL.
This commit is contained in:
@@ -3,4 +3,12 @@ gopath/
|
||||
stage0/stage1_init/
|
||||
stage0/stage1_rootfs/
|
||||
stage1/cache/
|
||||
stage1/rootfs/usr/cache/
|
||||
stage1/rootfs/aggregate/s1rootfs/
|
||||
stage1/rootfs/shim/shim.so
|
||||
stage1/rootfs/usr/manifest.txt
|
||||
stage1/rootfs/usr/rootfs/
|
||||
stage1/rootfs/aggregate/s1rootfs.tar
|
||||
stage1/rootfs/usr/usr.done
|
||||
stage1/rootfs/usr/usr.squashfs
|
||||
*.sw[ponm]
|
||||
|
||||
@@ -15,10 +15,9 @@ eval $(go env)
|
||||
|
||||
if [[ "$OSTYPE" == "linux-gnu" ]]; then
|
||||
echo "Building init (stage1)..."
|
||||
go build -o $GOBIN/init ${REPO_PATH}/stage1
|
||||
go build -o $GOBIN/init ${REPO_PATH}/stage1/init
|
||||
|
||||
S1BINS=${PWD}/stage0
|
||||
S1INIT=${S1BINS}/stage1_init
|
||||
S1INIT=${PWD}/stage0/stage1_init
|
||||
if [ $GOBIN/init -nt $S1INIT/bin.go ]; then
|
||||
echo "Packaging init (stage1)..."
|
||||
TMP=$(mktemp -d -t rocket-XXXXXX)
|
||||
@@ -27,14 +26,8 @@ if [[ "$OSTYPE" == "linux-gnu" ]]; then
|
||||
go-bindata -o $S1INIT/bin.go -pkg="stage1_init" -prefix=$TMP $TMP
|
||||
fi
|
||||
|
||||
S1ROOTFS=${S1BINS}/stage1_rootfs
|
||||
if [ stage1/mkrootfs.sh -nt $S1ROOTFS/bin.go ]; then
|
||||
echo "Generating and packaging rootfs (stage1)..."
|
||||
[ -d "${S1ROOTFS}" ] || mkdir -p "${S1ROOTFS}"
|
||||
pushd stage1
|
||||
OUTPUT=$S1ROOTFS/bin.go ./mkrootfs.sh
|
||||
popd
|
||||
fi
|
||||
echo "Building rootfs (stage1)..."
|
||||
make -C stage1/rootfs
|
||||
fi
|
||||
|
||||
echo "Building rkt (stage0)..."
|
||||
|
||||
@@ -1,507 +0,0 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
# Derive a minimal rootfs for hosting systemd from a coreos release pxe image
|
||||
# This is only done when we need to update ../cmd/s1rootfs.go
|
||||
|
||||
IMG_RELEASE="444.5.0"
|
||||
IMG_URL="http://stable.release.core-os.net/amd64-usr/${IMG_RELEASE}/coreos_production_pxe_image.cpio.gz"
|
||||
|
||||
function req() {
|
||||
what=$1
|
||||
|
||||
which "${what}" >/dev/null || { echo "${what} required"; exit 1; }
|
||||
}
|
||||
|
||||
req cpio
|
||||
req curl
|
||||
req gcc
|
||||
req go-bindata
|
||||
req gpg
|
||||
req gzip
|
||||
req install
|
||||
req mktemp
|
||||
req tar
|
||||
req unsquashfs
|
||||
|
||||
# coreos gpg signing key
|
||||
GPG_LONG_ID="50E0885593D2DCB4"
|
||||
GPG_KEY="-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: GnuPG v2
|
||||
|
||||
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
|
||||
Pg==
|
||||
=LY4G
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
"
|
||||
|
||||
# gpg verify a file using the provided key
|
||||
function gpg_verify() {
|
||||
sigfile=$1 #signature file (assumed to be suffixed form of file to verify)
|
||||
key=$2 #signing key
|
||||
keyid=$3 #signing key signature
|
||||
|
||||
gpghome=$(mktemp -d)
|
||||
gpg --homedir="${gpghome}" --batch --quiet --import <<<"${key}"
|
||||
gpg --homedir="${gpghome}" --batch --trusted-key "${keyid}" --verify "${sigfile}"
|
||||
RES=$?
|
||||
|
||||
rm -Rf "${gpghome}"
|
||||
|
||||
return ${RES}
|
||||
}
|
||||
|
||||
# maintain an gpg-verified url cache, assumes signature available @ $url.sig
|
||||
function cache_url() {
|
||||
cache=$1
|
||||
url=$2
|
||||
key=$3
|
||||
keyid=$4
|
||||
sigfile="${cache}.sig"
|
||||
sigurl="${url}.sig"
|
||||
|
||||
# ensure the cache directory exists
|
||||
mkdir -p $(dirname "${cache}")
|
||||
|
||||
# verify the cached copy if it exists
|
||||
if ! gpg_verify "${sigfile}" "${key}" "${keyid}"; then
|
||||
|
||||
# refresh the cache on failure, and verify it again
|
||||
curl --location --output "${cache}" "${url}"
|
||||
curl --location --output "${sigfile}" "${sigurl}"
|
||||
|
||||
gpg_verify "${sigfile}" "${key}" "${keyid}" || return 1
|
||||
fi
|
||||
|
||||
# file $cache exists and can be trusted
|
||||
}
|
||||
|
||||
CACHED_IMG="${PWD}/cache/pxe.img"
|
||||
WORK="mkroot"
|
||||
USRFS="usr.squashfs"
|
||||
ROOTDIR="${WORK}/rootfs"
|
||||
BINDIR="${WORK}/bins"
|
||||
USR="rootfs/usr"
|
||||
FILELIST="filelist.txt"
|
||||
OUTPUT=${OUTPUT:="../stage0/stage1_rootfs/bin.go"}
|
||||
|
||||
# cache pxe image
|
||||
cache_url "${CACHED_IMG}" "${IMG_URL}" "${GPG_KEY}" "${GPG_LONG_ID}"
|
||||
|
||||
[ -e "${WORK}" ] && rm -Rf "${WORK}"
|
||||
|
||||
mkdir -p "${ROOTDIR}"
|
||||
|
||||
# derive $USRFS from $CACHED_IMG
|
||||
pushd "${WORK}"
|
||||
gzip -cd "${CACHED_IMG}" | cpio --extract "${USRFS}"
|
||||
|
||||
# extra stuff for stage1 which will come/go as things mature (reaper in bash for now)
|
||||
EXTRAS="bin/bash
|
||||
lib64/libreadline.so
|
||||
lib64/libreadline.so.6
|
||||
lib64/libreadline.so.6.2
|
||||
lib64/libncurses.so
|
||||
lib64/libncurses.so.5
|
||||
lib64/libncurses.so.5.9
|
||||
lib64/libdl.so
|
||||
lib64/libdl.so.2
|
||||
lib64/libdl-2.17.so
|
||||
bin/sleep"
|
||||
|
||||
# systemd and dependencies
|
||||
cat > "${FILELIST}" <<-EOF
|
||||
${EXTRAS}
|
||||
bin/journalctl
|
||||
bin/systemctl
|
||||
bin/systemd-analyze
|
||||
bin/systemd-ask-password
|
||||
bin/systemd-cat
|
||||
bin/systemd-cgls
|
||||
bin/systemd-cgtop
|
||||
bin/systemd-coredumpctl
|
||||
bin/coredumpctl
|
||||
bin/systemd-delta
|
||||
bin/systemd-detect-virt
|
||||
bin/systemd-inhibit
|
||||
bin/systemd-machine-id-setup
|
||||
bin/systemd-notify
|
||||
bin/systemd-nspawn
|
||||
bin/systemd-path
|
||||
bin/systemd-run
|
||||
bin/systemd-stdio-bridge
|
||||
bin/systemd-sysusers
|
||||
bin/systemd-tmpfiles
|
||||
bin/systemd-tty-ask-password-agent
|
||||
lib
|
||||
lib64/libattr.so
|
||||
lib64/libitm.so
|
||||
lib64/libitm.so.1
|
||||
lib64/libitm.so.1.0.0
|
||||
lib64/libblkid.so
|
||||
lib64/libblkid.so.1
|
||||
lib64/libblkid.so.1.1.0
|
||||
lib64/libuuid.so.1
|
||||
lib64/libuuid.so.1.3.0
|
||||
lib64/libuuid.so
|
||||
lib64/libstdc++.so
|
||||
lib64/libstdc++.so.6
|
||||
lib64/libstdc++.so.6.0.17
|
||||
lib64/libgcc_s.so
|
||||
lib64/libgcc_s.so.1
|
||||
lib64/librt-2.17.so
|
||||
lib64/libz.so.1
|
||||
lib64/libc.so
|
||||
lib64/libz.so.1.2.8
|
||||
lib64/libattr.so.1.1.0
|
||||
lib64/libpthread.so.0
|
||||
lib64/libz.so
|
||||
lib64/libseccomp.so.2.1.1
|
||||
lib64/libseccomp.so
|
||||
lib64/libpthread.so
|
||||
lib64/libcap.so.2.22
|
||||
lib64/libpthread-2.17.so
|
||||
lib64/libkmod.so.2
|
||||
lib64/ld-linux-x86-64.so.2
|
||||
lib64/ld-2.17.so
|
||||
lib64/librt.so.1
|
||||
lib64/libkmod.so
|
||||
lib64/libcap.so
|
||||
lib64/libc-2.17.so
|
||||
lib64/librt.so
|
||||
lib64/libseccomp.so.2
|
||||
lib64/libattr.so.1
|
||||
lib64/libkmod.so.2.2.5
|
||||
lib64/libcap.so.2
|
||||
lib64/libc.so.6
|
||||
lib64/systemd/systemd-backlight
|
||||
lib64/systemd/systemd-update-utmp
|
||||
lib64/systemd/systemd-vconsole-setup
|
||||
lib64/systemd/systemd-journal-remote
|
||||
lib64/systemd/systemd-modules-load
|
||||
lib64/systemd/systemd-resolved
|
||||
lib64/systemd/systemd-bus-proxyd
|
||||
lib64/systemd/systemd-ac-power
|
||||
lib64/systemd/systemd-bootchart
|
||||
lib64/systemd/systemd-initctl
|
||||
lib64/systemd/systemd-shutdown
|
||||
lib64/systemd/systemd-multi-seat-x
|
||||
lib64/systemd/systemd-rfkill
|
||||
lib64/systemd/systemd-networkd
|
||||
lib64/systemd/systemd-activate
|
||||
lib64/systemd/systemd-readahead
|
||||
lib64/systemd/systemd-hostnamed
|
||||
lib64/systemd/systemd-random-seed
|
||||
lib64/systemd/systemd-cgroups-agent
|
||||
lib64/systemd/systemd-udevd
|
||||
lib64/systemd/systemd-shutdownd
|
||||
lib64/systemd/systemd-logind
|
||||
lib64/systemd/systemd
|
||||
lib64/systemd/systemd-update-done
|
||||
lib64/systemd/systemd-machined
|
||||
lib64/systemd/systemd-user-sessions
|
||||
lib64/systemd/systemd-sysctl
|
||||
lib64/systemd/systemd-journald
|
||||
lib64/systemd/systemd-timedated
|
||||
lib64/systemd/systemd-networkd-wait-online
|
||||
lib64/systemd/systemd-localed
|
||||
lib64/systemd/systemd-cryptsetup
|
||||
lib64/systemd/user-generators
|
||||
lib64/systemd/systemd-remount-fs
|
||||
lib64/systemd/systemd-coredump
|
||||
lib64/systemd/systemd-timesyncd
|
||||
lib64/systemd/systemd-socket-proxyd
|
||||
lib64/systemd/system-shutdown
|
||||
lib64/systemd/systemd-binfmt
|
||||
lib64/systemd/systemd-fsck
|
||||
lib64/systemd/system-sleep
|
||||
lib64/systemd/systemd-sleep
|
||||
lib64/systemd/systemd-reply-password
|
||||
lib64/systemd/systemd-journal-gatewayd
|
||||
EOF
|
||||
|
||||
unsquashfs -d "${USR}" -ef "${FILELIST}" "${USRFS}"
|
||||
|
||||
popd
|
||||
|
||||
# populate usr/lib/systemd/system with the necessary static stuff
|
||||
install -d -m 0755 "${ROOTDIR}/usr/lib/systemd/system"
|
||||
|
||||
function putunit {
|
||||
path="${ROOTDIR}/usr/lib/systemd/system/$1"
|
||||
cat > "${path}"
|
||||
}
|
||||
|
||||
putunit default.target <<EOF
|
||||
[Unit]
|
||||
Description=Rocket apps target
|
||||
DefaultDependencies=false
|
||||
EOF
|
||||
|
||||
putunit sockets.target <<EOF
|
||||
[Unit]
|
||||
Description=Sockets
|
||||
DefaultDependencies=false
|
||||
EOF
|
||||
|
||||
putunit local-fs.target <<EOF
|
||||
[Unit]
|
||||
Description=Hook into early systemd for socket-activated systemd instances
|
||||
DefaultDependencies=false
|
||||
Requires=sockets.target
|
||||
EOF
|
||||
|
||||
putunit exit-watcher.service <<EOF
|
||||
[Unit]
|
||||
Description=Graceful exit watcher
|
||||
StopWhenUnneeded=true
|
||||
DefaultDependencies=false
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/sleep 9999999999d
|
||||
ExecStopPost=/usr/bin/systemctl isolate reaper.service
|
||||
EOF
|
||||
|
||||
putunit reaper.service <<EOF
|
||||
[Unit]
|
||||
Description=Rocket apps reaper
|
||||
AllowIsolate=true
|
||||
DefaultDependencies=false
|
||||
|
||||
[Service]
|
||||
ExecStart=/reaper.sh
|
||||
EOF
|
||||
|
||||
install -d -m 0755 "${ROOTDIR}/usr/lib/systemd/system/default.target.wants"
|
||||
install -d -m 0755 "${ROOTDIR}/usr/lib/systemd/system/sockets.target.wants"
|
||||
|
||||
# simple reaper script for collecting the exit statuses of the apps
|
||||
cat > "${ROOTDIR}/reaper.sh" <<-'EOF'
|
||||
#!/usr/bin/bash
|
||||
shopt -s nullglob
|
||||
|
||||
SYSCTL=/usr/bin/systemctl
|
||||
|
||||
cd /opt/stage2
|
||||
for app in *; do
|
||||
status=$(${SYSCTL} show --property ExecMainStatus "${app}.service")
|
||||
echo "${status#*=}" > "/rkt/status/$app"
|
||||
done
|
||||
|
||||
${SYSCTL} halt --force
|
||||
EOF
|
||||
chmod 755 "${ROOTDIR}/reaper.sh"
|
||||
|
||||
# LD_PRELOAD shim to trick the sd_booted() "/run/systemd/system" check in systemd-nspawn
|
||||
# XXX abused further for lockfd retention and container pid recording
|
||||
gcc -shared -fPIC -x c -pipe -Wl,--no-as-needed -ldl -lc -o ${ROOTDIR}/fakesdboot.so - <<'EOF'
|
||||
#define _GNU_SOURCE
|
||||
#include <dlfcn.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
/* hack to make systemd-nspawn execute on non-sysd systems:
|
||||
* - intercept lstat() so lstat of /run/systemd/system always succeeds and returns a directory
|
||||
* - intercept close() to prevent nspawn closing the rkt lock, set it to CLOEXEC instead
|
||||
* - intercept syscall(SYS_clone) to record the container's pid
|
||||
*/
|
||||
|
||||
#define ENV_LOCKFD "RKT_LOCK_FD"
|
||||
#define PIDFILE_TMP "pid.tmp"
|
||||
#define PIDFILE "pid"
|
||||
|
||||
static int (*libc_lxstat)(int, const char *, struct stat *);
|
||||
static int (*libc_close)(int);
|
||||
static long (*libc_syscall)(long number, ...);
|
||||
static int lock_fd = -1;
|
||||
|
||||
static __attribute__((constructor)) void wrapper_init(void)
|
||||
{
|
||||
char *env;
|
||||
if(env = getenv(ENV_LOCKFD))
|
||||
lock_fd = atoi(env);
|
||||
libc_lxstat = dlsym(RTLD_NEXT, "__lxstat");
|
||||
libc_close = dlsym(RTLD_NEXT, "close");
|
||||
libc_syscall = dlsym(RTLD_NEXT, "syscall");
|
||||
}
|
||||
|
||||
int __lxstat(int ver, const char *path, struct stat *stat)
|
||||
{
|
||||
int ret = libc_lxstat(ver, path, stat);
|
||||
|
||||
if(ret == -1 && !strcmp(path, "/run/systemd/system/")) {
|
||||
stat->st_mode = S_IFDIR;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int close(int fd)
|
||||
{
|
||||
if(lock_fd != -1 && fd == lock_fd)
|
||||
return fcntl(fd, F_SETFD, FD_CLOEXEC);
|
||||
|
||||
return libc_close(fd);
|
||||
}
|
||||
|
||||
long syscall(long number, ...)
|
||||
{
|
||||
unsigned long clone_flags;
|
||||
va_list ap;
|
||||
long ret;
|
||||
|
||||
/* XXX: we're targeting systemd-nspawn with this shim, its only syscall() use is __NR_clone */
|
||||
if(number != __NR_clone)
|
||||
return -1;
|
||||
|
||||
va_start(ap, number);
|
||||
clone_flags = va_arg(ap, unsigned long);
|
||||
va_end(ap);
|
||||
|
||||
ret = libc_syscall(number, clone_flags, NULL);
|
||||
|
||||
if(ret > 0) {
|
||||
int fd;
|
||||
/* in parent; try record the container's pid */
|
||||
if((fd = open(PIDFILE_TMP, O_CREAT|O_WRONLY|O_SYNC, 0640)) != -1) {
|
||||
int len;
|
||||
char buf[20];
|
||||
|
||||
if((len = snprintf(buf, sizeof(buf), "%li\n", ret)) != -1)
|
||||
if(write(fd, buf, len) == len)
|
||||
rename(PIDFILE_TMP, PIDFILE);
|
||||
|
||||
libc_close(fd);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
EOF
|
||||
|
||||
install -d "${ROOTDIR}/etc"
|
||||
echo "rocket" > "${ROOTDIR}/etc/os-release"
|
||||
|
||||
# parent dir for the stage2 bind mounts
|
||||
install -d "${ROOTDIR}/opt/stage2"
|
||||
|
||||
# dir for result code files
|
||||
install -d "${ROOTDIR}/rkt/status"
|
||||
|
||||
# fin
|
||||
mkdir "${BINDIR}"
|
||||
tar cf "${BINDIR}/s1rootfs.tar" -C "${ROOTDIR}" .
|
||||
OUTDIR=$(dirname "${OUTPUT}")
|
||||
[ -d "$OUTDIR" ] || mkdir -p "${OUTDIR}"
|
||||
go-bindata -o "${OUTPUT}" -prefix "${PWD}/${BINDIR}" -pkg=stage1_rootfs "${BINDIR}"
|
||||
rm -Rf "${WORK}"
|
||||
@@ -0,0 +1,17 @@
|
||||
_SUBDIRS=usr shim
|
||||
SUBDIRS=$(_SUBDIRS) aggregate
|
||||
export CFLAGS=-Wall -Os
|
||||
|
||||
.PHONY: test clean subdirs $(SUBDIRS)
|
||||
|
||||
subdirs: $(SUBDIRS)
|
||||
|
||||
$(SUBDIRS):
|
||||
$(MAKE) -C $@ $(MAKECMDGOALS)
|
||||
|
||||
clean: $(SUBDIRS)
|
||||
rm -Rf $(S1) $(S1TAR)
|
||||
|
||||
test: $(SUBDIRS)
|
||||
|
||||
aggregate: $(_SUBDIRS)
|
||||
@@ -0,0 +1,19 @@
|
||||
S1=s1rootfs
|
||||
S1TAR=$(S1).tar
|
||||
|
||||
../../../stage0/stage1_rootfs/bin.go: $(S1TAR) Makefile
|
||||
@mkdir -p $$(dirname $@)
|
||||
TMP=$$(mktemp -d -t stage1-XXXXXX) && \
|
||||
ln -s "$(CURDIR)/$(S1TAR)" "$$TMP" && \
|
||||
go-bindata -o $@ -prefix="$$TMP" -pkg=stage1_rootfs "$$TMP" && \
|
||||
rm -Rf "$$TMP"
|
||||
|
||||
$(S1TAR): aggregate.sh Makefile scripts/* units/*
|
||||
@./aggregate.sh && tar cf $(S1TAR) -C $(S1) .
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -Rf $(S1) $(S1TAR)
|
||||
|
||||
test:
|
||||
echo TODO
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
# aggregate everything into a single rootfs tree
|
||||
|
||||
RD=s1rootfs
|
||||
|
||||
# always start over
|
||||
[ -e "$RD" ] && rm -Rf "$RD"
|
||||
|
||||
# start with the usr/rootfs
|
||||
cp -a ../usr/rootfs "$RD"
|
||||
|
||||
# populate the systemd units
|
||||
install -d -m 0755 "$RD/usr/lib/systemd/system"
|
||||
install -d -m 0755 "$RD/usr/lib/systemd/system/default.target.wants"
|
||||
install -d -m 0755 "$RD/usr/lib/systemd/system/sockets.target.wants"
|
||||
install -m 0644 units/default.target "$RD/usr/lib/systemd/system"
|
||||
install -m 0644 units/exit-watcher.service "$RD/usr/lib/systemd/system"
|
||||
install -m 0644 units/local-fs.target "$RD/usr/lib/systemd/system"
|
||||
install -m 0644 units/reaper.service "$RD/usr/lib/systemd/system"
|
||||
install -m 0644 units/sockets.target "$RD/usr/lib/systemd/system"
|
||||
install -m 0755 scripts/reaper.sh "$RD"
|
||||
install -m 0755 ../shim/shim.so "$RD"
|
||||
ln -s shim.so "$RD/fakesdboot.so"
|
||||
|
||||
install -d "$RD/etc"
|
||||
echo "rocket" > "$RD/etc/os-release"
|
||||
|
||||
# parent dir for the stage2 bind mounts
|
||||
install -d "$RD/opt/stage2"
|
||||
|
||||
# dir for result code files
|
||||
install -d "$RD/rkt/status"
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
#!/usr/bin/bash
|
||||
shopt -s nullglob
|
||||
|
||||
SYSCTL=/usr/bin/systemctl
|
||||
|
||||
cd /opt/stage2
|
||||
for app in *; do
|
||||
status=$(${SYSCTL} show --property ExecMainStatus "${app}.service")
|
||||
echo "${status#*=}" > "/rkt/status/$app"
|
||||
done
|
||||
|
||||
${SYSCTL} halt --force
|
||||
@@ -0,0 +1,3 @@
|
||||
[Unit]
|
||||
Description=Rocket apps target
|
||||
DefaultDependencies=false
|
||||
@@ -0,0 +1,8 @@
|
||||
[Unit]
|
||||
Description=Graceful exit watcher
|
||||
StopWhenUnneeded=true
|
||||
DefaultDependencies=false
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/sleep 9999999999d
|
||||
ExecStopPost=/usr/bin/systemctl isolate reaper.service
|
||||
@@ -0,0 +1,4 @@
|
||||
[Unit]
|
||||
Description=Hook into early systemd for socket-activated systemd instances
|
||||
DefaultDependencies=false
|
||||
Requires=sockets.target
|
||||
@@ -0,0 +1,7 @@
|
||||
[Unit]
|
||||
Description=Rocket apps reaper
|
||||
AllowIsolate=true
|
||||
DefaultDependencies=false
|
||||
|
||||
[Service]
|
||||
ExecStart=/reaper.sh
|
||||
@@ -0,0 +1,3 @@
|
||||
[Unit]
|
||||
Description=Sockets
|
||||
DefaultDependencies=false
|
||||
@@ -0,0 +1,12 @@
|
||||
BIN=shim.so
|
||||
SRC=shim.c
|
||||
|
||||
$(BIN): $(SRC) Makefile
|
||||
$(CC) $(CFLAGS) $(SRC) -o $(BIN) -shared -fPIC -Wl,--no-as-needed -ldl -lc
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f $(BIN)
|
||||
|
||||
test:
|
||||
echo TODO
|
||||
@@ -0,0 +1,91 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <dlfcn.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
/* hack to make systemd-nspawn execute on non-sysd systems:
|
||||
* - intercept lstat() so lstat of /run/systemd/system always succeeds and returns a directory
|
||||
* - intercept close() to prevent nspawn closing the rkt lock, set it to CLOEXEC instead
|
||||
* - intercept syscall(SYS_clone) to record the container's pid
|
||||
*/
|
||||
|
||||
#define ENV_LOCKFD "RKT_LOCK_FD"
|
||||
#define PIDFILE_TMP "pid.tmp"
|
||||
#define PIDFILE "pid"
|
||||
|
||||
static int (*libc_lxstat)(int, const char *, struct stat *);
|
||||
static int (*libc_close)(int);
|
||||
static long (*libc_syscall)(long number, ...);
|
||||
static int lock_fd = -1;
|
||||
|
||||
static __attribute__((constructor)) void wrapper_init(void)
|
||||
{
|
||||
char *env;
|
||||
if(env = getenv(ENV_LOCKFD))
|
||||
lock_fd = atoi(env);
|
||||
libc_lxstat = dlsym(RTLD_NEXT, "__lxstat");
|
||||
libc_close = dlsym(RTLD_NEXT, "close");
|
||||
libc_syscall = dlsym(RTLD_NEXT, "syscall");
|
||||
}
|
||||
|
||||
int __lxstat(int ver, const char *path, struct stat *stat)
|
||||
{
|
||||
int ret = libc_lxstat(ver, path, stat);
|
||||
|
||||
if(ret == -1 && !strcmp(path, "/run/systemd/system/")) {
|
||||
stat->st_mode = S_IFDIR;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int close(int fd)
|
||||
{
|
||||
if(lock_fd != -1 && fd == lock_fd)
|
||||
return fcntl(fd, F_SETFD, FD_CLOEXEC);
|
||||
|
||||
return libc_close(fd);
|
||||
}
|
||||
|
||||
long syscall(long number, ...)
|
||||
{
|
||||
unsigned long clone_flags;
|
||||
va_list ap;
|
||||
long ret;
|
||||
|
||||
/* XXX: we're targeting systemd-nspawn with this shim, its only syscall() use is __NR_clone */
|
||||
if(number != __NR_clone)
|
||||
return -1;
|
||||
|
||||
va_start(ap, number);
|
||||
clone_flags = va_arg(ap, unsigned long);
|
||||
va_end(ap);
|
||||
|
||||
ret = libc_syscall(number, clone_flags, NULL);
|
||||
|
||||
if(ret > 0) {
|
||||
int fd;
|
||||
/* in parent; try record the container's pid */
|
||||
if((fd = open(PIDFILE_TMP, O_CREAT|O_WRONLY|O_SYNC, 0640)) != -1) {
|
||||
int len;
|
||||
char buf[20];
|
||||
|
||||
if((len = snprintf(buf, sizeof(buf), "%li\n", ret)) != -1)
|
||||
if(write(fd, buf, len) == len)
|
||||
rename(PIDFILE_TMP, PIDFILE);
|
||||
|
||||
libc_close(fd);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
# base just derives a base root fs from a CoreOS image downloaded and verified
|
||||
|
||||
|
||||
usr.done: mkbase.sh cache/pxe.img
|
||||
./mkbase.sh && touch usr.done
|
||||
|
||||
cache/pxe.img: cache.sh
|
||||
./cache.sh
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -Rf rootfs usr.squashfs usr.done manifest.txt
|
||||
|
||||
# TODO cleaner target for clearing cache?
|
||||
test:
|
||||
echo TODO
|
||||
Executable
+184
@@ -0,0 +1,184 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
# maintain a cached copy of coreos pxe image
|
||||
|
||||
IMG_RELEASE="444.5.0"
|
||||
IMG_URL="http://stable.release.core-os.net/amd64-usr/${IMG_RELEASE}/coreos_production_pxe_image.cpio.gz"
|
||||
|
||||
function req() {
|
||||
what=$1
|
||||
|
||||
which "${what}" >/dev/null || { echo "${what} required"; exit 1; }
|
||||
}
|
||||
|
||||
req curl
|
||||
req gpg
|
||||
req mktemp
|
||||
req md5sum
|
||||
|
||||
# coreos gpg signing key
|
||||
GPG_LONG_ID="50E0885593D2DCB4"
|
||||
GPG_KEY="-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: GnuPG v2
|
||||
|
||||
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
|
||||
Pg==
|
||||
=LY4G
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
"
|
||||
|
||||
# gpg verify a file using the provided key
|
||||
function gpg_verify() {
|
||||
file=$1
|
||||
sigfile=$2 #signature file (assumed to be suffixed form of file to verify)
|
||||
key=$3 #signing key
|
||||
keyid=$4 #signing key signature
|
||||
|
||||
gpghome=$(mktemp -d)
|
||||
gpg --homedir="${gpghome}" --batch --quiet --import <<<"${key}"
|
||||
gpg --homedir="${gpghome}" --batch --trusted-key "${keyid}" --verify "${sigfile}" "${cache}"
|
||||
RES=$?
|
||||
|
||||
rm -Rf "${gpghome}"
|
||||
|
||||
return ${RES}
|
||||
}
|
||||
|
||||
# maintain an gpg-verified url cache, assumes signature available @ $url.sig
|
||||
function cache_url() {
|
||||
cache=$1
|
||||
url=$2
|
||||
key=$3
|
||||
keyid=$4
|
||||
|
||||
urlhash=$(echo -n "${url}" | md5sum)
|
||||
sigfile="${cache}.${urlhash%% *}.sig"
|
||||
sigurl="${url}.sig"
|
||||
|
||||
# ensure the cache directory exists
|
||||
mkdir -p $(dirname "${cache}")
|
||||
|
||||
# verify the cached copy if it exists
|
||||
if ! gpg_verify "${cache}" "${sigfile}" "${key}" "${keyid}"; then
|
||||
|
||||
# refresh the cache on failure, and verify it again
|
||||
curl --location --output "${cache}" "${url}"
|
||||
curl --location --output "${sigfile}" "${sigurl}"
|
||||
|
||||
gpg_verify "${cache}" "${sigfile}" "${key}" "${keyid}" || return 1
|
||||
fi
|
||||
|
||||
# file $cache exists and can be trusted
|
||||
touch ${cache}
|
||||
}
|
||||
|
||||
CACHED_IMG="cache/pxe.img"
|
||||
USRFS="usr.squashfs"
|
||||
ROOTDIR="rootfs"
|
||||
USR="rootfs/usr"
|
||||
FILELIST="manifest.txt"
|
||||
|
||||
# cache pxe image
|
||||
cache_url "${CACHED_IMG}" "${IMG_URL}" "${GPG_KEY}" "${GPG_LONG_ID}"
|
||||
@@ -0,0 +1,14 @@
|
||||
bin/bash
|
||||
lib64/ld-2.17.so
|
||||
lib64/ld-linux-x86-64.so.2
|
||||
lib64/libc-2.17.so
|
||||
lib64/libc.so.6
|
||||
lib64/libdl-2.17.so
|
||||
lib64/libdl.so
|
||||
lib64/libdl.so.2
|
||||
lib64/libncurses.so
|
||||
lib64/libncurses.so.5
|
||||
lib64/libncurses.so.5.9
|
||||
lib64/libreadline.so
|
||||
lib64/libreadline.so.6
|
||||
lib64/libreadline.so.6.2
|
||||
@@ -0,0 +1,5 @@
|
||||
bin/sleep
|
||||
lib64/ld-2.17.so
|
||||
lib64/ld-linux-x86-64.so.2
|
||||
lib64/libc-2.17.so
|
||||
lib64/libc.so.6
|
||||
@@ -0,0 +1,105 @@
|
||||
bin/coredumpctl
|
||||
bin/journalctl
|
||||
bin/systemctl
|
||||
bin/systemd-analyze
|
||||
bin/systemd-ask-password
|
||||
bin/systemd-cat
|
||||
bin/systemd-cgls
|
||||
bin/systemd-cgtop
|
||||
bin/systemd-coredumpctl
|
||||
bin/systemd-delta
|
||||
bin/systemd-detect-virt
|
||||
bin/systemd-inhibit
|
||||
bin/systemd-machine-id-setup
|
||||
bin/systemd-notify
|
||||
bin/systemd-nspawn
|
||||
bin/systemd-path
|
||||
bin/systemd-run
|
||||
bin/systemd-stdio-bridge
|
||||
bin/systemd-sysusers
|
||||
bin/systemd-tmpfiles
|
||||
bin/systemd-tty-ask-password-agent
|
||||
lib
|
||||
lib64/ld-2.17.so
|
||||
lib64/ld-linux-x86-64.so.2
|
||||
lib64/libattr.so
|
||||
lib64/libattr.so.1
|
||||
lib64/libattr.so.1.1.0
|
||||
lib64/libblkid.so
|
||||
lib64/libblkid.so.1
|
||||
lib64/libblkid.so.1.1.0
|
||||
lib64/libc-2.17.so
|
||||
lib64/libcap.so
|
||||
lib64/libcap.so.2
|
||||
lib64/libcap.so.2.22
|
||||
lib64/libc.so.6
|
||||
lib64/libgcc_s.so
|
||||
lib64/libgcc_s.so.1
|
||||
lib64/libitm.so
|
||||
lib64/libitm.so.1
|
||||
lib64/libitm.so.1.0.0
|
||||
lib64/libkmod.so
|
||||
lib64/libkmod.so.2
|
||||
lib64/libkmod.so.2.2.5
|
||||
lib64/libpthread-2.17.so
|
||||
lib64/libpthread.so
|
||||
lib64/libpthread.so.0
|
||||
lib64/librt-2.17.so
|
||||
lib64/librt.so
|
||||
lib64/librt.so.1
|
||||
lib64/libseccomp.so
|
||||
lib64/libseccomp.so.2
|
||||
lib64/libseccomp.so.2.1.1
|
||||
lib64/libstdc++.so
|
||||
lib64/libstdc++.so.6
|
||||
lib64/libstdc++.so.6.0.17
|
||||
lib64/libuuid.so
|
||||
lib64/libuuid.so.1
|
||||
lib64/libuuid.so.1.3.0
|
||||
lib64/libz.so
|
||||
lib64/libz.so.1
|
||||
lib64/libz.so.1.2.8
|
||||
lib64/systemd/systemd
|
||||
lib64/systemd/systemd-ac-power
|
||||
lib64/systemd/systemd-activate
|
||||
lib64/systemd/systemd-backlight
|
||||
lib64/systemd/systemd-binfmt
|
||||
lib64/systemd/systemd-bootchart
|
||||
lib64/systemd/systemd-bus-proxyd
|
||||
lib64/systemd/systemd-cgroups-agent
|
||||
lib64/systemd/systemd-coredump
|
||||
lib64/systemd/systemd-cryptsetup
|
||||
lib64/systemd/systemd-fsck
|
||||
lib64/systemd/systemd-hostnamed
|
||||
lib64/systemd/systemd-initctl
|
||||
lib64/systemd/systemd-journald
|
||||
lib64/systemd/systemd-journal-gatewayd
|
||||
lib64/systemd/systemd-journal-remote
|
||||
lib64/systemd/systemd-localed
|
||||
lib64/systemd/systemd-logind
|
||||
lib64/systemd/systemd-machined
|
||||
lib64/systemd/systemd-modules-load
|
||||
lib64/systemd/systemd-multi-seat-x
|
||||
lib64/systemd/systemd-networkd
|
||||
lib64/systemd/systemd-networkd-wait-online
|
||||
lib64/systemd/systemd-random-seed
|
||||
lib64/systemd/systemd-readahead
|
||||
lib64/systemd/systemd-remount-fs
|
||||
lib64/systemd/systemd-reply-password
|
||||
lib64/systemd/systemd-resolved
|
||||
lib64/systemd/systemd-rfkill
|
||||
lib64/systemd/systemd-shutdown
|
||||
lib64/systemd/systemd-shutdownd
|
||||
lib64/systemd/systemd-sleep
|
||||
lib64/systemd/systemd-socket-proxyd
|
||||
lib64/systemd/systemd-sysctl
|
||||
lib64/systemd/systemd-timedated
|
||||
lib64/systemd/systemd-timesyncd
|
||||
lib64/systemd/systemd-udevd
|
||||
lib64/systemd/systemd-update-done
|
||||
lib64/systemd/systemd-update-utmp
|
||||
lib64/systemd/systemd-user-sessions
|
||||
lib64/systemd/systemd-vconsole-setup
|
||||
lib64/systemd/system-shutdown
|
||||
lib64/systemd/system-sleep
|
||||
lib64/systemd/user-generators
|
||||
Executable
+36
@@ -0,0 +1,36 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
# Derive a minimal base tree for hosting systemd from a cached coreos release pxe image
|
||||
|
||||
shopt -s nullglob
|
||||
|
||||
function req() {
|
||||
what=$1
|
||||
|
||||
which "${what}" >/dev/null || { echo "${what} required"; exit 1; }
|
||||
}
|
||||
|
||||
req cpio
|
||||
req gzip
|
||||
req unsquashfs
|
||||
req sort
|
||||
|
||||
CACHED_IMG="cache/pxe.img"
|
||||
SQUASH="usr.squashfs"
|
||||
ROOTFS="rootfs"
|
||||
USR="rootfs/usr"
|
||||
FILELIST="manifest.txt"
|
||||
|
||||
# always start with an empty rootfs
|
||||
[ -e "${ROOTFS}" ] && rm -Rf "${ROOTFS}"
|
||||
|
||||
mkdir -p "${ROOTFS}"
|
||||
|
||||
# create consolidated file list
|
||||
cat manifest.d/* | sort -u > "${FILELIST}"
|
||||
|
||||
# derive $SQUASH from $CACHED_IMG
|
||||
gzip -cd "${CACHED_IMG}" | cpio --unconditional --extract "${SQUASH}"
|
||||
unsquashfs -d "${USR}" -ef "${FILELIST}" "${SQUASH}"
|
||||
|
||||
# just leave the desired tree @ ${ROOTFS}
|
||||
Reference in New Issue
Block a user