改变根文件系统
命令语法格式
pivot_root new_root put_old
命令描述
命令pivot_root将当前进程的根文件系统移动到put_old目录,并使new_root成为新的根文件系统。 由于pivot_root(8)只是调用pivot_root(2),因此我们将参考后者的手册页以获取更多详细信息。
请注意,根据pivot_root的实现,调用者的root和cwd可能会也可能不会更改。 以下是调用pivot_root的顺序,在任何一种情况下均可使用,假设pivot_root和chroot位于当前PATH中:
cd new_root
pivot_root . put_old
exec chroot . command
pivot_root . put_old
exec chroot . command
请注意,chroot必须在旧根目录下和新根目录下可用,因为pivot_root可能已经或可能没有隐式更改shell的根目录。
请注意,exec chroot会更改正在运行的可执行文件,如果之后应该卸载旧的根目录,这是必需的。 另请注意,标准输入、标准输出、标准错误仍可能指向旧根文件系统上的设备,使其保持忙碌状态。 调用chroot时可以轻松更改它们(请参阅下文;请注意,如果pivot_root已更改shell的根目录,则无需使用前导斜杠来使其工作)。
命令支持的选项及含义
-V, –version
显示版本信息并退出。
-h, –help
显示帮助信息并退出。
使用示例
从交互式shell将根文件系统更改为/dev/hda1:
mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root
从10.0.0.1:/my_root通过NFS挂载新的根文件系统,并运行init:
ifconfig lo 127.0.0.1 up # for portmap
# configure Ethernet or such
portmap # for lockd (implicitly started by mount)
mount -o ro 10.0.0.1:/my_root /mnt
killall portmap # portmap keeps old root busy
cd /mnt
pivot_root . old_root
exec chroot . sh -c ‘umount /old_root; exec /sbin/init’ <dev/console >dev/console 2>&1
# configure Ethernet or such
portmap # for lockd (implicitly started by mount)
mount -o ro 10.0.0.1:/my_root /mnt
killall portmap # portmap keeps old root busy
cd /mnt
pivot_root . old_root
exec chroot . sh -c ‘umount /old_root; exec /sbin/init’ <dev/console >dev/console 2>&1
如上示例
相关手册
chroot(1), pivot_root(2), mount(8), switch_root(8), umount(8)
参考文献
- man 8 pivot_root, Version 2.32.1-0.1
更新日志
- 10/08/2018 创建文章