gcompat alone provides only the ELF interpreter entry point (/lib64/ld-linux-x86-64.so.2).
It does NOT provide libpthread.so.0, libm.so.6, libdl.so.2, libc.so.6 stubs.
libnvidia-ml.so.590 has NEEDED: libpthread.so.0 etc. When nvidia-smi calls
dlopen("libnvidia-ml.so.1"), musl's linker fails to satisfy these deps
→ NVML_ERROR_LIBRARY_NOT_FOUND (exit 12), "couldn't find libnvidia-ml.so".
libc6-compat provides the missing stubs (libpthread.so.0, libm.so.6, libdl.so.2,
libc.so.6, librt.so.1) as musl redirects, enabling dlopen of glibc shared objects.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
109 lines
2.5 KiB
Bash
Executable File
109 lines
2.5 KiB
Bash
Executable File
#!/bin/sh -e
|
|
HOSTNAME="$1"
|
|
[ -n "$HOSTNAME" ] || { echo "usage: $0 hostname"; exit 1; }
|
|
OVERLAY="${BEE_OVERLAY_DIR}"
|
|
[ -n "$OVERLAY" ] || { echo "ERROR: BEE_OVERLAY_DIR not set"; exit 1; }
|
|
|
|
cleanup() { rm -rf "$tmp"; }
|
|
tmp="$(mktemp -d)"
|
|
trap cleanup EXIT
|
|
|
|
makefile() { OWNER="$1" PERMS="$2" FILENAME="$3"; cat > "$FILENAME"; chown "$OWNER" "$FILENAME"; chmod "$PERMS" "$FILENAME"; }
|
|
rc_add() { mkdir -p "$tmp/etc/runlevels/$2"; ln -sf /etc/init.d/"$1" "$tmp/etc/runlevels/$2/$1"; }
|
|
|
|
mkdir -p "$tmp/etc"
|
|
makefile root:root 0644 "$tmp/etc/hostname" <<EOF
|
|
$HOSTNAME
|
|
EOF
|
|
|
|
# Empty interfaces file — prevents ifupdown from erroring, bee-network handles DHCP
|
|
mkdir -p "$tmp/etc/network"
|
|
makefile root:root 0644 "$tmp/etc/network/interfaces" <<EOF
|
|
auto lo
|
|
iface lo inet loopback
|
|
EOF
|
|
|
|
mkdir -p "$tmp/etc/apk"
|
|
makefile root:root 0644 "$tmp/etc/apk/world" <<EOF
|
|
alpine-base
|
|
dmidecode
|
|
smartmontools
|
|
nvme-cli
|
|
pciutils
|
|
ipmitool
|
|
util-linux
|
|
lsblk
|
|
e2fsprogs
|
|
lshw
|
|
dropbear
|
|
libqrencode-tools
|
|
tzdata
|
|
ca-certificates
|
|
strace
|
|
procps
|
|
lsof
|
|
file
|
|
less
|
|
vim
|
|
dialog
|
|
gcompat
|
|
libc6-compat
|
|
EOF
|
|
|
|
rc_add devfs sysinit
|
|
rc_add dmesg sysinit
|
|
rc_add mdev sysinit
|
|
rc_add hwdrivers sysinit
|
|
rc_add modloop sysinit
|
|
|
|
rc_add hwclock boot
|
|
rc_add modules boot
|
|
rc_add sysctl boot
|
|
rc_add hostname boot
|
|
rc_add bootmisc boot
|
|
rc_add syslog boot
|
|
|
|
rc_add mount-ro shutdown
|
|
rc_add killprocs shutdown
|
|
rc_add savecache shutdown
|
|
|
|
rc_add bee-sshsetup default
|
|
rc_add bee-network default
|
|
rc_add dropbear default
|
|
rc_add bee-nvidia default
|
|
rc_add bee-audit default
|
|
|
|
if [ -d "$OVERLAY/etc" ]; then
|
|
cp -r "$OVERLAY/etc/." "$tmp/etc/"
|
|
chmod +x "$tmp/etc/init.d/"* 2>/dev/null || true
|
|
[ -n "$BEE_BUILD_INFO" ] && sed -i "s/%%BUILD_INFO%%/${BEE_BUILD_INFO}/" "$tmp/etc/motd" 2>/dev/null || true
|
|
fi
|
|
|
|
mkdir -p "$tmp/usr"
|
|
if [ -d "$OVERLAY/usr" ]; then
|
|
cp -r "$OVERLAY/usr/." "$tmp/usr/"
|
|
chmod +x "$tmp/usr/local/bin/"* 2>/dev/null || true
|
|
fi
|
|
|
|
if [ -d "$OVERLAY/root" ]; then
|
|
mkdir -p "$tmp/root"
|
|
cp -r "$OVERLAY/root/." "$tmp/root/"
|
|
chmod 700 "$tmp/root/.ssh" 2>/dev/null || true
|
|
chmod 600 "$tmp/root/.ssh/authorized_keys" 2>/dev/null || true
|
|
fi
|
|
|
|
if [ -d "$OVERLAY/lib" ]; then
|
|
mkdir -p "$tmp/lib"
|
|
cp -r "$OVERLAY/lib/." "$tmp/lib/"
|
|
fi
|
|
|
|
mkdir -p "$tmp/etc/dropbear" "$tmp/etc/conf.d"
|
|
# -R: auto-generate host keys if missing
|
|
# no dependency on networking service — bee-network handles DHCP independently
|
|
makefile root:root 0644 "$tmp/etc/conf.d/dropbear" <<EOF
|
|
DROPBEAR_OPTS="-R -B"
|
|
EOF
|
|
|
|
|
|
tar -c -C "$tmp" etc usr root lib 2>/dev/null | gzip -9n > "$HOSTNAME.apkovl.tar.gz"
|