如何安全扩展磁盘分区?一个自动化脚本帮你搞定!
csdh11 2025-04-30 16:10 10 浏览
如何安全扩展磁盘分区?一个自动化脚本帮你搞定!
在日常的系统管理和运维工作中,磁盘分区的扩展是一个常见的需求。无论是物理磁盘还是虚拟磁盘,随着数据量的增长,我们经常需要调整分区大小以应对存储需求的变化。然而,手动操作分区扩展不仅繁琐,还容易出错。今天,我们将介绍一个基于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]*#39;)
if [ -z "$part_num" ]; then
echo "错误:无法获取分区号"
exit 1
fi
disk_size_sectors=$(sudo blockdev --getsz "$device")
end_sector=$((disk_size_sectors - 1))
sudo parted -s "$device" unit s resizepart "$part_num" "100%"
handle_error $? "调整分区大小失败"
sudo partprobe "$device"
handle_error $? "刷新分区表失败"
case $fs_type in
ext4|ext3|ext2)
echo "检查并扩展文件系统..."
sudo e2fsck -f -y "$last_part"
handle_error $? "文件系统检查失败"
sudo resize2fs "$last_part"
handle_error $? "文件系统扩展失败"
;;
*)
echo "错误:不支持的文件系统类型 $fs_type"
exit 1
;;
esac
}
2.4 清理操作
脚本在退出时会自动执行清理操作,包括卸载挂载点和断开虚拟磁盘连接,确保系统状态干净。
cleanup() {
local exit_code=$?
echo "执行清理操作..."
for mount_point in "${MOUNT_POINTS[@]}"; do
if [ -d "$mount_point" ]; then
sudo umount "$mount_point" 2>/dev/null
rmdir "$mount_point" 2>/dev/null
fi
done
if $IS_VIRTUAL && [ -e "$NBD_DEVICE" ]; then
sudo qemu-nbd -d "$NBD_DEVICE" 2>/dev/null
fi
exit $exit_code
}
3. 如何使用这个脚本?
3.1 下载脚本
你可以将脚本保存为一个文件,例如expand_disk.sh,并赋予执行权限:
chmod +x expand_disk.sh
3.2 执行脚本
对于物理磁盘,直接指定磁盘设备路径:
sudo ./expand_disk.sh /dev/sdX
对于虚拟磁盘,指定磁盘映像文件路径:
sudo ./expand_disk.sh /path/to/disk.img
3.3 确认操作
脚本会提示你确认是否要扩展最后一个分区。输入Yes后,脚本会自动完成分区扩展和文件系统调整。
4. 总结
这个脚本通过自动化的方式,简化了磁盘分区扩展的操作流程,特别适合需要频繁调整磁盘分区的系统管理员和运维人员。无论是物理磁盘还是虚拟磁盘,脚本都能安全、高效地完成任务。如果你有类似的需求,不妨试试这个脚本,相信它会为你节省大量时间和精力。
相关推荐
- Flink SQL Client综合实战(flink原理深入与编程实战下载)
-
在《FlinkSQLClient初探》一文中,我们体验了FlinkSQLClient的基本功能,今天来通过实战更深入学习和体验FlinkSQL;...
- Spring Boot 3.4.5 发布了!全面解析新特性与Spring Boot 3的革新之路
-
SpringBoot3.4.5正式发布:修复与升级双管齐下近日,SpringBoot团队正式推出...
- 数据放在哪?如何从数据库取数据?(数据库中的数据从哪里来)
-
前言数据放在数据库内(如:mysql)如何获取数据,可用JDBC1、为什么要了解mysql数据库?因为实际的生活中,网页里面的内容都不是静止的,会根据你的操作和交互,数据会发生变化...
- 恕我直言,我怀疑你并不会“分库分表”
-
随着互联网的迅速发展,会导致产生海量的数据,在数据量还比较小的时候,传统的处理方式是将数据存储在关系或者非关系型数据库中,但是随着数据量逐渐增加,单个数据库的表已经很难容纳所有数据,所以业界出现了分库...
- jmeter使用一览有余(jmeter功能)
-
接口测试:特殊的URL地址,负责数据的操作(显示,修改,添加,删除)四要素:1.url地址2.请求方式:getpostrestful风格,put,delete3.请求参数...
- MySQL 分布式数据库实现:无需修改代码,轻松实现分布式能力
-
本篇文章主要从项目中实际场景出发,讲解分库分表等功能在日常运维中遇到的问题,以及ShardingSphere-Proxy对应的解决方案,版本号:v5.1.0。如无特别声明,以下示例中的数据库指M...
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
-
Maven简介Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven是一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。...
- RazorSQL Mac版(SQL数据库查询工具)
-
RazorSQLMac特别版是一款看似简单实则功能非常出色的SQL数据库查询、编辑、浏览和管理工具。RazorSQLformac特别版可以帮你管理多个数据库,支持主流的30多种数据库,包括Ca...
- Spring Native 中文文档(spring-native)
-
https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/#getting-started-buildpacks...
- Jmeter 接口测试(JMETER接口测试报告)
-
接口测试Jmeter接口测试举例Jmeter可以做接口测试。其中接口测试的简单操作包括做http脚本(发get/post请求、加cookie、加header、加权限认证、上传文件)、做webser...
- 大数据Hadoop之——Flink Table API 和 SQL(单机Kafka)
-
一、TableAPI和FlinkSQL是什么TableAPI和SQL集成在同一套API中。这套API的...
- Oracle数据库无法连接问题排查(oracle12c连接不到数据库)
-
数据库告警日志如下图。发现问题时间段,没有数据库服务故障报错,但是存在较多TNS-12535...
- hadoop3.2.4安装 sqoop1.4.7(hadoop2.10.1安装)
-
sqoop功能是非常完善的,兼容性也很好。但是hadoop3版本没有官方的集成jar包版本,所以我通过阅读sqoop的官方文档,解决了如何在配置hadoop3版本的sqoop。核心就两点,从集成包里获...
- ShardingSphere-Proxy:从实际场景出发,快速上手
-
本篇文章主要从项目中实际场景出发,讲解分库分表等功能在日常运维中遇到的问题,以及ShardingSphere-Proxy对应的解决方案,版本号:v5.1.0。...
- MyEclipse企业级报表教程:MyEclipse中的报表工具(上)
-
1.MyEclipse报表MyEclipse报表大大简化了开发、部署和测试范围广泛的Web报表的过程。MyEclipse报表包含了一套先进的报表开发工具和运行时报表引擎。这些功能的设计和MyEcli...
- 一周热门
- 最近发表
-
- Flink SQL Client综合实战(flink原理深入与编程实战下载)
- Spring Boot 3.4.5 发布了!全面解析新特性与Spring Boot 3的革新之路
- 数据放在哪?如何从数据库取数据?(数据库中的数据从哪里来)
- 恕我直言,我怀疑你并不会“分库分表”
- jmeter使用一览有余(jmeter功能)
- MySQL 分布式数据库实现:无需修改代码,轻松实现分布式能力
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- RazorSQL Mac版(SQL数据库查询工具)
- Spring Native 中文文档(spring-native)
- Jmeter 接口测试(JMETER接口测试报告)
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)
- dos 删除目录下所有子目录及文件 (36)