使用 busybox 构建 Mini Linux FS
构建目标
在 Linux 文件系统下构建一个 Mini 的文件系统,构建目标如下:
minilinux
├── bin
│ ├── ls
│ ├── top
│ ├── ps
│ ├── sh
│ └── …
├── dev
├── etc
│ ├── group
│ ├── localtime
│ ├── network
│ ├── passwd
│ └── shadow
├── home
├── proc
├── root
├── tmp
├── usr
│ └── sbin
└── var├── spool└── www
构建成功后,可以使用 chroot 命令进入其中、执行一些简单的命令,例如 ls、cd 等。
2. 下载 & 编译 busybox
下载 busybox 源码(版本自己选择),下载之后进行解压操作(随意位置都可以),解压后进入
wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
tar xjf busybox-1.35.0.tar.bz2
cd busybox-1.35.0
3. 配置 BusyBox
cd 到 busybox-1.35.0 下以后,需要进行一些步骤
- 首先生成默认的配置:
make defconfig
- 避免出现依赖动态链接库的情况,需要进行一些配置的修改
sed -i 's/^# CONFIG_STATIC is not set/CONFIG_STATIC=y/' .config
4. 编译 BusyBox
执行以下命令进行编译:
make -j4
5. 创建目标目录
在 BusyBox 源码根目录之外,新建一个目标目录,并创建必需的目录结构(这里在 busybox 同级目录下创建一个 minilinux 的目录,也可以自定义,不过后续的相关命令也需要修改)。
mkdir -p ../minilinux/{bin,dev,etc,home,proc,root,tmp,usr/sbin,var/spool,var/www}
6. 安装 BusyBox
在 源码目录下执行(如果第五步创建目标目录时修改过目录位置,这里也需要进行对应的修改):
make CONFIG_PREFIX=../minilinux install
7. 脚本示例
将以上的所有步骤集合到一个脚本中,该脚本会自动完成下载、编译 BusyBox(启用静态编译)、构建自定义目录名的迷你 Linux 文件系统(包括创建必要的目录、设备节点及基本的 /etc 文件)。
#!/bin/bash
# 构建迷你 Linux 文件系统(使用 BusyBox)
#
# 使用方法:
# ./build_minilinux.sh [target_directory]
#
# 如果未指定 target_directory,则默认使用 "minilinux" 作为构建目录。
#
# 构建步骤:
# 1. 下载 BusyBox(默认为 1.35.0 版本)
# 2. 解压并生成默认配置,启用静态编译(CONFIG_STATIC=y)
# 3. 编译 BusyBox
# 4. 创建目标目录结构,并安装 BusyBox 到目标目录中
# 5. 创建必要的设备节点(/dev/console 与 /dev/null)
# 6. 创建 minimal 的 /etc/passwd 和 /etc/group
# 7. 输出后续使用提示(如何 mount /proc 及 chroot)set -e# 默认目标目录为 "minilinux",可通过参数自定义
TARGET_DIR=${1:-minilinux}
BUSYBOX_VERSION="1.35.0"
BUSYBOX_TARBALL="busybox-${BUSYBOX_VERSION}.tar.bz2"
BUSYBOX_DIR="busybox-${BUSYBOX_VERSION}"echo "=========================================="
echo "构建迷你 Linux 文件系统"
echo "目标目录: ${TARGET_DIR}"
echo "BusyBox 版本: ${BUSYBOX_VERSION}"
echo "=========================================="# 如果 BusyBox 压缩包不存在,则下载
if [ ! -f "${BUSYBOX_TARBALL}" ]; thenecho "[1/7] 下载 BusyBox ${BUSYBOX_VERSION}..."wget https://busybox.net/downloads/${BUSYBOX_TARBALL}
fi# 如果 BusyBox 源码目录不存在,则解压
if [ ! -d "${BUSYBOX_DIR}" ]; thenecho "[2/7] 解压 BusyBox..."tar xjf ${BUSYBOX_TARBALL}
fi# 进入 BusyBox 源码目录
cd ${BUSYBOX_DIR}echo "[3/7] 生成默认配置,并启用静态编译..."
make defconfig# 启用静态编译:将 "# CONFIG_STATIC is not set" 替换为 "CONFIG_STATIC=y"
if grep -q "^# CONFIG_STATIC is not set" .config; thensed -i 's/^# CONFIG_STATIC is not set/CONFIG_STATIC=y/' .config
fiecho "[4/7] 编译 BusyBox..."
make -j$(nproc)# 返回上层目录,并创建目标文件系统目录结构
cd ..
echo "[5/7] 创建目标目录结构 ${TARGET_DIR} ..."
mkdir -p ${TARGET_DIR}/{bin,dev,etc,home,proc,root,tmp,usr/sbin,var/spool,var/www}echo "[6/7] 安装 BusyBox 到 ${TARGET_DIR} ..."
cd ${BUSYBOX_DIR}
make CONFIG_PREFIX=../${TARGET_DIR} install
cd ..echo "[7/7] 创建必要的设备节点..."
# 创建 /dev/console 和 /dev/null(需要 root 权限,如果不是 root,则使用 sudo)
if [ $(id -u) -ne 0 ]; thenecho "当前非 root 用户,尝试使用 sudo 创建设备节点..."sudo mknod -m 600 ${TARGET_DIR}/dev/console c 5 1sudo mknod -m 666 ${TARGET_DIR}/dev/null c 1 3
elsemknod -m 600 ${TARGET_DIR}/dev/console c 5 1mknod -m 666 ${TARGET_DIR}/dev/null c 1 3
fiecho "创建 minimal 的 /etc/passwd 和 /etc/group 文件..."
cat > ${TARGET_DIR}/etc/passwd <<'EOF'
root:x:0:0:root:/root:/bin/sh
EOFcat > ${TARGET_DIR}/etc/group <<'EOF'
root:x:0:
EOFecho "=========================================="
echo "迷你 Linux 文件系统已构建在目录: ${TARGET_DIR}"
echo ""
echo "测试方法:"
echo "1. 挂载 /proc(用于部分命令):"
echo " sudo mount -t proc proc ${TARGET_DIR}/proc"
echo "2. 使用 chroot 进入新系统:"
echo " sudo chroot ${TARGET_DIR} /bin/sh"
echo "3. 退出后,请卸载 /proc:"
echo " sudo umount ${TARGET_DIR}/proc"
echo "=========================================="
在创建完毕后,就可以使用 chroot
命令进入 minilinux 目录中进行尝试了。