From 61b361248337b622b560ce1116eca4af7d5322a2 Mon Sep 17 00:00:00 2001 From: nbd Date: Fri, 26 Feb 2010 22:46:10 +0000 Subject: add block-extroot, a package for using an external filesystem as rootfs (patch by cshore) git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19880 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/block-extroot/files/50_determine_usb_root | 50 +++++++++++++++++++++++ package/block-extroot/files/60_pivot_usb_root | 20 +++++++++ package/block-extroot/files/extmount.sh | 24 +++++++++++ 3 files changed, 94 insertions(+) create mode 100644 package/block-extroot/files/50_determine_usb_root create mode 100644 package/block-extroot/files/60_pivot_usb_root create mode 100644 package/block-extroot/files/extmount.sh (limited to 'package/block-extroot/files') 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>&- || : + } + } +} + + -- cgit v1.2.3