diff options
Diffstat (limited to 'patches/source/mkinitrd/mkinitrd_command_generator.sh')
-rw-r--r-- | patches/source/mkinitrd/mkinitrd_command_generator.sh | 872 |
1 files changed, 872 insertions, 0 deletions
diff --git a/patches/source/mkinitrd/mkinitrd_command_generator.sh b/patches/source/mkinitrd/mkinitrd_command_generator.sh new file mode 100644 index 00000000..33d9c9de --- /dev/null +++ b/patches/source/mkinitrd/mkinitrd_command_generator.sh @@ -0,0 +1,872 @@ +#!/bin/sh +# $Id: mkinitrd_command_generator.sh,v 1.45 2011/02/17 09:27:05 eha Exp eha $ +# Copyright 2013 Patrick J. Volkerding, Sebeka, Minnesota, USA +# Copyright 2008, 2009, 2010, 2011 Eric Hameleers, Eindhoven, Netherlands +# Contact: <alien@slackware.com> +# Copyright 2008, 2009 PiterPUNK, Sao Paulo, SP, Brazil +# Contact: <piterpunk@slackware.com> +# All rights reserved. +# +# Permission to use, copy, modify, and distribute this software for +# any purpose with or without fee is hereby granted, provided that +# the above copyright notice and this permission notice appear in all +# copies. +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# ----------------------------------------------------------------------------- +# +# Create an initrd which fits the system. +# Take into account the use of LVM/LUKS/RAID. +# Find out about any hardware drivers the system may need in an initrd when +# booting from a generic lightweight kernel. +# +# ----------------------------------------------------------------------------- + +# The script's revision number will be displayed in the help text: +REV=$( echo "$Revision: 1.45 $" | cut -d' ' -f2 ) + +# Define some essential parameter values: +USING_LVM="" +USING_LUKS="" +USING_RAID="" +MLIST="" +REALDEV="" # The device that contains the LUKS volume +BASEDEV="" # Lowest level device (raw block device or RAID volume) + +FSTAB=${FSTAB:-"/etc/fstab"} # so we can test with alternate fstab files + +# These are needed by -c and -i options: +SOURCE_TREE=${SOURCE_TREE:-"/boot/initrd-tree"} +CLEAR_TREE=${CLEAR_TREE:-1} +KEYMAP=${KEYMAP:-"us"} +UDEV=${UDEV:-1} +# ARM devices need more time: +case "$( uname -m )" in + arm*) WAIT_DEFAULT=4;; + *) WAIT_DEFAULT=1;; +esac +WAIT=${WAIT:-$WAIT_DEFAULT} + +# A basic explanation of the commandline parameters: +basic_usage() { + cat <<-EOT + + *** $(basename $0) revision $REV *** + Usage: + $(basename $0) [ options ] [ kernel_filename ] + Options: + -a <"additional params"> Additional parameters to pass to mkinitrd. + -c | --conf Show a suitable mkinitrd configuration file. + -h | --help Show this help. + -i | --interactive Navigate through menus instead of using + commandline arguments. + --longhelp Show more detailed information/examples. + -k <kernelversion> Use specific kernel version. + -m <"additional mods"> Additional modules to pass to mkinitrd, + separated by colons (:). + -l | --lilo Only show lilo.conf section + (requires a kernel_filename). + -r | --run Only show 'mkinitrd' command. + EOT +} + +# More of a tutorial here: +extended_usage() { + cat <<-EOT + + This script is useful in situations where you require an initrd image + to boot your computer. + For instance, when booting a kernel that does not have support for your + storage or root filesystem built in (such as the Slackware 'generic' + kernels'). + + * When you run the script without parameters, it will examine your + running system, your current kernel version and will output an example + of a 'mkinitrd' commandline that you can use to generate an initrd + image containing enough driver support to boot the computer. + + * You can make it more specific: when you add the filename of a kernel + as parameter to the script, it will determine the kernel version from + that kernel, and also give an example of the lines that you should add + to your '/etc/lilo.conf' file. + + * If you want your initrd image to have a custom name instead of the + default '/boot/initrd.gz' you can add it as another parameter to the + script, as follows: + + $(basename $0) -a "-o /boot/custom.gz" + + The arguments to the '-a' parameter will be used as additional arguments + to the 'mkinitrd' command. + + * If you need additional modules in the initrd image, apart from what + the script determines, you can pass then to the script using the '-m' + parameter as follows: + + $(basename $0) -m "uhci-hcd:usbhid:hid_generic" + + The above example adds support for USB keyboards to the initrd - you + may need that if you have encrypted your root partition and need to + enter a passphrase using a USB keyboard. + + * Instead of copying and pasting the script's output, you can create + an initrd by directly executing the output, like in this example: + + EOT + + echo " \$($(basename $0) --run /boot/vmlinuz-generic-smp-2.6.35.11-smp)" + + cat <<-EOT + + That used the '-r' or '--run' switch to make the script only write + the 'mkinitrd' commandline to the terminal. + + * When you want to add a section for a specific kernel to + '/etc/lilo.conf' directly, use the '-l' or '--lilo' switch and use a + command like in this example: + + EOT + + echo " $(basename $0) --lilo /boot/vmlinuz-generic-smp-2.6.35.11-smp >>/etc/lilo.conf" + + cat <<-EOT + + That command will result in the following lines being added to your + '/etc/lilo.conf' file (example for my hardware): + + # Linux bootable partition config begins + # initrd created with 'mkinitrd -c -k 2.6.35.11-smp -m ata_generic:pata_amd:mbcache:jbd:ext3 -f ext3 -r /dev/hda7' + image = /boot/vmlinuz-generic-smp-2.6.35.11-smp + initrd = /boot/initrd.gz + root = /dev/hda7 + label = 2.6.35.11-smp + read-only + # Linux bootable partition config ends + + The last two examples show how easy it is to configure your computer + for the use of an initrd if you need one. The only thing left to do + afterwards is running 'lilo'. + + EOT +} + +# Find the device that holds the root partition: +get_root_device() { + if [ -e $FSTAB ]; then + RD=$(cat $FSTAB |tr '\t' ' ' |grep -v '^ *#' |tr -s ' ' |grep ' / ' |cut -f1 -d' ') + if [ "$(echo $RD | cut -f1 -d=)" = "LABEL" -o "$(echo $RD | cut -f1 -d=)" = "UUID" ]; then + DKEY=$(echo $RD | cut -f1 -d=) + # The value can be LABEL=foo or LABEL='foo' or LABEL="foo" + DVAL=$(echo $RD | cut -f2 -d= | tr -d "'\042") + RD=$(/sbin/blkid | grep -w $DKEY | grep -w $DVAL | cut -f1 -d:) + fi + else + RD=$(grep -m1 "^/dev/.*[[:blank:]]/[[:blank:]]" /proc/mounts | cut -f1 -d' ') + fi + echo $RD +} + +# Get the root fs information: +get_rootfs_type() { + if $(type blkid 1>/dev/null 2>&1) ; then + blkid -s TYPE -o value $ROOTDEV + elif $(type vol_id 1>/dev/null 2>&1) ; then + vol_id $ROOTDEV | grep ID_FS_TYPE | cut -f2 -d= + else + # As a fallback, use: + cat $FSTAB |tr '\t' ' ' |grep -v '^ *#' |tr -s ' ' |grep ' / ' |cut -f3 -d' ' + fi +} + +# Add the module(s) needed for the root filesystem: +add_rootfs_module() { + local FSMOD + FSMOD=$(/sbin/modprobe --set-version $KVER --show-depends ${ROOTFS} 2>/dev/null | while read LINE; do + echo $(basename $(echo $LINE | cut -d' ' -f2) .ko ) + done) + if [ -n "$FSMOD" ]; then + [ -n "$MLIST" ] && echo "$MLIST:$(echo $FSMOD | tr ' ' ':')" \ + || echo $FSMOD | tr ' ' ':' + fi +} + +# Determine the list of kernel modules needed to support the root device: +determine_blockdev_drivers() { + # Walk the /sys tree to find kernel modules that are + # required for our storage devices. + # Thanks to PiterPUNK for help with this code. + local MLIST + MLIST=$(for i in $(find /sys/block/*/ -name "device" -print0 | xargs -0 -i'{}' readlink -f '{}' | sort -u); do + /sbin/udevadm info --query=all --path=$i --attribute-walk | \ + sed -ne 's/^[[:blank:]]\+DRIVER[S]*=="\([^"]\+\)"$/\1/p' | \ + xargs -I@ /sbin/modprobe --set-version $KVER --show-depends @ \ + 2>/dev/null | grep -v "builtin " | \ + while read LINE ; do + echo $(basename $(echo $LINE | cut -d' ' -f2) .ko ) + done + done) + MLIST=$( echo $MLIST | tr ' ' ':' ) + echo $MLIST +} + +# Search for USB keyboards: +function add_usb_keyboard() { + local USBMOD + if cat /proc/bus/input/devices | sed -e 's/^$/\$/g' | \ + tr "\n$" " \n" | grep -q " Phys=.*usb.* .*Handlers=.*kbd.*B:"; then + USBMOD="xhci-pci:ohci-pci:ehci-pci:xhci-hcd:uhci-hcd:ehci-hcd:hid:usbhid:i2c-hid:hid_generic:hid-cherry:hid-logitech:hid-logitech-dj:hid-logitech-hidpp:hid-lenovo:hid-microsoft:hid_multitouch" + [ -n "$MLIST" ] && MLIST="$MLIST:$USBMOD" \ + || MLIST="$USBMOD" + fi + echo $MLIST +} + +# Determine what USB Host Controller is in use +function add_usb_hcd() { + local USBMOD + for i in $(ls -Ld /sys/module/*_hcd/drivers/* 2> /dev/null); do + if ls -L $i | grep -q "[0-9a-f]*:" ; then + USBMOD=$( echo $i | cut -f4 -d/ | tr "_" "-") + [ -n "$MLIST" ] && MLIST="$MLIST:$USBMOD" \ + || MLIST="$USBMOD" + fi + done + echo $MLIST +} + +# Is the root partition on a (combination of) LVM/LUKS volume? +check_luks_lvm_raid() { + if $( lvdisplay -c $ROOTDEV 1>/dev/null 2>/dev/null ); then + # Our root partition is on a LV: + USING_LVM=1 + # Search the Physical Volume of our Logical Volume: + MYVG=$( echo $(lvdisplay -c $ROOTDEV 2>/dev/null) | cut -d: -f2 ) + for LINE in $(pvdisplay -c) ; do + VG=$(echo $LINE | cut -d: -f2) + [ "$VG" = "$MYVG" ] && break + done + PV=$(echo $LINE | cut -d: -f1) + # Check if there is a LUKS device underneath: + if $( cryptsetup status $PV 1>/dev/null 2>/dev/null ) ; then + # Our root partition's LV is on a LUKS volume: + USING_LUKS=1 + REALDEV=$( cryptsetup status $PV | grep 'device: ' | tr -d ' ' | cut -d: -f2 ) + BASEDEV=$REALDEV + else + BASEDEV=$PV + fi + elif $( cryptsetup status $ROOTDEV 1>/dev/null 2>/dev/null ) ; then + # Our root device is on a LUKS volume: + USING_LUKS=1 + REALDEV=$( cryptsetup status $ROOTDEV | grep 'device: ' | tr -d ' ' | cut -d: -f2 ) + ROOTDEV=$(basename $ROOTDEV) + # Check for LVM: + for LV in $(lvdisplay -c 2>/dev/null | tr -d ' ' | cut -f1 -d:) ; do + # Note: cryptsetup shows the real device, whereas + # lvdisplay requires the /dev/<myvg>/... symlink to the real device. + if [ "$(readlink $LV)" = "$REALDEV" ]; then + REALDEV=$LV + break + fi + done + if $( lvdisplay -c $REALDEV 1>/dev/null 2>/dev/null ); then + # Our root partition's LUKS device is on a LV: + USING_LVM=1 + # Search the Physical Volume of our Logical Volume: + MYVG=$( echo $(lvdisplay -c $REALDEV 2>/dev/null) | cut -d: -f2 ) + for LINE in $(pvdisplay -c) ; do + VG=$(echo $LINE | cut -d: -f2) + [ "$VG" = "$MYVG" ] && break + done + PV=$(echo $LINE | cut -d: -f1) + BASEDEV=$PV + else + BASEDEV=$REALDEV + fi + else + BASEDEV=$ROOTDEV + fi + + # Finally, we should check if base device is + # a real block device or a RAID volume: + for MD in $(cat /proc/mdstat | grep -w active | cut -d' ' -f1) ; do + if [ "$BASEDEV" = "/dev/$MD" ]; then + USING_RAID=1 + break + fi + done +} + +# Before we start +[ -x /bin/id ] && CMD_ID="/bin/id" || CMD_ID="/usr/bin/id" +if [ "$($CMD_ID -u)" != "0" ]; then + echo "You need to be root to run $(basename $0)." + exit 1 +fi + +# Parse the commandline parameters: +while [ ! -z "$1" ]; do + case $1 in + --longhelp) + basic_usage + extended_usage + exit 0 + ;; + -a) + MKINIT_PARAMS="$2" + shift 2 + ;; + -c|--conf) + [ -n "$EMIT" ] && { echo "Do not mix incompatible parameters!"; exit 1; } + EMIT="conf" + shift + ;; + -h|--help) + basic_usage + exit 0 + ;; + -i|--interactive) + INTERACTIVE=1 + shift + ;; + -k) + KVER=$2 + shift 2 + ;; + -m) + MKINIT_MODS=$2 + shift 2 + ;; + -l|--lilo) + [ -n "$EMIT" ] && { echo "Do not mix incompatible parameters!"; exit 1; } + EMIT="lilo" + shift + ;; + -L|--fromlilo) + FROMLILO=1 + shift + ;; + -r|--run) + [ -n "$EMIT" ] && { echo "Do not mix incompatible parameters!"; exit 1; } + EMIT="run" + shift + ;; + -R|--rootdev) + ROOTDEV=$2 + shift 2 + ;; + -*) + echo "Unsupported parameter '$1'!" + exit 1 + ;; + *) # Everything else but switches (which start with '-') follows: + if [ -f $1 ]; then + KFILE=$1 + # Construction of KFILE's full filename: + KFILEPATH=$(cd $(dirname $KFILE) && pwd) + if [ -L $KFILE ]; then + KFILE=$(readlink $KFILE) + else + KFILE=$(basename $KFILE) + fi + KFILE=${KFILEPATH}/$KFILE + if [ -z "$(file $KFILE | grep -E 'Linux kernel x86 boot|x86 boot sector')" ]; then + echo "File '$KFILE' does not look like it is a kernel file!" + exit 1 + fi + else + echo "File $1 not found!" + exit 1 + fi + shift + ;; + esac +done + +# Determine what to show as output (other options may have set EMIT already) +EMIT=${EMIT:-"all"} + +# An EMIT value of 'lilo' requires a kernel filename as script parameter: +if [ "$EMIT" = "lilo" ]; then + if [ -z "$KFILE" ]; then + echo "A kernel_filename is required with the '-l|--lilo' option!" + exit 1 + fi +fi + +# Determine kernel version to use, +# and check if modules for this kernel are actually present: +if [ -z "$KVER" ]; then + if [ -n "$KFILE" ]; then + KVER="$(strings $KFILE | grep '([^ ]*@[^ ]*) #' | cut -f1 -d' ')" + else + KVER="$(uname -r)" + fi +fi +if [ ! -d /lib/modules/$KVER ]; then + echo "Modules for kernel $KVER aren't installed." + exit 1 +fi + +# Determine whether the user passed an alternate filename for the initrd: +if [ -n "$MKINIT_PARAMS" ]; then + SRCHLIST="$MKINIT_PARAMS" + for ELEM in $MKINIT_PARAMS ; do + SRCHLIST=$(echo $SRCHLIST | cut -d' ' -f2-) # cut ELEM from the list + if [ "$ELEM" = "-o" ]; then + IMGFILE=$(echo $SRCHLIST | cut -d' ' -f1) + break + fi + done +fi +IMGFILE=${IMGFILE:-"/boot/initrd.gz"} + +# Get information about the root device / root filesystem: +ROOTDEV=${ROOTDEV:-$(get_root_device)} +ROOTFS=$(get_rootfs_type) + +# Determine the list of kernel modules needed to support the root device: +MLIST=$(determine_blockdev_drivers) + +# Check if we are running in a kvm guest with virtio block device driver +# (add all virtio modules, we sort out the doubles later): +if echo $MLIST | grep -q "virtio"; then + MLIST="$MLIST:virtio:virtio_balloon:virtio_blk:virtio_ring:virtio_pci:virtio_net" +fi + +# Determine if a USB keyboard is in use and include usbhid and hid_generic +# to module list +MLIST=$(add_usb_keyboard) + +# If we use any USB module, try to determine the Host Controller +if echo $MLIST | grep -q "usb"; then + MLIST=$(add_usb_hcd) +fi + +# Check what combination of LUKS/LVM/RAID we have to support: +# This sets values for USING_LUKS, USING_LVM, USING_RAID, REALDEV and BASEDEV. +check_luks_lvm_raid + +# This is the interactive part: +if [ "$INTERACTIVE" = "1" ]; then + if [ "$FROMLILO" != "1" ]; then + dialog --stdout --title "WELCOME TO MKINITRD COMMAND GENERATOR" --msgbox "\ +The main goal of this utility is to create a good initrd to \ +fit your needs. It can detect what kernel you are running, \ +what is your root device, root filesystem, if you use encryption, \ +LVM, RAID, etc. \ +\n\n\ +Usually the probed values are OK and they will be the \ +defaults in all subsequent dialogs, but maybe you want \ +to change something. \n\ +If in doubt, leave the defaults." 0 0 + + KVER=$( ls -d1 --indicator-style=none /lib/modules/* | \ + awk -F/ -vVER=$KVER '{ + if ( VER == $NF ) { + ONOFF="on" + } else { + ONOFF="off" + } ; printf("%s \"\" %s\n",$NF,ONOFF) }' | \ + xargs dialog --stdout --title "CHOOSE KERNEL VERSION" \ + --default-item $KVER --radiolist "\ +Please, select the kernel version you want to create this initrd for." 0 0 4 ) + [ -z "$KVER" ] && exit 1 + + OLDROOTDEV=$ROOTDEV + ROOTDEV=$( dialog --stdout --title "SELECT ROOT DEVICE" --inputbox "\ +Enter your root device. Root device is the one where your '/' filesystem \ +is mounted." 0 0 "$ROOTDEV" ) + [ -z "$ROOTDEV" ] && exit 1 + + # We need to re-check our defaults in case the user changed the default + # value for ROOTDEV: + [ "$OLDROOTDEV" != "$ROOTDEV" ] && check_luks_lvm_raid + ROOTFS=$(get_rootfs_type) + + ROOTFS=$( dialog --stdout --title "SELECT ROOT FILESYSTEM" --inputbox "\ +Enter the type of your root filesystem." 0 0 "$ROOTFS" ) + [ -z "$ROOTFS" ] && exit 1 + fi + + MLIST=$(add_rootfs_module) + + LLR=$( dialog --stdout --title "LVM/LUKS/RAID" --checklist "\ +Do you use some of those in your root filesystem? \ +If this is the case, please select one or more options." 12 45 3 \ +"LVM" "Logical Volume Manager" $([ "$USING_LVM" = "1" ] && echo on || echo off) \ +"LUKS" "Linux Unified Key Setup" $([ "$USING_LUKS" = "1" ] && echo on || echo off) \ +"RAID" "Linux Software RAID" $([ "$USING_RAID" = "1" ] && echo on || echo off)) + + if [ "$?" != "0" ]; then + exit 1 + fi + + echo $LLR | grep -q LUKS && USING_LUKS="1" + echo $LLR | grep -q LVM && USING_LVM="1" + echo $LLR | grep -q RAID && USING_RAID="1" + + if [ "$USING_LUKS" = "1" ]; then + REALDEV=$( dialog --stdout --title "LUKS ROOT DEVICE" --inputbox "\ +Please, enter your LUKS root device:" 0 0 "$REALDEV" ) + [ -z "$REALDEV" ] && exit 1 + fi +fi + +# Step out of the interactive loop for a moment. The next block needs to be +# executed in all cases. + +# We need to 'undouble' the MLIST array. Some people report that walking the +# /sys tree produces duplicate modules in the list. +# The awk command elimitates doubles without changing the order: +MLIST=$( echo $MLIST | tr ':' '\n' | awk '!x[$0]++' | tr '\n' ' ' ) +MLIST=$( echo $MLIST | tr ' ' ':' ) +MLIST=$(echo ${MLIST%:}) # To weed out a trailing ':' which was reported once. + +# Back to the interactive part: + +if [ "$INTERACTIVE" = "1" ]; then + MLIST=$( dialog --stdout --title "INITRD'S MODULE LIST" --inputbox "\ +The list here shows all modules needed to support your root filesystem \ +and boot from it. But you can change the list to use some alternative \ +or additional modules. If you don't know what to do, the default is safe." \ +0 0 "$MLIST" ) + if [ "$?" != "0" ]; then + exit 1 + fi + + EXTRA=$( dialog --stdout --title "EXTRA CONFIGURATION" --checklist "\ +Now is your chance for some additional configuration. All of these \ +configurations are optional and you can stick to the defaults." 11 72 3 \ +"KEYMAP" "Select keyboard layout (default: US)" \ + $([ $USING_LUKS = 1 ] && echo on || echo off) \ +"RESUMEDEV" "Select device for 'suspend-to-disk' feature" off \ +"UDEV" "Use UDEV in the initrd for device configuration" $(test $UDEV -eq 1 && echo on || echo off) \ +"WAIT" "Add delay to allow detection of slow disks at boot" $(test $WAIT -gt $WAIT_DEFAULT && echo on || echo off) ) + if [ "$?" != "0" ]; then + exit 1 + fi + + if echo $EXTRA | grep -q KEYMAP ; then + KEYMAP=$( dialog --stdout --title "KEYBOARD LAYOUT SELECTION" \ + --cancel-label "Skip" \ + --menu "You may select one of the following keyboard layouts. \ +If you do not select a keyboard map, 'us.map' \ +(the US keyboard layout) is the default. Use the UP/DOWN \ +arrow keys and PageUp/PageDown to scroll \ +through the whole list of choices." \ +22 55 11 \ +"qwerty/us.map" "" \ +"azerty/azerty.map" "" \ +"azerty/be-latin1.map" "" \ +"azerty/fr-latin0.map" "" \ +"azerty/fr-latin1.map" "" \ +"azerty/fr-latin9.map" "" \ +"azerty/fr-old.map" "" \ +"azerty/fr-pc.map" "" \ +"azerty/fr.map" "" \ +"azerty/wangbe.map" "" \ +"azerty/wangbe2.map" "" \ +"dvorak/ANSI-dvorak.map" "" \ +"dvorak/dvorak-l.map" "" \ +"dvorak/dvorak-r.map" "" \ +"dvorak/dvorak.map" "" \ +"dvorak/no-dvorak.map" "" \ +"fgGIod/tr_f-latin5.map" "" \ +"fgGIod/trf-fgGIod.map" "" \ +"olpc/es-olpc.map" "" \ +"olpc/pt-olpc.map" "" \ +"qwerty/bg-cp1251.map" "" \ +"qwerty/bg-cp855.map" "" \ +"qwerty/bg_bds-cp1251.map" "" \ +"qwerty/bg_bds-utf8.map" "" \ +"qwerty/bg_pho-cp1251.map" "" \ +"qwerty/bg_pho-utf8.map" "" \ +"qwerty/br-abnt.map" "" \ +"qwerty/br-abnt2.map" "" \ +"qwerty/br-latin1-abnt2.map" "" \ +"qwerty/br-latin1-us.map" "" \ +"qwerty/by-cp1251.map" "" \ +"qwerty/by.map" "" \ +"qwerty/bywin-cp1251.map" "" \ +"qwerty/cf.map" "" \ +"qwerty/cz-cp1250.map" "" \ +"qwerty/cz-lat2-prog.map" "" \ +"qwerty/cz-lat2.map" "" \ +"qwerty/cz-qwerty.map" "" \ +"qwerty/defkeymap.map" "" \ +"qwerty/defkeymap_V1.0.map" "" \ +"qwerty/dk-latin1.map" "" \ +"qwerty/dk.map" "" \ +"qwerty/emacs.map" "" \ +"qwerty/emacs2.map" "" \ +"qwerty/es-cp850.map" "" \ +"qwerty/es.map" "" \ +"qwerty/et-nodeadkeys.map" "" \ +"qwerty/et.map" "" \ +"qwerty/fi-latin1.map" "" \ +"qwerty/fi-latin9.map" "" \ +"qwerty/fi-old.map" "" \ +"qwerty/fi.map" "" \ +"qwerty/gr-pc.map" "" \ +"qwerty/gr.map" "" \ +"qwerty/hu101.map" "" \ +"qwerty/il-heb.map" "" \ +"qwerty/il-phonetic.map" "" \ +"qwerty/il.map" "" \ +"qwerty/is-latin1-us.map" "" \ +"qwerty/is-latin1.map" "" \ +"qwerty/it-ibm.map" "" \ +"qwerty/it.map" "" \ +"qwerty/it2.map" "" \ +"qwerty/jp106.map" "" \ +"qwerty/kazakh.map" "" \ +"qwerty/kyrgyz.map" "" \ +"qwerty/la-latin1.map" "" \ +"qwerty/lt.baltic.map" "" \ +"qwerty/lt.l4.map" "" \ +"qwerty/lt.map" "" \ +"qwerty/mk-cp1251.map" "" \ +"qwerty/mk-utf.map" "" \ +"qwerty/mk.map" "" \ +"qwerty/mk0.map" "" \ +"qwerty/nl.map" "" \ +"qwerty/nl2.map" "" \ +"qwerty/no-latin1.map" "" \ +"qwerty/no.map" "" \ +"qwerty/pc110.map" "" \ +"qwerty/pl.map" "" \ +"qwerty/pl1.map" "" \ +"qwerty/pl2.map" "" \ +"qwerty/pl3.map" "" \ +"qwerty/pl4.map" "" \ +"qwerty/pt-latin1.map" "" \ +"qwerty/pt-latin9.map" "" \ +"qwerty/pt.map" "" \ +"qwerty/ro.map" "" \ +"qwerty/ro_std.map" "" \ +"qwerty/ru-cp1251.map" "" \ +"qwerty/ru-ms.map" "" \ +"qwerty/ru-yawerty.map" "" \ +"qwerty/ru.map" "" \ +"qwerty/ru1.map" "" \ +"qwerty/ru2.map" "" \ +"qwerty/ru3.map" "" \ +"qwerty/ru4.map" "" \ +"qwerty/ru_win.map" "" \ +"qwerty/ruwin_alt-CP1251.map" "" \ +"qwerty/ruwin_alt-KOI8-R.map" "" \ +"qwerty/ruwin_alt-UTF-8.map" "" \ +"qwerty/ruwin_cplk-CP1251.map" "" \ +"qwerty/ruwin_cplk-KOI8-R.map" "" \ +"qwerty/ruwin_cplk-UTF-8.map" "" \ +"qwerty/ruwin_ct_sh-CP1251.map" "" \ +"qwerty/ruwin_ct_sh-KOI8-R.map" "" \ +"qwerty/ruwin_ct_sh-UTF-8.map" "" \ +"qwerty/ruwin_ctrl-CP1251.map" "" \ +"qwerty/ruwin_ctrl-KOI8-R.map" "" \ +"qwerty/ruwin_ctrl-UTF-8.map" "" \ +"qwerty/se-fi-ir209.map" "" \ +"qwerty/se-fi-lat6.map" "" \ +"qwerty/se-ir209.map" "" \ +"qwerty/se-lat6.map" "" \ +"qwerty/se-latin1.map" "" \ +"qwerty/sk-prog-qwerty.map" "" \ +"qwerty/sk-qwerty.map" "" \ +"qwerty/speakup-jfw.map" "" \ +"qwerty/speakupmap.map" "" \ +"qwerty/sr-cy.map" "" \ +"qwerty/sv-latin1.map" "" \ +"qwerty/tr_q-latin5.map" "" \ +"qwerty/tralt.map" "" \ +"qwerty/trf.map" "" \ +"qwerty/trq.map" "" \ +"qwerty/ttwin_alt-UTF-8.map.gz" "" \ +"qwerty/ttwin_cplk-UTF-8.map.gz" "" \ +"qwerty/ttwin_ct_sh-UTF-8.map.gz" "" \ +"qwerty/ttwin_ctrl-UTF-8.map.gz" "" \ +"qwerty/ua-cp1251.map.gz" "" \ +"qwerty/ua-utf-ws.map" "" \ +"qwerty/ua-utf.map" "" \ +"qwerty/ua-ws.map" "" \ +"qwerty/ua.map" "" \ +"qwerty/uk.map" "" \ +"qwerty/us-acentos.map" "" \ +"qwerty/us.map" "" \ +"qwertz/croat.map" "" \ +"qwertz/cz-us-qwertz.map" "" \ +"qwertz/cz.map" "" \ +"qwertz/de-latin1-nodeadkeys.map" "" \ +"qwertz/de-latin1.map" "" \ +"qwertz/de.map" "" \ +"qwertz/de_CH-latin1.map" "" \ +"qwertz/fr_CH-latin1.map" "" \ +"qwertz/fr_CH.map" "" \ +"qwertz/hu.map" "" \ +"qwertz/sg-latin1-lk450.map" "" \ +"qwertz/sg-latin1.map" "" \ +"qwertz/sg.map" "" \ +"qwertz/sk-prog-qwertz.map" "" \ +"qwertz/sk-qwertz.map" "" \ +"qwertz/slovene.map" "" ) + [ -n "$KEYMAP" ] && KEYMAP=$(basename $KEYMAP .map) + fi + + if echo $EXTRA | grep -q UDEV ; then + UDEV=1 + fi + + if echo $EXTRA | grep -q RESUMEDEV ; then + # Print information about swap partitions: + FREERAM=$(free -k | grep "^Mem:" | tr -s ' ' | cut -d' ' -f2) + SWPINFO="" + for SWPDEV in $(grep -w swap $FSTAB | cut -d' ' -f1) ; do + SWPINFO="$SWPINFO $SWPDEV Linux swap partition $(fdisk -s $SWPDEV) KB \\n" + [ $(fdisk -s $SWPDEV) -gt $FREERAM ] && RESUMEDEV=$SWPDEV + done + FREERAM=$(free -m | grep "^Mem:" | tr -s ' ' | cut -d' ' -f2) + RESUMEDEV=$( dialog --stdout --no-collapse --title "HIBERNATE RESUME DEVICE" --inputbox "\ +When using suspend-to-disk feature (hibernate), your computer's RAM is copied \ +to a swap device when it shuts down. The kernel will resume from that RAM \ +image at boot. This means that the swap partition must not be smaller than \ +the amount of RAM you have ($FREERAM MB). \n\ +$SWPINFO \n\ +Please specify a swap partition to be used for hibernation:" \ +0 0 "$RESUMEDEV") + [ -z "$RESUMEDEV" ] && exit 1 + fi + + if echo $EXTRA | grep -q WAIT ; then + WAIT=$( dialog --stdout --title "WAIT FOR ROOT DEVICE" --inputbox "\ +Some block devices are too slow to be detected properly at boot. USB storage \ +devices and some disk arrays have this 'feature'. To make your machine \ +boot properly, you can add some delay here, to wait until all your disks are \ +probed and detected. The time is in seconds:" 0 0 "$WAIT") + [ -z "$WAIT" ] && exit 1 + fi + + IMGFILE=$( dialog --stdout --title "INITRD IMAGE NAME" --inputbox "\ +Enter your initrd image filename." 0 0 "$IMGFILE" ) + [ -z "$IMGFILE" ] && exit 1 + +else + MLIST=$(add_rootfs_module) +fi + +# Add any modules passed along on the commandline: +if [ -n "$MKINIT_MODS" ]; then + [ -n "$MLIST" ] && MLIST="$MLIST:$(echo $MKINIT_MODS | tr ' ' ':')" \ + || MLIST="$(echo $MKINIT_MODS | tr ' ' ':')" +fi + +# Constructing the mkinitrd command: +MKINIT="mkinitrd -c -k $KVER -f $ROOTFS -r $ROOTDEV" + +# If we have a module list, add them: +if ! [ -z "$MLIST" -o "$MLIST" = ":" ]; then + MKINIT="$MKINIT -m $MLIST" +fi + +# Deal with LUKS/LVM/RAID: +if [ "$USING_LUKS" = "1" ]; then + MKINIT="$MKINIT -C $REALDEV" +fi +if [ "$USING_LVM" = "1" ]; then + MKINIT="$MKINIT -L" +fi +if [ "$USING_RAID" = "1" ]; then + MKINIT="$MKINIT -R" +fi + +if [ -n "$RESUMEDEV" ]; then + # Add hibernation partition: + MKINIT="$MKINIT -h $RESUMEDEV" +fi +if [ -n "$KEYMAP" -a "$KEYMAP" != "us" ]; then + # Add non-us keyboard mapping: + MKINIT="$MKINIT -l $KEYMAP" +fi +if [ $UDEV -eq 1 ]; then + # Add UDEV support: + MKINIT="$MKINIT -u" +fi +if [ -n "$WAIT" -a $WAIT -ne $WAIT_DEFAULT ]; then + # Add non-default wait time: + MKINIT="$MKINIT -w $WAIT" +fi +if ! echo "$MKINIT_PARAMS" | grep -q -- '-o ' ; then + # Add default output filename: + MKINIT="$MKINIT -o $IMGFILE" +fi +if [ -n "$MKINIT_PARAMS" ]; then + # Add user-supplied additional parameters: + MKINIT="$MKINIT $MKINIT_PARAMS" +fi + +# Notify the user: +if [ "$EMIT" = "all" ]; then + cat <<-EOT + # + # $(basename $0) revision $REV + # + # This script will now make a recommendation about the command to use + # in case you require an initrd image to boot a kernel that does not + # have support for your storage or root filesystem built in + # (such as the Slackware 'generic' kernels'). + # A suitable 'mkinitrd' command will be: + + $MKINIT + EOT +elif [ "$EMIT" = "run" ]; then + echo "$MKINIT" +elif [ "$EMIT" = "conf" ]; then + cat <<-EOT + SOURCE_TREE="$SOURCE_TREE" + CLEAR_TREE="$CLEAR_TREE" + OUTPUT_IMAGE="$IMGFILE" + KERNEL_VERSION="$KVER" + KEYMAP="$KEYMAP" + MODULE_LIST="$(echo $MLIST | cut -f2 -d\ )" + LUKSDEV="$REALDEV" + ROOTDEV="$ROOTDEV" + ROOTFS="$ROOTFS" + RESUMEDEV="$RESUMEDEV" + RAID="$USING_RAID" + LVM="$USING_LVM" + UDEV="$UDEV" + WAIT="$WAIT" + EOT +fi + +if [ -n "$KFILE" ]; then + if [ "$EMIT" = "all" ]; then + cat <<-EOT + # An entry in 'etc/lilo.conf' for kernel '$KFILE' would look like this: + EOT + fi + if [ "$EMIT" = "all" -o "$EMIT" = "lilo" ]; then + # Compensate for the syntax used for the LUKS-on-LVM case: + [ "$(basename $ROOTDEV)" = "$ROOTDEV" ] && BASE="/dev/mapper/" || BASE="" + cat <<-EOT + # Linux bootable partition config begins + # initrd created with '$MKINIT' + image = $KFILE + initrd = $IMGFILE + root = $BASE$ROOTDEV + label = $KVER + read-only + # Linux bootable partition config ends + EOT + fi +fi |