diff options
author | Rose Hellsing <rose@pinkro.se> | 2025-09-27 17:36:46 +0200 |
---|---|---|
committer | Rose Hellsing <rose@pinkro.se> | 2025-09-27 17:36:46 +0200 |
commit | c3d0c5f9f22be3d11a3d7fdcf5437f45bc61f2ba (patch) | |
tree | 432171f3aca29e5742011a3844dcb27129ff987f /geninitramfs.sh | |
download | geninitramfs-c3d0c5f9f22be3d11a3d7fdcf5437f45bc61f2ba.tar.gz geninitramfs-c3d0c5f9f22be3d11a3d7fdcf5437f45bc61f2ba.tar.bz2 |
Diffstat (limited to 'geninitramfs.sh')
-rw-r--r-- | geninitramfs.sh | 115 |
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 |