1303 files changed, 32187 insertions, 57138 deletions
diff --git a/util-linux/switch_root.c b/util-linux/switch_root.c index a301b36..6034485 100644 --- a/util-linux/switch_root.c +++ b/util-linux/switch_root.c @@ -5,6 +5,29 @@ * * Licensed under GPLv2, see file LICENSE in this source tree. */ +//config:config SWITCH_ROOT +//config: bool "switch_root" +//config: default y +//config: select PLATFORM_LINUX +//config: help +//config: The switch_root utility is used from initramfs to select a new +//config: root device. Under initramfs, you have to use this instead of +//config: pivot_root. (Stop reading here if you don't care why.) +//config: +//config: Booting with initramfs extracts a gzipped cpio archive into rootfs +//config: (which is a variant of ramfs/tmpfs). Because rootfs can't be moved +//config: or unmounted*, pivot_root will not work from initramfs. Instead, +//config: switch_root deletes everything out of rootfs (including itself), +//config: does a mount --move that overmounts rootfs with the new root, and +//config: then execs the specified init program. +//config: +//config: * Because the Linux kernel uses rootfs internally as the starting +//config: and ending point for searching through the kernel's doubly linked +//config: list of active mount points. That's why. + +//applet:IF_SWITCH_ROOT(APPLET(switch_root, BB_DIR_SBIN, BB_SUID_DROP)) + +//kbuild:lib-$(CONFIG_SWITCH_ROOT) += switch_root.o //usage:#define switch_root_trivial_usage //usage: "[-c /dev/console] NEW_ROOT NEW_INIT [ARGS]" @@ -206,7 +229,7 @@ because they're what all paths your process uses would be relative to. That's why the careful sequencing above: we cd into the new mount point before we do the mount --move. Moving the mount point would otherwise make it -totally inaccessible to is because cd-ing to the old path wouldn't give it to +totally inaccessible to us because cd-ing to the old path wouldn't give it to us anymore, and cd "/" just gives us the cached dentry from when the process was created (in this case the old initramfs one). But the "." symlink gives us the dentry of the filesystem we just moved, so we can then "chroot ." to |