#!/usr/bin/env bash # SPDX-License-Identifier: LGPL-2.1-or-later set -eu set -o pipefail root="${1:?Usage: $0 container-root}" mkdir -p "$root" mkdir -p "$root/usr/bin" # On openSUSE the static linked version of busybox is named "busybox-static". busybox="$(type -P busybox-static || type -P busybox)" cp "$busybox" "$root/usr/bin/busybox" mkdir "$root/var" mkdir -p "$root/usr/lib" touch "$root/usr/lib/os-release" ln -s busybox "$root/usr/bin/cat" ln -s busybox "$root/usr/bin/hostname" ln -s busybox "$root/usr/bin/ip" ln -s busybox "$root/usr/bin/md5sum" ln -s busybox "$root/usr/bin/mountpoint" ln -s busybox "$root/usr/bin/ps" ln -s busybox "$root/usr/bin/seq" ln -s busybox "$root/usr/bin/sh" ln -s busybox "$root/usr/bin/sleep" ln -s busybox "$root/usr/bin/stat" ln -s busybox "$root/usr/bin/test" ln -s busybox "$root/usr/bin/touch" ln -s busybox "$root/usr/bin/tr" ln -s busybox "$root/usr/bin/true" ln -s busybox "$root/usr/bin/usleep" # Mock the bare minimum of getent to make systemd-nspawn --user= "work" cat >"$root/usr/bin/getent" <<\EOF #!/bin/sh if [[ $# - eq 0 ]]; then : elif [[ $1 == passwd ]]; then echo "testuser:x:1000:1000:testuser:/:/bin/sh" elif [[ $1 == initgroups ]]; then echo "testuser" fi EOF chmod +x "$root/usr/bin/getent" mkdir -p "$root/usr/sbin" cat >"$root/usr/sbin/init" <<\EOF #!/bin/sh printf "ps aufx:\n" ps aufx printf "/proc/1/cmdline:\n" printf "%s\n\n" "$(tr '\0' ' '