mkinitrd

Cool project repo :D
git clone git://git.emmett1.my/mkinitrd.git
Log | Files | Refs

commit 3f0d5ef3d03678a62ec3f0c4cff9e16dc3c35638
parent a389e1424648cf4f8f0f7d94b7144ebd474ac737
Author: emmett1 <emmett1.2miligrams@protonmail.com>
Date:   Sat,  5 Jul 2025 11:19:50 +0800

updated

Diffstat:
MMakefile | 35+++++++++++++++++------------------
DREADME.md | 38--------------------------------------
Dhook/automod.build | 5-----
Dhook/base.build | 15---------------
Dhook/livecd.build | 11-----------
Dhook/livecd.run | 49-------------------------------------------------
Dhook/lvm.build | 8--------
Dhook/modules.build | 12------------
Dhook/udev.build | 18------------------
Dhook/udev.cleanup | 3---
Dhook/udev.run | 7-------
Minit | 182++++++++++++++++++++++++++++++++++---------------------------------------------
Mmkinitrd | 328++++++++++++++++++++++++++++---------------------------------------------------
Dmkinitrd.conf | 29-----------------------------
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"