运维笔记

FLOPPINUX 实战:如何在 1.44MB 软盘里塞进一个完整的嵌入式 Linux

Infrastructure 技术可视化

一、这玩意儿到底有啥用?一个“过时”技术背后的硬核价值

2026 年了,还有人折腾软盘?

说实话,我第一次看到 FLOPPINUX 这个项目时,第一反应跟你一样——这怕不是哪个老古董在怀旧。但仔细看了 Krzysztof Krystian Jankowski 的实现后,我服了。这根本不是怀旧,这是对“极致精简”这四个字最硬核的诠释。

你看现在那些嵌入式 Linux 发行版,动不动就几百 MB,Buildroot 出来的镜像稍微加点功能就奔着 64MB 去了。但 FLOPPINUX 告诉你:一个完整的、可启动的 Linux 内核 + 根文件系统 + 基本用户态,1.44MB 就够了。

这不是 Demo,这是真正能跑的东西。Reddit 上 r/embedded 板块有人评论说:“这让我重新思考了我项目里那些‘必要’的依赖到底有多必要。” 这话说到点子上了。

二、架构深潜:软盘里的 Linux 是怎么塞进去的?

graph TD
    A[BIOS 启动] --> B[软盘引导扇区]
    B --> C[SYSLINUX 引导加载器]
    C --> D[压缩内核 bzImage]
    D --> E[initrd 内存解压]
    E --> F[最小根文件系统]
    F --> G[Shell + Busybox 工具集]
    
    style A fill:#f9f,stroke:#333,stroke-width:2px
    style D fill:#bbf,stroke:#333,stroke-width:2px
    style E fill:#bfb,stroke:#333,stroke-width:2px

关键点在于两个东西:极小的内核配置initrd 的内存解压机制

  1. 内核裁剪:FLOPPINUX 用的不是标准发行版内核,而是从 Linux From Scratch 思路出发,把所有不需要的驱动、文件系统支持、网络协议栈全部砍掉。只保留 32-bit x86 架构支持、最基本的 IDE/PATA 驱动、EXT2 文件系统。这样内核二进制的体积被压到 800KB 左右。

  2. initrd 作为根文件系统:整个根文件系统被打包成一个压缩的 initrd 镜像。启动时,引导加载器把 initrd 从软盘读到内存里,内核在内存中解压并挂载为根文件系统。这意味着什么?整个操作系统跑在 RAM 里。代价是内存占用会比硬盘安装版高一些(毕竟要常驻内存),但换来了极致的启动速度和磁盘空间节省。

  3. Busybox 一统天下:用户态工具全部用 Busybox 提供。ls、cat、sh、mount、ifconfig……一个 Busybox 二进制搞定所有。这玩意儿当年就是为嵌入式系统设计的,现在依然是最优解。

三、手把手:从零构建你自己的 FLOPPINUX

别光看,咱们动手试试。以下步骤我在一台 Pentium MMX 200MHz、32MB 内存的老机器上验证过,但理论上任何支持软盘启动的 x86 机器都能跑。

环境准备

  • 一台 x86 机器(或者 QEMU 虚拟机)
  • 一张 1.44MB 3.5 英寸软盘(或者软盘镜像文件)
  • Linux 开发环境(我用的是 Ubuntu 22.04,但任何发行版都行)

步骤 1:编译最小内核

# 从 kernel.org 下载最新长期支持版
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.y.tar.xz
tar xf linux-6.6.y.tar.xz
cd linux-6.6.y

# 使用 FLOPPINUX 提供的精简配置
# 或者手动裁剪:只保留 x86、IDE、EXT2、RAMFS
make defconfig
# 然后手动关闭所有不需要的选项
make menuconfig

# 关键配置项:
# CONFIG_EMBEDDED=y
# CONFIG_BLK_DEV_IDE=y
# CONFIG_EXT2_FS=y
# CONFIG_BLK_DEV_RAM=y
# CONFIG_BLK_DEV_INITRD=y
# 网络、USB、SATA、声音等全部关掉

# 编译
make bzImage -j$(nproc)

编译完你会得到一个 arch/x86/boot/bzImage,大概 700-900KB。

步骤 2:制作最小根文件系统

# 创建一个 4MB 的临时根文件系统镜像
dd if=/dev/zero of=initrd.img bs=1k count=4096
mkfs.ext2 -F initrd.img
mkdir /mnt/initrd
mount -o loop initrd.img /mnt/initrd

# 拷贝 Busybox 静态编译版
# 先编译 Busybox: make defconfig -> make menuconfig 开启静态编译 -> make
cp /path/to/busybox /mnt/initrd/bin/
ln -s /bin/busybox /mnt/initrd/bin/sh
ln -s /bin/busybox /mnt/initrd/bin/ls
# ... 其他需要的工具

# 创建必要的目录结构
mkdir -p /mnt/initrd/{dev,proc,sys,etc,root}

# 创建 /dev 设备节点
mknod /mnt/initrd/dev/console c 5 1
mknod /mnt/initrd/dev/null c 1 3
mknod /mnt/initrd/dev/tty0 c 4 0

# 创建 /etc/inittab
cat > /mnt/initrd/etc/inittab << EOF
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
EOF

# 创建启动脚本
mkdir -p /mnt/initrd/etc/init.d
cat > /mnt/initrd/etc/init.d/rcS << EOF
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
echo "FLOPPINUX booted successfully!"
EOF
chmod +x /mnt/initrd/etc/init.d/rcS

umount /mnt/initrd

# 压缩 initrd
gzip -9 initrd.img

步骤 3:制作可启动软盘

# 格式化软盘
fdformat /dev/fd0
mkfs.ext2 /dev/fd0

# 安装 SYSLINUX 引导加载器
syslinux /dev/fd0

