summaryrefslogtreecommitdiff
path: root/package/block-extroot
diff options
context:
space:
mode:
Diffstat (limited to 'package/block-extroot')
-rw-r--r--package/block-extroot/Config.in17
-rw-r--r--package/block-extroot/Makefile64
-rw-r--r--package/block-extroot/files/50_determine_usb_root50
-rw-r--r--package/block-extroot/files/60_pivot_usb_root20
-rw-r--r--package/block-extroot/files/extmount.sh24
5 files changed, 175 insertions, 0 deletions
diff --git a/package/block-extroot/Config.in b/package/block-extroot/Config.in
new file mode 100644
index 0000000000..dbf1041c15
--- /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 0000000000..1ae72f0d3a
--- /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 0000000000..1e5f153b6a
--- /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 0000000000..c8572a35fd
--- /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 0000000000..dfd6eef073
--- /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>&- || :
+ }
+ }
+}
+
+