前言
通过《initrd&init进程》我们知道rootfs 是文件系统的根目录,其包含了操作系统所需的所有文件和目录,包括程序、库文件、配置文件、设备文件等,它是系统启动时必须加载的文件系统之一。当系统启动后,内核会首先挂载 rootfs 到 / 目录下,然后开始运行 init 进程,执行各种初始化工作。
制作rootfs
- 下载busybox源码
git clone git://git.busybox.net/busybox
- 编译busybox
## 使用默认配置
make defconfig
## 或者自定义配置
make menuconfig
make install
- 交叉编译
## 去下载交叉编译环境
wget https://releases.linaro.org/components/toolchain/binaries/6.4-2018.05/arm-linux-gnueabi/gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabi.tar.xz
## 解压
tar xvf gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabi.tar.xz -C /opt/
## 配置动态编译
make menuconfig
Settings --->
--- Build Options
(arm-linux-gnueabi-) Cross compiler prefix
## 编译
exports ARCH=arm
exports CROSS_COMPILE=arm-linux-gnueabi-
make
make install
- 配置busybox启动环境
## 复制busybox编译好的进 rootfs文件
cp _install/* ../rootfs/
## 查看你新环境命令要支持的库
ldd bin/sh
linux-vdso.so.1 (0x00007ffd8c19f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f714889a000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f7148680000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f714828f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7148f3f000)
## 创建文件,并把库同路径移过来
mkdir lib lib64
cp /lib/x86_64-linux-gnu/*.so.* lib/x86_64-linux-gnu/
cp /lib64/*.so.* lib64/
## 如果是交叉编译的话移的是交叉环境里的库
cp /opt/gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/lib ../rootfs -rap
## 初始化配置
mkdir etc
cp ./examples/bootfloppy/etc/* etc
mkdir dev proc sys tmp var
## 修改/etc/init.d/rcS
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
## 修改/etc/fstab 主要是配置一些基本的文件系统挂载信息
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
rootfs的使用
使用rootfs主要有两种方式,chroot 与pivot_root
chroot
chroot 就是可以改变某进程的根目录,使这个进程不能访问目录之外的其他目录。
sudo chroot .
pivot_root隔离
pivot_root把当前进程的root文件系统放在put_old目录,而使new_root成为新的root文件系统
改变当前工作目录的所有进程或线程的工作目录. 这个跟chroot的就有很大的区别,chroot是只改变即将运行的某进程的根目录。pviot_root主要是把整个系统切换到一个新的root目录,然后去掉对之前rootfs的依赖,以便于可以umount 之前的文件系统(pivot_root需要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 /
必须配合namespace使用
总结
有了pivot_root,各厂商操作可以制作自己的rootfs(也就是镜像),提供给docker之前的容器商使用
主要参考
《<linux> busybox制作rootfs》
《Busybox制作基本rootfs》
《chroot与pivot_root总结 完整的chroot与pivot_root使用例子》