mirror of the now-defunct rocklinux.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

103 lines
3.0 KiB

#!/bin/bash
kernel=`uname -r`
tmpdir=`mktemp -d`
if [ -n "$1" ]; then
if [ -d "/lib/modules/$1" ]; then
kernel="$1"
else
echo "Can't open /lib/modules/$1: No such directory."
echo "Usage: $0 [ kernel-version ]"
exit 1
fi
fi
echo "Creating /boot/initrdnew-${kernel}.img ..."
mkdir -p $tmpdir/etc/conf
grep '^modprobe ' /etc/conf/kernel | grep -v 'no-initrd' | \
sed 's,[ ]#.*,,' | \
while read a b ; do
b="`find /lib/modules/$kernel -name "$b.o" -o -name "$b.ko"`"
echo "Adding $b."
mkdir -p $tmpdir/${b%/*}
cp $b $tmpdir/$b
echo "/sbin/insmod $b $c" >> $tmpdir/etc/conf/kernel
done
mkdir -p $tmpdir/dev $tmpdir/root $tmpdir/tmp $tmpdir/proc $tmpdir/sys
mknod $tmpdir/dev/ram0 b 1 0
mknod $tmpdir/dev/null c 1 3
mknod $tmpdir/dev/zero c 1 5
mknod $tmpdir/dev/tty c 5 0
mknod $tmpdir/dev/console c 5 1
# this copies a set of programs and the necessary libraries into a
# chroot environment
echo -n "Checking necessary fsck programs ... "
while read dev a mnt b fs c ; do
[ -e "/sbin/fsck.${fs}" ] && echo "/sbin/fsck.${fs} /sbin/fsck.${fs}"
done < <( mount ) | sort | uniq >/etc/conf/initrd/initrd_fsck
echo "/sbin/fsck /sbin/fsck" >>/etc/conf/initrd/initrd_fsck
echo "done"
targetdir=$tmpdir
programs="/bin/bash /bin/bash2 /bin/sh /bin/ls /sbin/pivot_root /sbin/insmod /sbin/insmod.old /bin/mount /bin/umount /usr/bin/chroot /etc/fstab /bin/mkdir"
libs="/lib/ld-linux.so.2"
for x in $programs ; do
[ -e $x ] || continue
mkdir -p $targetdir/${x%/*}
cp -a $x $targetdir/$x
file $x | grep -q ELF || continue
libs="$libs `ldd $x 2>/dev/null | grep -v 'not a dynamic executable' | sed -e 's,^[\t ]*,,g' | cut -f 3 -d' '`"
done
for x in /etc/conf/initrd/initrd_* ; do
[ -f $x ] || continue
while read file target ; do
if [ -d $file ] ; then
find $file -type f | while read f ; do
tfile=${targetdir}/${target}/${f#$file}
[ -e $tfile ] && continue
mkdir -p ${tfile%/*}
cp $f $tfile
libs="$libs `ldd $f 2>/dev/null | grep -v 'not a dynamic executable' | sed -e 's,^[\t ]*,,g' | cut -f 3 -d' '`"
done
fi
[ -f $file ] || continue
mkdir -p $targetdir/${target%/*}
cp $file $targetdir/$target
file $file | grep -q ELF || continue
libs="$libs `ldd $file 2>/dev/null | grep -v 'not a dynamic executable' | sed -e 's,^[\t ]*,,g' | cut -f 3 -d' '`"
done < $x
done
while [ -n "$libs" ] ; do
oldlibs=$libs
libs=""
for x in $oldlibs ; do
mkdir -p $targetdir/${x%/*}
cp $x $targetdir/$x
file $x | grep -q ELF || continue
for y in `ldd $x 2>/dev/null | grep -v 'not a dynamic executable' | sed -e 's,^[\t ]*,,g' | cut -f 3 -d' '` ; do
[ ! -e "$targetdir/$y" ] && libs="$libs $y"
done
done
done
itmp=`mktemp`
dd if=/dev/zero of=${itmp} count=8192 bs=1024 > /dev/null 2>&1
mke2fs -m 0 -N 5120 -F ${itmp} > /dev/null 2>&1
mntpoint="`mktemp -d`"
mount -o loop ${itmp} $mntpoint
rmdir $mntpoint/lost+found/
cp -a $tmpdir/* $mntpoint/
umount -d $mntpoint
rmdir $mntpoint
gzip -9 < ${itmp} > /boot/initrdnew-${kernel}.img
rm -f ${itmp}
rm -rf $tmpdir
echo "Done."