aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tmp/mkinitrd603
1 files changed, 603 insertions, 0 deletions
diff --git a/tmp/mkinitrd b/tmp/mkinitrd
new file mode 100644
index 0000000..d29a497
--- /dev/null
+++ b/tmp/mkinitrd
@@ -0,0 +1,603 @@
+#!/bin/bash
+
+# mkinitrd
+#
+# Written by Erik Troan <ewt@redhat.com>
+#
+# Contributors:
+# Elliot Lee <sopwith@cuc.edu>
+# Miguel de Icaza <miguel@nuclecu.unam.mx>
+# Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
+# Michael K. Johnson <johnsonm@redhat.com>
+# Pierre Habraken <Pierre.Habraken@ujf-grenoble.fr>
+# Jakub Jelinek <jakub@redhat.com>
+# Carlo Arenas Belon (carenas@chasqui.lared.net.pe>
+# Keith Owens <kaos@ocs.com.au>
+# Bernhard Rosenkraenzer <bero@redhat.com>
+# Matt Wilson <msw@redhat.com>
+#
+# Patched for Mandrake by Guillaume Cottenceau <gc at mandrakesoft.com>
+#
+
+PATH=/sbin:$PATH
+export PATH
+
+VERSION=3.1.6-mdk
+
+compress=1
+target=""
+kernel=""
+force=""
+verbose=""
+MODULES=""
+img_vers=""
+modulefile=/etc/modules.conf
+tmpdir=
+
+splash_script=/usr/share/bootsplash/scripts/
+splash=auto
+
+IMAGESIZE=100
+PRESCSIMODS="scsi_mod sd_mod unknown"
+fstab="/etc/fstab"
+IGNOREMODS="$IGNOREMODS ppa imm ide-scsi ext2 usb-storage"
+
+[[ -f /etc/sysconfig/installkernel ]] && source /etc/sysconfig/installkernel
+[[ -n $SPLASH ]] && splash=$SPLASH
+
+usage () {
+ echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]" >&2
+ echo " [--omit-scsi-modules] [--omit-raid-modules] [--splash=[auto|resolution] [--with=<module>]" >&2
+ echo " [--image-version] [--fstab=<fstab>] [--nocompress] [--tmpdir=<tmpdir>]" >&2
+ echo " <initrd-image> <kernel-version>" >&2
+ echo " (ex: `basename $0` /boot/initrd-$(uname -r).img $(uname -r))" >&2
+ exit 1
+}
+
+findmodule() {
+ skiperrors=""
+ modName=$1
+ if [ $(echo $modName | cut -b1) = "-" ]; then
+ skiperrors=1
+ modName=$(echo $modName | cut -b2-)
+ fi
+
+ if [ "$modName" = "i2o_block" ]; then
+ findmodule i2o_pci
+ findmodule i2o_core
+ modName="i2o_block"
+ fi
+
+ if [ "$modName" = "pluto" ]; then
+ findmodule fc4
+ findmodule soc
+ modName="pluto"
+ fi
+
+ if [ "$modName" = "fcal" ]; then
+ findmodule fc4
+ findmodule socal
+ modName="fcal"
+ fi
+
+ if [ "$modName" = "xfs" ]; then
+ if [ -n "$skiperrors" ]; then
+ findmodule -pagebuf
+ else
+ findmodule pagebuf
+ fi
+ findmodule xfs_support
+ if [ -n "$skiperrors" ]; then
+ findmodule -xfs_dmapi
+ else
+ findmodule xfs_dmapi
+ fi
+ modName="xfs"
+ fi
+
+ if [ "$modName" = "ext3" ]; then
+ if [ -n "$skiperrors" ]; then
+ findmodule -jbd
+ else
+ findmodule jbd
+ fi
+ modName="ext3"
+ fi
+
+ for i in $IGNOREMODS; do
+ [ "$i" = "$modName" ] && return
+ done
+
+ fmPath=`(cd /lib/modules/$kernel; find -type f -name $modName.o | grep -v build)`
+
+ if [ -n "$fmPath" ]; then
+ # only need to add each module once
+ if echo $MODULES | grep $fmPath >/dev/null 2>&1 ; then : ; else
+ MODULES="$MODULES $fmPath"
+ fi
+ else
+ fmPath=`(cd /lib/modules/$kernel; find -type f -name $modName.o.gz | grep -v build)`
+
+ if [ -n "$fmPath" ]; then
+ # only need to add each module once
+ if echo $MODULES | grep $fmPath >/dev/null 2>&1 ; then : ; else
+ zfmPath=`echo $fmPath | sed s/\.gz//`
+ MODULES="$MODULES $zfmPath"
+ fi
+ fi
+ fi
+
+ if [ -z "$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;
+
+ echo "No module $modName found for kernel $kernel" >&2
+ exit 1
+ fi
+
+}
+
+is_good_fs() {
+ local parttype= tmpname=
+ local dir=$1
+ [[ -d $dir ]] || return 1
+ [[ -w $dir ]] || return 1
+ [[ $dir == */ ]] && dir=${dir%/}
+ parttype=$(awk "{if (\$2 == \""$dir"\") print \$3 }" /proc/mounts)
+
+ while tmpname=${dir%/*} && [[ -z $parttype ]];do
+ [[ -z $tmpname ]] && tmpname=/
+ parttype=$(awk "{if (\$2 == \""$tmpname"\") print \$3 }" /proc/mounts)
+ dir=$tmpname
+ done
+
+ case $parttype in
+ nfs|tmpfs) return 1;;
+ *) return 0;
+ esac
+
+}
+
+inst() {
+ if [ "$#" != "2" ];then
+ echo "usage: inst <file> <destination>"
+ return
+ fi
+ [ -n "$verbose" ] && echo "$1 -> $2"
+ cp $1 $2
+}
+
+is_ix86() {
+ if [ -n "`uname -m | grep i.86`" ]; then return 0; fi
+ return 1
+}
+
+is_ppc() {
+ if [ -n "`uname -m | grep ppc`" ]; then return 0; fi
+ return 1
+}
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ --fstab*)
+ if echo $1 | grep '=' >/dev/null ; then
+ fstab=`echo $1 | sed 's/^--fstab=//'`
+ else
+ fstab=$2
+ shift
+ fi
+ ;;
+
+ --tmpdir*)
+ if echo $1 | grep '=' >/dev/null ; then
+ tmpdir=`echo $1 | sed 's/^--tmpdir=//'`
+ else
+ tmpdir=$2
+ shift
+ fi
+ ;;
+ --with*)
+ if echo $1 | grep '=' >/dev/null ; then
+ modname=`echo $1 | sed 's/^--with=//'`
+ else
+ modname=$2
+ shift
+ fi
+
+ basicmodules="$basicmodules $modname"
+ ;;
+
+ --version)
+ echo "mkinitrd: version $VERSION"
+ exit 0
+ ;;
+
+ -v)
+ verbose=-v
+ ;;
+
+ --nocompress)
+ compress=""
+ ;;
+
+ --ifneeded)
+ ifneeded=1
+ ;;
+
+ -f)
+ force=1
+ ;;
+ --preload)
+ if echo $1 | grep '=' >/dev/null ; then
+ modname=`echo $1 | sed 's/^--preload=//'`
+ else
+ modname=$2
+ shift
+ fi
+ PREMODS="$PREMODS $modname"
+ ;;
+ --omit-scsi-modules)
+ PRESCSIMODS=""
+ noscsi=1;
+ ;;
+ --omit-raid-modules)
+ noraid=1;
+ ;;
+ --image-version)
+ img_vers=yes
+ ;;
+ --splash)
+ if echo $1 | grep '=' >/dev/null ; then
+ splash=`echo $1 | sed 's/^--splash=//'`
+ else
+ splash=$2
+ shift
+ fi
+ [[ $splash == no ]] && splash=
+ ;;
+ *)
+ if [ -z "$target" ]; then
+ target=$1
+ elif [ -z "$kernel" ]; then
+ kernel=$1
+ else
+ usage
+ fi
+ ;;
+ esac
+
+ shift
+done
+
+if [[ $splash == auto && -f $splash_script/detect-resolution ]];then
+ splash=$( $splash_script/detect-resolution )
+fi
+
+if [ -z "$target" -o -z "$kernel" ]; then
+ usage
+fi
+
+if [ -n "$img_vers" ]; then
+ target="$target-$kernel"
+fi
+
+if [ -z "$force" -a -f $target ]; then
+ echo "$target already exists." >&2
+ exit 1
+fi
+
+if [ ! -d /lib/modules/$kernel ]; then
+ echo "/lib/modules/$kernel is not a directory." >&2
+ exit 1
+fi
+
+for n in $PREMODS; do
+ findmodule $n
+done
+
+if [ -z "$noscsi" ]; then
+ if [ ! -f $modulefile ]; then
+ modulefile=/etc/conf.modules
+ fi
+
+ if [ -f $modulefile ]; then
+ scsimodules=`grep -E "alias[ ]+scsi_hostadapter" $modulefile | grep -v '^[ ]*#' | LC_ALL=C sort -u | awk '{ print $3 }'`
+ # support probeall form as found with Mandrake 8.1 and superior
+ scsimodules="$scsimodules `sed -n 's/^ *probeall *scsi_hostadapter//p' $modulefile`"
+
+ if [ -n "$scsimodules" ]; then
+ SAVEMODULES=$MODULES
+
+ for n in $PRESCSIMODS; do
+ findmodule $n
+ done
+
+ SAVEMODULESCMP=$MODULES
+
+ for n in $(for m in $scsimodules; do echo $m; done | awk 'a[$1]=="" {print;a[$1]=1}'); do
+ # for now allow scsi modules to come from anywhere. There are some
+ # RAID controllers with drivers in block/
+ findmodule $n
+ done
+
+ [ "$SAVEMODULESCMP" = "$MODULES" ] && MODULES=$SAVEMODULES
+ fi
+ fi
+fi
+
+# If we have ide devices and module ide, do the right thing
+ide=/proc/ide/ide*
+if [ -n "$ide" ]; then
+ findmodule -ide-mod
+ findmodule -ide-probe-mod
+ findmodule -ide-disk
+fi
+
+if [ -z "$noraid" ]; then
+ # load appropriate raid devices if necessary, this means that the
+ # /etc/raidtab *must* be up to date for raided root to work.
+ #if grep '^/dev/md' $fstab | grep -v noauto >/dev/null 2>&1 ; then
+ for number in $(grep '^[ ]*raid-level' /etc/raidtab 2>/dev/null |
+ awk '{print $2}' | LC_ALL=C sort -u) ; do
+ case $number in
+ [014])
+ findmodule raid$number
+ startraid=1
+ ;;
+ 5)
+ findmodule -xor
+ findmodule raid$number
+ startraid=1
+ ;;
+ *)
+ echo "raid level $number (in /etc/raidtab) not recognized" >&2
+ ;;
+ esac
+ done
+ #fi
+fi
+
+
+# check to see if we need to set up a loopback filesystem
+fullloopfile=$(awk '$2 == "/" && $4 ~ "loop" { print $1 }' /etc/fstab)
+if [ -n "$fullloopfile" ]; then
+ dir=$fullloopfile
+ while [ -n "$dir" -a -z "$line" ]; do
+ dir=$(dirname $dir)
+ line=$(awk -v dir=$dir '$2 == dir { print $0 }' /etc/fstab)
+ done
+ if [ -z "$line" -o "$dir" = "/" ]; then
+ echo "bad fstab, loopback file doesn't belong to any device"
+ exit 1
+ fi
+ loopDev=$(echo $line | awk '{ print $1 }')
+ loopFs=$(echo $line | awk '{print $3 }')
+ loopFile=$(echo $fullloopfile | sed "s|$dir||")
+
+ basicmodules="$basicmodules -loop"
+ if [ "$loopFs" = "vfat" -o "$loopFs" = "msdos" ]; then
+ basicmodules="$basicmodules -fat"
+ fi
+ basicmodules="$basicmodules -${loopFs}"
+
+fi
+
+rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}' $fstab)
+rootfsopts=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/" && $6) { print $4; }}' $fstab | sed "s|defaults||;s|auto||;s|loop||;s|,,|,|;s|,$||;s|^,||")
+
+# in case the root filesystem is modular
+findmodule -${rootfs}
+
+if [ "$rootfs" = "ext3" ] && echo $kernel | grep -q "^2\.2"; then
+ echo "Mandrake 2.2 kernels don't have ext3 compiled in, falling back to ext2 for you."
+ rootfs=ext2
+fi
+
+for n in $basicmodules; do
+ findmodule $n
+done
+
+[[ -d $splash_script ]] || splash=
+if [ "$rootfs" != "ext3" -a -z "$rootfsopts" -a -n "$ifneeded" -a -z "$MODULES" -a -z "$splash" ]; then
+ if [ -n "$verbose" ]; then
+ echo "Rootfs is not ext3, there is no rootfs special options, and"
+ echo "no modules are needed -- not building initrd image."
+ fi
+ exit 0
+fi
+
+if [ -n "$verbose" ]; then
+ echo "Using modules: $MODULES"
+fi
+
+[[ -n $tmpdir ]] && { is_good_fs $tmpdir || tmpdir= ;} #command-line
+[[ -z $tmpdir && -n $TMPDIR ]] && { is_good_fs $TMPDIR || tmpdir= && tmpdir=$TMPDIR ;} #environement
+if [[ -z $tmpdir ]];then
+ if is_good_fs /tmp;then
+ tmpdir=/tmp
+ elif is_good_fs /var/tmp;then
+ tmpdir=/var/tmp
+ elif is_good_fs /root/tmp;then
+ tmpdir=/root/tmp
+ else
+ echo "Cannot use a tmp directory" >&2
+ exit 1
+ fi
+fi
+[[ -n $verbose ]] && echo "Using $tmpdir as temporary directory."
+
+MNTIMAGE=`mktemp -d ${tmpdir}/initrd.XXXXXX`
+IMAGE=`mktemp ${tmpdir}/initrd.img.XXXXXX`
+MNTPOINT=`mktemp -d ${tmpdir}/initrd.mnt.XXXXXX`
+RCFILE=$MNTIMAGE/linuxrc
+# cleanup on exit, hangup, interrupt, quit, termination
+trap 'rm -rf $MNTIMAGE $MNTPOINT $IMAGE' 0 1 2 3 15
+
+if [ -z "$MNTIMAGE" -o -z "$IMAGE" -o -z "$MNTPOINT" ]; then
+ echo "Error creating temporaries. Try again" >&2
+ exit 1
+fi
+
+mkdir -p $MNTIMAGE
+mkdir -p $MNTIMAGE/lib
+mkdir -p $MNTIMAGE/bin
+mkdir -p $MNTIMAGE/etc
+mkdir -p $MNTIMAGE/dev
+mkdir -p $MNTIMAGE/loopfs
+mkdir -p $MNTIMAGE/proc
+mkdir -p $MNTIMAGE/sysroot
+ln -s bin $MNTIMAGE/sbin
+# devfs will shadow some of my dev entries, I'll put them here
+mkdir -p $MNTIMAGE/safedev
+
+# We don't need this directory, so let's save space
+rm -rf $MNTPOINT/lost+found
+
+inst /sbin/nash "$MNTIMAGE/bin/nash"
+if is_ix86; then
+ inst /sbin/insmod-DIET "$MNTIMAGE/bin/insmod"
+else
+ inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
+fi
+ln -s ../bin/nash $MNTIMAGE/sbin/modprobe
+
+for MODULE in $MODULES; do
+ f="/lib/modules/$kernel/$MODULE"
+ if [ -e $f ]; then
+ cp $verbose -a $f $MNTIMAGE/lib
+ else
+ gunzip -c $f.gz > $MNTIMAGE/lib/`basename $MODULE`
+ fi
+done
+
+# mknod'ing the devices instead of copying them works both with and
+# without devfs...
+mknod $MNTIMAGE/dev/console c 5 1
+mknod $MNTIMAGE/dev/null c 1 3
+mknod $MNTIMAGE/dev/ram b 1 1
+mknod $MNTIMAGE/dev/systty c 4 0
+for i in 1 2 3 4; do
+ mknod $MNTIMAGE/dev/tty$i c 4 $i
+done
+
+echo "#!/bin/nash" > $RCFILE
+echo "" >> $RCFILE
+
+for MODULE in $MODULES; do
+ module=`echo $MODULE | sed "s|.*/||" | sed "s/.o$//"`
+
+ options=`sed -n -e "s/^options[ ][ ]*$module[ ][ ]*//p" $modulefile 2>/dev/null`
+
+ if [ -n "$verbose" ]; then
+ echo "Loading module $module with options $options"
+ fi
+ echo "echo \"Loading $module module\"" >> $RCFILE
+ echo "insmod /lib/$module.o $options" >> $RCFILE
+done
+
+echo "echo Mounting /proc filesystem" >> $RCFILE
+echo "mount -t proc /proc /proc" >> $RCFILE
+
+if [ -n "$loopDev" ]; then
+ [ -d /initrd ] || mkdir /initrd
+
+ # our dear friend devfsd will create links for us if devfs in use
+ cp -aL $loopDev $MNTIMAGE/safedev
+ cp -aL /dev/loop7 $MNTIMAGE/safedev
+
+ loopDev=`echo $loopDev | sed "s|/dev/|/safedev/|"`
+
+ echo "echo Mounting device containing loopback root filesystem" >> $RCFILE
+ echo "mount -t $loopFs $loopDev /loopfs" >> $RCFILE
+ echo "echo Setting up loopback device on $loopFile" >> $RCFILE
+ echo "losetup /safedev/loop7 /loopfs$loopFile" >> $RCFILE
+ rootdev=/safedev/loop7
+else
+ echo "echo Creating root device" >> $RCFILE
+ echo "mkrootdev /dev/root" >> $RCFILE
+ rootdev=/dev/root
+fi
+
+if [ -n "$startraid" ]; then
+ cp -aL /dev/md0 $MNTIMAGE/safedev
+ echo "raidautorun /safedev/md0" >> $RCFILE
+fi
+
+if echo $kernel | grep -q "^2\.2"; then
+if is_ppc; then
+[ -n "$loopDev" ] && echo "echo 0x07070000 > /proc/sys/kernel/real-root-dev" >> $RCFILE
+else
+[ -n "$loopDev" ] && echo "echo 0x0707 > /proc/sys/kernel/real-root-dev" >> $RCFILE
+fi
+echo "umount /proc" >> $RCFILE
+
+else
+# Linux-2.4
+if [[ -n "$splash" ]];then
+ if [[ $LOGO_CONSOLE != yes ]] && [[ $LOGO_CONSOLE != YES ]] && [[ $LOGO_CONSOLE != Yes ]]; then
+ echo "echo disabling logo" >> $RCFILE
+ echo "echo 0 > /proc/splash" >> $RCFILE
+ fi
+fi
+
+echo "echo 0x0100 > /proc/sys/kernel/real-root-dev" >> $RCFILE
+echo "umount /proc" >> $RCFILE
+
+[ -n "$rootfsopts" ] && rootfsopts_msg="with flags $rootfsopts"
+echo "echo Mounting root filesystem $rootfsopts_msg" >> $RCFILE
+echo "mount --ro -t $rootfs $rootdev /sysroot $rootfsopts" >> $RCFILE
+echo "pivot_root /sysroot /sysroot/initrd" >> $RCFILE
+echo "echo Remounting devfs at correct place if necessary" >> $RCFILE
+echo "handledevfs" >> $RCFILE
+fi
+
+chmod +x $RCFILE
+
+
+for i in `ls -sk $MNTIMAGE/*/* | sed 's/ [^ ]*$//'`; do
+ IMAGESIZE=$[IMAGESIZE + $i]
+done
+NB_INODES=20
+for i in `find $MNTIMAGE`; do NB_INODES=$[NB_INODES + 1]; done
+IMAGESIZE=$[IMAGESIZE + NBFILES / 10] # 10 inodes needs 1k
+
+dd if=/dev/zero of=$IMAGE bs=1k count=$IMAGESIZE 2> /dev/null
+
+if [ -n "$verbose" ]; then
+ echo "Contents of RCFILE:"
+ cat $RCFILE 2> /dev/null
+ echo "Creating filesystem with size ${IMAGESIZE}KB and $NB_INODES inodes"
+fi
+mke2fs -q -m 0 -F -N $NB_INODES -s 1 $IMAGE
+
+mkdir -p $MNTPOINT
+mount -t ext2 $IMAGE $MNTPOINT -o loop || {
+ echo "Can't get a loopback device"
+ exit 1
+}
+
+# We don't need this directory, so let's save space
+rm -rf $MNTPOINT/lost+found
+
+
+(cd $MNTIMAGE; tar cf - .) | (cd $MNTPOINT; tar xf -)
+
+umount $MNTPOINT
+
+if [ -n "$compress" ]; then
+ gzip -9 < $IMAGE > $target
+else
+ cp -a $IMAGE $target
+fi
+
+if [[ -n "$splash" && -f "$splash_script/make-boot-splash" ]];then
+ $splash_script/make-boot-splash $target $splash
+fi