39 |
MODULES="" |
MODULES="" |
40 |
PREMODS="" |
PREMODS="" |
41 |
NOSTRIP=false |
NOSTRIP=false |
42 |
|
FIRMWARE_PATH="/lib/firmware" |
43 |
|
FIRMWARE_FILES="" |
44 |
|
|
45 |
[ -e /etc/conf.d/mkinitrd ] && . /etc/conf.d/mkinitrd |
[ -e /etc/conf.d/mkinitrd ] && . /etc/conf.d/mkinitrd |
46 |
|
|
47 |
CONFMODS="${MODULES}" |
CONFMODS="${MODULES}" |
48 |
MODULES="" |
MODULES="" |
49 |
|
INITEXEC="/sbin/init" |
50 |
|
|
51 |
compress=1 |
compress=1 |
52 |
allowmissing="" |
allowmissing="" |
56 |
verbose="" |
verbose="" |
57 |
img_vers="" |
img_vers="" |
58 |
builtins="" |
builtins="" |
59 |
modulefile=/etc/modules.conf |
modulefile="/etc/modules.conf" |
60 |
|
modprobeconf="/etc/modprobe.d/*" |
61 |
rc=0 |
rc=0 |
62 |
|
|
63 |
IMAGESIZE=4000 |
IMAGESIZE=4000 |
79 |
echo " [--image-version] [--force-scsi-probe | --omit-raid-modules]" |
echo " [--image-version] [--force-scsi-probe | --omit-raid-modules]" |
80 |
echo " [--with=<module>] [--force-lvm-probe | --omit-lvm-modules]" |
echo " [--with=<module>] [--force-lvm-probe | --omit-lvm-modules]" |
81 |
echo " [--builtin=<module>] [--initramfs | --loopback] [--no-strip]" |
echo " [--builtin=<module>] [--initramfs | --loopback] [--no-strip]" |
82 |
echo " [--fstab=<fstab>] [--nocompress] <initrd-image> <kernel-version>" |
echo " [--fstab=<fstab>] [--nocompress] [--initexec=<init>]" |
83 |
|
echo " <initrd-image> <kernel-version>" |
84 |
echo |
echo |
85 |
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)" |
86 |
|
|
96 |
|
|
97 |
echo "Looking for deps of module $1" |
echo "Looking for deps of module $1" |
98 |
deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \ |
deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \ |
99 |
function modname(filename) { match(filename, /\/([^\/]+)\.k?o:?$/, ret); return ret[1] } \ |
function modname(filename) { match(filename, /\/([^\/]+)\.k?o.?g?z?:?$/, ret); return ret[1] } \ |
100 |
function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \ |
function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \ |
101 |
/^.*kernel/ { show(); \ |
/^.*kernel/ { show(); \ |
102 |
orig=modname($1); dep=""; \ |
orig=modname($1); dep=""; \ |
134 |
|
|
135 |
case "${MODULES} " in |
case "${MODULES} " in |
136 |
*"/${modName}.ko "*) return ;; |
*"/${modName}.ko "*) return ;; |
137 |
|
*"/${modName}.ko.gz "*) return ;; |
138 |
esac |
esac |
139 |
|
|
140 |
if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)' |
if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)' |
167 |
done |
done |
168 |
fi |
fi |
169 |
|
|
170 |
for modExt in o.gz o ko |
for modExt in o.gz o ko ko.gz |
171 |
do |
do |
172 |
for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel} |
for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel} |
173 |
do |
do |
255 |
modalias=$(cat modalias) |
modalias=$(cat modalias) |
256 |
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) }') |
257 |
do |
do |
258 |
findmodule ${driver%%.ko} |
findmodule ${driver%%.*} |
259 |
done |
done |
260 |
popd >/dev/null 2>&1 |
popd >/dev/null 2>&1 |
261 |
done |
done |
344 |
echo ${UUID} |
echo ${UUID} |
345 |
} |
} |
346 |
|
|
347 |
|
add_firmware() |
348 |
|
{ |
349 |
|
local firmware="$1" |
350 |
|
local i |
351 |
|
|
352 |
|
# check if given firmware is already included in FIRMWARE_FILES |
353 |
|
for i in ${FIRMWARE_FILES} |
354 |
|
do |
355 |
|
[[ ${firmware} = ${i} ]] && return 0 |
356 |
|
done |
357 |
|
|
358 |
|
# include firmware |
359 |
|
FIRMWARE_FILES="${FIRMWARE_FILES} ${firmware}" |
360 |
|
} |
361 |
|
|
362 |
# need r00t privs |
# need r00t privs |
363 |
[[ $(id -u) != 0 ]] && die "you must be r00t." |
[[ $(id -u) != 0 ]] && die "you must be r00t." |
364 |
|
|
435 |
--initramfs) IMAGE_TYPE=initramfs ;; |
--initramfs) IMAGE_TYPE=initramfs ;; |
436 |
--loopback) IMAGE_TYPE=loopback ;; |
--loopback) IMAGE_TYPE=loopback ;; |
437 |
--no-strip) NOSTRIP=true ;; |
--no-strip) NOSTRIP=true ;; |
438 |
|
--initexec*) |
439 |
|
if echo $1 | grep -q '=' ; then |
440 |
|
INITEXEC=$(echo $1 | sed 's/^--initexec=//') |
441 |
|
else |
442 |
|
INITEXEC=$2 |
443 |
|
shift |
444 |
|
fi |
445 |
|
;; |
446 |
*) |
*) |
447 |
if [ -z "${target}" ] |
if [ -z "${target}" ] |
448 |
then |
then |
501 |
####### get modules ########## |
####### get modules ########## |
502 |
|
|
503 |
echo "Creating ${IMAGE_TYPE} initrd image" |
echo "Creating ${IMAGE_TYPE} initrd image" |
|
modulefile=/etc/modprobe.conf |
|
504 |
|
|
505 |
for n in ${PREMODS} |
for n in ${PREMODS} |
506 |
do |
do |
515 |
for fs in / /boot |
for fs in / /boot |
516 |
do |
do |
517 |
esc=$(echo ${fs} | sed 's,/,\\/,g') |
esc=$(echo ${fs} | sed 's,/,\\/,g') |
518 |
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]*$//') |
519 |
if [ "$(echo ${dev} | cut -c1-2)" = sd ] |
if [ "$(echo ${dev} | cut -c6-7)" = sd ] |
520 |
then |
then |
521 |
if [ $(which kudzu 2>/dev/null) ] |
if [ $(which hwinfo 2>/dev/null) ] |
522 |
then |
then |
523 |
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} ] |
|
524 |
then |
then |
525 |
needusb=1 |
needusb=1 |
526 |
fi |
fi |
771 |
|
|
772 |
add_initrd 'mount -t proc proc /proc' |
add_initrd 'mount -t proc proc /proc' |
773 |
add_initrd 'mount -t sysfs sysfs /sys' |
add_initrd 'mount -t sysfs sysfs /sys' |
774 |
add_initrd 'mount -t tmpfs tmpfs /dev -o rw,mode=0644,size=1024' |
add_initrd "if [[ -z \$(grep '[[:space:]]/dev[[:space:]]' /proc/mounts | cut -d ' ' -f2) ]]" |
775 |
|
add_initrd 'then' |
776 |
|
add_initrd ' # many video drivers needed exec access' |
777 |
|
add_initrd ' fstype=ramfs' |
778 |
|
add_initrd ' # tmpfs was suggested by Greg Kroah-Hartman' |
779 |
|
add_initrd " [[ \$(grep '[[:space:]]tmpfs' /proc/filesystems | cut -d \$'\\t' -f2) = tmpfs ]] && fstype=tmpfs" |
780 |
|
add_initrd ' # mount devtmpfs if supported' |
781 |
|
add_initrd " [[ \$(grep '[[:space:]]devtmpfs' /proc/filesystems | cut -d \$'\\t' -f2) = devtmpfs ]] && fstype=devtmpfs" |
782 |
|
add_initrd ' mount -t ${fstype} dev /dev -o exec,nosuid,mode=0755,size=10M' |
783 |
|
add_initrd 'fi' |
784 |
|
|
785 |
[[ ${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 /' |
786 |
|
|
800 |
for MODULE in ${MODULES} |
for MODULE in ${MODULES} |
801 |
do |
do |
802 |
text="" |
text="" |
803 |
module=$(echo ${MODULE} | sed "s|.*/||" | sed "s/.k\?o$//") |
module=$(echo ${MODULE} | sed "s|.*/||" | sed -e "s/.k\?o.\?g\?z\?$//" -e "s/.gz//") |
804 |
fullmodule=$(echo ${MODULE} | sed "s|.*/||") |
fullmodule=$(echo ${MODULE} | sed -e "s|.*/||" -e "s/.gz//") |
805 |
|
|
806 |
options=$(sed -n -e "s/^options[ ][ ]*${module}[ ][ ]*//p" ${modulefile} 2>/dev/null) |
options=$(sed -n -e "s/^options[ ][ ]*${module}[ ][ ]*//p" ${modprobeconf} 2>/dev/null) |
807 |
|
|
808 |
if [ -n "${options}" ] |
if [ -n "${options}" ] |
809 |
then |
then |
833 |
add_initrd "echo -n 1 > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/online" |
add_initrd "echo -n 1 > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/online" |
834 |
done |
done |
835 |
fi |
fi |
836 |
|
|
837 |
|
# get firmware files if neccessary |
838 |
|
if [ -x $(which modinfo 2> /dev/null) ] |
839 |
|
then |
840 |
|
firmware_blobs=$(modinfo ${module}${text} | grep 'firmware:' | sed 's:^firmware\:.*[[:space:]]\(.*\):\1:') |
841 |
|
if [[ ! -z ${firmware_blobs} ]] |
842 |
|
then |
843 |
|
for firmware in ${firmware_blobs} |
844 |
|
do |
845 |
|
add_firmware "${firmware}" |
846 |
|
done |
847 |
|
fi |
848 |
|
else |
849 |
|
echo "Warning 'modinfo' not found" |
850 |
|
fi |
851 |
done |
done |
852 |
|
|
853 |
|
# respect rootdelay kernel param |
854 |
|
add_initrd 'for i in $(cat /proc/cmdline); do case ${i} in rootdelay=*) ROOTDELAY="${i#*=}";; esac; done' |
855 |
|
add_initrd 'if [ ! -z "${ROOTDELAY}" ]; then echo "-- Requested a rootdelay of ${ROOTDELAY} seconds ..."; sleep ${ROOTDELAY};fi' |
856 |
|
|
857 |
# lvm support |
# lvm support |
858 |
if [ -n "${vg_list}" ] |
if [ -n "${vg_list}" ] |
859 |
then |
then |
892 |
done |
done |
893 |
fi |
fi |
894 |
|
|
895 |
|
# get the right initexec |
896 |
|
add_initrd "INITEXEC=\"${INITEXEC}\"" |
897 |
|
# support init=* from cmdline |
898 |
|
add_initrd 'for i in $(cat /proc/cmdline); do case ${i} in init=*) INITEXEC="${i#*=}";; esac; done' |
899 |
|
|
900 |
add_initrd 'echo "-- Mounting sysroot ..."' |
add_initrd 'echo "-- Mounting sysroot ..."' |
901 |
add_initrd '. /etc/rootdev' |
add_initrd '. /etc/rootdev' |
902 |
add_initrd 'echo "${device} /sysroot ${rootfs} defaults,ro 0 0" > /etc/fstab' |
add_initrd 'echo "${device} /sysroot ${rootfs} defaults,ro 0 0" > /etc/fstab' |
908 |
# de-silencio |
# de-silencio |
909 |
add_initrd 'echo 3 > /proc/sys/kernel/printk' |
add_initrd 'echo 3 > /proc/sys/kernel/printk' |
910 |
|
|
911 |
|
add_initrd 'BREAK_ENABLED=no' |
912 |
|
add_initrd 'for i in $(cat /proc/cmdline); do case ${i} in break) BREAK_ENABLED=yes;; esac; done' |
913 |
|
add_initrd 'if [ "${BREAK_ENABLED}" = "yes" ]; then echo "-- Break requested, type 'exit' to resume operation ..."; ash; fi' |
914 |
|
|
915 |
add_initrd 'echo "-- Switching to real sysroot ..."' |
add_initrd 'echo "-- Switching to real sysroot ..."' |
916 |
add_initrd 'umount /dev' |
add_initrd 'mount --move /dev /sysroot/dev' |
917 |
add_initrd 'umount /sys' |
add_initrd 'mount --move /sys /sysroot/sys' |
918 |
add_initrd 'umount /proc' |
add_initrd 'mount --move /proc /sysroot/proc' |
919 |
|
|
920 |
[[ ${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' |
921 |
if [[ ${IMAGE_TYPE} = loopback ]] |
if [[ ${IMAGE_TYPE} = loopback ]] |
922 |
then |
then |
923 |
add_initrd 'cd /sysroot' |
add_initrd 'cd /sysroot' |
924 |
add_initrd 'pivot_root . initrd' |
add_initrd 'pivot_root . initrd' |
925 |
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" |
926 |
fi |
fi |
927 |
|
|
928 |
chmod +x ${DEST}/init || die |
chmod +x ${DEST}/init || die |
939 |
if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]] |
if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]] |
940 |
then |
then |
941 |
/usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die |
/usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die |
942 |
|
# handle gzip compressed modules right |
943 |
|
elif [[ ${MODULE##*.} = gz ]] |
944 |
|
then |
945 |
|
zcat ${verbose} ${MODULE} > ${DEST}/lib/$(basename ${MODULE} .gz) || die |
946 |
else |
else |
947 |
cp ${verbose} -a ${MODULE} ${DEST}/lib || die |
cp ${verbose} -a ${MODULE} ${DEST}/lib || die |
948 |
fi |
fi |
949 |
done |
done |
950 |
|
|
951 |
|
# install firmware if neccessary |
952 |
|
if [[ ! -z ${FIRMWARE_FILES} ]] |
953 |
|
then |
954 |
|
for firmware in ${FIRMWARE_FILES} |
955 |
|
do |
956 |
|
if [ -e ${FIRMWARE_PATH}/${firmware} ] |
957 |
|
then |
958 |
|
echo "installing firmware '${firmware}'" |
959 |
|
install ${verbose} -d ${DEST}/${FIRMWARE_PATH}/${firmware%/*} || die |
960 |
|
cp ${verbose} -a ${FIRMWARE_PATH}/${firmware} ${DEST}/${FIRMWARE_PATH}/${firmware%/*} || die |
961 |
|
fi |
962 |
|
done |
963 |
|
fi |
964 |
|
|
965 |
# create the image |
# create the image |
966 |
echo "Creating initrd image '${target}' ..." |
echo "Creating initrd image '${target}' ..." |
967 |
if [[ ${IMAGE_TYPE} = initramfs ]] |
if [[ ${IMAGE_TYPE} = initramfs ]] |