busybox vscode 环境
https://zhuanlan.zhihu.com/p/12982590356
CONFIG_MEMCG 要开启 memory 写不下去
CONFIG_BPF_SYSCALL 要开启
使用vscode单步调试
qemu-img create -f raw rootfs.img 512M
mkfs -t ext4 ./rootfs.img
qemu-system-x86_64 -nographic \
-m 1024m -smp cores=4 \
-kernel ./linux-6.1.120/arch/x86_64/boot/bzImage \
-initrd ./busybox-1.36.1/rootfs.cpio \
-append "console=ttyS0 nokaslr" \
-net nic -net user \
-drive file=./busybox_data.qcow2,format=qcow2,if=virtio,cache=none \
-s -S
mount -t cgroup2 none /sys/fs/cgroup
mkdir -p /mnt/qcow2_data
mount /dev/vda /mnt/qcow2_data
ip link set eth0 up
ip addr add 10.0.2.15/24 dev eth0
ip route add default via 10.0.2.2 dev eth0
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
mkdir -p /etc/docker/
echo '{ "data-root": "/data/docker" }' > /etc/docker/daemon.json
export PATH=$PATH:/mnt/qcow2_data/docker
utils.go:62 main.fatalWithCode() runc run failed: unable to start container process: error during container init: error setting cgroup config for procHooks process: bpf_prog
一、文件下载
二、制作文件系统
2.1 解压缩,配置静态编译
tar xvf busybox-*.tar.bz2
cd busybox-*
make menuconfig
Settings --->
[*] Build BusyBox as a static binary (no shared libs)
- 当前目录下生成
.config配置文件
2.2 编译安装
make -j4 && make install
- 编译完成后,
_install/目录就是 busybox 的根目录
2.3 补全目录结构
cd _install/
mkdir dev etc/init.d/ proc sys tmp mnt/sysroot -p
2.4 初始化设备
sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3
sudo mknod dev/tty1 c 4 1
mknod:命令用于创建特殊文件,通常是设备文件。dev/console:指定设备节点的路径和名称。c:表示创建的是字符设备文件。5:主设备号(major number),用于标识设备类型。1:次设备号(minor number),用于标识同一类型中的特定设备。/dev/console是系统控制台设备,通常用于内核消息和系统日志的输出。/dev/null是一个特殊的设备文件,任何写入它的数据都会被丢弃,而读取它则总是返回EOF。/dev/tty1是第一个虚拟控制台,通常在文本模式下可以通过按Ctrl+Alt+F1来访问。
2.5 初始化挂载点
vim etc/fstab
# proc /proc proc defaults 0 0
# sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
etc/fstab:配置文件,用于指定启动时挂载的文件系统。- 以
#开头,表示被注释掉,所以它不会被执行。 proc:文件系统类型,提供内核和进程的运行时信息。sysfs:文件系统类型,提供对系统硬件配置的视图。tmpfs:文件系统类型,tmpfs是一个基于内存的文件系统,通常用于存储临时文件。/proc /sys /tmp:挂载点,即挂载文件系统的位置。proc:文件系统的设备名,这里与类型同名,因为proc是一个伪文件系统。defaults:挂载选项,defaults通常包括rw(可读写)、suid(允许setuid位生效)、dev(解释字符或块特殊设备)、exec(允许执行二进制文件)等。0:是否需要dump备份,0表示不需要。0:是否需要fsck检查,0表示不需要。
2.6 初始化启动脚本,增加执行权限
vim etc/init.d/rcS
#!/bin/sh
echo -e "Welcome to busybox"
/bin/mount -a
/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
echo -e "Remounting the rootfs..."
mount -o remount,rw /
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
chmod 755 etc/init.d/rcS
- 告诉系统这个脚本应该使用哪个解释器来执行
- 输出欢迎信息到控制台。
-e选项允许转义序列,例如\n(换行符) - 尝试挂载
/etc/fstab文件中列出的所有文件系统(对应上一步) - 挂载
proc sysfs文件系统到/proc /sys目录 - 输出信息到控制台,表示正在重新挂载根文件系统
- 重新挂载根文件系统为可读写模式。默认情况下,根文件系统可能以只读方式挂载
- 挂载
devpts文件系统到/dev/pts目录,devpts用于提供伪终端 - 设置内核的热插拔事件处理程序为
/sbin/mdev。mdev是BusyBox提供的一个轻量级设备管理器 - 扫描所有已知的设备文件,并在
/dev目录下创建或删除相应的设备节点
2.7 初始化init进程,增加执行权限
vim etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/ash
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount ‐a ‐r
::restart:/sbin/init
chmod 755 etc/inittab
- 在传统的System V初始化系统中使用的配置文件,用于告诉init进程如何启动和运行系统。
::sysinit: 是一个运行级别无关的操作,表示在系统初始化时执行。/etc/init.d/rcS是一个脚本,通常在单用户模式或系统启动时运行,用于启动系统服务(对应上一步)。::askfirst:表示在指定运行级别时,init将执行后面的命令,但在执行前会提示用户登录。-表示忽略Ctrl+C中断信号。/bin/ash是一个shell,通常是一个轻量级的Bourne shell兼容的shell。::ctrlaltdel: 指定当用户按下Ctrl+Alt+Delete组合键时执行的操作。/sbin/reboot是重新启动系统的命令。::shutdown:表示在系统关机时执行的操作。/sbin/swapoff -a是停止所有交换分区的命令。/bin/umount -a -r是卸载所有文件系统的命令,-r选项表示如果无法正常卸载,则进行强制卸载。::restart: 指定当init进程重启时执行的操作。/sbin/init是重新启动init进程的命令,这通常用于重启整个系统。
2.8 文件打包方式
find . | cpio -R root:root -H newc -o | gzip > ../rootfs.gz
find .:在当前目录及其子目录中查找所有文件和目录。.表示当前目录。|:管道符,将find .命令的输出传递给下一个命令。cpio -R root:root -H newc -o:cpio是一个用于复制文件和目录的工具,这里使用的是cpio的写入模式(-o选项)。-R root:root指定文件所有者为root,组为root。-H newc指定使用newc格式进行归档。| gzip > ../rootfs.gz:将cpio归档的输出通过管道传递给gzip命令进行压缩,并将压缩后的文件输出到../rootfs.gz。
2.9 文件挂载方式
qemu-img create -f raw rootfs.img 32M
mkfs -t ext4 ./rootfs.img
mkdir img
sudo mount -o loop rootfs.img ./img
sudo cp -rf ./_install/* ./img
sudo umount ./img
- 创建了一个名为
rootfs.img的16MB大小的原始格式磁盘映像文件,要小于内核配置中的Default RAM disk size - 在
rootfs.img映像文件上创建了一个ext4文件系统 -o loop:指定使用环回(loopback)设备来挂载文件系统,这样可以将一个文件当作块设备来挂载- 将
rootfs.img映像文件挂载到./img目录 - 将BusyBox的安装目录(
_install)中的所有文件和目录复制到挂载的映像文件系统中 - 卸载之前挂载的
rootfs.img映像文件
2.10 配合Linux内核运行、调试
qemu-system-x86_64 \
-kernel ./arch/x86/boot/bzImage \
# -initrd ../busybox-1.35.0/rootfs.gz \ #文件打包
-initrd ../busybox-1.35.0/rootfs.img \ #文件挂载
-append "root=/dev/ram rdinit=/linuxrc console=ttyS0 nokaslr" \
-smp 2 \
-s -S \
-nographic
-kernel ./arch/x86/boot/bzImage:指定了内核文件的路径和名称。-initrd ./rootfs.gz:指定了initrd文件的路径和名称,这通常是一个包含根文件系统的归档文件。-append "root=/dev/ram rdinit=/linuxrc console=ttyS0 nokaslr":指定了内核启动时的参数,其中root=/dev/ram表示将根文件系统挂载到内存中,rdinit=/linuxrc表示指定程序linuxrc作为初始进程。console=ttyS0表示将控制台输出发送到串行端口,输入输出定向到当前终端上。nokaslr如果之前没有关闭内核启动参数 ,禁用内核地址空间布局随机化。-hda ./rootfs.img:指定虚拟机启动时使用的硬盘镜像文件。root=/dev/sda:指定根文件系统的位置。-smp 2:指定使用2个CPU核心,以便模拟多核系统。(调试参数)-s:启用QEMU的远程调试协议(GDB)。(调试参数)-S:启动时暂停执行,等待调试器连接。(调试参数)-nographic:禁用图形界面,只使用命令行终端。- 设置网络
-
ip link set eth0 up && \ ip addr add 10.0.2.15/24 dev eth0 &&\ ip route add default via 10.0.2.2 dev eth0 &&\ echo "nameserver 8.8.8.8" >> /etc/resolv.conf

浙公网安备 33010602011771号