From: Daniel Dickinson Date: Sun, 27 Mar 2011 06:40:51 +0000 (+0000) Subject: block-mount: Merged block-mount, block-extroot, and block-hotplug into a single binar... X-Git-Tag: reboot~17119 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=7f8fb5cb78a9964bcf2e5fc5305c25dec36304ad;p=oweals%2Fopenwrt.git block-mount: Merged block-mount, block-extroot, and block-hotplug into a single binary package called block-mount. SVN-Revision: 26314 --- diff --git a/package/block-extroot/Config.in b/package/block-extroot/Config.in deleted file mode 100644 index dbf1041c15..0000000000 --- a/package/block-extroot/Config.in +++ /dev/null @@ -1,17 +0,0 @@ -# -# 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-extroot - 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-extroot/Makefile b/package/block-extroot/Makefile deleted file mode 100644 index 3b3ce68cae..0000000000 --- a/package/block-extroot/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -# -# 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. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=block-extroot -PKG_VERSION:=0.0.1 -PKG_RELEASE:=3 - -PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) - -include $(INCLUDE_DIR)/package.mk - -define Package/block-extroot/Default - SECTION:=base - CATEGORY:=Base system - TITLE:=root filesystem on secondary storage -endef - -define Package/block-extroot - $(call Package/block-extroot/Default) - MENU:=1 - DEPENDS:=+block-mount @PACKAGE_kmod-ide-core||PACKAGE_kmod-ata-core||PACKAGE_kmod-usb-storage||PACKAGE_kmod-mmc||PACKAGE_kmod-broadcom-sdhc -endef - -define Package/block-extroot/config - source "$(SOURCE)/Config.in" -endef - -define Package/block-extroot/description - Based on the moduluarized preinit and firstboot, adds the option to have - the root filesystem 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/install - $(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-extroot)) - diff --git a/package/block-extroot/files/50_determine_usb_root b/package/block-extroot/files/50_determine_usb_root deleted file mode 100644 index 8c5841e32b..0000000000 --- a/package/block-extroot/files/50_determine_usb_root +++ /dev/null @@ -1,57 +0,0 @@ -#!/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-extroot/files/55_determine_extroot_sysupgrade b/package/block-extroot/files/55_determine_extroot_sysupgrade deleted file mode 100644 index b0cd9036c2..0000000000 --- a/package/block-extroot/files/55_determine_extroot_sysupgrade +++ /dev/null @@ -1,63 +0,0 @@ -#!/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-extroot/files/60_pivot_usb_root b/package/block-extroot/files/60_pivot_usb_root deleted file mode 100644 index b610a4ade1..0000000000 --- a/package/block-extroot/files/60_pivot_usb_root +++ /dev/null @@ -1,27 +0,0 @@ -#!/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-extroot/files/extmount.sh b/package/block-extroot/files/extmount.sh deleted file mode 100644 index 44d662e63a..0000000000 --- a/package/block-extroot/files/extmount.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/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() { # - 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/Config.in b/package/block-mount/Config.in new file mode 100644 index 0000000000..2fa10b6685 --- /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 267a200db4..05ca086d8e 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 0000000000..8c5841e32b --- /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 0000000000..b0cd9036c2 --- /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 0000000000..b610a4ade1 --- /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 0000000000..44d662e63a --- /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() { # + 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 + } +} +