1. 切换到root 用户
实验全程需要root权限,先激活并切换root:
sudo passwd root # 设置root密码(按提示输入2次)
su - root # 切换到root(后续所有命令都在root下执行)
2. 安装依赖工具
更新源+安装编译/分区/grub/qemu等依赖
apt update && apt install -y \
fdisk losetup grub2-common grub-pc-bin \
build-essential libncurses5-dev libssl-dev \
wget bzip2 xz-utils qemu-system-x86 qemu-utils \
gcc-multilib make menuconfig

3. 创建磁盘映像文件
创建工作目录
mkdir /root/minilinux
cd /root/minilinux/
生成128M空磁盘镜像(dd命令和原教程一致)
dd if=/dev/zero of=minilinux_disk.img bs=1M count=128

4. 对磁盘分区(fdisk 操作)
fdisk minilinux_disk.img
执行交互式操作:
输入 n → 创建新分区
分区类型选 p(主分区)→ 回车
分区号选 1 → 回车
第一个扇区默认 2048 → 回车
最后扇区默认 262143 → 回车
输入 w → 保存分区表并退出

5. 关联磁盘分区(losetup 调整)
查看分区信息(验证分区是否创建成功)
fdisk -l minilinux_disk.img
卸载loop0(若已挂载,无输出则忽略)
umount /dev/loop0 2>/dev/null
关联分区(偏移量=2048*512=1048576)
losetup -o 1048576 /dev/loop0 minilinux_disk.img

6. 格式化 + 挂载分区
格式化loop0为ext4
mkfs.ext4 /dev/loop0
创建挂载点并挂载
mkdir /mnt/minilinux
mount -t ext4 /dev/loop0 /mnt/minilinux

7. 安装GRUB
grub-install \
--boot-directory=/mnt/minilinux/boot/ \
--target=i386-pc \
--modules=part_msdos \
--force \
./minilinux_disk.img

8. 下载+ 编译Linux 内核
wget https://mirror.tuna.tsinghua.edu.cn/kernel/v6.x/linux-6.1.11.tar.xz
解压
tar -xvf linux-6.1.11.tar.xz

看到有许多文件
9. 配置+ 编译内核
cd /root/minilinux/linux-6.1.11/
生成默认配置(x86_64)
make x86_64_defconfig
图形化配置(启用RAM块设备)
make menuconfig
在弹出的菜单中按路径选择Device Drivers按空格勾选

找到Block devices,按回车键

勾选[*]RAM block device support

选Save保存,按ESC退出。
编译内核(-j4根据CPU核心数调整,如8核用-j8)
make -j4 bzImage

等待10分钟。
复制编译好的内核到挂载目录
cp arch/x86/boot/bzImage /mnt/minilinux/boot/
验证复制结果
ls -lh /mnt/minilinux/boot/bzImage
能看到文件大小则复制成功

10. 制作initrd (根文件系统)
生成空initrd镜像并格式化
cd /root/minilinux/
生成4M空镜像
dd if=/dev/zero of=initrd.img bs=1M count=4
格式化ext4
mkfs.ext4 initrd.img

创建挂载点并挂载initrd
mkdir /mnt/rootfs
mount -o loop initrd.img /mnt/rootfs
下载BusyBox
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar xjvf busybox-1.36.1.tar.bz2

cd busybox-1.36.1/
配置BusyBox(静态编译)
make menuconfig
选择Settings

选择Build Options,勾选[*]Build static binary (no shared libs)

保存退出
按ESC键逐级退出子菜单(先退出Build Options,再退出Settings);
回到BusyBox配置的主界面后,底部会显示<Save>按钮;

编译+安装到rootfs
make -j8

make CONFIG_PREFIX=/mnt/rootfs install

11. 配置init 脚本和设备文件
创建rootfs挂载点(若不存在)
mkdir -p /mnt/rootfs
挂载initrd.img到rootfs(必须先挂载,否则文件写入到空目录)
mount -o loop /root/minilinux/initrd.img /mnt/rootfs
mkdir -p /mnt/rootfs/etc/init.d/
cat > /mnt/rootfs/etc/init.d/rcS << EOF
#!/bin/busybox sh
echo "Hello miniLinux!"
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev
EOF
chmod +x /mnt/rootfs/etc/init.d/rcS
mkdir -p /mnt/rootfs/dev # 加-p避免重复创建报错
mknod /mnt/rootfs/dev/console c 5 1 # 控制台字符设备(必选)
mknod /mnt/rootfs/dev/ram b 1 0 # RAM块设备(必选)
mknod /mnt/rootfs/dev/null c 1 3 # 补充null设备(避免程序报错)
umount /mnt/rootfs
mkdir -p /mnt/minilinux/boot/grub # 补全grub目录(关键)
cp /root/minilinux/initrd.img /mnt/minilinux/boot/
cat > /mnt/minilinux/boot/grub/grub.cfg <<EOF
set timeout=10
set default=0
menuentry 'miniLinux 6.1.11' {
linux /boot/bzImage root=/dev/ram0 rw init=/linuxrc console=tty0 console=ttyS0,115200
initrd /boot/initrd.img
}
EOF
验证/mnt/minilinux/boot/目录内容
ll -h /mnt/minilinux/boot/

12. 编写grub.cfg (启动配置)
cd /mnt/minilinux/boot/grub/
生成grub.cfg配置文件
cat > grub.cfg << EOF
menuentry "minilinux" {
linux (hd0,msdos1)/boot/bzImage root=/dev/ram rw init=/linuxrc console=ttyS0
initrd (hd0,msdos1)/boot/initrd.img
}
EOF
解除loop0关联
losetup -d /dev/loop0
启动命令(模拟x86架构,挂载磁盘镜像)
qemu-system-x86_64 \
-kernel /mnt/minilinux/boot/bzImage \
-initrd /mnt/minilinux/boot/initrd.img \
-append "root=/dev/ram0 rw init=/linuxrc console=ttyS0,115200" \
-serial mon:stdio \
-nographic \
-m 128M
并进入BusyBox的shell(/#提示符),说明迷你Linux构建成功。
