Use LVM, allow networking and more misc

This commit is contained in:
Alex D. 2023-10-21 11:44:56 +00:00
parent 4565e95fb3
commit 7f09dcf886
Signed by: caskd
GPG Key ID: F92BA85F61F4C173
1 changed files with 123 additions and 67 deletions

View File

@ -10,28 +10,22 @@ errormsg () {
# Check deps
depcheck() {
if ! which "$1" >/dev/null 2>&1; then
errormsg "Missing dependency $1, exiting."
fi
for x in $@; do
if ! which "$x" >/dev/null 2>&1; then
errormsg "Missing dependency $x, exiting."
fi
done
}
depcheck "fallocate"
depcheck "sfdisk"
depcheck "mkfs.vfat"
depcheck "mkfs.ext4"
depcheck "mkfs.btrfs"
depcheck "mktemp"
depcheck "mount"
depcheck "mkdir"
depcheck "cat"
depcheck "install"
depcheck "apk"
depcheck "bwrap"
splitargs() {
echo "$1" | sed 's/ /\n/g'
}
# BWRAP "chrooting"
wrapped() {
bwrap \
--unshare-net \
--new-session \
--die-with-parent \
--unshare-pid \
--unshare-uts \
--unshare-ipc \
@ -44,11 +38,44 @@ wrapped() {
-- $@
}
image="${1:-nnd-rootfs}"
arch="${2:-x86_64}"
depcheck "fallocate" \
"sfdisk" \
"mkfs.vfat" \
"mkfs.ext4" \
"pvcreate" \
"vgcreate" \
"lvcreate" \
"vgchange" \
"mkfs.btrfs" \
"mktemp" \
"mount" \
"mkdir" \
"cat" \
"install" \
"apk" \
"bwrap"
custom=false
while getopts ':a:i:b:t:s:p:c' opt; do
case $opt in
(a) arch="$OPTARG";;
(b) svcs="$svcs $OPTARG";;
(c) custom=true;;
(i) image="$OPTARG";;
(p) pkgs="$pkgs $OPTARG";;
(s) size="$OPTARG";;
(t) ttys="$ttys $OPTARG";;
esac
done
: "${image:=nnd-rootfs}"
: "${arch:=x86_64}"
: "${svcs:=bundle.core bundle.net}"
: "${size:=1G}"
# Set up file as loopback
fallocate -v -l 1G "$image"
fallocate -v -l "$size" "$image"
if ! [ -r "$image" ]; then
errormsg "Something went wrong while preallocating sparse image"
fi
@ -68,14 +95,22 @@ EOT
# Format partitions
mkfs.vfat -n nnd-efi "${loopback}p1"
mkfs.ext4 -L nnd-boot "${loopback}p2"
mkfs.btrfs -L nnd-root "${loopback}p3"
VGN="nnd"
LVN="rootlv"
pvcreate "${loopback}p3"
vgcreate "$VGN" "${loopback}p3"
lvcreate "$VGN" -n "$LVN" -l '100%FREE'
vgchange -a y "$VGN"
mkfs.btrfs -L nnd-root "/dev/$VGN/$LVN"
# Set up chroot
tmpdir="$(mktemp -d "nnd-image.XXXXXXXXXX")"
if [ -z "$tmpdir" ]; then
errormsg "Something went wrong during working directory preparation, bailing out"
fi
mount -v -t btrfs "${loopback}p3" "$tmpdir"
mount -v -t btrfs "/dev/$VGN/$LVN" "$tmpdir"
mkdir -p "$tmpdir/boot"
mount -v -t ext4 "${loopback}p2" "$tmpdir/boot"
@ -96,7 +131,7 @@ https://dl-cdn.alpinelinux.org/alpine/latest-stable/community
EOF
) "$tmpdir"/etc/apk/repositories
# Set up basic rootfs
# Set up bootstrap rootfs
apk add \
-v \
--initdb \
@ -104,59 +139,20 @@ apk add \
--root "$tmpdir" \
--repositories-file "$tmpdir/etc/apk/repositories" \
--arch "$arch" \
nnd \
lfsbase \
busybox \
nnd-signkey \
alpine-keys \
linux-full \
nnd-s6-linux-init-default \
nnd-s6-services \
busybox \
grub-efi \
iproute2 \
bcnm@edge \
mdevd \
mdev-conf \
utmps \
findmnt \
dosfstools \
e2fsprogs \
btrfs-progs
apk-tools
echo 'NOTE: It is expected that grub would fail to generate a config at this stage, "failed to get canonical path" errors are safe to ignore' >&2
# Set up default resolv.conf (in case no DNS server is configured via DHCP or otherwise)
## TODO: Maybe distribute this via packages?
install -Dm644 <(
cat <<EOF
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
nameserver 1.1.1.1
nameserver 1.0.0.1
EOF
) "$tmpdir"/etc/resolv.conf
# Set-up s6
for bundle in bundle.core bundle.net; do
touch "$tmpdir"/etc/s6/rc/default/contents.d/"$bundle"
done
wrapped nnd-s6 dist
wrapped nnd-s6 generate
wrapped nnd-s6 swap
# Set-up alpine init
## Add btrfs to required initrd modules
## Add btrfs and lvm to required initrd modules
# TODO: Only append and don't replace
install -Dm444 <(
cat <<EOF
features="ata base btrfs cdrom ext4 keymap kms mmc nvme raid scsi usb virtio"
features="ata base lvm btrfs ext4 cdrom keymap kms mmc nvme raid scsi usb virtio"
EOF
) "$tmpdir"/etc/mkinitfs/mkinitfs.conf
wrapped sh -c 'mkinitfs $(find /lib/modules -mindepth 1 -maxdepth 1 -type d)'
# Regenerate grub config
## Provide temporary override for grub, TODO: provide our own grub cfgs eventually
install -Dm444 <(
cat <<EOF
@ -169,13 +165,73 @@ GRUB_CMDLINE_LINUX="root=LABEL=nnd-root rootfstype=btrfs"
EOF
) "$tmpdir"/etc/default/grub
wrapped grub-mkconfig -o /boot/grub/grub.cfg
# Set up default resolv.conf (in case no DNS server is configured via DHCP or otherwise)
## TODO: Maybe distribute this via packages?
install -Dm644 <(
cat <<EOF
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
nameserver 1.1.1.1
nameserver 1.0.0.1
EOF
) "$tmpdir"/etc/resolv.conf
# Set up rest of rootfs
wrapped apk add -v \
nnd \
linux-full \
nnd-s6-linux-init-default \
nnd-s6-services \
grub-efi \
iproute2 \
bcnm@edge \
mdevd \
mdev-conf \
utmps \
findmnt \
dosfstools \
e2fsprogs \
btrfs-progs \
$pkgs
# Install grub to ESP
wrapped grub-install --removable --efi-directory /boot/efi --boot-directory /boot
# Set-up s6
# Set-up extra tty if given
if [ ! -z "$ttys" ]; then
splitargs "$ttys" | \
while read -r tty; do
[ -z "$tty" ] && continue
cp -rv "$tmpdir"/usr/share/nnd/s6/dist/rc/getty.tty1 "$tmpdir"/etc/s6/rc/getty."$tty"
sed -i 's/tty1/'"$tty"'/g' "$tmpdir"/etc/s6/rc/getty."$tty"/run
done
fi
# Set-up services
splitargs "$svcs" | \
while read -r bundle; do
[ -z "$bundle" ] && continue
touch "$tmpdir"/etc/s6/rc/default/contents.d/"$bundle"
done
wrapped nnd-s6 dist
wrapped nnd-s6 generate
wrapped nnd-s6 swap
# Unlock root login
wrapped passwd -ud root
# Provide basic shell for customization
if "$custom"; then
echo "You are now entering your image's shell."
echo "Any customizations made here will remain in the image."
echo "Upon exit, the image will be packed."
wrapped sh || true # Handle graceful exit
fi
# Cleanup
umount -Rv "$tmpdir"
vgchange -a n "$VGN"
rmdir -v "$tmpdir"
losetup -d "$loopback"