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

相关推荐
倔强的石头106几秒前
【Linux指南】基础IO系列(一)Linux 文件本质揭秘 —— 从 “磁盘文件” 到 “一切皆文件”
linux·运维·服务器
robitmind1 分钟前
操作input子系统,用模拟按键输入解锁ubuntu锁屏
linux·运维·ubuntu
2023自学中1 分钟前
imx6ull , 4.3寸800*480屏幕,触摸芯片型号 gt9147,显示触摸点的坐标数据
linux·嵌入式硬件
落羽的落羽4 分钟前
【Linux系统】文件IO:理解文件描述符、重定向、缓冲区
linux·服务器·开发语言·数据结构·c++·人工智能·机器学习
xie_pin_an5 分钟前
Linux 基础入门:从历史到核心指令全解析
linux·运维·服务器
ajole8 分钟前
Linux学习笔记——基本指令
linux·服务器·笔记·学习·centos·bash
嵌入小生0079 分钟前
数据结构与算法 | 完全二叉树的实现、哈希表的实现
linux·c语言·数据结构·算法·vim·嵌入式
晨非辰30 分钟前
Linux包管理器速成:yum/apt双精要/镜像源加速/依赖解析30分钟通解,掌握软件安装的艺术与生态哲学
linux·运维·服务器·c++·人工智能·python
碎梦归途9 小时前
思科网络设备配置命令大全,涵盖从交换机到路由器的核心配置命令
linux·运维·服务器·网络·网络协议·路由器·交换机
小天源9 小时前
nginx在centos7上热升级步骤
linux·服务器·nginx