#!/bin/sh PATH=/usr/bin:/usr/sbin export PATH problem() { printf "No root-device given!\n\nStarting SETUP.\n\n" /usr/sbin/gixsetup } no_device() { printf "The device %s, which is supposed to contain the\n" $1 printf "root file system, does not exist.\n" printf "Please fix this problem and exit this shell.\n\n" } no_mount() { printf "Could not mount device %s\n" $1 printf "Sleeping forever. Please reboot and fix the kernel command line.\n\n" printf "Maybe the device is formatted with an unsupported file system?\n\n" printf "Or maybe filesystem type autodetection went wrong, in which case\n" printf "you should add the rootfstype=... parameter to the kernel command line.\n\n" printf "Available partitions:\n" } do_mount_root() { mkdir /.root [ -n "$rootflags" ] && rootflags="$rootflags," rootflags="$rootflags$ro" case "$root" in /dev/* ) device=$root ;; UUID=* ) eval $root; device="/dev/disk/by-uuid/$UUID" ;; PARTUUID=*) eval $root; device="/dev/disk/by-partuuid/$PARTUUID" ;; LABEL=* ) eval $root; device="/dev/disk/by-label/$LABEL" ;; "" ) echo "No root device specified." ; problem ;; esac while [ ! -b "$device" ] ; do no_device $device problem done if ! mount -n -t "$rootfstype" -o "$rootflags" "$device" /.root ; then no_mount $device cat /proc/partitions while true ; do sleep 10000 ; done else ln $device /dev/root echo "Successfully mounted /.root to device $root" fi } do_try_resume() { case "$resume" in UUID=* ) eval $resume; resume="/dev/disk/by-uuid/$UUID" ;; LABEL=*) eval $resume; resume="/dev/disk/by-label/$LABEL" ;; esac if $noresume || ! [ -b "$resume" ]; then return; fi ls -lH "$resume" | ( read x x x x maj min x echo -n ${maj%,}:$min > /sys/power/resume ) } init=/sbin/init root= rootdelay= rootfstype=auto ro="ro" rootflags= device= resume= noresume=false mount -n -t devtmpfs devtmpfs /dev mount -n -t proc proc /proc mount -n -t sysfs sysfs /sys mount -n -t tmpfs tmpfs /run mount -n -t efivarfs efivarfs /sys/firmware/efi/efivars read -r cmdline < /proc/cmdline for param in $cmdline ; do case $param in init=* ) init=${param#init=} ;; root=* ) root=${param#root=} ;; rootdelay=* ) rootdelay=${param#rootdelay=} ;; rootfstype=*) rootfstype=${param#rootfstype=} ;; rootflags=* ) rootflags=${param#rootflags=} ;; resume=* ) resume=${param#resume=} ;; noresume ) noresume=true ;; ro ) ro="ro" ;; rw ) ro="rw" ;; esac done # udevd location depends on version if [ -x /sbin/udevd ]; then UDEVD=/sbin/udevd elif [ -x /lib/udev/udevd ]; then UDEVD=/lib/udev/udevd elif [ -x /lib/systemd/systemd-udevd ]; then UDEVD=/lib/systemd/systemd-udevd else echo "Cannot find udevd nor systemd-udevd" problem fi ${UDEVD} --daemon --resolve-names=never udevadm trigger udevadm settle echo -n Searching for raid started sleep 1 echo -n . sleep 1 echo -n . sleep 1 echo -n . sleep 1 echo . /sbin/mdadm -E -s > /etc/mdadm.conf /sbin/mdadm -S -s /sbin/mdadm -A -s cat /proc/mdstat echo -n MDADM started sleep 1 echo -n . sleep 1 echo -n . sleep 1 echo -n . sleep 1 echo -n . sleep 1 echo . echo Trying to mount root or going to setup # if [ -f /etc/mdadm.conf ] ; then mdadm -As ; fi # if [ -x /sbin/vgchange ] ; then /sbin/vgchange -a y > /dev/null ; fi # if [ -n "$rootdelay" ] ; then sleep "$rootdelay" ; fi do_try_resume # This function will not return if resuming from disk do_mount_root killall -w ${UDEVD##*/} exec switch_root /.root "$init" "$@"