当前位置: 首页 > news >正文

Debian13下使用rootfs再“运行”一个Ubuntu24

用docker podman啥的肯定是更直观和方便。但是我就是喜欢没有服务和类似“系统”的感觉

于是有了下面这个bash脚本,用于使用一个rootfs做一个小“环境”

#!/bin/bash # Ubuntu Rootfs 进入脚本 (仅 proot 模式 - 完全隔离) # 用途: 使用 proot 进入 rootfs 环境,不暴露主机文件系统 # 编码: UTF-8 # ============================================================ # 编码设置 # ============================================================ export LANG=zh_CN.UTF-8 # ============================================================ # 脚本所在目录 # ============================================================ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOTFS_DIR="${SCRIPT_DIR}/rootfs" TARBALL="${SCRIPT_DIR}/ubuntu-base-24.04.3-base-amd64.tar.gz" SETUP_FLAG="${ROOTFS_DIR}/.first_setup_done" # ============================================================ # 系统配置 # ============================================================ # 获取主机网卡的 MAC 地址后6位,生成唯一的 hostname GET_MAC=$(ip link show | grep ether | head -1 | awk '{print $2}' | tr -d ':') if [ -z "$GET_MAC" ]; then HOSTNAME="ubuntu-proot" else HOSTNAME="ubuntu-proot-${GET_MAC}" fi # DNS 配置 - 阿里云公共DNS DNS_CONFIG_V4="nameserver 223.5.5.5 nameserver 223.6.6.6" # APT 源配置 - 北外镜像 APT_SOURCES="deb [arch=amd64] http://mirrors.bfsu.edu.cn/ubuntu/ noble main restricted universe multiverse deb [arch=amd64] http://mirrors.bfsu.edu.cn/ubuntu/ noble-updates main restricted universe multiverse deb [arch=amd64] http://mirrors.bfsu.edu.cn/ubuntu/ noble-backports main restricted universe multiverse deb [arch=amd64] http://mirrors.bfsu.edu.cn/ubuntu/ noble-security main restricted universe multiverse" # ============================================================ # 检查 proot 是否可用 # ============================================================ check_proot() { command -v proot &> /dev/null } # ============================================================ # 函数: 检查并解压 rootfs # ============================================================ check_and_extract_rootfs() { if [ -d "$ROOTFS_DIR" ] && [ -d "$ROOTFS_DIR/etc" ] && [ -d "$ROOTFS_DIR/bin" ]; then echo "检测到已存在的 rootfs 目录: $ROOTFS_DIR" return 0 fi if [ ! -f "$TARBALL" ]; then echo "错误: 未找到 ubuntu-base tar.gz 文件: $TARBALL" exit 1 fi echo "正在解压 rootfs,请稍候..." mkdir -p "$ROOTFS_DIR" if ! tar -xzf "$TARBALL" -C "$ROOTFS_DIR" 2>/dev/null; then echo "错误: 解压失败" rm -rf "$ROOTFS_DIR" exit 1 fi echo "rootfs 解压完成: $ROOTFS_DIR" # 配置 APT 源 mkdir -p "$ROOTFS_DIR/etc/apt/sources.list.d" mkdir -p "$ROOTFS_DIR/etc/apt/trusted.gpg.d" rm -f "$ROOTFS_DIR/etc/apt/sources.list" 2>/dev/null || true rm -f "$ROOTFS_DIR/etc/apt/sources.list.d/"*.list 2>/dev/null || true rm -f "$ROOTFS_DIR/etc/apt/sources.list.d/"*.sources 2>/dev/null || true rm -f "$ROOTFS_DIR/etc/apt/trusted.gpg.d/"*.gpg 2>/dev/null || true rm -f "$ROOTFS_DIR/etc/apt/trusted.gpg.d/"*.asc 2>/dev/null || true rm -f "$ROOTFS_DIR/etc/apt/apt.conf.d/"* 2>/dev/null || true echo "$APT_SOURCES" > "$ROOTFS_DIR/etc/apt/sources.list" echo "已配置 APT 源(北外镜像)" # 配置主机名 echo "$HOSTNAME" > "$ROOTFS_DIR/etc/hostname" printf "127.0.0.1\tlocalhost\n127.0.1.1\t${HOSTNAME}\n" > "$ROOTFS_DIR/etc/hosts" echo "已配置主机名: $HOSTNAME" # 配置 DNS echo "$DNS_CONFIG_V4" > "$ROOTFS_DIR/etc/resolv.conf" echo "DNS 配置完成" # 配置本地化(使用中文) echo "LANG=zh_CN.UTF-8" > "$ROOTFS_DIR/etc/default/locale" echo "LANG=zh_CN.UTF-8" > "$ROOTFS_DIR/etc/environment" echo "本地化配置完成(中文 UTF-8)" # 创建必要的系统用户/组文件(proot 需要) if [ ! -f "$ROOTFS_DIR/etc/passwd" ]; then echo "root:x:0:0:root:/root:/bin/bash" > "$ROOTFS_DIR/etc/passwd" echo "root:x:0:" > "$ROOTFS_DIR/etc/group" touch "$ROOTFS_DIR/etc/shadow" touch "$ROOTFS_DIR/etc/gshadow" chmod 640 "$ROOTFS_DIR/etc/shadow" "$ROOTFS_DIR/etc/gshadow" echo "已创建系统用户/组文件" fi } # ============================================================ # 函数: 首次安装基础软件(仅首次执行) # ============================================================ first_time_setup() { echo "检测到首次解压,正在安装基础软件..." echo "(此步骤仅在首次运行时执行)" # 配置 APT 源和不安全模式 echo "正在配置 APT 源..." mkdir -p "$ROOTFS_DIR/etc/apt/apt.conf.d" echo 'Acquire::AllowInsecureRepositories "true";' > "$ROOTFS_DIR/etc/apt/apt.conf.d/99insecure" echo 'APT::Get::AllowInsecureRepositories "true";' >> "$ROOTFS_DIR/etc/apt/apt.conf.d/99insecure" # 安装基础软件(确保 htop, lsusb, lspci 等可用) # -0 参数模拟 root 身份(UID 0) echo "执行 apt-get update..." proot --rootfs="$ROOTFS_DIR" -0 -b /proc -b /sys -b /dev -w /root apt-get update 2>/dev/null || true echo "安装基础软件: htop, lsusb, lspci, lshw, bmon..." proot --rootfs="$ROOTFS_DIR" -0 -b /proc -b /sys -b /dev -w /root \ apt-get install -y --allow-unauthenticated \ sudo locales nano unzip zip htop wget net-tools xz-utils tar \ bmon curl usbutils pciutils lshw libatomic1 libssl-dev libuv1t64 libstdc++6 \ 2>/dev/null || true echo "执行 apt-get dist-upgrade..." proot --rootfs="$ROOTFS_DIR" -0 -b /proc -b /sys -b /dev -w /root apt-get dist-upgrade -y --allow-unauthenticated 2>/dev/null || true echo "执行 apt-get autoremove..." proot --rootfs="$ROOTFS_DIR" -0 -b /proc -b /sys -b /dev -w /root apt-get autoremove -y --allow-unauthenticated 2>/dev/null || true # 下载并导入 GPG 密钥 echo "正在下载并导入 GPG 密钥..." mkdir -p "$ROOTFS_DIR/etc/apt/trusted.gpg.d" TEMP_KEY_FILE="/tmp/ubuntu-archive-keyring.gpg" GPG_KEY_SOURCES=" https://ftp-master.tuna.tsinghua.edu.cn/keys/ubuntu-archive-keyring.gpg https://mirrors.tuna.tsinghua.edu.cn/keys/ubuntu-archive-keyring.gpg http://archive.key.ubuntu.com/keys/archive-master.gpg https://ftp-master.key.ubuntu.com/keys/archive-master.gpg https://keyserver.ubuntu.com/keys/archive-master.gpg " KEY_DOWNLOADED=false for KEY_URL in $GPG_KEY_SOURCES; do echo "尝试从: $KEY_URL" if curl -sL "$KEY_URL" -o "$TEMP_KEY_FILE" 2>/dev/null && [ -s "$TEMP_KEY_FILE" ]; then if grep -q "BEGIN PGP PUBLIC KEY BLOCK" "$TEMP_KEY_FILE" 2>/dev/null; then echo "GPG 密钥下载成功" KEY_DOWNLOADED=true break fi fi done if [ "$KEY_DOWNLOADED" = true ]; then cp "$TEMP_KEY_FILE" "$ROOTFS_DIR/etc/apt/trusted.gpg.d/ubuntu-archive-keyring.gpg" chmod 644 "$ROOTFS_DIR/etc/apt/trusted.gpg.d/ubuntu-archive-keyring.gpg" echo "GPG 密钥已导入" rm -f "$ROOTFS_DIR/etc/apt/apt.conf.d/99insecure" else echo "警告: 无法下载 GPG 密钥,继续使用不安全模式" fi rm -f "$TEMP_KEY_FILE" 2>/dev/null || true echo "执行 apt-get clean..." proot --rootfs="$ROOTFS_DIR" -b /proc -b /sys -b /dev -w /root apt-get clean all 2>/dev/null || true # 重新配置 hosts 文件(APT 操作可能会修改) printf "127.0.0.1\tlocalhost\n127.0.1.1\t${HOSTNAME}\n" > "$ROOTFS_DIR/etc/hosts" echo "$HOSTNAME" > "$ROOTFS_DIR/etc/hostname" # 标记首次安装完成 touch "$SETUP_FLAG" echo "首次配置完成(环境变量已优化,htop/lsusb/lspci 已就绪)" } # ============================================================ # 函数: 使用 proot 进入 rootfs(完全隔离模式) # ============================================================ enter_proot() { if ! check_proot; then echo "错误: 未安装 proot,请运行: sudo apt install proot" exit 1 fi cd "$ROOTFS_DIR" # 首次安装 if [ ! -f "$SETUP_FLAG" ]; then first_time_setup fi # 创建 .bashrc(首次后不再自动修改) cat > "$ROOTFS_DIR/root/.bashrc" << EOF # 设置 HOME 到 /root export HOME=/root # 设置主机名 hostname ${HOSTNAME} # 带彩色的 PS1 export TERM=xterm-256color PS1='\[\033[01;32m\]${HOSTNAME}\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]# ' # 启用彩色 ls alias ls='ls --color=auto' # lsusb 替代命令 - proot 环境下的 USB 设备列表 alias lsusb='for d in /sys/bus/usb/devices/*; do if [ -f "\$d/idVendor" ]; then printf "Bus %s Device %s: ID %s:%s\n" "\$(basename \$d | cut -d- -f1)" "\$(basename \$d | cut -d- -f2)" "\$(cat \$d/idVendor 2>/dev/null)" "\$(cat \$d/idProduct 2>/dev/null)"; fi; done' EOF echo ".bashrc 已配置" # ============================================================ # Proot 完全隔离模式(关键配置) # ============================================================ # # 使用 -R 参数实现完全隔离: # - 不暴露主机根目录到 /host-rootfs # - 不绑定任何主机文件到 rootfs # - 只映射必要的运行时文件确保 htop, lsusb, lspci 等可用 # # 重要说明: # -R (--rootfs): 将 rootfs 作为唯一根目录,完全隔离主机文件系统 # 绑定配置:仅使用 rootfs 内部配置文件 + 必要的运行时文件 # - /sys, /proc 是只读映射,用于查看硬件信息 echo "正在以完全隔离模式启动 proot..." echo "(主机文件系统不暴露给 proot 环境)" proot \ --rootfs="$ROOTFS_DIR" \ -b /proc \ -b /sys \ -b /dev \ -b "$ROOTFS_DIR/etc/passwd:/etc/passwd" \ -b "$ROOTFS_DIR/etc/group:/etc/group" \ -b "$ROOTFS_DIR/etc/shadow:/etc/shadow" \ -b "$ROOTFS_DIR/etc/gshadow:/etc/gshadow" \ -w /root \ /bin/bash --rcfile /root/.bashrc -i } # ============================================================ # 主程序 # ============================================================ main() { echo "========================================" echo " Ubuntu Rootfs 进入脚本 (proot)" echo " 完全隔离模式 - 不暴露主机文件" echo "========================================" check_and_extract_rootfs echo "" echo "使用 proot 模式进入 rootfs" echo "========================================" echo "提示: proot 环境已模拟 root 身份" echo " 不需要使用 sudo 或 su 命令" echo "" echo "可用命令: htop, lsusb, lspci, lshw, bmon" echo "" enter_proot echo "已退出 rootfs 环境" } main "$@"
http://www.jsqmd.com/news/525989/

