summaryrefslogtreecommitdiff
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/Makefile36
-rw-r--r--package/block-mount/files/50_determine_usb_root57
-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/extmount.sh36
6 files changed, 220 insertions, 16 deletions
diff --git a/package/block-mount/Config.in b/package/block-mount/Config.in
new file mode 100644
index 0000000..2fa10b6
--- /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
index 267a200..05ca086 100644
--- a/package/block-mount/Makefile
+++ b/package/block-mount/Makefile
@@ -8,8 +8,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=block-mount
-PKG_VERSION:=0.1.0
-PKG_RELEASE:=3
+PKG_VERSION:=0.2.0
+PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
@@ -22,20 +22,20 @@ 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)
+ 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-hotplug
- $(call Package/block-mount/Default)
- TITLE:=Automount and autocheck block devices
- DEPENDS:=+block-mount +hotplug2
-endef
-
-define Package/block-hotplug/description
- Scripts used to automatically check and mount filesystem and/or swap
+define Package/block-mount/config
+ source "$(SOURCE)/Config.in"
endef
define Build/Compile
@@ -54,15 +54,19 @@ define Package/block-mount/install
$(INSTALL_DATA) ./files/mount.sh $(1)/lib/functions/
$(INSTALL_DATA) ./files/fsck.sh $(1)/lib/functions/
$(INSTALL_DATA) ./files/block.sh $(1)/lib/functions/
-endef
-
-define Package/block-hotplug/install
$(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_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/55_determine_extroot_sysupgrade $(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-mount))
-$(eval $(call BuildPackage,block-hotplug))
-
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 0000000..8c5841e
--- /dev/null
+++ b/package/block-mount/files/50_determine_usb_root
@@ -0,0 +1,57 @@
+#!/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"
+ 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"
+ 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"
+}
+
+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 0000000..b0cd903
--- /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 0000000..b610a4a
--- /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/extmount.sh b/package/block-mount/files/extmount.sh
new file mode 100644
index 0000000..44d662e
--- /dev/null
+++ b/package/block-mount/files/extmount.sh
@@ -0,0 +1,36 @@
+#!/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() {
+ mkdir -p /tmp/extroot_modules/modules.d
+ mkdir -p /tmp/extroot_modules/modules
+ ln -sf /etc/modules.d/* /tmp/overlay/etc/modules.d/* /tmp/extroot_modules/modules.d
+ ln -sf /lib/modules/*/* /tmp/overlay/lib/modules/*/* /tmp/extroot_modules/modules
+ local modules="$(grep -l '# May be required for rootfs' /tmp/extroot_modules/modules.d/* 2>/dev/null)"
+ cd /tmp/extroot_modules/modules && [ -n "$modules" ] && {
+ cat $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
+ }
+}
+