From 6f7f52466a360ae0f6264e75650bdd90a4eccc12 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Wed, 24 Dec 2008 00:34:12 +0200 Subject: [PATCH] init: implemented switch_root and revival --- initramfs/etc_rc.d_rc.switchroot.sh | 43 +++++++++++++++++++++++++++++ initramfs/init.sh | 32 ++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 initramfs/etc_rc.d_rc.switchroot.sh diff --git a/initramfs/etc_rc.d_rc.switchroot.sh b/initramfs/etc_rc.d_rc.switchroot.sh new file mode 100644 index 0000000..b317156 --- /dev/null +++ b/initramfs/etc_rc.d_rc.switchroot.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# --- SDE-COPYRIGHT-NOTE-BEGIN --- +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# +# Filename: target/idunn/initramfs/etc_rc.d_rc.switchroot.sh +# Copyright (C) 2008 The OpenSDE Project +# +# More information can be found in the files COPYING and README. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. A copy of the +# GNU General Public License can be found in the file COPYING. +# --- SDE-COPYRIGHT-NOTE-END --- + +. /etc/rc.d/functions.in +. /etc/conf/idunn + +case "$1" in +stop) + # TODO: stop network + + title "Moving special filesystems" + for x in dev sys proc; do + check mount -o move "/$x" "$rootfs/$x" + done + status + + ;; +revive) + title "Moving special filesystems back" + for x in dev sys proc; do + check mount -o move "$rootfs/$x" "/$x" + done + status + + # TODO: restart network + + title "Restarting Supervisor" + check start-stop-daemon -S -b -x /usr/bin/runsvdir -- /var/service/ + status + ;; +esac diff --git a/initramfs/init.sh b/initramfs/init.sh index 3c2e842..229bc1f 100644 --- a/initramfs/init.sh +++ b/initramfs/init.sh @@ -70,7 +70,37 @@ while true; do sleep 1; if [ -e /var/run/.idunn-resume ]; then # switch_root requested + . /etc/conf/idunn + echo "switch_root in progress, you will be disconnected now." | wall - rm /var/run/.idunn-resume + + # stop services + /etc/rc.d/rc.shutdown 2>&1 | tee -a $LOG + + # terminate the rest + sleep 1 + killall5 -s TERM + sleep 2 + killall5 -s KILL + + /etc/rc.d/rc.switchroot stop 2>&1 | tee -a $LOG + + # and proceed + exec switch_root -c /dev/console "$rootfs" "$init" $initopt 2>&1 >> $LOG + errno=$? + + # outch! + if [ ! -s $LOG ]; then + # the world is gone, time to panic + exit $errno + else + cat <<-EOT >> $LOG + switch_root failed returning $errno + + EOT + rm -f /var/run/.idunn-resume + + /etc/rc.d/rc.switchroot revive 2>&1 | tee -a $LOG + fi fi done