REAL_ROOTFLAGS=''
ROOTFSTYPE='auto'
CRYPT_SILENT=0
+mkdir -p /etc/cmdline /etc/modprobe.d
for x in ${CMDLINE}
do
case "${x}" in
USE_DMRAID_NORMAL=1
;;
dozfs*)
- if [ ! -x /sbin/zfs ]; then
- USE_ZFS=0
- bad_msg 'zfs binary not found: aborting use of zfs!'
- else
- USE_ZFS=1
- MY_HWOPTS="${MY_HWOPTS} zfs"
- if [ "${x#*=}" = 'force' ]
- then
- ZPOOL_FORCE=-f
- fi
+ USE_ZFS=1
+
+ if [ "${x#*=}" = 'force' ]
+ then
+ ZPOOL_FORCE=-f
fi
;;
# Debug Options
nounionfs)
USE_UNIONFS_NORMAL=0
;;
+ *=*)
+ case "${x%%=*}" in
+ *.*)
+ echo "${x#*.}" >> "/etc/module_options/${x%%.*}.conf"
+ ;;
+ esac
+ ;;
esac
done
REAL_ROOT="${FAKE_ROOT}"
fi
+# Set variables based on the value of REAL_ROOT
+case "${REAL_ROOT}" in
+ ZFS=*)
+ ZFS_POOL=${REAL_ROOT#*=}
+ ZFS_POOL=${ZFS_POOL%%/*}
+ USE_ZFS=1
+ ;;
+ ZFS)
+ USE_ZFS=1
+ ;;
+esac
+
+# Verify that it is safe to use ZFS
+if [ "USE_ZFS" = "1" ]
+then
+ if [ -x /sbin/zfs -a -x /sbin/zpool ]
+ then
+ MY_HWOPTS="${MY_HWOPTS} zfs"
+ else
+ USE_ZFS=0
+
+ [ -x /sbin/zfs ] || bad_msg '/sbin/zfs not found!'
+ [ -x /sbin/zpool ] || bad_msg '/sbin/zpool not found!'
+ bad_msg 'Aborting use of zfs!'
+ fi
+fi
+
splash 'init'
cmdline_hwopts
+# Mount devfs
+mount_devfs
+
# Mount sysfs
mount_sysfs
-# Setup hotplugging for firmware loading
-setup_hotplug
+# Initialize mdev
+if [ "${KV_2_6_OR_GREATER}" ]
+then
+ good_msg 'Activating mdev'
+
+ # Serialize hotplug events
+ touch /dev/mdev.seq
+
+ # Setup hotplugging for firmware loading
+ echo /sbin/mdev > /proc/sys/kernel/hotplug
+fi
# Load modules listed in MY_HWOPTS if /lib/modules exists for the running kernel
if [ -z "${DO_modules}" ]
good_msg 'Skipping module load; no modules in the ramdisk!'
fi
+# Ensure that device nodes are properly configured
+if [ "${KV_2_6_OR_GREATER}" ]
+then
+ mdev -s || bad_msg "mdev -s failed"
+fi
+
# Apply scan delay if specified
sdelay
# Setup slow USB bits
setup_slowusb
-# Start device manager
-start_dev_mgr
+cd /
# if doslowusb is passed, pause other 10 seconds here, after mdev load
[ "${DO_slowusb}" ] && sleep 10
fi
if [ ${retval} -ne 0 ]; then
- RESUME_DEV=$(blkid -l -t "${REAL_RESUME}" | cut -d ":" -f 1 2>/dev/null)
+ RESUME_DEV=$(blkid -o device -l -t "${REAL_RESUME}")
retval=$?
fi
fi
if [ ${retval} -ne 0 ]; then
- ROOT_DEV=$(blkid -l -t "${REAL_ROOT}" | cut -d ":" -f 1 2>/dev/null)
+ ROOT_DEV=$(blkid -o device -l -t "${REAL_ROOT}")
retval=$?
fi
fi
;;
ZFS*)
+ if [ "${USE_ZFS}" = '0' ]; then
+ prompt_user "REAL_ROOT" "root block device"
+ continue
+ fi
+
ROOT_DEV="${REAL_ROOT#*=}"
if [ "${ROOT_DEV}" != 'ZFS' ]
then
- zfs get type ${ROOT_DEV} > /dev/null
-
- if [ "$?" = '0' ]
+ if [ "$(zfs get type -o value -H ${ROOT_DEV})" = 'filesystem' ]
then
got_good_root=1;
REAL_ROOT=${ROOT_DEV}
ROOTFSTYPE=zfs
+ else
+ bad_msg "${ROOT_DEV} is not a filesystem"
+ prompt_user "REAL_ROOT" "root block device"
+ got_good_root=0
+ continue
fi
else
BOOTFS=$(/sbin/zpool list -H -o bootfs)
done;
+ else
+ got_good_root=0
fi
fi
if [ "${ROOTFSTYPE}" = 'zfs' ]
then
- MOUNT_STATE=rw
+ if [ "zfs get -H -o value mountpoint ${REAL_ROOT}" = 'legacy' ]
+ then
+ MOUNT_STATE=rw
+ else
+ MOUNT_STATE=rw,zfsutil
+ fi
else
MOUNT_STATE=ro
fi
then
if [ "${USE_AUFS_NORMAL}" != '1' ]; then
good_msg 'Mounting squashfs filesystem'
- mount -t squashfs -o loop,ro "${CDROOT_PATH}/${LOOPEXT}${LOOP}" "${NEW_ROOT}/mnt/livecd"
+ _CACHED_SQUASHFS_PATH="${NEW_ROOT}/mnt/${LOOP}"
+ _squashfs_path="${CDROOT_PATH}/${LOOPEXT}${LOOP}" # Default to uncached
+ # Upgrade to cached version if possible
+ [ "${DO_cache}" -a -f "${_CACHED_SQUASHFS_PATH}" ] \
+ && _squashfs_path=${_CACHED_SQUASHFS_PATH}
+ mount -t squashfs -o loop,ro "${_squashfs_path}" "${NEW_ROOT}/mnt/livecd" || {
+ bad_msg "Squashfs filesystem could not be mounted, dropping into shell."
+ if [ -e /proc/filesystems ]; then
+ fgrep -q squashfs /proc/filesystems || \
+ bad_msg "HINT: Your kernel does not know filesystem \"squashfs\"."
+ fi
+ do_rundebugshell
+ }
else
good_msg 'Mounting squashfs & aufs filesystems'
setup_squashfs_aufs
good_msg "Copying read-write image contents to tmpfs"
# Copy over stuff that should be writable
- (cd "${NEW_ROOT}/${FS_LOCATION}"; cp -a ${ROOT_TREES} "${NEW_ROOT}")
+ (cd "${NEW_ROOT}/${FS_LOCATION}"; cp -a ${ROOT_TREES} "${NEW_ROOT}") || {
+ bad_msg "Copying failed, dropping into a shell."
+ do_rundebugshell
+ }
# Now we do the links.
for x in ${ROOT_LINKS}
fi
done
- mkdir initramfs proc tmp sys 2>/dev/null
+ mkdir initramfs proc tmp sys run 2>/dev/null
chmod 1777 tmp
fi
# and not a mountpoint
[ -z "$dev" ] && continue
fstype=$(get_mount_fstype $fs)
- # ro must be trailing, and the options will always contain at least 'defaults'
- opts="$(get_mount_options $fs | strip_mount_options),ro"
+ if get_mount_options $fs | fgrep -q bind ; then
+ opts='bind'
+ dev=${NEW_ROOT}${dev}
+ else
+ # ro must be trailing, and the options will always contain at least 'defaults'
+ opts="$(get_mount_options $fs | strip_mount_options),ro"
+ fi
mnt=${NEW_ROOT}${fs}
cmd="mount -t $fstype -o $opts $dev $mnt"
good_msg "Mounting $dev as ${fs}: $cmd"
echo -ne "${GOOD}>>${NORMAL}${BOLD} Booting (initramfs)${NORMAL}"
cd "${CHROOT}"
-mkdir "${CHROOT}/proc" "${CHROOT}/sys" 2>/dev/null
+mkdir "${CHROOT}/proc" "${CHROOT}/sys" "${CHROOT}/run" 2>/dev/null
echo -ne "${BOLD}.${NORMAL}"
# If devtmpfs is mounted, try move it to the new root