暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

走进Container: RootFS

ProdanLabs 2019-12-24
696


1

Root FileSystem,简称为rootfs,是类UNIX操作系统的根文件系统,其他文件都直接挂载到了该文件系统,它包含整个系统正常运行所需的关键文件(例如,init进程)


我们知道内核启动的最后阶段启动了三个进程:

进程0:idle 进程,不参与schedule机制,叫空闲进程,也就是死循环。

进程1:kernel_init函数就是进程1,这个进程被称为init进程。

进程2:kthreadd函数就是进程2,这个进程是linux内核的守护进程。这个进程是用来保证linux内核自己本身能正常工作的。


那么内核启动中的rootfs是怎么初始化的?


1、首先,在内核首次启动时,注册了一个绝对最小的文件系统,称为“ rootfs”。它将设置一个包含两个文件的内存驻留inode目录条目 "." 和 ".."。在所有目录中,"."指向当前目录(这就是执行当前目录可执行文件加 ./ 的原因), ".."指向当前目录的父目录的链接(如 cd ..返回上一级目录)


2、内存驻留inode结构包含对目录所在设备驱动程序结构的引用,现在对于这个特定的内存驻留inode,这个目录没有设备关联,这意味着现在是空的/根目录;


3、因为ramdisk总是内存驻留的,所以在Linux中标记为"ramdisk"当执行下一步(填写ramdisk)时,内核将按照内核的原始加载位置复制内存,并将其视为包含初始文件系统的"cpio"的大缓冲区。这个文件系统被复制到"ramdisk",它现在开始填写文件系统的目录和文件数据。作为驻留内存的文件系统,没有物理磁盘,因此ramdisk文件系统为每个文件分配内存,每个目录都存储在initrd缓冲区中,这就是刚刚启动的内核的"rootfs";


4、内核使用内核启动功能,释放该initrd缓冲区占用的内存,并启动一个新进程(pid 1),并执行驻留在rootfs中的init程序。此时,内核处于空闲状态,init进程接管了工作……


5、现在,init进程可以启动其他进程以进行设备发现(通常是udev/eudev),识别系统盘和其他数据盘;


6、init所做的事情之一就是将真正的/根目录挂载到某个位置(比如sysroot)。现在有一个到物理设备的链接,该设备由引导加载程序(通常为grub)设置的内核命令行中的"root ="选项标识,它告诉内核在哪里可以找到根文件系统;

7、以对设备驱动程序结构的引用的方式,根文件系统(sysroot)中的目录条目具有指向物理设备的链接;


8、然后,init进程使用特殊的系统调用"pivot_root",该调用导致设备的指针交换位置。现在,这使真实根成为“ ”(第一个内存驻留目录)的设备。交换使"sysroot"条目成为ramdisk的条目;


9、接着,init进程可以自行重启(从而切换到实际根文件系统上的init文件),并卸装sysroot条目。这会为从"initrd"缓冲区创建的"rootfs"分配所有内存,从而使内存可用于其他进程;


10、最后再启动在真实根文件系统上的其他服务。


2


Rootfs是一个压缩包,其中包含所有Linux的必需目录(sbin、bin等)。有很多工具可以构建rootfs,如Buildroot等。本文使用Alpine Linux最小的根文件系统进行测试

[root@kube-master01 ~]# cat Dockerfile 
FROM scratch
ADD alpine-minirootfs-3.10.3-x86_64.tar.gz /
CMD ["/bin/sh"]
[root@kube-master01 ~]
[root@kube-master01 ~]# docker history alpine:3.10
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
965ea09ff2eb        2 months ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           2 months ago        /bin/sh -c #(nop) ADD file:fe1f09249227e2da2…   5.55MB              
[root@kube-master01 ~]#


将alpine:3.10的根目录导入到/root/demo-rootfs目录

[root@kube-master02 ~]# mkdir -p demo-rootfs
[root@kube-master02 ~]#  docker export $(docker create alpine:3.10) | tar -C ./demo-rootfs  -xf - 
[root@kube-master02 ~]# ls ./demo-rootfs
bin  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@kube-master02 ~]# pwd
/root
[root@kube-master02 ~]


对于容器来说,它的启动过程一般分为:

1、启用Linux NameSpace隔离配置;

2、设置Cgroup限制参数;

3、镜像文件/目录通过UnionFS的方式挂载到同一端点

4、切换进程的根目录(Change Root)

这样一个完整的容器就诞生了

在Linux中,chroot命令用来改变程序执行时所参考的根目录位置。即 change root directory (更改 root 目录),可以增加系统的安全性。

[root@kube-master01 ~]# ls -lrt 
total 839672
-rw-r--r--  1 root root 103383500 Dec  5 16:42 linux-4.19.88.tar.xz
-rw-r--r--  1 root root 397298776 Dec  5 17:18 kubernetes-server-linux-amd64.tar.gz.v1.16
-rw-r--r--  1 root root     10268 Dec  5 17:39 check-config.sh
drwxr-xr-x  4 root root      4096 Dec  8 05:37 kubernetes
-rw-r--r--  1 root root 359101395 Dec 23 10:18 kubernetes-server-linux-amd64-1.17.0.tar.gz
drwxr-xr-x 19 root root      4096 Dec 24 00:35 demo-rootfs
[root@kube-master01 ~]# pwd     
/root
[root@kube-master01 ~]# which sh
/usr/bin/sh
[root@kube-master01 ~]# chroot /root/demo-rootfs /bin/sh -i
# PATH=$PATH:/bin
# ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
# pwd
/
# which sh
/bin/sh

# cd
# pwd
/root
# df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
df: /proc/mounts: No such file or directory
# ls -lart
total 12
drwxr-xr-x   19 root     root          4096 Dec 23 16:35 ..
drwx------    2 root     root          4096 Dec 23 16:35 .
-rw-------    1 root     root           346 Dec 23 17:04 .ash_history



在Linux操作系统中rootfsbootfs是分开的

rootfs只是包含了操作系统的文件、配置和目录,bootfs包含了BootLoader和Kernel操作系统只有在开机启动时才会加载指定版本的内核。其实容器的本质就是一个进程,跟宿主机共用内核,宿主机对该"进程"进行空间隔离、资源限制,并改变进程执行时的根目录位置。


好看的皮囊千篇一律,有趣的灵魂万里挑一,rootfs只是操作系统的肉体,并没有灵魂。



往期回顾


走进Container: 资源的限制

走进Container: 资源的隔离

走进Container: UnionFS

文章转载自ProdanLabs,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论