【容器技術01】使用 busybox 構建 Mini Linux FS

使用 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}" ]; 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 目錄中進行嘗試了。
chroot 命令測試

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894813.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C語言系列】深入理解指針(5)

深入理解指針&#xff08;5&#xff09; 一、sizeof和strlen的對比1.1sizeof1.2strlen1.3sizeof和strlen的對比 二、數組和指針筆試題解析2.1 一維數組2.2 字符數組2.2.1代碼1&#xff1a;2.2.2代碼2&#xff1a;2.2.3代碼3&#xff1a;2.2.4代碼4&#xff1a;2.2.5代碼5&#…

標志的推理

下面的討論是我對《對編程實現擬人智能可行性的論證》這篇文章的“賦值與對象的標志”這一節的展開討論。 標志能夠使我們更好的思維&#xff08;比如用輪廓標記物體對象&#xff0c;用興奮強度標記回憶情況等等&#xff09;。有思維標志、信息標志&#xff0c;單純標志、組合…

【藍橋杯嵌入式】2_LED

1、電路圖 74HC573是八位鎖存器&#xff0c;當控制端LE腳為高電平時&#xff0c;芯片“導通”&#xff0c;LE為低電平時芯片“截止”即將輸出狀態“鎖存”&#xff0c;led此時不會改變狀態&#xff0c;所以可通過led對應的八個引腳的電平來控制led的狀態&#xff0c;原理圖分析…

Diskgenius系統遷移之后無法使用USB啟動

前言 本文用于記錄系統遷移中遇到的問題及解決方法&#xff0c;如有不對請指出&#xff0c;謝謝&#xff01; 現象 使用DiskGenius進行系統遷移后&#xff0c;使用USB啟動失敗&#xff0c;反復在品牌logo和黑屏之間切換&#xff0c;期間還會在左上角顯示”reset system“報錯…

使用 Postman 進行 API 測試:從入門到精通

使用 Postman 進行 API 測試&#xff1a;從入門到精通 使用 Postman 進行 API 測試&#xff1a;從入門到精通一、什么是 API 測試&#xff1f;二、Postman 簡介三、環境搭建四、API 測試流程1. 收集 API 文檔2. 發送基本請求示例&#xff1a;發送 GET 請求示例代碼&#xff08;…

Android Studio:Application 和 Activity的區別

Application 和 Activity 是 Android 中非常重要的兩個組件&#xff0c;它們分別負責不同的生命周期管理和應用的不同層次的操作。 Application 是應用級別的生命周期管理&#xff0c;它在整個應用運行時只有一個實例&#xff0c;負責應用的全局初始化和資源管理。Activity 是…

Mac本地體驗LM studio

博主很懶&#xff0c;不愛打字&#xff01; 1、LM studio官網&#xff1a;LM Studio - Discover, download, and run local LLMs 2、下載DMG文件&#xff0c;安裝 3、使用vscode工具&#xff0c;commandshiftH【全局替換功能】&#xff0c;選擇目錄/Applications/LM\ Studio…

SQL Server 數據庫備份指南

SQL Server備份是數據庫維護的日常工作。備份的目的是在發生數據丟失、損壞甚至硬件故障時將數據庫和事務日志恢復到最近的時間點。您可以借助專業的SQL Server備份軟件,操作起來更方便。前提需要安裝SQL Server Management Studio (SSMS)工具。 對于 SQL 數據庫備份,有多種…

我最近在干什么【2】

前言 這系列的上一篇是2024.12.05寫的&#xff0c;現在是2025.02.06&#xff0c;這都兩個月&#x1f914;小久。 不是完整全面的技術分享&#xff0c;話題聚焦個人成長&#xff08;學的技術、了解到的信息、看的書……&#xff09; 方面。文章偏意識流點&#xff0c;單純分享我…

Temperature、Top-P、Top-K、Frequency Penalty詳解

在生成式AI&#xff08;比如ChatGPT&#xff09;中&#xff0c;Temperature、Top-P、Top-K、Frequency Penalty 這些參數用于控制文本生成的多樣性、隨機性和重復度&#xff0c;它們的作用如下&#xff1a; 1. Temperature&#xff08;溫度&#xff09; 作用&#xff1a;控制輸…

