- #!/bin/busybox sh
- rescue_shell() {
- echo "$@"
- echo "Something went wrong. Dropping you to a shell."
- /bin/busybox --install -s
- exec /bin/sh
- }
- # allow the use of UUIDs or filesystem lables
- uuidlabel_root() {
- for cmd in $(cat /proc/cmdline) ; do
- case $cmd in
- root=*)
- type=$(echo $cmd | cut -d= -f2)
- echo "Mounting rootfs"
- if [ $type == "LABEL" ] || [ $type == "UUID" ] ; then
- uuid=$(echo $cmd | cut -d= -f3)
- mount -o ro $(findfs "$type"="$uuid") /mnt/root
- else
- mount -o ro $(echo $cmd | cut -d= -f2) /mnt/root
- fi
- ;;
- esac
- done
- }
- check_filesystem() {
- # most of code coming from /etc/init.d/fsck
- local fsck_opts= check_extra= RC_UNAME=$(uname -s)
- # FIXME : get_bootparam forcefsck
- if [ -e /forcefsck ]; then
- fsck_opts="$fsck_opts -f"
- check_extra="(check forced)"
- fi
- echo "Checking local filesystem $check_extra : $1"
- if [ "$RC_UNAME" = Linux ]; then
- fsck_opts="$fsck_opts -C0 -T"
- fi
- trap : INT QUIT
- # using our own fsck, not the builtin one from busybox
- /sbin/fsck -p $fsck_opts $1
- ret_val=$?
- case $ret_val in
- 0) return 0;;
- 1) echo "Filesystem repaired"; return 0;;
- 2|3) if [ "$RC_UNAME" = Linux ]; then
- echo "Filesystem repaired, but reboot needed"
- reboot -f
- else
- rescue_shell "Filesystem still have errors; manual fsck required"
- fi;;
- 4) if [ "$RC_UNAME" = Linux ]; then
- rescue_shell "Fileystem errors left uncorrected, aborting"
- else
- echo "Filesystem repaired, but reboot needed"
- reboot
- fi;;
- 8) echo "Operational error"; return 0;;
- 16) echo "Use or Syntax Error"; return 16;;
- 32) echo "fsck interrupted";;
- 127) echo "Shared Library Error"; sleep 20; return 0;;
- *) echo $ret_val; echo "Some random fsck error - continuing anyway"; sleep 20; return 0;;
- esac
- # rescue_shell can't find tty so its broken
- rescue_shell
- }
- # start for real here
- # temporarily mount proc and sys
- mount -t proc none /proc
- mount -t sysfs none /sys
- mount -t devtmpfs none /dev
- # disable kernel messages from popping onto the screen
- ###echo 0 > /proc/sys/kernel/printk
- # clear the screen
- ###clear
- # /boot
- /sbin/mdadm --assemble /dev/md0 --uuid=bc38405f:83693026:825019f1:97c4f6e3
- # old d678d02e-28ab-84e0-c44c-77eb7ee19756
- # new UUID : bc38405f:83693026:825019f1:97c4f6e3 (local to host NeddySeagoon_Static)
- # don't care if /boot fails to assemble
- # / the host LVM
- /sbin/mdadm --assemble /dev/md1 --uuid=62120388:98bfb6f0:b65341f6:6b93d69f || rescue_shell
- # old ad5fe0cb-775d-38b4-7169-e221fc96089f
- # new Array UUID : 62120388:98bfb6f0:b65341f6:6b93d69f
- # if root won't assemble, we are stuck
- # the KVM LVM
- /sbin/mdadm --assemble /dev/md2 --uuid=75d75d6a:9947df3c:5e50eaf5:5f8d22b7
- #old 52be4797:edab2349:eb21497e:52035eaa
- # new Array UUID : 75d75d6a:9947df3c:5e50eaf5:5f8d22b7
- # and if the LVM space won't assemble there is no /usr or /var so we are really in a mess
- # TODO could auto cope with degraded raid operation
- # the media RAID
- /sbin/mdadm --assemble /dev/md3 --uuid=5e9cefa1:b8bce388:d442afdb:7e9f15bf
- # old 52be4797:edab2349:eb21497e:52035eaa
- # new Array UUID : 5e9cefa1:b8bce388:d442afdb:7e9f15bf
- # lvm runs as whatever its called as
- ln -s /sbin/lvm /sbin/vgchange
- # start the volume groups - we only have host and vm volume groups
- /sbin/vgchange -ay host || rescue_shell
- # we don't get any KVMs if vm doesnt start but its not fatal to booting the host
- /sbin/vgchange -ay guests
- # if host failed we have no /usr or /var
- # get here with raid sets assembled and logical volumes available
- # mounting rootfs on /mnt/root
- uuidlabel_root || rescue_shell "Error with uuidlabel_root"
- # space separated list of mountpoints that ...
- mountpoints="/usr /var"
- # ... we want to find in /etc/fstab ...
- ln -s /mnt/root/etc/fstab /etc/fstab
- # ... to check filesystems and mount our devices.
- for m in $mountpoints ; do
- #echo $m
- check_filesystem $m
- echo "Mounting $m"
- # mount the device and ...
- mount $m || rescue_shell "Error while mounting $m"
- # ... move the tree to its final location
- mount --move $m "/mnt/root"$m || rescue_shell "Error while moving $m"
- done
- echo "All done. Switching to real root."
- # clean up. The init process will remount proc sys and dev later
- umount /proc
- umount /sys
- umount /dev
- # switch to the real root and execute init
- exec switch_root /mnt/root /sbin/init