chroot与pivot_root总结
大纲
根文件系统rootfschroot隔离pivot_roo隔离
根文件系统rootfs
根文件系统一般也叫做rootfs
这里所谓的Linux根文件系统更像是一个文件夹或者叫做目录 (而非FATFS、FAT、EXT4、YAFFS和NTFS等这样的文件系统),在这个目录里面会有很多的子目录。根目录下和子目录中会有很多的文件,这些文件是Linux运行所必须的,比如库、常用的软件和命令、设备文件、配置文件等等
根文件系统首先是内核启动时所mount(挂载)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
根文件系统是Linux内核启动以后挂载(mount)的第一个文件系统,然后从根文件系统中读取初始化脚本,比如rcS,inittab等。根文件系统和Linux内核是分开的,单独的Linux内核是没法正常工作的,必须要搭配根文件系统。如果不提供根文件系统,Linux内核在启动的时候就会提示内核崩溃(Kernelpanic)的提示。
注意 rootfs 与 bootfs的区别 ,bootfs包含BootLoader与内核各个linux发行版的bootfs基本一致, rootfs与各个linux发行版有关,可能不一样
可以下载一个根文件系统 (以上传到百度云 /常用软件/操作系统/rootfs.tar.gz)
wget https://github.com/ericchiang/containers-from-scratch/releases/download/v0.1.0/rootfs.tar.gz
解压后得到一个根文件系统
或者基于docker导出一个根文件系统
例如
docker pull alpine
docker pull busybox
docker run -d busybox top -b
docker export -o busybox.tar (busybox容器id)
tar -xvf busybox.tar -C busybox
使用docker导出一个根文件系统
另外一个终端中
这样就得到了一个linux运行时的根文件系统
chroot隔离
chroot 就是可以改变某进程的根目录,使这个程序不能访问目录之外的其他目录。
chroot NEWROOT [COMMAND [ARG]...]
注意 此处的COMMAND需要是新的根目录中存在的
pivot_root隔离
pivot_root把当前进程的root文件系统放在put_old目录,而使new_root成为新的root文件系统
改变当前工作目录的所有进程或线程的工作目录. 这个跟chroot的就有很大的区别,chroot是只改变即将运行的
某进程的根目录。pviot_root主要是把整个系统切换到一个新的root目录,然后去掉对之前rootfs的依赖,以便于可以umount 之前的文件系统(pivot_root需要root权限)
https://man7.org/linux/man-pages/man2/pivot_root.2.html
命令各式:
pivot_root new_root put_old
使用pivot_root 需要注意
1 new_root 与 put_old 必须是文件夹2 new_root文件夹必须是一个挂载点 ,并且new_root文件夹里面有完整rootfs的各种文件3 new_root 文件夹挂载应该是一个与主机不同的name space4 put_old文件夹必须在new_root文件夹内
new_root文件夹必须是一个挂载点 ,并且new_root文件夹里面有完整rootfs的各种文件
new_root 文件夹挂载应该是一个与主机不同的name space
put_old文件夹必须在new_root文件夹内
完整例子
unshare --mount --fork /bin/bash #需要有独立的命名空间
mkdir /new-root
mount -t tmpfs mytmpfs /new-root #new-root是一个独立的挂载点
cd /new-root
mkdir old-root #注意可以不创建old-root文件夹直接使用tmp文件夹
cp -r /ushare/busybox/* /new-root/ #new_root文件夹里面有完整rootfs的各种文件
cd ..
pivot_root /new-root/ /new-root/old-root
cd /
资料