diff options
Diffstat (limited to 'package/block-mount')
-rw-r--r-- | package/block-mount/Config.in | 17 | ||||
-rw-r--r-- | package/block-mount/Makefile | 36 | ||||
-rw-r--r-- | package/block-mount/files/50_determine_usb_root | 57 | ||||
-rw-r--r-- | package/block-mount/files/55_determine_extroot_sysupgrade | 63 | ||||
-rw-r--r-- | package/block-mount/files/60_pivot_usb_root | 27 | ||||
-rw-r--r-- | package/block-mount/files/extmount.sh | 36 |
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 + } +} + |