diff options
| -rw-r--r-- | package/base-files/files/lib/functions/boot.sh | 1 | ||||
| -rw-r--r-- | package/block-extroot/Config.in | 17 | ||||
| -rw-r--r-- | package/block-extroot/Makefile | 64 | ||||
| -rw-r--r-- | package/block-extroot/files/50_determine_usb_root | 50 | ||||
| -rw-r--r-- | package/block-extroot/files/60_pivot_usb_root | 20 | ||||
| -rw-r--r-- | package/block-extroot/files/extmount.sh | 24 | 
6 files changed, 176 insertions, 0 deletions
| diff --git a/package/base-files/files/lib/functions/boot.sh b/package/base-files/files/lib/functions/boot.sh index 46b461330..8c8fa52d7 100644 --- a/package/base-files/files/lib/functions/boot.sh +++ b/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  	}  } diff --git a/package/block-extroot/Config.in b/package/block-extroot/Config.in new file mode 100644 index 000000000..dbf1041c1 --- /dev/null +++ b/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. +		 + diff --git a/package/block-extroot/Makefile b/package/block-extroot/Makefile new file mode 100644 index 000000000..1ae72f0d3 --- /dev/null +++ b/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)) + diff --git a/package/block-extroot/files/50_determine_usb_root b/package/block-extroot/files/50_determine_usb_root new file mode 100644 index 000000000..1e5f153b6 --- /dev/null +++ b/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 + diff --git a/package/block-extroot/files/60_pivot_usb_root b/package/block-extroot/files/60_pivot_usb_root new file mode 100644 index 000000000..c8572a35f --- /dev/null +++ b/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 + diff --git a/package/block-extroot/files/extmount.sh b/package/block-extroot/files/extmount.sh new file mode 100644 index 000000000..dfd6eef07 --- /dev/null +++ b/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>&- || :  +	    } +	} +} + + | 
