You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
genkernel_fork/defaults/initrd.d/00-fsdev.sh

220 lines
6.4 KiB

#!/bin/sh
. /etc/initrd.d/00-common.sh
. /etc/initrd.d/00-devmgr.sh
MDADM_BIN="/sbin/mdadm"
_is_mdadm() {
[ -x "${MDADM_BIN}" ] || return 1
[ "${USE_MDADM}" = "1" ] || return 1
return 0
}
mount_sysfs() {
mount -t sysfs sysfs /sys -o noexec,nosuid,nodev \
>/dev/null 2>&1 && return 0
bad_msg "Failed to mount /sys!"
}
# If devtmpfs is mounted, try move it to the new root
# If that fails, try to unmount all possible mounts of devtmpfs as
# stuff breaks otherwise
move_mounts_to_chroot() {
for fs in /run /dev /sys /proc; do
if grep -qs "$fs" /proc/mounts; then
local chroot_dir="${CHROOT}${fs}"
mkdir -p "${chroot_dir}"
if ! mount --move $fs "${chroot_dir}"
then
umount $fs || \
bad_msg "Failed to move and umount $fs!"
fi
fi
done
}
find_real_device() {
local device="${1}"
local out=
case "${device}" in
UUID=*|LABEL=*)
local real_device=""
local retval=1
if [ "${retval}" -ne 0 ]; then
real_device=$(findfs "${device}" 2>/dev/null)
retval=$?
fi
if [ "$retval" -ne 0 ]; then
real_device=$(busybox findfs "${device}" 2>/dev/null)
retval=$?
fi
if [ "${retval}" -ne 0 ]; then
real_device=$(blkid -o device -l -t "${device}")
retval=$?
fi
if [ "${retval}" -eq 0 ] && [ -n "${real_device}" ]; then
out="${real_device}"
fi
;;
*)
out="${device}"
;;
esac
echo -n "${out}"
}
get_device_fstype() {
# This function expects a real or UUID=,LABEL= based reference
# that can be resolved to a real device node. Using this
# function in combination with ZFS may lead to unexpected behaviour.
local device=$(find_real_device "${1}")
if [ -n "${device}" ]; then
blkid -o value -s TYPE "${device}"
return ${?} # readability
else
bad_msg "Cannot resolve device: ${1}"
return 1
fi
}
media_find() {
# $1 = mount dir name / media name
# $2 = recognition file
# $3 = variable to have the device path
# $4 = actual mount dir path (full path)
# args remaining are possible devices
local media="${1}" recon="${2}" vrbl="${3}" mntdir="${4}"
shift 4
good_msg "Looking for the ${media}"
if [ "$#" -gt "0" ]; then
[ ! -d "${mntdir}" ] && \
mkdir -p "${mntdir}" 2>/dev/null >/dev/null
local mntcddir="${mntdir}"
if [ -n "${ISOBOOT}" ]; then
mntcddir="${mntdir%${media}}iso"
if [ ! -f "${mntcddir}" ]; then
mkdir "${mntcddir}"
fi
fi
for x in ${*}; do
# Check for a block device to mount
if [ ! -b "${x}" ]; then
continue
fi
#
# 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.
#
local bsn=$(basename "${x}")
local bpath="/sys/block/${bsn}"
local parts=$(find "${bpath}/" \
-regex "${bpath}/${bsn}[0-9]" -type d 2>/dev/null)
[ -n "${parts}" ] && continue
good_msg "Attempting to mount media: ${x}"
mount -r -t "${CDROOT_TYPE}" "${x}" "${mntcddir}" >/dev/null 2>&1 \
|| continue
if [ -n "${ISOBOOT}" ] && [ -f "${mntcddir}/${ISOBOOT}" ]; then
mount -o loop "${mntcddir}/${ISOBOOT}" "${mntdir}" && \
good_msg "iso mounted on ${mntdir}"
fi
# 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}"
break
else
umount "${mntcddir}"
fi
done
fi
eval local result='$'${vrbl}
[ -n "${result}" ] || bad_msg "Media not found"
}
start_md_volumes() {
good_msg "Starting md devices"
"${MDADM_BIN}" --assemble --scan
# do not bad_msg, user could have this enabled even though
# no RAID is currently available.
}
start_volumes() {
# 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
_is_mdadm && start_md_volumes
if [ "${USE_MULTIPATH_NORMAL}" = "1" ]; then
good_msg "Scanning for multipath devices"
multipath -v 0
is_udev && udevadm settle
is_mdev && sleep 2
good_msg "Activating multipath devices"
dmsetup ls --target multipath --exec "/sbin/kpartx -a -v"
fi
if [ "${USE_DMRAID_NORMAL}" = "1" ]; then
good_msg "Activating device-mapper raid devices"
dmraid -ay ${DMRAID_OPTS} || \
bad_msg "dmraid failed to run, skipping raid assembly!"
fi
# make sure that all the devices had time to be configured
is_udev && udevadm settle
if [ "${USE_LVM_NORMAL}" = "1" ]; then
# This is needed for /sbin/lvm to accept the following logic
local cmds="#! /sbin/lvm"
# If there is a cahe, update it. Unbreak at least dmcrypt
[ -d /etc/lvm/cache ] && cmds="${cmds} \nvgscan"
# To activate volumegroups on all devices in the cache
cmds="${cmds} \nvgchange -ay --sysinit"
if is_mdev; then
# To create symlinks so users can use
# real_root=/dev/vg/root
# This needs to run after vgchange, using
# vgchange --mknodes is too early.
cmds="${cmds} \nvgmknodes --ignorelockingfailure"
fi
# And finally execute it all (/proc/... needed if lvm
# is compiled without readline)
good_msg "Activating Logical Volume Groups"
printf "%b\n" "${cmds}" | lvm /proc/self/fd/0 || \
bad_msg "lvm failed to run, cannot activate logical volumes!"
fi
is_udev && udevadm settle
}