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

news2025/2/7 17:11:59

使用 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 命令测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2294390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尝试在Excel里调用硅基流动上的免费大语言模型

我个人觉得通过api而不是直接浏览器客户端聊天调用大语言模型是使用人工智能大模型的一个相对进阶的阶段。 于是就尝试了一下。我用的是老师木 袁进辉博士新创的硅基流动云上的免费的大模型。——虽然自己获赠了不少免费token&#xff0c;但测试阶段用不上。 具体步骤如下&am…

SqlSugar简单使用之Nuget包封装-Easy.SqlSugar.Core

SqlSugar官方文档 Nuget包开源地址 Nuget包是为了简化SqlSugar的使用步骤,增加一些基础的使用封装 引入分为两个版本&#xff0c;一个Ioc模式&#xff0c;另一个是注入模式&#xff0c;如果不想影响原本的仓储代码推荐使用Ioc模式&#xff0c;两者区别不到&#xff0c;方法通…

Linux网络 | 理解NATPT, 数据链路层Done

前言&#xff1a;本节内容结束数据链路层&#xff0c; 本节的重要内容有两个&#xff1a;一个是见一个综合性面试题&#xff0c;另一个就是NAT技术NATPT。 那么废话不多说&#xff0c; 开始我们的学习吧&#xff01;&#xff01;&#xff01; ps&#xff1a;最好先看一下上一篇…

微信小程序~django Petting pets(爱抚宠物)小程序

博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

UE (标识符, meta=())笔记

视频连接&#xff1a; [UFSH2024]UE5(标识符, meta(详解, 史上最全)) | 大钊 Epic Games 虚幻社区经理 参考文档&#xff1a; UE5标识符详解 | 史上最全 UnrealSpecifiers | UE5标识符详解 GitHub 老外整理的标识符文档 标识符 CPP_Default_ParamName&#xff08;18:22&a…

并发编程 引用类型 原子类 Stamped和Markable atomicMarkableReference表单Ref和标记Markable 面试题

目录 Stamped 和 Markable 的区别 示例代码 所以这个东西是一次性的 从来没听说过 从来没见过 Stamped 和 Markable 的区别 标记号 boolean 一次性的 版本号 整型数 不建议用 Markable 解决 ABA 问题 AtomicMarkableReference 是一个位于 java.util.concurrent.atomic 包中…

绿联NAS安装cpolar内网穿透工具实现无公网IP远程访问教程

文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 本文主要介绍如何在绿联NAS中使用ssh远程连接后&#xff0c;使用一行代码快速安装cpolar内网穿透工具&#xff0c;轻松实现随时随地远程访问本地内网中的绿联NAS&#xff0c;无需公网…

【Ubuntu】ARM交叉编译开发环境解决“没有那个文件或目录”问题

【Ubuntu】ARM交叉编译开发环境解决“没有那个文件或目录”问题 零、起因 最近在使用Ubuntu虚拟机编译ARM程序&#xff0c;解压ARM的GCC后想要启动&#xff0c;报“没有那个文件或目录”&#xff0c;但是文件确实存在&#xff0c;环境配置也检查过了没问题&#xff0c;本文记…

微信小程序~电器维修系统小程序

博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

android 适配 api 35(android 15) 遇到的问题

首先升级 targetSdkVersion 和 compileSdkVersion 到 35&#xff0c;升级后发生的报错 一、 解决方案: 升级 gradle 和 gradle 插件版本 com.android.tools.build:gradle -> 8.3.0-alpha02 gradle-wrapper.properties : distributionUrl -> gradle-8.6-bin.zip htt…

Python Pandas(3):DataFrame

1 介绍 DataFrame 是 Pandas 中的另一个核心数据结构&#xff0c;类似于一个二维的表格或数据库中的数据表。它含有一组有序的列&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔型值&#xff09;。DataFrame 既有行索引也有列索引&#xff0c;它可以被看做由…

Mac电脑上好用的压缩软件

在Mac电脑上&#xff0c;有许多优秀的压缩软件可供选择&#xff0c;这些软件不仅支持多种压缩格式&#xff0c;还提供了便捷的操作体验和强大的功能。以下是几款被广泛推荐的压缩软件&#xff1a; BetterZip 功能特点&#xff1a;BetterZip 是一款功能强大的压缩和解压缩工具&a…

BUUCTF_XSS-Lab

xss XSS&#xff08;Cross - Site Scripting&#xff09;即跨站脚本攻击&#xff0c;是一种常见的 Web 安全漏洞。攻击者通过在目标网站注入恶意脚本&#xff08;通常是 JavaScript&#xff09;&#xff0c;当其他用户访问该网站时&#xff0c;这些恶意脚本会在用户的浏览器中执…

新能源算力战争:为什么AI大模型需要绿色数据中心?

新能源算力战争:为什么AI大模型需要绿色数据中心? 近年来,人工智能(AI)大模型的爆发式增长正在重塑全球科技产业的格局。以GPT-4、Gemini、Llama等为代表的千亿参数级模型,不仅需要海量数据训练,更依赖庞大的算力支撑。然而,这种算力的背后隐藏着一个日益严峻的挑战——…

go gin配置air

一、依赖下载 安装最新&#xff0c;且在你工作区下进行安装&#xff0c;我的是D:/GO是我的工作区&#xff0c;所有项目都在目录下的src&#xff0c; go install github.com/air-verse/airlatest 如果出现类似报错&#xff1a; 将图中第三行 github.com/air-verse/air 替换最…

【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&#…

JVM图文入门

往期推荐 【已解决】redisCache注解失效&#xff0c;没写cacheConfig_com.howbuy.cachemanagement.client.redisclient#incr-CSDN博客 【已解决】OSS配置问题_keyuewenhua.oss-cn-beijing.aliyuncs-CSDN博客 【排坑】云服务器docker部署前后端分离项目域名解析OSS-CSDN博客 微服…

使用 Ollama 在腾讯云服务器环境部署 DeepSeek 大模型实战指南

文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;的应用逐渐成为技术热点&#xff0c;而 DeepSeek 作为国产开…

C++ 学习:深入理解 Linux 系统中的冯诺依曼架构

一、引言 冯诺依曼架构是现代计算机系统的基础&#xff0c;它的提出为计算机的发展奠定了理论基础。在学习 C 和 Linux 系统时&#xff0c;理解冯诺依曼架构有助于我们更好地理解程序是如何在计算机中运行的&#xff0c;包括程序的存储、执行和资源管理。这对于编写高效、可靠…

网络安全 | 零信任架构:重构安全防线的未来趋势

网络安全 | 零信任架构&#xff1a;重构安全防线的未来趋势 一、前言二、零信任架构的核心概念与原理2.1 核心概念2.2 原理 三、零信任架构的关键技术组件3.1 身份管理与认证系统3.2 授权与访问控制系统3.3 网络与安全监测系统3.4 加密与数据保护技术 四、零信任架构与传统安全…