commit 3f0d5ef3d03678a62ec3f0c4cff9e16dc3c35638
parent a389e1424648cf4f8f0f7d94b7144ebd474ac737
Author: emmett1 <emmett1.2miligrams@protonmail.com>
Date: Sat, 5 Jul 2025 11:19:50 +0800
updated
Diffstat:
14 files changed, 212 insertions(+), 528 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,25 +1,24 @@
-BINDIR = /usr/bin
-DATADIR = /usr/share/mkinitrd
-HOOKDIR = /etc/mkinitrd.d
-IBINDIR = $(DESTDIR)$(BINDIR)
-IDATADIR = $(DESTDIR)$(DATADIR)
-IHOOKDIR = $(DESTDIR)$(HOOKDIR)
+PREFIX = /usr
+BINDIR = $(PREFIX)/bin
+SHAREDIR = $(PREFIX)/share/mkinitrd
+INSTALL = install -D
+
+DESTDIR ?=
+
+.PHONY: all install uninstall
all:
- @echo "Run 'make install' to install"
+ @echo "Nothing to build. Run 'make install' to install files."
install:
- install -d $(IBINDIR)
- install -m755 mkinitrd $(IBINDIR)
- install -d $(IDATADIR)
- install -m755 init $(IDATADIR)
- install -d $(IHOOKDIR)
- install -m644 hook/* $(IHOOKDIR)
- install -m644 mkinitrd.conf $(DESTDIR)/etc/mkinitrd.conf
+ @echo "Installing mkinitrd to $(DESTDIR)$(BINDIR)/mkinitrd"
+ $(INSTALL) -m 755 mkinitrd $(DESTDIR)$(BINDIR)/mkinitrd
+
+ @echo "Installing init to $(DESTDIR)$(SHAREDIR)/init"
+ $(INSTALL) -m 644 init $(DESTDIR)$(SHAREDIR)/init
uninstall:
- rm -f $(IBINDIR)/mkinitrd
- rm -f $(IDATADIR)/init
- rm -f $(DESTDIR)/etc/mkinitrd.conf
+ @echo "Removing installed files from real system..."
+ rm -f $(BINDIR)/mkinitrd
+ rm -f $(SHAREDIR)/init
-.PHONY: all install uninstall
diff --git a/README.md b/README.md
@@ -1,38 +0,0 @@
-# mkinitrd
-`mkinitrd` is a simple initrd generator for linux system. It does support livecd iso, check [guide here](https://github.com/emmett1/mkinitrd/wiki/Make-livecd-ISO) how to do it.
-
-## Install
-Install it is simply running:
-```
-make install
-```
-or use DESTDIR for custom location:
-```
-make DESTDIR=/some/path install
-```
-
-## Dependencies
-- cpio/libarchive
-
-## Usage
-run `mkinitrd -h` to view usage:
-```
-Usage:
- mkinitrd [option] [argument]
-
-Options:
- -k <version> custom kernel version (default: 5.4.44-Venom)
- -o <output> custom output name (default: )
- -i <init> custom init file (default: init)
- -m <modules> add extra modules (comma separated)
- -b <binaries add extra binary (comma separated)
- -f <file> add extra file (comma separated & absolute path)
- -c <config> use custom config (default: )
- -A <hook> add extra hook (comma separated, precedence over -a, -s & HOOKS)
- -a <hook> add extra hook (comma separated, precedence over -s & after HOOKS)
- -s <hook> skip hook defined in HOOKS (comma separated)
- -q quiet mode
-
-```
-## Configuration
-Its configuration is at `/etc/mkinitrd.conf`. You can specify additional binary, files, kernel modules and custom output name for the initrd.
diff --git a/hook/automod.build b/hook/automod.build
@@ -1,5 +0,0 @@
-# build hook autodetect currently loaded modules to include into initrd
-
-for mod in /sys/module/*; do
- modinfo -k $KERNEL ${mod##*/} >/dev/null 2>&1 && add_module ${mod##*/}
-done
diff --git a/hook/base.build b/hook/base.build
@@ -1,15 +0,0 @@
-# build hook for basic binaries, directories, files and stuff
-
-# basic binaries
-for b in bash sh cat cp killall ls mkdir mount umount sed awk sleep ln rm setsid mountpoint tac \
- uname readlink basename modprobe blkid switch_root depmod kmod lsmod insmod chroot chmod; do
- add_binary $b
-done
-
-# add modprobe.d dir
-if [ -d /etc/modprobe.d/ ]; then
- add_dir /etc/modprobe.d/
-fi
-
-# add required terminfo
-add_file /usr/share/terminfo/l/linux
diff --git a/hook/livecd.build b/hook/livecd.build
@@ -1,11 +0,0 @@
-# build hook for livecd
-
-add_binary /usr/lib/udev/cdrom_id
-add_binary blockdev
-add_binary losetup
-
-add_file /usr/lib/udev/rules.d/60-cdrom_id.rules
-
-add_module cdrom
-add_module loop
-add_module overlay
diff --git a/hook/livecd.run b/hook/livecd.run
@@ -1,49 +0,0 @@
-# run hook for livecd only execute when $root is empty
-
-# if root is set, mean not live boot
-[ "$root" ] && return
-
-mkdir $newroot
-
-modprobe loop
-modprobe cdrom
-modprobe overlay
-
-LIVECDLABEL=LIVECD
-MEDIA=/dev/disk/by-label/$LIVECDLABEL
-MEDIUM=/run/initramfs/medium
-SYSTEM=/run/initramfs/system
-WRITEDIR=/run/initramfs/overlayfs/write
-WORKDIR=/run/initramfs/overlayfs/work
-sfsimg=$MEDIUM/boot/filesystem.sfs
-livedelay=${livedelay:-5}
-
-if [ ! -e $MEDIA ]; then
- msg "wait $delay seconds..."
- sleep $delay
- if [ ! -e $MEDIA ]; then
- msg "media is not appeared even after wait $delay seconds..."
- msg "try increase delay by append 'livedelay=<seconds>' to boot cmdline"
- sleep 99999
- fi
-fi
-
-mkdir -p $MEDIUM $SYSTEM $WRITEDIR $WORKDIR
-
-mount -o ro $MEDIA $MEDIUM || problem
-sfs_dev=$(losetup --find --show --read-only $sfsimg) || problem
-mount -o defaults -r $sfs_dev $SYSTEM || problem
-mount -t overlay overlay -o upperdir=$WRITEDIR,lowerdir=$SYSTEM,workdir=$WORKDIR $newroot || problem
-
-# tell system to skip fsck during startup
-> $newroot/fastboot
-
-if [ -d "$MEDIUM"/rootfs ]; then
- cp -Ra "$MEDIUM"/rootfs/* $newroot
-fi
-
-# execute custom script before switch root
-if [ -f $newroot/root/custom_script.sh ]; then
- chmod +x $newroot/root/custom_script.sh
- chroot $newroot sh /root/custom_script.sh
-fi
diff --git a/hook/lvm.build b/hook/lvm.build
@@ -1,8 +0,0 @@
-# build hook for lvm
-
-for i in lvm dmsetup lvchange lvrename lvrename lvextend lvcreate lvdisplay lvscan \
- pvchange pvck pvcreate pvdisplay pvscan \
- vgchange vgcreate vgscan vgrename vgck; do
- add_binary $i
-done
-[ -d /etc/lvm ] && add_dir /etc/lvm
diff --git a/hook/modules.build b/hook/modules.build
@@ -1,12 +0,0 @@
-# build hook to include kernel modules
-
-# kernel modules
-for mod in kernel/crypto kernel/fs kernel/lib kernel/drivers/block kernel/drivers/ata kernel/drivers/md \
- kernel/drivers/firewire kernel/drivers/input kernel/drivers/scsi kernel/drivers/message \
- kernel/drivers/pcmcia kernel/drivers/virtio kernel/drivers/hid kernel/drivers/usb/host kernel/drivers/usb/storage; do
- FTGT="$FTGT /lib/modules/$KERNEL/$mod"
-done
-for m in $(find $FTGT -type f -name "*.ko*" 2> /dev/null); do
- m=${m%*.ko*}
- add_module ${m##*/}
-done
diff --git a/hook/udev.build b/hook/udev.build
@@ -1,18 +0,0 @@
-# build hook to include udev stuffs
-
-add_file /etc/udev/udev.conf
-add_file /usr/lib/udev/rules.d/50-udev-default.rules
-add_file /usr/lib/udev/rules.d/60-persistent-storage.rules
-add_file /usr/lib/udev/rules.d/64-btrfs.rules
-add_file /usr/lib/udev/rules.d/80-drivers.rules
-add_binary udevadm
-add_binary udevd
-add_binary /usr/lib/udev/ata_id
-add_binary /usr/lib/udev/scsi_id
-
-# Add udevd if not in PATH
-if [ -x /lib/udev/udevd ] ; then
- add_binary /lib/udev/udevd
-elif [ -x /lib/systemd/systemd-udevd ] ; then
- add_binary /lib/systemd/systemd-udevd
-fi
diff --git a/hook/udev.cleanup b/hook/udev.cleanup
@@ -1,3 +0,0 @@
-# cleanup hook for udev
-udevadm control --exit
-udevadm info --cleanup-db
diff --git a/hook/udev.run b/hook/udev.run
@@ -1,7 +0,0 @@
-# run hook for udev
-
-udevd --daemon --resolve-names=never
-udevadm trigger --action=add --type=subsystems
-udevadm trigger --action=add --type=devices
-udevadm trigger --action=change --type=devices
-udevadm settle
diff --git a/init b/init
@@ -1,117 +1,93 @@
-#!/bin/sh
-
-export PATH=/bin:/usr/bin:/sbin:/usr/sbin
-
-shell() {
- setsid sh -c 'exec sh </dev/tty1 >/dev/tty1 2>&1'
-}
-
-problem() {
- msg "Encountered a problem, dropping you to a shell."
- shell
-}
-
-msg() {
- [ "$quiet" = y ] && return
- echo ":: $*"
-}
-
-mount_root() {
- mkdir $newroot
- if [ ! "$device" ]; then
- msg "device not scpecified!"
- problem
- fi
- while [ ! -b "$device" ] ; do
- no_device $device
- problem
- done
- if ! mount -n ${rootfstype:+-t $rootfstype} -o ${rwopt:-ro}${rootflags:+,$rootflags} "$device" "$newroot" ; then
- msg "failed mount root device: $device"
- shell
- fi
-}
-
-parse_cmdline() {
- read -r cmdline < /proc/cmdline
-
- for param in $cmdline ; do
- case $param in
- *=*) key=${param%%=*}; value=${param#*=} ;;
- '#'*) break ;;
- *) key=$param
- esac
- case $key in
- ro|rw) rwopt=$key ;;
- [![:alpha:]_]*|[[:alpha:]_]*[![:alnum:]_]*) ;;
- *) eval "$key"=${value:-y} ;;
- esac
- unset key value
- done
-
- case "$root" in
- /dev/* ) device=$root ;;
- UUID=* ) eval $root; device="/dev/disk/by-uuid/$UUID" ;;
- PARTUUID=*) eval $root; device="/dev/disk/by-partuuid/$PARTUUID" ;;
- LABEL=* ) eval $root; device="/dev/disk/by-label/$LABEL" ;;
- esac
-}
+#!/bin/busybox sh
+
+/bin/busybox --install -s /bin
+
+clear
+NEWROOT=/newroot
+INITRAMFS=/run/initramfs
+MEDIA=$INITRAMFS/media
init=/sbin/init
root=
-newroot=/.root
rootdelay=
rootfstype=auto
ro="ro"
rootflags=
device=
-
-mount -t proc proc /proc -o nosuid,noexec,nodev
-mount -t sysfs sys /sys -o nosuid,noexec,nodev
-mount -t devtmpfs dev /dev -o mode=0755,nosuid
-mount -t tmpfs run /run -o nosuid,nodev,mode=0755
-
-parse_cmdline
-
-if [ "$break" = y ] || [ "$break" = pre-mount ]; then
- msg "break pre-mount requested."
- shell
-fi
-
-# run hook
-if [ -f /runhook.order ]; then
- for hook in $(cat /runhook.order); do
- if [ -f /etc/mkinitrd.d/$hook.run ]; then
- msg "running run hook: $hook"
- . /etc/mkinitrd.d/$hook.run
- fi
- done
+resume=
+noresume=false
+
+mkdir -p $NEWROOT
+mount -t proc proc /proc
+mount -t sysfs sysfs /sys
+mount -t tmpfs run /run
+mount -t devtmpfs dev /dev
+
+read -r cmdline < /proc/cmdline
+
+for param in $cmdline; do
+ case $param in
+ init=* ) init=${param#init=} ;;
+ root=* ) root=${param#root=} ;;
+ rootdelay=* ) rootdelay=${param#rootdelay=} ;;
+ rootfstype=*) rootfstype=${param#rootfstype=} ;;
+ rootflags=* ) rootflags=${param#rootflags=} ;;
+ resume=* ) resume=${param#resume=} ;;
+ noresume ) noresume=true ;;
+ ro ) ro="ro" ;;
+ rw ) ro="rw" ;;
+ shell ) shell=1 ;;
+ esac
+done
+
+# mdev
+[ -f /proc/sys/kernel/hotplug ] && \
+ echo $(which mdev) > /proc/sys/kernel/hotplug
+mdev -s
+
+# load kernel modules
+find /sys -name 'modalias' -type f -exec cat '{}' + | sort -u | xargs modprobe -b -a 2>/dev/null
+
+for k in ext4 xfs btrfs f2fs jfs reiserfs vfat; do
+ modprobe $k 2>/dev/null
+done
+
+[ "$shell" ] && sh
+
+[ "$rootflags" ] && rootflags="$rootflags,"
+rootflags="$rootflags$ro"
+
+case "$root" in
+ /dev/* ) device=$root ;;
+ UUID=* ) eval $root; device="/dev/disk/by-uuid/$UUID" ;;
+ PARTUUID=*) eval $root; device="/dev/disk/by-partuuid/$PARTUUID" ;;
+ LABEL=* ) eval $root; device="/dev/disk/by-label/$LABEL" ;;
+ "" ) echo "No root device specified." ; sh;;
+esac
+
+while [ ! -b "$device" ] ; do
+ echo "device '$device' not found"
+ sh
+done
+
+if ! mount -n -t "$rootfstype" -o "$rootflags" "$device" $NEWROOT; then
+ echo "failed to mount device '$device'"
+ cat /proc/partitions
+ sh
fi
-# mount root device is root is set
-if [ "$root" ]; then
- msg "mounting root: $root"
- mount_root
-fi
+[ "$shell" ] && sh
-# run cleanup hook
-if [ -f /cleanuphook.order ]; then
- for hook in $(tac /cleanuphook.order); do
- if [ -f /etc/mkinitrd.d/$hook.cleanup ]; then
- msg "running cleanup hook: $hook"
- . /etc/mkinitrd.d/$hook.cleanup
- fi
- done
-fi
+mount --move /sys $NEWROOT/sys
+mount --move /proc $NEWROOT/proc
+mount --move /dev $NEWROOT/dev
+mount --move /run $NEWROOT/run
-if [ ! -d "$newroot" ] || [ ! "$(mountpoint $newroot)" ]; then
- msg "seems no root device mounted on newroot."
- problem
-fi
-mount --move /proc $newroot/proc
-mount --move /sys $newroot/sys
-mount --move /dev $newroot/dev
-mount --move /run $newroot/run
+# switch to newroot
+clear
+exec /bin/switch_root $NEWROOT /sbin/init $@
-exec switch_root $newroot "$init" "$@"
+echo "This is the end of initramfs"
+echo "Nothing further, here's the shell"
+/bin/busybox sh
diff --git a/mkinitrd b/mkinitrd
@@ -1,247 +1,151 @@
#!/bin/sh
-add_file() {
- # add_file file
- [ "$1" ] || return
+add_kmod() {
while [ "$1" ]; do
- if [ -f $1 ]; then
- file=$1
- else
- msgwarn "missing file: $1"
- return
- fi
- if [ -L $file ]; then
- add_file $(readlink -f $file)
- fi
- [ "${file#/}" = "$file" ] && { msgwarn "absolute source path needed: $file"; return; }
- mkdir -p $INITRDDIR/${file%/*}
- install $file $INITRDDIR/${file%/*}
- shift
- done
-}
-
-add_binary() {
- # add_binary binary
- [ "$1" ] || return
- while [ "$1" ]; do
- bin=$(command -v $1)
- [ "$bin" ] || { msgwarn "missing binary: $1"; return; }
- [ -x $INITRDDIR/$bin ] && return
- add_file $bin
- for i in $(ldd $bin | sed "s/\t//" | cut -d " " -f1); do
- case $i in
- linux-vdso.so.1|linux-gate.so.1) continue;;
- esac
- lib=$(PATH=/lib:/lib64:/usr/lib:/usr/lib64 command -v $i)
- [ "$lib" ] || { msgwarn "missing library: $i"; continue; }
- [ -e $INITRDDIR/$lib ] && continue
- add_file $lib
+ kmod=$1; shift
+ path=$(busybox modinfo -k $K -F filename $kmod 2>/dev/null)
+ [ "$path" ] || continue
+ [ -f $W/$path ] && continue
+ add_file $path
+ for firmware in $(busybox modinfo -k $K -F firmware $kmod); do
+ [ -f /lib/firmware/$firmware.xz ] && add_file /lib/firmware/$firmware.xz
+ [ -f /lib/firmware/$firmware ] && add_file /lib/firmware/$firmware
done
- shift
- done
-}
-
-add_module() {
- # add_module modname
- [ "$1" ] || return
- while [ "$1" ]; do
- if [ "$(modinfo -k $KERNEL $1)" ]; then
- modname=$(modinfo -k $KERNEL -F name $1 | cut -d ' ' -f1 | head -n1)
- [ "$modname" = "name:" ] && return 0
- modpath=$(modinfo -k $KERNEL -F filename $1 | cut -d ' ' -f1 | head -n1)
- [ "$modpath" = "(builtin)" ] && return 0
- else
- msgwarn "missing module: $1"
- return
- fi
- [ -f $INITRDDIR/$modpath ] && return
- add_file "$modpath" #lib/modules/$KERNEL/kernel/$(basename $modpath)
- modinfo -F firmware -k $KERNEL $modname | while read -r line; do
- if [ ! -f /lib/firmware/$line ]; then
- msgwarn "missing firmware for $modname: $line"
- else
- add_file /lib/firmware/$line
- fi
+ for depends in $(busybox modinfo -k $K -F depends $kmod | tr ',' ' '); do
+ [ "$depends" ] || continue
+ add_kmod $depends
done
- m=$(modinfo -F depends -k $KERNEL $modname | tr ',' ' ')
- [ "$m" ] && add_module $m
- shift
done
}
-add_dir() {
- # add_dir source
- [ "$1" ] || return
+add_bin() {
while [ "$1" ]; do
- [ -d $1 ] || { msgerr "directory not exist: $1"; return; }
- set -- ${1%/} # crunch last slash (/)
- mkdir -p $INITRDDIR/${1%/*}
- cp -ra $1 $INITRDDIR/${1%/*}
- shift
- done
-}
-
-usage() {
- cat << EOF
-Usage:
- $(basename $0) [option] [argument]
-
-Options:
- -k <version> custom kernel version (default: $KERNEL)
- -o <output> custom output name (default: $INITRAMFS)
- -i <init> custom init file (default: $INITIN)
- -m <modules> add extra modules (comma separated)
- -b <binaries add extra binary (comma separated)
- -f <file> add extra file (comma separated & absolute path)
- -c <config> use custom config (default: $CONFIG)
- -A <hook> add extra hook (comma separated, precedence over -a, -s & HOOKS)
- -a <hook> add extra hook (comma separated, precedence over -s & after HOOKS)
- -s <hook> skip hook defined in HOOKS (comma separated)
- -q quiet mode
- -h print this help msg
-
-EOF
-}
-
-needarg() {
- if [ ! "$1" ]; then
- echo "ERROR: argument is needed for this option!"
- exit 1
- fi
-}
-
-parse_opt() {
- while [ "$1" ]; do
- case $1 in
- -k) KERNEL=$2;;
- -o) OUTPUT=$2;;
- -i) INITIN=$2;;
- -c) CONFIG=$2;;
- -A) ADDEARLYHOOKS="$ADDEARLYHOOKS $2";;
- -a) ADDHOOKS="$ADDHOOKS $2";;
- -s) SKIPHOOKS="$SKIPHOOKS $2";;
- -m) ADDMODULES="$ADDMODULES $2";;
- -b) ADDBINARIES="$ADDBINARIES $2";;
- -f) ADDFILES="$ADDFILES $2";;
- -h) usage; exit 0 ;;
- *) msgerr "Invalid option '$1'"; exit 1 ;;
+ bin=$(which $1); shift
+ [ "$bin" ] || {
+ echo "FAILED: $bin: missing binary"
+ continue
+ }
+ add_file "$bin"
+ [ -L "$bin" ] && bin=$(readlink -f $bin)
+ case $(file -bi $bin) in
+ application/x-pie-executable*)
+ for file in $(ldd $bin | awk '{print $3}'); do
+ add_file $file
+ done;;
esac
- shift 2
done
}
-cleanup() {
- rm -fr "$INITRDDIR"
+add_file() {
+ f=$1
+ t=$2
+ m=$3
+ [ -f "$1" ] || {
+ echo "FAILED: $f: missing file"
+ return
+ }
+ if [ -L "$f" ]; then
+ add_file $(readlink -f $1)
+ fi
+ install $([ "$m" ] && echo "-m $m") -D $f $W${2:-$f} 2>/dev/null
+ echo "$([ "$?" = 0 ] && echo OK || echo FAILED): $f"
}
-interrupted() {
- cleanup
- exit 1
-}
+K=$(uname -r)
+W=/tmp/mkinitrd-xxx
+O=initrd
+I=/usr/share/mkinitrd/init
+
+while [ "$1" ]; do
+ case $1 in
+ -k) K=$2; shift;;
+ -i) I=$2; shift;;
+ -a) A=1;;
+ -h) H=1;;
+ *) O=$1;;
+ esac
+ shift
+done
-echo() {
- [ "$QUIET" ] && return
- command echo "$*"
-}
+if [ "$H" ]; then
+ cat <<EOF
+mkinitrd: busybox based initramfs generator.
-msg() {
- echo ":: $*"
-}
+Usage: $0 [-ah] [-k kernel] [-i init] [ OUTPUT ]
-msgwarn() {
- echo "WARNING: $*"
-}
+ -a Auto detect kernel modules
+ -i init Use custom init file (default: /usr/share/mkinitrd/init)
+ -k kernel kernel version
+ -h Show this help message
+EOF
+exit 0
+fi
-msgerr() {
- echo "ERROR: $*"
+if [ "$(id -u)" != 0 ]; then
+ echo "error: this program need to run as root"
exit 1
-}
-
-KERNEL=$(uname -r)
-DATADIR=/usr/share/mkinitrd
-INITIN=init
-HOOKDIR=/etc/mkinitrd.d
-CONFFILE=/etc/mkinitrd.conf
-INITRD=initrd-$KERNEL.img
-
-CPIO=$(command -v cpio)
-CPIO=$(command -v bsdcpio)
-
-parse_opt $@
-
-[ "$(id -u)" = "0" ] || msgerr "need root access!"
-[ -d "/lib/modules/$KERNEL" ] || msgerr "No modules directory named $KERNEL"
-[ "$CPIO" ] || msgerr "Either 'cpio' nor 'bsdcpio' not found."
-[ -f "$CONFFILE" ] || msgerr "Config file not found: $CONFFILE"
+fi
-. "$CONFFILE"
+M=/lib/modules/$K
-if [ "$OUTPUT" ]; then
- [ -d "$OUTPUT" ] && msgerr "'$OUTPUT' is a directory."
- #[ -d ${OUTPUT%/*} ] || msgerr "directory '${OUTPUT%/*}' for output '$(basename $OUTPUT)' not exist."
- INITRD="$OUTPUT"
+if [ ! -d "$M" ]; then
+ echo "error: kernel modules directory '$M' not found"
+ exit 1
fi
-# filter out skip hooks (-s)
-if [ "$SKIPHOOKS" ]; then
- for s in $SKIPHOOKS; do
- HOOKS=$(echo $HOOKS | tr ' ' '\n' | grep -vx $s)
- done
-fi
-
-[ "$ADDHOOKS" ] && HOOKS="$HOOKS $ADDHOOKS" # add extra hooks (-a)
-[ "$ADDEARLYHOOKS" ] && HOOKS="$ADDEARLYHOOKS $HOOKS" # add extra early hooks (-A)
-[ "$ADDMODULES" ] && MODULES="$MODULES $ADDMODULES" # add extra modules (-m)
-[ "$ADDFILES" ] && FILES="$FILES $ADDFILES" # add extra files (-f)
-[ "$ADDBINARIES" ] && BINARIES="$BINARIES $ADDBINARIES" # add extra binary (-b)
+if [ ! -f "$M"/modules.dep ]; then
+ echo "error: modules.dep file not found, please run 'depmod' first"
+ exit 1
+fi
-trap "interrupted" 1 2 3 15
+if [ ! "$(command -v busybox)" ]; then
+ echo "error: busybox not found in PATH, please install busybox"
+ exit 1
+fi
-# create a temporary working directory
-INITRDDIR=$(mktemp -d /tmp/initrd-work.XXXXXXXXXX)
+if [ ! -f "$I" ]; then
+ echo "error: init file '$I' not found"
+ exit 1
+fi
-echo "Generating initrd... "
+rm -rf $W
+mkdir -p $W/$M
-# make required dirs
-for d in dev run sys proc; do
- mkdir -p $INITRDDIR/$d
+for d in bin dev etc lib proc run sys; do
+ mkdir -p $W/$d
done
-ln -s . $INITRDDIR/usr
-
-# add the init file
-cp $DATADIR/$INITIN $INITRDDIR/init
-chmod +x $INITRDDIR/init
-
-# run hook
-for hook in $HOOKS; do
- # run build hook
- if [ -f "$HOOKDIR/$hook.build" ]; then
- msg "running build hook: $hook"
- . $HOOKDIR/$hook.build
- fi
- # add run & cleanup hook and list the order
- if [ -f "$HOOKDIR/$hook.run" ]; then
- add_file $HOOKDIR/$hook.run
- echo $hook >> $INITRDDIR/runhook.order
- fi
- if [ -f "$HOOKDIR/$hook.cleanup" ]; then
- add_file $HOOKDIR/$hook.cleanup
- echo $hook >> $INITRDDIR/cleanuphook.order
- fi
-done
-
-[ "$BINARIES" ] && add_binary $BINARIES
-[ "$MODULES" ] && add_module $MODULES
-[ "$FILES" ] && add_file $FILES
+ln -s . $W/usr
+ln -s bin $W/sbin
+ln -s lib $W/lib64
-add_file /lib/modules/$KERNEL/modules.*
-depmod -b $INITRDDIR $KERNEL
+if [ "$A" ]; then
+ for i in /sys/module/*; do
+ add_kmod ${i##*/}
+ done
+else
+ for d in \
+ crypto fs lib drivers/block drivers/md drivers/ata \
+ drivers/firewire drivers/input/keyboard drivers/input/mouse \
+ drivers/scsi drivers/message drivers/pcmcia drivers/virtio \
+ drivers/usb/host drivers/usb/storage drivers/hid;
+ do
+ for f in $(find $M/kernel/$d -name *.ko*); do
+ f=${f##*/}; f=${f%.ko*}
+ add_kmod $f
+ done
+ done
+fi
+add_file $M/modules.builtin
+add_file $M/modules.order
+busybox depmod -b $W $K
-( cd $INITRDDIR ; find . | LANG=C $CPIO -o -H newc --quiet | gzip -9 ) > $INITRD
+add_bin busybox
+add_file $I / 755
-# Remove the temporary directories
-cleanup
+echo '$MODALIAS=.* 0:0 660 @modprobe "$MODALIAS' > $W/etc/mdev.conf
-echo "Generating initrd done: $INITRD ($(du -sh $INITRD | awk '{print $1}'))"
+( cd $W ; find . | cpio -o -H newc --quiet | gzip -9 ) > "$O"
+du -sh "$O"
+rm -rf $W
exit 0
diff --git a/mkinitrd.conf b/mkinitrd.conf
@@ -1,29 +0,0 @@
-#
-# This file is sourced by mkinitrd
-#
-
-# add your extra binaries to initrd
-# for binary outside PATH, enter absolute path
-# shared libraries will automatically detected and added
-BINARIES=""
-
-# add your extra files from your system to initrd
-# use absolute path
-# if symlink, real file automatically detected and added
-FILES=""
-
-# add your extra kernel modules to initrd
-# module dependencies will automatically detected and added
-# firmware also automatically detected and added
-MODULES=""
-
-# build/run/cleanup hook
-# hook directory is /etc/mkinitrd.d
-# only build hook (*.build) will be executed when building initrd
-# run (*.run) and cleanup (*.cleanup) hook if exist will be added into initrd
-# order is matter for run and cleanup hook
-# cleanup hook will be executed reversely
-HOOKS="base udev modules"
-
-# change custom name and path for initrd output
-#INITRD="initrd-$KERNEL.img"