首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

嵌入式 Linux 根文件系統構建全過程:基於 BusyBox 1.00 實戰

     編輯:Java 綜合教學

概述

構建一個最小可啟動的 Linux 根文件系統是嵌入式開發核心技能。本文記錄基於 Linux 2.4.18 內核、BusyBox 1.00、glibc 2.3.2 環境下,從編譯到鏡像生成的完整流程。

一、BusyBox 編譯與依賴分析

1. 編譯步驟

# 在虛擬機 RedHat 9.0 中編譯
tar -xvf busybox-1.00.tar.gz
cd busybox-1.00
make menuconfig  # 關鍵:取消選中 "Build BusyBox as a static binary"
make
make install     # 生成 _install 目錄,包含 bin/sbin/usr/sbin 等

2. 動態庫依賴檢查

readelf -a ./busybox | grep "NEEDED"
# 輸出:
# Shared library: [libm.so.6]     -> 數學庫,可選
# Shared library: [libcrypt.so.1] -> 加密庫,可選
# Shared library: [libc.so.6]     -> C庫,核心依賴,必須包含

結論:根文件系統 lib 目錄必須包含 libc.so.6、ld-linux.so.2(動態鏈接器),視情況包含 libm、libcrypt。

二、內核修改:解除根文件系統唯讀限制

修改 init/main.c 第 128 行左右:

// 原代碼:int root_mountflags = MS_RDONLY;
int root_mountflags = 0;  // 允許讀寫掛載

此修改使內核掛載根設備(如 /dev/hda1)時不帶 MS_RDONLY 標誌,否則後續 mount -a 掛載 /proc 等會失敗。

三、關鍵目錄與文件準備

1. /etc 目錄結構

etc
├── fstab          # 靜態文件系統信息
├── init.d
│   └── rcS        # 系統啟動腳本
└── mtab           # 當前掛載狀態(運行時生成,打包時可空或不包含)

2. fstab 內容

# 文件系統  掛載點  類型  選項  dump  fsck順序
proc  /proc  proc  defaults  0  0

3. rcS 內容

#!/bin/sh
mount -a  # 根據 fstab 掛載所有文件系統

四、根文件系統鏡像制作腳本:creatext2.sh

該腳本集成了:創建空鏡像、分區、格式化、掛載、複製文件、卸載清理全流程。

#!/bin/sh
TOPDIR=`pwd`

# 核心參數
IMG_FILE=./hdc.img
IMG_SIZE_MB=64
PART_START_SECTOR=2048  # 1MB 偏移 (512*2048)
PART_END_SECTOR=131071  # 64MB 結束

# 1. 創建文件系統目錄結構並複製文件
create_fs() {
    cd /tmp/ext2
    sudo mkdir -pv dev/ tmp/ sys/ proc/
    sudo mknod ./dev/tty1 c 4 1
    sudo mknod ./dev/console c 5 1
    sudo cp -arf $TOPDIR/lib ./
    sudo cp -arf $TOPDIR/bin ./
    sudo cp -arf $TOPDIR/sbin ./
    sudo cp -arf $TOPDIR/etc ./
}

# 2. 掛載鏡像分區
mount_fs() {
    sudo losetup /dev/loop0 $IMG_FILE
    sudo losetup -o 1048576 /dev/loop1 /dev/loop0  # 偏移 1MB 到分區開始
    sudo mount -t ext2 /dev/loop1 /tmp/ext2/
}

# 3. 完整鏡像制作流程
make_fs() {
    dd if=/dev/zero of=$IMG_FILE bs=1M count=$IMG_SIZE_MB
    # fdisk 分區: n(新建) p(主分區) 1(分區號) 2048(起始) 131071(結束) t(類型) 83(Linux) w(寫入)
    fdisk $IMG_FILE <

五、文件系統目錄樹與核心文件說明

.
├── bin                    # 用戶命令 (均鏈接到 busybox)
│   ├── busybox
│   ├── sh -> busybox
│   ├── ls -> busybox
│   └── ... (cat, cp, mount, vi 等)
├── lib                    # 核心動態庫
│   ├── ld-linux.so.2      # 動態鏈接器
│   ├── libc-2.3.2.so
│   ├── libc.so.6 -> libc-2.3.2.so
│   ├── libm-2.3.2.so
│   ├── libm.so.6 -> libm-2.3.2.so
│   ├── libcrypt-2.3.2.so
│   └── libcrypt.so.1 -> libcrypt-2.3.2.so
├── sbin                   # 系統管理命令 (鏈接到 ../bin/busybox)
│   ├── init -> ../bin/busybox
│   ├── ifconfig -> ../bin/busybox
│   └── insmod, lsmod, rmmod ...
├── etc                    # 配置文件
│   ├── fstab
│   └── init.d/rcS
└── creatext2.sh           # 製作腳本

六、打包下載

完整源碼目錄結構已打包:ext2.rar(下載後重命名為 ext2.tar.gz 解壓)。

目錄結構圖

總結

根文件系統構建的核心在於:內核配置匹配(讀寫掛載)、動態庫完整性(ldd/readelf 分析)、初始化腳本正確性(rcS/fstab)、設備節點創建(mknod console/tty)。掌握此流程,可為任何嵌入式板卡定制最小啟動環境。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved