Linux chroot使用

什么是 chroot

chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 /,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 / 位置。
chroot是Linux很早的一项“类docker”技术,也能够将打包好的Kernel镜像通过chroot方式加载到内存里,看上去和普通的kernel没有区别。

如何使用chroot

本文内容主要包括

  • 在宿主机(centos-A)上搭建一个Nginx服务
  • 打包宿主机(centos-A)的OS镜像
  • 在服务机(ubuntu-B)采用chroot方式加载打包好的镜像

宿主机搭建Nginx服务

宿主机可以任意选择一台centos或redhat系列

[centos-A]$ yum install gcc gcc-c++
[centos-A]$ yum install pcre-devel open-ssl openssl openssl-devel
[centos-A]$ wget http://tengine.taobao.org/download/tengine-2.1.0.tar.gz
[centos-A]$ sudo tar -zxvf tengine-2.1.0.tar.gz
[centos-A]$ cd tengine-2.1.0
[centos-A]$ ./configure
[centos-A]$ make & make install
[centos-A]$ /usr/local/nginx/sbin/nginx

宿主机打包OS镜像

[centos-A]$ sudo  tar --numeric-owner --exclude=/root/nginx-base-os.tar.gz --exclude=/var/lib/docker --exclude=/proc --exclude=/sys --exclude=/lost+found -pczf nginx-base-os.tar.gz /

chroot加载镜像

下载打包好的镜像到服务器B上,服务器B可以选择任意操作系统,我这里是ubuntu。

[ubuntu-B]$ mkdir nginx-base-os
[ubuntu-B]$ sudo tar -pxvf nginx-base-os.tar.gz -C nginx-base-os
[ubuntu-B]$ sudo chroot .

下面就是进入到chroot里了,操作的是另一个镜像
[chroot-images]$ mkdir proc sys dev lost+found
[chroot-images]$ sudo mount -t proc none proc/
[chroot-images]$ sudo mount -t sysfs none sys/
[chroot-images]$ sudo mount -o bind none dev/
启动镜像的nginx
[chroot-images]$ /usr/local/nginx/sbin/nginx

可以另外开一个终端ssh到宿主机B上查看进程
[ubuntu-B]$ ps axf | grep nginx
 1422 ?        Ss     0:00 nginx: master process /usr/local/nginx/sbin/nginx
 1424 ?        S      0:00  \_ nginx: worker process

总结

采用chroot的方式可以很快实现“类docker”的功能,优点主要如下

  1. 不需要依赖OS底层的任何基础库,不需要像docker那样装docker包。一个OS上打包好的镜像,可以在任意支持chroot的Linux Kernel上跑
  2. chroot镜像里运行起来的进程和宿主机是没有namespace隔离的,网络、fd都是共享的,不存在性能损耗。

同样chroot也有一些缺点

  1. chroot的方式是不存在资源隔离的,镜像里的进程完全是和宿主机共享资源,特别是网络资源,所有局限性就是对于“对外暴露端口提供服务”的镜像不能run多个
  2. chroot的镜像比docker会比较大,因为chroot是整个kernel都打包成镜像。

docker其实是一种chroot、cgroup之类库整合而成的软件,我个人觉得学习docker更多的是学习docker本身的思想。其实在“单机服务、不存在资源隔离、硬盘存储够大”的场景下,chroot完全足够了。

标签:none