#!/bin/bash # $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/mkinitrd-livecd.sh,v 1.3 2006-02-26 00:53:34 niro Exp $ # mkinitrd-livecd # # Copyright 2005 Red Hat, Inc. # # Written by Erik Troan # # Contributors: # Elliot Lee # Miguel de Icaza # Christian 'Dr. Disk' Hechelmann # Michael K. Johnson # Pierre Habraken # Jakub Jelinek # Carlo Arenas Belon (carenas@chasqui.lared.net.pe> # Keith Owens # Bernhard Rosenkraenzer # Matt Wilson # Trond Eivind Glomsrød # Jeremy Katz # Preston Brown # Bill Nottingham # Guillaume Cottenceau # Peter Jones # heavily modified for magellan-linux by Niels Rogalla umask 0022 export MALLOC_PERTURB_=204 PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH export PATH VERSION=5.0.8 MODULES="" NOSTRIP=false [ -e /etc/conf.d/mkinitrd-livecd ] && . /etc/conf.d/mkinitrd-livecd LINUXRC="/usr/lib/mkinitrd/linuxrc.sh" MODULES_GENERIC="/usr/lib/mkinitrd/modules.generic" MODULES_USB="/usr/lib/mkinitrd/modules.usb" MODULES_SCSI="/usr/lib/mkinitrd/modules.scsi" MODULES_SATA="/usr/lib/mkinitrd/modules.sata" compress=1 allowmissing="" target="" kernel="" force="" verbose="" img_vers="" builtins="" modulefile=/etc/modules.conf rc=0 IMAGESIZE=4000 PRESCSIMODS="sd_mod" fstab="/etc/fstab" vg_list="" die() { echo "Error: $@"; exit 1; } add_initrd() { echo "$@" >> ${DEST}/init || die; } DEST="$(mktemp -d)" IMAGE="$(mktemp)" usage() { echo "usage: $(basename $0) [--version] [--help] [-v] [-f]" echo " [--image-version] [--no-strip] [--nocompress]" echo " " echo echo " (ex: $(basename $0) /boot/initrd-2.2.5-15.img 2.2.5-15)" exit 0 } moduledep() { if [ ! -f "/lib/modules/${kernel}/modules.dep" ] then die "No dep file found for kernel ${kernel}" fi echo "Looking for deps of module $1" deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \ function modname(filename) { match(filename, /\/([^\/]+)\.k?o:?$/, ret); return ret[1] } \ function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \ /^\/lib/ { show(); \ orig=modname($1); dep=""; \ if ($2) { for (i = 2; i <= NF; i++) { dep=sprintf("%s %s", dep, modname($i)); } } } \ /^ / { dep=sprintf("%s %s", dep, modname($1)); } \ END { show(); exit(rc) }' /lib/modules/${kernel}/modules.dep $1) [ -n "${deps}" ] && echo ":${deps}" || echo } findone() { /usr/bin/find "$@" | /bin/awk '{ print $1; exit; }'; } findall() { /usr/bin/find "$@"; } findmodule() { skiperrors="" if [[ $1 = --skiperrors ]] then skiperrors=--skiperrors shift fi local modName=$1 if [ "${modName}" = "off" -o "${modName}" = "null" ] then return fi if [ $(echo ${modName} | cut -b1) = "-" ] then skiperrors=--skiperrors modName=$(echo ${modName} | cut -b2-) fi case "${MODULES} " in *"/${modName}.ko "*) return ;; esac if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)' then echo "module ${modName} assumed to be built in" return fi # special cases if [[ ${modName} = i2o_block ]] then findmodule i2o_core findmodule -i2o_pci modName="i2o_block" elif [[ ${modName} = ppa ]] then findmodule parport findmodule parport_pc modName="ppa" elif [[ ${modName} = sbp2 ]] then findmodule ieee1394 findmodule ohci1394 modName="sbp2" else moduledep ${modName} for i in ${deps} do findmodule ${i} done fi for modExt in o.gz o ko do for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel} do if [ -d ${modDir} ] then fmPath=$(findone ${modDir} -name ${modName}.${modExt}) if [ -f "${fmPath}" ] then break 2 fi fi done done if [ ! -f ${fmPath} ] then if [ -n "${skiperrors}" ] then return fi # ignore the absence of the scsi modules for n in ${PRESCSIMODS} do if [[ ${n} = ${modName} ]] then return fi done if [ -n "${allowmissing}" ] then echo "WARNING: No module ${modName} found for kernel ${kernel}, continuing anyway" return fi die "No module ${modName} found for kernel ${kernel}, aborting." fi # only need to add each module once MODULES="${MODULES} ${fmPath}" } install_kernel_modules() { local list="$1" local module while read module args do case "${module}" in \#*|"") continue ;; esac findmodule ${module} done << EOF $(cat ${list}; echo) EOF # create empty modules.lala file :> ${DEST}/etc/$(basename ${list}) # install detected modules echo "Coping your modules to '${DEST}/lib' ..." for MODULE in ${MODULES} do if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]] then /usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die else cp ${verbose} -a ${MODULE} ${DEST}/lib || die fi # generate modules load file echo "$(basename ${MODULE} .ko)" >> ${DEST}/etc/$(basename ${list}) || die done export ALL_MODULES="${ALL_MODULES} ${MODULES}" unset MODULES } # need r00t privs [[ $(id -u) != 0 ]] && die "you must be r00t." # enforce initramfs method as default [[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=initramfs while [ $# -gt 0 ]; do case $1 in --version) echo "mkinitrd: version ${VERSION}" exit 0 ;; -v) verbose=-v ;; -f) force=1 ;; --nocompress) compress="" ;; --image-version) img_vers=yes ;; --allow-missing) allowmissing=yes ;; --noresume) noresume=1 ;; --help) usage -n ;; --initramfs) IMAGE_TYPE=initramfs ;; --loopback) IMAGE_TYPE=loopback ;; --no-strip) NOSTRIP=true ;; *) if [ -z "${target}" ] then target=$1 elif [ -z "${kernel}" ] then kernel=$1 else usage fi ;; esac shift done # create basic filesystem layout install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot} || die # install busybox echo "$(which busybox.mkinitrd)" install -m0755 $(which busybox.mkinitrd) ${DEST}/bin/busybox || die for i in '[' ash basename cat cut clear cp dirname echo env false find \ grep gunzip gzip ln ls loadkmap mkdir mknod more mount mv \ ps pwd rm rmdir sh sleep test touch true umount uname \ xargs yes chmod chown do # static links ln ${DEST}/bin/busybox ${DEST}/bin/${i} || die "${i}" done # sbin related for i in chroot init losetup modprobe pivot_root do # static links ln ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}" done # install run-init echo "$(which run-init.mkinitrd)" install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die # install insmod.static echo "$(which insmod.static)" install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die # install udev cp -a /etc/udev ${DEST}/etc || die install -m0755 /sbin/udev.static ${DEST}/sbin/udev || die install -m0755 /sbin/udevd.static ${DEST}/sbin/udevd || die install -m0755 /sbin/udevstart.static ${DEST}/sbin/udevstart || die # create some needed device nodes mkdir ${DEST}/dev/pts || die mkdir ${DEST}/dev/shm || die mkdir ${DEST}/dev/mapper || die mkdir ${DEST}/dev/misc || die mkdir ${DEST}/dev/fb || die mkdir ${DEST}/dev/vc || die mknod ${DEST}/dev/console c 5 1 || die mknod ${DEST}/dev/null c 1 3 || die mknod ${DEST}/dev/ram b 1 1 || die mknod ${DEST}/dev/rtc c 10 135 || die mknod ${DEST}/dev/systty c 4 0 || die mknod ${DEST}/dev/tty c 5 0 || die mknod ${DEST}/dev/zero c 1 5 || die for ((i=0; i < 13; i++)) do mknod ${DEST}/dev/tty${i} c 4 ${i} || die "tty${i}" done for ((i=64; i < 68; i++)) do mknod ${DEST}/dev/ttyS$((${i} - 64)) c 4 ${i} || die "ttyS$((${i} - 64))" done ## install kernel modules ## # generic needed install_kernel_modules "${MODULES_GENERIC}" # usb install_kernel_modules "${MODULES_USB}" # scsi install_kernel_modules "${MODULES_SCSI}" # sata install_kernel_modules "${MODULES_SATA}" # show all modules for i in ${ALL_MODULES} do echo ${i} done # install linuxrc install -m0755 ${LINUXRC} ${DEST}/init || die # create the image echo "Creating initrd image '${target}' ..." if [[ ${IMAGE_TYPE} = initramfs ]] then (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE}) cat ${IMAGE} > ${target} || die fi if [[ ${IMAGE_TYPE} = loopback ]] then MOUNTTMP="$(mktemp -d)" # create ext2 img dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die mount -o loop ${IMAGE} ${MOUNTTMP} || die mv ${DEST}/* ${MOUNTTMP} || die umount ${MOUNTTMP} || die gzip -9 ${IMAGE} || die cat ${IMAGE}.gz > ${target} || die [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP} # create inird dir for pivot_root [ ! -d /initrd ] && { install -d /initrd || die; } fi # clean up [ -d ${DEST} ] && rm -rf ${DEST} [ -f ${IMAGE} ] && rm -f ${IMAGE} # all went ok at this point exit 0