summaryrefslogtreecommitdiff
path: root/cs/Gentoo/init.md
diff options
context:
space:
mode:
Diffstat (limited to 'cs/Gentoo/init.md')
-rw-r--r--cs/Gentoo/init.md141
1 files changed, 141 insertions, 0 deletions
diff --git a/cs/Gentoo/init.md b/cs/Gentoo/init.md
new file mode 100644
index 0000000..4cbded1
--- /dev/null
+++ b/cs/Gentoo/init.md
@@ -0,0 +1,141 @@
+#!/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
+
+# assemble the raid set(s) - they got renumbered from md1, md5 and md6
+
+# not needed on SSD but we may want to maintain it
+# /boot
+/sbin/mdadm --assemble /dev/md125 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
+# don't care if /boot fails to assemble
+
+# not needed on SSD
+# / (root) I wimped out of root on lvm for this box
+/sbin/mdadm --assemble /dev/md126 /dev/sda5 /dev/sdb5 /dev/sdc5 /dev/sdd5 || rescue_shell
+# if root won't assemble, we are stuck
+
+# LVM for everything else
+# /home and everything portge related
+/sbin/mdadm --assemble /dev/md127 /dev/sda6 /dev/sdb6 /dev/sdc6 /dev/sdd6 || rescue_shell
+# 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
+
+# lvm runs as whatever its called as
+ln -s /sbin/lvm.static /sbin/vgchange
+
+# everything on the SDD
+/sbin/vgchange -ay ssd | rescue_shell
+
+# start the vg volume group - /home and everything for portage - need not die here
+/sbin/vgchange -ay vg || rescue_shell
+
+# 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
+
+# switch to the real root and execute init
+exec switch_root /mnt/root /sbin/init