From 1cabb36f13e919d363a98784a4511c427c88f015 Mon Sep 17 00:00:00 2001 From: Stefan Fiedler Date: Tue, 25 Apr 2006 20:06:45 +0000 Subject: [PATCH] Stefan Fiedler: target/bootdisk: update to match rockinitrd code more closely [2006040616574112383] (https://www.rocklinux.net/submaster) git-svn-id: http://www.rocklinux.org/svn/rock-linux/trunk@7545 c5f82cb5-29bc-0310-9cd0-bff59a50e3bc --- target/bootdisk/build_stage1.sh | 219 ++++++++++++++++--------- target/bootdisk/build_stage2.sh | 5 +- target/bootdisk/initrd/initrd_bootdisk | 36 ++++ target/bootdisk/kernel.conf | 4 +- target/bootdisk/linuxrc.sh | 42 +++-- target/bootdisk/powerpc/yaboot.conf | 12 +- target/bootdisk/sparc/silo.conf | 4 +- target/bootdisk/x86/isolinux.cfg | 4 +- target/bootdisk/x86/lilo-conf-144 | 2 +- target/bootdisk/x86/lilo-conf-1x2 | 2 +- target/bootdisk/x86/lilo-conf-288 | 2 +- 11 files changed, 219 insertions(+), 113 deletions(-) create mode 100644 target/bootdisk/initrd/initrd_bootdisk diff --git a/target/bootdisk/build_stage1.sh b/target/bootdisk/build_stage1.sh index 875c6793e..b8ecf1bf3 100644 --- a/target/bootdisk/build_stage1.sh +++ b/target/bootdisk/build_stage1.sh @@ -1,15 +1,43 @@ +#!/bin/bash echo_header "Creating initrd data:" rm -rf $disksdir/initrd mkdir -p $disksdir/initrd/{dev,proc,sys,tmp,scsi,net,bin,etc,lib} cd $disksdir/initrd; ln -s bin sbin; ln -s . usr +rock_targetdir="$base/target/$target/" +rock_target="$target" + +rootdir="$disksdir/2nd_stage" +targetdir="$disksdir/initrd" +cross_compile="" +if [ "$ROCKCFG_CROSSBUILD" = "1" ] ; then + cross_compile="`find ${base}/ROCK/tools.cross/ -name "*-readelf"`" + cross_compile="${cross_compile##*/}" + cross_compile="${cross_compile%%readelf}" +fi +initrdfs="ext2fs" +block_size="" +ramdisk_size=12288 + +case ${initrdfs} in + ext2fs|ext3fs|cramfs) + initrd_img="${disksdir}/initrd.img" + ;; + ramfs) + initrd_img="${disksdir}/initrd.cpio" + ;; +esac + echo_status "Creating some device nodes" -mknod dev/ram0 b 1 0 -mknod dev/null c 1 3 -mknod dev/zero c 1 5 -mknod dev/tty c 5 0 -mknod dev/console c 5 1 +mknod ${targetdir}/dev/ram0 b 1 0 +mknod ${targetdir}/dev/null c 1 3 +mknod ${targetdir}/dev/zero c 1 5 +mknod ${targetdir}/dev/tty c 5 0 +mknod ${targetdir}/dev/console c 5 1 + +# this copies a set of programs and the necessary libraries into a +# chroot environment echo_status "Create checkisomd5 binary" cp -r ${base}/misc/isomd5sum ${base}/build/${ROCKCFG_ID}/ @@ -24,23 +52,54 @@ chroot ${base}/build/${ROCKCFG_ID}/ /compile_isomd5sum.sh cp ${base}/build/${ROCKCFG_ID}/isomd5sum/checkisomd5 bin/ rm -rf ${base}/build/${ROCKCFG_ID}/compile_isomd5sum.sh ${base}/build/${ROCKCFG_ID}/isomd5sum echo_status "Copying and adjusting linuxrc scipt" -cp ${base}/target/${target}/linuxrc.sh linuxrc -chmod +x linuxrc +cp ${base}/target/${target}/linuxrc.sh sbin/init +chmod +x sbin/init sed -i -e "s,^STAGE_2_BIG_IMAGE=\"2nd_stage.tar.gz\"$,STAGE_2_BIG_IMAGE=\"${ROCKCFG_SHORTID}/2nd_stage.tar.gz\"," \ -e "s,^STAGE_2_SMALL_IMAGE=\"2nd_stage_small.tar.gz\"$,STAGE_2_SMALL_IMAGE=\"${ROCKCFG_SHORTID}/2nd_stage_small.tar.gz\"," \ - linuxrc - -echo_status "Copy various helper applications." -for file in ../2nd_stage/bin/{tar,gzip,bash2,bash,sh,mount,umount,ls,sed,cut,cp} \ - ../2nd_stage/bin/{cat,uname,rm,ln,mkdir,rmdir,gawk,awk,grep,sleep} \ - ../2nd_stage/sbin/{ip,hwscan,pivot_root,swapon,swapoff,udevd} \ - ../2nd_stage/usr/bin/{wget,find,expand,readlink,basename,tr} \ - ../2nd_stage/usr/sbin/lspci ; do - programs="${programs} ${file#../2nd_stage}" - cp ${file} bin/ + sbin/init + +libdirs="${rootdir}/lib `sed -e"s,^\(.*\),${rootdir}\1," ${rootdir}/etc/ld.so.conf | tr '\n' ' '`" + +needed_libs() { + local x="${1}" library + + ${cross_compile}readelf -d ${x} 2>/dev/null | grep "(NEEDED)" | + sed -e"s,.*Shared library: \[\(.*\)\],\1," | + while read library ; do + find ${libdirs} -name "${library}" 2>/dev/null | + sed -e "s,^${rootdir},,g" | tr '\n' ' ' + done +} + +echo_status "Copying other files ... " +for x in ${rock_targetdir}/initrd/initrd_* ; do + [ -f ${x} ] || continue + while read file target ; do + file="${rootdir}/${file}" + [ -e ${file} ] || continue + + while read f ; do + tfile=${targetdir}/${target}${f#${file}} + [ -e ${tfile} ] && continue + + if [ -d ${f} -a ! -L ${f} ] ; then + mkdir -p ${tfile} + continue + else + mkdir -p ${tfile%/*} + fi + +# if [ -b ${f} -o -c ${f} -o -p ${f} -o -L ${f} ] ; then + cp -a ${f} ${tfile} +# else +# cp ${f} ${tfile} +# fi + + file -L ${f} | grep -q ELF || continue + libs="${libs} `needed_libs ${f}`" + done < <( find "${file}" ) + done < ${x} done -cp -a $build_root/etc/udev etc/ -cp -a $build_root/lib/udev lib/ for x in modprobe.static modprobe.static.old insmod.static insmod.static.old ; do if [ -f ../2nd_stage/sbin/${x/.static/} ]; then @@ -59,7 +118,7 @@ echo_status "Copy scsi and network kernel modules." find lib/modules -type f -exec $STRIP --strip-debug {} \; for x in ../2nd_stage/lib/modules/*/modules.{dep,pcimap,isapnpmap} ; do - cp $x ${x#../2nd_stage/} || echo "not found: $x" ; + cp $x ${x#../2nd_stage/} || echo_status "not found: $x" ; done for x in lib/modules/*/kernel/drivers/{scsi,net}; do @@ -68,78 +127,82 @@ done rm -f lib/modules/[0-9]*/kernel/drivers/scsi/{st,scsi_debug}.{o,ko} rm -f lib/modules/[0-9]*/kernel/drivers/net/{dummy,ppp*}.{o,ko} -echo_status "Copying necessary libraries" - -libs="/lib/ld-linux.so.2 /usr/lib/libpopt.so.0" -# libpopt from checkisomd5 which is not in build/* -for x in ${programs} ; do - [ -e ./$x ] || continue - file $x | grep -q ELF || continue - libs="$libs `chroot ${base}/build/${ROCKCFG_ID} ldd $x 2>/dev/null | grep -v 'not a dynamic executable' | sed -e 's,^[\t ]*,,g' | cut -f 3 -d' '`" -done - -while [ -n "$libs" ] ; do - oldlibs=$libs +echo_status "Copying required libraries ... " +while [ -n "${libs}" ] ; do + oldlibs=${libs} libs="" - for x in $oldlibs ; do - mkdir -p ./${x%/*} - if [ ! -e ./$x ] ; then - cp ${base}/build/${ROCKCFG_ID}/$x ./$x - echo_status "- ${x##*/}" - fi - file $x | grep -q ELF || continue - for y in `chroot ${base}/build/${ROCKCFG_ID} ldd $x 2>/dev/null | grep -v 'not a dynamic executable' | sed -e 's,^[\t ]*,,g' | cut -f 3 -d' '` ; do - [ ! -e "./$y" ] && libs="$libs $y" + for x in ${oldlibs} ; do + [ -e ${targetdir}/${x} ] && continue + mkdir -p ${targetdir}/${x%/*} + cp ${rootdir}/${x} ${targetdir}/${x} + file -L ${rootdir}/${x} | grep -q ELF || continue + for y in `needed_libs ${rootdir}/${x}` ; do + [ ! -e "${targetdir}/${y}" ] && libs="${libs} ${y}" done done done -echo_status "Creating links for identical files." +echo_status "Creating links for identical files ..." while read ck fn do - if [ "$oldck" = "$ck" ] ; then - echo_status "\`- Found $fn -> $oldfn." - rm $fn ; ln -s ${oldfn#.} $fn + # don't link empty files... + if [ "${oldck}" = "${ck}" -a -s "${fn}" ] ; then + echo_status "\`- Found ${fn#${targetdir}} -> ${oldfn#${targetdir}}." + rm ${fn} ; ln -s /${oldfn#${targetdir}} ${fn} else - oldck=$ck ; oldfn=$fn + oldck=${ck} ; oldfn=${fn} fi -done < <( find -type f | xargs md5sum | sort ) +done < <( find ${targetdir} -type f | xargs md5sum | sort ) cd .. -echo_header "Creating initrd filesystem image: " - -ramdisk_size=16384 - -echo_status "Creating temporary files." -tmpdir=initrd_$$.dir; mkdir -p $disksdir/$tmpdir; cd $disksdir -dd if=/dev/zero of=initrd.img bs=1024 count=$ramdisk_size &> /dev/null -eval tmpdev="`losetup -f 2>/dev/null`" -if [ -z "$tmpdev" ] ; then - for x in /dev/loop* /dev/loop/* ; do - [ -b "${x}" ] || continue - losetup ${x} 2>&1 >/dev/null || tmpdev="${x}" - [ -n "${tmpdev}" ] && break - done +echo_header "Creating initrd filesystem image (${initrdfs}): " +case "${initrdfs}" in +cramfs) + [ "${block_size}" == "" ] && block_size=4096 + mkfs.cramfs -b ${block_size} ${targetdir} ${initrd_img} + ;; +ramfs) +# cp -a ${targetdir}/{linuxrc,init} + ( cd ${targetdir} ; find | cpio -o -c > ${initrd_img} ; ) + ;; +ext2fs|ext3fs) + [ "${block_size}" == "" ] && block_size=1024 + block_count=$(( ( 1024 * ${ramdisk_size} ) / ${block_size} )) + + echo_status "Creating temporary files." + tmpdir=`mktemp -d` ; mkdir -p ${tmpdir} + dd if=/dev/zero of=${initrd_img} bs=${block_size} count=${block_count} &> /dev/null + tmpdev="`losetup -f 2>/dev/null`" if [ -z "${tmpdev}" ] ; then - echo_error "No free loopback device found!" - rm -f $tmpfile ; rmdir $tmpdir; exit 1 + for x in /dev/loop* /dev/loop/* ; do + [ -b "${x}" ] || continue + losetup ${x} 2>&1 >/dev/null || tmpdev="${x}" + [ -n "${tmpdev}" ] && break + done + if [ -z "${tmpdev}" ] ; then + echo_status "No free loopback device found!" + rm -f ${tmpfile} ; rmdir ${tmpdir}; exit 1 + fi fi -fi -echo_status "Using loopback device $tmpdev." -losetup "$tmpdev" initrd.img - -echo_status "Writing initrd image file." -mke2fs -m 0 -N 360 -q $tmpdev &> /dev/null -mount -t ext2 $tmpdev $tmpdir -rmdir $tmpdir/lost+found/ -cp -a initrd/* $tmpdir -umount $tmpdir + echo_status "Using loopback device ${tmpdev}." + losetup "${tmpdev}" ${initrd_img} + + echo_status "Writing initrd image file." + mkfs.${initrdfs:0:4} -b ${block_size} -m 0 -N 360 -q ${tmpdev} &> /dev/null + mount -t ${initrdfs:0:4} ${tmpdev} ${tmpdir} + rmdir ${tmpdir}/lost+found/ + cp -a ${targetdir}/* ${tmpdir} + umount ${tmpdir} + + echo_status "Removing temporary files." + losetup -d ${tmpdev} + rm -rf ${tmpdir} + ;; +esac echo_status "Compressing initrd image file." -gzip -9 initrd.img -mv initrd{.img,}.gz +gzip -9 -c ${initrd_img} > ${initrd_img}.gz +mv ${initrd_img%.img}{.img,}.gz -echo_status "Removing temporary files." -losetup -d $tmpdev -rm -rf $tmpdir +target="$rock_target" diff --git a/target/bootdisk/build_stage2.sh b/target/bootdisk/build_stage2.sh index 24194ec6c..d0a51bffb 100644 --- a/target/bootdisk/build_stage2.sh +++ b/target/bootdisk/build_stage2.sh @@ -102,7 +102,7 @@ if [ -f ../../pkgs/pciutils.tar.bz2 ] ; then fi # echo_status "Creating 2nd stage linuxrc." -cp $base/target/$target/linuxrc2.sh linuxrc ; chmod +x linuxrc +cp $base/target/$target/linuxrc2.sh sbin/init ; chmod +x sbin/init cp $base/target/$target/shutdown sbin/shutdown ; chmod +x sbin/shutdown echo '$STONE install' > etc/stone.d/default.sh # @@ -169,7 +169,7 @@ do done # echo_status "Copy linuxrc." -cp ../2nd_stage/linuxrc . +cp ../2nd_stage/sbin/init sbin/init echo_status "Copy /etc/fstab." cp ../2nd_stage/etc/fstab etc echo_status "Copy stone.d." @@ -191,4 +191,3 @@ done < <( find -type f | xargs md5sum | sort ) # echo_status "Creating 2nd_stage_small.tar.gz archive." tar -cf- * | gzip -9 > ../2nd_stage_small.tar.gz ; cd .. - diff --git a/target/bootdisk/initrd/initrd_bootdisk b/target/bootdisk/initrd/initrd_bootdisk new file mode 100644 index 000000000..9328cf944 --- /dev/null +++ b/target/bootdisk/initrd/initrd_bootdisk @@ -0,0 +1,36 @@ +/bin/tar /bin/tar +/bin/gzip /bin/gzip +/bin/bash2 /bin/bash2 +/bin/bash /bin/bash +/bin/sh /bin/sh +/bin/mount /bin/mount +/bin/umount /bin/umount +/bin/ls /bin/ls +/bin/sed /bin/sed +/bin/cut /bin/cut +/bin/cp /bin/cp +/bin/cat /bin/cat +/bin/uname /bin/uname +/bin/rm /bin/rm +/bin/ln /bin/ln +/bin/mkdir /bin/mkdir +/bin/rmdir /bin/rmdir +/bin/find /bin/find +/bin/gawk /bin/gawk +/bin/awk /bin/awk +/bin/grep /bin/grep +/bin/sleep /bin/sleep +/sbin/ip /sbin/ip +/sbin/hwscan /sbin/hwscan +/sbin/pivot_root /sbin/pivot_root +/sbin/swapon /sbin/swapon +/sbin/swapoff /sbin/swapoff +/sbin/udevd /sbin/udevd +/usr/bin/wget /usr/bin/wget +/usr/bin/expand /usr/bin/expand +/usr/bin/readlink /usr/bin/readlink +/usr/bin/basename /usr/bin/basename +/usr/bin/tr /usr/bin/tr +/usr/sbin/lspci /usr/sbin/lspci +/etc/udev etc/udev +/lib/udev lib/udev diff --git a/target/bootdisk/kernel.conf b/target/bootdisk/kernel.conf index 106aed977..0cc9831f4 100644 --- a/target/bootdisk/kernel.conf +++ b/target/bootdisk/kernel.conf @@ -28,8 +28,8 @@ CONFIG_BLK_DEV_IDECD=y CONFIG_DEBUG_KERNEL=y CONFIG_MAGIC_SYSRQ=y -# ramdisk size of 16384 KB -CONFIG_BLK_DEV_RAM_SIZE=16384 +# ramdisk size of 12288 KB +CONFIG_BLK_DEV_RAM_SIZE=12288 # console on serial port CONFIG_SERIAL_8250_CONSOLE=y diff --git a/target/bootdisk/linuxrc.sh b/target/bootdisk/linuxrc.sh index 6b03e905c..29fe0a782 100644 --- a/target/bootdisk/linuxrc.sh +++ b/target/bootdisk/linuxrc.sh @@ -35,8 +35,8 @@ doboot() { # {{{ exit_linuxrc=0 fi - if [ ! -f /mnt_root/linuxrc ] ; then - echo "Can't find /mnt_root/linuxrc!" + if [ ! -f /mnt_root/sbin/init ] ; then + echo "Can't find /mnt_root/sbin/init!" exit_linuxrc=0 fi @@ -310,7 +310,7 @@ EOF exit_linuxrc=0 fi - if ! mount -t tmpfs -o ${TMPFS_OPTIONS} none /mnt_root ; then + if ! mount -t tmpfs -o ${TMPFS_OPTIONS} tmpfs /mnt_root ; then echo "Can't mount tmpfs on /mnt_root" exit_linuxrc=0 fi @@ -398,27 +398,35 @@ checkisomd5() { # {{{ read } # }}} +emit_udev_events() { # {{{ + while read uevent; do + echo 1 > $uevent + done < <( find /sys -name uevent ) + udevwait=0 + while [ -d /dev/.udev/queue -a $udevwait -lt 300 ] ; do + sleep 1 + (( udevwait++ )) + done +} # }}} + input=1 exit_linuxrc=0 [ -z "${autoboot}" ] && autoboot=0 -mount -t ramfs none /dev || echo "Can't mount a ramfs on /dev" -mount -t sysfs none /sys || echo "Can't mount sysfs on /sys" -mount -t proc none /proc || echo "Can't mount /proc" -mount -t tmpfs -o ${TMPFS_OPTIONS} none /tmp || echo "Can't mount /tmpfs" + +# mount / / -o remount,rw || echo "Can't remount / read-/writeable" +# mount / / -o remount,rw || echo "Can't remount / read-/writeable (for mount log)" +mount -t tmpfs tmpfs /tmp -o ${TMPFS_OPTIONS} || echo "Can't mount a tmpfs on /tmp" +mount -t proc proc /proc || echo "Can't mount proc on /proc!" +mount -t sysfs sysfs /sys || echo "Can't mount sysfs on /sys!" +mount -t tmpfs tmpfs /dev || echo "Can't mount a tmpfs on /dev!" cp -r /lib/udev/devices/* /dev echo "" > /proc/sys/kernel/hotplug /sbin/udevd --daemon + # create nodes for devices already in kernel -while read uevent; do - echo 1 > $uevent -done < <( find /sys -name uevent ) -udevwait=0 -while [ -d /dev/.udev/queue -a $udevwait -lt 300 ] ; do - sleep 1 - (( udevwait++ )) -done +emit_udev_events mod_load_info @@ -501,6 +509,6 @@ EOF esac done -exec /linuxrc -echo "Can't start /linuxrc!! Life sucks.\n\n" +exec /sbin/init +echo "Can't start /sbin/init!! Life sucks.\n\n" diff --git a/target/bootdisk/powerpc/yaboot.conf b/target/bootdisk/powerpc/yaboot.conf index dc957e9ac..0dd216fdc 100644 --- a/target/bootdisk/powerpc/yaboot.conf +++ b/target/bootdisk/powerpc/yaboot.conf @@ -7,18 +7,18 @@ default = auto image=/boot/vmlinux label=auto initrd=/boot/initrd.gz - initrd-size=8192 - append="root=/dev/ram devfs=nocompat init=/linuxrc autoboot=1 rw" + initrd-size=12288 + append="root=/dev/ram0 devfs=nocompat autoboot=1 rw" image=/boot/vmlinux label=install initrd=/boot/initrd.gz - initrd-size=8192 - append="root=/dev/ram devfs=nocompat init=/linuxrc rw" + initrd-size=12288 + append="root=/dev/ram0 devfs=nocompat rw" image=/boot/vmlinux label=install-novideo initrd=/boot/initrd.gz - initrd-size=8192 - append="root=/dev/ram devfs=nocompat init=/linuxrc rw video=ofonly" + initrd-size=12288 + append="root=/dev/ram0 devfs=nocompat rw video=ofonly" diff --git a/target/bootdisk/sparc/silo.conf b/target/bootdisk/sparc/silo.conf index a629e4e4b..872bb857e 100644 --- a/target/bootdisk/sparc/silo.conf +++ b/target/bootdisk/sparc/silo.conf @@ -2,10 +2,10 @@ partition=1 timeout=600 message=/boot/boot.msg default=install -root=/dev/ram +root=/dev/ram0 initrd=/boot/initrd.gz read-write -append="devfs=nocompat init=/linuxrc" +append="devfs=nocompat" image="cat /boot/boot.msg" label=0 diff --git a/target/bootdisk/x86/isolinux.cfg b/target/bootdisk/x86/isolinux.cfg index af032a901..0c131f384 100644 --- a/target/bootdisk/x86/isolinux.cfg +++ b/target/bootdisk/x86/isolinux.cfg @@ -18,11 +18,11 @@ F0 help0.txt LABEL auto kernel vmlinuz - APPEND initrd=initrd.gz root=/dev/ram devfs=nocompat init=/linuxrc autoboot=1 rw + APPEND initrd=initrd.gz root=/dev/ram0 devfs=nocompat autoboot=1 rw LABEL ramdisk kernel vmlinuz - APPEND initrd=initrd.gz root=/dev/ram devfs=nocompat init=/linuxrc rw + APPEND initrd=initrd.gz root=/dev/ram0 devfs=nocompat rw LABEL linux kernel vmlinuz diff --git a/target/bootdisk/x86/lilo-conf-144 b/target/bootdisk/x86/lilo-conf-144 index 7c97d71d2..854d24985 100644 --- a/target/bootdisk/x86/lilo-conf-144 +++ b/target/bootdisk/x86/lilo-conf-144 @@ -18,7 +18,7 @@ image=/mnt/vmlinuz read-write append="root=/dev/fd devfs=nocompat \ load_ramdisk=1 prompt_ramdisk=1 \ - ramdisk_size=4096 init=/linuxrc" + ramdisk_size=12288" label=ramdisk image=/mnt/vmlinuz diff --git a/target/bootdisk/x86/lilo-conf-1x2 b/target/bootdisk/x86/lilo-conf-1x2 index 27ef71d47..790ce0a81 100644 --- a/target/bootdisk/x86/lilo-conf-1x2 +++ b/target/bootdisk/x86/lilo-conf-1x2 @@ -16,7 +16,7 @@ prompt image=/mnt/vmlinuz read-write - append="root=/dev/ram devfs=nocompat init=/linuxrc" + append="root=/dev/ram0 devfs=nocompat" initrd=/mnt/initrd.gz label=ramdisk diff --git a/target/bootdisk/x86/lilo-conf-288 b/target/bootdisk/x86/lilo-conf-288 index 2e756b969..3647df41d 100644 --- a/target/bootdisk/x86/lilo-conf-288 +++ b/target/bootdisk/x86/lilo-conf-288 @@ -16,7 +16,7 @@ prompt image=/mnt/vmlinuz read-write - append="root=/dev/ram devfs=nocompat init=/linuxrc" + append="root=/dev/ram0 devfs=nocompat" initrd=/mnt/initrd.gz label=ramdisk