【容器技术01】使用 busybox 构建 Mini Linux FS

发布于:2025-02-10 ⋅ 阅读:(19) ⋅ 点赞:(0)

使用 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 下以后,需要进行一些步骤

  1. 首先生成默认的配置:
make defconfig
  1. 避免出现依赖动态链接库的情况,需要进行一些配置的修改
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}" ]; then
    echo "[1/7] 下载 BusyBox ${BUSYBOX_VERSION}..."
    wget https://busybox.net/downloads/${BUSYBOX_TARBALL}
fi

# 如果 BusyBox 源码目录不存在,则解压
if [ ! -d "${BUSYBOX_DIR}" ]; then
    echo "[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; then
    sed -i 's/^# CONFIG_STATIC is not set/CONFIG_STATIC=y/' .config
fi

echo "[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 ]; then
    echo "当前非 root 用户,尝试使用 sudo 创建设备节点..."
    sudo mknod -m 600 ${TARGET_DIR}/dev/console c 5 1
    sudo mknod -m 666 ${TARGET_DIR}/dev/null c 1 3
else
    mknod -m 600 ${TARGET_DIR}/dev/console c 5 1
    mknod -m 666 ${TARGET_DIR}/dev/null c 1 3
fi

echo "创建 minimal 的 /etc/passwd 和 /etc/group 文件..."
cat > ${TARGET_DIR}/etc/passwd <<'EOF'
root:x:0:0:root:/root:/bin/sh
EOF

cat > ${TARGET_DIR}/etc/group <<'EOF'
root:x:0:
EOF

echo "=========================================="
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 目录中进行尝试了。
chroot 命令测试


网站公告

今日签到

点亮在社区的每一天
去签到