Magellan Linux

Diff of /trunk/mkinitrd-magellan/mkinitrd.in

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 703 by niro, Mon Mar 31 13:50:09 2008 UTC revision 1876 by niro, Wed Jul 11 09:57:18 2012 UTC
# Line 1  Line 1 
1  #!/bin/bash  #!/bin/bash
2  # $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd-magellan/mkinitrd.in,v 1.2 2008-03-31 13:50:09 niro Exp $  # $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd-magellan/mkinitrd.in,v 1.4 2008-06-11 22:11:40 niro Exp $
3    
4  # mkinitrd  # mkinitrd
5  #  #
# Line 39  PROBE="yes" Line 39  PROBE="yes"
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=""
# Line 53  force="" Line 56  force=""
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
# Line 75  usage() Line 79  usage()
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    
# Line 91  moduledep() Line 96  moduledep()
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   /^\/lib/ { show(); \   /^.*kernel/ { show(); \
102   orig=modname($1); dep=""; \   orig=modname($1); dep=""; \
103   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)); } } } \
104   /^ / { dep=sprintf("%s %s", dep, modname($1));  } \   /^ / { dep=sprintf("%s %s", dep, modname($1));  } \
# Line 129  findmodule() Line 134  findmodule()
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}'( |$)'
# Line 161  findmodule() Line 167  findmodule()
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
# Line 249  findstoragedriver() Line 255  findstoragedriver()
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
# Line 319  handlelvordev() Line 325  handlelvordev()
325   fi   fi
326  }  }
327    
328    get_blkid()
329    {
330     local UUID
331     local SEC_TYPE
332     local TYPE
333    
334     local dev="$1"
335     [[ -z ${dev} ]] && die "no dev given"
336    
337     # check if given device is already an UUID
338     if [[ ${dev/UUID=/}x != ${dev}x ]]
339     then
340     eval "${dev}"
341     else
342     eval $(busybox.mkinitrd blkid ${dev} | grep "${dev}:" | sed 's/.*:\ //')
343     fi
344     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    
# Line 395  while [ $# -gt 0 ]; do Line 435  while [ $# -gt 0 ]; do
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
# Line 453  fi Line 501  fi
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
# Line 468  then Line 515  then
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
# Line 649  echo "Using modules:${MODULES}" Line 694  echo "Using modules:${MODULES}"
694    
695    
696  # create basic filesystem layout  # create basic filesystem layout
697  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
698    
699  # install busybox  # install busybox
700  echo "$(which busybox.mkinitrd)"  echo "$(which busybox.mkinitrd)"
# Line 669  done Line 714  done
714  # sbin related  # sbin related
715  for i in chroot init losetup modprobe pivot_root  for i in chroot init losetup modprobe pivot_root
716  do  do
717   # static links   ln -s ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}"
  ln ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}"  
718  done  done
719    
720  # install run-init  # install run-init
# Line 678  echo "$(which run-init.mkinitrd)" Line 722  echo "$(which run-init.mkinitrd)"
722  install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die  install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die
723    
724  # install insmod.static  # install insmod.static
725  echo "$(which insmod.static)"  #echo "$(which insmod.static)"
726  install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die  #install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die
727    
728  # install v86d for uvesafb support if installed  # install v86d for uvesafb support if installed
729  if which v86d &> /dev/null  if which v86d &> /dev/null
730  then  then
731   echo "$(which insmod.static)"   echo "$(which v86d)"
732   install -m0755 $(which v86d) ${DEST}/sbin/v86d || die   install -m0755 $(which v86d) ${DEST}/sbin/v86d || die
733  fi  fi
734    
# Line 727  add_initrd '#!/bin/sh' Line 771  add_initrd '#!/bin/sh'
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 "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    
787    # install all busybox applets
788    add_initrd 'busybox --install -s'
789    
790  # silencio  # silencio
791  add_initrd 'echo 0 > /proc/sys/kernel/printk'  add_initrd 'echo 0 > /proc/sys/kernel/printk'
792    
793  add_initrd 'echo "-- Creating inital device nodes ..."'  add_initrd 'echo "-- Creating initial device nodes ..."'
794  add_initrd 'mount -o exec,nosuid,mode=0755,size=10M -t tmpfs udev /dev'  # populate dev
795  add_initrd 'mkdir /dev/pts'  add_initrd 'mdev -s'
796  add_initrd 'mkdir /dev/shm'  # handle hotplug events properly
797  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'  
798    
799  # loading detected modules with options  # loading detected modules with options
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
# Line 799  do Line 833  do
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
# Line 839  then Line 892  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'
 add_initrd '[ ! -e ${device} ] && mknod ${device} b ${major} ${minor}'  
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'
903  add_initrd 'mount /sysroot'  add_initrd 'mount /sysroot || ash'
904    
905    # unset hotplug event-manager
906    add_initrd 'echo > /proc/sys/kernel/hotplug'
907    
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 /sys'  add_initrd 'mount --move /dev /sysroot/dev'
917  add_initrd 'umount /proc'  add_initrd 'mount --move /sys /sysroot/sys'
918  add_initrd 'umount /dev'  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
929    
930  # setup root block device  # setup root block device
931  [[ -z ${rootdev} ]] && die "no known rootdev found."  [[ -z ${rootdev} ]] && die "no known rootdev found."
932  echo "device=${rootdev}" > ${DEST}/etc/rootdev || die  echo "device='UUID=$(get_blkid ${rootdev})'" > ${DEST}/etc/rootdev || die
933  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  
934    
935  # install detected modules  # install detected modules
936  echo "Coping your modules to '${DEST}/lib' ..."  echo "Coping your modules to '${DEST}/lib' ..."
# Line 877  do Line 939  do
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 ]]

Legend:
Removed from v.703  
changed lines
  Added in v.1876