1 |
#!/bin/bash |
#!/bin/bash |
2 |
# $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/mkinitrd.sh,v 1.1 2005-12-02 14:48:31 niro Exp $ |
# $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/mkinitrd.sh,v 1.11 2006-11-24 17:26:11 niro Exp $ |
3 |
|
|
4 |
# mkinitrd |
# mkinitrd |
5 |
# |
# |
38 |
PROBE="yes" |
PROBE="yes" |
39 |
MODULES="" |
MODULES="" |
40 |
PREMODS="" |
PREMODS="" |
41 |
|
NOSTRIP=false |
42 |
|
|
43 |
[ -e /etc/sysconfig/mkinitrd ] && . /etc/sysconfig/mkinitrd |
[ -e /etc/conf.d/mkinitrd ] && . /etc/conf.d/mkinitrd |
44 |
|
|
45 |
CONFMODS="$MODULES" |
CONFMODS="${MODULES}" |
46 |
MODULES="" |
MODULES="" |
47 |
|
|
48 |
compress=1 |
compress=1 |
56 |
modulefile=/etc/modules.conf |
modulefile=/etc/modules.conf |
57 |
rc=0 |
rc=0 |
58 |
|
|
59 |
IMAGESIZE=8000 |
IMAGESIZE=4000 |
60 |
PRESCSIMODS="sd_mod" |
PRESCSIMODS="sd_mod" |
61 |
fstab="/etc/fstab" |
fstab="/etc/fstab" |
62 |
|
|
74 |
echo " [--force-ide-probe] [--force-scsi-probe | --omit-scsi-modules]" |
echo " [--force-ide-probe] [--force-scsi-probe | --omit-scsi-modules]" |
75 |
echo " [--image-version] [--force-scsi-probe | --omit-raid-modules]" |
echo " [--image-version] [--force-scsi-probe | --omit-raid-modules]" |
76 |
echo " [--with=<module>] [--force-lvm-probe | --omit-lvm-modules]" |
echo " [--with=<module>] [--force-lvm-probe | --omit-lvm-modules]" |
77 |
echo " [--builtin=<module>] " |
echo " [--builtin=<module>] [--initramfs | --loopback] [--no-strip]" |
78 |
echo " [--fstab=<fstab>] [--nocompress] <initrd-image> <kernel-version>" |
echo " [--fstab=<fstab>] [--nocompress] <initrd-image> <kernel-version>" |
79 |
echo |
echo |
80 |
echo " (ex: $(basename $0) /boot/initrd-2.2.5-15.img 2.2.5-15)" |
echo " (ex: $(basename $0) /boot/initrd-2.2.5-15.img 2.2.5-15)" |
392 |
--allow-missing) allowmissing=yes ;; |
--allow-missing) allowmissing=yes ;; |
393 |
--noresume) noresume=1 ;; |
--noresume) noresume=1 ;; |
394 |
--help) usage -n ;; |
--help) usage -n ;; |
395 |
|
--initramfs) IMAGE_TYPE=initramfs ;; |
396 |
|
--loopback) IMAGE_TYPE=loopback ;; |
397 |
|
--no-strip) NOSTRIP=true ;; |
398 |
*) |
*) |
399 |
if [ -z "${target}" ] |
if [ -z "${target}" ] |
400 |
then |
then |
411 |
shift |
shift |
412 |
done |
done |
413 |
|
|
414 |
|
# enforce initramfs method as default |
415 |
|
[[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=initramfs |
416 |
|
|
417 |
if [ -z "${target}" -o -z "${kernel}" ] |
if [ -z "${target}" -o -z "${kernel}" ] |
418 |
then |
then |
419 |
usage |
usage |
452 |
############################## |
############################## |
453 |
####### get modules ########## |
####### get modules ########## |
454 |
|
|
455 |
echo "Creating initramfs" |
echo "Creating ${IMAGE_TYPE} initrd image" |
456 |
modulefile=/etc/modprobe.conf |
modulefile=/etc/modprobe.conf |
457 |
|
|
458 |
for n in ${PREMODS} |
for n in ${PREMODS} |
649 |
|
|
650 |
|
|
651 |
# create basic filesystem layout |
# create basic filesystem layout |
652 |
install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sys,sysroot} || die |
install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot} || die |
653 |
|
|
654 |
# install busybox |
# install busybox |
655 |
|
echo "$(which busybox.mkinitrd)" |
656 |
install -m0755 $(which busybox.mkinitrd) ${DEST}/bin/busybox || die |
install -m0755 $(which busybox.mkinitrd) ${DEST}/bin/busybox || die |
657 |
for i in '[' ash awk basename cat cut chroot clear cp dirname echo env false find \ |
for i in '[' ash basename cat cut clear cp dirname echo env false find \ |
658 |
grep gunzip gzip insmod ln ls loadkmap losetup lsmod mkdir mknod modprobe more mount mv \ |
grep gunzip gzip ln ls loadkmap mkdir mknod more mount mv \ |
659 |
pivot_root ps pwd rm rmdir rmmod sh sleep tar test touch true umount uname \ |
ps pwd rm rmdir sh sleep test touch true umount uname \ |
660 |
xargs yes zcat chmod chown |
xargs yes chmod chown |
661 |
do |
do |
662 |
# static links |
# static links |
663 |
ln ${DEST}/bin/busybox ${DEST}/bin/${i} || die "${i}" |
ln ${DEST}/bin/busybox ${DEST}/bin/${i} || die "${i}" |
664 |
done |
done |
665 |
|
|
666 |
|
# sbin related |
667 |
|
for i in chroot init losetup modprobe pivot_root |
668 |
|
do |
669 |
|
# static links |
670 |
|
ln ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}" |
671 |
|
done |
672 |
|
|
673 |
# install run-init |
# install run-init |
674 |
install -m0755 $(which run-init.mkinitrd) ${DEST}/bin/run-init || die |
echo "$(which run-init.mkinitrd)" |
675 |
|
install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die |
676 |
|
|
677 |
# install udev |
# install insmod.static |
678 |
cp -a /etc/udev ${DEST}/etc || die |
echo "$(which insmod.static)" |
679 |
install -m0755 /sbin/udev.static ${DEST}/bin/udev || die |
install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die |
|
install -m0755 /sbin/udevd.static ${DEST}/bin/udevd || die |
|
|
install -m0755 /sbin/udevstart.static ${DEST}/bin/udevstart || die |
|
680 |
|
|
681 |
# install lvm |
# install lvm |
682 |
if [ -n "${vg_list}" ] |
if [ -n "${vg_list}" ] |
683 |
then |
then |
684 |
inst /sbin/lvm.static "${DEST}/bin/lvm" |
inst /sbin/lvm.static "${DEST}/sbin/lvm" |
685 |
if [ -f /etc/lvm/lvm.conf ] |
if [ -f /etc/lvm/lvm.conf ] |
686 |
then |
then |
687 |
cp ${verbose} --parents /etc/lvm/lvm.conf ${DEST}/ |
cp ${verbose} --parents /etc/lvm/lvm.conf ${DEST}/ |
689 |
fi |
fi |
690 |
|
|
691 |
# create some needed device nodes |
# create some needed device nodes |
692 |
|
mkdir ${DEST}/dev/pts || die |
693 |
|
mkdir ${DEST}/dev/shm || die |
694 |
mkdir ${DEST}/dev/mapper || die |
mkdir ${DEST}/dev/mapper || die |
695 |
|
mkdir ${DEST}/dev/misc || die |
696 |
|
mkdir ${DEST}/dev/fb || die |
697 |
|
mkdir ${DEST}/dev/vc || die |
698 |
mknod ${DEST}/dev/console c 5 1 || die |
mknod ${DEST}/dev/console c 5 1 || die |
699 |
mknod ${DEST}/dev/null c 1 3 || die |
mknod ${DEST}/dev/null c 1 3 || die |
700 |
mknod ${DEST}/dev/ram b 1 1 || die |
mknod ${DEST}/dev/ram b 1 1 || die |
718 |
add_initrd 'mount -t proc proc /proc' |
add_initrd 'mount -t proc proc /proc' |
719 |
add_initrd 'mount -t sysfs sysfs /sys' |
add_initrd 'mount -t sysfs sysfs /sys' |
720 |
|
|
721 |
|
[[ ${IMAGE_TYPE} = loopback ]] && add_initrd 'mount -t ramfs -o remount,rw /dev/ram /' |
722 |
|
|
723 |
|
# silencio |
724 |
|
add_initrd 'echo 0 > /proc/sys/kernel/printk' |
725 |
|
|
726 |
add_initrd 'echo "-- Creating inital device nodes ..."' |
add_initrd 'echo "-- Creating inital device nodes ..."' |
727 |
add_initrd 'mount -o mode=0755 -t tmpfs udev /dev' |
add_initrd 'mount -o mode=0755 -t tmpfs udev /dev' |
728 |
add_initrd 'mkdir /dev/pts' |
add_initrd 'mkdir /dev/pts' |
729 |
add_initrd 'mkdir /dev/shm' |
add_initrd 'mkdir /dev/shm' |
730 |
add_initrd 'mkdir /dev/mapper' |
add_initrd 'mkdir /dev/mapper' |
731 |
|
add_initrd 'mkdir /dev/misc' |
732 |
|
add_initrd 'mkdir /dev/fb' |
733 |
|
add_initrd 'mkdir /dev/vc' |
734 |
add_initrd 'mknod /dev/console c 5 1' |
add_initrd 'mknod /dev/console c 5 1' |
735 |
add_initrd 'mknod /dev/null c 1 3' |
add_initrd 'mknod /dev/null c 1 3' |
736 |
add_initrd 'mknod /dev/ram b 1 1' |
add_initrd 'mknod /dev/ram b 1 1' |
745 |
add_initrd "mknod /dev/ttyS$((${i} - 64)) c 4 ${i}" |
add_initrd "mknod /dev/ttyS$((${i} - 64)) c 4 ${i}" |
746 |
done |
done |
747 |
|
|
748 |
add_initrd 'echo "-- Starting udevd ..."' |
# some needed symlinks |
|
add_initrd 'ln -snf bin /sbin' |
|
|
add_initrd '/sbin/udevstart' |
|
749 |
add_initrd 'ln -snf /proc/self/fd /dev/fd' |
add_initrd 'ln -snf /proc/self/fd /dev/fd' |
750 |
add_initrd 'ln -snf fd/0 /dev/stdin' |
add_initrd 'ln -snf fd/0 /dev/stdin' |
751 |
add_initrd 'ln -snf fd/1 /dev/stdout' |
add_initrd 'ln -snf fd/1 /dev/stdout' |
752 |
add_initrd 'ln -snf fd/2 /dev/stderr' |
add_initrd 'ln -snf fd/2 /dev/stderr' |
753 |
add_initrd 'ln -snf /proc/kcore /dev/core' |
add_initrd 'ln -snf /proc/kcore /dev/core' |
|
add_initrd 'touch /dev/.udev' |
|
754 |
|
|
755 |
add_initrd 'echo "-- Setting up hotplug ..."' |
# loading detected modules with options |
756 |
add_initrd 'echo "/sbin/hotplug" > /proc/sys/kernel/hotplug' |
for MODULE in ${MODULES} |
757 |
add_initrd 'for i in $(find /lib -type f -name *.ko)' |
do |
758 |
add_initrd 'do' |
text="" |
759 |
add_initrd ' echo "-- Loadin module ${i}"' |
module=$(echo ${MODULE} | sed "s|.*/||" | sed "s/.k\?o$//") |
760 |
add_initrd ' insmod ${i};' |
fullmodule=$(echo ${MODULE} | sed "s|.*/||") |
761 |
# handle special cases like usb |
|
762 |
add_initrd ' if [[ ${i} = usb-storage ]]' |
options=$(sed -n -e "s/^options[ ][ ]*${module}[ ][ ]*//p" ${modulefile} 2>/dev/null) |
763 |
add_initrd ' then' |
|
764 |
add_initrd ' echo "Waiting 8 seconds for usb-driver initialization."' |
if [ -n "${options}" ] |
765 |
add_initrd ' sleep 8' |
then |
766 |
add_initrd ' fi' |
echo "Adding module ${module}${text} with options ${options} ..." |
767 |
add_initrd 'done' |
else |
768 |
|
echo "Adding module ${module}${text} ..." |
769 |
|
fi |
770 |
|
|
771 |
|
add_initrd "echo \"-- Loading ${fullmodule} module\"" |
772 |
|
add_initrd "insmod /lib/${fullmodule} ${options}" |
773 |
|
|
774 |
|
# Hack - we need a delay after loading usb-storage to give things |
775 |
|
# time to settle down before we start looking a block devices |
776 |
|
if [ "${module}" = "usb-storage" ] |
777 |
|
then |
778 |
|
add_initrd 'echo Waiting 8 seconds for driver initialization.' |
779 |
|
add_initrd 'sleep 8' |
780 |
|
fi |
781 |
|
if [ "${module}" = "zfcp" -a -f /etc/zfcp.conf ] |
782 |
|
then |
783 |
|
add_initrd 'echo Waiting 2 seconds for driver initialization.' |
784 |
|
add_initrd 'sleep 2' |
785 |
|
cat /etc/zfcp.conf | grep -v "^#" | tr "A-Z" "a-z" | while read DEVICE SCSIID WWPN SCSILUN FCPLUN |
786 |
|
do |
787 |
|
add_initrd "echo -n ${WWPN} > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/port_add" |
788 |
|
add_initrd "echo -n ${FCPLUN} > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/${WWPN}/unit_add" |
789 |
|
add_initrd "echo -n 1 > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/online" |
790 |
|
done |
791 |
|
fi |
792 |
|
done |
793 |
|
|
794 |
# lvm support |
# lvm support |
795 |
if [ -n "${vg_list}" ] |
if [ -n "${vg_list}" ] |
816 |
# software suspend |
# software suspend |
817 |
if [ -z "${noresume}" ] |
if [ -z "${noresume}" ] |
818 |
then |
then |
819 |
add_initrd "resume ${swsuspdev}" |
add_initrd "[ -x /bin/resume ] && resume ${swsuspdev}" |
820 |
fi |
fi |
821 |
|
|
822 |
# raid |
# raid |
831 |
|
|
832 |
add_initrd 'echo "-- Mounting sysroot ..."' |
add_initrd 'echo "-- Mounting sysroot ..."' |
833 |
add_initrd '. /etc/rootdev' |
add_initrd '. /etc/rootdev' |
834 |
add_initrd 'mknod ${device} b ${major} ${minor}' |
add_initrd '[ ! -e ${device} ] && mknod ${device} b ${major} ${minor}' |
835 |
add_initrd 'echo "${device} /sysroot ${rootfs} defaults,ro 0 0" > /etc/fstab' |
add_initrd 'echo "${device} /sysroot ${rootfs} defaults,ro 0 0" > /etc/fstab' |
836 |
add_initrd 'mount /sysroot' |
add_initrd 'mount /sysroot' |
837 |
|
|
838 |
|
# de-silencio |
839 |
|
add_initrd 'echo 3 > /proc/sys/kernel/printk' |
840 |
|
|
841 |
add_initrd 'echo "-- Switching to real sysroot ..."' |
add_initrd 'echo "-- Switching to real sysroot ..."' |
842 |
add_initrd 'umount /sys' |
add_initrd 'umount /sys' |
843 |
add_initrd 'umount /proc' |
add_initrd 'umount /proc' |
844 |
add_initrd 'exec run-init /sysroot /sbin/init $@ </sysroot/dev/console >/sysroot/dev/console' |
|
845 |
|
[[ ${IMAGE_TYPE} = initramfs ]] && add_initrd 'exec run-init /sysroot /sbin/init $@ </sysroot/dev/console >/sysroot/dev/console' |
846 |
|
if [[ ${IMAGE_TYPE} = loopback ]] |
847 |
|
then |
848 |
|
add_initrd 'cd /sysroot' |
849 |
|
add_initrd 'pivot_root . initrd' |
850 |
|
add_initrd "exec /sbin/chroot . sh -c 'umount -n /initrd >/dev/null 2>&1;exec -a init.new /sbin/init'</dev/console >/dev/console 2>&1" |
851 |
|
fi |
852 |
|
|
853 |
chmod +x ${DEST}/init || die |
chmod +x ${DEST}/init || die |
854 |
|
|
863 |
echo "Coping your modules to '${DEST}/lib' ..." |
echo "Coping your modules to '${DEST}/lib' ..." |
864 |
for MODULE in ${MODULES} |
for MODULE in ${MODULES} |
865 |
do |
do |
866 |
if [ -x /usr/bin/strip ] |
if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]] |
867 |
then |
then |
868 |
/usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die |
/usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die |
869 |
else |
else |
872 |
done |
done |
873 |
|
|
874 |
# create the image |
# create the image |
875 |
(cd "${DEST}" ; find . | cpio --quiet --dereference -o -H newc | gzip -9 >${IMAGE}) |
echo "Creating initrd image '${target}' ..." |
876 |
cat ${IMAGE} > ${target} || die |
if [[ ${IMAGE_TYPE} = initramfs ]] |
877 |
|
then |
878 |
|
(cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE}) |
879 |
|
cat ${IMAGE} > ${target} || die |
880 |
|
fi |
881 |
|
|
882 |
|
if [[ ${IMAGE_TYPE} = loopback ]] |
883 |
|
then |
884 |
|
MOUNTTMP="$(mktemp -d)" |
885 |
|
|
886 |
|
# create ext2 img |
887 |
|
dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die |
888 |
|
mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die |
889 |
|
mount -o loop ${IMAGE} ${MOUNTTMP} || die |
890 |
|
mv ${DEST}/* ${MOUNTTMP} || die |
891 |
|
umount ${MOUNTTMP} || die |
892 |
|
gzip -9 ${IMAGE} || die |
893 |
|
cat ${IMAGE}.gz > ${target} || die |
894 |
|
[ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP} |
895 |
|
|
896 |
|
# create inird dir for pivot_root |
897 |
|
[ ! -d /initrd ] && { install -d /initrd || die; } |
898 |
|
fi |
899 |
|
|
900 |
# clean up |
# clean up |
901 |
[ -d ${DEST} ] && rm -rf ${DEST} |
[ -d ${DEST} ] && rm -rf ${DEST} |
902 |
[ -f ${IMAGE} ] && rm -f ${IMAGE} |
[ -f ${IMAGE} ] && rm -f ${IMAGE} |
903 |
|
|
904 |
|
# all went ok at this point |
905 |
|
exit 0 |