aboutsummaryrefslogtreecommitdiffstats
path: root/package/block-mount
diff options
context:
space:
mode:
Diffstat (limited to 'package/block-mount')
-rw-r--r--package/block-mount/Config.in17
-rw-r--r--package/block-mount/Makefile70
-rw-r--r--package/block-mount/files/10-swap78
-rw-r--r--package/block-mount/files/20-fsck83
-rw-r--r--package/block-mount/files/40-mount91
-rw-r--r--package/block-mount/files/50_determine_usb_root65
-rw-r--r--package/block-mount/files/55_determine_extroot_sysupgrade63
-rw-r--r--package/block-mount/files/60_pivot_usb_root27
-rw-r--r--package/block-mount/files/block.sh264
-rw-r--r--package/block-mount/files/extmount.sh37
-rw-r--r--package/block-mount/files/fsck.sh34
-rw-r--r--package/block-mount/files/fstab.config20
-rw-r--r--package/block-mount/files/fstab.init88
-rw-r--r--package/block-mount/files/mount.sh103
14 files changed, 1040 insertions, 0 deletions
diff --git a/package/block-mount/Config.in b/package/block-mount/Config.in
new file mode 100644
index 000000000..2fa10b668
--- /dev/null
+++ b/package/block-mount/Config.in
@@ -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-mount
+ 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-mount/Makefile b/package/block-mount/Makefile
new file mode 100644
index 000000000..799539e4b
--- /dev/null
+++ b/package/block-mount/Makefile
@@ -0,0 +1,70 @@
+#
+# Copyright (C) 2006-2012 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-mount
+PKG_VERSION:=0.2.0
+PKG_RELEASE:=9
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/block-mount/Default
+ SECTION:=base
+ CATEGORY:=Base system
+endef
+
+define Package/block-mount
+ $(call Package/block-mount/Default)
+ TITLE:=Block device mounting and checking
+ DEPENDS:= +blkid +swap-utils
+ MENU:=1
+endef
+
+define Package/block-mount/description
+ Scripts used to mount and check block devices (filesystems and swap), as well
+ as hotplug scripts to automount and check block devices when hotplug event (e.g.
+ from plugging in a device) occurs.
+ Also includes preinit scripts for mounting a block device as the root filesystem.
+ This allows one to have the root filesystem on devices other than the built in flash
+ device.
+endef
+
+define Package/block-mount/config
+ source "$(SOURCE)/Config.in"
+endef
+
+define Build/Compile
+endef
+
+define Package/block-mount/conffiles
+/etc/config/fstab
+endef
+
+define Package/block-mount/install
+ $(INSTALL_DIR) $(1)/etc/init.d
+ $(INSTALL_BIN) ./files/fstab.init $(1)/etc/init.d/fstab
+ $(INSTALL_DIR) $(1)/etc/config
+ $(INSTALL_DATA) ./files/fstab.config $(1)/etc/config/fstab
+ $(INSTALL_DIR) $(1)/lib/functions/fsck
+ $(INSTALL_DATA) ./files/mount.sh $(1)/lib/functions/
+ $(INSTALL_DATA) ./files/fsck.sh $(1)/lib/functions/
+ $(INSTALL_DATA) ./files/block.sh $(1)/lib/functions/
+ $(INSTALL_DIR) $(1)/etc/hotplug.d/block
+ $(INSTALL_DATA) ./files/10-swap $(1)/etc/hotplug.d/block/
+ $(INSTALL_DATA) ./files/20-fsck $(1)/etc/hotplug.d/block/
+ $(INSTALL_DATA) ./files/40-mount $(1)/etc/hotplug.d/block/
+ $(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/55_determine_extroot_sysupgrade $(1)/lib/preinit/
+ $(INSTALL_DATA) ./files/60_pivot_usb_root $(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-mount))
diff --git a/package/block-mount/files/10-swap b/package/block-mount/files/10-swap
new file mode 100644
index 000000000..2837d2763
--- /dev/null
+++ b/package/block-mount/files/10-swap
@@ -0,0 +1,78 @@
+#!/bin/sh
+# Copyright (C) 2009-2010 OpenWrt.org
+# Copyright (C) 2010 Vertical Communications
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+. /lib/functions/block.sh
+
+blkdev=`dirname $DEVPATH`
+
+if [ `basename $blkdev` != "block" ]; then
+
+ device=`basename $DEVPATH`
+
+
+ case "$ACTION" in
+ add)
+ local autoswap_from_fstab
+ local automount_from_fstab
+ local from_fstab
+ local anon_mount
+ local anon_swap
+ local anon_fsck
+ local mds_mount_device
+ local sds_swap_device
+ local sds_swap_enabled
+ local use_device
+ local do_swap=0
+
+ mount_dev_section_cb() {
+ mds_mount_device="$3"
+ }
+
+ swap_dev_section_cb() {
+ sds_swap_device="$2"
+ sds_swap_enabled="$3"
+ return 0
+ }
+
+ config_get_automount
+ automount_from_fstab="$from_fstab"
+
+ [ "$automount_from_fstab" -eq 1 ] && {
+ config_get_mount_section_by_device "/dev/$device"
+ }
+
+ # skip trying swap if this device is defined as a mount point
+ [ -z "$mds_mount_device" ] && {
+ config_get_autoswap
+ autoswap_from_fstab="$from_fstab"
+
+ [ "$autoswap_from_fstab" -eq 1 ] && {
+ config_get_swap_section_by_device "/dev/$device"
+ use_device="$sds_swap_device"
+ do_swap="$sds_swap_enabled"
+ }
+
+ [ -z "$use_device" ] && [ "$anon_swap" -eq 1 ] && {
+ use_device="/dev/$device" && do_swap=1
+ }
+ }
+
+ [ -n "$use_device" ] && [ "$do_swap" -eq 1 ] && {
+ grep -q "$use_device" /proc/swaps || grep -q "$use_device" /proc/mounts || {
+ swapon "$use_device"
+ }
+ }
+ reset_dev_section_cb
+ ;;
+ remove)
+ grep -q "/dev/$device" /proc/swaps && {
+ swapoff "/dev/$device"
+ }
+ ;;
+ esac
+fi
+
diff --git a/package/block-mount/files/20-fsck b/package/block-mount/files/20-fsck
new file mode 100644
index 000000000..c59e5abd7
--- /dev/null
+++ b/package/block-mount/files/20-fsck
@@ -0,0 +1,83 @@
+#!/bin/sh
+# Copyright (C) 2009-2010 OpenWrt.org
+# Copyright (C) 2010 Vertical Communications
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+. /lib/functions/block.sh
+. /lib/functions/fsck.sh
+
+blkdev=`dirname $DEVPATH`
+
+if [ `basename $blkdev` != "block" ]; then
+
+ device=`basename $DEVPATH`
+
+ case "$ACTION" in
+ add)
+ local from_fstab
+ local anon_mount
+ local anon_swap
+ local anon_fsck
+ local mds_mount_target
+ local mds_mount_device
+ local mds_mount_fstype
+ local mds_mount_enabled_fsck
+ local sds_swap_device
+ local use_device
+ local do_fsck=0
+ local fsck_type
+
+ local autoswap_from_fstab
+ local automount_from_fstab
+ local hotplug_blkid_fstype_match
+
+ mount_dev_section_cb() {
+ mds_mount_device="$3"
+ mds_mount_fstype="$4"
+ mds_mount_enabled_fsck="$7"
+ }
+
+ swap_dev_section_cb() {
+ sds_swap_device="$2"
+ return 0
+ }
+
+ config_get_automount
+ automount_from_fstab="$from_fstab"
+
+ [ "$automount_from_fstab" -eq 1 ] && {
+ config_get_mount_section_by_device "/dev/$device"
+ use_device="$mds_mount_device"
+ [ "$mds_mount_enabled_fsck" -eq 1 ] && {
+ do_fsck=1
+ fsck_type="$mds_mount_fstype"
+ }
+ }
+
+ [ -z "$use_device" ] && {
+ config_get_autoswap
+ autoswap_from_fstab="$from_fstab"
+
+ [ "$autoswap_from_fstab" -eq 1 ] && {
+ config_get_swap_section_by_device "/dev/$device"
+ use_device="$sds_swap_device" && do_fsck=0
+ }
+ }
+
+ grep -q "/dev/$device" /proc/swaps || grep -q "/dev/$device" /proc/mounts || {
+ [ "$anon_fsck" -eq 1 ] && [ -z "$use_device" ] && {
+ use_device="/dev/$device" && do_fsck=1 && mds_mount_fstype="" && hotplug_blkid_fstype_match=0
+ }
+ }
+
+ [ "$do_fsck" -eq 1 ] && {
+ libmount_fsck "$use_device" "$fsck_type" "$do_fsck"
+ }
+
+ reset_dev_section_cb
+ ;;
+ esac
+fi
+
diff --git a/package/block-mount/files/40-mount b/package/block-mount/files/40-mount
new file mode 100644
index 000000000..f1d63eba6
--- /dev/null
+++ b/package/block-mount/files/40-mount
@@ -0,0 +1,91 @@
+#!/bin/sh
+# Copyright (C) 2009-2012 OpenWrt.org
+# Copyright (C) 2010 Vertical Communications
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+. /lib/functions/block.sh
+
+blkdev=`dirname $DEVPATH`
+if [ `basename $blkdev` != "block" ]; then
+
+ device=`basename $DEVPATH`
+ mountpoint=`sed -ne "s|^[^ ]*/$device ||; T; s/ .*//p" /proc/self/mounts`
+
+ case "$ACTION" in
+ add)
+
+ local from_fstab
+ local anon_mount
+ local anon_swap
+ local anon_fsck
+ local mds_mount_target
+ local mds_mount_device
+ local mds_mount_fstype
+ local sds_swap_device
+ local use_device
+ local do_fsck=0
+ local fsck_type
+
+ local autoswap_from_fstab
+ local automount_from_fstab
+
+ mount_dev_section_cb() {
+ mds_mount_target="$2"
+ mds_mount_device="$3"
+ mds_mount_fstype="$4"
+ mds_mount_enabled="$6"
+ }
+
+ swap_dev_section_cb() {
+ sds_swap_device="$2"
+ return 0
+ }
+
+ config_get_automount
+ automount_from_fstab="$from_fstab"
+ [ "$automount_from_fstab" -eq 1 ] && {
+ config_get_mount_section_by_device "/dev/$device"
+ use_device="$mds_mount_device"
+ [ "$mds_mount_enabled" -eq 1 ] && {
+ if [ -n "$mds_mount_target" ]; then
+ grep -q "/dev/$device" /proc/swaps || grep -q "/dev/$device" /proc/mounts || {
+ ( mkdir -p "$mds_mount_target" && mount "$mds_mount_target" ) 2>&1 | tee /proc/self/fd/2 | logger -t 'fstab'
+ }
+ else
+ logger -t 'fstab' "Mount enabled for $mds_mount_device but it doesn't have a defined mountpoint (target)"
+ fi
+ }
+ }
+
+ [ -z "$use_device" ] && {
+ config_get_autoswap
+ autoswap_from_fstab="$from_fstab"
+
+ [ "$autoswap_from_fstab" -eq 1 ] && {
+ config_get_swap_section_by_device "/dev/$device"
+ use_device="$sds_swap_device"
+ }
+ }
+
+ grep -q "/dev/$device" /proc/swaps || grep -q "/dev/$device" /proc/mounts || {
+ [ "$anon_mount" -eq 1 -a -z "$use_device" ] && {
+ case "$device" in
+ mtdblock*) ;;
+ *)
+ ( mkdir -p /mnt/$device && mount /dev/$device /mnt/$device ) 2>&1 | tee /proc/self/fd/2 | logger -t 'fstab'
+ ;;
+ esac
+ }
+ }
+ reset_dev_section_cb
+ ;;
+ remove)
+ umount /dev/$device
+ umount $mountpoint
+ ;;
+ esac
+
+fi
+
diff --git a/package/block-mount/files/50_determine_usb_root b/package/block-mount/files/50_determine_usb_root
new file mode 100644
index 000000000..d39806266
--- /dev/null
+++ b/package/block-mount/files/50_determine_usb_root
@@ -0,0 +1,65 @@
+#!/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_external_root() {
+ pi_include /lib/functions/extmount.sh
+ pi_include /lib/functions/mount.sh
+
+ local OLD_UCI_CONFIG_DIR="$UCI_CONFIG_DIR"
+ local OLD_PATH="$PATH"
+ local OLD_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
+ 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" = "/tmp/overlay" ] && [ -r "/tmp/overlay/etc/config/fstab" ]; then
+ UCI_CONFIG_DIR="/tmp/overlay/etc/config"
+ ER_IS_SQUASHFS=true
+ ER_OVERLAY_PREFIX="/tmp/overlay"
+ PATH=$ER_OVERLAY_PREFIX/sbin:$PATH
+ LD_LIBRARY_PATH=$ER_OVERLAY_PREFIX/usr/lib:$LD_LIBRARY_PATH
+ export PATH LD_LIBRARY_PATH
+ 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
+ ER_OVERLAY_ROM="/no-extroot"
+
+ [ "$rootfs_found" = "1" ] && grep -q ' /overlay ' /proc/mounts && {
+ pi_extroot_mount_success=true
+ pi_mount_skip_next=false
+ ER_OVERLAY_ROM="/overlay"
+ }
+ [ "$rootfs_found" = "1" ] && grep -q ' /rom ' /proc/mounts && {
+ pi_extroot_mount_success=true
+ pi_mount_skip_next=false
+ ER_OVERLAY_ROM="/rom"
+ }
+ }
+ UCI_CONFIG_DIR="$OLD_UCI_CONFIG_DIR"
+ PATH="$OLD_PATH"
+ LD_LIBRARY_PATH="$OLD_LD_LIBRARY_PATH"
+ export PATH LD_LIBRARY_PATH
+}
+
+boot_hook_add preinit_mount_root determine_external_root
+
diff --git a/package/block-mount/files/55_determine_extroot_sysupgrade b/package/block-mount/files/55_determine_extroot_sysupgrade
new file mode 100644
index 000000000..b0cd9036c
--- /dev/null
+++ b/package/block-mount/files/55_determine_extroot_sysupgrade
@@ -0,0 +1,63 @@
+#!/bin/sh
+# Copyright (C) 2010 Daniel Dickinson
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+
+
+check_set_md5sum() {
+ local er_md5sum_file
+ er_md5sum_file="${ER_OVERLAY_PREFIX}/.extroot.md5sum"
+ local er_disabled
+ if [ "${ER_OVERLAY_ROM}" = "/rom" ]; then
+ er_disabled=/tmp/whole_root-disabled
+ else
+ er_disabled=/tmp${ER_OVERLAY_ROM}-disabled
+ fi
+
+ local er_extroot_md5sum
+ if [ -f $md5sum_file ]; then
+ er_extroot_md5sum="$(cat $er_md5sum_file)"
+ fi
+
+ local er_overlay_file="${ER_OVERLAY_ROM}/etc/extroot.md5sum"
+
+ local er_extroot_overlay_md5sum
+ if [ -f "$er_overlay_file" ]; then
+ er_extroot_overlay_md5sum="$(cat $er_overlay_file)"
+ fi
+
+ if [ -z "$er_extroot_overlay_md5sum" ]; then
+ cat $er_md5sum_file >$er_overlay_file
+ elif [ "$er_extroot_overlay_md5sum" != "$er_extroot_md5sum" ]; then
+ pi_extroot_mount_success="false"
+ mkdir -p $er_disabled
+ mount --move ${ER_OVERLAY_ROM} $er_disabled
+ fi
+}
+
+set_jffs_md5sum() {
+ # We do this anytime block-extroot exists, even on the first boot with
+ # no extroot defined.
+
+ local er_md5sum_file
+ er_md5sum_file="${ER_OVERLAY_PREFIX}/.extroot.md5sum"
+
+ local er_extroot_md5sum
+ if [ -f $er_md5sum_file ]; then
+ er_extroot_md5sum="$(cat $er_md5sum_file)"
+ fi
+ if [ -z "$er_extroot_md5sum" ]; then
+ dd if=/dev/urandom count=32 bs=1k 2>/dev/null | md5sum | cut -f1 -d\ >$er_md5sum_file
+ fi
+}
+
+determine_extroot_sysupgrade() {
+ check_skip || set_jffs_md5sum
+
+ check_skip || [ "$pi_extroot_mount_success" != "true" ] || {
+ check_set_md5sum
+ }
+}
+
+boot_hook_add preinit_mount_root determine_extroot_sysupgrade
+
diff --git a/package/block-mount/files/60_pivot_usb_root b/package/block-mount/files/60_pivot_usb_root
new file mode 100644
index 000000000..b610a4ade
--- /dev/null
+++ b/package/block-mount/files/60_pivot_usb_root
@@ -0,0 +1,27 @@
+#!/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_OVERLAY_ROM" = "/overlay" ]; then
+ if [ "$ER_IS_SQUASHFS" = "true" ]; then
+ umount /tmp/overlay
+ fi
+ mount -o remount,ro / && fopivot /overlay /rom && pi_mount_skip_next=true
+ elif [ "$ER_OVERLAY_ROM" = "/rom" ]; then
+ if [ "$ER_IS_SQUASHFS" = "true" ]; then
+ umount /tmp/overlay
+ fi
+ mount -o remount,ro / && pivot_rom /rom /rom && pi_mount_skip_next=true
+ fi
+ }
+}
+
+boot_hook_add preinit_mount_root external_root_pivot
+
diff --git a/package/block-mount/files/block.sh b/package/block-mount/files/block.sh
new file mode 100644
index 000000000..2b679a8e8
--- /dev/null
+++ b/package/block-mount/files/block.sh
@@ -0,0 +1,264 @@
+#!/bin/sh
+# Copyright 2010 Vertical Communications
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+. /lib/functions.sh
+
+reset_block_cb() {
+ mount_cb() {
+ dmc_mount_cfg="$1"
+ shift # skip optional param
+ dmc_target="$2"
+ dmc_mount_device="$3"
+ dmc_fstype="$4"
+ dmc_options="$5"
+ dmc_enabled="$6"
+ dmc_enabled_fsck="$7"
+ dmc_uuid="$8"
+ dmc_label="$9"
+ shift
+ dmc_is_rootfs="$9"
+ return 0
+ }
+ swap_cb() {
+ dsc_swap_cfg="$1"
+ shift # skip optional param
+ dsc_swap_device="$2"
+ dsc_enabled="$3"
+ dsc_uuid="$4"
+ dsc_label="$5"
+ return 0
+ }
+}
+reset_block_cb
+
+reset_dev_section_cb() {
+ mount_dev_section_cb() {
+ dmds_mount_cfg="$1"
+ dmds_mount_target="$2"
+ dmds_mount_device="$3"
+ dmds_mount_fstype="$4"
+ dmds_mount_options="$5"
+ dmds_mount_enabled="$6"
+ dmds_mount_enabled_fsck="$7"
+ dmds_mount_uuid="$8"
+ dmds_mount_label="$9"
+ shift
+ dmds_is_rootfs="$9"
+ return 0
+ }
+ swap_dev_section_cb() {
+ dsds_swap_cfg="$1"
+ dsds_swap_device="$2"
+ dsds_swap_enabled="$3"
+ dsds_swap_uuid="$4"
+ dsds_swap_label="$5"
+ return 0
+ }
+}
+reset_dev_section_cb
+
+config_get_mount() {
+ local gm_cfg="$1"
+ local gm_param="$2"
+ local gm_target
+ local gm_device
+ local gm_fstype
+ local gm_options
+ local gm_enabled
+ local gm_enabled_fsck
+ local gm_uuid
+ local gm_label
+ local gm_is_rootfs
+ config_get gm_target "$1" target
+ config_get gm_device "$1" device
+ config_get gm_fstype "$1" fstype 'auto'
+ config_get gm_options "$1" options 'rw'
+ config_get_bool gm_enabled "$1" enabled 1
+ config_get_bool gm_enabled_fsck "$1" enabled_fsck 0
+ 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_swap() {
+ local gs_cfg="$1"
+ local gs_param="$2"
+ local gs_device
+ local gs_enabled
+ local gs_uuid
+ local gs_label
+ config_get gs_device "$1" device
+ config_get_bool gs_enabled "$1" enabled 1
+ config_get gs_uuid "$1" uuid
+ config_get gs_label "$1" label
+
+ swap_cb "$gs_cfg" "$gs_param" "$gs_device" "$gs_enabled" "$gs_uuid" "$gs_label"
+}
+
+config_get_automount() {
+ config_load fstab
+ config_get_bool from_fstab "automount" from_fstab 1
+ config_get_bool anon_mount "automount" anon_mount 1
+ config_get_bool anon_fsck "automount" anon_fsck 0
+}
+
+config_get_autoswap() {
+ config_load fstab
+ config_get_bool from_fstab "autoswap" from_fstab 1
+ config_get_bool anon_swap "autoswap" anon_swap 0
+}
+
+config_create_swap_fstab_entry() {
+ local device="$1"
+ local enabled="$2"
+
+ [ -n "$device" ] || return 0
+
+ local fstabnew
+
+ mkdir -p /var/lock
+ lock /var/lock/fstab.lck
+ fstabnew="$(mktemp -t '.fstab.XXXXXXXX')"
+ cat /tmp/fstab | grep -E -v "^$device[[:blank:]]" >>"$fstabnew"
+ [ "$enabled" -eq 1 ] && echo "$device none swap sw 0 0" >> "$fstabnew"
+ cat "$fstabnew" >/tmp/fstab
+ rm -f $fstabnew
+ lock -u /var/lock/fstab.lck
+}
+
+config_create_mount_fstab_entry() {
+ local device="$1"
+ local target="$2"
+ local fstype="$3"
+ local options="$4"
+ local enabled="$5"
+ options="${options:-rw}"
+ [ "$enabled" -eq 0 ] && options="noauto,$options"
+ [ -n "$target" ] || return 0
+ [ -n "$device" ] || return 0
+
+ local fstabnew
+
+ mkdir -p /var/lock
+ lock /var/lock/fstab.lck
+ fstabnew="$(mktemp -t '.fstab.XXXXXXXX')"
+ cat /tmp/fstab | grep -E -v "^$device[[:blank:]]" | grep -v "$target" >>"$fstabnew"
+ echo "$device $target $fstype $options 0 0" >>"$fstabnew"
+ cat "$fstabnew" >/tmp/fstab
+ rm -f $fstabnew
+ lock -u /var/lock/fstab.lck
+}
+
+libmount_find_token() {
+ local token="$1"
+ local value="$2"
+ local device
+ device="$(blkid -w /dev/null -c /dev/null | grep "$token=\"$value\"" | cut -f1 -d:)"
+ echo "$device"
+}
+
+libmount_find_device_by_id() {
+ local uuid="$1"
+ local label="$2"
+ local device="$3"
+ local cfg_device="$4"
+ local found_device
+
+ if [ -n "$uuid" ]; then
+ found_device="$(libmount_find_token "UUID" "$uuid")"
+ elif [ -n "$label" ]; then
+ found_device="$(libmount_find_token "LABEL" "$label")"
+ elif [ "$device" = "$cfg_device" ]; then
+ found_device="$device"
+ elif [ -z "$device" ] && [ -e "$cfg_device" ]; then
+ found_device="$cfg_device"
+ fi
+ [ -n "$device" ] && [ "$device" != "$found_device" ] && {
+ found_device=""
+ }
+ echo "$found_device"
+}
+
+config_get_mount_section_by_device() {
+ local msbd_device="$1"
+ local msbd_mount_cfg=
+ local msbd_target=
+ local msbd_mount_device=
+ local msbd_fstype=
+ local msbd_options=
+ local msbd_enabled=
+ local msbd_enabled_fsck=
+ local msbd_uuid=
+ local msbd_label=
+ local msbd_is_rootfs
+ local msbd_blkid_fstype_match=
+ mount_cb() {
+ local mc_cfg="$1"
+ local mc_device="$2"
+ shift
+ local mc_target="$2"
+ local mc_cfgdevice="$3"
+ local mc_fstype="$4"
+ local mc_uuid="$8"
+ local mc_label="$9"
+ shift
+ local mc_is_rootfs="$9"
+ local mc_found_device=""
+
+ mc_found_device="$(libmount_find_device_by_id "$mc_uuid" "$mc_label" "$mc_device" "$mc_cfgdevice")"
+ if [ -n "$mc_found_device" ]; then
+ msbd_mount_cfg="$mc_cfg"
+ msbd_target="$mc_target"
+ msbd_mount_device="$mc_found_device"
+ msbd_fstype="$mc_fstype"
+ msbd_options="$4"
+ msbd_enabled="$5"
+ msbd_enabled_fsck="$6"
+ msbd_uuid="$7"
+ msbd_label="$8"
+ msbd_is_rootfs="$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"
+ reset_block_cb
+}
+
+config_get_swap_section_by_device() {
+ local ssbd_device="$1"
+ local ssbd_swap_cfg=
+ local ssbd_swap_device=
+ local ssbd_enabled=
+ local ssbd_uuid=
+ local ssbd_label=
+ swap_cb() {
+ local sc_cfg="$1"
+ local sc_device="$2"
+ local sc_uuid="$5"
+ local sc_label="$6"
+ local sc_cfgdevice="$3"
+ local sc_found_device
+
+ sc_found_device="$(libmount_find_device_by_id "$sc_uuid" "$sc_label" "$sc_device" "$sc_cfgdevice")"
+ if [ -n "$sc_found_device" ]; then
+ ssbd_swap_cfg="$sc_cfg"
+ ssbd_swap_device="$sc_found_device"
+ ssbd_enabled="$4"
+ ssbd_uuid="$5"
+ ssbd_label="$6"
+ fi
+ return 0
+ }
+ config_foreach config_get_swap swap "$ssbd_device"
+ [ -n "$ssbd_swap_device" ] && config_create_swap_fstab_entry "$ssbd_swap_device" "$ssbd_enabled"
+ swap_dev_section_cb "$ssbd_swap_cfg" "$ssbd_swap_device" "$ssbd_enabled" "$ssbd_uuid" "$ssbd_label"
+ reset_block_cb
+}
+
+
diff --git a/package/block-mount/files/extmount.sh b/package/block-mount/files/extmount.sh
new file mode 100644
index 000000000..d6387cc58
--- /dev/null
+++ b/package/block-mount/files/extmount.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+# Copyright (C) 2006-2011 OpenWrt.org
+# Copyright (C) 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() {
+ mkdir -p /tmp/extroot_modules/modules.d
+ mkdir -p /tmp/extroot_modules/modules
+ cp -L /etc/modules-boot.d/* /tmp/overlay/etc/modules-boot.d/* /tmp/extroot_modules/modules.d
+ ln -sf /lib/modules/*/* /tmp/overlay/lib/modules/*/* /tmp/extroot_modules/modules
+ local modules="$(cat /tmp/extroot_modules/modules.d/* 2>/dev/null)"
+ cd /tmp/extroot_modules/modules && [ -n "$modules" ] && {
+ echo "$modules" | sed -e 's/^\([^#].*\)/insmod \.\/\1.ko/'| sh 2>&- || :
+ }
+ rm -rf /tmp/extroot_modules
+}
+
+pivot_rom() { # <new_root> <old_root>
+ mount -o move /proc $1/proc && \
+ pivot_root $1 $1$2 && {
+ mount -o move $2/dev /dev
+ mount -o move $2/tmp /tmp
+ mount -o move $2/sys /sys 2>&-
+ return 0
+ }
+}
+
diff --git a/package/block-mount/files/fsck.sh b/package/block-mount/files/fsck.sh
new file mode 100644
index 000000000..3011160a4
--- /dev/null
+++ b/package/block-mount/files/fsck.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+# Copyright 2010 Vertical Communications
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+libmount_fsck() {
+ local device="$1"
+ local fsck_fstype="$2"
+ local fsck_enabled="$3"
+ local known_type
+ local found_fsck=0
+
+
+ grep -q "$device" /proc/swaps || grep -q "$device" /proc/mounts || {
+ [ -e "$device" ] && [ "$fsck_enabled" -eq 1 ] && {
+ for known_type in $libmount_known_fsck; do
+ if [ "$known_type" = "$fsck_fstype" ]; then
+ fsck_${known_type} "$device"
+ found_fsck=1
+ break
+ fi
+ done
+ if [ "$found_fsck" -ne 1 ]; then
+ logger -t 'fstab' "Unable to check/repair $device; no known fsck for filesystem type $fstype"
+ fi
+ }
+ }
+}
+
+libmount_known_fsck=""
+
+pi_include /lib/functions/fsck
+
diff --git a/package/block-mount/files/fstab.config b/package/block-mount/files/fstab.config
new file mode 100644
index 000000000..de52e20ce
--- /dev/null
+++ b/package/block-mount/files/fstab.config
@@ -0,0 +1,20 @@
+config global automount
+ option from_fstab 1
+ option anon_mount 1
+
+config global autoswap
+ option from_fstab 1
+ option anon_swap 0
+
+config mount
+ option target /home
+ option device /dev/sda1
+ option fstype ext4
+ option options rw,sync
+ option enabled 0
+ option enabled_fsck 0
+
+config swap
+ option device /dev/sda2
+ option enabled 0
+
diff --git a/package/block-mount/files/fstab.init b/package/block-mount/files/fstab.init
new file mode 100644
index 000000000..f54051ebb
--- /dev/null
+++ b/package/block-mount/files/fstab.init
@@ -0,0 +1,88 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2007 OpenWrt.org
+# Copyright (C) 2010 Vertical Communications
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+
+START=20
+
+EXTRA_COMMANDS="overlay_enable whole_root_enable"
+EXTRA_HELP=" overlay_enable Reenable overlay rootfs. (After you fix it).
+ whole_root_enable Reenable whole-disk rootfs. (After you fix it)."
+
+rootfs_enable() {
+ local extroot_type="$1"
+
+ if [ ! -d /tmp/${extroot_type}-disabled ]; then
+ echo "No disabled ${extroot_type} present (/tmp/${extroot_type}-disabled). Can't renable."
+ exit 1
+ fi
+
+ rm -f /tmp/${extroot_type}-disabled/.extroot.md5sum
+ rm -f /tmp/${extroot_type}-disabled/etc/extroot.md5sum
+ echo "Please reboot router to complete re-enabling external rootfs."
+}
+
+overlay_enable() {
+ rootfs_enable overlay
+}
+
+whole_root_enable() {
+ rootfs_enable whole_root
+}
+
+do_mount() {
+ local cfg="$1"
+ config_mount_by_section "$cfg"
+}
+
+do_swapon() {
+ local cfg="$1"
+ config_swapon_by_section "$cfg"
+}
+
+do_unmount() {
+ local cfg="$1"
+
+ config_get target "$cfg" target
+ config_get_bool enabled "$cfg" "enabled" '1'
+ [ -n "$target" -a "$enabled" -gt 0 ] || return 0
+ umount $target
+}
+
+do_swapoff() {
+ local cfg="$1"
+
+ config_get device "$cfg" device
+ config_get_bool enabled "$cfg" "enabled" '1'
+ [ -n "$device" -a "$enabled" -gt 0 ] && type swapoff >/dev/null || return 0
+ swapoff $device
+}
+
+start() {
+ . /lib/functions/mount.sh
+
+ config_load fstab
+ mkdir -p /var/lock
+ lock /var/lock/fstab.lck
+ [ -e /tmp/fstab ] || {
+ echo '# WARNING: this is an auto generated file, please use uci to set defined filesystems' > /tmp/fstab
+ }
+ lock -u /var/lock/fstab.lck
+ config_foreach do_swapon swap
+ config_foreach do_mount mount
+ config_foreach do_swapon swap # do swap a second time so that swap on filesystems is enabled
+}
+
+stop() {
+ . /lib/functions/mount.sh
+
+ config_load fstab
+ config_foreach do_unmount mount
+ config_foreach do_swapoff swap
+ swapoff -a
+}
+
+
diff --git a/package/block-mount/files/mount.sh b/package/block-mount/files/mount.sh
new file mode 100644
index 000000000..e96174ce9
--- /dev/null
+++ b/package/block-mount/files/mount.sh
@@ -0,0 +1,103 @@
+#!/bin/sh
+# Copyright 2010 Vertical Communications
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+
+pi_include /lib/functions/block.sh
+pi_include /lib/functions/fsck.sh
+
+config_mount_by_section() {
+ local cfg="$1"
+ local find_rootfs="$2"
+
+ mount_cb() {
+ local cfg="$1"
+ local device="$2"
+ shift
+ local target="$2"
+ local cfgdevice="$3"
+ local fstype="$4"
+ local options="$5"
+ local enabled="$6"
+ local enabled_fsck="$7"
+ local uuid="$8"
+ local label="$9"
+ shift
+ local is_rootfs="$9"
+ shift
+ local found_device=""
+
+ found_device="$(libmount_find_device_by_id "$uuid" "$label" "$device" "$cfgdevice")"
+ if [ -n "$found_device" ]; then
+ if [ "$find_rootfs" != "1" ] || ( [ "$is_rootfs" -eq 1 ] || [ "$target" = "/" ] || [ "$target" = "/overlay" ] ); then
+ [ "$enabled_fsck" -eq 1 ] && {
+ grep -q "$found_device" /proc/swaps || grep -q "$found_device" /proc/mounts || {
+ libmount_fsck "$found_device" "$fstype" "$enabled_fsck"
+ }
+ }
+
+ if [ "$find_rootfs" = "1" ]; then
+ if [ "$is_rootfs" -eq 1 ]; then
+ target=/overlay
+ elif [ "$target" = "/" ]; then
+ target=/rom
+ fi
+ else
+ if [ "$is_rootfs" -eq 1 ] || [ "$target" = "/overlay" ]; then
+ target=/tmp/overlay-disabled
+ elif [ "$target" = "/" ] || [ "$target" = "/rom" ]; then
+ target="/tmp/whole_root-disabled"
+ fi
+ fi
+
+ config_create_mount_fstab_entry "$found_device" "$target" "$fstype" "$options" "$enabled"
+ grep -q "$found_device" /proc/swaps || grep -q "$found_device" /proc/mounts || {
+ [ "$enabled" -eq 1 ] && mkdir -p "$target" && mount "$target" 2>&1 | tee /proc/self/fd/2 | logger -t 'fstab'
+ }
+
+ fi
+ fi
+ [ "$find_rootfs" = "1" ] && {
+ [ "$target" = "/overlay" ] && {
+ rootfs_found=1
+ }
+ [ "$target" = "/rom" ] && {
+ rootfs_found=1
+ }
+ }
+ return 0
+ }
+ config_get_mount "$cfg"
+ reset_block_cb
+}
+
+config_swapon_by_section() {
+ local cfg="$1"
+
+ swap_cb() {
+ local cfg="$1"
+ local device="$2"
+ local cfgdevice="$3"
+ local enabled="$4"
+ local uuid="$5"
+ local label="$6"
+ local uuid
+ local label
+
+ local found_device=""
+
+ found_device="$(libmount_find_device_by_id "$uuid" "$label" "$device" "$cfgdevice")"
+
+ if [ -n "$found_device" ]; then
+ config_create_swap_fstab_entry "$found_device" "$enabled"
+ grep -q "$found_device" /proc/swaps || grep -q "$found_device" /proc/mounts || {
+ [ "$enabled" -eq 1 ] && swapon "$found_device" | tee /proc/self/fd/2 | logger -t 'fstab'
+ }
+ fi
+ return 0
+ }
+ config_get_swap "$cfg"
+ reset_block_cb
+}