如何快速查找离线磁盘中的根分区?—— find_root_partition_offline.sh 一键搞定!

📌 你是否遇到以下问题?

✅ 你有一个 虚拟磁盘镜像(.img.qcow2,但不确定哪个分区是根文件系统?
✅ 你想要 恢复系统或手动修复根文件系统,但找不到正确的分区?
✅ 你有一块 物理磁盘(如 /dev/sdb,但不知道哪个分区存放了 Linux 根文件系统?

🎯 今天带来的 find_root_partition_offline.sh,可以帮助你快速定位磁盘中的根分区,无需手动查找!


📜 find_root_partition_offline.sh 介绍

💡 这个脚本的作用在离线磁盘(虚拟磁盘或物理磁盘)中查找根文件系统所在的分区,适用于各种 Linux 发行版。

🎯 核心功能:
支持虚拟磁盘和物理磁盘,可自动识别类型
智能检测 /bin/etc/sbin 目录,确定根分区
自动挂载和卸载分区,无需手动操作
支持 .img.qcow2 等虚拟磁盘格式,兼容 qemu-nbd

📌 适用于 Linux 服务器、虚拟机管理、数据恢复、嵌入式设备等场景!


🚀 代码解析

📌 1️⃣ 安装依赖

install_dependencies() {
    local required=("qemu-img" "qemu-nbd" "partprobe" "lsblk" "df")
    local missing=()

    for cmd in "${required[@]}"; do
        if ! command -v "$cmd" >/dev/null 2>&1; then
            missing+=("$cmd")
        fi
    done

    if [ ${#missing[@]} -eq 0 ]; then
        return 0
    fi

    echo "检测到缺少依赖命令: ${missing[*]},尝试自动安装..."
    sudo apt-get update -qq
    sudo apt-get install -y -qq qemu-utils parted >/dev/null
}

🎯 作用:

  • 检查系统是否安装了 qemu-imgqemu-nbdpartprobe 等必要工具。
  • 如果缺失,则 自动安装,确保脚本可以运行。

📌 适用于 Ubuntu/Debian,其他发行版可手动安装对应软件包。


🔍 2️⃣ 识别输入类型

if [[ -f "$disk_path" ]]; then
    IS_VIRTUAL=true
    check_disk_format "$disk_path"
    setup_nbd "$disk_path"
    device="$NBD_DEVICE"
elif [[ -b "$disk_path" ]]; then
    if [[ $(lsblk -d -no TYPE "$disk_path") != "disk" ]]; then
        echo "错误:请指定整个磁盘设备(例如 /dev/sdb),而不是单个分区。"
        exit 1
    fi
    IS_VIRTUAL=false
    device="$disk_path"
else
    echo "错误:无效的输入,必须是磁盘镜像文件或块设备。"
    exit 1
fi

🎯 作用:

  • 自动判断用户输入是物理磁盘(如 /dev/sdb)还是虚拟磁盘(如 disk.img
  • 虚拟磁盘:使用 qemu-nbd 挂载
  • 物理磁盘:直接使用设备路径

📌 这样,用户不需要关心磁盘类型,脚本会自动处理!


🔗 3️⃣ 挂载磁盘并查找根文件系统

for part in $partitions; do
    local partition="/dev/$part"
    local mount_point="/mnt/$part"

    echo "挂载分区 $partition$mount_point..."
    sudo mkdir -p "$mount_point"
    if ! sudo mount "$partition" "$mount_point"; then
        echo "挂载分区 $partition 失败,跳过该分区。"
        continue
    fi
    MOUNT_POINTS+=("$mount_point")
done

🎯 作用:

  • 自动挂载磁盘上的所有分区,无需手动查找
  • 遇到 无法挂载的分区,会自动跳过,防止脚本报错

📌 适用于多分区磁盘,确保所有可能的根分区都能检测到!


📌 4️⃣ 识别根文件系统

is_root_partition() {
    local mount_point="$1"
    [[ -d "$mount_point/bin" && -d "$mount_point/etc" && -d "$mount_point/sbin" ]]
}

🎯 作用:

  • 通过 /bin/etc/sbin 目录是否存在,判断分区是否为根文件系统
  • 原理
    • Linux 根分区通常包含 /bin/etc/sbin 目录
    • 其他分区(如 /boot/home)不会包含这些目录

📌 这个方法简单高效,能够准确找到根文件系统所在分区!


📌 5️⃣ 退出时自动清理

cleanup() {
    echo "开始清理..."
    for mount_point in "${MOUNT_POINTS[@]}"; do
        sudo umount "$mount_point" 2>/dev/null
        sudo rmdir "$mount_point" 2>/dev/null
    done

    if $IS_VIRTUAL; then
        echo "断开 qemu-nbd 连接..."
        sudo qemu-nbd -d "$NBD_DEVICE" >/dev/null 2>&1
    fi
}

trap cleanup EXIT

🎯 作用:

  • 确保脚本退出时,自动卸载所有挂载的分区
  • 如果是虚拟磁盘,还会自动断开 qemu-nbd 设备,防止占用系统资源

📌 这样,用户可以随时中断脚本,不会影响系统状态! 🚀


🚀 运行效果

假设有一个磁盘镜像 ubuntu.img,运行脚本:

sudo ./find_root_partition_offline.sh ubuntu.img

示例输出:

加载 nbd 模块...
连接 ubuntu.img 到 /dev/nbd0...
检测并挂载所有分区...
挂载分区 /dev/nbd0p1 到 /mnt/nbd0p1...
挂载分区 /dev/nbd0p2 到 /mnt/nbd0p2...
----------------------------------------
检测到根文件系统所在分区:
挂载点: /mnt/nbd0p2
分区设备: /dev/nbd0p2
----------------------------------------

成功找到 /dev/nbd0p2 是根文件系统所在分区! 🎉


🎯 适用场景

恢复虚拟机系统:查找 .qcow2.img 磁盘的根分区
磁盘镜像分析:快速找到 Linux 根分区所在位置
数据恢复:如果系统崩溃,可以找到根分区并手动修复
嵌入式开发:解析 SD 卡或其他存储设备中的 Linux 根文件系统


📢 结语

🚀 你是否还在手动查找 Linux 根分区?
🚀 你的磁盘镜像是否难以管理?

💡 find_root_partition_offline.sh 让磁盘管理更智能、更简单,助你快速定位 Linux 根分区!

📌 你学到了什么?欢迎留言讨论! 👍 记得:
💖 点赞 🌟 关注 💬 评论 🚀 转发分享

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值