-
BusyBox
- BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具。
- linuxrc的运行原理,在busybox的源码下/init/init.c有如下内容:
- 表明linuxrc的作用和init一样,也就是执行linuxrc就是执行/sbin/init。busybox使用软链接将一个进程链接成多个进程,然后通过main函数args的第一个参数(也就是进程名)来区分具体执行哪一个,我们直接把文件名改为init其实就相当于执行了/sbin/init程序。
- 根文件系统(基于busybox制作ramdisk根文件系统rootfs)
- 参考:稀土掘金
- 根文件系统是一种特殊的文件系统,特殊就在于它必须有特定的目录结构以及特定的文件,如下:
-
- 内存盘。从系统内存中,划出一部分当作硬盘使用。可以将应用程序,安装到ramdisk中,然后去执行。
- ramdisk并非是一个实际的文件系统,而是一种将实际的文件系统转入内存的机制,因此可以作为根文件系统。
- 实际上,ramdisk,使用的文件系统是ext2。(?)
- 在linux中,ramdisk有2种:
- initrd:linux内核2.0开始支持,大小固定
- initramfs: linux内核2.4开始支持,大小可变
- 内存盘。从系统内存中,划出一部分当作硬盘使用。可以将应用程序,安装到ramdisk中,然后去执行。
-
cpio
下载地址:https://busybox.net/downloads/
wget https://busybox.net/downloads/busybox-1.33.1.tar.bz2
# 设置CPU架构
$ export ARCH=x86_64
# 设置交叉编译工具链前缀
$ export CROSS_COMPILE=x86_64-linux-gnu-
# 或者,
make CROSS_COMPILE=x86_64-linux-gnu- ARCH=x86_64 menuconfig
# 生成默认.config
$ make defconfig
# 设置busybox选项
$ make menuconfig
#修改选项
···
Settings --->
...
# 静态编译busybox
--- Build Options
[*] Build static binary (no shared libs)
...
...
$ make -j nproc
安装busybox,默认路径为当期目录的**_install**文件夹
make install
基于busybox的文件系统启动过程:
/sbin/init => /etc/inittab => /etc/init.d/rdS => /etc/fstab ...
制作过程繁琐,可使用如下脚本:./creat_rootfs.sh
# 这些忘写到脚本里了,算了
cd busybox-1.33.1的父目录
mkdir qemu-image
vim creat_rootfs.sh
sudo ./creat_rootfs.sh
./creat_rootfs.sh的内容如下:
#!/bin/sh
busybox_folder="./busybox-1.33.1"
rootfs="rootfs"
echo $base_path
if [ ! -d $rootfs ]; then #判断文件是否存在
mkdir $rootfs
fi
cp $busybox_folder/_install/* $rootfs/ -rf
cd $rootfs
if [ ! -d proc ] && [ ! -d sys ] && [ ! -d dev ] && [ ! -d etc/init.d ]; then
mkdir proc sys dev etc etc/init.d
fi
# 创建根目录所需的必要文件etc/inittab、etc/init.d/rcS、etc/fstab
if [ -f etc/inittab ]; then
rm etc/inittab
fi
echo "::sysinit:/etc/init.d/rcS" > etc/inittab
echo "::respawn:-/bin/sh" >> etc/inittab
echo "::askfirst:-/bin/sh" >> etc/inittab
echo "::cttlaltdel:/bin/umount -a -r" >> etc/inittab
chmod 755 etc/inittab
if [ -f etc/init.d/rcS ]; then
rm etc/init.d/rcS
fi
echo "#!/bin/sh" > etc/init.d/rcS
echo "mount -t proc none /proc" >> etc/init.d/rcS
echo "mount -t sysfs none /sys" >> etc/init.d/rcS
echo "/sbin/mdev -s" >> etc/init.d/rcS
chmod +x etc/init.d/rcS
if [ -f etc/fstab ]; then
rm etc/fstab
fi
echo "#device mount-point type option dump fsck" > etc/fstab
echo "proc /proc proc defaults 0 0" >> etc/fstab
echo "temps /tmp rpoc defaults 0 0" >> etc/fstab
echo "none /tmp ramfs defaults 0 0" >> etc/fstab
echo "sysfs /sys sysfs defaults 0 0" >> etc/fstab
echo "mdev /dev ramfs defaults 0 0" >> etc/fstab
if [ ! -c dev/console ] && [ ! -c dev/null ] && [ ! -c dev/tty1 ]; then
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1
cd ..
fi
if [ -f ../qemu-image/rootfs.img ]; then
rm ../qemu-image/rootfs.img
fi
find . | cpio -o --format=newc > ../qemu-image/rootfs.img
此时rootfs/ 目录下保存着busybox生成的根文件系统内容,qemu-image/ 目录下的rootfs.img可被qemu使用。
sudo qemu-system-x86_64 \
-kernel /home/ubuntu/oscomp/twinkernel/arch/x86_64/boot/bzImage \
-smp 2 \
-m 2G \
-initrd /home/ubuntu/oscomp/qemu-image/rootfs.img \
-append "rdinit=/linuxrc console=ttyS0 loglevel=8" \
-serial stdio \
-serial telnet:localhost:4321,server,nowait \
-display none