4. Go結構體使用

1、結構體的簡介 結構體&#xff08;Struct&#xff09;是編程語言中常見的一種復合數據類型&#xff0c;它將不同類型的數據元素&#xff08;成員&#xff09;組合成一個單一的實體。通過結構體&#xff0c;程序員可以將具有不同類型和性質的信息綁定到一個對象中&#xff0c…

sqlite 查看表結構

在SQLite中&#xff0c;查看表結構通常有以下幾種方法&#xff1a; 使用.schema命令 在SQLite的命令行界面中&#xff0c;你可以使用.schema命令加上表名來查看該表的結構。例如&#xff0c;如果你想查看名為your_table_name的表結構&#xff0c;你可以這樣做&#xff1a; .s…

SpringAI介紹及本地模型使用方法

博客原文地址 前言 Spring在Java語言中一直穩居高位&#xff0c;與AI的洪流碰撞后也產生了一些有趣的”化學反應“&#xff0c;當然你要非要說碰撞屬于物理反應也可以&#xff0c; 在經歷了一系列復雜的反應方程后&#xff0c;Spring家族的新成員——SpringAI&#xff0c;就…

ip地址是手機號地址還是手機地址

在數字化生活的浪潮中&#xff0c;IP地址、手機號和手機地址這三個概念如影隨形&#xff0c;它們各自承載著網絡世界的獨特功能&#xff0c;卻又因名稱和功能的相似性而時常被混淆。尤其是“IP地址”這一術語&#xff0c;經常被錯誤地與手機號地址或手機地址劃上等號。本文旨在…

車載以太網__傳輸層

車載以太網中&#xff0c;傳輸層和實際用的互聯網相差無幾。本篇文章對傳輸層中的IP進行介紹 目錄 什么是IP&#xff1f; IP和MAC的關系 IP地址分類 私有IP NAT DHCP 為什么要防火墻穿透&#xff1f; 廣播 本地廣播 直接廣播 本地廣播VS直接廣播 組播 …

Docker 數據卷(Volume)詳細介紹

Docker 數據卷&#xff08;Volume&#xff09;詳細介紹 1. 什么是 Docker 數據卷&#xff1f; Docker 數據卷&#xff08;Volume&#xff09;是一種用于 持久化數據 和 容器間數據共享 的機制。由于容器的存儲是臨時的&#xff0c;容器刪除后其中的數據會丟失&#xff0c;因此…

wxWidgets生成HTML文件,帶圖片轉base64數據

編譯環境大家可以看我之前的文章,CodeBlocks + msys2 + wx3.2,win10 這里功能就是生成HTML文件,沒用HTML庫,因為是自己固定的格式,圖片是一個vector,可以動態改變數量的。 效果如下: #include <wx/string.h> #include <wx/file.h> #include <wx/ima…

網絡原理一>數據鏈路層協議->以太網協議

目錄 以太網協議的結構&#xff1a;類型&#xff1a;ARP請求應答報文&#xff1a;CRC&#xff1a;MTU: 為什么需要mac地址&#xff1a;mac地址和IP地址的區別&#xff1a; 以太網協議的結構&#xff1a; 以太網是數據鏈路層和物理層的主要協議 源IP&#xff0c;目的IP就不多說…

瘋狂SQL轉換系列- SQL for Milvs2.4

鑒于Milvus仍在不停的迭代新版本&#xff0c;推出新功能&#xff0c;其SDK目前并不穩定。目前其2.4版本的SDK接口已與之前的2.2版本有了較大的差別&#xff0c;功能上也有了一定的調整。為此&#xff0c;我們重新提供了針對[Milvus2.4](https://github.com/colorknight/moql-tr…

售后板子HDMI無輸出分析

問題&#xff1a; 某產品售后有1例HDMI無輸出。 分析&#xff1a; 1、測試HDMI的HPD腳&#xff08;HDMI座子的19pin&#xff09;&#xff0c;測試電壓4.5V&#xff0c;屬于正常。 2、用萬用表直流電壓檔&#xff0c;測試HDMI的3對數據腳和1對時鐘腳&#xff08;板子通過HDM…