Use LVM, allow networking and more misc
This commit is contained in:
parent
4565e95fb3
commit
7f09dcf886
190
make-root.sh
190
make-root.sh
|
@ -10,28 +10,22 @@ errormsg () {
|
||||||
|
|
||||||
# Check deps
|
# Check deps
|
||||||
depcheck() {
|
depcheck() {
|
||||||
if ! which "$1" >/dev/null 2>&1; then
|
for x in $@; do
|
||||||
errormsg "Missing dependency $1, exiting."
|
if ! which "$x" >/dev/null 2>&1; then
|
||||||
fi
|
errormsg "Missing dependency $x, exiting."
|
||||||
|
fi
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
depcheck "fallocate"
|
splitargs() {
|
||||||
depcheck "sfdisk"
|
echo "$1" | sed 's/ /\n/g'
|
||||||
depcheck "mkfs.vfat"
|
}
|
||||||
depcheck "mkfs.ext4"
|
|
||||||
depcheck "mkfs.btrfs"
|
|
||||||
depcheck "mktemp"
|
|
||||||
depcheck "mount"
|
|
||||||
depcheck "mkdir"
|
|
||||||
depcheck "cat"
|
|
||||||
depcheck "install"
|
|
||||||
depcheck "apk"
|
|
||||||
depcheck "bwrap"
|
|
||||||
|
|
||||||
# BWRAP "chrooting"
|
# BWRAP "chrooting"
|
||||||
wrapped() {
|
wrapped() {
|
||||||
bwrap \
|
bwrap \
|
||||||
--unshare-net \
|
--new-session \
|
||||||
|
--die-with-parent \
|
||||||
--unshare-pid \
|
--unshare-pid \
|
||||||
--unshare-uts \
|
--unshare-uts \
|
||||||
--unshare-ipc \
|
--unshare-ipc \
|
||||||
|
@ -44,11 +38,44 @@ wrapped() {
|
||||||
-- $@
|
-- $@
|
||||||
}
|
}
|
||||||
|
|
||||||
image="${1:-nnd-rootfs}"
|
depcheck "fallocate" \
|
||||||
arch="${2:-x86_64}"
|
"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
|
# Set up file as loopback
|
||||||
fallocate -v -l 1G "$image"
|
fallocate -v -l "$size" "$image"
|
||||||
if ! [ -r "$image" ]; then
|
if ! [ -r "$image" ]; then
|
||||||
errormsg "Something went wrong while preallocating sparse image"
|
errormsg "Something went wrong while preallocating sparse image"
|
||||||
fi
|
fi
|
||||||
|
@ -68,14 +95,22 @@ EOT
|
||||||
# Format partitions
|
# Format partitions
|
||||||
mkfs.vfat -n nnd-efi "${loopback}p1"
|
mkfs.vfat -n nnd-efi "${loopback}p1"
|
||||||
mkfs.ext4 -L nnd-boot "${loopback}p2"
|
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
|
# Set up chroot
|
||||||
tmpdir="$(mktemp -d "nnd-image.XXXXXXXXXX")"
|
tmpdir="$(mktemp -d "nnd-image.XXXXXXXXXX")"
|
||||||
if [ -z "$tmpdir" ]; then
|
if [ -z "$tmpdir" ]; then
|
||||||
errormsg "Something went wrong during working directory preparation, bailing out"
|
errormsg "Something went wrong during working directory preparation, bailing out"
|
||||||
fi
|
fi
|
||||||
mount -v -t btrfs "${loopback}p3" "$tmpdir"
|
mount -v -t btrfs "/dev/$VGN/$LVN" "$tmpdir"
|
||||||
|
|
||||||
mkdir -p "$tmpdir/boot"
|
mkdir -p "$tmpdir/boot"
|
||||||
mount -v -t ext4 "${loopback}p2" "$tmpdir/boot"
|
mount -v -t ext4 "${loopback}p2" "$tmpdir/boot"
|
||||||
|
@ -96,7 +131,7 @@ https://dl-cdn.alpinelinux.org/alpine/latest-stable/community
|
||||||
EOF
|
EOF
|
||||||
) "$tmpdir"/etc/apk/repositories
|
) "$tmpdir"/etc/apk/repositories
|
||||||
|
|
||||||
# Set up basic rootfs
|
# Set up bootstrap rootfs
|
||||||
apk add \
|
apk add \
|
||||||
-v \
|
-v \
|
||||||
--initdb \
|
--initdb \
|
||||||
|
@ -104,59 +139,20 @@ apk add \
|
||||||
--root "$tmpdir" \
|
--root "$tmpdir" \
|
||||||
--repositories-file "$tmpdir/etc/apk/repositories" \
|
--repositories-file "$tmpdir/etc/apk/repositories" \
|
||||||
--arch "$arch" \
|
--arch "$arch" \
|
||||||
nnd \
|
|
||||||
lfsbase \
|
lfsbase \
|
||||||
|
busybox \
|
||||||
nnd-signkey \
|
nnd-signkey \
|
||||||
alpine-keys \
|
alpine-keys \
|
||||||
linux-full \
|
apk-tools
|
||||||
nnd-s6-linux-init-default \
|
|
||||||
nnd-s6-services \
|
|
||||||
busybox \
|
|
||||||
grub-efi \
|
|
||||||
iproute2 \
|
|
||||||
bcnm@edge \
|
|
||||||
mdevd \
|
|
||||||
mdev-conf \
|
|
||||||
utmps \
|
|
||||||
findmnt \
|
|
||||||
dosfstools \
|
|
||||||
e2fsprogs \
|
|
||||||
btrfs-progs
|
|
||||||
|
|
||||||
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
|
## Add btrfs and lvm to required initrd modules
|
||||||
|
# TODO: Only append and don't replace
|
||||||
# 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
|
|
||||||
install -Dm444 <(
|
install -Dm444 <(
|
||||||
cat <<EOF
|
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
|
EOF
|
||||||
) "$tmpdir"/etc/mkinitfs/mkinitfs.conf
|
) "$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
|
## Provide temporary override for grub, TODO: provide our own grub cfgs eventually
|
||||||
install -Dm444 <(
|
install -Dm444 <(
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
@ -169,13 +165,73 @@ GRUB_CMDLINE_LINUX="root=LABEL=nnd-root rootfstype=btrfs"
|
||||||
EOF
|
EOF
|
||||||
) "$tmpdir"/etc/default/grub
|
) "$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
|
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
|
# Unlock root login
|
||||||
wrapped passwd -ud root
|
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
|
# Cleanup
|
||||||
umount -Rv "$tmpdir"
|
umount -Rv "$tmpdir"
|
||||||
|
vgchange -a n "$VGN"
|
||||||
rmdir -v "$tmpdir"
|
rmdir -v "$tmpdir"
|
||||||
losetup -d "$loopback"
|
losetup -d "$loopback"
|
||||||
|
|
Loading…
Reference in New Issue