Hi, Neat... It would be *VERY* nice to be able to do the same thing with one or *TWO* MMC cards since they can be easily kludged onto a few GPIO pins. Maybe your patch already supports this?
Wiz On Fri, 9 Apr 2010, Quentin Armitage wrote: > The block-extroot package adds the capability for preinit to mount /overlay > on an external USB device. The attached patch extends > the capability to allow /overlay to be mounted on a sub-directory of the > external USB device. > > I can see two uses for this: > 1. I want to be able to use the USB device for other purposes as well, and > this keeps all the files in one place on the USB device > 2. I can have multiple difference configurations on the USB device, and > select which one to boot through UCI configuration. > > The option is configured through /etc/config/fstab, with an extra option, > rootfs_subdir, which is the sub-directory relative to the > root of the USB device. For example: > option rootfs_subdir /openwrt > would mount /overlay on the /openwrt sub-directory of the USB device. The > patch to /lib/functions/block.sh are purely to support this > additional option. > > The patch also adds one extra level of searching for /etc/config/fstab, > adding a first choice option of looking on the USB device, > and if the file does not exist there, then tries > /tmp/overlay/etc/config/fstab (i.e. the internal flash jffs2 fs) and lastly > the > /etc/config/fstab on the squashfs filesystem. This allows the configuration > to be managed entirely on the USB device, without touching > the internal flash, other than the initial setup of the internal > /etc/config/fstab to enable the external rootfs. > > The patch has been done like this, rather than modifying > /lib/preinit/50-determine_usb_root, so that it works in conjunction with > the patch I submitted yesterday for kexec'ing a new kernel from the USB > device during the preinit process. > > Signed-off-by: Quentin Armitage <quen...@armitage.org.uk> > > Index: package/block-extroot-subdir/files/52_usb_root_subdir > =================================================================== > --- package/block-extroot-subdir/files/52_usb_root_subdir (revision 0) > +++ package/block-extroot-subdir/files/52_usb_root_subdir (revision 0) > @@ -0,0 +1,79 @@ > +#!/bin/sh > +# Copyright (C) 2010 OpenWrt.org > + > +# This is free software, licensed under the GNU General Public License v2. > +# > +# /etc/config/fstab configures this script. It requires that the extroot > mount > +# was successful, and uses /overlay that it mounted. > +# > +#Example config: > +#config mount > +# option enabled 1 > +# option is_rootfs 1 > +# option rootfs_subdir /usbroot > +# > +# This will remount /overlay/$rootfs_subdir on /overlay > + > +. /etc/functions.sh > +. /lib/functions/block.sh > + > +config_fstab_extroot() { > + local cfg="$1" > + local find_rootfs="$2" > + > + mount_cb() { > + shift > + local enabled="$6" > + shift > + local is_rootfs="$9" > + shift > + local rootfs_subdir="$9" > + > + if [ "$is_rootfs" = "1" ]; then > + extroot_enabled="$enabled" > + extroot_subdir="$rootfs_subdir" > + fi > + } > + config_get_mount "$cfg" > + reset_block_cb > +} > + > +check_extroot_enabled_or_subdir() { > + local OLD_UCI_CONFIG_DIR="$UCI_CONFIG_DIR" > + > + [ "$pi_extroot_mount_success" = "true" ] || return 0 > + > + # If the extroot (mounted on /overlay) has a config, use it, otherwise > + # try jffs2 overlay > + if [ -r "/overlay/etc/config/fstab" ]; then > + UCI_CONFIG_DIR=/overlay/etc/config > + elif [ "$jffs" = "/tmp/overlay" ] && [ -r > "/tmp/overlay/etc/config/fstab" ]; then > + UCI_CONFIG_DIR=/tmp/overlay/etc/config > + fi > + > + extroot_enabled=0 > + extroot_subdir= > + > + config_load fstab > + config_foreach config_fstab_extroot mount 1 > + > + # check we want this enabled > + if [ "$extroot_enabled" = "0" ]; then > + # No > + pi_extroot_mount_success=false > + umount /overlay > + pi_mount_skip_next="$pi_pre_extroot_skip_next" > + pi_extroot_mount_success=0 > + else > + [ -n "$extroot_subdir" ] && [ -d /overlay/"$extroot_subdir" ] && > + mkdir -p /tmp/overlay1 && \ > + mount --bind /overlay/"$extroot_subdir" /tmp/overlay1 > && \ > + umount /overlay && \ > + mount --move /tmp/overlay1 /overlay > + fi > + > + UCI_CONFIG_DIR="$OLD_UCI_CONFIG_DIR" > + return 0 > +} > + > +boot_hook_add preinit_mount_root check_extroot_enabled_or_subdir > Index: package/block-extroot-subdir/files/49_save_skip_next > =================================================================== > --- package/block-extroot-subdir/files/49_save_skip_next (revision 0) > +++ package/block-extroot-subdir/files/49_save_skip_next (revision 0) > @@ -0,0 +1,12 @@ > +#!/bin/sh > +# Copyright (C) 2010 OpenWrt.org > + > +# This is free software, licensed under the GNU General Public License v2. > +# > +# Saves pi_mount_skip_next > + > +save_mount_skip_next() { > + pi_pre_extroot_skip_next="$pi_mount_skip_next" > +} > + > +boot_hook_add preinit_mount_root save_mount_skip_next > Index: package/block-extroot-subdir/Makefile > =================================================================== > --- package/block-extroot-subdir/Makefile (revision 0) > +++ package/block-extroot-subdir/Makefile (revision 0) > @@ -0,0 +1,54 @@ > +# > +# Copyright (C) 2010 OpenWrt.org > +# > +# This is free software, licensed under the GNU General Public License v2. > +# > + > +include $(TOPDIR)/rules.mk > + > +PKG_NAME:=block-extroot-subdir > +PKG_VERSION:=0.0.1 > +PKG_RELEASE:=1 > + > +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) > + > +include $(INCLUDE_DIR)/package.mk > + > +define Package/block-extroot-subdir/Default > + SECTION:=utils > + CATEGORY:=Utilities > + TITLE:=root filesystem on secondary storage subdir > + SUBMENU:=disc > +endef > + > +define Package/block-extroot-subdir > + $(call Package/block-extroot-subdir/Default) > + MENU:=1 > + DEPENDS:=+block-extroot > +endef > + > +define Package/block-extroot-subdir/description > + Based on the moduluarized preinit and firstboot, adds the option to have > + the root filesystem on a subdirectory 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-subdir/install > + $(INSTALL_DIR) $(1)/lib/preinit > + $(INSTALL_DATA) ./files/49_save_skip_next $(1)/lib/preinit/ > + $(INSTALL_DATA) ./files/52_usb_root_subdir $(1)/lib/preinit/ > +endef > + > +$(eval $(call BuildPackage,block-extroot-subdir)) > + > Index: package/block-mount/files/block.sh > =================================================================== > --- package/block-mount/files/block.sh (revision 20584) > +++ package/block-mount/files/block.sh (working copy) > @@ -20,6 +20,8 @@ > dmc_label="$9" > shift > dmc_is_rootfs="$9" > + shift > + dmc_rootfs_subdir="$9" > return 0 > } > swap_cb() { > @@ -47,6 +49,8 @@ > dmds_mount_label="$9" > shift > dmds_is_rootfs="$9" > + shift > + dmds_rootfs_subdir="$9" > return 0 > } > swap_dev_section_cb() { > @@ -81,7 +85,8 @@ > config_get gm_uuid "$1" uuid > config_get gm_label "$1" label > config_get_bool gm_is_rootfs "$1" is_rootfs 0 > - mount_cb "$gm_cfg" "$gm_param" "$gm_target" "$gm_device" "$gm_fstype" > "$gm_options" "$gm_enabled" "$gm_enabled_fsck" "$gm_uuid" "$gm_label" > "$gm_is_rootfs" > + config_get gm_rootfs_subdir "$1" rootfs_subdir > + mount_cb "$gm_cfg" "$gm_param" "$gm_target" "$gm_device" "$gm_fstype" > "$gm_options" "$gm_enabled" "$gm_enabled_fsck" "$gm_uuid" "$gm_label" > "$gm_is_rootfs" "$gm_rootfs_subdir" > } > > config_get_swap() { > @@ -193,6 +198,7 @@ > local msbd_uuid= > local msbd_label= > local msbd_is_rootfs > + local msbd_rootfs_subdir > local msbd_blkid_fstype_match= > mount_cb() { > local mc_cfg="$1" > @@ -205,6 +211,8 @@ > local mc_label="$9" > shift > local mc_is_rootfs="$9" > + shift > + local mc_rootfs_subdir="$9" > local mc_found_device="" > > mc_found_device="$(libmount_find_device_by_id "$mc_uuid" > "$mc_label" "$mc_device" "$mc_cfgdevice")" > @@ -219,12 +227,14 @@ > msbd_uuid="$7" > msbd_label="$8" > msbd_is_rootfs="$9" > + shift > + msbd_rootfs_subdir="$9" > fi > return 0 > } > config_foreach config_get_mount mount "$msbd_device" > [ -n "$msbd_mount_device" ] && config_create_mount_fstab_entry > "$msbd_mount_device" "$msbd_target" "$msbd_fstype" "$msbd_options" > "$msbd_enabled" > - mount_dev_section_cb "$msbd_mount_cfg" "$msbd_target" > "$msbd_mount_device" "$msbd_fstype" "$msbd_options" "$msbd_enabled" > "$msbd_enabled_fsck" "$msbd_uuid" "$msbd_label" "$msbd_is_rootfs" > + mount_dev_section_cb "$msbd_mount_cfg" "$msbd_target" > "$msbd_mount_device" "$msbd_fstype" "$msbd_options" "$msbd_enabled" > "$msbd_enabled_fsck" "$msbd_uuid" "$msbd_label" "$msbd_is_rootfs" > "$msbd_rootfs_subdir" > reset_block_cb > } > > > > _______________________________________________ > openwrt-devel mailing list > openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/mailman/listinfo/openwrt-devel > _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel