📌 你是否遇到以下问题?
✅ 你有一个 虚拟磁盘镜像(.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-img、qemu-nbd、partprobe等必要工具。 - 如果缺失,则 自动安装,确保脚本可以运行。
📌 适用于 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)不会包含这些目录
- Linux 根分区通常包含
📌 这个方法简单高效,能够准确找到根文件系统所在分区!
📌 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 根分区!
📌 你学到了什么?欢迎留言讨论! 👍 记得:
💖 点赞 🌟 关注 💬 评论 🚀 转发分享!
2344

被折叠的 条评论
为什么被折叠?



