block-mount: Merged block-mount, block-extroot, and block-hotplug into a single binar...
authorDaniel Dickinson <crazycshore@gmail.com>
Sun, 27 Mar 2011 06:40:51 +0000 (06:40 +0000)
committerDaniel Dickinson <crazycshore@gmail.com>
Sun, 27 Mar 2011 06:40:51 +0000 (06:40 +0000)
SVN-Revision: 26314

12 files changed:
package/block-extroot/Config.in [deleted file]
package/block-extroot/Makefile [deleted file]
package/block-extroot/files/50_determine_usb_root [deleted file]
package/block-extroot/files/55_determine_extroot_sysupgrade [deleted file]
package/block-extroot/files/60_pivot_usb_root [deleted file]
package/block-extroot/files/extmount.sh [deleted file]
package/block-mount/Config.in [new file with mode: 0644]
package/block-mount/Makefile
package/block-mount/files/50_determine_usb_root [new file with mode: 0644]
package/block-mount/files/55_determine_extroot_sysupgrade [new file with mode: 0644]
package/block-mount/files/60_pivot_usb_root [new file with mode: 0644]
package/block-mount/files/extmount.sh [new file with mode: 0644]

diff --git a/package/block-extroot/Config.in b/package/block-extroot/Config.in
deleted file mode 100644 (file)
index dbf1041..0000000
+++ /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 (file)
index 3b3ce68..0000000
+++ /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 (file)
index 8c5841e..0000000
+++ /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 (file)
index b0cd903..0000000
+++ /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 (file)
index b610a4a..0000000
+++ /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 (file)
index 44d662e..0000000
+++ /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() { # <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/Config.in b/package/block-mount/Config.in
new file mode 100644 (file)
index 0000000..2fa10b6
--- /dev/null
@@ -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.
+               
+
index 267a200db4c779bc98eb31a6240684e246f139e6..05ca086d8ebc8aa800bc6d15072bfcd30f2b62da 100644 (file)
@@ -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 (file)
index 0000000..8c5841e
--- /dev/null
@@ -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 (file)
index 0000000..b0cd903
--- /dev/null
@@ -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 (file)
index 0000000..b610a4a
--- /dev/null
@@ -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 (file)
index 0000000..44d662e
--- /dev/null
@@ -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
+       }
+}
+