add block-extroot, a package for using an external filesystem as rootfs (patch by...
authorFelix Fietkau <nbd@openwrt.org>
Fri, 26 Feb 2010 22:46:10 +0000 (22:46 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 26 Feb 2010 22:46:10 +0000 (22:46 +0000)
SVN-Revision: 19880

package/base-files/files/lib/functions/boot.sh
package/block-extroot/Config.in [new file with mode: 0644]
package/block-extroot/Makefile [new file with mode: 0644]
package/block-extroot/files/50_determine_usb_root [new file with mode: 0644]
package/block-extroot/files/60_pivot_usb_root [new file with mode: 0644]
package/block-extroot/files/extmount.sh [new file with mode: 0644]

index 46b4613..8c8fa52 100644 (file)
@@ -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 (file)
index 0000000..dbf1041
--- /dev/null
@@ -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 (file)
index 0000000..1ae72f0
--- /dev/null
@@ -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 (file)
index 0000000..1e5f153
--- /dev/null
@@ -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 (file)
index 0000000..c8572a3
--- /dev/null
@@ -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 (file)
index 0000000..dfd6eef
--- /dev/null
@@ -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>&- || : 
+           }
+       }
+}
+
+