6 echo -ne "\033[0G\033[0K"
12 echo ${module} >> /etc/modules/extra_load
15 modules_scan extra_load
20 [ -d "/etc/modules/${1}" ] || touch /etc/modules/${1}
22 [ -f "/etc/modules/${1}" ] && MODS=`cat /etc/modules/${1}`
25 MLOAD=`echo ${MLIST} | sed -e "s/.*${x}.*/${x}/"`
26 if [ "${MLOAD}" = "${x}" ] # Only module to no-load
28 echo -e "${BOLD} ::${NORMAL} Skipping ${x}..."
29 elif [ "${MLOAD}" = "${MLIST}" ] # == No change == No specified no-load
31 [ -n "${DEBUG}" ] && echo -ne "${BOLD} ::${NORMAL} Checking for ${x}..."
32 # find -name does not work since the return status is always zero
33 if find /lib/modules/${KV} | grep /"${x}${KSUFF}" >/dev/null 2>&1
35 echo -ne "${BOLD} ::${NORMAL} Scanning for ${x}..."
41 echo -e "${BOLD} ::${NORMAL} Skipping ${x}..."
48 echo $1 | tr 'a-z' 'A-Z'
53 # $1 = mount dir name / media name
54 # $2 = recognition file
55 # $3 = variable to have the device path
56 # $4 = actual mount dir path (full path)
57 # args remaining are possible devices
59 local media=$1 recon=$2 vrbl=$3 mntdir=$4
62 good_msg "Looking for the ${media}" ${CRYPT_SILENT}
66 [ ! -d "${mntdir}" ] && mkdir -p ${mntdir} 2>/dev/null >/dev/null
67 if [ -n "${ISOBOOT}" ]
69 mntcddir="${mntdir%${media}}iso"
70 if [ ! -f ${mntcddir} ]
80 # Check for a block device to mount
86 # If disk and it has at least one partition, skip.
87 # We use /sys/block/${bsn}/${bsn}[0-9]* to make sure that we
88 # don't skip device mapper devices. Even the craziest scenario
89 # deserves a fair chance.
91 for part in `ls /sys/block/${bsn}/${bsn}*[0-9]* 2>/dev/null`
100 good_msg "Attempting to mount media: ${x}" ${CRYPT_SILENT}
102 mount -r -t ${CDROOT_TYPE} ${x} ${mntcddir} >/dev/null 2>&1
105 if [ -n "${ISOBOOT}" ]; then
106 if [ -f ${mntcddir}/${ISOBOOT} ]; then
107 mount -o loop ${mntcddir}/${ISOBOOT} ${mntdir}
108 if [ "$?" = "0" ]; then
109 good_msg "iso mounted on ${mntdir}"
114 # Check for the media
115 if [ -f "${mntdir}/${recon}" ]
117 #set REAL_ROOT, CRYPT_ROOT_KEYDEV or whatever ${vrbl} is
118 eval ${vrbl}'='"${x}"
119 good_msg "Media found on ${x}" ${CRYPT_SILENT}
129 eval local result='$'${vrbl}
131 [ -n "${result}" ] || bad_msg "Media not found" ${CRYPT_SILENT}
135 # Locate the cdrom device with our media on it.
137 local DEVICES="/dev/cdroms/* /dev/ide/cd/* /dev/sr*"
138 # USB Keychain/Storage
139 DEVICES="$DEVICES /dev/sd*"
141 DEVICES="$DEVICES /dev/hd*"
143 DEVICES="$DEVICES /dev/vd*"
144 # USB using the USB Block Driver
145 DEVICES="$DEVICES /dev/ubd* /dev/ubd/*"
147 DEVICES="$DEVICES /dev/iseries/vcd*"
148 # builtin mmc/sd card reader devices
149 DEVICES="$DEVICES /dev/mmcblk* /dev/mmcblk*/*"
150 # fallback scanning, this might scan something twice, but it's better than
152 [ -e /proc/partitions ] && DEVICES="${DEVICES} $(awk '/([0-9]+[[:space:]]+)/{print "/dev/" $4}' /proc/partitions)"
157 local DEVICES=`devicelist`
158 # The device was specified on the command line, so there's no need to scan
159 # a bunch of extra devices
160 [ -n "${CDROOT_DEV}" ] && DEVICES="${CDROOT_DEV}"
162 findmediamount "cdrom" "${SUBDIR}/${CDROOT_MARKER}" "REAL_ROOT" "${CDROOT_PATH}" ${DEVICES}
167 local KEYDEVS=`devicelist`
168 eval local keyloc='"${CRYPT_'${1}'_KEY}"'
170 findmediamount "key" "${keyloc}" "CRYPT_${1}_KEYDEV" "/mnt/key" ${KEYDEVS}
173 cache_cd_contents() {
174 # Check loop file exists and cache to ramdisk if DO_cache is enabled
175 if [ "${LOOPTYPE}" != "noloop" ] && [ "${LOOPTYPE}" != "sgimips" ]
180 # TODO: Check the size of the image versus the size of our tmpfs
181 # along with the amount of available RAM and increase tmpfs size
182 # if necessary. (Not having awk sucks...)
184 # for i in $(cat /proc/meminfo | grep -e ^MemFree -e ^Cached | \
185 # cut -d: -f2 | cut -dk -f1 | sed -e "s/^\s*//") ; do
186 # z=$(($z + $i)) ; done
188 good_msg "Copying loop file for caching..."
189 # Verify that the needed directory exists
190 mkdir -p "$(dirname ${NEW_ROOT}/mnt/${LOOP})"
191 cp -a ${CDROOT_PATH}/${LOOP} ${NEW_ROOT}/mnt/${LOOP}
194 warn_msg "Failed to cache the loop file! Lack of RAM?"
195 rm -rf ${NEW_ROOT}/mnt/${LOOP} 2>/dev/null
196 rm -rf ${NEW_ROOT}/mnt/livecd.* 2>/dev/null
197 rm -rf ${NEW_ROOT}/mnt/image.* 2>/dev/null
198 rm -rf ${NEW_ROOT}/mnt/zisofs 2>/dev/null
205 mount -t sysfs sysfs /sys -o noexec,nosuid,nodev >/dev/null 2>&1
207 [ ${ret} -eq 0 ] || bad_msg "Failed to mount /sys!"
211 if [ "${IP}" != '' ] || busybox udhcpc -n -T 15 -q
213 [ -e /rootpath ] && NFSROOT=`cat /rootpath`
215 if [ "${NFSROOT}" = '' ]
218 OPTIONS=`busybox dmesg | grep rootserver | sed -e "s/,/ /g"`
219 for OPTION in $OPTIONS
221 if [ `echo $OPTION | sed -e "s/=/ /g" | cut -d " " -f 1` = 'rootserver' ]
223 NFSIP=`echo $OPTION | sed -e "s/=/ /g" | cut -d " " -f 2`
228 OPTIONS=`busybox dmesg | grep rootpath | sed -e "s/,/ /g"`
229 for OPTION in $OPTIONS
231 if [ `echo $OPTION | sed -e "s/=/ /g" | cut -d " " -f 1` = 'rootpath' ]
233 NFSPATH=`echo $OPTION | sed -e "s/=/ /g" | cut -d " " -f 2`
238 if [ "${NFSIP}" != '' ] && [ "$NFSPATH" != '' ]
240 NFSROOT="${NFSIP}:${NFSPATH}"
242 bad_msg "The DHCP Server did not send a valid root-path."
243 bad_msg "Please check your DHCP setup, or provide a nfsroot=<...> parameter."
247 if [ "${NFSROOT}" != '' ]
249 NFSOPTIONS=${NFSROOT#*,}
250 NFSROOT=${NFSROOT%%,*}
251 if [ "${NFSOPTIONS}" = "${NFSROOT}" ]
253 NFSOPTIONS=$DEFAULT_NFSOPTIONS
255 NFSOPTIONS="${DEFAULT_NFSOPTIONS},${NFSOPTIONS}"
258 if [ "${CDROOT}" != '0' ]
260 good_msg "Attempting to mount NFS CD image on ${NFSROOT} with options ${NFSOPTIONS}"
261 mount -t nfs -o ${NFSOPTIONS} ${NFSROOT} ${CDROOT_PATH}
266 bad_msg "NFS Mounting failed. Is the path corrent ?"
269 good_msg "Attempting to mount NFS root on ${NFSROOT} with options ${NFSOPTIONS}"
270 mount -t nfs -o ${NFSOPTIONS} ${NFSROOT} ${NEW_ROOT}
275 bad_msg "NFS Mounting failed. Is the path correct ?"
277 # FIXME: Need to start portmap and the other rpc daemons in
278 # order to remount rw.
292 if [ "${retval}" -ne 0 ]; then
293 REAL_DEVICE=`findfs "${DEVICE}" 2>/dev/null`
297 if [ "$retval" -ne 0 ]; then
298 REAL_DEVICE=`busybox findfs "${DEVICE}" 2>/dev/null`
302 if [ "${retval}" -ne 0 ]; then
303 REAL_DEVICE=`blkid -o device -l -t "${DEVICE}"`
307 if [ "${retval}" -eq 0 ] && [ -n "${REAL_DEVICE}" ]; then
308 DEVICE="${REAL_DEVICE}"
316 if [ "${LOOP}" = '' -o ! -e "${CDROOT_PATH}/${LOOP}" ]
319 bad_msg "Invalid loop location: ${LOOP}"
320 bad_msg 'Please export LOOP with a valid location, or reboot and pass a proper loop=...'
321 bad_msg 'kernel command line!'
333 cut -d ' ' -f 3 < /proc/mounts | fgrep -q "${fs_type}"
337 # Use devtmpfs if enabled in kernel,
338 # else tmpfs. Always run mdev just in case
340 if grep -qs devtmpfs /proc/filesystems ; then
344 # Options copied from /etc/init.d/udev-mount, should probably be kept in sync
345 if ! fs_type_in_use devtmpfs; then
346 mount -t $devfs -o "exec,nosuid,mode=0755,size=10M" udev /dev \
347 || bad_msg "Failed to mount /dev as ${devfs}"
350 # http://git.busybox.net/busybox/plain/docs/mdev.txt
351 if ! fs_type_in_use devpts; then
352 mkdir -m 0755 /dev/pts
353 mount -t devpts -o gid=5,mode=0620 devpts /dev/pts || bad_msg "Failed to mount /dev/pts"
359 # If last command failed send error message and fall back to a shell
360 if [ "$retcode" != '0' ]
363 error_string="${error_string:-run command}"
364 bad_msg 'Failed to $1; failing back to the shell...'
370 # msg functions arguments
376 msg_string="${msg_string:-...}"
377 [ "$2" != 1 ] && echo -e "${GOOD}>>${NORMAL}${BOLD} ${msg_string} ${NORMAL}"
382 msg_string="${msg_string:-...}"
385 splash 'verbose' > /dev/null &
386 echo -e "${BAD}!!${NORMAL}${BOLD} ${msg_string} ${NORMAL}"
392 msg_string="${msg_string:-...}"
393 [ "$2" != 1 ] && echo -e "${WARN}**${NORMAL}${BOLD} ${msg_string} ${NORMAL}"
397 if [ "${CRYPT_SILENT}" = '1' ]
399 eval $1 >/dev/null 2>/dev/null
401 splash 'verbose' > /dev/null &
406 splash set_msg 'Disk unlocked.'
413 # $1 = variable whose value is the path (examples: "REAL_ROOT",
416 # $3 = optional explanations for failure
418 eval local oldvalue='$'${1}
420 [ \( $# != 2 \) -a \( $# != 3 \) ] && \
421 bad_msg "Bad invocation of function prompt_user, please file a bug \
422 report with this message" && exit 1
423 [ -n "${3}" ] && local explnt=" or : ${3}" || local explnt="."
425 bad_msg "Could not find the ${2} in ${oldvalue}${explnt}"
426 echo ' Please specify another value or: press Enter for the same, type "shell" for a shell, or "q" to skip...'
427 echo -n "${2}(${oldvalue}) :: "
429 case `eval echo '$'${1}` in
431 eval ${1}'='${oldvalue}
432 warn_msg "Skipping step, this will likely cause a boot failure."
436 eval ${1}'='${oldvalue}
437 echo "To leave and try again just press <Ctrl>+D"
441 eval ${1}'='${oldvalue}
447 # This function removes unset DO_slowusb if there is no usb-storage attached.
448 # If noslowusb is set, skip this function
449 [ "${DO_slowusb}" ] || return
451 # Unset DO_slowusb, so we can set it again if usb-storage has something attached
454 local usb_storage_dir="/sys/bus/usb/drivers/usb-storage"
455 if [ ! -d "${usb_storage_dir}" ]
457 # no automated slowusb required. no usb-storage devices attached.
460 for x in "${usb_storage_dir}"/*
462 [ -d "${x}" ] && [ "${x}" != "${usb_storage_dir}/module" ] \
463 && { DO_slowusb="1" ; break ; }
468 # Scan CMDLINE for any "doscsi" or "noscsi"-type arguments
476 if [ "${y}" = "do${x}" ]
478 MY_HWOPTS="${MY_HWOPTS} $x"
479 elif [ "${y}" = "no${x}" ]
481 MY_HWOPTS="`echo ${MY_HWOPTS} | sed -e \"s/${x}//g\" -`"
483 if [ "$(echo ${y} | cut -b -7)" = "keymap=" ]
485 MY_HWOPTS="${MY_HWOPTS} keymap"
490 # Shouldnt need to sort this as the following loop should figure out the
491 # duplicates and strip them out
492 #MY_HWOPTS=`echo ${MY_HWOPTS}| sort`
494 for x in ${MY_HWOPTS}
497 for y in ${TMP_HWOPTS}
499 if [ "${y}" = "${x}" ]
504 TMP_HWOPTS="${TMP_HWOPTS} ${x}"
505 eval DO_`echo ${x} | sed 's/-//'`=1
508 MY_HWOPTS=${TMP_HWOPTS}
512 # Load modules listed in MY_HWOPTS if /lib/modules exists for the running
514 if [ -d "/lib/modules/${KV}" ]
516 good_msg 'Loading modules'
517 # Load appropriate kernel modules
518 for modules in $MY_HWOPTS
520 modules_scan $modules
523 good_msg 'Skipping module load; no modules in the ramdisk!'
528 if [ "${DO_keymap}" ]
530 if [ ! -e /dev/vc/0 -a ! -e /dev/tty0 ]
533 mount -o bind ${NEW_ROOT}/dev /dev
535 [ ! -e /dev/tty0 ] && ln -s /dev/tty1 /dev/tty0
537 [ -f /lib/keymaps/keymapList ] && chooseKeymap
539 [ "${DEVBIND}" = '1' ] && umount /dev
541 if [ -e /etc/sysconfig/keyboard -a "${CDROOT}" = '1' ]
543 mkdir -p ${NEW_ROOT}/etc/sysconfig/
544 cp /etc/sysconfig/keyboard ${NEW_ROOT}/etc/sysconfig/keyboard
550 good_msg "Loading keymaps"
551 if [ -z "${keymap}" ]
553 splash 'verbose' > /dev/null &
554 cat /lib/keymaps/keymapList
555 read -t 10 -p '<< Load keymap (Enter for default): ' keymap
557 1|azerty) keymap=azerty ;;
560 4|br-a) keymap=br-a ;;
561 5|br-l) keymap=br-l ;;
564 8|croat) keymap=croat ;;
568 12|dvorak) keymap=dvorak ;;
590 34|sk-y) keymap=sk-y ;;
591 35|sk-z) keymap=sk-z ;;
592 36|slovene) keymap=slovene ;;
593 37|trf) keymap=trf ;;
594 38|trq) keymap=trq ;;
598 42|wangbe) keymap=wangbe ;;
599 43|sf|ch*) keymap=sf ;;
602 if [ -e /lib/keymaps/${keymap}.map ]
604 good_msg "Loading the ''${keymap}'' keymap"
605 loadkmap < /lib/keymaps/${keymap}.map
607 # echo ${keymap} | egrep -e "[0-9]+" >/dev/null 2>&1
610 # xkeymap=`tail -n 8 /lib/keymaps/keymapList | grep ${keymap} | sed -r "s/.*\s+${keymap}\s+([a-z-]+).*/\1/g" | egrep -v 1`
612 mkdir -p /etc/sysconfig
613 # echo "XKEYBOARD=${xkeymap}" > /etc/sysconfig/keyboard
614 echo "XKEYBOARD=${keymap}" > /etc/sysconfig/keyboard
615 splash set_msg "Set keymap to ${keymap}"
616 elif [ -z "${keymap}" ]
619 good_msg "Keeping default keymap"
620 splash set_msg "Keeping default keymap"
622 bad_msg "Sorry, but keymap ''${keymap}'' is invalid!"
629 #good_msg 'Checking if volumes need to be started...'
631 # Here, we check for /dev/device-mapper, and if it exists, we setup a
632 # a symlink, which should hopefully fix bug #142775 and bug #147015
633 if [ -e /dev/device-mapper ] && [ ! -e /dev/mapper/control ]
636 ln -sf /dev/device-mapper /dev/mapper/control
639 if [ "${USE_MDADM}" = '1' ]
641 if [ -e '/sbin/mdadm' ]
643 /sbin/mdadm --assemble --scan
645 bad_msg "mdadm not found: skipping mdadm raid assembly!"
649 if [ "${USE_MULTIPATH_NORMAL}" = '1' ]
651 good_msg "Scanning for multipath devices"
654 good_msg "Activating multipath devices"
655 /sbin/dmsetup ls --target multipath --exec "/sbin/kpartx -a -v"
656 #for MULTIPATH_VOLUMES in /dev/mapper/*; do kpartx -a $MULTIPATH_VOLUMES; done
659 if [ "${USE_DMRAID_NORMAL}" = '1' ]
661 if [ -e '/sbin/dmraid' ]
663 good_msg "Activating Device-Mapper RAID(s)"
664 if [ '${DMRAID_OPTS}' = '' ]
668 /sbin/dmraid -ay ${DMRAID_OPTS}
673 if [ "${USE_LVM_NORMAL}" = '1' ]
677 for dev in ${RAID_DEVICES}
679 setup_md_device "${dev}"
682 # This is needed for /bin/lvm to accept the following logic
683 lvm_commands="#! /bin/lvm"
685 # If there is a cahe, update it. Unbreak at least dmcrypt
686 [ -d /etc/lvm/cache ] && lvm_commands="${lvm_commands} \nvgscan"
688 # To activate volumegroups on all devices in the cache
689 lvm_commands="${lvm_commands} \nvgchange -ay --sysinit"
691 # To create symlinks so users can use real_root=/dev/vg/root
692 # This needs to run after vgchange, using vgchange --mknodes is too
694 lvm_commands="${lvm_commands} \nvgmknodes --ignorelockingfailure"
696 # And finally execute it all (/proc/... needed if lvm is compiled without readline)
697 good_msg "Scanning for and activating Volume Groups"
698 printf "%b\n" "${lvm_commands}" | /bin/lvm /proc/self/fd/0
700 bad_msg "vgscan or vgchange not found: skipping LVM volume group activation!"
704 if [ "${USE_ZFS}" = '1' ]
706 if [ -z "${ZFS_POOL}" ]
708 good_msg "Importing ZFS pools"
710 /sbin/zpool import -N -a ${ZPOOL_FORCE}
714 good_msg "Importing ZFS pools succeeded"
716 bad_msg "Imported ZFS pools failed"
720 if [ "$(zpool list -H -o name ${ZFS_POOL} 2>&1)" = "$ZFS_POOL" ]
722 good_msg "ZFS pool ${ZFS_POOL} already imported."
724 if [ -n "${CRYPT_ROOT}" -o -n "${CRYPT_SWAP}" ]
726 good_msg "LUKS detected. Reimporting ${ZFS_POOL}"
727 /sbin/zpool export -f "${ZFS_POOL}"
728 /sbin/zpool import -N ${ZPOOL_FORCE} "${ZFS_POOL}"
731 good_msg "Importing ZFS pool ${ZFS_POOL}"
733 /sbin/zpool import -N ${ZPOOL_FORCE} "${ZFS_POOL}"
737 good_msg "Importing ${ZFS_POOL} succeeded"
739 bad_msg "Importing ${ZFS_POOL} failed"
748 if [ ! -n "${ISCSI_NOIBFT}" ]
750 good_msg "Activating iSCSI via iBFT"
754 if [ -n "${ISCSI_INITIATORNAME}" ] && [ -n "${ISCSI_TARGET}" ] && [ -n "${ISCSI_ADDRESS}" ]
756 good_msg "Activating iSCSI via cmdline"
758 if [ "${ISCSI_TGPT}" ]
760 ADDITIONAL="${ADDITIONAL} -g ${ISCSI_TGPT}"
762 ADDITIONAL="${ADDITIONAL} -g 1"
765 if [ "${ISCSI_PORT}" ]
767 ADDITIONAL="${ADDITIONAL} -p ${ISCSI_PORT}"
770 if [ "${ISCSI_USERNAME}" ]
772 ADDITIONAL="${ADDITIONAL} -u ${ISCSI_USERNAME}"
775 if [ "${ISCSI_PASSWORD}" ]
777 ADDITIONAL="${ADDITIONAL} -w ${ISCSI_PASSWORD}"
780 if [ "${ISCSI_USERNAME_IN}" ]
782 ADDITIONAL="${ADDITIONAL} -U ${ISCSI_USERNAME_IN}"
785 if [ "${ISCSI_PASSWORD_IN}" ]
787 ADDITIONAL="${ADDITIONAL} -W ${ISCSI_PASSWORD_IN}"
790 if [ "${ISCSI_DEBUG}" ]
792 ADDITIONAL="${ADDITIONAL} -d ${ISCSI_DEBUG}"
795 iscsistart -i "${ISCSI_INITIATORNAME}" -t "${ISCSI_TARGET}" -a "${ISCSI_ADDRESS}" ${ADDITIONAL}
797 # let iscsid settle - otherwise mounting the iSCSI-disk will fail (very rarely, though)
804 # It is either the root or a swap, other devices are supported in the scripts provided with sys-fs/cryptsetup-luks
807 # please use 'tr' and this line, or remove it
808 # eval local TYPE=`uppercase $1`
819 eval local LUKS_DEVICE='"${CRYPT_'${TYPE}'}"' LUKS_NAME="$1" LUKS_KEY='"${CRYPT_'${TYPE}'_KEY}"' LUKS_KEYDEV='"${CRYPT_'${TYPE}'_KEYDEV}"' LUKS_TRIM='"${CRYPT_'${TYPE}'_TRIM}"'
820 local DEV_ERROR=0 KEY_ERROR=0 KEYDEV_ERROR=0
821 local mntkey="/mnt/key/" cryptsetup_options=''
823 [ ! -e /sbin/cryptsetup ] && bad_msg "The ramdisk does not support LUKS" && exit 1
827 # if crypt_silent=1 and some error occurs, enter shell quietly
828 if [ \( ${CRYPT_SILENT} -eq 1 \) -a \( \( \( ${DEV_ERROR} -eq 1 \) -o \( ${KEY_ERROR} -eq 1 \) \) -o \( ${KEYDEV_ERROR} -eq 1 \) \) ]
831 elif [ ${DEV_ERROR} -eq 1 ]
833 prompt_user "LUKS_DEVICE" "${LUKS_NAME}"
835 elif [ ${KEY_ERROR} -eq 1 ]
837 prompt_user "LUKS_KEY" "${LUKS_NAME} key"
839 elif [ ${KEYDEV_ERROR} -eq 1 ]
841 prompt_user "LUKS_KEYDEV" "${LUKS_NAME} key device"
844 LUKS_DEVICE=$(find_real_device "${LUKS_DEVICE}")
846 setup_md_device ${LUKS_DEVICE}
847 cryptsetup isLuks ${LUKS_DEVICE}
850 bad_msg "The LUKS device ${LUKS_DEVICE} does not contain a LUKS header" ${CRYPT_SILENT}
855 if [ "x${LUKS_TRIM}" = "xyes" ]
857 good_msg "Enabling TRIM support for ${LUKS_NAME}." ${CRYPT_SILENT}
858 cryptsetup_options="${cryptsetup_options} --allow-discards"
861 if [ -n "${LUKS_KEY}" ]
863 local REAL_LUKS_KEYDEV="${LUKS_KEYDEV}"
864 if [ ! -e "${mntkey}${LUKS_KEY}" ]
866 REAL_LUKS_KEYDEV=$(find_real_device "${LUKS_KEYDEV}")
867 if [ -b "${REAL_LUKS_KEYDEV}" ]
868 then good_msg "Using key device ${REAL_LUKS_KEYDEV}." ${CRYPT_SILENT}
870 good_msg "Please insert removable device ${LUKS_KEYDEV} for ${LUKS_NAME}" ${CRYPT_SILENT}
871 # abort after 10 secs
873 while [ ${count} -gt 0 ]
877 REAL_LUKS_KEYDEV=$(find_real_device "${LUKS_KEYDEV}")
878 if [ -b "${REAL_LUKS_KEYDEV}" ]
880 good_msg "Removable device ${REAL_LUKS_KEYDEV} detected." ${CRYPT_SILENT}
884 if [ ! -b "${REAL_LUKS_KEYDEV}" ]
886 eval CRYPT_${TYPE}_KEY=${LUKS_KEY}
888 eval LUKS_KEYDEV='"${CRYPT_'${TYPE}'_KEYDEV}"'
889 REAL_LUKS_KEYDEV=$(find_real_device "${LUKS_KEYDEV}")
890 if [ ! -b "${REAL_LUKS_KEYDEV}" ]; then
892 bad_msg "Removable device ${LUKS_KEYDEV} not found." ${CRYPT_SILENT}
895 # continue otherwise will mount keydev which is mounted by bootstrap
899 # At this point a device was recognized, now let's see if the key is there
900 [ ! -d "$mntkey" ] && mkdir -p ${mntkey} 2>/dev/null >/dev/null
902 mount -n -o ro ${REAL_LUKS_KEYDEV} ${mntkey} >/dev/null 2>/dev/null
906 bad_msg "Mounting of device ${REAL_LUKS_KEYDEV} failed." ${CRYPT_SILENT}
909 good_msg "Removable device ${REAL_LUKS_KEYDEV} mounted." ${CRYPT_SILENT}
912 if [ ! -e "${mntkey}${LUKS_KEY}" ]; then
913 umount -n ${mntkey} 2>/dev/null >/dev/null
916 bad_msg "Key {LUKS_KEY} on device ${REAL_LUKS_KEYDEV} not found." ${CRYPT_SILENT}
921 # At this point a candidate key exists (either mounted before or not)
922 good_msg "${LUKS_KEY} on device ${REAL_LUKS_KEYDEV} found" ${CRYPT_SILENT}
923 if [ "$(echo ${LUKS_KEY} | grep -o '.gpg$')" = ".gpg" ] && [ -e /sbin/gpg ] ; then
924 [ -e /dev/tty ] && mv /dev/tty /dev/tty.org
926 cryptsetup_options="${cryptsetup_options} -d -"
927 gpg_cmd="/sbin/gpg --logger-file /dev/null --quiet --decrypt ${mntkey}${LUKS_KEY} |"
929 cryptsetup_options="${cryptsetup_options} -d ${mntkey}${LUKS_KEY}"
932 # At this point, keyfile or not, we're ready!
933 crypt_filter "${gpg_cmd}cryptsetup ${cryptsetup_options} luksOpen ${LUKS_DEVICE} ${LUKS_NAME}"
936 [ -e /dev/tty.org ] \
938 && mv /dev/tty.org /dev/tty
940 if [ ${crypt_filter_ret} -eq 0 ]
942 good_msg "LUKS device ${LUKS_DEVICE} opened" ${CRYPT_SILENT}
945 bad_msg "Failed to open LUKS device ${LUKS_DEVICE}" ${CRYPT_SILENT}
953 umount ${mntkey} 2>/dev/null >/dev/null
954 rmdir -p ${mntkey} 2>/dev/null >/dev/null
959 # if key is set but key device isn't, find it
961 [ -n "${CRYPT_ROOT_KEY}" ] && [ -z "${CRYPT_ROOT_KEYDEV}" ] \
962 && sleep 6 && bootstrapKey "ROOT"
964 if [ -n "${CRYPT_ROOT}" ]; then
966 if [ -n "${REAL_ROOT}" ]
971 REAL_ROOT="/dev/mapper/root"
975 # same for swap, but no need to sleep if root was unencrypted
976 [ -n "${CRYPT_SWAP_KEY}" ] && [ -z "${CRYPT_SWAP_KEYDEV}" ] \
977 && { [ -z "${CRYPT_ROOT}" ] && sleep 6; bootstrapKey "SWAP"; }
979 if [ -n "${CRYPT_SWAP}" ]; then
981 if [ -z "${REAL_RESUME}" ]
983 # Resume from swap as default
984 REAL_RESUME="/dev/mapper/swap"
990 # Sleep a specific number of seconds if SDELAY is set
993 good_msg "Waiting ${SDELAY} seconds..."
995 elif [ "${CDROOT}" = '1' ]
997 # many CD/DVD drives require extra sleep, especially when
998 # connected via USB. Many people reported that 1 second sleep
999 # is not enough on their notebooks, that's why sleep 3, when booting
1000 # off a livecd is a better default.
1003 good_msg 'Hint: Use parameter scandelay[=seconds] if you need waiting here'
1008 # if QUIET is set make the kernel less chatty
1009 [ -n "$QUIET" ] && echo '0' > /proc/sys/kernel/printk
1013 # if QUIET is set make the kernel less chatty
1014 [ -n "$QUIET" ] && echo '6' > /proc/sys/kernel/printk
1019 if [ "${CDROOT}" = '1' ]
1021 if [ -x /${CDROOT_PATH}/cdupdate.sh ]
1023 good_msg "Running cdupdate.sh"
1024 ${CDROOT_PATH}/cdupdate.sh
1027 bad_msg "Executing cdupdate.sh failed!"
1031 good_msg 'No cdupdate.sh script found, skipping...'
1037 # start BTRFS volume detection, if available
1038 [ -x /sbin/btrfsctl ] && /sbin/btrfsctl -a
1044 [ -z "$1" ] && device="${REAL_ROOT}" || device="$1"
1045 [ -z "${device}" ] && return # LiveCD
1047 if [ `echo ${device}|sed -e 's#\(luks:\)\?\(/dev/md\)[[:digit:]]\+#\2#'` = "/dev/md" ]
1049 good_msg 'Detected real_root as a md device. Setting up the device node...'
1050 MD_NUMBER=`echo ${device}|sed -e 's#\(luks:\)\?/dev/md\([[:digit:]]\+\)#\2#'`
1051 if [ ! -e /dev/md${MD_NUMBER} ]
1053 mknod /dev/md${MD_NUMBER} b 9 ${MD_NUMBER} >/dev/null 2>&1
1054 [ $? -ne 0 ] && bad_msg "Creation of /dev/md${MD_NUMBER} failed..."
1056 mdstart ${MDPART} /dev/md${MD_NUMBER}
1060 do_rundebugshell() {
1061 good_msg 'Type "exit" to continue with normal bootup.'
1062 [ -x /bin/sh ] && /bin/sh || /bin/ash
1068 good_msg 'Starting debug shell as requested by "debug" option.'
1074 if [ -d /proc/suspend2 -o -d /sys/power/suspend2 -o -d /sys/power/tuxonice ]; then
1082 # determine swap resume partition
1083 local device=$(ls -lL "${REAL_RESUME}" | sed 's/\ */ /g' | cut -d \ -f 5-6 | sed 's/,\ */:/')
1084 [ -f /sys/power/resume ] && echo "${device}" > /sys/power/resume
1089 if grep "splash=" /proc/cmdline > /dev/null 2>&1; then
1090 splash_theme=$(cat /proc/cmdline | sed 's/.*splash=/splash=/' | sed 's/ .*//' | sed 's/.*theme://' | sed 's/,.*//')
1093 local tuxonice_userui_program="/sys/power/tuxonice/user_interface/program"
1094 local tuxonice_do_resume="/sys/power/tuxonice/do_resume"
1095 local tuxonice_resumedev="/sys/power/tuxonice/resume"
1096 local tuxonice_replace_swsusp="/sys/power/tuxonice/replace_swsusp"
1099 # Backward compatibility
1101 if [ -e /sys/power/suspend2 ]; then
1102 tuxonice_userui_program="/sys/power/suspend2/user_interface/program"
1103 tuxonice_do_resume="/sys/power/suspend2/do_resume"
1104 tuxonice_resumedev="/sys/power/suspend2/resume"
1105 tuxonice_replace_swsusp="/sys/power/suspend2/replace_swsusp"
1106 elif [ -e /proc/suspend2 ]; then
1107 tuxonice_userui_program="/proc/suspend2/userui_program"
1108 tuxonice_do_resume="/proc/suspend2/do_resume"
1109 tuxonice_resumedev="/proc/suspend2/resume"
1110 tuxonice_replace_swsusp="/proc/suspend2/replace_swsusp"
1113 # if 'use_swsusp' is given, use swsusp instead
1114 if grep "use_swsusp" /proc/cmdline > /dev/null 2>&1; then
1115 echo 0 > ${tuxonice_replace_swsusp}
1120 modules_scan tuxonice
1122 # we both configure tuxonice and activate resuming,
1123 # however the kernel will resume only if an image is found
1125 if ! grep suspend_noui /proc/cmdline > /dev/null 2>&1; then
1126 which suspend2ui_text > /dev/null 2>&1 && which suspend2ui_text > "${tuxonice_userui_program}"
1127 which tuxoniceui_text > /dev/null 2>&1 && which tuxoniceui_text > "${tuxonice_userui_program}"
1129 if [ -n "${splash_theme}" ]; then
1130 ln -s /etc/splash/${splash_theme} /etc/splash/suspend2
1131 ln -s /etc/splash/${splash_theme} /etc/splash/tuxonice
1133 which suspend2ui_fbsplash > /dev/null 2>&1 && which suspend2ui_fbsplash > "${tuxonice_userui_program}"
1134 which tuxoniceui_fbsplash > /dev/null 2>&1 && which tuxoniceui_fbsplash > "${tuxonice_userui_program}"
1138 echo "${REAL_RESUME}" > "${tuxonice_resumedev}"
1139 echo > "${tuxonice_do_resume}"
1143 for loop in ${LOOPS}
1145 if [ -e "${CDROOT_PATH}""${loop}" ]
1153 LOOPTYPE="${LOOP##*.}"
1154 [ "${LOOPTYPE}" == "loop" ] && LOOPTYPE="normal"
1155 [ "${LOOP}" == "/zisofs" ] && LOOPTYPE="${LOOP#/}"
1156 [ -z "${LOOPTYPE}" ] && LOOPTYPE="noloop"
1160 echo $(( $(hexdump -n 4 -s $((316 + 12 * $2)) -e '"%i"' $1) * 512))
1163 setup_squashfs_aufs() {
1165 # Setup aufs directories and vars
1166 local overlay=/mnt/overlay
1167 local static=/mnt/livecd
1169 for i in "${overlay}" "${static}"; do
1170 [ ! -d "${i}" ] && mkdir -p "${i}"
1172 good_msg "Loading aufs"
1173 modprobe aufs > /dev/null 2>&1
1175 mount -t squashfs -o loop,ro "${CDROOT_PATH}/${LOOPEXT}${LOOP}" "${static}"
1176 mount -t tmpfs none "${overlay}"
1177 mount -t aufs -o br:${overlay}:${static} aufs "${NEW_ROOT}"
1179 [ ! -d "${NEW_ROOT}${overlay}" ] && mkdir -p "${NEW_ROOT}${overlay}"
1180 [ ! -d "${NEW_ROOT}${static}" ] && mkdir -p "${NEW_ROOT}${static}"
1181 echo "aufs / aufs defaults 0 0" > "${NEW_ROOT}"/etc/fstab
1182 for i in "${overlay}" "${static}"; do mount --move "${i}" "${NEW_ROOT}${i}"; done
1184 # have handy /mnt/cdrom (CDROOT_PATH) as well
1185 local new_cdroot="${NEW_ROOT}${CDROOT_PATH}"
1186 [ ! -d "${new_cdroot}" ] && mkdir -p "${new_cdroot}"
1187 mount --bind "${CDROOT_PATH}" "${new_cdroot}"
1194 if [ "${USE_UNIONFS_NORMAL}" = '1' ]
1196 # Directory used for rw changes in union mount filesystem
1201 # CHANGES=$MEMORY/unionfs_changes/default
1203 # CHANGES=$MEMORY/unionfs_changes/$UID
1206 # mkdir -p ${MEMORY}
1208 good_msg "Loading fuse module"
1209 modprobe fuse > /dev/null 2>&1
1210 # if [ -n "${UNIONFS}" ]
1212 # CHANGESDEV=${UNIONFS}
1213 # good_msg "mounting $CHANGESDEV to $MEMORY for unionfs support"
1214 # mount -t auto $CHANGESDEV $MEMORY
1215 # # mount tmpfs only in the case when changes= boot parameter was
1216 # # empty or we were not able to mount the storage device
1218 # if [ ${ret} -ne 0 ]
1220 # bad_msg "mount of $CHANGESDEV failed falling back to ramdisk based unionfs"
1221 # mount -t tmpfs tmpfs $MEMORY
1223 # if [ "${CDROOT}" -eq '1' -a ! -f ${MEMORY}/livecd.unionfs ]
1226 # bad_msg "failed to find livecd.unionfs file on $CHANGESDEV"
1227 # bad_msg "create a livecd.unionfs file on this device if you wish to use it for unionfs"
1228 # bad_msg "falling back to ramdisk based unionfs for safety"
1229 # mount -t tmpfs tmpfs $MEMORY
1232 # good_msg "Mounting ramdisk to $MEMORY for unionfs support..."
1233 # mount -t tmpfs tmpfs $MEMORY
1239 # mount -t unionfs -o dirs=$CHANGES=rw unionfs ${UNION}
1240 good_msg "Creating union mount"
1241 unionfs -o allow_other,cow,noinitgroups,suid,dev,default_permissions,use_ino ${rw_dir}=RW:${ro_dir}=RO ${UNION} 2>/dev/null
1245 bad_msg "Can't setup union mount!"
1246 USE_UNIONFS_NORMAL=0
1248 [ ! -d "${NEW_ROOT}${CDROOT_PATH}" ] && mkdir -p "${NEW_ROOT}${CDROOT_PATH}"
1249 mount --bind "${CDROOT_PATH}" "${NEW_ROOT}${CDROOT_PATH}"
1251 USE_UNIONFS_NORMAL=0
1258 /^[[:blank:]]*#/ { next }
1260 ' ${NEW_ROOT}/etc/initramfs.mounts
1265 [ -e "${NEW_ROOT}"/etc/fstab ] || return 1
1267 /^[[:blank:]]*#/ { next }
1268 $2 == fs { print $3 }
1269 ' ${NEW_ROOT}/etc/fstab
1274 [ -e "${NEW_ROOT}"/etc/fstab ] || return 1
1276 /^[[:blank:]]*#/ { next }
1277 $2 == fs { print $4 }
1278 ' ${NEW_ROOT}/etc/fstab
1283 [ -e "${NEW_ROOT}"/etc/fstab ] || return 1
1285 /^[[:blank:]]*#/ { next }
1286 $2 == fs { print $1 }
1287 ' ${NEW_ROOT}/etc/fstab
1290 # If the kernel is handed a mount option is does not recognize, it WILL fail to
1291 # mount. util-linux handles auto/noauto, but busybox passes it straight to the kernel
1292 # which then rejects the mount.
1293 # To make like a little easier, busybox mount does not care about leading,
1294 # trailing or duplicate commas.
1295 strip_mount_options()
1297 sed -r 's/(,|^)(no)?auto(,|$)/,/g'