极简版Linux发行内核

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构建成功。

相关推荐
管理大亨2 小时前
Linux vs Windows:五大维度深度对决
linux·arm开发·windows
乘凉~2 小时前
【Linux作业】Limux下的python多线程爬虫程序设计
linux·爬虫·python
Trouvaille ~2 小时前
【Linux】库制作与原理(二):ELF格式与静态链接原理
linux·运维·c语言·操作系统·动静态库·静态链接·elf文件
KingRumn3 小时前
Linux信号之信号安全
linux·算法
Trouvaille ~3 小时前
【Linux】库制作与原理(三):动态链接与加载机制
linux·c语言·汇编·got·动静态库·动态链接·plt
APIshop3 小时前
高性能采集方案:淘宝商品 API 的并发调用与数据实时处理
linux·网络·算法
松涛和鸣3 小时前
DAY38 TCP Network Programming
linux·网络·数据库·网络协议·tcp/ip·算法
川213 小时前
ZooKeeper配置+失误
linux·分布式·zookeeper
向日葵.3 小时前
中间件交接文档
linux·运维·服务器