Эх сурвалжийг харах

boot into rescue mode, when button is pressed once

Waldemar Brodkorb 15 жил өмнө
parent
commit
35c8150f71

+ 43 - 7
package/adkinstall/src/adkinstall

@@ -49,10 +49,11 @@ start=0
 rootp=1
 cfgfsp=2
 if [ $rescue -eq 1 ];then
-	rootp=2
-	cfgfsp=3
+	rootp=3
+	cfgfsp=4
 	start=2
-	parted -s /dev/sda unit cyl mkpartfs primary ext2 0 $start
+	parted -s /dev/sda unit cyl mkpartfs primary ext2 0 1
+	parted -s /dev/sda unit cyl mkpartfs primary ext2 1 2
 	check_exit
 fi
 parted -s /dev/sda unit cyl mkpartfs primary ext2 $start $rootsize
@@ -72,33 +73,64 @@ tar -C /mnt -xzpf $1
 check_exit
 chmod 1777 /mnt/tmp
 chmod 4755 /mnt/bin/busybox
+if [ $rescue -eq 1 ];then
+	mkdir /mnt/boot/grub
+fi
 
 speed=$(awk -F \, '/console=ttyS0/ { print $2 }' /proc/cmdline|sed -e "s/ .*$//")
 
 if [ $rescue -eq 1 ];then
 	umount /mnt
-	mount /dev/sda1 /mnt
+	mount /dev/sda2 /mnt
 	cp $2 /mnt/rescue
 fi
 printf "Installing bootloader ...\n"
 mkdir -p /mnt/boot/grub
 if [ $rescue -eq 1 ];then
+mount /dev/sda1 /mnt/boot/grub
 cat << EOF > /mnt/boot/grub/grub.cfg
-set default=0
 set timeout=1
 serial --unit=0 --speed=$speed
 terminal_output serial 
 terminal_input serial 
 
+if [ -s \$prefix/grubenv ]; then
+  load_env
+fi
+
+set default="\${saved_entry}"
+
+if [ \${prev_saved_entry} ]; then
+  set saved_entry=\${prev_saved_entry}
+  save_env saved_entry
+  set prev_saved_entry=
+  save_env prev_saved_entry
+  set boot_once=true
+fi
+
+function savedefault {
+  if [ -z \${boot_once} ]; then
+    saved_entry=\${chosen}
+    save_env saved_entry
+  fi
+}
+
+function recordfail {
+  set recordfail=1
+  if [ -n \${have_grubenv} ]; then if [ -z \${boot_once} ]; then save_env recordfail; fi; fi
+}
+
 menuentry "GNU/Linux (OpenADK)" {
+	recordfail
         insmod ext2
-        set root=(hd0,2)
+        set root=(hd0,3)
         linux /boot/vmlinuz-adk root=/dev/sda$rootp ro init=/init panic=10
 }
 
 menuentry "GNU/Linux (OpenADK) Rescue Mode" {
+	recordfail
         insmod ext2
-        set root=(hd0,1)
+        set root=(hd0,2)
         linux /rescue ro init=/init panic=10
 }
 EOF
@@ -119,6 +151,10 @@ EOF
 fi
 grub-install --root-directory=/mnt /dev/sda 
 check_exit
+if [ $rescue -eq 1 ];then
+	grub-set-default --root-directory=/mnt 0
+	umount /mnt/boot/grub
+fi
 umount /mnt
 printf "Successfully installed. You can reboot now.\n"
 exit 0

+ 6 - 2
package/alix-switch/files/alix-switch

@@ -1,9 +1,13 @@
 #!/bin/sh
 # launched by alix-switchd in case of button event
-
+# f.e. boot rescue system once
 case "$1" in
   on)
     echo "alix-switch: on"
+    mount /dev/sda1 /boot/grub
+    grub-reboot 1
+    umount /boot/grub
+    reboot
     ;;
   off)
     echo "alix-switch: off"
@@ -12,4 +16,4 @@ case "$1" in
     echo "Usage: $0 {on|off}"
     ;;
 esac
-exit 0
+exit $?

+ 1 - 1
package/alix-switch/files/alix-switch.postinst

@@ -1,3 +1,3 @@
 #!/bin/sh
 . $IPKG_INSTROOT/etc/functions.sh
-add_rcconf alix_switchd alix_switchd NO
+add_rcconf alix_switch alix_switch YES

+ 4 - 7
package/alix-switch/src/alix-switchd.c

@@ -44,18 +44,15 @@ static sighandler_t handle_signal (int sig_nr, sighandler_t signalhandler) {
 static void start_daemon (void) {
 
 	int i;
-	pid_t pid;
-
-	if (setsid() > 0) 
-		exit(EXIT_FAILURE);
+	pid_t pid, sid;
 
 	handle_signal(SIGHUP, SIG_IGN);
-
 	if ((pid = fork ()) != 0)
 		exit(EXIT_FAILURE);
-
-	chdir("/");
 	umask(0);
+	if ((sid = setsid()) < 0)
+		exit(EXIT_FAILURE);
+	chdir("/");
 	for (i = sysconf(_SC_OPEN_MAX); i > 0; i--)
 		close(i);
 }