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

SVN-Revision: 19880
This commit is contained in:
Felix Fietkau 2010-02-26 22:46:10 +00:00
parent 61c2b29295
commit 9be4598569
6 changed files with 176 additions and 0 deletions

View 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
}
}

View file

@ -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.

View file

@ -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))

View file

@ -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

View file

@ -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

View file

@ -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>&- || :
}
}
}