V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
pythonee
V2EX  ›  Linux

chroot 大家一般在什么场景用

  •  
  •   pythonee · 2020-01-17 09:28:52 +08:00 · 5277 次点击
    这是一个创建于 1532 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在理解这个命令,有看到一条是说可能建立独立、隔离的空间

    那岂不是 docker、virtualenv 这些都可以休息了?这个不是最快的建立独立空间的办法吗

    https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/index.html
    10 条回复    2020-01-19 20:36:17 +08:00
    lihongjie0209
        1
    lihongjie0209  
       2020-01-17 09:39:13 +08:00   ❤️ 4
    每个进程都维护一个 PCB, PCB 中有一个字段 root, 当你访问 /opt 的时候, / 就是这个 root.

    所以这个只能做到文件系统的一个隔离. 你如果要限制 CPU, 限制内存, 还有网络端口号的命名空间, 那么你使用 chroot 是没办法实现的.
    msg7086
        2
    msg7086  
       2020-01-17 09:46:42 +08:00
    docker 不就是 chroot 的后继者吗?
    chroot 只是程序环境独立,像楼上说的 CPU 内存网络这些都没有办法隔离。
    jinliming2
        3
    jinliming2  
       2020-01-17 09:48:19 +08:00 via iPhone
    装系统的时候用……
    在 nomultilib 的 64 位系统上运行 steam 客户端的时候用……
    为启动的服务型软件创建隔离环境的时候用( systemd )……
    之前写毕设的时候,接触这个命令,写的一个 online judge 用来跑编译过的代码的时候用过……
    我就这几个场景……

    其他,好像在 ssh server 上也可以用,让 ssh 上来的用户处于一个 chroot 下……
    Tink
        4
    Tink  
       2020-01-17 09:49:35 +08:00   ❤️ 2
    装 arch 的时候。。。
    wizardoz
        5
    wizardoz  
       2020-01-17 09:50:41 +08:00
    楼上说的很对,chroot 很久很久以前就有了,docker 是新兴事物。docker 实现了很多 chroot 做不到的事情。
    guochao
        6
    guochao  
       2020-01-17 09:55:33 +08:00   ❤️ 3
    chroot 只是切根,跟 virtualenv 什么的不大一样,docker 也不大一样。

    先说 use case。我习惯的场景:
    - chroot 只在从 Linux 里面装 Linux 时使用。需要先展开文件系统、挂载 sys procfs devtmpfs efivars 等等等文件系统,很麻烦的。举个例子,我装 Arch 用的 arch-chroot 就是一个 chroot 的 wrapper
    - docker 只是打包管理应用。如果遇到一连串的共享库不一致我可能也会用 docker,或者用类似于 conda 的处理方法。
    - conda、virtualenv、我自己写的一些简单的 helper 主要是处理个别程序需要在不同的二进制 /共享库环境下的需求,一般是脚本一类程序的解释器版本的问题或者脚本的库的目录,或者是共享库需要 X Server 以及不一样的版本( preload )

    virtualenv 和 conda 之类的工具主要是修改环境变量来修改 shell 和各种工具执行、加载各种程序的行为,比如说 PATH PYTHONPATH PERL5LIB LD_PRELOAD 这些,通过这种方式在一个终端里面执行另一套程序。自己就可以写一些工具来做类似的事情

    chroot 实际上是调用了一个 chroot 的函数( http://man7.org/linux/man-pages/man2/chroot.2.html ),让子进程可以把这个目录认作根目录。并没有隔离太多资源,你实际上还是在同一个命名空间里面用了同样的资源。而且 chroot 需要你提前准备好一套类似于容器镜像的文件系统,很多情况下你还需要把 host 的目录挂载进来才能让程序正常运行。很麻烦的。
    此外 chroot 以后如果不切换为普通用户,是可以逃逸出根目录的。

    docker 则是利用了 namespace 和 cgroup 来控制和隔离一个进程树,而且用了大量技巧来阻断进程逃逸的过程,而且这几年也出了非常多的基于 kvm 的 runc,相当于轻量级虚拟机,微软打算做的 wsl2 应该是差不多的东西,比如说 kata container,逃逸的难度非常大。而且可以利用现有的 image。主要是为了编排服务出现的。
    devcat
        7
    devcat  
       2020-01-17 11:58:58 +08:00
    安装 arch 的时候,本质就是把启动盘里的东西先装到硬盘,然后 chroot 进去配置硬盘里的系统
    还有就是忘记 root 密码的时候,可以通过 chroot 还搞事情
    realpg
        8
    realpg  
       2020-01-17 17:19:25 +08:00
    chroot 只是 work folder 加上禁止向上
    后续的 docker ve 什么的更高级
    updateing
        9
    updateing  
       2020-01-18 02:16:40 +08:00 via Android
    还可以在路由器、手机这类 自带系统不是很通用 /完善的设备上 在不中断设备业务的前提下 跑一个常见 Linux 发行版的运行环境 [doge]
    akyle
        10
    akyle  
       2020-01-19 20:36:17 +08:00 via Android
    通过启动盘挂载原有系统,修复系统引导。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3291 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:15 · PVG 22:15 · LAX 07:15 · JFK 10:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.