相关文章:

  • 2026买二手真空泵哪家好?买进口二手真空泵哪家靠谱?一站式买进口二手真空泵哪家好选购避坑指南 - 栗子测评
  • 伏羲天气预报惊艳可视化:温度/位势高度/降水场动态热力图生成
  • 2026年比较好的徐州企业网站建设推荐:徐州公司官网网站建设客户好评推荐 - 品牌宣传支持者
  • ResNet50人脸重建效果展示:cv_resnet50_face-reconstruction重建图在印刷品(300dpi)输出中的细节保留能力
  • 嵌入式Linux网络配置避坑指南:以V3s的ephy功能为例
  • LCOV 覆盖率生成实战:从环境配置到增量分析
  • AI绘画新玩法:用Qwen底座+专属权重,让你的动漫角色“活”过来
  • AntV G6实战:5分钟搞定React项目中的关系图可视化(附完整代码)
  • macOS/Linux Gemini CLI安装指南
  • ESP32-S3与蓝牙耳机通信实战:用ESP-IDF实现零丢包的5个关键配置
  • 别再只盯着纹波了!用Keysight B2900和电子负载,手把手教你测透LDO的三大核心参数
  • Phi-3-vision-128k-instruct 安全合规应用:敏感信息图像内容审核
  • 基于岭回归的多元线性回归在多变量时间序列预测中的应用
  • 从原理到实战:手把手构建哈夫曼压缩器
  • DS18B20单总线通信协议深度解析与多平台驱动实现
  • OpenClaw对接nanobot全流程:从镜像部署到QQ机器人配置
  • Lingbot-Depth-Pretrain-ViTL-14模型GitHub仓库管理及协作开发指南
  • JVM创建对象过程
  • 绵阳诚信牙齿种植机构推荐榜:绵阳口腔医院、绵阳拔牙、绵阳洗牙机构、绵阳牙冠、绵阳牙齿根管治疗、绵阳牙齿矫正、绵阳牙齿美白选择指南 - 优质品牌商家
  • AudioSeal Pixel Studio实战案例:识别AI生成语音并自动打标水印
  • Qwen3-TTS多语言TTS实战:西班牙语营销语音+葡萄牙语产品介绍生成
  • Unity UI遮罩全攻略:从RectMask2D到SoftMask的避坑实践(2018.4.26f1版本实测)
  • 从豆瓣Top250爬虫案例,聊聊Python爬虫新手最容易踩的3个坑(及解决方案)
  • CSDN技术博客智能生成:CYBER-VISION零号协议辅助创作高质量技术文章
  • SpringBoot Hikari数据源性能调优与最佳实践
  • 致远OA二次开发:Rest用户配置与Token获取实战指南
  • ️ Python JSON/XML数据处理完全指南:从入门到实战
  • 小龙虾到底怎么设计的?技术人来看看这个深度解析:一张图拆解OpenClaw的Agent核心设计。
  • YOLOE官版镜像实操案例:YOLOE-v8s模型在Jetson Orin上的边缘部署
  • 车载以太网MACsec:构建安全通信的密钥体系与实战部署