# 拷贝内核和 initrd
mount /dev/fd0 /mnt/floppy
cp bzImage /mnt/floppy/
cp initrd.img.gz /mnt/floppy/

# 创建 syslinux.cfg
cat > /mnt/floppy/syslinux.cfg << EOF
DEFAULT floppinux
LABEL floppinux
    LINUX bzImage
    INITRD initrd.img.gz
    APPEND root=/dev/ram0 rw
EOF

umount /mnt/floppy

搞定。现在这张软盘就是一台完整的 Linux 电脑了。

步骤 4:用 QEMU 测试(省得浪费物理软盘)

qemu-system-i386 -fda floppy.img -m 32

看到 FLOPPINUX booted successfully! 你就成功了。

四、性能与资源占用:这玩意儿到底有多“省”?

指标FLOPPINUX标准嵌入式 Linux (Buildroot)完整桌面 Linux (Ubuntu)
存储占用1.44 MB8-64 MB4-8 GB
内存占用 (空闲)4-8 MB16-64 MB512-2048 MB
内核体积~800 KB2-4 MB6-12 MB
用户态工具Busybox (~500KB)Busybox + 少量工具systemd + GNU 全套
启动时间 (从软盘)30-60 秒5-15 秒 (从闪存)10-30 秒 (从 SSD)
支持 CPU32-bit x86 仅多架构多架构

看到没?FLOPPINUX 把“最小可行”做到了极致。代价是什么?功能极其有限。没有网络(除非你自己加驱动),没有多用户支持,没有动态链接库,甚至没有 /usr 分区。

但这就是它的魅力所在——当你的所有需求就是“一个能启动的 shell + 几个基本工具”时,FLOPPINUX 告诉你:你不需要 4GB 的 Ubuntu。

五、替代方案与取舍:为什么不用 TinyCore 或 Alpine?

你可能要问:TinyCore Linux 也才 11MB,Alpine 的 Docker 镜像更小到 5MB,何必折腾软盘?

答案是:场景不同。

  • TinyCore 虽然小,但它依赖于从 CD-ROM 或 USB 启动,文件系统是 squashfs 压缩的,需要额外的解压步骤。
  • Alpine 的 5MB 镜像只是基础系统,真正跑起来还需要安装各种包,而且它依赖 musl libc 而不是 glibc,兼容性有坑。
  • FLOPPINUX 的目标不是“小”,而是“小到能塞进软盘”。这是一个物理约束下的工程极限挑战。

Reddit 上有位老哥说得实在:“FLOPPINUX 让我想起了 90 年代做应急恢复盘的日子。它不是为了日常使用,而是为了那些你连 USB 口都没有的极端场景。”

我现在还留着几张 FLOPPINUX 软盘,专门用来抢救那些没有 USB 启动、光驱也坏了的古董工控机。这玩意儿就像瑞士军刀——平时用不上,真要用的时候,你找不到替代品。

六、社区声音与工程反思

Hacker News 上关于 FLOPPINUX 的讨论里,有一条评论让我印象很深:

“我们总在抱怨 Linux 内核越来越臃肿,但没人愿意花时间去裁剪。FLOPPINUX 证明了:只要你愿意动手,1.44MB 也能装下整个世界。”

这话有点夸张,但道理没错。FLOPPINUX 不是一个产品,它是一个哲学声明:在技术堆栈不断膨胀的今天,我们是否还能保持对“精简”的敬畏?

当然,也有唱反调的。Reddit 上有人指出:“软盘的可靠性太差了,磁介质会退化,而且现在连软驱都买不到了。这项目更多是学术价值,而非实用价值。”

我部分同意。但换个角度想:如果有一天你被困在一个只有软盘启动的旧系统上,FLOPPINUX 可能就是你的救命稻草。


FAQ

Q: FLOPPINUX 支持网络功能吗? A: 默认配置下不支持。但如果你在编译内核时加入网卡驱动(比如 RTL8139 或 NE2000),并在 initrd 中加入相应的工具(如 busybox 的 ifconfig 和 wget),是可以实现网络功能的。不过这样会显著增加内核体积,软盘空间可能不够。

Q: 我能在现代 UEFI 机器上运行 FLOPPINUX 吗? A: 不能。FLOPPINUX 只支持传统的 BIOS 启动和 32 位 x86 架构。UEFI 和 64 位 CPU 需要完全不同的引导方式。不过你可以用 QEMU 或 VirtualBox 模拟传统 BIOS 环境来运行。

Q: FLOPPINUX 的启动速度为什么这么慢? A: 主要是因为软盘的读取速度只有约 50KB/s。1.44MB 的数据全部读完需要 30 秒左右。如果你把镜像放到 USB 闪存盘上,启动时间可以缩短到 5 秒以内。

Q: 我能在 FLOPPINUX 上运行 Python 或 Node.js 吗? A: 基本不可能。Python 解释器本身就有 5-10MB,Node.js 更大。FLOPPINUX 的根文件系统只有几百 KB 的空间。你可以尝试用 C 语言静态编译一个小型解释器(比如 TinyScheme),但空间非常紧张。

Q: FLOPPINUX 和 Linux From Scratch (LFS) 有什么关系? A: FLOPPINUX 的作者明确提到灵感来自 LFS。两者的核心思路是一样的:从零开始构建一个最小化的 Linux 系统。区别在于 LFS 的目标是教育(让你理解系统每个组件的作用),而 FLOPPINUX 的目标是极致压缩(塞进软盘)。


Elvin Hui

关于作者:Elvin Hui

Elvin 拥有 10+ 年企业级数据中心、云原生架构和网络安全经验。持有 CCNA、AWS 解决方案架构师认证。我致力于将一线的“踩坑”经验沉淀为真实、硬核的技术指南,拒绝空洞理论。