home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / sbin / mkinitrd < prev    next >
Text File  |  2006-11-29  |  86KB  |  3,378 lines

  1. #! /bin/bash
  2.  
  3. # mkinitrd - create the initramfs images
  4. # usage: see below usage() or call with -h
  5. #
  6. # Copyright (C) 1999-2006 SuSE Linux Products GmbH, Nuernberg, Germany
  7. #
  8. # This program is free software; you can redistribute it and/or
  9. # modify it under the terms of the GNU General Public License
  10. # as published by the Free Software Foundation; either version 2
  11. # of the License, or (at your option) any later version.
  12. #
  13. # This program is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. # GNU General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License
  19. # along with this program; if not, write to the Free Software
  20. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
  21. # USA.
  22.  
  23. # This file is kept in the following CVS repository:
  24. #
  25. # $Source: /suse/yast2/cvsroot/mkinitrd/mkinitrd,v $
  26. # $Revision: 1.374 $
  27.  
  28. usage() {
  29.     cat<<EOF
  30.     Create initial ramdisk images that contain all kernel modules
  31.     needed in the early boot process, before the root file system
  32.     becomes available. This usually includes SCSI and/or RAID
  33.     modules, a file system module for the root file system, or
  34.     a network interface driver module for dhcp.
  35.  
  36.         mkinitrd [options]
  37.  
  38.         options:
  39.           -h               This Text.
  40.           -k "kernel list" List of kernel images for which initrd files
  41.                            are created. Defaults to all kernels found
  42.                in /boot.
  43.           -i "initrd list" List of file names for the initrd; position
  44.                  have match to "kernel list". Defaults to all
  45.                all kernels found in /boot.
  46.           -m "module list" Modules to include in initrd. Defaults to the
  47.                            INITRD_MODULES variable in /etc/sysconfig/kernel.
  48.           -u "DomU module list" Modules to include in initrd. Defaults to
  49.                            the DOMU_INITRD_MODULES variable in
  50.                            /etc/sysconfig/kernel.
  51.           -f "feature list" Features to be enabled when generating initrd.
  52.                            Available features are:
  53.                            iscsi, md, mpath, lvm, lvm2, evms
  54.           -b boot_dir      Boot directory. Defaults to /boot.
  55.           -d root_device   Root device. Defaults to the device from which
  56.                            / is mounted. Overrides the rootdev enviroment
  57.                variable if set.
  58.       -s size          Add splash animation and bootscreen to initrd.
  59.       -t tmp_dir       Temporary directory. Defaults to /var/tmp.
  60.       -D interface     Run dhcp on the specified interface.
  61.       -I interface     Configure the specified interface statically.
  62.       -a acpi_dsdt     Attach compiled ACPI DSDT (Differentiated System
  63.                  Description Table) to initrd. This replaces the
  64.                DSDT of the BIOS. Defaults to the ACPI_DSDT
  65.                variable in /etc/sysconfig/kernel.
  66.           -e               Use static binaries where possible (currently unavailable)
  67.           -P               Include modules for IDE devices on the PCI bus
  68.       -V script        Vendor specific script to run in linuxrc.
  69.       -M map           System.map file to use.
  70. EOF
  71.     exit
  72. }
  73.  
  74. default_kernel_images() {
  75.     local regex kernel_image kernel_version version_version initrd_image
  76.     local qf='%{NAME}-%{VERSION}-%{RELEASE}\n'
  77.  
  78.     case "$(uname -m)" in
  79.     s390|s390x)
  80.         regex='image'
  81.         ;;
  82.     ppc|ppc64)
  83.         regex='vmlinux'
  84.         ;;
  85.     *)  regex='vmlinuz'
  86.         ;;
  87.     esac
  88.  
  89.     # user mode linux
  90.     if grep -q UML /proc/cpuinfo; then
  91.         regex='linux'
  92.     fi
  93.  
  94.     kernel_images=""
  95.     initrd_images=""
  96.     for kernel_image in $(ls /boot \
  97.         | sed -ne "\|^$regex\(-[0-9.]\+-[0-9]\+-[a-z0-9]\+$\)\?|p") ; do
  98.  
  99.     # Note that we cannot check the RPM database here -- this
  100.     # script is itself called from within the binary kernel
  101.     # packages, and rpm does not allow recursive calls.
  102.  
  103.     [ -L "/boot/$kernel_image" ] && continue
  104.     kernel_version=$(/sbin/get_kernel_version \
  105.              /boot/$kernel_image 2> /dev/null)
  106.     initrd_image=$(echo $kernel_image | sed -e "s|${regex}|initrd|")
  107.     if [ "$kernel_image" != "$initrd_image" -a \
  108.          -n "$kernel_version" -a \
  109.          -d "/lib/modules/$kernel_version" ]; then
  110.         kernel_images="$kernel_images /boot/$kernel_image"
  111.         initrd_images="$initrd_images /boot/$initrd_image"
  112.     fi
  113.     done
  114. }
  115.  
  116. # You can specify the root device via the environment variable rootdev (e.g.
  117. # "rootdev=/dev/hda mkinitrd").
  118.  
  119. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  120. # general configurable parameters
  121.  
  122. kernel_images=
  123. initrd_images=
  124. modules=
  125. modules_set=
  126. domu_modules=
  127. domu_modules_set=
  128. feature_list=
  129. boot_dir=
  130. splash=off
  131. use_static_binaries=ignored
  132. acpi_dsdt=
  133. use_selinux=
  134. sysmap=
  135. journaldev=
  136. build_day=20061124
  137. scan_pci_bus=
  138.  
  139. # architecture dependend changes:
  140. case "$(uname -m)" in
  141.     i?86|x86_64)
  142.     splash="auto"
  143.     ;;
  144. esac
  145.  
  146. while getopts :ef:hk:i:m:u:b:d:s:St:D:I:V:a:M:Pj: a ; do
  147.     case $a in
  148.     \:|\?)    case $OPTARG in
  149.         k)  echo "-k requires kernel list parameter"
  150.             ;;
  151.         i)  echo "-i requires initrd list parameter"
  152.             ;;
  153.         m)  echo "-m requires module list parameter"
  154.             ;;
  155.         u)  echo "-u requires module list parameter"
  156.             ;;
  157.         f)  echo "-f requires feature list parameter"
  158.             ;;
  159.         b)  echo "-b requires boot dir parameter"
  160.             ;;
  161.         d)  echo "-d requires root device parameter"
  162.             ;;
  163.         s)  echo "-s requires image size(s)"
  164.             ;;
  165.         t)  echo "-t requires tmp dir parameter"
  166.             ;;
  167.         D)  echo "-D requires dhcp interface parameter"
  168.             ;;
  169.         I)  echo "-I requires network interface parameter"
  170.             ;;
  171.         a)  echo "-a requires a DSDT parameter"
  172.             ;;
  173.         V)  echo "-V requires an executable to run inside linuxrc"
  174.             ;;
  175.         M)  echo "-M requires the System.map file"
  176.             ;;    
  177.         j)  echo "-j requires the journal device"
  178.             ;;    
  179.         *)  echo "Unknown option: -$OPTARG"
  180.             echo "Try mkinitrd -h"
  181.             ;;
  182.         esac
  183.         exit 1
  184.         ;;
  185.     e)  use_static_binaries=ignored
  186.         ;;
  187.     f)  feature_list=$OPTARG
  188.         ;;
  189.     k)  kernel_images=$OPTARG
  190.         ;;
  191.     i)  initrd_images=$OPTARG
  192.         ;;
  193.     m)  modules=$OPTARG
  194.         modules_set=1
  195.         ;;
  196.     u)  domu_modules=$OPTARG
  197.         domu_modules_set=1
  198.         ;;
  199.     b)  boot_dir=$OPTARG
  200.         ;;
  201.     d)  rootdev=$OPTARG
  202.         ;;
  203.     s)  splash=$OPTARG
  204.         ;;
  205.     t)  tmp_dir=$OPTARG
  206.         ;;
  207.     D)  interface=$OPTARG
  208.         interface=${interface#/dev/}
  209.         use_dhcp=1
  210.         scan_pci_bus=
  211.         ;;
  212.      I)  interface=$OPTARG
  213.          interface=${interface#/dev/}
  214.          use_ipconfig=1
  215.         scan_pci_bus=
  216.         ;;
  217.     a)  acpi_dsdt="$OPTARG"
  218.         ;;
  219.     S)  use_selinux=1
  220.         ;;
  221.     V)  vendor_init_script="$OPTARG"
  222.         ;;
  223.     M)  sysmap="$OPTARG"
  224.         ;;
  225.     P)  scan_pci_bus=1
  226.         ;;
  227.     j)  journaldev="$OPTARG"
  228.         ;;
  229.     h)  usage
  230.         ;;
  231.     esac
  232. done
  233. shift $(( $OPTIND - 1 ))
  234.  
  235. mkinit_name="mkinitramfs"
  236.  
  237. if [ -n "$1" ]; then
  238.     root_dir=${1%/}  # strip trailing slash
  239. else
  240.     root_dir=
  241. fi
  242.  
  243. if [ -n "$boot_dir" ]; then
  244.     boot_dir="${boot_dir#/}"
  245.     boot_dir="/${boot_dir%/}"
  246. else
  247.     boot_dir="/boot"
  248. fi
  249. if [ ! -d "$boot_dir" ]; then
  250.     echo "$boot_dir is not a directory" >&2
  251.     exit 1
  252. fi
  253.  
  254. if [ -n "$tmp_dir" ]; then
  255.     tmp_dir="/${tmp_dir#/}"  # make sure it is an absolute path
  256. else
  257.     tmp_dir=/var/tmp
  258. fi
  259. if [ ! -d "$tmp_dir" ]; then
  260.     echo "$tmp_dir is not a directory" >&2
  261.     exit 1
  262. fi
  263.  
  264. # Check if the -k and -i settings are valid.
  265. if [ $(set -- $kernel_images ; echo $#) -ne \
  266.      $(set -- $initrd_images ; echo $#) ]; then
  267.     echo "You have to specify -k and -i, or none of both. The -k" \
  268.          "and -i options must each contain the same number of items." >&2
  269.     exit 1
  270. fi
  271.  
  272. # Mount /usr, required for ldd and other tools to create the initrd tree
  273. mounted_usr=
  274. if [ ! -x /usr/bin/ldd ]; then
  275.   mounted_usr=/usr
  276.   if ! mount -n -v /usr ; then
  277.     echo "/usr/bin/ldd not available and mount /usr failed." \
  278.          "mkinitrd does not work without it." >&2
  279.     exit 1
  280.   fi
  281. fi
  282.  
  283. # Mount /proc if not already done so
  284. mounted_proc=
  285. if [ ! -e /proc/mounts ]; then
  286.   mounted_proc=/proc
  287.   mount -n -t proc proc $mounted_proc
  288. fi
  289.  
  290. # And /sys likewise
  291. mounted_sys=
  292. if [ ! -d /sys/devices ] ; then
  293.     mounted_sys=/sys
  294.     mount -n -t sysfs none /sys
  295. fi
  296.  
  297. if [ -z "$kernel_images" -o -z "$initrd_images" ]; then
  298.     default_kernel_images
  299. fi
  300.  
  301. # The shell-bang line to use inside initrd.
  302. # has to be bash due to $@ array usage
  303. shebang=/bin/bash
  304.  
  305. initrd_insmod=/sbin/insmod
  306. initrd_modprobe=/sbin/modprobe
  307.  
  308. # maximum initrd size
  309. image_blocks=40960
  310. image_inodes=2048
  311.  
  312. # handle splash screen
  313. case "$splash" in
  314. off)
  315.     splashsizes= ;;
  316. auto)
  317.     unset ${!splash_size_*}
  318.     modes=
  319.     for file in $root_dir/{etc/lilo.conf,boot/grub/menu.lst,proc/cmdline}; do
  320.     [ -e $file ] || continue
  321.      modes="$modes $(sed -e '/^[ \t]*#/d' $file \
  322.             | sed -ne 's/^.*vga[ \t]*=[ \t]*\([^ \t]*\).*/\1/p' \
  323.             | sed -ne '/^\([0-9]\+\|0[xX][0-9a-fA-F]\+\)$/p')"
  324.     done
  325.  
  326.     for mode in $modes; do
  327.     case $(($mode)) in  # $((...)) : Convert 0xFOO to decimal
  328.     785|786) splash_size_640x480=1 ;;
  329.     788|789) splash_size_800x600=1 ;;
  330.     791|792) splash_size_1024x768=1 ;;
  331.     794|795) splash_size_1280x1024=1 ;;
  332.     *)       vgahex=$(printf 0x%04x "$(($mode))")
  333.          if [ -x /usr/sbin/hwinfo ] ; then
  334.              size=$(/usr/sbin/hwinfo --framebuffer | \
  335.              sed -ne 's/^.*Mode '$vgahex': \([^ ]\+\) .*$/\1/p' \
  336.              2>/dev/null)
  337.              eval splash_size_$size=1
  338.          fi ;;
  339.         esac
  340.     done
  341.     # Get current modes from fb
  342.     for fb in /sys/class/graphics/fb* ; do
  343.     if [ -d $fb ] && [ -f $fb/virtual_size ] ; then
  344.         size=$(sed -ne 's/,/x/p' $fb/virtual_size)
  345.         eval splash_size_$size=1
  346.     fi
  347.     done
  348.     splashsizes="$(for x in ${!splash_size_*}; do
  349.             echo ${x#splash_size_}
  350.            done)"
  351.     unset ${!splash_size_*}
  352.     ;;
  353. *)
  354.     splashsizes=$splash ;;
  355. esac
  356.  
  357. # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  358. # should be nothing to change below...
  359.  
  360. PATH=/sbin:/usr/sbin:$PATH
  361.  
  362. # Fixup old installations
  363. unset CDPATH
  364.  
  365. work_dir=$(mktemp -qd $tmp_dir/${mkinit_name}.XXXXXX)
  366. if [ $? -ne 0 ]; then
  367.     echo "$0: Can't create temp dir, exiting." >&2
  368.     exit 1
  369. fi
  370.  
  371. umount_proc() {
  372.     [ "$mounted_proc" ] && umount -n $mounted_proc
  373.     mounted_proc=
  374.     [ "$mounted_sys" ] && umount -n $mounted_sys
  375.     mounted_sys=
  376.     [ "$mounted_usr" ] && umount -v -n $mounted_usr
  377.     mounted_usr=
  378. }
  379.  
  380. cleanup() {
  381.     rm -f $tmp_initrd $tmp_initrd.gz
  382.     initrd_bins=()
  383. }
  384.  
  385. cleanup_finish() {
  386.     umount_proc
  387.     [ -d "$work_dir" ] && rm -rf $work_dir
  388. }
  389.  
  390. handle_terminate() {
  391.     echo "(received signal)
  392.  
  393. Interrupted, cleaning up." >&2
  394.     cleanup
  395.     cleanup_finish
  396.     exit 255
  397. }
  398.  
  399. trap handle_terminate 1 2 3 15
  400.  
  401. error() {
  402.     echo "$2" >&2
  403.     cleanup
  404.     cleanup_finish
  405.     exit $1
  406. }
  407.  
  408. oops() {
  409.     exit_code=$1
  410.     shift
  411.     echo "$@" >&2
  412. }
  413.  
  414. is_xen_kernel() {
  415.     local kversion=$1
  416.     local cfg
  417.  
  418.     for cfg in ${root_dir}/boot/config-$kversion $root_dir/lib/modules/$kversion/build/.config
  419.     do
  420.     test -r $cfg || continue
  421.     grep -q "^CONFIG_XEN=y\$" $cfg
  422.     return
  423.     done
  424.     test $kversion != "${kversion%-xen*}"
  425.     return 
  426. }
  427.  
  428. # Check if module $1 is listed in $modules.
  429. has_module() {
  430.     case " $modules " in
  431.     *" $1 "*)   return 0 ;;
  432.     esac
  433.     return 1
  434. }
  435.  
  436. # Check if any of the modules in $* are listed in $modules.
  437. has_any_module() {
  438.     local module
  439.     for module in "$@"; do
  440.     has_module "$module" && return 0
  441.     done
  442. }
  443.  
  444. # Add module $1 at the end of the module list.
  445. add_module() {
  446.     local module
  447.     for module in "$@"; do
  448.     has_module "$module" || modules="$modules $module"
  449.     done
  450. }
  451.  
  452. # Install a binary file
  453. cp_bin() {
  454.     cp -a "$@" \
  455.     || exit_code=1
  456.  
  457.     # Remember the binaries installed. We need the list for checking
  458.     # for dynamic libraries.
  459.     while [ $# -gt 1 ]; do
  460.     initrd_bins[${#initrd_bins[@]}]=$1
  461.     shift
  462.    done
  463.    # file may print '^setuid ELF ...'
  464.    # suid mount will fail if mkinitrd was called as user
  465.    if [ -L "$1" ]; then
  466.     : do nothing with symlinks
  467.    elif [ -d "$1" -o -f "$1" ]; then
  468.      find "$1" -type f -print0 | xargs -0 chmod 0755 
  469.    fi
  470. }
  471.  
  472. # Resolve dynamic library dependencies. Returns a list of symbolic links
  473. # to shared objects and shared object files for the binaries in $*.
  474. shared_object_files() {
  475.     local LDD CHROOT initrd_libs lib_files lib_links lib link
  476.  
  477.     LDD=/usr/bin/ldd
  478.     if [ ! -x $LDD ]; then
  479.     error 2 "I need $LDD."
  480.     fi
  481.  
  482.     initrd_libs=( $(
  483.     for i in "$@" ; do $LDD "$i" ; done \
  484.     | sed -ne 's:\t\(.* => \)\?\(/.*\) (0x[0-9a-f]*):\2:p'
  485.     ) )
  486.  
  487.     # Evil hack: On some systems we have generic as well as optimized
  488.     # libraries, but the optimized libraries may not work with all
  489.     # kernel versions (e.g., the NPTL glibc libraries don't work with
  490.     # a 2.4 kernel). Use the generic versions of the libraries in the
  491.     # initrd (and guess the name).
  492.     local n optimized
  493.     for ((n=0; $n<${#initrd_libs[@]}; n++)); do
  494.     lib=${initrd_libs[$n]}
  495.     optimized="$(echo "$lib" | sed -e 's:.*/\([^/]\+/\)[^/]\+$:\1:')"
  496.     lib=${lib/$optimized/}
  497.     if [ "${optimized:0:3}" != "lib" -a -f "$lib" ]; then
  498.         #echo "[Using $lib instead of ${initrd_libs[$n]}]" >&2
  499.         initrd_libs[$n]="${lib/$optimized/}"
  500.     fi
  501.     done
  502.  
  503.     for lib in "${initrd_libs[@]}"; do
  504.     case "$lib" in
  505.     linux-gate*)
  506.         # This library is mapped into the process by the kernel
  507.         # for vsyscalls (i.e., syscalls that don't need a user/
  508.         # kernel address space transition) in 2.6 kernels.
  509.         continue ;;
  510.     /*)
  511.         lib="${lib:1}" ;;
  512.     *)
  513.         # Library could not be found.
  514.         oops 7 "Dynamic library $lib not found"
  515.         continue ;;
  516.     esac
  517.  
  518.     while [ -L "/$lib" ]; do
  519.         echo $lib
  520.         link="$(readlink "/$lib")"
  521.         if [ x"${link:0:1}" == x"/" ]; then
  522.             lib=${link#/}
  523.         else
  524.             lib="${lib%/*}/$link"
  525.         fi
  526.     done
  527.     echo $lib
  528.     done \
  529.     | sort -u
  530. }
  531.  
  532. # Resolve module dependencies and parameters. Returns a list of modules and
  533. # their parameters.
  534. resolve_modules() {
  535.     local kernel_version=$1 module
  536.     shift
  537.  
  538.     for module in "$@"; do
  539.     local with_modprobe_conf
  540.     module=${module%.o}  # strip trailing ".o" just in case.
  541.     module=${module%.ko}  # strip trailing ".ko" just in case.
  542.     if [ -e /etc/modprobe.conf ]; then
  543.         with_modprobe_conf="-C /etc/modprobe.conf"
  544.     fi
  545.     module_list=$(/sbin/modprobe $with_modprobe_conf \
  546.         --set-version $kernel_version --ignore-install \
  547.         --show-depends $module 2> /dev/null \
  548.         | sed -ne 's:.*insmod /\?::p' )
  549.     if [ -z "$module_list" ]; then
  550.         oops 7 "Cannot determine dependencies of module $module." \
  551.         "Is modules.dep up to date?"
  552.     fi
  553.     echo "$module_list"
  554.     done \
  555.     | awk ' # filter duplicates: we must not reorder modules here!
  556.     NF == 0     { next }
  557.     $1 in seen  { next }
  558.             { seen[$1]=1
  559.               # drop module parameters here: modprobe in the initrd
  560.               # will pick them up again.
  561.               print $1
  562.             }
  563.     '
  564.     rm -f $temp
  565. }
  566.  
  567. # Test if file $1 is smaller than file $2 (kilobyte granularity)
  568. smaller_file() {
  569.     local size1=$(ls -l "$1" |awk '{print $5}')
  570.     local size2=$(ls -l "$2" |awk '{print $5}')
  571.     [ $size1 -lt $size2 ]
  572. }
  573.  
  574. # Cat from stdin to linuxrc, removing leading whitespace up to pipe symbol.
  575. # Note that here documents can only be indented with tabs, not with spaces.
  576. cat_linuxrc() {
  577.     sed 's/^[ \t]*|//' >> $linuxrc
  578.     echo >> $linuxrc
  579. }
  580.  
  581. # Attach ACPI DSDT if necessary.
  582. attach_dsdt() {
  583.     local initrd_image=$1
  584.     local sdt_match
  585.  
  586.     if [ -z "$acpi_dsdt" ]; then
  587.     if [ -f /etc/sysconfig/kernel ]; then
  588.         . /etc/sysconfig/kernel
  589.         acpi_dsdt="$ACPI_DSDT"
  590.     fi
  591.     fi
  592.     if [ -z "$acpi_dsdt" ]; then
  593.     return
  594.     fi
  595.     for sdt in "$acpi_dsdt";do
  596.     # File must be named: DSDT.aml or SSDT[0-9]*.aml
  597.     sdt_match=`expr match $(echo $sdt) ".*[SD]SDT[0-9]*\.aml"`
  598.     if [ $sdt_match -lt 8 ];then
  599.         oops 2 "($sdt) [DS]SDT must be named: DSDT.aml or SSDT[0-9]*.aml"
  600.         return
  601.     fi
  602.     if [ ! -f "$sdt" ]; then
  603.         oops 2 "ACPI DSDT $sdt does not exist."
  604.         return
  605.     fi
  606.     if ! grep -q "[SD]SDT" "$sdt" ; then
  607.         oops 2 "File $sdt is not a valid ACPI DSDT. Ignoring."
  608.         return
  609.     elif grep -qE 'DefinitionBlock' "$sdt" ; then
  610.         oops 2 "ACPI DSDT $sdt does not seem to be in binary form." \
  611.         "Will not attach this to $initrd_image."
  612.         return
  613.     fi
  614.  
  615.     cp "$sdt" $tmp_mnt
  616.  
  617.     echo -e "ACPI DSDT:\t$sdt"
  618.     done
  619. }
  620.  
  621. # Check for IDE module
  622. check_ide_modules_pcimap() {
  623.     local ide_modules
  624.  
  625.     pcimap_file=$1
  626.     vendor_id=$2
  627.     device_id=$3
  628.     
  629.     pci_vendor_id=$(printf "0x%08x" $(($2)))
  630.     pci_device_id=$(printf "0x%08x" $(($3)))
  631.     while read pcimap_module rest; do
  632.     if [ "$pcimap_module" == "ata_piix" ]; then
  633.         # FIXME: add_module will have no effect in a sub-shell...
  634.         add_module "ahci"
  635.         ide_modules="$ide_modules ahci"
  636.     fi
  637.     ide_modules="$ide_modules $pcimap_module"
  638.     done < <(grep "$pci_vendor_id $pci_device_id" $pcimap_file)
  639.  
  640.     echo "$ide_modules"
  641. }
  642.  
  643. check_ide_modules_hwinfo() {
  644.     local ide_modules
  645.     local kernel_version
  646.  
  647.     kernel_version=$(basename ${modules_dir})
  648.  
  649.     pci_id_vendor=$1
  650.     pci_id_device=$2
  651.     pci_revision=$3
  652.     pci_subid_vendor=$4
  653.     pci_subid_device=$5
  654.  
  655.     while read hwinfo_module; do
  656.     if [ "$hwinfo_module" == "ata_piix" ]; then
  657.         # Always add ahci prior to ata_piix
  658.         ide_modules="$ide_modules ahci $hwinfo_module"
  659.     elif [ "$hwinfo_module" != "ahci" ]; then
  660.         # Skip ahci module from hwinfo output
  661.         ide_modules="$ide_modules $hwinfo_module"
  662.     fi
  663.     done < <(hwinfo --kernel-version $kernel_version \
  664.                 --db "pci ${pci_id_vendor:+vendor=$pci_id_vendor} 
  665.                          ${pci_id_device:+device=$pci_id_device} 
  666.                          ${pci_subid_vendor:+subvendor=$pci_subid_vendor}  
  667.                          ${pci_subid_device:+subdevice=$pci_subid_device} 
  668.                          ${pci_revision:+revision=$pci_revision}")
  669.  
  670.     echo "$ide_modules"
  671. }
  672.  
  673. # Check for IDE modules, new version
  674. # We'll be asking hwinfo to return the proper module for us
  675. check_ide_modules() {
  676.     local modules_dir=$1 ide_modules
  677.  
  678.     # Check for PCI bus
  679.     if [ ! -d /proc/bus/pci ]; then
  680.         # Not found, no error
  681.         return
  682.     fi
  683.  
  684.     pcimap_file="${modules_dir}/modules.pcimap"
  685.  
  686.     if [ ! -f "$pcimap_file" ] ; then
  687.     echo "No modules.pcimap file found" >&2
  688.     return
  689.     fi
  690.  
  691.     while read pci_id none class_id dev_id rev_id; do
  692.     if [ "$class_id" == "0101:" ] ; then
  693.         ide_slots="$ide_slots $pci_id"
  694.     fi
  695.     done < <(/sbin/lspci -n)
  696.  
  697.     for pci_id in $ide_slots; do
  698.     set -- $(/sbin/lspci -nm -s $pci_id)
  699.     if [ -z "$4" ] ; then
  700.         continue;
  701.     fi
  702.     eval id=$4
  703.     if [ -z "$5" ] ; then
  704.         continue;
  705.     fi
  706.     pci_id_vendor=$(printf "0x%x" $((0x$id)))
  707.     eval id=$5
  708.     pci_id_device=$(printf "0x%x" $((0x$id)))
  709.     if [ -z "$6" ] ; then
  710.         continue;
  711.     fi
  712.     id=${6#-r}
  713.     pci_revision=$(printf "0x%x" $((0x$id)))
  714.     case "$7" in
  715.         -*)
  716.         shift
  717.         ;;
  718.         *)
  719.         ;;
  720.     esac
  721.     if [ "$7" ] ; then
  722.         eval id=$7
  723.         pci_subid_vendor=$(printf "0x%x" $((0x$id)))
  724.     fi
  725.     if [ "$8" ] ; then
  726.         eval id=$8
  727.         pci_subid_device=$(printf "0x%x" $((0x$id)))
  728.     fi
  729.     : Slot ${pci_id}: $pci_id_vendor $pci_id_device $pci_subid_vendor $pci_subid_device
  730.     if [ -x /usr/sbin/hwinfo ] ; then
  731.         ide_modules=$(check_ide_modules_hwinfo $pci_id_vendor $pci_id_device $pci_revision $pci_subid_vendor $pci_subid_device)
  732.     fi
  733.     if [ -z "$ide_modules" ]; then
  734.         ide_modules=$(check_ide_modules_pcimap $pcimap_file $pci_id_vendor $pci_id_device)
  735.     fi
  736.  
  737.         if [ "$ide_modules" ]; then
  738.         for module in $ide_modules; do
  739.             # Only add ahci module if ata_piix is not loaded already
  740.             if [ "$module" == "ahci" ]; then
  741.             has_module ata_piix || add_module $module
  742.             else
  743.             add_module $module
  744.             fi
  745.         done
  746.         # All IDE modules are now loaded later
  747.         # if grep -q ide-disk ${modules_dir}/modules.dep; then
  748.         #     add_module ide-disk
  749.         # fi
  750.         # IDE-floppy is considered obsolete
  751.         # if grep -q ide-floppy ${modules_dir}/modules.dep; then
  752.         #     add_module ide-floppy
  753.         # fi
  754.         # if grep -q ide-cd ${modules_dir}/modules.dep; then
  755.         #     add_module ide-cd
  756.         # fi
  757.         echo
  758.         fi
  759.     done
  760. }
  761.  
  762. # NOTE: The mkdevn, devmajor and block_driver functions are reused
  763. #
  764.  
  765. # Convert a major:minor pair into a device number
  766. mkdevn() {
  767.     local major=$1 minor=$2 minorhi minorlo
  768.     major=$(($major * 256))
  769.     minorhi=$(($minor / 256))
  770.     minorlo=$(($minor % 256))
  771.     minor=$(($minorhi * 256 * 4096))
  772.     echo $(( $minorlo + $major + $minor ))
  773. }
  774.  
  775. # Extract the major part from a device number
  776. devmajor() {
  777.     local devn=$(($1 / 256))
  778.     echo $(( $devn % 4096 ))
  779. }
  780.  
  781. # Extract the minor part from a device number
  782. devminor() {
  783.     local devn=${1:-0}
  784.     echo $(( $devn % 256 )) 
  785. }
  786.  
  787. block_driver() {
  788.     local devn block major driver
  789.     case "$1" in
  790.     /dev/*) devn=$(devnumber $1 2> /dev/null) ;;
  791.  
  792.     *:*)    # major:minor
  793.         set -- $(IFS=: ; echo $1)
  794.         devn=$(mkdevn $1 $2) ;;
  795.  
  796.     [0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])
  797.         # hex device number
  798.         devn=$((0x$1)) ;;
  799.     esac
  800.  
  801.     [ -z "$devn" ] && return 1
  802.     major=$(devmajor $devn)
  803.     driver=$(sed -n "s/^[ ]*$major \(.*\)/\1/p;/Block/p" < /proc/devices | tail -1)
  804.     case "$driver" in
  805.     Block*)
  806.         return 1
  807.         ;;
  808.     *)
  809.         echo $driver
  810.         return 0
  811.         ;;
  812.     esac
  813. }
  814.  
  815. # (We are using a devnumber binary inside the initrd.)
  816. devnumber() {
  817.     set -- $(ls -lL $1)
  818.     mkdevn ${5%,} $6
  819. }
  820.  
  821. # Calculate the netmask for a given prefix
  822. calc_netmask() {
  823.     local prefix=$1
  824.     local netmask
  825.  
  826.     netmask=
  827.     num=0
  828.     while (( $prefix > 8 )) ; do
  829.     if (( $num > 0 )) ; then
  830.         netmask="${netmask}.255"
  831.     else
  832.         netmask="255"
  833.     fi
  834.     prefix=$(($prefix - 8))
  835.     num=$(($num + 1))
  836.     done
  837.     if (( $prefix > 0 )) ; then
  838.     mask=$(( 0xFF00 >> $prefix ))
  839.     else
  840.     mask=0
  841.     fi
  842.     netmask="${netmask}.$(( $mask & 0xFF ))"
  843.     num=$(($num + 1))
  844.     while (( $num < 4 )) ; do
  845.     netmask="${netmask}.0"
  846.     num=$(($num + 1))
  847.     done
  848.     echo $netmask
  849. }
  850.  
  851. # Get the interface information for ipconfig
  852. get_ip_config() {
  853.     local iface
  854.     local iplink
  855.     local iproute
  856.  
  857.     iface=$1
  858.     iplink=$(ip addr show dev $iface | grep "inet ")
  859.  
  860.     set -- $iplink
  861.     if [ "$1" == "inet" ]; then
  862.     shift
  863.  
  864.     ipaddr=${1%%/*}
  865.     prefix=${1##*/}
  866.     shift 
  867.     if [ "$1" == "peer" ] ; then
  868.         shift
  869.         peeraddr=${1%%/*}
  870.     fi
  871.     netmask=$(calc_netmask $prefix)
  872.     bcast=$3
  873.     fi
  874.     iproute=$(ip route list dev $iface | grep default)
  875.     if [ $? -eq 0 ]; then
  876.     set -- $iproute
  877.     gwaddr=$3
  878.     fi
  879.     hostname=$(hostname)
  880.     echo "$ipaddr:$peeraddr:$gwaddr:$netmask:$hostname:$iface:none"
  881. }  
  882.  
  883. check_iscsi_root() {
  884.     local devname=$1
  885.     local sysfs_path
  886.  
  887.     sysfs_path=$(udevinfo -q path -n $rootdev 2> /dev/null)
  888.     if [ -z "$sysfs_path" ] || [ ! -d /sys$sysfs_path ] ; then
  889.     return;
  890.     fi
  891.  
  892.     pushd /sys$sysfs_path > /dev/null
  893.     if [ ! -d device ] ; then
  894.     cd ..
  895.     fi
  896.  
  897.     if [ ! -d device ] ; then
  898.     # no device link; return
  899.     popd > /dev/null
  900.     return;
  901.     fi
  902.  
  903.     cd -P device
  904.     cd ../..
  905.  
  906.     if [ -d iscsi_session:session* ]; then
  907.     cd -P iscsi_session:session*
  908.     echo $(basename $PWD)
  909.     fi
  910.     popd > /dev/null
  911. }
  912.  
  913. get_default_interface() {
  914.     local ifname
  915.     local inffile="/etc/install.inf"
  916.  
  917.     # Determine the default network interface
  918.     if [ -f $inffile ] ; then
  919.     # Get info from install.inf during installation
  920.     BOOTPROTO=$(sed -ne 's/NetConfig: \(.*\)/\1/p' $inffile)
  921.     ifname=$(sed -ne 's/Netdevice: \(.*\)/\1/p' $inffile)
  922.     else
  923.     for cfg in /etc/sysconfig/network/ifcfg-*; do
  924.     if [ $(basename $cfg) = "ifcfg-lo" ] ; then
  925.         continue;
  926.     fi
  927.     eval $(grep STARTMODE $cfg)
  928.     if [ "$STARTMODE" = "nfsroot" ]; then
  929.         cfgname=$(basename $cfg)
  930.         ifname=$(getcfg-interface ${cfg#*/ifcfg-})
  931.         eval $(grep BOOTPROTO $cfg)
  932.         break;
  933.     fi
  934.     done
  935.     fi
  936.     echo $ifname/$BOOTPROTO
  937. }
  938.  
  939. ###################################################################
  940. #
  941. # S/390 specific procedures
  942. #
  943. s390_check_lvm2() {
  944.     local vgname
  945.     local devname
  946.     
  947.     # Check whether the LVM is on zfcp or DASD
  948.     vgname=$(lvdisplay -c $1 | cut -d : -f 2)
  949.  
  950.     if [ "$vgname" ]; then
  951.     for devname in $(pvdisplay -c | grep $vgname | cut -d : -f 1); do
  952.         case "$devname" in
  953.         */dasd*)
  954.             s390_enable_dasd=1
  955.             ;;
  956.         */sd*)
  957.             s390_enable_zfcp=1
  958.             ;;
  959.         *)
  960.             ;;
  961.         esac
  962.     done
  963.     fi
  964. }
  965.  
  966. s390_check_evms() {
  967.     local evms_cmd
  968.     local evms_reg
  969.     local evms_cont
  970.     local evms_seg
  971.     local evms_dsk
  972.  
  973.     if [ ! -x /sbin/evms ]; then
  974.     return 1
  975.     fi
  976.  
  977.     if [ -n "$1" ]; then
  978.     evms_cmd="q:r,v=$1"
  979.  
  980.     while read a b c d; do
  981.         if [ "$a $b" = "Region Name:" ]; then
  982.         evms_reg="$evms_reg $c"
  983.         fi
  984.     done < <( echo "$evms_cmd" | /sbin/evms -s )
  985.     fi
  986.  
  987.     for reg in $evms_reg; do
  988.     evms_cmd="q:c,r=$reg"
  989.     
  990.     while read a b c d; do
  991.         if [ "$a $b" = "Container Name:" ]; then
  992.         evms_cont="$evms_cont $c"
  993.         fi
  994.     done < <(echo "$evms_cmd" | /sbin/evms -s )
  995.     done
  996.     
  997.     for cont in $evms_cont; do
  998.     evms_cmd="q:s,c=$cont"
  999.     
  1000.     while read a b c d; do
  1001.         if [ "$a $b" = "Segment Name:" ]; then
  1002.         evms_seg="$evms_seg $c"
  1003.         fi
  1004.     done < <(echo "$evms_cmd" | /sbin/evms -s )
  1005.     done
  1006.  
  1007.     for seg in $evms_seg; do
  1008.     evms_cmd="q:d,s=$seg"
  1009.     while read a b c d; do
  1010.         if [ "$a $b $c" = "Logical Disk Name:" ]; then
  1011.         evms_dsk="$evms_dsk $d"
  1012.         fi
  1013.     done < <(echo "$evms_cmd" | /sbin/evms -s )
  1014.     done
  1015.  
  1016.     for dsk in $evms_dsk; do
  1017.     case $dsk in
  1018.         dasd*)
  1019.         s390_enable_dasd=1;
  1020.         ;;
  1021.         sd*)
  1022.         s390_enable_zfcp=1
  1023.         ;;
  1024.     esac
  1025.     done
  1026. }
  1027.  
  1028. s390_check_dasd() {
  1029.     local devn=$(devnumber $1)
  1030.  
  1031.     for dir in /sys/block/*/*; do
  1032.     if [ -d "$dir" ] && [ -f "$dir/dev" ]; then
  1033.         IFS=":" read major minor < $dir/dev
  1034.         if (($devn == $(mkdevn $major $minor) )); then
  1035.         path=$dir
  1036.         break;
  1037.         fi
  1038.     fi
  1039.     done
  1040.     if [ "$path" ] && [ -d ${path}/../device ]; then
  1041.     if [ -r ${path}/../device/discipline ]; then
  1042.         s390_enable_dasd=1
  1043.     fi
  1044.     fi
  1045. }
  1046.  
  1047. s390_check_zfcp() {
  1048.     local devn=$(devnumber $1)
  1049.  
  1050.     for dir in /sys/block/*/*; do
  1051.     if [ -d "$dir" ] && [ -f "$dir/dev" ]; then
  1052.         IFS=":" read major minor < $dir/dev
  1053.         if (($devn == $(mkdevn $major $minor) )); then
  1054.         path=$dir
  1055.         break;
  1056.         fi
  1057.     fi
  1058.     done
  1059.     
  1060.     if [ "$path" ] && [ -d "$path/../device" ] && [ -e "$path/../device/scsi_level" ] ; then
  1061.     s390_enable_zfcp=1
  1062.     fi
  1063. }
  1064.  
  1065. # Detect all zfcp disks
  1066. # We need to activate all disks in the same order
  1067. # as found in the running system to get the same
  1068. # behaviour during booting.
  1069. s390_zfcp_sysfs() {
  1070.     local dev_dir
  1071.     local fcp_disk_hba
  1072.     local fcp_disk_wwpn
  1073.     local fcp_disk_lun
  1074.  
  1075.     if [ "$s390_enable_zfcp" ] ; then
  1076.     # Root is on SCSI, detect all SCSI devices
  1077.     for dev_dir in /sys/block/sd? /sys/block/sd?? /sys/block/sd??? /sys/block/sd???? ; do
  1078.         if [ -d "$dev_dir" ] && [ -e "$dev_dir/device" ]; then
  1079.         pushd $dev_dir > /dev/null;
  1080.         cd $(readlink device);
  1081.         if [ -r ./hba_id ]; then
  1082.             read fcp_disk_hba < ./hba_id
  1083.             read fcp_disk_wwpn < ./wwpn
  1084.             read fcp_disk_lun < ./fcp_lun
  1085.         
  1086.             s390_zfcp_disks="$s390_zfcp_disks $fcp_disk_hba:$fcp_disk_wwpn:$fcp_disk_lun"
  1087.  
  1088.             for id in $s390_zfcp_hbas; do
  1089.             if [ "$id" == "$fcp_disk_hba" ]; then
  1090.                 fcp_disk_hba=
  1091.             fi
  1092.             done
  1093.             [ "$fcp_disk_hba" ] && s390_zfcp_hbas="$s390_zfcp_hbas $fcp_disk_hba"
  1094.         fi
  1095.         popd > /dev/null
  1096.         fi
  1097.     done
  1098.     if [ "$s390_zfcp_hbas" ]; then
  1099.         add_module sd_mod
  1100.         add_module zfcp
  1101.     fi
  1102.     fi
  1103.  
  1104. }
  1105.  
  1106. s390_dasd_sysfs() {
  1107.     local type
  1108.     local discipline
  1109.  
  1110.     if [ "$s390_enable_dasd" ]; then
  1111.     # Root device is on a dasd device, enable all dasd disks
  1112.     for dir in /sys/block/dasd[a-z] /sys/block/dasd[a-z][a-z] /sys/block/dasd[a-z][a-z][a-z] ; do
  1113.         if [ -d "$dir" ] && [ -d ${dir}/device ]; then
  1114.         pushd $dir > /dev/null
  1115.         cd $(readlink device)
  1116.         if [ -r ./discipline ]; then
  1117.             read type < ./discipline
  1118.             
  1119.             case $type in
  1120.             ECKD)
  1121.                 add_module dasd_eckd_mod
  1122.                 discipline=0
  1123.                 ;;
  1124.             FBA)
  1125.                 add_module dasd_fba_mod
  1126.                 discipline=1
  1127.                 ;;
  1128.             DIAG)
  1129.                 add_module dasd_diag_mod
  1130.                 discipline=2
  1131.                 ;;
  1132.             *)
  1133.                 ;;
  1134.             esac
  1135.             s390_dasd_disks="$s390_dasd_disks $(basename $PWD):$discipline"
  1136.         fi
  1137.         popd > /dev/null
  1138.         fi
  1139.     done
  1140.  
  1141.     fi
  1142. }
  1143.  
  1144. s390_dasd_proc() {
  1145.     local zipl_conf_with_dasd dasd_module
  1146.  
  1147.     if [ -f /etc/zipl.conf ] \
  1148.        && grep -q '^[[:space:]]*parameters[[:space:]]*=' \
  1149.         /etc/zipl.conf; then
  1150.         zipl_conf_with_dasd=1
  1151.     fi
  1152.  
  1153.     if modprobe -c \
  1154.        | grep -q '^[[:space:]]*options[[:space:]]\+dasd_mod' ; then
  1155.     dasd_module=1
  1156.     fi
  1157.  
  1158.     if grep -q -e "^dasd" /proc/modules \
  1159.        || [ -n "$zipl_conf_with_dasd" ] \
  1160.        || [ -n "$dasd_module" ] \
  1161.        || has_module dasd_mod ; then
  1162.  
  1163.     if [ ! "$zipl_conf_with_dasd" -a ! "$dasd_module" ]; then
  1164.         error 1 "\
  1165. The dasd module is required, but no dasd configuration was found in
  1166. root_dir/etc/zipl.conf or root_dir/etc/modules.conf."
  1167.     fi
  1168.  
  1169.     if grep -q ECKD /proc/dasd/devices ; then
  1170.         add_module dasd_eckd_mod
  1171.     fi
  1172.  
  1173.     if grep -q FBA  /proc/dasd/devices ; then
  1174.         add_module dasd_fba_mod
  1175.     fi
  1176.  
  1177.     if grep -q DIAG /proc/dasd/devices ; then
  1178.         add_module dasd_diag_mod
  1179.     fi
  1180.     else
  1181.     # /proc not mounted or somesuch. Enable all dasd modules
  1182.     add_module dasd_mod
  1183.     add_module dasd_eckd_mod
  1184.     add_module dasd_fba_mod
  1185.     add_module dasd_diag_mod
  1186.     fi
  1187. }
  1188.  
  1189. s390_get_ctc_ccwdevs()
  1190. {
  1191.     local interface=$1
  1192.  
  1193.     if [ ! -d /sys/class/net/$interface/device ] ; then
  1194.     error 1 "No device link for interface $interface"
  1195.     fi
  1196.     pushd /sys/class/net/$interface/device > /dev/null 2>&1
  1197.     cd -P cdev0
  1198.     cdev0=$(basename $PWD)
  1199.     popd > /dev/null 2>&1
  1200.  
  1201.     pushd /sys/class/net/$interface/device > /dev/null 2>&1
  1202.     cd -P cdev1
  1203.     cdev1=$(basename $PWD)
  1204.     popd > /dev/null 2>&1
  1205.  
  1206.     echo "$cdev0,$cdev1"
  1207. }
  1208.  
  1209. ###################################################################
  1210. #
  1211. # Create the initrd image $2 for kernel $1 (both are absolute path names).
  1212. #
  1213. mkinitrd_kernel() {
  1214.     local kernel_image=$1 initrd_image=$2
  1215.     local kernel_version
  1216.     local need_raidstart
  1217.     local need_mdadm
  1218.     local need_dmraid
  1219.     local -a features
  1220.     local fs_modules drv_modules uld_modules xen_modules
  1221.     local i
  1222.  
  1223.     tmp_mnt=$work_dir/mnt
  1224.     tmp_mnt_small=${tmp_mnt}_small
  1225.     tmp_msg=$work_dir/msg$$
  1226.     vendor_script=$tmp_mnt/vendor_init.sh
  1227.  
  1228.     linuxrc=$tmp_mnt/init
  1229.  
  1230.     if [ ! -f "$kernel_image" ] ; then
  1231.     echo "No kernel image $kernel_image found" >&2
  1232.     return
  1233.     fi
  1234.  
  1235.     kernel_version=$(/sbin/get_kernel_version $kernel_image)
  1236.     modules_dep=$root_dir/lib/modules/$kernel_version/modules.dep
  1237.  
  1238.     #echo -e "Kernel version:\t$kernel_version"
  1239.     echo -e "Kernel image:\t$kernel_image"
  1240.     echo -e "Initrd image:\t$initrd_image"
  1241.  
  1242.     if [ ! -d "/lib/modules/$kernel_version/misc" -a \
  1243.      ! -d "/lib/modules/$kernel_version/kernel" ]; then
  1244.     oops 2 "No modules found for kernel $kernel_version"
  1245.         return
  1246.     fi
  1247.  
  1248.     # Make sure to always include the module for the root filesystem
  1249.     # if the root filesystem is modularized.
  1250.     if ! has_module "$rootfstype" && \
  1251.        grep -qe "$rootfstype\.ko:" $modules_dep; then
  1252.     echo "Adding the root filesystem module ($rootfstype)"
  1253.     add_module $rootfstype
  1254.     fi
  1255.  
  1256.     # create an empty initrd
  1257.     if ! mkdir $tmp_mnt ; then
  1258.     error 1 "could not create temporary directory"
  1259.     fi
  1260.  
  1261.     # fill the initrd
  1262.     mkdir -p $tmp_mnt/{sbin,bin,etc,dev,proc,sys,root}
  1263.  
  1264.     mkdir -p -m 4777 $tmp_mnt/tmp
  1265.  
  1266.     # Create a dummy /etc/mtab for mount/umount
  1267.     echo -n > $tmp_mnt/etc/mtab
  1268.  
  1269.     mkdir -p $tmp_mnt${shebang%/*}
  1270.     cp_bin $shebang $tmp_mnt$shebang
  1271.     if [ $shebang != /bin/sh ]; then
  1272.     ln -s $shebang $tmp_mnt/bin/sh
  1273.     fi
  1274.     
  1275.     if ! cp_bin $initrd_insmod $tmp_mnt/sbin/insmod 2>/dev/null ; then
  1276.     error 5 "no insmod"
  1277.     fi
  1278.  
  1279.     # Add modprobe, modprobe.conf*, and a version of /bin/true: modprobe.conf
  1280.     # might use it.
  1281.     if ! cp_bin $initrd_modprobe $tmp_mnt/sbin/modprobe 2>/dev/null ; then
  1282.     error 5 "no modprobe"
  1283.     fi
  1284.     cp -r $root_dir/etc/modprobe.conf $root_dir/etc/modprobe.conf.local \
  1285.        $root_dir/etc/modprobe.d $tmp_mnt/etc
  1286.     cat > $tmp_mnt/bin/true <<-EOF
  1287.     #! /bin/sh
  1288.     :
  1289.     EOF
  1290.     chmod +x $tmp_mnt/bin/true
  1291.  
  1292.     # Enable user-selected features
  1293.     if [ "$feature_list" ] ; then
  1294.     for f in $feature_list ; do
  1295.         case $f in
  1296.         iscsi)
  1297.             add_module iscsi_tcp
  1298.             ;;
  1299.         mpath)
  1300.             add_module dm-multipath
  1301.             ;;
  1302.         lvm2)
  1303.             add_module dm-snapshot
  1304.             add_module dm-crypt
  1305.             add_module dm-zero
  1306.             add_module dm-mirror
  1307.             root_lvm2=1
  1308.             root_dm=1
  1309.             ;;
  1310.         lvm)
  1311.             add_module lvm-mod
  1312.             root_lvm=1
  1313.             ;;
  1314.         evms)
  1315.             add_module dm-mirror
  1316.             add_module dm-snapshot
  1317.             root_evms=1
  1318.             root_dm=1
  1319.             ;;
  1320.         md)
  1321.             add_module raid0
  1322.             add_module raid1
  1323.             add_module raid5
  1324.             add_module linear
  1325.             need_mdadm=1
  1326.             ;;
  1327.         dmraid)
  1328.             need_dmraid=1
  1329.             ;;
  1330.         *)
  1331.             error 6 "invalid feature $f"
  1332.             ;;
  1333.         esac
  1334.     done
  1335.     fi
  1336.  
  1337.     if [ ! -z "$vendor_init_script" ] ; then
  1338.     features=(${features[@]} script\($vendor_script\))
  1339.     cp_bin $vendor_init_script $vendor_script
  1340.     fi
  1341.  
  1342.     if [ -n "$root_dmraid" -a -x /sbin/dmraid ] ; then
  1343.     need_dmraid=1
  1344.     fi
  1345.  
  1346.     if has_module dm-multipath && [ -x /sbin/multipath ] ; then
  1347.     add_module dm-round-robin
  1348.     add_module dm-emc
  1349.     root_mpath=1
  1350.     root_dm=1
  1351.     fi
  1352.  
  1353.     if has_module iscsi_tcp ; then
  1354.     features=(${features[@]} iscsi)
  1355.     add_module crc32c
  1356.     cp_bin /sbin/iscsid $tmp_mnt/sbin/iscsid
  1357.     cp_bin /sbin/iscsiadm $tmp_mnt/sbin/iscsiadm
  1358.     mkdir -p $tmp_mnt/etc/iscsi
  1359.     cat /etc/iscsi/initiatorname.iscsi > $tmp_mnt/etc/iscsi/initiatorname.iscsi
  1360.     mkdir -p $tmp_mnt/var/run
  1361.     mkdir -p $tmp_mnt/var/lock/iscsi
  1362.     fi
  1363.  
  1364.     if [ -n "$s390_dasd_disks" ]; then
  1365.     cp_bin /sbin/dasd_configure $tmp_mnt/sbin
  1366.     cp_bin /sbin/dasdview $tmp_mnt/sbin
  1367.     fi
  1368.  
  1369.     if [ -n "$s390_zfcp_disks" ]; then
  1370.     cp_bin /sbin/zfcp_host_configure $tmp_mnt/sbin
  1371.     cp_bin /sbin/zfcp_disk_configure $tmp_mnt/sbin
  1372.     fi
  1373.  
  1374.     features=(${features[@]} initramfs)
  1375.  
  1376.     # Programs /sbin
  1377.     for prog in killall5 blogd showconsole; do
  1378.     cp_bin /sbin/$prog $tmp_mnt/sbin
  1379.     done
  1380.  
  1381.     if test -x $tmp_mnt/sbin/blogd; then
  1382.     mkdir -p $tmp_mnt/var/log
  1383.     fi
  1384.  
  1385.     # Programs /bin
  1386.     for prog in sed sleep cat ln ls pidof mount umount date; do
  1387.     cp_bin /bin/$prog $tmp_mnt/bin
  1388.     done
  1389.  
  1390.     # Common utilities
  1391.     for bin in chmod mkdir mknod rm; do
  1392.     cp_bin /bin/$bin $tmp_mnt/bin
  1393.     done
  1394.  
  1395.     for file in /lib/mkinitrd/bin/* ; do
  1396.     if [ -x $file ] ; then
  1397.         cp_bin $file $tmp_mnt/bin
  1398.     fi
  1399.     done
  1400.  
  1401.     # all dev nodes belong to root, but some may be
  1402.     # owned by a group other than root
  1403.     # getent passwd | sed '/^root:/s/^\([^:]\+\):[^:]*:\([^:]\+\):\([^:]\+\):.*/\1::\2:\3:::/p;d' > $tmp_mnt/etc/passwd
  1404.     echo 'root::0:0:::' > $tmp_mnt/etc/passwd
  1405.     echo 'nobody::65534:65533:::' >> $tmp_mnt/etc/passwd
  1406.     getent group | sed 's/^\([^:]\+\):[^:]*:\([^:]\+\):.*/\1::\2:/' > $tmp_mnt/etc/group
  1407.     (echo 'passwd: files';echo 'group: files') > $tmp_mnt/etc/nsswitch.conf
  1408.  
  1409.     cp_bin /sbin/udevd $tmp_mnt/sbin/
  1410.     cp_bin /sbin/udevtrigger $tmp_mnt/sbin/
  1411.     cp_bin /sbin/udevsettle $tmp_mnt/sbin/
  1412.     cp_bin /usr/bin/udevinfo $tmp_mnt/sbin/
  1413.     if [ -e /usr/sbin/resume ]; then
  1414.         cp_bin /usr/sbin/resume $tmp_mnt/sbin/
  1415.     fi
  1416.  
  1417.     mkdir -p $tmp_mnt/etc/udev/rules.d
  1418.     # Create our own udev.conf
  1419.     echo "udev_root=\"/dev\"" > $tmp_mnt/etc/udev/udev.conf
  1420.     echo "udev_rules=\"/etc/udev/rules.d\"" >> $tmp_mnt/etc/udev/udev.conf
  1421.     # copy needed rules
  1422.     for rule in 05-udev-early.rules 50-udev-default.rules 60-persistent-storage.rules 64-device-mapper.rules; do
  1423.     if [ -f /etc/udev/rules.d/$rule ]; then
  1424.         cp /etc/udev/rules.d/$rule $tmp_mnt/etc/udev/rules.d
  1425.     fi
  1426.     done
  1427.     # copy helper scripts
  1428.     mkdir -p $tmp_mnt/lib/udev
  1429.     if [ -f /sbin/vol_id ] ; then
  1430.         ln -s ../../sbin/vol_id ${tmp_mnt}/lib/udev/vol_id
  1431.     fi
  1432.     for script in /lib/udev/* /sbin/*_id ; do
  1433.     if [ -f "$script" ] ; then
  1434.         cp_bin $script ${tmp_mnt}${script}
  1435.     fi
  1436.     done
  1437.     rm -f $tmp_mnt/lib/udev/mount.sh
  1438.     echo '#!/bin/sh' > $tmp_mnt/lib/udev/mount.sh
  1439.     echo 'exit 0' >> $tmp_mnt/lib/udev/mount.sh
  1440.  
  1441.     # scsi_id config file
  1442.     cp /etc/scsi_id.config $tmp_mnt/etc/scsi_id.config
  1443.  
  1444.     # QLogic firmware
  1445.     mkdir -p $tmp_mnt/lib/firmware
  1446.     for fw in /lib/firmware/ql*.bin ; do
  1447.     if [ -f "$fw" ] ; then
  1448.         cp -a $fw $tmp_mnt/lib/firmware
  1449.     fi
  1450.     done
  1451.  
  1452.     if [ -n "$root_lvm" ] ; then
  1453.     features=(${features[@]} lvm)
  1454.     mkdir -p $tmp_mnt/etc/lvmtab.d
  1455.     cp_bin /sbin/{vgscan,vgchange} $tmp_mnt/sbin
  1456.     cp_bin /sbin/dmsetup $tmp_mnt/sbin
  1457.     fi
  1458.  
  1459.     if [ -n "$root_mpath" ] ; then
  1460.     features=(${features[@]} dm/mpath)
  1461.     cp_bin /sbin/multipath $tmp_mnt/sbin
  1462.     cp_bin /sbin/kpartx $tmp_mnt/sbin
  1463.     cp_bin /sbin/dmsetup $tmp_mnt/sbin
  1464.     cp_bin /sbin/mpath_id $tmp_mnt/sbin
  1465.     cp_bin /sbin/kpartx_id $tmp_mnt/sbin
  1466.     for pp in /sbin/mpath_prio_* ; do
  1467.         cp_bin $pp $tmp_mnt/sbin
  1468.     done
  1469.     if [ -f /etc/multipath.conf ] ; then
  1470.         cp -a /etc/multipath.conf $tmp_mnt/etc
  1471.     fi
  1472.     cp /etc/udev/rules.d/71-multipath.rules $tmp_mnt/etc/udev/rules.d
  1473.     cp /etc/udev/rules.d/72-multipath-compat.rules $tmp_mnt/etc/udev/rules.d
  1474.     fi
  1475.  
  1476.     if [ -n "$root_lvm2" ] ; then
  1477.     features=(${features[@]} dm/lvm2)
  1478.     mkdir -p $tmp_mnt/etc/lvm
  1479.     mkdir -p $tmp_mnt/var/lock/lvm
  1480.     cp_bin /sbin/{vgscan,vgchange,lvm} $tmp_mnt/sbin
  1481.     cp_bin /sbin/dmsetup $tmp_mnt/sbin
  1482.     cp_bin /bin/{sed,mkdir,mknod,ls} $tmp_mnt/bin
  1483.     cp -a /etc/lvm/lvm.conf $tmp_mnt/etc/lvm
  1484.     fi
  1485.  
  1486.     if [ -n "$root_evms" ] ; then
  1487.     features=(${features[@]} dm/evms2)
  1488.     cp_bin /sbin/{evms_activate,dmsetup} $tmp_mnt/sbin
  1489.     cp_bin /bin/{sed,mkdir,mknod,rm} $tmp_mnt/bin
  1490.     cp_bin /usr/bin/expr $tmp_mnt/bin
  1491.     mkdir -p $tmp_mnt/mnt
  1492.     cp -a /etc/evms.conf $tmp_mnt/etc
  1493.     evms_lib=
  1494.     case "`LANG=C LC_ALL=C file -b $tmp_mnt/sbin/evms_activate | awk '/^ELF ..-bit/ { print $2 }'`" in
  1495.         32-bit) evms_lib="/lib/evms" ;;
  1496.         64-bit) evms_lib="/lib64/evms" ;;
  1497.     esac
  1498.     if [ "$evms_lib" ] ; then
  1499.         mkdir -p ${tmp_mnt}${evms_lib}
  1500.         SD=$(ls -A $evms_lib | tail -n 1)
  1501.         (cd ${tmp_mnt}${evms_lib} && mkdir -p $SD)
  1502.         cp_bin $evms_lib/$SD/* ${tmp_mnt}${evms_lib}/$SD
  1503.         rm -f ${tmp_mnt}${evms_lib}/*/*{ext2,jfs,ogfs,reiser,swap,xfs}*so
  1504.     else
  1505.         oops 7 "No EVMS modules found"
  1506.     fi
  1507.     fi
  1508.  
  1509.     if [ -n "$root_md" ] ; then
  1510.     need_mdadm=1
  1511.     if [ -f /etc/mdadm.conf ] ; then
  1512.         cat /etc/mdadm.conf > $tmp_mnt/etc/mdadm.conf
  1513.         md_mod_list="mdconf"
  1514.     else
  1515.         echo "DEVICE partitions" > $tmp_mnt/etc/mdadm.conf
  1516.         for md in $md_list ; do
  1517.         mdconf=$(eval echo \$md_conf_$md)
  1518.         md_mod=${mdconf#*level=}
  1519.         md_mod=${md_mod%% *}
  1520.         for mod in $md_mod_list ; do
  1521.             if [ "$mod" == $"md_mod" ] ; then
  1522.             md_mod=
  1523.             fi
  1524.         done
  1525.         if [ "$md_mod" ] ; then
  1526.             if [ "$md_mod_list" ] ; then
  1527.             md_mod_list="$md_mod $md_mod_list"
  1528.             else
  1529.             md_mod_list="$md_mod"
  1530.             fi
  1531.         fi
  1532.         echo $mdconf >> $tmp_mnt/etc/mdadm.conf
  1533.         done
  1534.     fi
  1535.     features=(${features[@]} md\($md_mod_list\))
  1536.     fi
  1537.  
  1538.     if [ -n "$need_mdadm" ] ; then
  1539.     features=(${features[@]} mdadm)
  1540.     cp_bin /sbin/mdadm $tmp_mnt/sbin
  1541.     fi
  1542.  
  1543.     if [ -n "$need_dmraid" ] ; then
  1544.     features=(${features[@]} dm/raid)
  1545.     cp_bin /sbin/dmraid $tmp_mnt/sbin
  1546.     fi
  1547.  
  1548.     if [ -n "$use_dhcp" ] ; then
  1549.     features=(${features[@]} dhcp\($interface\))
  1550.     cp_bin /sbin/dhcpcd $tmp_mnt/bin
  1551.     cp_bin /bin/kill $tmp_mnt/bin
  1552.     mkdir -p $tmp_mnt/var/lib/dhcpcd
  1553.     mkdir -p $tmp_mnt/var/run
  1554.     fi
  1555.  
  1556.     if [ -n "$use_ipconfig" ] ; then
  1557.     features=(${features[@]} static\($interface\))
  1558.     cp_bin $root_dir/lib/mkinitrd/bin/ipconfig.sh $tmp_mnt/bin/ipconfig
  1559.     cp_bin $root_dir/sbin/ip $tmp_mnt/sbin/ip
  1560.     fi
  1561.   
  1562.     if [ "$rootfstype" = "ext2" ] ; then
  1563.     features=(${features[@]} fsck.ext2)
  1564.     cp_bin /sbin/fsck $tmp_mnt/bin
  1565.     cp_bin /sbin/fsck.ext2 $tmp_mnt/bin
  1566.     fi
  1567.  
  1568.     if [ "$rootfstype" = "ext3" ] ; then
  1569.     features=(${features[@]} fsck.ext3)
  1570.     cp_bin /sbin/fsck $tmp_mnt/bin
  1571.     cp_bin /sbin/fsck.ext3 $tmp_mnt/bin
  1572.     fi
  1573.  
  1574.     if [ "$rootfstype" = "reiserfs" ] ; then
  1575.     features=(${features[@]} fsck.reiserfs)
  1576.     cp_bin /sbin/fsck $tmp_mnt/bin
  1577.     cp_bin /sbin/fsck.reiserfs $tmp_mnt/bin
  1578.     fi
  1579.  
  1580.     if [ "$rootfstype" = "jfs" ] ; then
  1581.     features=(${features[@]} fsck.jfs)
  1582.     cp_bin /sbin/fsck $tmp_mnt/bin
  1583.     cp_bin /sbin/fsck.jfs $tmp_mnt/bin
  1584.     fi
  1585.  
  1586.     if [ "$rootfstype" = "xfs" ] ; then
  1587.     features=(${features[@]} fsck.xfs)
  1588.     cp_bin /sbin/fsck $tmp_mnt/bin
  1589.     cp_bin /sbin/fsck.xfs $tmp_mnt/bin
  1590.     fi
  1591.  
  1592.     if [ -n "$debug_mkinit" ]; then
  1593.     features=(${features[@]} debug)
  1594.     cp_bin /bin/ls $tmp_mnt/bin
  1595.     fi
  1596.  
  1597.     # The devnumber builtin does not use /bin/ls
  1598.     if [ -z "$use_static_binaries" ] ; then
  1599.     cp_bin /bin/ls $tmp_mnt/bin
  1600.     fi
  1601.  
  1602.     echo -ne "Shared libs:\t"
  1603.     # Copy all required shared libraries and the symlinks that
  1604.     # refer to them.
  1605.     lib_files=$(shared_object_files "${initrd_bins[@]}")
  1606.     if [ -n "$lib_files" ]; then
  1607.     for lib in $lib_files; do
  1608.         [ -L $root_dir/$lib ] || echo -n "$lib "
  1609.         ( cd ${root_dir:-/} ; cp -dp --parents $lib $tmp_mnt )
  1610.     done
  1611.     lib_files=
  1612.     # no symlinks, most point into the running system
  1613.     for i in `LANG=C LC_ALL=C file -b $tmp_mnt/{,usr/}{lib*/udev/,{,s}bin}/* | awk '/^ELF ..-bit/ { print $2 }' | sort -u`
  1614.     do
  1615.         case "$i" in
  1616.             32-bit)
  1617.                 mkdir -p $tmp_mnt/lib
  1618.                 lib_files="$lib_files `echo $root_dir/lib/libnss_files* $root_dir/lib/libgcc_s.so*`"
  1619.                 ;;
  1620.             64-bit)
  1621.                 mkdir -p $tmp_mnt/lib64
  1622.                 lib_files="$lib_files `echo $root_dir/lib64/libnss_files* $root_dir/lib64/libgcc_s.so*`"
  1623.                 ;;
  1624.         esac
  1625.     done
  1626.     for lib in $lib_files ; do
  1627.         if [ -f $lib ] ; then
  1628.         echo -n "${lib##$root_dir/} "
  1629.         cp -dp --parents $lib $tmp_mnt
  1630.         fi
  1631.     done
  1632.     echo
  1633.     else
  1634.     echo "none"
  1635.     fi
  1636.  
  1637.     > $linuxrc
  1638.     chmod 755 $linuxrc
  1639.  
  1640.     # Note that the in-place documents must be indented with tabs, not spaces.
  1641.     cat_linuxrc <<-EOF
  1642.     |#! $shebang
  1643.     |
  1644.     |export PATH=/sbin:/usr/sbin:/bin:/usr/bin
  1645.     |
  1646.     |devpts=no
  1647.     |die() {
  1648.     |    umount /proc
  1649.     |    umount /sys
  1650.     |    umount /dev
  1651.     |    if test "\$devpts" = "yes"; then
  1652.     |    test -e /dev/pts      && umount -t devpts /dev/pts
  1653.     |    test -e /root/dev/pts && umount -t devpts /root/dev/pts
  1654.     |    fi
  1655.     |    exit \$1
  1656.     |}
  1657.     |
  1658.     |mount -t proc  proc  /proc
  1659.     |mount -t sysfs sysfs /sys
  1660.     |mount -t tmpfs -o mode=0755 udev /dev
  1661.     |
  1662.     |mknod -m 0666 /dev/tty     c 5 0
  1663.     |mknod -m 0600 /dev/console c 5 1
  1664.     |mknod -m 0666 /dev/ptmx    c 5 2
  1665.     |
  1666.     |exec < /dev/console > /dev/console 2>&1
  1667.     |
  1668.     |mknod -m 0666 /dev/null c 1 3
  1669.     |mknod -m 0600 /dev/kmsg c 1 11
  1670.     |mknod -m 0660 /dev/snapshot c 10 231
  1671.     |mknod -m 0666 /dev/random c 1 8
  1672.     |mknod -m 0644 /dev/urandom c 1 9
  1673.     |mkdir -m 0755 /dev/pts
  1674.     |mkdir -m 1777 /dev/shm
  1675.     |ln -s /proc/self/fd /dev/fd
  1676.     |ln -s fd/0 /dev/stdin
  1677.     |ln -s fd/1 /dev/stdout
  1678.     |ln -s fd/2 /dev/stderr
  1679.     |
  1680.     |tty_driver=
  1681.     |for o in \$(cat /proc/cmdline); do
  1682.     |    case "\$o" in
  1683.     |    console=*)
  1684.     |    o=\${o##console=}
  1685.     |    o=\${o%%,*}
  1686.     |    tty_driver="\${tty_driver:+\$tty_driver }\$o"
  1687.     |    ;;
  1688.     |    esac
  1689.     |done
  1690.     |for o in \$tty_driver; do
  1691.     |    case "\$o" in
  1692.     |    tty0)  test -e /dev/tty1  || mknod -m 0660 /dev/tty1  c 4  1 ;;
  1693.     |    ttyS0) test -e /dev/ttyS0 || mknod -m 0660 /dev/ttyS0 c 4 64 ;;
  1694.     |    esac
  1695.     |done
  1696.     |tty_driver=\$(showconsole -n 2>/dev/null)
  1697.     |if test -n "\$tty_driver" ; then
  1698.     |    major=\${tty_driver%% *}
  1699.     |    minor=\${tty_driver##* }
  1700.     |    if test \$major -eq 4 -a \$minor -lt 64 ; then
  1701.     |    tty=/dev/tty\$minor
  1702.     |    test -e \$tty || mknod -m 0660 \$tty c 4 \$minor
  1703.     |    fi
  1704.     |    if test \$major -eq 4 -a \$minor -ge 64 ; then
  1705.     |    tty=/dev/ttyS\$((64-\$minor))
  1706.     |    test -e \$tty || mknod -m 0660 \$tty c 4 \$minor
  1707.     |    fi
  1708.     |    unset major minor tty
  1709.     |fi
  1710.     |unset tty_driver
  1711.     |
  1712.     |REDIRECT=\$(showconsole 2>/dev/null)
  1713.     |if test -n "\$REDIRECT" ; then
  1714.     |    > /dev/shm/initrd.msg
  1715.     |    ln -sf /dev/shm/initrd.msg /var/log/boot.msg
  1716.     |    mkdir -p /var/run
  1717.     |    mount -t devpts devpts /dev/pts
  1718.     |    devpts=yes
  1719.     |    /sbin/blogd \$REDIRECT
  1720.     |fi
  1721.     |
  1722.     |echo "" > /proc/sys/kernel/hotplug
  1723.     |
  1724.     |kernel_cmdline=(\$@)
  1725.     |
  1726.     |build_day=$build_day
  1727.     |case "\$build_day" in
  1728.     |    @*) ;;
  1729.     |    *)
  1730.     |        current_day="\$(LC_ALL=C date -u '+%Y%m%d')"
  1731.     |        if [ "\$current_day" -lt "\$build_day" ] ; then
  1732.     |            echo "your system time is not correct:"
  1733.     |            LC_ALL=C date -u
  1734.     |            echo "setting system time to:"
  1735.     |            LC_ALL=C date -us "\$build_day"
  1736.     |            sleep 3
  1737.     |            export SYSTEM_TIME_INCORRECT=\$current_day
  1738.     |        fi
  1739.     |    ;;
  1740.     |esac
  1741.     |# Default timeout is 30 seconds
  1742.     |udev_timeout=30
  1743.     |
  1744.     |for o in \$(cat /proc/cmdline); do
  1745.     |    case \$o in
  1746.     |    linuxrc=trace)
  1747.     |    echo -n "cmdline: "
  1748.     |    for arg in \$@; do
  1749.     |        echo -n "\$arg "
  1750.     |    done
  1751.     |    echo ""
  1752.     |    set -x
  1753.     |    debug_linuxrc=1
  1754.     |    ;;
  1755.     |    noresume)
  1756.     |    resume_mode=off
  1757.     |    ;;
  1758.     |    rw)
  1759.     |       read_write=1
  1760.     |       ;;
  1761.     |    ro)
  1762.     |       read_only=1
  1763.     |       ;;
  1764.     |    esac
  1765.     |done
  1766.     |
  1767.     |
  1768.     |for o in \$(cat /proc/cmdline); do
  1769.     |    case \$o in
  1770.     |    root=*)
  1771.     |    rootdev=\${o#root=}
  1772.     |    rootdev_cmdline=1
  1773.     |    ;;
  1774.     |    rootfstype=*)
  1775.     |    rootfstype=\${o#rootfstype=}
  1776.     |    ;;
  1777.     |    rootflags=*)
  1778.     |    rootflags=\${o#rootflags=}
  1779.     |    ;;
  1780.     |    nfsroot=*)
  1781.     |    rootdev=\${o#nfsroot=}
  1782.     |    rootdev_cmdline=1
  1783.     |    ;;
  1784.     |    resume=*)
  1785.     |    resumedev=\${o#resume=}
  1786.     |    ;;
  1787.     |    journal=*)
  1788.     |    journaldev=\${o#journal=}
  1789.     |    ;;
  1790.     |    mduuid=*)
  1791.     |    md_uuid=\${o#mduuid=}
  1792.     |    ;;
  1793.     |    init=*)
  1794.     |    init=\${o#init=}
  1795.     |    ;;
  1796.     |    udev_timeout=*)
  1797.     |    udev_timeout=\${o#udev_timeout=}
  1798.     |    ;;
  1799.     |    rootflags=*)
  1800.     |    rootfsflags=\${o#rootflags=}
  1801.     |    ;;
  1802.     |    esac
  1803.     |done
  1804.     |
  1805.     |if [ -z "\$rootdev" ]; then
  1806.     |    rootdev=$rootdev
  1807.     |fi
  1808.     |# lilo strips off the /dev/prefix from device names!
  1809.     |case \$rootdev in
  1810.     |    /dev/disk/by-name/*)
  1811.     |        rootdevid=\${rootdev#/dev/disk/by-name/}
  1812.     |        rootdevid=\${rootdevid%-part*}
  1813.     |        ;;
  1814.     |    /dev/md*)
  1815.     |        md_dev=\$rootdev
  1816.     |        md_minor=\${rootdev#/dev/md}
  1817.     |        ;;
  1818.     |    /dev/*)
  1819.     |        ;;
  1820.     |    LABEL=*)
  1821.     |        label=\${rootdev#LABEL=}
  1822.     |        echo "ENV{ID_FS_USAGE}==\"filesystem|other\", ENV{ID_FS_LABEL_SAFE}==\"\$label\", SYMLINK+=\"root\"" > /etc/udev/rules.d/99-mkinitrd-label.rules
  1823.     |        rootdev=/dev/root
  1824.     |        ;;
  1825.     |    UUID=*)
  1826.     |        uuid=\${rootdev#UUID=}
  1827.     |        echo "ENV{ID_FS_USAGE}==\"filesystem|other\", ENV{ID_FS_UUID}==\"\$uuid\", SYMLINK+=\"root\"" > /etc/udev/rules.d/99-mkinitrd-uuid.rules
  1828.     |        rootdev=/dev/root
  1829.     |        ;;
  1830.     |    [0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])
  1831.     |        maj=\$((0x0\$rootdev >> 8))
  1832.     |        min=\$((0x0\$rootdev & 0xff))
  1833.     |        echo "SUBSYSTEM==\"block\", SYSFS{dev}==\"\$maj:\$min\", SYMLINK+=\"root\"" > /etc/udev/rules.d/05-mkinitrd-lilo.rules
  1834.     |        rootdev=/dev/root ;;
  1835.     |    [0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])
  1836.     |        maj=\$((0x\$rootdev >> 8))
  1837.     |        min=\$((0x\$rootdev & 0xff))
  1838.     |        echo "SUBSYSTEM==\"block\", SYSFS{dev}==\"\$maj:\$min\", SYMLINK+=\"root\"" > /etc/udev/rules.d/05-mkinitrd-lilo.rules
  1839.     |        rootdev=/dev/root ;;
  1840.     |    0x[0-9a-fA-F][0-9a-fA-F]*)
  1841.     |        maj=\$((\$rootdev >> 8))
  1842.     |        min=\$((\$rootdev & 0xff))
  1843.     |        echo "SUBSYSTEM==\"block\", SYSFS{dev}==\"\$maj:\$min\", SYMLINK+=\"root\"" > /etc/udev/rules.d/05-mkinitrd-lilo.rules
  1844.     |        rootdev=/dev/root ;;
  1845.     |    *:/*)
  1846.     |        rootfstype="nfs"
  1847.     |        ;;
  1848.     |    *)
  1849.     |        rootdev=/dev/\$rootdev
  1850.     |        ;;
  1851.     |esac
  1852.     |md_major=\$(sed -ne 's/\s*\([0-9]\+\)\s*md$/\1/p' /proc/devices)
  1853.     |if [ -n "\$md_major" -a "\$md_major" = "\$maj" ]; then
  1854.     |    md_minor="\$min"
  1855.     |    md_dev="/dev/md\$md_minor"
  1856.     |fi
  1857.     |
  1858.     |# Verify manual resume mode
  1859.     |if [ "\$resume_mode" != "off" -a -n "\$resumedev" ]; then
  1860.     |    if [ -x /sbin/resume -o -w /sys/power/resume ]; then
  1861.     |    echo "Trying manual resume from \$resumedev"
  1862.     |    resume_mode=1
  1863.     |    else
  1864.     |    resumedev=
  1865.     |    fi
  1866.     |fi
  1867.     |
  1868.     |# Check for debugging
  1869.     |if [ -n "\$debug_linuxrc" ]; then
  1870.     |    echo "udev_log=\"debug\"" >> /etc/udev/udev.conf
  1871.     |else
  1872.     |    echo "udev_log=\"error\"" >> /etc/udev/udev.conf
  1873.     |fi
  1874.     |
  1875.     |# Set default for the journal device
  1876.     |if [ -z "\$journaldev" ]; then
  1877.     |    journaldev=$journaldev
  1878.     |fi
  1879.     EOF
  1880.  
  1881.     # Transfer the the block_driver function into the initrd
  1882.     type mkdevn | sed -e '1d' >> $linuxrc
  1883.     echo >> $linuxrc
  1884.     type devmajor | sed -e '1d' >> $linuxrc
  1885.     echo >> $linuxrc
  1886.     type devminor | sed -e '1d' >> $linuxrc
  1887.     echo >> $linuxrc
  1888.     type block_driver | sed -e '1d' >> $linuxrc
  1889.     echo >> $linuxrc
  1890.     type devnumber | sed -e '1d' >> $linuxrc
  1891.     echo >> $linuxrc
  1892.  
  1893.     # Start udev
  1894.     cat_linuxrc <<-EOF
  1895.     |echo "Creating device nodes with udev"
  1896.     |/sbin/udevd --daemon
  1897.     |/sbin/udevtrigger
  1898.     |/sbin/udevsettle --timeout=\$udev_timeout
  1899.     EOF
  1900.  
  1901.     # Start blogd if not already done
  1902.     cat_linuxrc <<-'EOF'
  1903.     |if test -z "$REDIRECT" ; then
  1904.     |    REDIRECT=$(showconsole 2>/dev/null)
  1905.     |    if test -n "$REDIRECT" ; then
  1906.     |    > /dev/shm/initrd.msg
  1907.     |    ln -sf /dev/shm/initrd.msg /var/log/boot.msg
  1908.     |    mkdir -p /var/run
  1909.     |    /sbin/blogd $REDIRECT
  1910.     |    fi
  1911.     |fi
  1912.     EOF
  1913.  
  1914.     # FIXME: we should only load IDE modules if we need them for booting
  1915.     # Check for IDE modules
  1916.     if [ -n "$scan_pci_bus" ] ; then
  1917.     check_ide_modules $root_dir/lib/modules/$kernel_version
  1918.     fi
  1919.  
  1920.     resolved_modules="$(resolve_modules $kernel_version $modules)"
  1921.  
  1922.     # If a SCSI module is loaded, we will have a dependency on scsi_mod
  1923.     # for kernels which don't have this built in. In that case, assume
  1924.     # that the root file system is on a SCSI device, and also include
  1925.     # sd_mod.
  1926.     local have_scsi have_sd
  1927.     case "$resolved_modules" in
  1928.     */scsi_mod.*)   have_scsi=1
  1929.             ;;
  1930.     */sd_mod.*)    have_sd=1
  1931.             ;;
  1932.     esac
  1933.     if [ -n "$have_scsi" -a -z "$have_sd" ]; then
  1934.     modules="sd_mod $modules"
  1935.     # Re-evaluate module dependencies
  1936.     resolved_modules="$(resolve_modules $kernel_version $modules)"
  1937.     fi
  1938.  
  1939.     # The same reasoning goes for IDE modules
  1940.     local have_ide have_ide_disk
  1941.     case "$resolved_modules" in
  1942.     */ide-core.*)   have_ide=1
  1943.             ;;
  1944.     */ide-disk.*)    have_ide_disk=1
  1945.             ;;
  1946.     esac
  1947.     if [ -n "$have_ide" -a -z "$have_ide_disk" ]; then
  1948.     modules="ide-disk $modules"
  1949.     # Re-evaluate module dependencies
  1950.     resolved_modules="$(resolve_modules $kernel_version $modules)"
  1951.     fi
  1952.  
  1953.     if is_xen_kernel $kernel_version; then
  1954.     xenu_modules="$(resolve_modules $kernel_version $domu_modules)"
  1955.     fi
  1956.  
  1957.     # Copy all modules into the initrd
  1958.     for module in $resolved_modules $xenu_modules; do
  1959.     if [ ! -r $root_dir/$module ]; then
  1960.         oops 9 "Module $module not found."
  1961.         continue
  1962.     fi
  1963.     if ! ( cd ${root_dir:-/} ; cp -p --parents $module $tmp_mnt ) ; then
  1964.         oops 6 "Failed to add module $module."
  1965.         rm -rf $tmp_mnt
  1966.         return
  1967.     fi
  1968.     done
  1969.  
  1970.     # Add modules which might be loaded via udev during booting
  1971.     uld_modules=
  1972.     for module in sd_mod osst st sr_mod sg ide-disk ide-scsi \
  1973.               ide-cd ide-tape ide-floppy cdrom; do
  1974.     grep -qw $module $root_dir/lib/modules/$kernel_version/modules.dep \
  1975.     && uld_modules="$uld_modules $module"
  1976.     done
  1977.     uld_modules="$(resolve_modules $kernel_version $uld_modules)"
  1978.  
  1979.     # Now copy the upper level driver modules
  1980.     for module in $uld_modules; do
  1981.     if [ ! -f $tmp_mnt/$module ]; then
  1982.         if ! ( cd ${root_dir:-/} ; cp -p --parents $module $tmp_mnt ) ; then
  1983.         oops 6 "Failed to add module $module."
  1984.         rm -rf $tmp_mnt
  1985.         return
  1986.         fi
  1987.     fi
  1988.     done
  1989.  
  1990.     # Filter modules into fs and non-fs (driver) modules.
  1991.     # We do this to avoid loading xfs when doing a resume: xfs had
  1992.     # (or still has) a bug that slows down resume a lot.
  1993.     # FIXME: get rid of this split crap again.
  1994.     for module in $resolved_modules; do
  1995.     if [ "$module" != "${module#*/kernel/fs/}" ]; then
  1996.         fs_modules="$fs_modules $module"
  1997.     elif is_xen_kernel $kernel_version && [ "$module" != "${module#*/kernel/drivers/xen/*/xen}" ]; then
  1998.         xen_modules="$xen_modules $module"
  1999.     else
  2000.         drv_modules="$drv_modules $module"
  2001.     fi
  2002.     done
  2003.     #fs_modules="$(echo "$resolved_modules" | grep -e '/kernel/fs/')"
  2004.     #drv_modules="$(echo "$resolved_modules" | grep -v -e '/kernel/fs/')"
  2005.  
  2006.     echo -ne "Driver modules:\t"
  2007.     initrd_is_using_modules=
  2008.  
  2009.     if is_xen_kernel $kernel_version; then
  2010.     # NOTE: We use the same settings as the dom0 initrd, except
  2011.     # for the different module list. So we share fsck, dm, ... support.
  2012.     cat_linuxrc <<-EOF
  2013.     |caps="\$(</proc/xen/capabilities)"
  2014.     |if [ "\$caps" != "\${caps%control_d*}" ]; then
  2015.     EOF
  2016.     fi
  2017.  
  2018.     for modpath in $drv_modules; do
  2019.     module=${modpath##*/}
  2020.     module=${module%.ko}
  2021.     echo -n "${module} "
  2022.     cat_linuxrc <<-EOF
  2023.     |params=
  2024.     |for p in \$(cat /proc/cmdline) ; do
  2025.     |  case \$p in
  2026.     |    $module.*)
  2027.     |      params="\$params \${p#$module.}"
  2028.     |      ;;
  2029.     |  esac
  2030.     |done
  2031.     EOF
  2032.  
  2033.     case $module in
  2034.         dasd_mod)
  2035.         # kernel cmdline dasd parameter is placed into the environment.
  2036.         # This is tricky. The only reliably way to check whether the
  2037.         # dasd parameter is set is to indeed check for it within the
  2038.         # initrd environment itself. Unfortunately the dasd module
  2039.         # refuses to load when the dasd parameter is empty, so we
  2040.         # need introduce an intermediate parameter which might be
  2041.         # set to empty entirely so as not to confuse the dasd module.
  2042.         #
  2043.         # This checks whether the dasd parameter is present
  2044.         cat_linuxrc <<-EOF
  2045.         |# check for DASD parameter in /proc/cmdline
  2046.         |for p in \$(cat /proc/cmdline) ; do
  2047.         |  case \$p in
  2048.         |    dasd=*)
  2049.         |      params="\$params \$p"
  2050.         |      ;;
  2051.         |  esac
  2052.         |done
  2053.         EOF
  2054.         ;;
  2055.         ide?core)
  2056.         # This checks whether an ide= parameter is present
  2057.         cat_linuxrc <<-EOF
  2058.         |# check for IDE parameter in /proc/cmdline
  2059.         |for p in \$(cat /proc/cmdline) ; do
  2060.         |  case \$p in
  2061.         |    ide=*)
  2062.         |      ide_params="\$ide_params \$p"
  2063.         |      ;;
  2064.         |    hd?=*)
  2065.         |      ide_params="\$ide_params \$p"
  2066.         |      ;;
  2067.         |  esac
  2068.         |done
  2069.         |if [ -n "\$ide_params" ]; then
  2070.         |  params="\$params options=\"\$ide_params\""
  2071.         |fi
  2072.         EOF
  2073.         ;;
  2074.         scsi_mod)
  2075.         # We may have SCSI parameters on the kernel command line,
  2076.         # but because scsi_mod is a module, those would be ignored.
  2077.         # Hack around this by scanning /proc/cmdline in linuxrc.
  2078.  
  2079.         cat_linuxrc <<-EOF
  2080.         |# check for SCSI parameters in /proc/cmdline
  2081.         |devflags=0
  2082.         |for p in \$(cat /proc/cmdline) ; do
  2083.         |  case \$p in
  2084.         |    scsi_mod.*)
  2085.         |    params="\$params \${p#scsi_mod.}"
  2086.         |    ;;
  2087.         |    scsi_reportlun2=1)
  2088.         |    echo "scsi_reportlun2 compat: Use scsi_mod.default_dev_flags=0x20000 instead"
  2089.         |    devflags=\$((131072+\$devflags))
  2090.         |    ;;
  2091.         |    scsi_noreportlun=1)
  2092.         |    echo "scsi_noreportlun compat: Use scsi_mod.default_dev_flags=0x40000 instead"
  2093.         |    devflags=\$((262144+\$devflags))
  2094.         |    ;;
  2095.         |    scsi_sparselun=1)
  2096.         |    echo "scsi_sparselun compat: Use scsi_mod.default_dev_flags=0x40 instead"
  2097.         |    devflags=\$((64+\$devflags))
  2098.         |    ;;
  2099.         |    scsi_largelun=1)
  2100.         |    echo "scsi_largelun compat: Use scsi_mod.default_dev_flags=0x200 instead"
  2101.         |    devflags=\$((512+\$devflags))
  2102.         |    ;;
  2103.         |    llun_blklst=*)
  2104.         |    echo "llun_blklst is not supported any more"
  2105.         |    echo "use scsi_mod.dev_flags=VENDOR:MODEL:0x240[,V:M:0x240[,...]]"
  2106.         |    ;;
  2107.         |    max_ghost_devices=*)
  2108.         |    echo "max_ghost_devices is not needed any more"
  2109.         |    ;;
  2110.         |    max_sparseluns=*)
  2111.         |    echo "max_sparseluns not supported any more"
  2112.         |    echo "use scsi_mod.max_luns or enable the new REPORT_LUNS scsi"
  2113.         |    echo "scanning methods; try scsi_mod.default_dev_flags=0x20000"
  2114.         |    ;;
  2115.         |    max_luns=*|max_report_luns=*|inq_timeout=*|dev_flags=*|default_dev_flags=*)
  2116.         |    echo "scsi_mod compat: Please use prefix: scsi_mod.\$p"
  2117.         |    params="\$params \$p"
  2118.         |      ;;
  2119.         |  esac
  2120.         |done
  2121.         |if [ \$devflags != 0 ]; then 
  2122.         |    params="default_dev_flags=\$devflags \$params"
  2123.         |fi
  2124.         EOF
  2125.         ;;
  2126.     esac
  2127.     cat_linuxrc <<-EOF
  2128.     |echo "Loading $module"
  2129.     |modprobe $module \$params
  2130.     EOF
  2131.  
  2132.     initrd_is_using_modules=1
  2133.     done
  2134.  
  2135.     if is_xen_kernel $kernel_version; then
  2136.     if [ "$xenu_modules" -o "$xen_modules" ]; then
  2137.         cat_linuxrc <<-EOF
  2138.         |else
  2139.         EOF
  2140.         echo -ne "\nXen domU modules:\t"
  2141.  
  2142.         for modpath in $xenu_modules $xen_modules; do
  2143.         module=${modpath##*/}
  2144.         module=${module%.ko}
  2145.         echo -n "${module} "
  2146.         cat_linuxrc <<-EOF
  2147.         |params=
  2148.         |for p in \$(cat /proc/cmdline) ; do
  2149.         |  case \$p in
  2150.         |    $module.*)
  2151.         |      params="\$params \${p#$module.}"
  2152.         |      ;;
  2153.         |  esac
  2154.         |done
  2155.         |echo "Loading $module"
  2156.         |modprobe $module \$params
  2157.         EOF
  2158.  
  2159.         initrd_is_using_modules=1
  2160.         done
  2161.     fi
  2162.     cat_linuxrc <<-EOF
  2163.     |fi
  2164.     EOF
  2165.     fi
  2166.  
  2167.     if [ -z "$initrd_is_using_modules" ]; then
  2168.     echo "none"
  2169.     else
  2170.     echo
  2171.     fi
  2172.  
  2173.     if [ -n "$s390_dasd_disks" ]; then
  2174.     # We only need to activate DASDs manually if it
  2175.     # is not done via the kernel command line
  2176.     echo -e -n "DASDs:\t\t"
  2177.     cat_linuxrc <<-EOF
  2178.     |if test -z "\$dasd_params"; then
  2179.     |    echo -n "Activating DASDs:"
  2180.     EOF
  2181.     s390_dasd_disk_num=0
  2182.     for disk in $s390_dasd_disks; do
  2183.         set -- $(IFS=":"; echo $disk)
  2184.         use_diag=0
  2185.         case "$2" in
  2186.         0)
  2187.             echo -n " $1(ECKD)"
  2188.             ;;
  2189.         1)
  2190.             echo -n " $1(FBA)"
  2191.             ;;
  2192.         2)
  2193.             echo -n " $1(DIAG)"
  2194.             use_diag=1
  2195.             ;;
  2196.         esac
  2197.         cat_linuxrc <<-EOF
  2198.     |    echo -n " $disk"
  2199.     |    /sbin/dasd_configure $1 1 $use_diag
  2200.     EOF
  2201.         s390_dasd_disk_num=$(( $s390_dasd_disk_num + 1 ))
  2202.     done
  2203.     echo ""
  2204.     cat_linuxrc <<-EOF
  2205.     |    echo " : done"
  2206.     |fi
  2207.     EOF
  2208.     fi
  2209.  
  2210.     if [ -n "$s390_zfcp_disks" ]; then
  2211.     echo -e -n "zfcp HBAs:\t"
  2212.     for hba in $s390_zfcp_hbas; do
  2213.         echo -n "$hba "
  2214.         cat_linuxrc <<-EOF
  2215.     |echo "Activating zfcp host $hba"
  2216.     |/sbin/zfcp_host_configure $hba 1
  2217.     EOF
  2218.     done
  2219.     echo
  2220.  
  2221.     echo -e "zfcp disks:\t"
  2222.     s390_zfcp_disk_num=0
  2223.     for disk in $s390_zfcp_disks; do
  2224.         s390_zfcp_disk_num=$(( $s390_zfcp_disk_num + 1 ))
  2225.         set -- $(IFS=":"; echo $disk)
  2226.         echo -e "\t\t$1:$2:$3"
  2227.         cat_linuxrc <<-EOF
  2228.     |echo "Activating zfcp disk $1:$2:$3"
  2229.     |/sbin/zfcp_disk_configure $1 $2 $3 1
  2230.     EOF
  2231.     done
  2232.     fi
  2233.  
  2234.     case "$(uname -m)" in
  2235.     s390|s390x)
  2236.         if [ -z "$s390_zfcp_disks" -a -z "$s390_dasd_disks" ]; then
  2237.         echo ""
  2238.         echo "WARNING: No boot devices found."
  2239.         echo "Make sure to add 'dasd=<dasd-range>' to" \
  2240.              "the kernel command line"
  2241.         fi
  2242.         ;;
  2243.     esac
  2244.  
  2245.     if [ -n "$use_dhcp" ] ; then
  2246.     cat_linuxrc <<-'EOF'
  2247.     |case $rootdev in
  2248.     |/dev/nfs|*:/*|"")
  2249.     |   dhcp_mode=1 ;;
  2250.     |esac
  2251.     EOF
  2252.     fi
  2253.  
  2254.     if [ -n "$iscsi_root" ] ; then
  2255.     cat_linuxrc <<-EOF
  2256.     |for o in \$(cat /proc/cmdline); do
  2257.     |  case \$o in
  2258.     |    TargetAddress=*)
  2259.     |      iscsiserver="\${o#TargetAddress=}" ;;
  2260.     |    TargetName=*)
  2261.     |      iscsitarget="\${o#TargetName=}" ;;
  2262.     |    TargetPort=*)
  2263.     |      iscsiport="\${o#TargetPort=}" ;;
  2264.     |    InitiatorName=*)
  2265.     |      echo \$o > /etc/iscsi/initiatorname.iscsi ;;
  2266.     |  esac
  2267.     |done
  2268.     |# Always enable DHCP for iSCSI
  2269.     |dhcp_mode=1
  2270.     EOF
  2271.     fi
  2272.  
  2273.     if [ -n "$use_dhcp" ] ; then
  2274.     cat_linuxrc <<-EOF
  2275.     |# run dhcp
  2276.     |if [ -n "\$dhcp_mode" ]; then
  2277.     |  # ifconfig lo 127.0.0.1 netmask 255.0.0.0 broadcast 127.255.255.255 up
  2278.     |  # portmap
  2279.     |  echo "running dhcpcd on interface $interface"
  2280.     |  dhcpcd -R -Y -N -t 100000000 $interface
  2281.     |  [ -s /var/lib/dhcpcd/dhcpcd-$interface.info ] || {
  2282.     |    echo "no response from dhcp server."
  2283.     |    die 0
  2284.     |  }
  2285.     |  . /var/lib/dhcpcd/dhcpcd-$interface.info
  2286.     |  kill -9 \$(cat /var/run/dhcpcd-$interface.pid)
  2287.     |  if [ -n "\$DNS" ]; then
  2288.     |    oifs="\$IFS"
  2289.     |    IFS=","
  2290.     |    for ns in \$DNS ; do
  2291.     |      echo "nameserver \$ns" >> /etc/resolv.conf
  2292.     |    done
  2293.     |    IFS="\$oifs"
  2294.     |    if [ -n "\$DOMAIN" ]; then
  2295.     |    echo "search \$DOMAIN" >> /etc/resolv.conf
  2296.     |    fi
  2297.     |    echo 'hosts: dns' > /etc/nsswitch.conf
  2298.     |  fi
  2299.     |fi
  2300.     EOF
  2301.     fi
  2302.  
  2303.     if [ -n "$interface" ] ; then
  2304.     case $interface in
  2305.         ctc*)
  2306.         ccwdevs=$(s390_get_ctc_ccwdevs $interface)
  2307.     cat_linuxrc <<-EOF
  2308.     |# configure $interface
  2309.     |if [ -d /sys/bus/ccwgroup/drivers/ctc ]; then
  2310.     |  echo "$ccwdevs" > /sys/bus/ccwgroup/drivers/ctc/group
  2311.     |  # Wait for the device to appear
  2312.     |  i=100
  2313.     |  while [ "\$i" -gt 0 ]; do
  2314.     |    [ -d /sys/bus/ccwgroup/devices/${ccwdevs%%,*} ] && break
  2315.     |    i=\$(( \$i - 1 ))
  2316.     |  done
  2317.     |  if [ "\$i" -le 0 ] ; then
  2318.     |    echo "Interface $interface could not be setup, exiting to /bin/sh"
  2319.     |    cd /
  2320.     |    PATH=$PATH PS1='$ ' /bin/sh -i
  2321.     |  else
  2322.     |    echo 1 > /sys/bus/ccwgroup/devices/${ccwdevs%%,*}/online
  2323.     |  fi
  2324.     |fi
  2325.     EOF
  2326.     ;;
  2327.     esac
  2328.     fi
  2329.  
  2330.     if [ -n "$use_ipconfig" ]; then
  2331.     ipinterface=$(get_ip_config $interface)
  2332.     cat_linuxrc <<-EOF
  2333.     |# configure interface
  2334.     |for o in \$(cat /proc/cmdline); do
  2335.     |  case \$o in
  2336.     |    ip=*)
  2337.     |      ifspec=\${o#ip=};;
  2338.     |  esac
  2339.     |done
  2340.     |if [ -z "\$ifspec" ]; then
  2341.     |    # Fallback to configured interface
  2342.     |    ifspec=$ipinterface
  2343.     |fi
  2344.     |if [ -n "\$ifspec" ]; then
  2345.     |  /bin/ipconfig \$ifspec
  2346.     |fi
  2347.     EOF
  2348.     fi
  2349.  
  2350.     if [ -n "$iscsi_root" ] ; then
  2351.     iscsi_tgtname=$(cat /sys/class/iscsi_session/${iscsi_root}/targetname)
  2352.     iscsi_tgtaddr=$(cat /sys/class/iscsi_connection/connection${iscsi_root#session}:0/address)
  2353.     cat_linuxrc <<-EOF
  2354.     |iscsi_login_root_node()
  2355.     |{
  2356.     |    if [ -z "\$iscsitarget" ] ; then 
  2357.     |      iscsitarget=$iscsi_tgtname
  2358.     |    fi
  2359.     |
  2360.     |    if [ -z "\$iscsiserver" ] ; then 
  2361.     |      iscsiserver=$iscsi_tgtaddr
  2362.     |    fi
  2363.     |
  2364.     |
  2365.     |    echo -n "Discover targets on \$iscsiserver: "
  2366.     |    if /sbin/iscsiadm -m discovery -t st -p \$iscsiserver:\$iscsiport 2> /dev/null ; then
  2367.     |    echo "ok."
  2368.     |    else
  2369.     |    echo "failed."
  2370.     |    return 1
  2371.     |    fi
  2372.     |    echo -n "Logging into \$iscsitarget: "
  2373.     |    if /sbin/iscsiadm -m node -T \$iscsitarget -p \$iscsiserver:\$iscsiport -l ; then
  2374.     |    echo "ok."
  2375.     |    else
  2376.     |    echo "failed."
  2377.     |    fi
  2378.     |}
  2379.     |
  2380.     |echo "Starting iSCSI daemon"
  2381.     |/sbin/iscsid
  2382.     |
  2383.     |iscsi_login_root_node
  2384.     |
  2385.     EOF
  2386.     fi
  2387.  
  2388.     if [ "$rootfstype" = "nfs" ]; then
  2389.     cat_linuxrc <<-'EOF'
  2390.     |if [ -z "$rootdev_cmdline" ]; then
  2391.     |  case "$ROOTPATH" in
  2392.     |    "") ;;
  2393.     |    *:*)
  2394.     |    rootfstype="nfs"
  2395.     |    rootdev="$ROOTPATH" ;;
  2396.     |    *)
  2397.     |    if [ -n "$DHCPSIADDR" ]; then
  2398.     |        rootdev="$DHCPSIADDR:$ROOTPATH"
  2399.     |        rootfstype="nfs"
  2400.     |    elif [ -n "$DHCPSNAME" ]; then
  2401.     |        rootdev="$DHCPSNAME:$ROOTPATH"
  2402.     |        rootfstype="nfs"
  2403.     |    fi ;;
  2404.     |   esac
  2405.     |   if [ -z "$rootdev" ]; then
  2406.     |    echo "no local root= kernel option given and no root" \
  2407.     |         "server set by the dhcp server."
  2408.     |    die 0
  2409.     |   fi
  2410.     |fi
  2411.     EOF
  2412.     fi
  2413.  
  2414.     if [ -n "$root_mpath" -o -n "$root_lvm2" -o -n "$root_evms" ]; then
  2415.     cat_linuxrc <<-'EOF'
  2416.     |echo -n "Waiting for /dev/mapper/control to appear: "
  2417.     |for i in 1 2 3 4 5; do
  2418.     |    [ -e /dev/mapper/control ] && break
  2419.     |    sleep 1
  2420.     |    echo -n "."
  2421.     |done
  2422.     |if [ -e /dev/mapper/control ]; then
  2423.     |    echo " ok"
  2424.     |else
  2425.     |    echo " failed"
  2426.     |fi
  2427.     EOF
  2428.     fi
  2429.  
  2430.     cat_linuxrc <<-'EOF'
  2431.     |
  2432.     |# Waiting for a device to appear
  2433.     |# device node will be created by udev
  2434.     |udev_check_for_device() {
  2435.     |    local root
  2436.     |    local retval=1
  2437.     |    local timeout=$udev_timeout
  2438.     |    root=$1
  2439.     |    if [ -n "$root" ]; then
  2440.     |    echo -n "Waiting for device $root to appear: "
  2441.     |    while [ $timeout -gt 0 ]; do
  2442.     |        if [ -e $root ]; then
  2443.     |        echo " ok"
  2444.     |        retval=0
  2445.     |        break;
  2446.     |        fi
  2447.     |        sleep 1
  2448.     |        echo -n "."
  2449.     |        timeout=$(( $timeout - 1 ))
  2450.     |    done
  2451.     |    fi
  2452.     |    return $retval;
  2453.     |}
  2454.     |
  2455.     |udev_discover_resume() {
  2456.     |    local resume devn major minor
  2457.     |    if [ ! -f /sys/power/resume ] ; then
  2458.     |    return
  2459.     |    fi
  2460.     |    if [ -z "$resumedev" ] ; then
  2461.     |    return
  2462.     |    fi
  2463.     |    # Waits for the resume device to appear
  2464.     |    if [ "$resume_mode" != "off" ]; then
  2465.     |    if [ -e $resumedev ] ; then
  2466.     |        # Try major:minor number of the device node
  2467.     |        devn=$(devnumber $resumedev)
  2468.     |        major=$(devmajor $devn)
  2469.     |        minor=$(devminor $devn)
  2470.     |       fi
  2471.     |       if [ -n "$major" -a -n "$minor" ]; then
  2472.     |        if [ -x /sbin/resume ]; then
  2473.     |        echo "Invoking userspace resume from $resumedev"
  2474.     |        /sbin/resume $resumedev
  2475.     |        fi
  2476.     |        echo "Invoking in-kernel resume from $resumedev"
  2477.     |        echo "$major:$minor" > /sys/power/resume
  2478.     |    else
  2479.     |        echo "resume device $resumedev not found (ignoring)"
  2480.     |       fi
  2481.     |    fi
  2482.     |}
  2483.     |
  2484.     |udev_discover_root() {
  2485.     |    local root devn major minor
  2486.     |    case "$rootdev" in
  2487.     |    *:/*) root= ;;
  2488.     |    /dev/nfs) root= ;;
  2489.     |    /dev/*)    root=${rootdev#/dev/} ;;
  2490.     |    esac
  2491.     |    if [ -z "$root" ]; then
  2492.     |    return 0
  2493.     |    fi
  2494.     |    if udev_check_for_device $rootdev  ; then
  2495.     |    # Get major:minor number of the device node
  2496.     |    devn=$(devnumber $rootdev)
  2497.     |    major=$(devmajor $devn)
  2498.     |    minor=$(devminor $devn)
  2499.     |    fi
  2500.     |    if [ -n "$devn" ]; then
  2501.     |    return 0
  2502.     |    else
  2503.     |    return 1
  2504.     |    fi
  2505.     |}
  2506.     |
  2507.     |/sbin/udevsettle --timeout=$udev_timeout
  2508.     |
  2509.     EOF
  2510.  
  2511.     # Load fs modules _after_ resume
  2512.     echo -ne "Filesystem modules:\t"
  2513.     initrd_is_using_modules=
  2514.     for modpath in $fs_modules; do
  2515.     module=${modpath##*/}
  2516.     module=${module%.ko}
  2517.     echo -n "$module "
  2518.     cat_linuxrc <<-EOF
  2519.     |params=
  2520.     |for p in \$(cat /proc/cmdline) ; do
  2521.     |  case \$p in
  2522.     |    $module.*)
  2523.     |      params="\$params \${p#$module.}"
  2524.     |      ;;
  2525.     |  esac
  2526.     |done
  2527.     EOF
  2528.  
  2529.     cat_linuxrc <<-EOF
  2530.     |echo "Loading ${module#/lib/modules/$kernel_version/}"
  2531.     |modprobe $module
  2532.     EOF
  2533.     initrd_is_using_modules=1
  2534.     done
  2535.     echo
  2536.  
  2537.     # And run depmod to ensure proper loading
  2538.     if [ "$sysmap" ] ; then
  2539.     map="$sysmap"
  2540.     else
  2541.     map=$root_dir/boot/System.map-$kernel_version
  2542.     fi
  2543.     if [ ! -f $map ]; then
  2544.     map=$root_dir/boot/System.map
  2545.     fi
  2546.     if [ ! -f $map ]; then
  2547.     oops 9 "Could not find map $map, please specify a correct file with -M."
  2548.     rm -rf $tmp_mnt
  2549.     return
  2550.     fi
  2551.  
  2552.     ( cd $tmp_mnt; /sbin/depmod -b $tmp_mnt -e -F $map $kernel_version )
  2553.  
  2554.     if [ -n "$root_mpath" ] ; then
  2555.     cat_linuxrc <<-EOF
  2556.     |# check for IDE parameter in /proc/cmdline
  2557.     |for o in \$(cat /proc/cmdline) ; do
  2558.     |  case \$o in
  2559.     |    multipath=*)
  2560.     |      mpath_status=\${o#multipath=};;
  2561.     |  esac
  2562.     |done
  2563.     |mpath_list=\$(sed -n '/multipath/p' /proc/modules)
  2564.     |if [ -z "\$mpath_list" ] ; then
  2565.     |  mpath_status=off
  2566.     |fi
  2567.     |if [ "\$mpath_status" != "off" ] ; then
  2568.     |  # Rescan for multipath
  2569.     |  echo -n "Setup multipath devices: "
  2570.     |  /sbin/multipath -v0
  2571.     |  /sbin/udevsettle --timeout=\$udev_timeout
  2572.     |  echo 'ok.'
  2573.     |fi
  2574.     EOF
  2575.     fi
  2576.  
  2577.     if [ -n "$need_raidstart" ]; then
  2578.     features=(${features[@]} raidstart)
  2579.     cat_linuxrc <<-EOF
  2580.     |echo "raidstart ..."
  2581.     |raidstart --all
  2582.     |echo "done..."
  2583.     EOF
  2584.     fi
  2585.  
  2586.     if [ -n "$need_mdadm" ]; then
  2587.     cat_linuxrc <<-EOF
  2588.     |
  2589.     |if [ -f /etc/mdadm.conf ] ; then
  2590.     |    mdarg="-Ac /etc/mdadm.conf"
  2591.     |    [ -z "\$md_dev" ] && md_dev="--scan"
  2592.     |else
  2593.     |    mdarg="-Ac partitions"
  2594.     |fi
  2595.     |
  2596.     |if [ -n "\$md_uuid" ] ; then
  2597.     |    mdarg="\$mdarg --uuid=\$md_uuid"
  2598.     |elif [ -n "\$md_minor" ] ; then
  2599.     |    mdarg="\$mdarg --super-minor=\$md_minor"
  2600.     |    md_dev="/dev/md\$md_minor"
  2601.     |fi
  2602.     |
  2603.     |if [ -z "\$md_uuid" -a -n "$md_uuid" ] ; then
  2604.     |    mdarg="\$mdarg --uuid=$md_uuid"
  2605.     |elif [ -z "\$md_minor" -a -n "$md_minor" ] ; then
  2606.     |    mdarg="\$mdarg --super-minor=$md_minor"
  2607.     |fi
  2608.     |
  2609.     |case \$resumedev in
  2610.     |    /dev/md*)
  2611.     |        echo 1 > /sys/module/md_mod/parameters/start_ro
  2612.     |        resumeminor="\${resumedev#/dev/md}"
  2613.     |        mdadm -Ac partitions -m \$resumeminor --auto=md \$resumedev
  2614.     |        ;;
  2615.     |esac
  2616.     |
  2617.     |if [ "\$md_dev" ] ; then
  2618.     |    /sbin/mdadm \$mdarg --auto=md \$md_dev
  2619.     |fi
  2620.     EOF
  2621.     fi
  2622.  
  2623.     cat_linuxrc <<-'EOF'
  2624.     |# Wait for udev to settle
  2625.     |/sbin/udevsettle --timeout=$udev_timeout
  2626.     |# Check for a resume device
  2627.     |udev_discover_resume
  2628.     EOF
  2629.  
  2630.     if [ -n "$need_mdadm" ]; then
  2631.     cat_linuxrc <<-EOF
  2632.     |if [ -n "\$resume_minor" ] ; then
  2633.     |    # Stop all arrays
  2634.     |    /sbin/mdadm --stop
  2635.     |    # Switch md back to read-write mode
  2636.     |    if [ -f /sys/module/md_mod/parameters/start_ro ]; then
  2637.     |        # maybe should switch all arrays to rw/ but not really necessary
  2638.     |        echo 0 > /sys/module/md_mod/parameters/start_ro
  2639.     |    fi
  2640.     |
  2641.     |    # And restart them again
  2642.     |    /sbin/mdadm \$mdarg --auto=md \$md_dev
  2643.     |    /sbin/udevsettle --timeout=\$udev_timeout
  2644.     |fi
  2645.     EOF
  2646.     fi
  2647.  
  2648.     if [ -n "$need_dmraid" ] ; then
  2649.     cat_linuxrc <<-EOF
  2650.     |/sbin/dmraid -a y -p
  2651.     |/sbin/udevsettle --timeout=\$udev_timeout
  2652.     EOF
  2653.     fi
  2654.     
  2655.     if [ -n "$root_lvm" ] ; then
  2656.     # Name of the volume containing the root filesystem
  2657.         local vg_root=${rootdev#/dev/}
  2658.         vg_root=${vg_root%%/*}
  2659.  
  2660.     cat_linuxrc <<-EOF
  2661.     |#need space for lvm data
  2662.     |mount -tramfs none /etc/lvmtab.d
  2663.     |vgscan
  2664.     |for o in \$(cat /proc/cmdline); do
  2665.     |  case \$o in
  2666.     |    root=/dev/*)
  2667.     |    set -- \$(IFS=/ ; echo \$o)
  2668.     |    vg_root=\$3
  2669.     |    ;;
  2670.     |  esac
  2671.     |done
  2672.     |if [ -z "\$vg_root" ]; then
  2673.     |  vg_root=$vg_root
  2674.     |fi
  2675.     |
  2676.     |vgchange -a y \$vg_root
  2677.     |umount /etc/lvmtab.d
  2678.     EOF
  2679.     fi
  2680.  
  2681.     if [ -n "$root_lvm2" ] ; then
  2682.     cat_linuxrc <<-EOF
  2683.     |
  2684.     |for o in \$(cat /proc/cmdline); do
  2685.     |  case \$o in
  2686.     |    root=/dev/disk/by-*/*)
  2687.     |       vg_root=
  2688.     |       ;;
  2689.     |    root=/dev/mapper/*)
  2690.     |       set -- \$(IFS=- ; echo \$o)
  2691.     |       vg_root=\$2
  2692.     |       ;;
  2693.     |    root=/dev/*)
  2694.     |       set -- \$(IFS=/ ; echo \$o)
  2695.     |       vg_root=\$3
  2696.     |       ;;
  2697.     |  esac
  2698.     |done
  2699.     |if [ -z "\$vg_root" ]; then
  2700.     |  vg_root=$vg_root
  2701.     |fi
  2702.     |
  2703.     |vgchange -a y \$vg_root
  2704.     EOF
  2705.     fi
  2706.  
  2707.     if [ -n "$root_evms" ] ; then
  2708.     cat_linuxrc <<-EOF
  2709.     |fix_evms_root_node()
  2710.     |    {
  2711.     |    CURDEV=\$(devnumber \$2)
  2712.     |    OLDDEV=\$(devnumber \$1\$2)
  2713.     |    if [ ! -b \$1\$2 -o "\$CURDEV" -ne "\$OLDDEV" ]
  2714.     |    then
  2715.     |    mount -oremount,rw \$2 \$1
  2716.     |    rm -f \$1\$2
  2717.     |    mknod -m 0640 \$1\$2 b \$(devmajor \$CURDEV) \$(devminor \$CURDEV)
  2718.     |    mount -oremount,ro \$2 \$1
  2719.     |    fi
  2720.     |    }
  2721.     |
  2722.     |remove_evms_fstab()
  2723.     |    {
  2724.     |    for i in \$*
  2725.     |    do
  2726.     |    dmsetup remove "\$i"
  2727.     |    done
  2728.     |    }
  2729.     |
  2730.     |get_fstab_entries()
  2731.     |    {
  2732.     |    FSTLIST=\$(sed -n "\:^/dev/:p" <\$1 | sed -e "\:/media/:d" -e "s:/dev/::" -e "s:[   ].*::" -e "s:/:|:g")
  2733.     |    for i in \$FSTLIST
  2734.     |    do
  2735.     |    LINES=\$(dmsetup ls | sed -n "\:^\$i:p")
  2736.     |        [ -n "\$LINES" ] && RETLIST="\$RETLIST \$i"
  2737.     |    done
  2738.     |    echo \$RETLIST
  2739.     |    }
  2740.     |
  2741.     |create_evms_save_table()
  2742.     |    {
  2743.     |    TNAME=\$1
  2744.     |    shift
  2745.     |    COUNT=0
  2746.     |    rm -f /table_file
  2747.     |    for i in \$*
  2748.     |    do
  2749.     |    dd=\$(echo \$i | sed "s:|:/:g")
  2750.     |    echo \$(expr \$COUNT "*" 100) 100 linear /dev/\$dd 0 >> /table_file
  2751.     |    COUNT=\$(expr \$COUNT + 1)
  2752.     |    done
  2753.     |    dmsetup create \$TNAME </table_file
  2754.     |    rm -f /table_file
  2755.     |    }
  2756.     |
  2757.     |/sbin/evms_activate
  2758.     |mkdir -p /mnt
  2759.     |mount -oro \$rootdev /mnt
  2760.     |FSTAB_ITEMS=\$(get_fstab_entries /mnt/etc/fstab)
  2761.     |umount /mnt
  2762.     |dmsetup remove_all
  2763.     |create_evms_save_table wrzlbrnft \$FSTAB_ITEMS
  2764.     |/sbin/evms_activate
  2765.     |dmsetup remove wrzlbrnft
  2766.     |# set the right root device if user specified a lvm root
  2767.     |if [ "\$(block_driver "\$rootdev")" = device-mapper ]; then
  2768.     |    case \$rootdev in
  2769.     |    /dev/*)
  2770.     |    mkdir -p /mnt
  2771.     |    mount -oro \$rootdev /mnt
  2772.     |    fix_evms_root_node /mnt \$rootdev
  2773.     |    remove_evms_fstab \$FSTAB_ITEMS
  2774.     |    umount /mnt
  2775.     |    ;;
  2776.     |    esac
  2777.     |fi
  2778.     EOF
  2779.     fi
  2780.  
  2781.     cat_linuxrc <<-'EOF'
  2782.     |# And now for the real thing
  2783.     |if ! udev_discover_root ; then
  2784.     |    echo "not found -- exiting to /bin/sh"
  2785.     |    cd /
  2786.     |    PATH=$PATH PS1='$ ' /bin/sh -i
  2787.     |fi
  2788.     EOF
  2789.  
  2790.     cat_linuxrc <<-'EOF'
  2791.     |if [ -z "$rootfstype" ]; then
  2792.     |    rootfstype=$(/lib/udev/vol_id -t $rootdev)
  2793.     |    [ $? -ne 0 ] && rootfstype=
  2794.     |    [ -n "$rootfstype" ] && [ "$rootfstype" = "unknown" ] && $rootfstype=
  2795.     |fi
  2796.     |
  2797.     |# check filesystem if possible
  2798.     |if [ -z "$rootfstype" ]; then
  2799.     |    echo "invalid root filesystem -- exiting to /bin/sh"
  2800.     |    cd /
  2801.     |    PATH=$PATH PS1='$ ' /bin/sh -i
  2802.     |elif [ -x /bin/fsck.${rootfstype} ]; then
  2803.     |    # fsck is unhappy without it
  2804.     |    echo "$rootdev / $rootfstype defaults 1 1" > /etc/fstab
  2805.     |    # Display progress bar if possible 
  2806.     |    fsckopts="-V -a"
  2807.     |    [ "`/sbin/showconsole`" = "/dev/tty1" ] && fsckopts="$fsckopts -C"
  2808.     |    # Check external journal for reiserfs
  2809.     |    [ "$rootfstype" = "reiserfs" -a -n "$journaldev" ] && fsckopts="-j $journaldev $fsckopts"
  2810.     |    fsck -t $rootfstype $fsckopts $rootdev
  2811.     |    # Return the fsck status
  2812.     |    ROOTFS_FSCK=$?
  2813.     |    export ROOTFS_FSCK
  2814.     |    ROOTFS_FSTYPE=$rootfstype
  2815.     |    export ROOTFS_FSTYPE
  2816.     |    if [ $ROOTFS_FSCK -gt 1 -a $ROOTFS_FSCK -lt 4 ]; then
  2817.     |        # reboot needed
  2818.     |        echo "fsck succeeded, but reboot is required."
  2819.     |        echo "Rebooting system."
  2820.     |        /bin/reboot -d -f
  2821.     |    elif [ $ROOTFS_FSCK -gt 3 ] ; then
  2822.     |        echo "fsck failed. Mounting root device read-only."
  2823.     |        read_write=
  2824.     |    else
  2825.     |        if [ "$read_only" ]; then
  2826.     |            echo "fsck succeeded. Mounting root device read-only."
  2827.     |            read_write=
  2828.     |        else
  2829.     |            echo "fsck succeeded. Mounting root device read-write."
  2830.     |            read_write=1
  2831.     |        fi
  2832.     |    fi
  2833.     |fi
  2834.     EOF
  2835.  
  2836.     cat_linuxrc <<-'EOF'
  2837.     |opt="-o ro"
  2838.     |[ -n "$read_write" ] && opt="-o rw"
  2839.     |[ "$rootfstype" = "nfs" ] && opt="${opt},nolock"
  2840.     |
  2841.     |# mount the actual root device below /root
  2842.     |echo "Mounting root $rootdev"
  2843.     |# check external journal
  2844.     |[ "$rootfstype" = "xfs" -a -n "$journaldev" ] && opt="${opt},logdev=$journaldev"
  2845.     |[ "$rootfstype" = "xfs" -a -n "$rootfsflags" ] && opt="${opt},$rootfsflags"
  2846.     |[ "$rootfstype" = "reiserfs" -a -n "$journaldev" ] && opt="${opt},jdev=$journaldev"
  2847.     |[ -n "$rootflags" ] && opt="${opt},$rootflags"
  2848.     |[ -n "$rootfstype" ] && opt="${opt} -t $rootfstype"
  2849.     |if [ -x /bin/nfsmount -a "$rootfstype" = "nfs" ]; then
  2850.     |    nfsmount $rootdev /root || die 1
  2851.     |else
  2852.     |    mount $opt $rootdev /root || die 1
  2853.     |fi
  2854.     |# Look for an init binary on the root filesystem
  2855.     |if [ -n "$init" ] ; then
  2856.     |    if [ ! -f "/root$init" ]; then
  2857.     |        init=
  2858.     |    fi
  2859.     |fi
  2860.     |
  2861.     |if [ -z "$init" ] ; then
  2862.     |    for i in /sbin/init /etc/init /bin/init /bin/sh ; do
  2863.     |        if [ ! -f "/root$i" ] ; then continue ; fi
  2864.     |        init="$i"
  2865.     |        break
  2866.     |    done
  2867.     |fi
  2868.     |
  2869.     |if [ -z "$init" ] ; then
  2870.     |    echo "No init found. Try passing init= option to the kernel."
  2871.     |    die 1
  2872.     |fi
  2873.     |
  2874.     |# Parse root mount options
  2875.     |if [ -f /root/etc/fstab ] ; then
  2876.     |    fsoptions=$(while read d m f o r; do if [ "$m" == "/" ] ; then echo $o; fi; done < /root/etc/fstab)
  2877.     |    set -- $(IFS=,; echo $fsoptions)
  2878.     |    fsoptions=
  2879.     |    while [ "$1" ] ; do
  2880.     |        case $1 in
  2881.     |        *quota) ;;
  2882.     |        defaults) ;;
  2883.     |        *)
  2884.     |            if [ "$fsoptions" ] ; then
  2885.     |                fsoptions="$fsoptions,$1"
  2886.     |            else
  2887.     |                fsoptions="$1"
  2888.     |            fi
  2889.     |            ;;
  2890.     |        esac
  2891.     |        shift
  2892.     |    done
  2893.     |    if [ "$fsoptions" ] ; then
  2894.     |        mount -o remount,$fsoptions $rootdev /root
  2895.     |    fi
  2896.     |fi
  2897.     |
  2898.     |# Create framebuffer devices
  2899.     |if [ -f /proc/fb ]; then
  2900.     |    while read fbnum fbtype; do
  2901.     |        if [ $(($fbnum < 32)) ] ; then
  2902.     |            [ -c /dev/fb$fbnum ] || mknod -m 0660 /dev/fb$fbnum c 29 $fbnum
  2903.     |        fi
  2904.     |    done < /proc/fb
  2905.     |fi
  2906.     |
  2907.     |blogd_pid=$(pidof blogd)
  2908.     |if test -n "$blogd_pid" ; then
  2909.     |    kill -IO "$blogd_pid"
  2910.     |fi
  2911.     |/bin/mount --move /dev /root/dev
  2912.     |
  2913.     |# Call vendor-specific init script
  2914.     |if [ -x /vendor_init.sh ] ; then
  2915.     |    /vendor_init.sh
  2916.     |fi
  2917.     |
  2918.     |# kill udevd, we will run the one from the real root
  2919.     |kill $(pidof udevd)
  2920.     |
  2921.     |# kill iscsid, will be restarted from the real root
  2922.     |iscsi_pid=$(pidof iscsid)
  2923.     |[ "$iscsi_pid" ] && kill -KILL $iscsi_pid
  2924.     |
  2925.     |if test -n "$blogd_pid" ; then
  2926.     |    kill -QUIT "$blogd_pid"
  2927.     |    sleep 1
  2928.     |    rm -f /var/log/boot.msg
  2929.     |    test "$devpts" = "no" || umount -t devpts /root/dev/pts
  2930.     |    devpts=no
  2931.     |fi
  2932.     |
  2933.     |# ready to leave
  2934.     |cd /root
  2935.     |umount /proc
  2936.     |umount /sys
  2937.     |
  2938.     |# Export root fs information
  2939.     |ROOTFS_BLKDEV="$rootdev"
  2940.     |export ROOTFS_BLKDEV
  2941.     |
  2942.     |exec /bin/run-init -c ./dev/console /root $init ${kernel_cmdline[@]}
  2943.     |echo could not exec run-init!
  2944.     |die 0
  2945.     EOF
  2946.  
  2947.     [ ${#features[@]} -gt 0 ] \
  2948.     && echo -e "Including:\t${features[@]}"
  2949.  
  2950.     splash_bin=
  2951.     [ -x /sbin/splash.bin ] && splash_bin=/sbin/splash.bin
  2952.     [ -x /bin/splash ] && splash_bin=/bin/splash
  2953.     splash_image=
  2954.     if [ -n "$splashsizes" -a -n "$splash_bin" ]; then
  2955.     if [ -f /etc/sysconfig/bootsplash ]; then
  2956.         . /etc/sysconfig/bootsplash
  2957.     fi
  2958.  
  2959.     themes_dir=
  2960.     if [ -d "$root_dir/etc/bootsplash/themes" ]; then
  2961.         themes_dir="$root_dir/etc/bootsplash/themes"
  2962.     elif [ -d "$root_dir/usr/share/splash/themes" ]; then
  2963.         themes_dir="$root_dir/usr/share/splash/themes"
  2964.     fi
  2965.  
  2966.     no_splash=
  2967.     case ${kernel_version##*-} in
  2968.         kdump|um|xen*)
  2969.         no_splash=1
  2970.         ;;
  2971.     esac
  2972.  
  2973.     if [ -n "$no_splash" ]; then
  2974.         echo "No bootsplash for kernel flavor ${kernel_version##*-}"
  2975.     else
  2976.         echo -ne "Bootsplash:\t"
  2977.         if [ -n "$themes_dir" ] && \
  2978.          [ -d "$themes_dir/$THEME" -o -L "$themes_dir/$THEME" ]; then
  2979.         for size in $splashsizes; do
  2980.             bootsplash_picture="$themes_dir/$THEME/images/bootsplash-$size.jpg"
  2981.             cfgname="$themes_dir/$THEME/config/bootsplash-$size.cfg"
  2982.             if [ ! -r $cfgname ] ; then
  2983.             echo "disabled for resolution $size"
  2984.             elif [ ! -r $bootsplash_picture ] ; then
  2985.             echo "no image for resolution $size"
  2986.             else
  2987.             echo -n "${splash_image:+, }$THEME ($size)"
  2988.             splash_image="$splash_image $cfgname"
  2989.             fi
  2990.         done
  2991.         echo
  2992.         else
  2993.         echo "no theme selected"
  2994.         fi
  2995.     fi
  2996.     fi
  2997.  
  2998.     # Include bootsplash image
  2999.     for image in $splash_image; do
  3000.     $splash_bin -s -f $image >> $tmp_mnt/bootsplash
  3001.     done
  3002.  
  3003.     attach_dsdt
  3004.  
  3005.     pushd . > /dev/null 2>&1
  3006.     cd $tmp_mnt
  3007.     find . ! -name "*~" | cpio -H newc --create | gzip -9 > $tmp_initrd.gz
  3008.     popd > /dev/null 2>&1
  3009.     if ! cp -f $tmp_initrd.gz $initrd_image ; then
  3010.     oops 8 "Failed to install initrd"
  3011.     fi
  3012.     rm -rf $tmp_mnt
  3013. }
  3014.  
  3015. ###################################################################
  3016.  
  3017. # working directories
  3018. tmp_initrd=$work_dir/initrd
  3019. tmp_initrd_small=${tmp_initrd}_small
  3020.  
  3021. if [ -z "$rootdev" ] ; then
  3022.   # no rootdev specified, get current root from /etc/fstab
  3023.   while read fstab_device fstab_mountpoint fstab_type fstab_options dummy ; do
  3024.     if [ "$fstab_mountpoint" = "/" ]; then
  3025.       rootdev="$fstab_device"
  3026.       rootfstype="$fstab_type"
  3027.       rootfsopts="$fstab_options"
  3028.       break
  3029.     fi
  3030.   done < <( sed -e '/^[     ]*#/d' < $root_dir/etc/fstab)
  3031. else
  3032.   # get type from /etc/fstab or /proc/mounts (actually not needed)
  3033.   x1=$(cat $root_dir/etc/fstab /proc/mounts 2>/dev/null \
  3034.        | grep -E "$rootdev[[:space:]]" | tail -n 1)
  3035.   rootfstype=$(echo $x1 | cut -f 3 -d " ")
  3036. fi
  3037.  
  3038. if [ -z "$rootdev" ] ; then
  3039.     if [ -z "$use_dhcp" ]; then
  3040.     error 1 "No '/' mountpoint specified in $root_dir/etc/fstab"
  3041.     else
  3042.     rootdev=
  3043.     rootfstype=nfs
  3044.     fi
  3045. fi
  3046.  
  3047. realrootdev="$rootdev"
  3048. case "$rootdev" in
  3049.     /dev/sd*)
  3050.     # Check for iSCSI
  3051.     sid=$(check_iscsi_root $rootdev)
  3052.     iscsi_root="$sid"
  3053.     ;;
  3054.     LABEL=*|UUID=*)
  3055.     # get real root via fsck hack
  3056.     realrootdev=$(fsck -N "$rootdev" \
  3057.               | sed -ne '2s/.* \/dev/\/dev/p' \
  3058.               | sed -e 's/  *//g')
  3059.     if [ -z "$realrootdev" ] ; then
  3060.         error 1 "Could not expand $rootdev to real device"
  3061.     fi
  3062.     realrootdev=$(/usr/bin/readlink -m $realrootdev)
  3063.     ;;
  3064.     /dev/disk/*)
  3065.     realrootdev=$(/usr/bin/readlink -m $rootdev)
  3066.     # Check for iSCSI
  3067.     sid=$(check_iscsi_root $realrootdev)
  3068.     iscsi_root="$sid"
  3069.     ;;
  3070.     *:*)
  3071.     rootdev=
  3072.     rootfstype=nfs
  3073.     ;;
  3074. esac
  3075.  
  3076. # check for journal device
  3077. if [ "$rootfsopts" -a -z "$journaldev" ] ; then
  3078.     jdev=${rootfsopts#*,jdev=}
  3079.     if [ "$jdev" != "$rootfsopts" ] ; then
  3080.     journaldev=${jdev%%,*}
  3081.     fi
  3082.     logdev=${rootfsopts#*,logdev=}
  3083.     if [ "$logdev" != "$rootfsopts" ] ; then
  3084.     journaldev=${logdev%%,*}
  3085.     fi
  3086. fi
  3087.  
  3088. # check if the root device is an lvm device
  3089. #
  3090. # Caveat: currently the dmraid support requires some programs from
  3091. # the multipath-tools package (kpartx etc). So we always have
  3092. # to select both, multipath and dmraid, for full dmraid support.
  3093. root_lvm=
  3094. root_dm=
  3095. root_lvm2=
  3096. root_evms=
  3097. root_mpath=
  3098. root_md=
  3099. root_dmraid=
  3100. if [ -n "$realrootdev" -a -b "$root_dir/${realrootdev#/}" ] ; then
  3101.     rootdevn=$(devnumber $root_dir/${realrootdev#/})
  3102.  
  3103.     [ "$(block_driver "$root_dir/${realrootdev#/}")" = lvm ] \
  3104.     && root_lvm=1
  3105.     [ "$(block_driver "$root_dir/${realrootdev#/}")" = device-mapper ] \
  3106.         && root_dm=1
  3107.     [ "$(block_driver "$root_dir/${realrootdev#/}")" = md ] \
  3108.         && root_md=1
  3109.     if [ "$root_dm" ] ; then
  3110.     major=$(devmajor $rootdevn)
  3111.     minor=$(devminor $rootdevn)
  3112.     # Check whether we are using EVMS
  3113.     if [ -x /sbin/evms ] ; then
  3114.         region=$(echo "q:r" | evms -s | grep -B 2 "Minor: $minor" | sed -n 's@Region Name: \(.\)@\1@p')
  3115.         if [ "$region" ] ; then
  3116.         volume=$(echo "q:v,r=$region" | evms -s | sed -n 's@Volume Name: \(.*\)@\1@p')
  3117.         if [ -e "$volume" ] ; then
  3118.             root_evms=1
  3119.             realrootdev=$volume
  3120.         fi
  3121.         fi
  3122.     else
  3123.         root_evms=
  3124.     fi
  3125.         # Check whether we are using LVM2
  3126.     if [ -z "$root_evms" ] && [ -x /sbin/lvs ] ; then
  3127.         vg_root=$(lvs --noheadings -o vg_name,lv_kernel_major,lv_kernel_minor 2> /dev/null | sed -n "s/ *\(.*\) *$major *$minor/\1/p")
  3128.         if [ "$vg_root" ] ; then
  3129.         root_lvm2=1
  3130.         fi
  3131.     else
  3132.         root_lvm2=
  3133.     fi
  3134.     if [ "$root_lvm2" ] ; then
  3135.         # Check for LVM2 on top of md
  3136.         md_list=
  3137.         pv_list=$(vgs --noheadings --options devices $vg_root 2> /dev/null | sed -n "s@ *\(/dev/.*\)([0-9]*) *@\1@p" | sort | uniq)
  3138.         for dev in $pv_list ; do
  3139.         case $dev in
  3140.             /dev/dm-*)
  3141.             root_dmraid=1
  3142.             root_mpath=1
  3143.             ;;
  3144.             *)
  3145.             mdconf=$(mdadm -Db $dev 2> /dev/null)
  3146.             if [ -n "$mdconf" ] ; then
  3147.                 md_dev=${dev##/dev/}
  3148.                 md_list="$md_dev $md_list"
  3149.                 eval md_conf_${md_dev}=\"$mdconf\"
  3150.             fi
  3151.             ;;
  3152.         esac
  3153.         done
  3154.         unset md_dev
  3155.         unset mdconf
  3156.     fi
  3157.     if [ -z "$root_lvm2" ] ; then
  3158.         # Check for dmraid
  3159.         dm_uuid=$(dmsetup info -c --noheadings -o uuid -j $major -m $minor)
  3160.         case $dm_uuid in
  3161.         part*)
  3162.             root_dmraid=1
  3163.             root_mpath=1
  3164.             ;;
  3165.         esac
  3166.     fi
  3167.     fi
  3168.     if [ "$root_md" ] && [ -x /sbin/mdadm ] ; then
  3169.     minor=$(devminor $rootdevn)
  3170.     # get md configuration
  3171.     mdconf=$(mdadm -Db $rootdev 2> /dev/null | sed -n "s@/dev/md[0-9]*@/dev/md$minor@p")
  3172.     if [ -n "$mdconf" ] ; then
  3173.         md_dev=${rootdev##/dev/}
  3174.         md_list="$md_dev"
  3175.         eval md_conf_${md_dev}=\"$mdconf\"
  3176.     fi
  3177.     unset minor
  3178.     unset md_dev
  3179.     unset mdconf
  3180.     else
  3181.     root_md=
  3182.     fi
  3183. fi
  3184.  
  3185. ###################################################################
  3186.  
  3187. x="$rootdev"
  3188. [ "$rootfstype" = "nfs" ] && x="nfs-root"
  3189. [ "$iscsi_root" ] && x="$(cat /sys/class/iscsi_session/$iscsi_root/targetname)"
  3190. [ "$rootdev" != "$realrootdev" ] && x="$x ($realrootdev)"
  3191. echo -e "Root device:\t$x (mounted on ${root_dir:-/} as $rootfstype)"
  3192.  
  3193. if [ -z "$modules_set" ]; then
  3194.     # get INITRD_MODULES from system configuration
  3195.     . $root_dir/etc/sysconfig/kernel
  3196.     modules="$INITRD_MODULES"
  3197. fi
  3198.  
  3199. if [ -z "$domu_modules_set" ]; then
  3200.     # get DOMU_INITRD_MODULES from system configuration
  3201.     . $root_dir/etc/sysconfig/kernel
  3202.     domu_modules="$DOMU_INITRD_MODULES"
  3203. fi
  3204.  
  3205. ###################################################################
  3206. # add modules required by features
  3207. if [ "$rootfstype" = "nfs" ] ; then
  3208.     add_module nfs
  3209. fi
  3210.  
  3211. if [ -n "$root_lvm" ] ; then
  3212.     add_module lvm-mod
  3213. fi
  3214.  
  3215. if [ -n "$root_dm" ] ; then
  3216.     add_module dm-mod
  3217.     add_module dm-snapshot
  3218.     domu_modules="$domu_modules dm-mod dm-snapshot"
  3219. fi
  3220.  
  3221. if [ -n "$md_list" ] ; then
  3222.     # load all md modules
  3223.     add_module raid0
  3224.     add_module raid1
  3225.     add_module raid5
  3226.     add_module linear
  3227.     if [ -f $root_dir/etc/mdadm.conf ] ; then
  3228.     # make sure we're overriding the default here
  3229.     md_list=
  3230.     root_md=1
  3231.     fi
  3232. fi
  3233.  
  3234. if [ -n "$root_dm" ] ; then
  3235.     # Add all dm modules
  3236.     dm_modules=$(dmsetup table | cut -f 4 -d ' ' | sort | uniq)
  3237.     for table in $dm_modules; do
  3238.     if [ "$table" ] && [ "$table" != "linear" ] && [ "$table" != "striped" ] ; then
  3239.         add_module dm-$table
  3240.     fi
  3241.     # Check for multipathing
  3242.     if [ "$table" == "multipath" ] ; then
  3243.         root_mpath=1
  3244.         add_module dm-round-robin
  3245.         add_module dm-emc
  3246.     fi
  3247.     done
  3248. fi
  3249.  
  3250. if [ -n "$iscsi_root" ] ; then
  3251.     add_module scsi_transport_iscsi
  3252.     add_module iscsi_tcp
  3253.     if [ -z "$interface" ] ; then
  3254.     ifspec=$(get_default_interface)
  3255.     interface=${ifspec%%/*}
  3256.     bootproto=${ifspec##*/}
  3257.     if [ "$bootproto" = "dhcp" ] ; then
  3258.         use_dhcp=1
  3259.     else
  3260.         use_ipconfig=1
  3261.     fi
  3262.     fi
  3263.     scan_pci_bus=
  3264. fi
  3265.  
  3266. if [ -n "$interface" ] ; then
  3267.     # Pull in network module
  3268.     if [ -d /sys/class/net/$interface/device ] ; then
  3269.     if [ -f /sys/class/net/$interface/device/modalias ] ; then
  3270.         read drvlink  < /sys/class/net/$interface/device/modalias
  3271.     elif [ -f /sys/class/net/$interface/device/driver/module ] ; then
  3272.         drvlink=$(cd /sys/class/net/$interface/device/driver; readlink module)
  3273.     else
  3274.         drvlink=$(cd /sys/class/net/$interface/device; readlink driver)
  3275.     fi
  3276.     add_module ${drvlink##*/}
  3277.     fi
  3278. fi
  3279.  
  3280. if [ -n "$use_dhcp" ]; then
  3281.     # dhcpd reqires the af_packet module, we include it here
  3282.     # in case the root FS will be mounted via NFS
  3283.     add_module af_packet
  3284. fi
  3285.  
  3286. case "$(uname -m)" in
  3287.     s390|s390x)
  3288.     # Check if zfcp or dasd modules need to be added automatically:
  3289.     if [ -d /sys/block ]; then
  3290.         # Always enable all devices, hotplug is completely garbled
  3291.         s390_enable_dasd=1
  3292.         s390_enable_zfcp=1
  3293.         # if [ "$root_evms" ]; then
  3294.         #     s390_check_evms $rootdev
  3295.         # elif [ "$root_dm" ]; then
  3296.         #     s390_check_lvm2 $rootdev
  3297.         # else
  3298.         #     s390_check_dasd $rootdev
  3299.         #     s390_check_zfcp $rootdev
  3300.         # fi
  3301.         # Activate devices
  3302.         s390_dasd_sysfs
  3303.         s390_zfcp_sysfs
  3304.     else
  3305.         echo ""
  3306.         echo "WARNING: sysfs not mounted on /sys."
  3307.         echo "Booting from zfcp will _not_ work."
  3308.         s390_dasd_proc
  3309.     fi
  3310.     ;;
  3311. esac
  3312.  
  3313. ###################################################################
  3314.  
  3315. exit_code=0
  3316.  
  3317. initrd_images=( $initrd_images )
  3318. kernel_images=( $kernel_images )
  3319.  
  3320. boot_modules="$modules"
  3321. echo -e "Module list:\t$boot_modules ($domu_modules)"
  3322. for ((i=0 ; $i<${#kernel_images[@]} ; i++)); do
  3323.     echo
  3324.     modules="$boot_modules"
  3325.     kernel_image=${kernel_images[$i]}
  3326.     [ ${kernel_image:0:1} != '/' ] \
  3327.         && kernel_image=$boot_dir/$kernel_image
  3328.  
  3329.     initrd_image=${initrd_images[$i]}
  3330.     [ ${initrd_image:0:1} != '/' ] \
  3331.         && initrd_image=$boot_dir/$initrd_image
  3332.  
  3333.     mkinitrd_kernel $kernel_image $initrd_image
  3334.  
  3335.     # If the current $kernel_image has a symlink without "-<version>" (e.g.
  3336.     # "vmlinuz") pointing to it, create an "initrd" symlink for the
  3337.     # corresponding $initrd_image.
  3338.     if [ $exit_code -eq 0 -a "$(readlink ${kernel_image%%-*})" = \
  3339.      "${kernel_image#$boot_dir/}" ]; then
  3340.     rm -f $root_dir/$boot_dir/initrd
  3341.     ln -s "${initrd_image#$boot_dir/}" $root_dir/$boot_dir/initrd
  3342.     fi
  3343.     cleanup
  3344. done
  3345.  
  3346. cleanup_finish
  3347.  
  3348. if [ -e $root_dir/etc/sysconfig/bootloader ]; then
  3349.     . $root_dir/etc/sysconfig/bootloader
  3350. fi
  3351. case $LOADER_TYPE in
  3352.   lilo)
  3353.     echo "
  3354. Run lilo now to update the boot loader configuration."
  3355.     ;;
  3356.   elilo)
  3357.     if [ -x /sbin/elilo ]; then
  3358.       /sbin/elilo
  3359.     else
  3360.       echo "
  3361. You may now have to update the elilo boot loader configuration."
  3362.     fi
  3363.     ;;
  3364.   grub)
  3365.     ;;
  3366.   *)
  3367.     if [ -f "$root_dir/etc/zipl.conf" ]; then
  3368.     echo "
  3369. initrd updated, zipl needs to update the IPL record before IPL!"
  3370.     else
  3371.     echo "
  3372. You may now have to update your boot loader configuration."
  3373.     fi
  3374.     ;;
  3375. esac
  3376.  
  3377. exit $exit_code
  3378.