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

 

 

 

 

 

 

 

 

 

一、文件下载

BusyBox下载地址

二、制作文件系统

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/mdevmdev是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 -ocpio 是一个用于复制文件和目录的工具,这里使用的是 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 
    

      

posted @ 2026-02-13 15:28  rincloud  阅读(1)  评论(0)    收藏  举报