chroot、pivot_root 和 switch_root 的区别


chroot、pivot_root 和 switch_root 的区别

chroot

chroot : change to root

为了进一步提高系统的安全性,linux 引入了 chroot 机制,chroot 是一个系统调用,可以更改一个进程所能看到的根目录。

类似创建一个沙盒,进程运行在沙盒之内,进程运行正常与否,并不会影响这台虚拟机的其他进程。

# 切换到有效的 filesystem bundle 目录
$ ls
bin  dev  lib  media  opt  root  sbin  sys  var  boot
etc  home  mnt  proc  run  srv  tmp  usr
$ cd /mycontainer
$ chroot rootfs /bin/sh
# 进入到一个新的shell中
$ ls /
bin  dev  lib 

可以看出,ls 命令参考的根是不同, 以此来形成简单的隔离.

pivot_root

改变当前工作目录的所有进程或线程的工作目录. 这个跟chroot的就有很大的区别,chroot是只改变即将运行的某进程的根目录。

pviot_root 主要是把整个系统切换到一个新的 root 目录,然后去掉对之前rootfs的依赖,以便于可以 umount 之前的文件系统(pivot_root 需要 root 权限)

用法:pivot_root new_root put_old

例子:

从 127.0.0.1:/home/puser/nfsroot 挂载新的文件系统并且运行 init

  • 拷贝 sh, ls 至 nfsroot/bin,以及相关的共享库至 nfsroot/lib
  • 在 nfsroot 下面建立目录 old_root
  • mount -o ro 127.0.0.1:/home/puser/nfsroot /mnt
  • cd /mnt
  • pivot_root . old_root
    这个时候,会发现比如 "ls /" 显示的是 nfsroot 下面的文件;"ls old_root" 显示的是之前文件系统 root 下面的文件。

pivot_root 和 chroot 的主要区别是,pivot_root 主要是把整个系统切换到一个新的 root 目录,而移除对之前 root 文件系统的依赖,这样你就能够 umount 原先的 root 文件系统。而 chroot 是针对某个进程,而系统的其它部分依旧运行于老的 root 目录。

switch_root

专为 initramfs 设计, 通常 initramfs 都是为了安装最终的根文件系统做准备工作,然后切换到新的根文件系统上去。

initramfs 是 rootfs, 且不能 umount, 所以不能使用 pivot_root。

switch_root做的工作:

  • 删除早的 rootfs 内的全部内容,目的是为了释放空间,因为用的内存空间
  • 安装新的根文件系统
  • 切换到新的文件系统,并执行新文件系统的 init 程序

(switch_root 必须由 pid=1 的进程调用,否则会错误,例如在 init 脚本: exec switch_root new_rootfs /init)

参考:


文章作者: Pudding
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Pudding !
  目录