#!/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