44 |
|
|
45 |
CONFMODS="${MODULES}" |
CONFMODS="${MODULES}" |
46 |
MODULES="" |
MODULES="" |
47 |
|
INITEXEC="/sbin/init" |
48 |
|
|
49 |
compress=1 |
compress=1 |
50 |
allowmissing="" |
allowmissing="" |
54 |
verbose="" |
verbose="" |
55 |
img_vers="" |
img_vers="" |
56 |
builtins="" |
builtins="" |
57 |
modulefile=/etc/modules.conf |
modulefile="/etc/modules.conf" |
58 |
|
modprobeconf="/etc/modprobe.d/*" |
59 |
rc=0 |
rc=0 |
60 |
|
|
61 |
IMAGESIZE=4000 |
IMAGESIZE=4000 |
77 |
echo " [--image-version] [--force-scsi-probe | --omit-raid-modules]" |
echo " [--image-version] [--force-scsi-probe | --omit-raid-modules]" |
78 |
echo " [--with=<module>] [--force-lvm-probe | --omit-lvm-modules]" |
echo " [--with=<module>] [--force-lvm-probe | --omit-lvm-modules]" |
79 |
echo " [--builtin=<module>] [--initramfs | --loopback] [--no-strip]" |
echo " [--builtin=<module>] [--initramfs | --loopback] [--no-strip]" |
80 |
echo " [--fstab=<fstab>] [--nocompress] <initrd-image> <kernel-version>" |
echo " [--fstab=<fstab>] [--nocompress] [--initexec=<init>]" |
81 |
|
echo " <initrd-image> <kernel-version>" |
82 |
echo |
echo |
83 |
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)" |
84 |
|
|
94 |
|
|
95 |
echo "Looking for deps of module $1" |
echo "Looking for deps of module $1" |
96 |
deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \ |
deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \ |
97 |
function modname(filename) { match(filename, /\/([^\/]+)\.k?o:?$/, ret); return ret[1] } \ |
function modname(filename) { match(filename, /\/([^\/]+)\.k?o.?g?z?:?$/, ret); return ret[1] } \ |
98 |
function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \ |
function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \ |
99 |
/^\/lib/ { show(); \ |
/^.*kernel/ { show(); \ |
100 |
orig=modname($1); dep=""; \ |
orig=modname($1); dep=""; \ |
101 |
if ($2) { for (i = 2; i <= NF; i++) { dep=sprintf("%s %s", dep, modname($i)); } } } \ |
if ($2) { for (i = 2; i <= NF; i++) { dep=sprintf("%s %s", dep, modname($i)); } } } \ |
102 |
/^ / { dep=sprintf("%s %s", dep, modname($1)); } \ |
/^ / { dep=sprintf("%s %s", dep, modname($1)); } \ |
132 |
|
|
133 |
case "${MODULES} " in |
case "${MODULES} " in |
134 |
*"/${modName}.ko "*) return ;; |
*"/${modName}.ko "*) return ;; |
135 |
|
*"/${modName}.ko.gz "*) return ;; |
136 |
esac |
esac |
137 |
|
|
138 |
if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)' |
if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)' |
165 |
done |
done |
166 |
fi |
fi |
167 |
|
|
168 |
for modExt in o.gz o ko |
for modExt in o.gz o ko ko.gz |
169 |
do |
do |
170 |
for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel} |
for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel} |
171 |
do |
do |
253 |
modalias=$(cat modalias) |
modalias=$(cat modalias) |
254 |
for driver in $(modprobe --set-version ${kernel} --show-depends ${modalias} 2>/dev/null| awk '{ print gensub(".*/","","g",$2) }') |
for driver in $(modprobe --set-version ${kernel} --show-depends ${modalias} 2>/dev/null| awk '{ print gensub(".*/","","g",$2) }') |
255 |
do |
do |
256 |
findmodule ${driver%%.ko} |
findmodule ${driver%%.*} |
257 |
done |
done |
258 |
popd >/dev/null 2>&1 |
popd >/dev/null 2>&1 |
259 |
done |
done |
323 |
fi |
fi |
324 |
} |
} |
325 |
|
|
326 |
|
get_blkid() |
327 |
|
{ |
328 |
|
local UUID |
329 |
|
local SEC_TYPE |
330 |
|
local TYPE |
331 |
|
|
332 |
|
local dev="$1" |
333 |
|
[[ -z ${dev} ]] && die "no dev given" |
334 |
|
|
335 |
|
# check if given device is already an UUID |
336 |
|
if [[ ${dev/UUID=/}x != ${dev}x ]] |
337 |
|
then |
338 |
|
eval "${dev}" |
339 |
|
else |
340 |
|
eval $(busybox.mkinitrd blkid ${dev} | grep "${dev}:" | sed 's/.*:\ //') |
341 |
|
fi |
342 |
|
echo ${UUID} |
343 |
|
} |
344 |
|
|
345 |
# need r00t privs |
# need r00t privs |
346 |
[[ $(id -u) != 0 ]] && die "you must be r00t." |
[[ $(id -u) != 0 ]] && die "you must be r00t." |
347 |
|
|
418 |
--initramfs) IMAGE_TYPE=initramfs ;; |
--initramfs) IMAGE_TYPE=initramfs ;; |
419 |
--loopback) IMAGE_TYPE=loopback ;; |
--loopback) IMAGE_TYPE=loopback ;; |
420 |
--no-strip) NOSTRIP=true ;; |
--no-strip) NOSTRIP=true ;; |
421 |
|
--initexec*) |
422 |
|
if echo $1 | grep -q '=' ; then |
423 |
|
INITEXEC=$(echo $1 | sed 's/^--initexec=//') |
424 |
|
else |
425 |
|
INITEXEC=$2 |
426 |
|
shift |
427 |
|
fi |
428 |
|
;; |
429 |
*) |
*) |
430 |
if [ -z "${target}" ] |
if [ -z "${target}" ] |
431 |
then |
then |
484 |
####### get modules ########## |
####### get modules ########## |
485 |
|
|
486 |
echo "Creating ${IMAGE_TYPE} initrd image" |
echo "Creating ${IMAGE_TYPE} initrd image" |
|
modulefile=/etc/modprobe.conf |
|
487 |
|
|
488 |
for n in ${PREMODS} |
for n in ${PREMODS} |
489 |
do |
do |
498 |
for fs in / /boot |
for fs in / /boot |
499 |
do |
do |
500 |
esc=$(echo ${fs} | sed 's,/,\\/,g') |
esc=$(echo ${fs} | sed 's,/,\\/,g') |
501 |
dev=$(mount | awk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//' | cut -d/ -f3) |
dev=$(mount | awk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//') |
502 |
if [ "$(echo ${dev} | cut -c1-2)" = sd ] |
if [ "$(echo ${dev} | cut -c6-7)" = sd ] |
503 |
then |
then |
504 |
if [ $(which kudzu 2>/dev/null) ] |
if [ $(which hwinfo 2>/dev/null) ] |
505 |
then |
then |
506 |
host=$(kudzu --probe -b scsi | |
if [[ -n $(hwinfo --disk --only ${dev} | grep 'Driver Modules' | grep 'usb[_|-]storage') ]] |
|
gawk '/^device: '${dev}'/,/^host:/ { if (/^host/) { print $2; exit; } }') |
|
|
if [ -d /proc/scsi/usb-storage-${host} -o -f /proc/scsi/usb-storage/${host} ] |
|
507 |
then |
then |
508 |
needusb=1 |
needusb=1 |
509 |
fi |
fi |
677 |
|
|
678 |
|
|
679 |
# create basic filesystem layout |
# create basic filesystem layout |
680 |
install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot} || die |
install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot,usr/bin,usr/sbin} || die |
681 |
|
|
682 |
# install busybox |
# install busybox |
683 |
echo "$(which busybox.mkinitrd)" |
echo "$(which busybox.mkinitrd)" |
697 |
# sbin related |
# sbin related |
698 |
for i in chroot init losetup modprobe pivot_root |
for i in chroot init losetup modprobe pivot_root |
699 |
do |
do |
700 |
# static links |
ln -s ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}" |
|
ln ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}" |
|
701 |
done |
done |
702 |
|
|
703 |
# install run-init |
# install run-init |
705 |
install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die |
install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die |
706 |
|
|
707 |
# install insmod.static |
# install insmod.static |
708 |
echo "$(which insmod.static)" |
#echo "$(which insmod.static)" |
709 |
install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die |
#install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die |
710 |
|
|
711 |
# install v86d for uvesafb support if installed |
# install v86d for uvesafb support if installed |
712 |
if which v86d &> /dev/null |
if which v86d &> /dev/null |
713 |
then |
then |
714 |
echo "$(which insmod.static)" |
echo "$(which v86d)" |
715 |
install -m0755 $(which v86d) ${DEST}/sbin/v86d || die |
install -m0755 $(which v86d) ${DEST}/sbin/v86d || die |
716 |
fi |
fi |
717 |
|
|
754 |
|
|
755 |
add_initrd 'mount -t proc proc /proc' |
add_initrd 'mount -t proc proc /proc' |
756 |
add_initrd 'mount -t sysfs sysfs /sys' |
add_initrd 'mount -t sysfs sysfs /sys' |
757 |
|
add_initrd "if [[ -z \$(grep '[[:space:]]/dev[[:space:]]' /proc/mounts | cut -d ' ' -f2) ]]" |
758 |
|
add_initrd 'then' |
759 |
|
add_initrd ' # many video drivers needed exec access' |
760 |
|
add_initrd ' fstype=ramfs' |
761 |
|
add_initrd ' # tmpfs was suggested by Greg Kroah-Hartman' |
762 |
|
add_initrd " [[ \$(grep '[[:space:]]tmpfs' /proc/filesystems | cut -d \$'\\t' -f2) = tmpfs ]] && fstype=tmpfs" |
763 |
|
add_initrd ' # mount devtmpfs if supported' |
764 |
|
add_initrd " [[ \$(grep '[[:space:]]devtmpfs' /proc/filesystems | cut -d \$'\\t' -f2) = devtmpfs ]] && fstype=devtmpfs" |
765 |
|
add_initrd ' mount -t ${fstype} dev /dev -o exec,nosuid,mode=0755,size=10M' |
766 |
|
add_initrd 'fi' |
767 |
|
|
768 |
[[ ${IMAGE_TYPE} = loopback ]] && add_initrd 'mount -t ramfs -o remount,rw /dev/ram /' |
[[ ${IMAGE_TYPE} = loopback ]] && add_initrd 'mount -t ramfs -o remount,rw /dev/ram /' |
769 |
|
|
770 |
|
# install all busybox applets |
771 |
|
add_initrd 'busybox --install -s' |
772 |
|
|
773 |
# silencio |
# silencio |
774 |
add_initrd 'echo 0 > /proc/sys/kernel/printk' |
add_initrd 'echo 0 > /proc/sys/kernel/printk' |
775 |
|
|
776 |
add_initrd 'echo "-- Creating initial device nodes ..."' |
add_initrd 'echo "-- Creating initial device nodes ..."' |
777 |
add_initrd 'mount -o exec,nosuid,mode=0755,size=10M -t tmpfs udev /dev' |
# populate dev |
778 |
add_initrd 'mkdir /dev/pts' |
add_initrd 'mdev -s' |
779 |
add_initrd 'mkdir /dev/shm' |
# handle hotplug events properly |
780 |
add_initrd 'mkdir /dev/mapper' |
add_initrd 'echo /sbin/mdev > /proc/sys/kernel/hotplug' |
|
add_initrd 'mkdir /dev/misc' |
|
|
add_initrd 'mkdir /dev/fb' |
|
|
add_initrd 'mkdir /dev/vc' |
|
|
add_initrd 'mknod /dev/console c 5 1' |
|
|
add_initrd 'mknod /dev/null c 1 3' |
|
|
add_initrd 'mknod /dev/ram b 1 1' |
|
|
add_initrd 'mknod /dev/rtc c 10 135' |
|
|
add_initrd 'mknod /dev/systty c 4 0' |
|
|
add_initrd 'mknod /dev/tty c 5 0' |
|
|
add_initrd 'mknod /dev/zero c 1 5' |
|
|
for (( i=0; i < 13; i++ )); do |
|
|
add_initrd "mknod /dev/tty${i} c 4 ${i}" |
|
|
done |
|
|
for (( i=64; i < 68; i++)); do |
|
|
add_initrd "mknod /dev/ttyS$((${i} - 64)) c 4 ${i}" |
|
|
done |
|
|
|
|
|
# some needed symlinks |
|
|
add_initrd 'ln -snf /proc/self/fd /dev/fd' |
|
|
add_initrd 'ln -snf fd/0 /dev/stdin' |
|
|
add_initrd 'ln -snf fd/1 /dev/stdout' |
|
|
add_initrd 'ln -snf fd/2 /dev/stderr' |
|
|
add_initrd 'ln -snf /proc/kcore /dev/core' |
|
781 |
|
|
782 |
# loading detected modules with options |
# loading detected modules with options |
783 |
for MODULE in ${MODULES} |
for MODULE in ${MODULES} |
784 |
do |
do |
785 |
text="" |
text="" |
786 |
module=$(echo ${MODULE} | sed "s|.*/||" | sed "s/.k\?o$//") |
module=$(echo ${MODULE} | sed "s|.*/||" | sed -e "s/.k\?o.\?g\?z\?$//" -e "s/.gz//") |
787 |
fullmodule=$(echo ${MODULE} | sed "s|.*/||") |
fullmodule=$(echo ${MODULE} | sed -e "s|.*/||" -e "s/.gz//") |
788 |
|
|
789 |
options=$(sed -n -e "s/^options[ ][ ]*${module}[ ][ ]*//p" ${modulefile} 2>/dev/null) |
options=$(sed -n -e "s/^options[ ][ ]*${module}[ ][ ]*//p" ${modprobeconf} 2>/dev/null) |
790 |
|
|
791 |
if [ -n "${options}" ] |
if [ -n "${options}" ] |
792 |
then |
then |
818 |
fi |
fi |
819 |
done |
done |
820 |
|
|
821 |
|
# respect rootdelay kernel param |
822 |
|
add_initrd 'for i in $(cat /proc/cmdline); do case ${i} in rootdelay=*) ROOTDELAY="${i#*=}";; esac; done' |
823 |
|
add_initrd 'if [ ! -z "${ROOTDELAY}" ]; then echo "-- Requested a rootdelay of ${ROOTDELAY} seconds ..."; sleep ${ROOTDELAY};fi' |
824 |
|
|
825 |
# lvm support |
# lvm support |
826 |
if [ -n "${vg_list}" ] |
if [ -n "${vg_list}" ] |
827 |
then |
then |
860 |
done |
done |
861 |
fi |
fi |
862 |
|
|
863 |
|
# get the right initexec |
864 |
|
add_initrd "INITEXEC=\"${INITEXEC}\"" |
865 |
|
# support init=* from cmdline |
866 |
|
add_initrd 'for i in $(cat /proc/cmdline); do case ${i} in init=*) INITEXEC="${i#*=}";; esac; done' |
867 |
|
|
868 |
add_initrd 'echo "-- Mounting sysroot ..."' |
add_initrd 'echo "-- Mounting sysroot ..."' |
869 |
add_initrd '. /etc/rootdev' |
add_initrd '. /etc/rootdev' |
|
add_initrd '[ ! -e ${device} ] && mknod ${device} b ${major} ${minor}' |
|
870 |
add_initrd 'echo "${device} /sysroot ${rootfs} defaults,ro 0 0" > /etc/fstab' |
add_initrd 'echo "${device} /sysroot ${rootfs} defaults,ro 0 0" > /etc/fstab' |
871 |
add_initrd 'mount /sysroot || ash' |
add_initrd 'mount /sysroot || ash' |
872 |
|
|
873 |
|
# use devtmpfs if supported |
874 |
|
add_initrd "if [ \"\$(grep devtmpfs /proc/filesystems | cut -d$'\t' -f2)\" = \"devtmpfs\" ]; then mount -t devtmpfs dev /sysroot/dev;fi" |
875 |
|
|
876 |
|
# unset hotplug event-manager |
877 |
|
add_initrd 'echo > /proc/sys/kernel/hotplug' |
878 |
|
|
879 |
# de-silencio |
# de-silencio |
880 |
add_initrd 'echo 3 > /proc/sys/kernel/printk' |
add_initrd 'echo 3 > /proc/sys/kernel/printk' |
881 |
|
|
882 |
|
add_initrd 'BREAK_ENABLED=no' |
883 |
|
add_initrd 'for i in $(cat /proc/cmdline); do case ${i} in break) BREAK_ENABLED=yes;; esac; done' |
884 |
|
add_initrd 'if [ "${BREAK_ENABLED}" = "yes" ]; then echo "-- Break requested, type 'exit' to resume operation ..."; ash; fi' |
885 |
|
|
886 |
add_initrd 'echo "-- Switching to real sysroot ..."' |
add_initrd 'echo "-- Switching to real sysroot ..."' |
887 |
add_initrd 'umount /sys' |
add_initrd 'mount --move /dev /sysroot/dev' |
888 |
add_initrd 'umount /proc' |
add_initrd 'mount --move /sys /sysroot/sys' |
889 |
add_initrd 'umount /dev' |
add_initrd 'mount --move /proc /sysroot/proc' |
890 |
|
|
891 |
[[ ${IMAGE_TYPE} = initramfs ]] && add_initrd 'exec run-init /sysroot /sbin/init $@ </sysroot/dev/console >/sysroot/dev/console' |
[[ ${IMAGE_TYPE} = initramfs ]] && add_initrd 'exec run-init /sysroot ${INITEXEC} $@ </sysroot/dev/console >/sysroot/dev/console' |
892 |
if [[ ${IMAGE_TYPE} = loopback ]] |
if [[ ${IMAGE_TYPE} = loopback ]] |
893 |
then |
then |
894 |
add_initrd 'cd /sysroot' |
add_initrd 'cd /sysroot' |
895 |
add_initrd 'pivot_root . initrd' |
add_initrd 'pivot_root . initrd' |
896 |
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" |
add_initrd "exec /sbin/chroot . sh -c 'umount -n /initrd >/dev/null 2>&1;exec -a init.new \${INITEXEC}'</dev/console >/dev/console 2>&1" |
897 |
fi |
fi |
898 |
|
|
899 |
chmod +x ${DEST}/init || die |
chmod +x ${DEST}/init || die |
900 |
|
|
901 |
# setup root block device |
# setup root block device |
902 |
[[ -z ${rootdev} ]] && die "no known rootdev found." |
[[ -z ${rootdev} ]] && die "no known rootdev found." |
903 |
echo "device=${rootdev}" > ${DEST}/etc/rootdev || die |
echo "device='UUID=$(get_blkid ${rootdev})'" > ${DEST}/etc/rootdev || die |
904 |
echo "major=$(stat -c %t ${rootdev})" >> ${DEST}/etc/rootdev || die |
echo "rootfs='${rootfs}'" >> ${DEST}/etc/rootdev || die |
|
echo "minor=$(stat -c %T ${rootdev})" >> ${DEST}/etc/rootdev || die |
|
|
echo "rootfs=${rootfs}" >> ${DEST}/etc/rootdev || die |
|
905 |
|
|
906 |
# install detected modules |
# install detected modules |
907 |
echo "Coping your modules to '${DEST}/lib' ..." |
echo "Coping your modules to '${DEST}/lib' ..." |
910 |
if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]] |
if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]] |
911 |
then |
then |
912 |
/usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die |
/usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die |
913 |
|
# handle gzip compressed modules right |
914 |
|
elif [[ ${MODULE##*.} = gz ]] |
915 |
|
then |
916 |
|
zcat ${verbose} ${MODULE} > ${DEST}/lib/$(basename ${MODULE} .gz) || die |
917 |
else |
else |
918 |
cp ${verbose} -a ${MODULE} ${DEST}/lib || die |
cp ${verbose} -a ${MODULE} ${DEST}/lib || die |
919 |
fi |
fi |