diff options
author | Chris Gianelloni <wolf31o2@gentoo.org> | 2008-07-28 15:05:51 -0700 |
---|---|---|
committer | Chris Gianelloni <wolf31o2@gentoo.org> | 2008-07-28 15:05:51 -0700 |
commit | 1ffb37f09c7ad077f9d9863ced18d64eeef7520b (patch) | |
tree | 84ee8078672ce860fea488445259773d75ecdbd5 /defaults/initrd.scripts | |
parent | Added the modules directory, which will be used to store the built-in modules... (diff) | |
download | genkernel-1ffb37f09c7ad077f9d9863ced18d64eeef7520b.tar.gz genkernel-1ffb37f09c7ad077f9d9863ced18d64eeef7520b.tar.bz2 genkernel-1ffb37f09c7ad077f9d9863ced18d64eeef7520b.zip |
Moving files from generic to defaults, since they are the defaults used globally.
Diffstat (limited to 'defaults/initrd.scripts')
-rw-r--r-- | defaults/initrd.scripts | 966 |
1 files changed, 966 insertions, 0 deletions
diff --git a/defaults/initrd.scripts b/defaults/initrd.scripts new file mode 100644 index 00000000..7e42be9b --- /dev/null +++ b/defaults/initrd.scripts @@ -0,0 +1,966 @@ +#!/bin/ash + +. /etc/initrd.defaults + +backup() { + echo -ne "\033[0G\033[0K" +} + +strlen() { + if [ -z "$1" ] + then + echo "usage: strlen <variable_name>" + die + fi + eval echo "\${#${1}}" +} + +parse_opt() { + case "$1" in + *\=*) + local key_name="`echo "$1" | cut -f1 -d=`" + local key_len=`strlen key_name` + local value_start=$((key_len+2)) + echo "$1" | cut -c ${value_start}- + ;; + esac +} + +modules_load() { + for module in $* + do + echo ${module} >> /etc/modules/extra_load + done + + modules_scan extra_load +} + +modules_scan() { + local MODS + [ -d "/etc/modules/${1}" ] || touch /etc/modules/${1} + + [ -f "/etc/modules/${1}" ] && MODS=`cat /etc/modules/${1}` + for x in ${MODS} + do + MLOAD=`echo ${MLIST} | sed -e "s/.*${x}.*/${x}/"` + if [ "${MLOAD}" = "${x}" ] # Only module to no-load + then + echo -e "${BOLD} ::${NORMAL} Skipping ${x}..." + elif [ "${MLOAD}" = "${MLIST}" ] # == No change == No specified no-load + then + [ -n "${DEBUG}" ] && echo -ne "${BOLD} ::${NORMAL} Checking for ${x}..." + # find -name does not work since the return status is always zero + if find /lib/modules/${KV} | grep /"${x}${KSUFF}" >/dev/null 2>&1 + then + echo -ne "${BOLD} ::${NORMAL} Scanning for ${x}..." + modprobe ${x} -n + backup + echo -ne "${NORMAL}" + fi + else + echo -e "${BOLD} ::${NORMAL} Skipping ${x}..." + fi + done +} + +uppercase(){ + # needs tr on busybox + echo $1 | tr 'a-z' 'A-Z' +} + + +findmediamount() { + # $1 = mount dir name / media name + # $2 = recognition file + # $3 = variable to have the device path + # $4 = directory before /mnt, like NEW_ROOT + # args remaining are possible devices + + local media=$1 recon=$2 vrbl=$3 + local mntdir="${4}/mnt/${media}" + shift 4 + + good_msg "Looking for the ${media}" ${CRYPT_SILENT} + + if [ "$#" -gt "0" ] + then + + [ ! -d "${mntdir}" ] && mkdir -p ${mntdir} 2>/dev/null >/dev/null + + for x in $* + do + # Check for a block device to mount + if [ -b "${x}" ] + then + skip=0 + bsn=`basename "${x}"` + # + # If disk and it has at least one partition, skip. + # We use /sys/block/${bsn}/${bsn}[0-9]* to make sure that we + # don't skip device mapper devices. Even the craziest scenario + # deserves a fair chance. + # + for part in `ls /sys/block/${bsn}/${bsn}[0-9]* 2>/dev/null` + do + skip=1 + break; + done + if [ ${skip} -eq 1 ] + then + continue + fi + good_msg "Attempting to mount media:- ${x}" ${CRYPT_SILENT} + +# if [ "${media}" = "cdrom" ]; then +# mount -r -t iso9660 ${x} ${mntdir} &>/dev/null +# else +# mount -r -t auto ${x} ${mntdir} &>/dev/null +# fi + mount -r -t ${CDROOT_TYPE} ${x} ${mntdir} >/dev/null 2>&1 + if [ "$?" = '0' ] + then + # Check for the media + if [ -f "${mntdir}/${recon}" ] + then + #set REAL_ROOT, CRYPT_ROOT_KEYDEV or whatever ${vrbl} is + eval ${vrbl}'='"${x}" + good_msg "Media found on ${x}" ${CRYPT_SILENT} + break + else + umount ${mntdir} + fi + fi + fi + done + fi + + eval local result='$'${vrbl} + + [ -n "${result}" ] || bad_msg "Media not found" ${CRYPT_SILENT} +} + +devicelist(){ + # Locate the cdrom device with our media on it. + # CDROM DEVICES + local DEVICES="/dev/cdroms/* /dev/ide/cd/* /dev/sr*" + # USB Keychain/Storage + DEVICES="$DEVICES /dev/sd*" + # IDE devices + DEVICES="$DEVICES /dev/hd*" + # USB using the USB Block Driver + DEVICES="$DEVICES /dev/ubd* /dev/ubd/*" + # iSeries devices + DEVICES="$DEVICES /dev/iseries/vcd*" + echo ${DEVICES} +} + +bootstrapCD() { + local DEVICES=`devicelist` + # The device was specified on the command line, so there's no need to scan + # a bunch of extra devices + [ -n "${CDROOT_DEV}" ] && DEVICES="${CDROOT_DEV}" + + findmediamount "cdrom" "${SUBDIR}/livecd" "REAL_ROOT" "${NEW_ROOT}" ${DEVICES} +} + +bootstrapKey() { + # $1 = ROOT/SWAP + local KEYDEVS=`devicelist` + eval local keyloc='"${CRYPT_'${1}'_KEY}"' + + findmediamount "key" "${keyloc}" "CRYPT_${1}_KEYDEV" "" ${KEYDEVS} +} + +cache_cd_contents() { + # Check loop file exists and cache to ramdisk if DO_cache is enabled + if [ "${LOOPTYPE}" != "noloop" ] && [ "${LOOPTYPE}" != "sgimips" ] + then + check_loop + if [ "${DO_cache}" ] + then + # TODO: Check the size of the image versus the size of our tmpfs + # along with the amount of available RAM and increase tmpfs size + # if necessary. (Not having awk sucks...) + # z=0 + # for i in $(cat /proc/meminfo | grep -e ^MemFree -e ^Cached | \ + # cut -d: -f2 | cut -dk -f1 | sed -e "s/^\s*//") ; do + # z=$(($z + $i)) ; done + # echo $z + good_msg "Copying loop file for caching..." + cp -a ${NEW_ROOT}/mnt/cdrom/${LOOP} ${NEW_ROOT}/mnt/${LOOP} + if [ $? -ne 0 ] + then + bad_msg "Failed to cache the loop file! Lack of space?" + rm -rf ${NEW_ROOT}/mnt/livecd.* 2>/dev/null + rm -rf ${NEW_ROOT}/mnt/image.* 2>/dev/null + rm -rf ${NEW_ROOT}/mnt/zisofs 2>/dev/null + else + LOOPEXT='../' + fi + fi + fi +} + +mount_sysfs() { + if [ "${KV_2_6_OR_GREATER}" ] + then + mount -t sysfs /sys /sys >/dev/null 2>&1 + ret=$? + [ "$ret" -eq '0' ] || bad_msg "Failed to mount /sys!" + fi +} + +findnfsmount() { + if [ "${IP}" != '' ] || busybox udhcpc -n -T 15 -q -s /bin/udhcpc.scripts + then + [ -e /rootpath ] && NFSROOT=`cat /rootpath` + + if [ "${NFSROOT}" = '' ] + then + # Obtain NFSIP + OPTIONS=`busybox dmesg | grep rootserver | sed -e "s/,/ /g"` + for OPTION in $OPTIONS + do + if [ `echo $OPTION | sed -e "s/=/ /g" | cut -d " " -f 1` = 'rootserver' ] + then + NFSIP=`echo $OPTION | sed -e "s/=/ /g" | cut -d " " -f 2` + fi + done + + # Obtain NFSPATH + OPTIONS=`busybox dmesg | grep rootpath | sed -e "s/,/ /g"` + for OPTION in $OPTIONS + do + if [ `echo $OPTION | sed -e "s/=/ /g" | cut -d " " -f 1` = 'rootpath' ] + then + NFSPATH=`echo $OPTION | sed -e "s/=/ /g" | cut -d " " -f 2` + fi + done + + # Setup NFSROOT + if [ "${NFSIP}" != '' ] && [ "$NFSPATH" != '' ] + then + NFSROOT="${NFSIP}:${NFSPATH}" + else + bad_msg "The DHCP Server did not send a valid root-path." + bad_msg "Please check your DHCP setup, or provide a nfsroot=<...> parameter." + fi + fi + + if [ "${NFSROOT}" != '' ] + then + if [ "${CDROOT}" != '0' ] + then + good_msg "Attempting to mount NFS CD image on ${NFSROOT}" + mount -t nfs -o ro,nolock,rsize=1024,wsize=1024 ${NFSROOT} ${NEW_ROOT}/mnt/cdrom + if [ "$?" = '0' ] + then + REAL_ROOT="/dev/nfs" + else + bad_msg "NFS Mounting failed. Is the path corrent ?" + fi + else + good_msg "Attempting to mount NFS root on ${NFSROOT}" + mount -t nfs -o ro,nolock,rsize=1024,wsize=1024 ${NFSROOT} ${NEW_ROOT} + if [ "$?" = '0' ] + then + REAL_ROOT="/dev/nfs" + else + bad_msg "NFS Mounting failed. Is the path correct ?" + fi + # FIXME: Need to start portmap and the other rpc daemons in + # order to remount rw. + fi + + fi + fi +} + +check_loop() { + if [ "${LOOP}" = '' -o ! -e "mnt/cdrom/${LOOP}" ] + then + + bad_msg "Invalid loop location: ${LOOP}" + bad_msg 'Please export LOOP with a valid location, or reboot and pass a proper loop=...' + bad_msg 'kernel command line!' + + run_shell + fi +} + +run_shell() { + /bin/ash +} + +runmdev() { + # busybox udev replacement + mdev -s +} + +test_success() { + retcode=$? + # If last command failed send error message and fall back to a shell + if [ "$retcode" != '0' ] + then + error_string=$1 + error_string="${error_string:-run command}" + bad_msg 'Failed to $1; failing back to the shell...' + run_shell + fi +} + + +# msg functions arguments +# $1 string +# $2 hide flag + +good_msg() { + msg_string=$1 + msg_string="${msg_string:-...}" + [ "$2" != 1 ] && echo -e "${GOOD}>>${NORMAL}${BOLD} ${msg_string} ${NORMAL}" +} + +bad_msg() { + msg_string=$1 + msg_string="${msg_string:-...}" + if [ "$2" != 1 ] + then + splash 'verbose' > /dev/null & + echo -e "${BAD}!!${NORMAL}${BOLD} ${msg_string} ${NORMAL}" + fi +} + +warn_msg() { + msg_string=$1 + msg_string="${msg_string:-...}" + [ "$2" != 1 ] && echo -e "${WARN}**${NORMAL}${BOLD} ${msg_string} ${NORMAL}" +} + +crypt_filter() { + if [ ${CRYPT_SILENT} -eq 1 ] + then + eval $1 >/dev/null 2>/dev/null + else + eval $1 + fi +} + +whereis(){ + # $1 = variable whose value is the path (examples: "REAL_ROOT", + # "LUKS_KEYDEV") + # $2 = label + # $3 = optional explanations for failure + + eval local oldvalue='$'${1} + + [ \( $# != 2 \) -a \( $# != 3 \) ] && \ + bad_msg "Bad invocation of function whereis, please file a bug \ + report with this message" && exit 1 + [ -n "${3}" ] && local explnt=" or : ${3}" || local explnt="." + + bad_msg "Could not find the ${2} in ${oldvalue}${explnt}" + echo ' Please specify another value or: press Enter for the same, type "shell" for a shell, or "q" to skip...' + echo -n "${2}(${oldvalue}) :: " + read ${1} + case `eval echo '$'${1}` in + 'q') + eval ${1}'='${oldvalue} + warn_msg "Skipping step, this will likely cause a boot failure." + break + ;; + 'shell') + eval ${1}'='${oldvalue} + echo "To leave and try again just press <Ctrl>+D" + run_shell + ;; + '') + eval ${1}'='${oldvalue} + ;; + esac +} + +bind_mount_dev() { + # bind-mount /dev/ so that loop devices can be found + mount -o bind ${NEW_ROOT}/dev /dev +} + +setup_hotplug() { + if [ "${KV_2_6_OR_GREATER}" ] + then + echo /sbin/mdev > /proc/sys/kernel/hotplug + fi +} + +check_slowusb() { + [ "${DO_slowusb}" ] || \ + for dir in /sys/bus/usb/drivers/usb-storage/* + do + [ -d "${dir}" ] && FORCE_slowusb="1" + done +} + +start_dev_mgr() { + if [ "${KV_2_6_OR_GREATER}" ] + then + cd /sys + [ "${DO_slowusb}" ] && sdelay + check_slowusb + [ "${FORCE_slowusb}" ] && sdelay + good_msg 'Activating mdev' + runmdev + [ "${DO_slowusb}" ] || \ + [ "${FORCE_slowusb}" ] && sdelay + cd / + fi +} + +cmdline_hwopts() { + # Scan CMDLINE for any "doscsi" or "noscsi"-type arguments + local FOUND + local TMP_HWOPTS + + for x in $HWOPTS + do + for y in $CMDLINE + do + if [ "${y}" = "do${x}" ] + then + MY_HWOPTS="${MY_HWOPTS} $x" + elif [ "${y}" = "no${x}" ] + then + MY_HWOPTS="`echo ${MY_HWOPTS} | sed -e \"s/${x}//g\" -`" + fi + if [ "$(echo ${y} | cut -b -7)" = "keymap=" ] + then + MY_HWOPTS="${MY_HWOPTS} dokeymap" + fi + done + done + + # Shouldnt need to sort this as the following loop should figure out the + # duplicates and strip them out + #MY_HWOPTS=`echo ${MY_HWOPTS}| sort` + + for x in ${MY_HWOPTS} + do + FOUND=0 + for y in ${TMP_HWOPTS} + do + if [ "${y}" = "${x}" ] + then + continue 2 + fi + done + TMP_HWOPTS="${TMP_HWOPTS} ${x}" + eval DO_`echo ${x} | sed 's/-//'`=1 + done + + MY_HWOPTS=${TMP_HWOPTS} +} + +load_modules() { + # Load modules listed in MY_HWOPTS if /lib/modules exists for the running + # kernel version + if [ -d "/lib/modules/${KV}" ] + then + good_msg 'Loading modules' + # Load appropriate kernel modules + for modules in $MY_HWOPTS + do + modules_scan $modules + done + else + good_msg 'Skipping module load; no modules in the initrd!' + fi +} + +detect_sbp2_devices() { + # http://www.linux1394.org/sbp2.php + + # /proc + # /proc/scsi/sbp2/0, /proc/scsi/sbp2/1, etc. + # + # You may manually add/remove SBP-2 devices via the procfs with: + # add-single-device <h> <b> <t> <l> or remove-single-device <h> <b> <t> <l>, + # where: + # + # <h> = host (starting at zero for first SCSI adapter) + # <b> = bus (normally zero) + # <t> = target (starting at zero for first SBP-2 device) + # <l> - lun (normally zero) + # e.g. To manually add/detect a new SBP-2 device + # echo "scsi add-single-device 0 0 0 0" > /proc/scsi/scsi + # e.g. To manually remove a SBP-2 device after it's been unplugged + # echo "scsi remove-single-device 0 0 0 0" > /proc/scsi/scsi + # e.g. To check to see which SBP-2/SCSI devices are currently registered + # cat /proc/scsi/scsi + + [ -e /proc/scsi/scsi ] && echo 'scsi add-single-device 0 0 0 0' > /proc/scsi/scsi +} + +setup_keymap() { + if [ "${DO_keymap}" ] + then + if [ ! -e /dev/vc/0 -a ! -e /dev/tty0 ] + then + DEVBIND=1 + mount -o bind ${NEW_ROOT}/dev /dev + fi + [ ! -e /dev/tty0 ] && ln -s /dev/tty1 /dev/tty0 + + [ -f /lib/keymaps/keymapList ] && chooseKeymap + + [ "${DEVBIND}" = '1' ] && umount /dev + + if [ -e /etc/sysconfig/keyboard -a "${CDROOT}" -eq '1' ] + then + mkdir -p ${NEW_ROOT}/etc/sysconfig/ + cp /etc/sysconfig/keyboard ${NEW_ROOT}/etc/sysconfig/keyboard + fi + fi +} + +chooseKeymap() { + good_msg "Loading keymaps" + if [ -z "${keymap}" ] + then + cat /lib/keymaps/keymapList + read -t 10 -p '<< Load keymap (Enter for default): ' keymap + case ${keymap} in + 1|azerty) keymap=azerty ;; + 2|be) keymap=be ;; + 3|bg) keymap=bg ;; + 4|br-a) keymap=br-a ;; + 5|br-l) keymap=br-l ;; + 6|by) keymap=by ;; + 7|cf) keymap=cf ;; + 8|croat) keymap=croat ;; + 9|cz) keymap=cz ;; + 10|de) keymap=de ;; + 11|dk) keymap=dk ;; + 12|dvorak) keymap=dvorak ;; + 13|es) keymap=es ;; + 14|et) keymap=et ;; + 15|fi) keymap=fi ;; + 16|fr) keymap=fr ;; + 17|gr) keymap=gr ;; + 18|hu) keymap=hu ;; + 19|il) keymap=il ;; + 20|is) keymap=is ;; + 21|it) keymap=it ;; + 22|jp) keymap=jp ;; + 23|la) keymap=la ;; + 24|lt) keymap=lt ;; + 25|mk) keymap=mk ;; + 26|nl) keymap=nl ;; + 27|no) keymap=no ;; + 28|pl) keymap=pl ;; + 29|pt) keymap=pt ;; + 30|ro) keymap=ro ;; + 31|ru) keymap=ru ;; + 32|se) keymap=se ;; + 33|sg) keymap=sg ;; + 34|sk-y) keymap=sk-y ;; + 35|sk-z) keymap=sk-z ;; + 36|slovene) keymap=slovene ;; + 37|trf) keymap=trf ;; + 38|trq) keymap=trq ;; + 39|ua) keymap=ua ;; + 40|uk) keymap=uk ;; + 41|us) keymap=us ;; + 42|wangbe) keymap=wangbe ;; + esac + fi + if [ -e /lib/keymaps/${keymap}.map ] + then + good_msg "Loading the ''${keymap}'' keymap" + loadkmap < /lib/keymaps/${keymap}.map +# xkeymap=${keymap} +# echo ${keymap} | egrep -e "[0-9]+" >/dev/null 2>&1 +# if [ "$?" -eq '0' ] +# then +# xkeymap=`tail -n 7 /lib/keymaps/keymapList | grep ${keymap} | sed -r "s/.*\s+${keymap}\s+([a-z-]+).*/\1/g" | egrep -v 1` +# fi + mkdir -p /etc/sysconfig +# echo "XKEYBOARD=${xkeymap}" > /etc/sysconfig/keyboard + echo "XKEYBOARD=${keymap}" > /etc/sysconfig/keyboard + elif [ -z "${keymap}" ] + then + echo + good_msg "Keeping default keymap" + else + bad_msg "Sorry, but keymap ''${keymap}'' is invalid!" + unset keymap + chooseKeymap + fi +} + +startVolumes() { + #good_msg 'Checking if volumes need to be started...' + + # Here, we check for /dev/device-mapper, and if it exists, we setup a + # a symlink, which should hopefully fix bug #142775 and bug #147015 + if [ -e /dev/device-mapper ] && [ ! -e /dev/mapper/control ] + then + mkdir -p /dev/mapper + ln -sf /dev/device-mapper /dev/mapper/control + fi + + if [ "${USE_MDADM}" -eq '1' ] + then + if [ ! -e '/etc/mdadm.conf' ] + then + /sbin/mdadm --examine > /etc/mdadm.conf + fi + /sbin/mdadm --assemble + fi + + if [ "${USE_DMRAID_NORMAL}" = '1' ] + then + if [ -e '/sbin/dmraid' ] + then + good_msg "Activating Device-Mapper RAID(s)" + if [ '${DMRAID_OPTS}' = '' ] + then + /sbin/dmraid -ay + else + /sbin/dmraid -ay ${DMRAID_OPTS} + fi + fi + fi + + if [ "${USE_LVM_NORMAL}" = '1' ] + then + if [ -e '/bin/vgscan' -a -e '/bin/vgchange' ] + then + for dev in ${RAID_DEVICES} + do + setup_md_device "${dev}" + done + + good_msg "Scanning for Volume Groups" + /bin/vgscan --ignorelockingfailure --mknodes 2>/dev/null + sleep 2 + good_msg "Activating Volume Groups" + /bin/vgchange -ay --ignorelockingfailure 2>/dev/null + + # Disable EVMS since lvm is activated and they dont work together. + if [ "${USE_EVMS_NORMAL}" = '1' ] + then + bad_msg "Disabling EVMS Support because LVM started" + bad_msg "Do not add dolvm to the cmdline if this is not what you want" + bad_msg "LVM and EVMS do not work well together" + USE_EVMS_NORMAL=0 + fi + else + bad_msg "vgscan or vgchange not found: skipping LVM volume group activation!" + fi + fi + + if [ "${USE_EVMS_NORMAL}" = '1' ] + then + if [ -e '/sbin/evms_activate' ] + then + good_msg "Activating EVMS" + evms_activate + fi + fi +} + +# Open a LUKS device +# It is either the root or a swap, other devices are supported in the scripts provided with sys-fs/cryptsetup-luks +# $1 - root/swap +openLUKS() { + # please use 'tr' and this line, or remove it + # eval local TYPE=`uppercase $1` + + case $1 in + root) + local TYPE=ROOT + ;; + swap) + local TYPE=SWAP + ;; + esac + + eval local LUKS_DEVICE='"${CRYPT_'${TYPE}'}"' LUKS_NAME="$1" LUKS_KEY='"${CRYPT_'${TYPE}'_KEY}"' LUKS_KEYDEV='"${CRYPT_'${TYPE}'_KEYDEV}"' + local DEV_ERROR=0 KEY_ERROR=0 KEYDEV_ERROR=0 + local mntkey="/mnt/key/" cryptsetup_options='' + + [ ! -e /sbin/cryptsetup ] && bad_msg "The initrd does not support LUKS" && exit 1 + while [ 1 ] + do + # if crypt_silent=1 and some error occurs, enter shell quietly + if [ \( ${CRYPT_SILENT} -eq 1 \) -a \( \( \( ${DEV_ERROR} -eq 1 \) -o \( ${KEY_ERROR} -eq 1 \) \) -o \( ${KEYDEV_ERROR} -eq 1 \) \) ] + then + run_shell + elif [ ${DEV_ERROR} -eq 1 ] + then + whereis "LUKS_DEVICE" "${LUKS_NAME}" + DEV_ERROR=0 + elif [ ${KEY_ERROR} -eq 1 ] + then + whereis "LUKS_KEY" "${LUKS_NAME} key" + KEY_ERROR=0 + elif [ ${KEYDEV_ERROR} -eq 1 ] + then + whereis "LUKS_KEYDEV" "${LUKS_NAME} key device" + KEYDEV_ERROR=0 + else + setup_md_device ${LUKS_DEVICE} + cryptsetup isLuks ${LUKS_DEVICE} + if [ ! "$?" -eq '0' ] + then + bad_msg "The LUKS device ${LUKS_DEVICE} does not contain a LUKS header" ${CRYPT_SILENT} + DEV_ERROR=1 + continue + else + # Handle keys + if [ -n "${LUKS_KEY}" ] + then + if [ ! -e "${mntkey}${LUKS_KEY}" ] + then + if [ -b "${LUKS_KEYDEV}" ] + then good_msg "Using key device ${LUKS_KEYDEV}." ${CRYPT_SILENT} + else + good_msg "Please insert removable device ${LUKS_KEYDEV} for ${LUKS_NAME}" ${CRYPT_SILENT} + # abort after 10 secs + local count=10 + while [ ${count} -gt 0 ] + do + count=$((count-1)) + sleep 1 + if [ -b "${LUKS_KEYDEV}" ] + then + good_msg "Removable device ${LUKS_KEYDEV} detected." ${CRYPT_SILENT} + break + fi + done + if [ ! -b "${LUKS_KEYDEV}" ] + then + eval CRYPT_${TYPE}_KEY=${LUKS_KEY} + bootstrapKey ${TYPE} + eval LUKS_KEYDEV='"${CRYPT_'${TYPE}'_KEYDEV}"' + if [ ! -b "${LUKS_KEYDEV}" ]; then + KEYDEV_ERROR=1 + bad_msg "Removable device ${LUKS_KEYDEV} not found." ${CRYPT_SILENT} + continue + fi + # continue otherwise will mount keydev which is mounted by bootstrap + continue + fi + fi + # At this point a device was recognized, now let's see if the key is there + [ ! -d "$mntkey" ] && mkdir -p ${mntkey} 2>/dev/null >/dev/null + + mount -n -o ro ${LUKS_KEYDEV} ${mntkey} >/dev/null 2>/dev/null + if [ "$?" != '0' ] + then + KEYDEV_ERROR=1 + bad_msg "Mounting of device ${LUKS_KEYDEV} failed." ${CRYPT_SILENT} + continue + else + good_msg "Removable device ${LUKS_KEYDEV} mounted." ${CRYPT_SILENT} + sleep 2 + # keyfile exists? + if [ ! -e "${mntkey}${LUKS_KEY}" ]; then + umount -n ${mntkey} 2>/dev/null >/dev/null + KEY_ERROR=1 + KEYDEV_ERROR=1 + bad_msg "Key {LUKS_KEY} on device ${LUKS_KEYDEV} not found." ${CRYPT_SILENT} + continue + fi + fi + fi + # At this point a candidate key exists (either mounted before or not) + good_msg "${LUKS_KEY} on device ${LUKS_KEYDEV} found" ${CRYPT_SILENT} + cryptsetup_options="-d ${mntkey}${LUKS_KEY}" + fi + # At this point, keyfile or not, we're ready! + crypt_filter "cryptsetup ${cryptsetup_options} luksOpen ${LUKS_DEVICE} ${LUKS_NAME}" + if [ $? -eq 0 ] + then + good_msg "LUKS device ${LUKS_DEVICE} opened" ${CRYPT_SILENT} + break + else + bad_msg "Failed to open LUKS device ${LUKS_DEVICE}" ${CRYPT_SILENT} + DEV_ERROR=1 + KEY_ERROR=1 + KEYDEV_ERROR=1 + fi + fi + fi + done + umount ${mntkey} 2>/dev/null >/dev/null + rmdir -p ${mntkey} 2>/dev/null >/dev/null +} + +startLUKS() { + + # if key is set but key device isn't, find it + + [ -n "${CRYPT_ROOT_KEY}" ] && [ -z "${CRYPT_ROOT_KEYDEV}" ] \ + && sleep 6 && bootstrapKey "ROOT" + + if [ -n "${CRYPT_ROOT}" ]; then + openLUKS "root" + if [ -n "${REAL_ROOT}" ] + then + # Rescan volumes + startVolumes + else + REAL_ROOT="/dev/mapper/root" + fi + fi + + # same for swap, but no need to sleep if root was unencrypted + [ -n "${CRYPT_SWAP_KEY}" ] && [ -z "${CRYPT_SWAP_KEYDEV}" ] \ + && { [ -z "${CRYPT_ROOT}" ] && sleep 6; bootstrapKey "SWAP"; } + + if [ -n "${CRYPT_SWAP}" ]; then + openLUKS "swap" + if [ -z "${REAL_RESUME}" ] + then + # Resume from swap as default + REAL_RESUME="/dev/mapper/swap" + fi + fi +} + +sdelay() { + # Sleep a specific number of seconds if SDELAY is set otherwise only sleep + # 1 second + if [ -n "${SDELAY}" ] + then + sleep ${SDELAY} + else + sleep 1 + fi +} + +quiet_kmsg() { + # if QUIET is set make the kernel less chatty + [ -n "$QUIET" ] && echo '0' > /proc/sys/kernel/printk +} + +verbose_kmsg() { + # if QUIET is set make the kernel less chatty + [ -n "$QUIET" ] && echo '6' > /proc/sys/kernel/printk +} + + +cdupdate() { + if [ "${CDROOT}" = '1' ] + then + if [ -x /${NEW_ROOT}/mnt/cdrom/cdupdate.sh ] + then + good_msg "Running cdupdate.sh" + ${NEW_ROOT}/mnt/cdrom/cdupdate.sh + if [ "$?" != '0' ] + then + bad_msg "Executing cdupdate.sh failed!" + run_shell + fi + else + good_msg 'No cdupdate.sh script found, skipping...' + fi + fi +} + +setup_md_device() { + local device + + [ -z "$1" ] && device="${REAL_ROOT}" || device="$1" + [ -z "${device}" ] && return # LiveCD + + if [ `echo ${device}|sed -e 's#\(luks:\)\?\(/dev/md\)[[:digit:]]\+#\2#'` = "/dev/md" ] + then + good_msg 'Detected real_root as a md device. Setting up the device node...' + MD_NUMBER=`echo ${device}|sed -e 's#\(luks:\)\?/dev/md\([[:digit:]]\+\)#\2#'` + if [ ! -e /dev/md${MD_NUMBER} ] + then + mknod /dev/md${MD_NUMBER} b 9 ${MD_NUMBER} >/dev/null 2>&1 + [ "$?" -ne 0 ] && bad_msg "Creation of /dev/md${MD_NUMBER} failed..." + fi + mdstart ${MDPART} /dev/md${MD_NUMBER} + fi +} + +rundebugshell() { + if [ -n "$DEBUG" ] + then + good_msg 'Starting debug shell as requested by "debug" option.' + good_msg 'Type "exit" to continue with normal bootup.' + [ -x /bin/sh ] && /bin/sh || /bin/ash + fi +} + +swsusp_resume() { + # determine swap resume partition + local device=$(ls -l "${REAL_RESUME}" | sed 's/\ */ /g' | cut -d \ -f 6-7 | sed 's/,\ */:/') + [ -f /sys/power/resume ] && echo "${device}" > /sys/power/resume + return 0 +} + +tuxonice_resume() { + [ -d /proc/suspend2 -o -d /sys/power/suspend2 -o -d /sys/power/tuxonice ] || return + + local splash_theme + + if grep "splash=" /proc/cmdline > /dev/null 2>&1; then + splash_theme=$(cat /proc/cmdline | sed 's/.*splash=/splash=/' | sed 's/ .*//' | sed 's/.*theme://' | sed 's/,.*//') + fi + + local tuxonice_userui_program="/sys/power/tuxonice/user_interface/program" + local tuxonice_do_resume="/sys/power/tuxonice/do_resume" + + # + # Backward compatibility + # + if [ -e /sys/power/suspend2 ]; then + tuxonice_userui_program="/sys/power/suspend2/user_interface/program" + tuxonice_do_resume="/sys/power/suspend2/do_resume" + elif [ -e /proc/suspend2 ]; then + tuxonice_userui_program="/proc/suspend2/userui_program" + tuxonice_do_resume="/proc/suspend2/do_resume" + fi + + modules_scan tuxonice + + if ! grep suspend_noui /proc/cmdline > /dev/null 2>&1; then + which suspend2ui_text > /dev/null 2>&1 && which suspend2ui_text > "${tuxonice_userui_program}" + which tuxoniceui_text > /dev/null 2>&1 && which tuxoniceui_text > "${tuxonice_userui_program}" + + if [ -n "${splash_theme}" ]; then + ln -s /etc/splash/${splash_theme} /etc/splash/suspend2 + ln -s /etc/splash/${splash_theme} /etc/splash/tuxonice + + which suspend2ui_fbsplash > /dev/null 2>&1 && which suspend2ui_fbsplash > "${tuxonice_userui_program}" + which tuxoniceui_fbsplash > /dev/null 2>&1 && which tuxoniceui_fbsplash > "${tuxonice_userui_program}" + fi + + echo > "${tuxonice_do_resume}" + fi +} + +find_loop() { + CDROM="${NEW_ROOT}/mnt/cdrom" + for loop in ${LOOPS} + do + if [ -e "${CDROM}""${loop}" ] + then + LOOP="${loop}" + fi + done +} + +find_looptype() { + LOOPTYPE="${LOOP##*.}" + [ "${LOOPTYPE}" == "loop" ] && LOOPTYPE="normal" + [ "${LOOP}" == "/zisofs" ] && LOOPTYPE="${LOOP#/}" + [ -z "${LOOPTYPE}" ] && LOOPTYPE="noloop" +} + +getdvhoff() { + echo $(( $(hexdump -n 4 -s $((316 + 12 * $2)) -e '"%i"' $1) * 512)) +} |