#!/bin/bash # mkinitrd for 2.4/2.6 Kernel by Jim Gifford # modified by Tobias Powalowski for Arch Linux usage # modified to be mkinitramfs by iphitus # modified by S.Çağlar Onur for Pardus usage # obscured by A.Murat Eren so no one can easily understand # made smarter and removed udev dep by Onur Küçük # improved bootsplash usage by Ekin Meroğlu # # Usage Menu # usage () { echo "$0 kernel [options]" echo "" echo " kernel={version} specify kernel to build initramfs for" echo " auto will build for current running kernel (`uname -r`)" echo "" echo " Options:" echo " --full build with all possible modules" echo " --ide exclude ide modules" echo " --scsi exclude scsi modules" echo " --usb exclude usb modules" echo " --cdrom exclude cdrom modules" echo " --fw exclude firewire modules" echo " --fs exclude filesystem modules" echo " --remove-module=MODULE exclude MODULE" echo " --add-module=MODULE include MODULE" echo " instead of /lib/modules" echo "" echo " --fbsplash add fbsplash theme into initramfs (--fbsplash=Pardus)" echo " --fbsplash-resolution add splash theme in specified resolution only (--fbsplash-resolution=1024x768)" echo " --net add some of the preselected ethernet modules" echo " --root-dir=DIR look for modules in ROOT_DIR/lib/modules" echo " --output=DIR create initramfs in DIR" echo "" echo " --quiet no status output during initramfs generation" echo " --show show modules that are included in initramfs" echo "" exit 1 } outp() { if ! [ "$QUIET" == "1" ]; then echo "$*" fi } cleantemp() { rm -rf ${TEMPDIR} } # Default Values ROOT_DIR= QUIET=0 FOUNDMODULES= TEMPDIR=`mktemp -d /tmp/mkinitramfs.XXXXXX` for arg in $*; do if [ "$arg" == "--quiet" ]; then QUIET=1 fi done for option in $*; do case $option in kernel=*) KERNEL_VERSION="`echo $option | awk -F= '{print $2;}'`" ;; kernel_version=*) KERNEL_VERSION="`echo $option | awk -F= '{print $2;}'`" ;; auto) KERNEL_VERSION=`uname -r` esac done KERNEL_NAME="`echo $KERNEL_VERSION | sed -e s@2\.6\.*-@@g`" KERNEL_INITRD="initramfs-${KERNEL_VERSION}" if [ -z "$KERNEL_NAME" ]; then echo "You must specify a kernel to generate an initramfs for" usage fi for option in $*; do case $option in -ide|--ide) REMOVE_IDE="1" outp " Removing IDE Modules" ;; -scsi|--scsi) REMOVE_SCSI="1" outp " Removing SCSI Modules" ;; -cdrom|--cdrom) REMOVE_CDROM="1" outp " Removing CDROM Modules" ;; -usb|--usb) REMOVE_USB="1" outp " Removing USB Modules" ;; -fw|--fw) REMOVE_FW="1" outp " Removing FW Modules" ;; -fs|--fs) REMOVE_FS="1" outp " Removing FILESYSTEM Modules" ;; -module=*|--remove-module=*) NEW_MODULE="`echo $option | awk -F= '{print $2;}'`" outp " Removing Module $NEW_MODULE" REMOVE_MODULE="$REMOVE_MODULE $NEW_MODULE" ;; +module=*|--add-module=*) if [ "$ADD_MODULE" == "" ]; then ADD_MODULE="`echo $option | awk -F= '{print $2;}'`" outp " Adding Module $ADD_MODULE" else NEW_MODULE="`echo $option | awk -F= '{print $2;}'`" outp " Adding Module $NEW_MODULE" ADD_MODULE="$ADD_MODULE $NEW_MODULE" fi ;; --full) # Disable whole subsystems by adding "1" REMOVE_IDE= REMOVE_SCSI= REMOVE_SATA= REMOVE_CDROM= REMOVE_USB= REMOVE_FW= REMOVE_FS= # Define which modules are needed by adding "moduleX moduleY" # empty means all modules are included if they are not disabled above! HOSTCONTROLLER_IDE= HOSTCONTROLLER_SCSI= HOSTCONTROLLER_SATA= HOSTCONTROLLER_USB= FILESYSTEMS= outp " Building full initramfs with all modules" ;; -net|--net) ADD_NET_MODULES=1 outp " Adding some ethernet drivers" ;; --fbsplash=*) FBSPLASH_THEME="`echo $option | awk -F= '{print $2;}'`" ;; --fbsplash-resolution=*) FBSPLASH_RES="`echo $option | awk -F= '{print $2;}'`" ;; --root-dir=*) ROOT_DIR="`echo $option | awk -F= '{print $2;}'`" ;; --output=*) OUTPUT="`echo $option | awk -F= '{print $2;}'`" if [ ! -d $OUTPUT ]; then outp "$OUTPUT dir not found!" exit 1 fi ;; -show|--show) LIST_MODULES=1 ;; --quiet) # already set above ;; esac done # base kernel modules dir KERNEL_DIR="$ROOT_DIR/lib/modules/$KERNEL_VERSION" outp " Making image for kernel $KERNEL_VERSION..." outp "Setting up Parameters..." # # Find Dependencies # finddep () { for module in $MODULES; do ADDMOD=`grep "/$module.ko:" $KERNEL_DIR/modules.dep | awk -F": " '{print $2}' | sed -e "s/ /\n/g" | sed -ne "s#.*/\(.*\)\.ko.*#\1#p"` FOUNDMODULES="$FOUNDMODULES $ADDMOD $module" done } # # Add or Remove IDE Modules # if [ "$REMOVE_IDE" == "1" ]; then PRE_IDE="" IDE_MODULES="" POST_IDE="" else if [ -d $KERNEL_DIR/kernel/drivers/ide/pci ]; then if [ "$HOSTCONTROLLER_IDE" == "" ]; then CHECK="`ls -1 $KERNEL_DIR/kernel/drivers/ide/pci/* > ${TEMPDIR}/ide; \ sed -i -e 's|/.*/||g' -e 's/.ko//g' ${TEMPDIR}/ide; cat ${TEMPDIR}/ide`" for check in $CHECK; do IDE_MODULE="`echo $check`" IDE_MODULES="$IDE_MODULES $IDE_MODULE" done else IDE_MODULES="$HOSTCONTROLLER_IDE" fi if [ "$REMOVE_CDROM" == "1" ]; then if ! [ "$IDE_MODULES" == "" ]; then POST_IDE="ide-disk ide-floppy" else POST_IDE="" fi else if ! [ "$IDE_MODULES" == "" ]; then POST_IDE="ide-disk cdrom ide-cd ide-floppy" else POST_IDE="" fi fi fi fi # # Add or Remove SCSI Modules # if [ "$REMOVE_SCSI" == "1" ]; then PRE_SCSI="" SCSI_MODULES="" POST_SCSI="" else if [ -d $KERNEL_DIR/kernel/drivers/scsi ]; then if [ "$HOSTCONTROLLER_SCSI" == "" ]; then CHECK="`find $KERNEL_DIR/kernel/drivers/scsi/ -name "*.ko" ! -name "sata*" ! -name "ide-scsi*" ! -name "libata*" ! -name "*_cs*" >${TEMPDIR}/scsi; \ find $KERNEL_DIR/kernel/drivers/message/fusion/ -name "*.ko" >>${TEMPDIR}/scsi ; \ find $KERNEL_DIR/kernel/drivers/block/ -name "*.ko" ! -name "*sx8.ko" ! -name "*nbd.ko" ! -name "*pktcdvd.ko" >> ${TEMPDIR}/scsi ; \ sed -i -e 's|/.*/||g' -e 's/.ko//g' ${TEMPDIR}/scsi; cat ${TEMPDIR}/scsi`" for check in $CHECK; do SCSI_MODULE="`echo $check`" SCSI_MODULES="$SCSI_MODULES $SCSI_MODULE" done PRE_SCSI="sd_mod" else PRE_SCSI="sd_mod" SCSI_MODULES="$HOSTCONTROLLER_SCSI" fi if [ "$REMOVE_CDROM" == "1" ]; then POST_SCSI="" else if ! [ "$SCSI_MODULES" == "" ]; then POST_SCSI="cdrom sr_mod" else POST_SCSI="" fi fi fi fi # # Add or Remove SATA Modules # if [ "$REMOVE_SATA" == "1" ]; then PRE_SATA="" SATA_MODULES="" POST_SATA="" else if [ -d $KERNEL_DIR/kernel/drivers/scsi ]; then if [ "$HOSTCONTROLLER_SATA" == "" ]; then CHECK="`find $KERNEL_DIR/kernel/drivers/scsi/ -name "sata*" ! -name "ide-scsi*" ! -name "*_cs*" >${TEMPDIR}/sata; \ find $KERNEL_DIR/kernel/drivers/ata/ -name "*.ko" >> ${TEMPDIR}/sata; \ find $KERNEL_DIR/kernel/drivers/block/ -name "*sx8.ko" >> ${TEMPDIR}/sata; \ find $KERNEL_DIR/kernel/drivers/md/ -name "*.ko" >> ${TEMPDIR}/sata; \ sed -i -e 's|/.*/||g' -e 's/.ko//g' ${TEMPDIR}/sata; cat ${TEMPDIR}/sata`" for check in $CHECK; do SATA_MODULE="`echo $check`" SATA_MODULES="$SATA_MODULES $SATA_MODULE" done PRE_SATA="sd_mod libata" else PRE_SATA="sd_mod libata" SATA_MODULES="$HOSTCONTROLLER_SATA" fi fi fi # # Add or Remove USB Modules # if [ "$REMOVE_USB" == "1" ]; then PRE_USB="" USB_MODULES="" POST_USB="" else PRE_USB="sd_mod usbcore" if [ "$HOSTCONTROLLER_USB" == "" ]; then USB_MODULES="ehci-hcd ohci-hcd uhci-hcd" else USB_MODULES="$HOSTCONTROLLER_USB" fi POST_USB="usb-storage usbhid" fi # Add or Remove FW Modules # if [ "$REMOVE_FW" == "1" ]; then PRE_FW="" FW_MODULES="" POST_FW="" else PRE_FW="sd_mod ieee1394" FW_MODULES="ohci1394" POST_FW="sbp2" fi # # Add or Remove FS Modules # if [ "$REMOVE_FS" == "1" ]; then PRE_FS="" FS_MODULES="" POST_FS="" else PRE_FS="" if [ "$FILESYSTEMS" == "" ]; then FS_MODULES="ext2 reiser4 ext3 jfs reiserfs xfs vfat fat ntfs unionfs cramfs nfs nls_utf8 nls_iso8859_9 nls_cp857 nls_iso8859-1 nls_ascii nls_cp850 squashfs" else FS_MODULES="$FILESYSTEMS" fi POST_FS="" fi if [ "$ADD_NET_MODULES" == "1" ]; then PRE_NET="af_packet mii 8390" NET_MODULES="via-rhine 8139too ne2k-pci e100 sky2 tg3 skge" else PRE_NET="" NET_MODULES="" fi # # Create Module Groups # IDE_MODULES_GROUP="$PRE_IDE $IDE_MODULES $POST_IDE" SCSI_MODULES_GROUP="$PRE_SCSI $SCSI_MODULES $POST_SCSI" SATA_MODULES_GROUP="$PRE_SATA $SATA_MODULES $POST_SATA" USB_MODULES_GROUP="$PRE_USB $USB_MODULES $POST_USB" FW_MODULES_GROUP="$PRE_FW $FW_MODULES $POST_FW" FS_MODULES_GROUP="$PRE_FS $FS_MODULES $POST_FS" NET_MODULES_GROUP="$PRE_NET $NET_MODULES" # # List of All Needed Modules # MODULES="$IDE_MODULES_GROUP $SCSI_MODULES_GROUP $SATA_MODULES_GROUP $USB_MODULES_GROUP $FW_MODULES_GROUP $FS_MODULES_GROUP $NET_MODULES_GROUP $ADD_MODULE" # # Find the module dependencies # finddep # # Initramfs paths MOUNT_IMAGE="${TEMPDIR}/initrd.$$" if [ -z $OUTPUT ]; then INITRD="/boot/$KERNEL_INITRD" else INITRD="$OUTPUT/$KERNEL_INITRD" fi # # Check for Valid Kernel # if [ -e $KERNEL_DIR ]; then outp " $KERNEL_DIR found" else echo "ERROR: $KERNEL_DIR does not exist!" >&2 exit 1 fi # # Create Image # outp "Creating Initial RAM Filesystem in ${INITRD%/*}..." # # Create Directories # mkdir -p $MOUNT_IMAGE mkdir -p $MOUNT_IMAGE/{bin,sbin,etc,dev,lib,newroot,proc,sys} mkdir -p $MOUNT_IMAGE/lib/modules/$KERNEL_VERSION # Basic tty support mknod $MOUNT_IMAGE/dev/null c 1 3 mknod $MOUNT_IMAGE/dev/console c 5 1 mknod $MOUNT_IMAGE/dev/tty c 5 0 mknod $MOUNT_IMAGE/dev/tty1 c 4 0 mknod $MOUNT_IMAGE/dev/ram0 b 1 0 # urandom needed by udhcpc mknod $MOUNT_IMAGE/dev/urandom c 1 9 # loopback devices, we need lots mkdir $MOUNT_IMAGE/dev/loop for i in `seq 0 7`; do mknod "$MOUNT_IMAGE/dev/loop/$i" b 7 "$i" ln -s "loop/$i" "$MOUNT_IMAGE/dev/loop$i" done # Install busybox and init script cp -a /lib/initramfs/busybox $MOUNT_IMAGE/bin/busybox cp -a /lib/initramfs/busybox.links $MOUNT_IMAGE/bin/busybox.links cp -a /usr/bin/disktype $MOUNT_IMAGE/bin/disktype if [ -f "/etc/suspend.conf" ]; then cp -a /etc/suspend.conf $MOUNT_IMAGE/etc/suspend.conf cp -a /usr/sbin/resume $MOUNT_IMAGE/bin/resume fi cd $MOUNT_IMAGE/bin/ # or static lists... for f in `sed 's/.*\///' $MOUNT_IMAGE/bin/busybox.links`; do ln busybox $MOUNT_IMAGE/bin/$f done # create needed modprobe link ln $MOUNT_IMAGE/bin/busybox $MOUNT_IMAGE/sbin/modprobe # install coolplug cp -a /sbin/coolplug $MOUNT_IMAGE/bin/coolplug if [ -f "/sbin/mdadm.static" ]; then cp -a /sbin/mdadm.static $MOUNT_IMAGE/bin/mdadm fi # install init script cp /lib/initramfs/init $MOUNT_IMAGE/init chmod +x $MOUNT_IMAGE/init # install udhcp script cp /lib/initramfs/udhcpc.script $MOUNT_IMAGE/etc/udhcpc.script chmod +x $MOUNT_IMAGE/etc/udhcpc.script # add filesystem check to avoid VFS warnings during boot echo "none none none defaults 0 0" >> $MOUNT_IMAGE/etc/fstab touch $MOUNT_IMAGE/bin/fsck.ext2 touch $MOUNT_IMAGE/bin/fsck.ext3 touch $MOUNT_IMAGE/bin/fsck.reiserfs touch $MOUNT_IMAGE/bin/fsck.xfs # # Copy Modules # # Remove duplicates from the line MODULES=`echo "$FOUNDMODULES"|sed 's@-@_@g'` # Loop through all the modules for module in $MODULES; do REMOVE_MOD="0" # Check blacklist for dead in $REMOVE_MODULE; do dead=`echo $dead|sed 's@-@_@g'` if [ "$dead" = "$module" ]; then REMOVE_MOD="1" fi done # Ensure both - and _ named modules are accounted again modulepath="`find $KERNEL_DIR -name ${module}.ko`" if [ -z "$modulepath" ]; then module=`echo $module|sed 's@_@-@g'` modulepath="`find $KERNEL_DIR -name ${module}.ko`" fi if [ "$modulepath" -a "$REMOVE_MOD" != "1" ]; then # We have to make an ugly hack here, as module-name does not match module_name in modules.alias ugly=`echo "$modulepath"|sed -e 's/.*\///' -e 's/-/_/'` # echo "$modulepath -> $ugly" cp "$modulepath" "$MOUNT_IMAGE/lib/modules/$KERNEL_VERSION/$ugly" COPIED_MODULES="$COPIED_MODULES $module" fi done [ "$LIST_MODULES" = "1" ] && echo "Included modules: `echo $COPIED_MODULES|sed 's@ @\n@g'|sort|uniq`" echo "$COPIED_MODULES" >> $MOUNT_IMAGE/modules # We need modmaps for coolplug autoprobe /sbin/depmod -ae -b $MOUNT_IMAGE -F $ROOT_DIR/lib/modules/$KERNEL_VERSION/System.map $KERNEL_VERSION if [ -f "/sbin/splash" ]; then # Do we have the desired theme ? If not, default to Pardus if [ -n "${FBSPLASH_THEME}" ]; then if [ ! -d "/etc/bootsplash/themes/$FBSPLASH_THEME/config" ]; then outp " Can not find $FBSPLASH_THEME splash theme, using Pardus theme." FBSPLASH_THEME="Pardus" fi else FBSPLASH_THEME="Pardus" fi # Does the theme have desired resolution ? if [ -n "${FBSPLASH_RES}" ]; then if [ ! -f "/etc/bootsplash/themes/$FBSPLASH_THEME/config/bootsplash-$FBSPLASH_RES.cfg" ]; then outp " Splash resolution $FBSPLASH_RES is not available, using standart resolutions." unset FBSPLASH_RES fi fi # List of available resolutions splash_resolutions=$(ls -1 /etc/bootsplash/themes/$FBSPLASH_THEME/config/*.cfg | cut -d "/" -f 7 | cut -d "-" -f 2 | cut -d "." -f 1); # Add fbsplash if [ -n "${FBSPLASH_RES}" ]; then /sbin/splash -s -f /etc/bootsplash/themes/$FBSPLASH_THEME/config/bootsplash-$FBSPLASH_RES.cfg > $MOUNT_IMAGE/bootsplash else for resolution in $splash_resolutions; do /sbin/splash -s -f /etc/bootsplash/themes/$FBSPLASH_THEME/config/bootsplash-$resolution.cfg >> $MOUNT_IMAGE/bootsplash done fi fi # Create initramfs (cd ${MOUNT_IMAGE} && find . | cpio --quiet --dereference -o -H newc | gzip -9 >${INITRD}) # Remove all temp files cleantemp exit 0