summaryrefslogtreecommitdiff
path: root/geninitramfs.sh
diff options
context:
space:
mode:
authorRose Hellsing <rose@pinkro.se>2025-09-27 17:36:46 +0200
committerRose Hellsing <rose@pinkro.se>2025-09-27 17:36:46 +0200
commitc3d0c5f9f22be3d11a3d7fdcf5437f45bc61f2ba (patch)
tree432171f3aca29e5742011a3844dcb27129ff987f /geninitramfs.sh
downloadgeninitramfs-c3d0c5f9f22be3d11a3d7fdcf5437f45bc61f2ba.tar.gz
geninitramfs-c3d0c5f9f22be3d11a3d7fdcf5437f45bc61f2ba.tar.bz2
Add geninitramfs scriptHEADmain
Diffstat (limited to 'geninitramfs.sh')
-rw-r--r--geninitramfs.sh115
1 files changed, 115 insertions, 0 deletions
diff --git a/geninitramfs.sh b/geninitramfs.sh
new file mode 100644
index 0000000..21bbe83
--- /dev/null
+++ b/geninitramfs.sh
@@ -0,0 +1,115 @@
+#!/bin/bash
+
+copy_binary() {
+ BINARY="$1"
+ PREFIX="$2"
+ ldd "${BINARY}" | awk '{print $3}' | grep '^/' | \
+ while read lib; do
+ if [ -f "${lib}" ]; then
+ mkdir -p $(dirname "${PREFIX}/${lib}")
+ cp --archive "${lib}" "${PREFIX}/${lib}"
+ cp --archive $(readlink -f "${lib}") $(dirname "${PREFIX}/${lib}")/
+ fi
+ done
+
+ cp --archive "${BINARY}" "${PREFIX}${BINARY}"
+}
+
+INITROOT="./initroot"
+
+mkdir -p ${INITROOT}
+
+mkdir -p ${INITROOT}/{dev,etc,mnt/root,proc,root,sys,run,usr/share,usr/bin,usr/lib,usr/libexec,usr/lib/modules}
+
+cd ${INITROOT}
+ln -s usr/bin bin
+ln -s usr/bin sbin
+
+cd usr
+ln -s bin sbin
+ln -s lib lib64
+cd ..
+
+ln -s usr/lib lib
+ln -s usr/lib lib64
+cd ..
+
+cp --archive /dev/{null,console,tty,nvme0n1,nvme0n1p2,zfs} ${INITROOT}/dev/
+
+cp --archive /lib64/ld-linux-x86* ${INITROOT}/usr/lib/
+
+copy_binary /usr/bin/zfs ${INITROOT}
+copy_binary /usr/bin/mount.zfs ${INITROOT}
+copy_binary /usr/bin/zpool ${INITROOT}
+
+cp --archive /usr/bin/busybox ${INITROOT}/bin/busybox
+
+cp --archive /usr/libexec/zfs ${INITROOT}/usr/libexec/zfs
+cp --archive /usr/share/zfs ${INITROOT}/usr/share/zfs
+
+cp --archive /usr/lib/modules/$(uname -r) ${INITROOT}/usr/lib/modules/
+
+pushd ${INITROOT}/usr/lib/modules/$(uname -r)/kernel
+rm -r drivers/gpu
+rm -r drivers/firewire
+rm -r drivers/gpio
+rm -r drivers/leds
+rm -r drivers/media
+rm -r drivers/net
+rm -r drivers/vfio
+rm -r drivers/virtio
+rm -r drivers/virt
+rm -r drivers/soundwire
+rm -r drivers/firmware
+rm -r drivers/i2c
+rm -r drivers/iommu
+rm -r drivers/misc
+rm -r drivers/powercap
+rm -r drivers/pwm
+rm -r drivers/scsi
+rm -r drivers/usb
+rm -r drivers/hid
+rm -r drivers/extcon
+rm -r drivers/mux
+rm -r drivers/thermal
+rm -r drivers/vdpa
+rm -r drivers/dma
+rm -r lib/test*
+rm -r net
+rm -r sound
+rm -r fs
+rm -r mm
+popd
+
+cp --archive ./extras/* ${INITROOT}/
+
+cd ${INITROOT}
+
+cat > init <<EOF
+#!/bin/busybox sh
+
+rescue_shell() {
+ echo "Oopsies something broke :("
+ exec sh
+}
+
+mount -t proc none /proc
+mount -t sysfs none /sys
+
+modprobe zfs
+
+zpool import -N -d /dev/nvme0n1p2 soil || rescue_shell
+
+zfs load-key soil || rescue_shell
+
+mount.zfs -o zfsutil soil/ROOT/gentoo /mnt/root || rescue_shell
+
+umount /proc
+umount /sys
+
+exec switch_root /mnt/root /sbin/init
+EOF
+
+chmod +x init
+
+find . -print0 | cpio --null --create --verbose --format=newc | gzip --best > ../initramfs-$(uname -r).img