Browse Source

add new package kexecinit, to realize kexec booting

Waldemar Brodkorb 13 years ago
parent
commit
e91c994c49

+ 1 - 1
package/base-files/Makefile

@@ -6,7 +6,7 @@ include $(TOPDIR)/mk/rootfs.mk
 
 PKG_NAME:=		base-files
 PKG_VERSION:=		1.0
-PKG_RELEASE:=		46
+PKG_RELEASE:=		47
 PKG_SECTION:=		base
 PKG_DESCR:=		basic files and scripts
 

+ 2 - 1
package/base-files/src/init

@@ -1,7 +1,7 @@
 #!/bin/sh
 echo "System initialization ..."
 export PATH=/bin:/sbin:/usr/bin:/usr/sbin
-mount -t devtmpfs devtmpfs /dev > /dev/null 2>&1
+mount -t devtmpfs devtmpfs /dev >/dev/null 2>&1
 mount -nt proc proc /proc
 mount -o nosuid,nodev,noexec -t sysfs sysfs /sys
 [ ! -f /etc/notmpfs ] && {
@@ -18,6 +18,7 @@ echo >/dev/mdev.seq
 echo "/sbin/mdev" >/proc/sys/kernel/hotplug
 mdev -s
 cat /etc/.rnd >/dev/urandom 2>&1
+[ -x /kexecinit ] && { /kexecinit; }
 [ -x /cryptinit ] && { /cryptinit; exec switch_root /mnt "/init";}
 [ -x /sbin/cfgfs ] && { cfgfs setup; mount -o remount,ro /;} || mount -o remount,rw /
 [ -f /etc/fstab ] && { fsck -p >/dev/null; mount -a;}

+ 26 - 0
package/kexecinit/Makefile

@@ -0,0 +1,26 @@
+# This file is part of the OpenADK project. OpenADK is copyrighted
+# material, please see the LICENCE file in the top-level directory.
+
+include ${TOPDIR}/rules.mk
+
+PKG_NAME:=		kexecinit
+PKG_VERSION:=		1.0
+PKG_RELEASE:=		1
+PKG_DESCR:=		init for kexec rootfilesystem
+PKG_SECTION:=		base
+
+WRKDIST=		${WRKDIR}/${PKG_NAME}-${PKG_VERSION}
+NO_DISTFILES:=		1
+
+include ${TOPDIR}/mk/package.mk
+
+$(eval $(call PKG_template,KEXECINIT,${PKG_NAME},${PKG_VERSION}-${PKG_RELEASE},${PKG_DEPENDS},${PKG_DESCR},${PKG_SECTION}))
+
+CONFIG_STYLE:=		manual
+BUILD_STYLE:=		manual
+INSTALL_STYLE:=		manual
+
+do-install:
+	$(INSTALL_BIN) ./src/kexecinit $(IDIR_KEXECINIT)/
+
+include ${TOPDIR}/mk/pkg-bottom.mk

+ 65 - 0
package/kexecinit/src/kexecinit

@@ -0,0 +1,65 @@
+#!/bin/sh
+
+load_system() {
+	echo "Loading OpenADK from microdrive (${micro}1)"
+	mount ${micro}1 /mnt
+	if [ $? -ne 0 ];then echo "Mounting ${micro}1 failed"; exit 1;fi
+	kexec -l /mnt/boot/kernel
+	umount /mnt
+	kexec -e -x
+}
+
+cf_install() {
+	mkdir /mnt/root
+	mkdir /mnt/cf
+	mount -t ext2 ${micro}1 /mnt/root
+	if [ $? -ne 0 ];then echo "Mounting ${micro}1 failed"; exit 1;fi
+	mount ${cfd}1 /mnt/cf
+	if [ $? -ne 0 ];then echo "Mounting ${cfd}1 failed"; exit 1;fi
+	if [ -f /mnt/cf/sharp.tgz ];then
+		echo "Installing OpenADK from CF (${cfd}1) to microdrive (${micro}1)"
+		umount /mnt/root
+		mke2fs -q ${micro}1
+		mount -t ext2 ${micro}1 /mnt/root
+		if [ $? -ne 0 ];then echo "Mounting ${micro}1 failed"; exit 1;fi
+		tar -xzpf /mnt/cf/sharp.tgz -C /mnt/root
+	fi
+	umount /mnt/root
+	umount /mnt/cf
+}
+
+check_cf() {
+	cf=0
+	if [ $(lsscsi|wc -l) -eq 1 ];then
+		cf=0
+	else
+		cf=1
+	fi
+	micro=$(lsscsi |awk '$4 ~ "HMS360" { print $6 }')
+	if [ "$micro" = "/dev/sda" ];then
+		cfd=/dev/sdb
+	else
+		cfd=/dev/sda
+	fi
+}
+
+echo "  ___                      _    ____  _  __ "
+echo " / _ \ _ __   ___ _ __    / \  |  _ \| |/ / "
+echo "| | | | '_ \ / _ \ '_ \  / _ \ | | | | ' /  "
+echo "| |_| | |_) |  __/ | | |/ ___ \| |_| | . \  "
+echo " \___/| .__/ \___|_| |_/_/   \_\____/|_|\_\ "
+echo "      |_|                                   "
+echo ""
+
+sleep 2
+check_cf
+if [ $cf -eq 0 ];then
+	load_system
+else
+	echo "Should I install OpenADK to microdrive (y/n)"
+	read answer
+	if [ "$answer" = "y" ];then
+		cf_install
+	fi
+	load_system
+fi