Skip to content

Commit db6cc2f

Browse files
committed
Initial commit with a very basic musl libc, static busybox, and dynamic openrc install
1 parent a4fb64e commit db6cc2f

File tree

8 files changed

+1225
-1
lines changed

8 files changed

+1225
-1
lines changed

Diff for: .gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
initramfs/.install
2+
initramfs/.build

Diff for: README.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
# warewulf-bootstrap
1+
# warewulf-bootstrap
2+
3+
## Testing as a container with systemd-nspawn
4+
5+
```
6+
sudo systemd-nspawn --register=false --network-veth -bD initramfs/.install/
7+
```

Diff for: TODO

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- [ ] Openrc service to parse /proc/cmdline to populate:
2+
- [ ] /etc/conf.d/network
3+

Diff for: build.sh

+140
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
#!/bin/bash
2+
3+
set -o errexit
4+
set -o nounset
5+
set -o pipefail
6+
7+
MUSL_VERS=1.1.14
8+
BUSYBOX_VERS=1.24.2
9+
OPENRC_VERS=0.21
10+
11+
BASE=$(dirname $(readlink -f $0))
12+
mkdir -p $BASE/initramfs
13+
mkdir -p $BASE/initramfs/3rd_party/MIT
14+
mkdir -p $BASE/initramfs/3rd_party/GPL
15+
16+
INSTALLROOT="${BASE}/initramfs/.install"
17+
mkdir -p "${INSTALLROOT}"
18+
BUILDROOT="${BASE}/initramfs/.build"
19+
mkdir -p "${BUILDROOT}"
20+
KHDR_BASE=/usr
21+
22+
### MUSL-C ###
23+
cd "${BASE}/initramfs/3rd_party/MIT"
24+
if [ ! -e "${BASE}/initramfs/3rd_party/MIT/musl-${MUSL_VERS}.tar.gz" ]; then
25+
curl -O https://www.musl-libc.org/releases/musl-${MUSL_VERS}.tar.gz
26+
fi
27+
28+
tar -C "${BUILDROOT}" -xf musl-${MUSL_VERS}.tar.gz
29+
cd "${BUILDROOT}/musl-${MUSL_VERS}"
30+
./configure \
31+
--disable-wrapper \
32+
--prefix=/usr \
33+
--sysconfdir=/etc \
34+
--localstatedir=/var \
35+
--syslibdir=/lib \
36+
--includedir="/../.build/include"
37+
make -j2
38+
39+
make DESTDIR="${INSTALLROOT}" install
40+
LDSO=$(make -f Makefile --eval "$(echo -e 'print-ldso:\n\t@echo $$(basename $(LDSO_PATHNAME))')" print-ldso)
41+
mv -f "${INSTALLROOT}/usr/lib/libc.so" "${INSTALLROOT}/lib/${LDSO}"
42+
ln -sf "../../lib/${LDSO}" "${INSTALLROOT}/usr/lib/libc.so"
43+
mkdir -p "${INSTALLROOT}/usr/bin"
44+
ln -sf "../../lib/${LDSO}" "${INSTALLROOT}/usr/bin/ldd"
45+
46+
mkdir -p "${BUILDROOT}/bin" "${BUILDROOT}/etc"
47+
48+
sh "${BUILDROOT}/musl-${MUSL_VERS}/tools/musl-gcc.specs.sh" "${BUILDROOT}/include" "${INSTALLROOT}/usr/lib" "/lib/${LDSO}" > "${BUILDROOT}/etc/musl-gcc.specs"
49+
50+
cat <<EOF > "${BUILDROOT}/bin/musl-gcc"
51+
#!/bin/sh
52+
exec "\${REALGCC:-gcc}" "\$@" -specs "${BUILDROOT}/etc/musl-gcc.specs"
53+
EOF
54+
55+
chmod +x "${BUILDROOT}/bin/musl-gcc"
56+
57+
PATH="${BUILDROOT}/bin":$PATH
58+
59+
cd "${BUILDROOT}/bin"
60+
61+
# TODO: Using binutils from the build host for now
62+
ln -s `which ar` musl-ar
63+
ln -s `which strip` musl-strip
64+
65+
# TODO: Using linux-headers from the buildhost for now
66+
cd "${BUILDROOT}/include"
67+
ln -s "${KHDR_BASE}/include/linux" linux
68+
ln -s "${KHDR_BASE}/include/mtd" mtd
69+
if [ -d "${KHDR_BASE}/include/asm" ]
70+
then
71+
ln -s "${KHDR_BASE}/include/asm" asm
72+
else
73+
ln -s "${KHDR_BASE}/include/asm-generic" asm
74+
fi
75+
ln -s "${KHDR_BASE}/include/asm-generic" asm-generic
76+
77+
### Busybox (static) ###
78+
cd "${BASE}/initramfs/3rd_party/GPL"
79+
if [ ! -e "${BASE}/initramfs/3rd_party/GPL/busybox-${BUSYBOX_VERS}.tar.bz2" ]; then
80+
curl -O https://www.busybox.net/downloads/busybox-${BUSYBOX_VERS}.tar.bz2
81+
fi
82+
83+
tar -C "${BUILDROOT}" -xf busybox-${BUSYBOX_VERS}.tar.bz2
84+
cd "${BUILDROOT}/busybox-${BUSYBOX_VERS}"
85+
cp "${BASE}/busybox.config" .config
86+
sed -i -e "s/CONFIG_EXTRA_COMPAT=y/CONFIG_EXTRA_COMPAT=n/" \
87+
-e "s/.*CONFIG_CROSS_COMPILER_PREFIX.*/CONFIG_CROSS_COMPILER_PREFIX=\"musl-\"/" \
88+
-e "s|.*CONFIG_PREFIX.*|CONFIG_PREFIX=\"${INSTALLROOT}\"|" \
89+
-e "s/.*CONFIG_PIE.*/\# CONFIG_PIE is not set/" \
90+
-e "s/.*CONFIG_INSTALL_APPLET_DONT.*/\# CONFIG_INSTALL_APPLET_DONT is not set/" \
91+
-e "s/.*CONFIG_STATIC.*/CONFIG_STATIC=y/" \
92+
-e "s/.*CONFIG_INSTALL_APPLET_SYMLINKS.*/CONFIG_INSTALL_APPLET_SYMLINKS=y/" \
93+
.config
94+
95+
make V=1 -j2
96+
make install
97+
98+
### OpenRC ###
99+
cd "${BASE}/initramfs/3rd_party/MIT"
100+
if [ ! -e "${BASE}/initramfs/3rd_party/MIT/openrc-${OPENRC_VERS}.tar.gz" ]; then
101+
curl -L -o openrc-${OPENRC_VERS}.tar.gz https://github.com/OpenRC/openrc/archive/${OPENRC_VERS}.tar.gz
102+
fi
103+
104+
tar -C "${BUILDROOT}" -xf openrc-${OPENRC_VERS}.tar.gz
105+
cd "${BUILDROOT}/openrc-${OPENRC_VERS}"
106+
107+
make install \
108+
LIBNAME=lib \
109+
DESTDIR="${INSTALLROOT}" \
110+
MKNET=yes \
111+
MKPKGCONFIG=no \
112+
MKSTATICLIBS=no \
113+
MKTOOLS=yes \
114+
LOCAL_PREFIX=/usr/local \
115+
BRANDING=\"Warewulf/$(uname -s)\" \
116+
CC=musl-gcc
117+
118+
# systemd-nspawn needs os-release
119+
echo 'NAME="Warewulf 4.0 Bootstrap"' > "${INSTALLROOT}/etc/os-release"
120+
121+
cat <<EOF > "${INSTALLROOT}/etc/inittab"
122+
# /etc/inittab
123+
124+
::sysinit:/sbin/openrc sysinit
125+
::sysinit:/sbin/openrc boot
126+
::wait:/sbin/openrc default
127+
128+
# Set up a couple of getty's
129+
console::respawn:/sbin/getty 38400 /dev/console
130+
131+
# Put a getty on the serial port
132+
#ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100
133+
#ttyS1::respawn:/sbin/getty -L ttyS1 115200 vt100
134+
135+
# Stuff to do for the 3-finger salute
136+
::ctrlaltdel:/sbin/reboot
137+
138+
# Stuff to do before rebooting
139+
::shutdown:/sbin/openrc shutdown
140+
EOF

0 commit comments

Comments
 (0)