SVN-Revision: 19880master
parent
61c2b29295
commit
9be4598569
@ -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. |
||||||
|
|
||||||
|
|
@ -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)) |
||||||
|
|
@ -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 |
||||||
|
|
@ -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 |
||||||
|
|
@ -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>&- || : |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
Loading…
Reference in new issue