使用 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 目錄中進行嘗試了。