Browse Source

add block-extroot, a package for using an external filesystem as rootfs (patch by cshore)

SVN-Revision: 19880
Felix Fietkau 15 years ago
parent
commit
9be4598569

+ 1 - 0
package/base-files/files/lib/functions/boot.sh

@@ -66,6 +66,7 @@ pivot() { # <new_root> <old_root>
 		mount -o move $2/tmp /tmp
 		mount -o move $2/sys /sys 2>&-
 		mount -o move $2/jffs /jffs 2>&-
+		mount -o move $2/overlay /overlay 2>&-
 		return 0
 	}
 }

+ 17 - 0
package/block-extroot/Config.in

@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2010 Vertical Communications
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+config EXTROOT_SETTLETIME
+	int
+	prompt "Settle time for root block device (s)" if PACKAGE_block-extroot
+	default 20
+	help
+		This is the amount of time, in seconds, to wait for the block device
+		the root filesystem is on to become available, after the kernel that
+		modules for the rootfs and device are loaded.
+		
+

+ 64 - 0
package/block-extroot/Makefile

@@ -0,0 +1,64 @@
+#
+# Copyright (C) 2009 OpenWrt.org
+# Copyright (C) 2010 Vertical Communications
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=block-extroot
+PKG_VERSION:=0.0.1
+PKG_RELEASE:=1
+
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/block-extroot/Default
+  SECTION:=utils
+  CATEGORY:=Utilities
+  TITLE:=root filesystem on secondary storage
+  SUBMENU:=disc
+endef
+
+define Package/block-extroot
+  $(call Package/block-extroot/Default)
+  MENU:=1
+  DEPENDS:=+block-mount @PACKAGE_kmod-ide-core||PACKAGE_kmod-usb-storage||PACKAGE_kmod-mmc
+endef
+
+define Package/block-extroot/config
+	source "$(SOURCE)/Config.in"
+endef
+
+define Package/block-extroot/description
+  Based on the moduluarized preinit and firstboot, adds the option to have
+  the root filesystem on storage other than the jffs or the boot root device.
+  For a squashfs image this package must be installed into the image, not as
+  a package to add later.
+endef
+
+define Build/Prepare
+endef
+
+define Build/Configure
+endef
+
+define Build/Compile
+endef
+
+define Package/block-extroot/install
+	$(INSTALL_DIR) $(1)/lib/functions
+	$(INSTALL_DATA) ./files/extmount.sh $(1)/lib/functions/
+	$(INSTALL_DIR) $(1)/lib/preinit
+	$(INSTALL_DATA) ./files/50_determine_usb_root $(1)/lib/preinit/
+	$(INSTALL_DATA) ./files/60_pivot_usb_root $(1)/lib/preinit/
+	$(INSTALL_DIR) $(1)/lib/preinit
+	echo "extroot_settle_time=\"$(CONFIG_EXTROOT_SETTLETIME)\"" >$(1)/lib/preinit/00_extroot.conf
+	$(INSTALL_DIR) $(1)/overlay
+endef
+
+$(eval $(call BuildPackage,block-extroot))
+

+ 50 - 0
package/block-extroot/files/50_determine_usb_root

@@ -0,0 +1,50 @@
+#!/bin/sh
+# Copyright (C) 2010 Vertical Communications
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+
+
+. /etc/functions.sh
+. /lib/functions/extmount.sh
+. /lib/functions/mount.sh
+
+determine_external_root() {
+	local OLD_UCI_CONFIG_DIR="$UCI_CONFIG_DIR"
+	set_jffs_mp
+	determine_root_device
+
+	# extroot requires extroot and fstab config files, therefore 
+	# we assume configuration is incomplete and not to be used if either of them
+	# is missing (for jffs versions of these files on squashfs image)
+	if [ "$jffs" = "/jffs" ] && [ -r "/jffs/etc/config/fstab" ]; then
+		UCI_CONFIG_DIR="/jffs/etc/config"
+		ER_IS_SQUASHFS=true
+	fi
+
+	# For squashfs on firstboot root_device will be tmpfs for the ramoverlay,
+	# unless there is a saved config, in which case it will be /dev/root,
+	# however in the case of a saved config, it won't be restored until after
+	# this script, so there won't be a config on the first boot after
+	# flashing a squashfs-based filesystem
+	# For ext2, ramdisk, or jffs2 root filesystems root_device is /dev/root
+	# For squashfs after firstboot, root filesystem is /dev/root	
+	# We only use the config from the root or jffs if the root_device is 
+	# /dev/root
+	[ "$root_device" = "/dev/root" ] && {
+		er_load_modules
+		[ -n "$extroot_settle_time" ] && [ "$extroot_settle_time" -gt 0 ] && {
+			sleep $extroot_settle_time
+		} 
+		config_load fstab
+		config_foreach config_mount_by_section mount 1
+		
+		[ "$rootfs_found" = "1" ] && grep -q /overlay /proc/mounts && { 
+			pi_extroot_mount_success=true
+			pi_mount_skip_next=false
+		}
+	}
+	UCI_CONFIG_DIR="$OLD_UCI_CONFIG_DIR"
+}
+
+boot_hook_add preinit_mount_root determine_external_root
+

+ 20 - 0
package/block-extroot/files/60_pivot_usb_root

@@ -0,0 +1,20 @@
+#!/bin/sh
+# Copyright (C) 2010 Vertical Communications
+
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+
+# Determine if we are requested to mount external root
+
+external_root_pivot() {
+	check_skip || [ "$pi_extroot_mount_success" != "true" ] || {
+		echo "switching to external rootfs"
+		if [ "$ER_IS_SQUASHFS" = "true" ]; then
+			umount /jffs
+		fi
+		mount -o remount,ro / && fopivot /overlay /rom && pi_mount_skip_next=true
+	}
+}
+
+boot_hook_add preinit_mount_root external_root_pivot
+

+ 24 - 0
package/block-extroot/files/extmount.sh

@@ -0,0 +1,24 @@
+#!/bin/sh
+# Copyright 2010 Vertical Communications
+
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+
+determine_root_device() {
+	root_device="$(mount | grep ' / ' | cut -f1 -d\  | grep -v rootfs )"
+}
+
+set_jffs_mp() {
+	jffs="$(awk '/jffs2/ {print $2}' /proc/mounts)"
+}
+
+er_load_modules() {
+	[ -d $ER_ROOT/etc/modules.d ] && {
+	    cd $ER_ROOT/etc/modules.d && {
+	    	local modules="$(grep -l '# May be required for rootfs' *)"
+	    	cat $modules | sed 's/^\([^#]\)/insmod \1/' | sh 2>&- || : 
+	    }
+	}
+}
+
+