如何安全扩展磁盘分区?一个自动化脚本帮你搞定!
在日常的系统管理和运维工作中,磁盘分区的扩展是一个常见的需求。无论是物理磁盘还是虚拟磁盘,随着数据量的增长,我们经常需要调整分区大小以应对存储需求的变化。然而,手动操作分区扩展不仅繁琐,还容易出错。今天,我们将介绍一个基于Bash脚本的自动化工具,帮助你安全、高效地扩展磁盘的最后一个分区。
1. 脚本功能概述
这个脚本的主要功能是自动扩展磁盘的最后一个分区,支持物理磁盘和虚拟磁盘(如QEMU格式的磁盘映像)。以下是脚本的核心功能:
- 自动检测磁盘类型:支持物理磁盘和虚拟磁盘的识别。
- 依赖检查与安装:自动检测并安装必要的工具(如qemu-img、parted等)。
- 分区扩展:自动识别最后一个分区,并将其扩展到磁盘的末尾。
- 文件系统扩展:支持常见的文件系统(如ext2/ext3/ext4)的扩展。
- 清理操作:在脚本退出时自动卸载挂载点并断开虚拟磁盘连接,确保系统状态干净。
2. 脚本的核心逻辑
2.1 依赖安装
脚本首先会检查系统是否安装了必要的工具,如qemu-img、qemu-nbd和parted。如果缺少这些工具,脚本会自动尝试安装它们。
install_dependencies() {
local required=("qemu-img" "qemu-nbd" "partprobe")
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
}
2.2 磁盘类型检测
脚本会根据输入的磁盘路径判断是物理磁盘还是虚拟磁盘。如果是虚拟磁盘,脚本会通过NBD(Network Block Device)将其挂载到系统中。
check_disk_format() {
local disk_path="$1"
if [ -b "$disk_path" ]; then
IS_VIRTUAL=false
DISK_DEVICE="$disk_path"
return 0
fi
if qemu-img info "$disk_path" >/dev/null 2>&1; then
IS_VIRTUAL=true
DISK_DEVICE="$NBD_DEVICE"
return 0
fi
echo "错误:无法识别的磁盘格式或设备。"
exit 1
}
2.3 分区扩展
脚本会自动识别磁盘的最后一个分区,并将其扩展到磁盘的末尾。扩展完成后,脚本会根据文件系统类型(如ext4)自动调整文件系统大小。
expand_last_partition() {
local device="$1"
local last_part
local fs_type
local part_num
local disk_size_sectors
local end_sector
echo -n "确认要扩展最后一个分区到磁盘末尾吗?(Yes/No) "
read -r answer
if [ "$answer" != "Yes" ]; then
echo "操作已取消"
exit 0
fi
last_part=$(get_last_partition "$device")
if [ -z "$last_part" ]; then
echo "错误:未找到有效分区"
exit 1
fi
last_part="/dev/${last_part}"
fs_type=$(get_fs_type "$last_part")
echo "检测到最后一个分区 $last_part 的文件系统类型为: $fs_type"
part_num=$(echo "$last_part" | grep -o '[0-9]*