【容器技术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.mzph.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&#…

【蓝桥杯嵌入式】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“报错…

SQL Server 数据库备份指南

SQL Server备份是数据库维护的日常工作。备份的目的是在发生数据丢失、损坏甚至硬件故障时将数据库和事务日志恢复到最近的时间点。您可以借助专业的SQL Server备份软件,操作起来更方便。前提需要安装SQL Server Management Studio (SSMS)工具。 对于 SQL 数据库备份,有多种…

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直接广播 组播 …

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就不多说…

售后板子HDMI无输出分析

问题&#xff1a; 某产品售后有1例HDMI无输出。 分析&#xff1a; 1、测试HDMI的HPD脚&#xff08;HDMI座子的19pin&#xff09;&#xff0c;测试电压4.5V&#xff0c;属于正常。 2、用万用表直流电压档&#xff0c;测试HDMI的3对数据脚和1对时钟脚&#xff08;板子通过HDM…

【声音转文字CapsWriter】声音随时转化为文字,CapsWriter提高工作效率

文章目录 前言1. 软件与模型下载2. 本地使用测试3. 异地远程使用3.1 内网穿透工具下载安装3.2 配置公网地址3.3 修改config文件3.4 异地远程访问服务端 4. 配置固定公网地址4.1 修改config文件 5. 固定tcp公网地址远程访问服务端 前言 今天我要给大家安利一个神器——CapsWrit…

十二、Docker Compose 部署 SpringCloudAlibaba 微服务

一、部署基础服务 0、项目部署结构 项目目录结构如下: /home/zhzl_hebei/ ├── docker-compose.yml └── geochance-auth/└── Dockerfile└── geochance-auth.jar └── geochance-system/└── Dockerfile└── geochance-system.jar └── geochance-gateway/…

Games104——游戏引擎Gameplay玩法系统:基础AI

这里写目录标题 寻路/导航系统NavigationWalkable AreaWaypoint NetworkGridNavigation Mesh&#xff08;寻路网格&#xff09;Sparse Voxel Octree Path FindingDijkstra Algorithm迪杰斯特拉算法A Star&#xff08;A*算法&#xff09; Path Smoothing Steering系统Crowd Simu…

Win11非虚拟机安装ISE14.7

官网下载6.18GB 的 Full Installer for Windows 7/XP/Server解压后运行安装程序不勾选Enable WebTalk to send software, IP ...安装程序卡死在ISE:Configure WebTalk&#xff0c;此时打开任务管理器&#xff0c;在详情中找到xwebtalk&#xff0c;右键结束任务。安装程序继续进…

从0开始达芬奇(3.8)

剪视频有主次之分&#xff0c;主就是Aroll&#xff0c;次就是Broll。 智能媒体夹&#xff1a; 媒体池的智能媒体夹部分可以很好区分主次。这个相当于智能搜索&#xff0c;当有大量的素材时&#xff0c;可以为这些素材标明信息&#xff0c;下次使用不需要反复看&#xff0c;直…

python算法和数据结构刷题[3]:哈希表、滑动窗口、双指针、回溯算法、贪心算法

回溯算法 「所有可能的结果」&#xff0c;而不是「结果的个数」&#xff0c;一般情况下&#xff0c;我们就知道需要暴力搜索所有的可行解了&#xff0c;可以用「回溯法」。 回溯算法关键在于:不合适就退回上一步。在回溯算法中&#xff0c;递归用于深入到所有可能的分支&…

基于Java(SpringBoot)+MySQL+Vue实现的平行志愿录取系统

基于spring bootvue实现的平行志愿录取系统 1.项目简介 这两天干上高考出成绩&#xff0c;有不少亲戚家的孩子今年高考&#xff0c;和我询问关于报志愿的问题。老家河北今年是采用所谓的平行志愿。我看了很多的资料才明白什么叫所谓的“平行志愿”。 整个流程好像很是复杂。…

chrome浏览器chromedriver下载

chromedriver 下载地址 https://googlechromelabs.github.io/chrome-for-testing/ 上面的链接有和当前发布的chrome浏览器版本相近的chromedriver 实际使用感受 chrome浏览器会自动更新&#xff0c;可以去下载最新的chromedriver使用&#xff0c;自动化中使用新的chromedr…

Redis常见数据类型与编码方式

⭐️前言⭐️ 本小节围绕Redis中常见的数据类型与编码方式展开。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主日常练习代码均已上传GitHu…

win编译openssl

一、perl执行脚本 1、安装perl脚本 perl安装 2、配置perl脚本 perl Configure VC-WIN32 no-asm no-shared --prefixE:\openssl-x.x.x\install二、编译openssl 1、使用vs工具编译nmake 如果使用命令行nmake编译会提示“无法打开包括文件: “limits.h”“ 等错误信息 所以…