This commit is contained in:
2026-09-06 13:28:50 +08:00
parent 487959f30f
commit 2957ef1f1e

View File

@@ -179,7 +179,7 @@ detect_lvm() {
# 二次检测:通过 lsblk 查看 TYPE
if [[ "$LVM_DETECTED" == false ]]; then
local root_type
root_type=$(lsblk -no TYPE "$ROOT_DEVICE" 2>/dev/null | head -1)
root_type=$(lsblk -no TYPE "$ROOT_DEVICE" 2>/dev/null | head -1) || true
if [[ "$root_type" == "lvm" ]]; then
LVM_DETECTED=true
info "检测到 LVM 架构(通过 lsblk"
@@ -198,7 +198,7 @@ get_disk_for_partition() {
local part="$1"
# 通过 lsblk 获取父级磁盘设备
local disk
disk=$(lsblk -no PKNAME "$part" 2>/dev/null | head -1)
disk=$(lsblk -no PKNAME "$part" 2>/dev/null | head -1) || true
if [[ -z "$disk" ]]; then
die "无法获取 $part 的父级磁盘设备"
fi
@@ -212,10 +212,10 @@ get_partition_number() {
local part="$1"
# 从设备名提取分区号,如 /dev/sda1 -> 1, /dev/vda2 -> 2
local num
num=$(echo "$part" | grep -oP '\d+$')
num=$(echo "$part" | grep -oP '\d+$') || true
if [[ -z "$num" ]]; then
# 尝试 p 分隔格式,如 /dev/mmcblk0p1 -> 1
num=$(echo "$part" | grep -oP 'p\K\d+$')
num=$(echo "$part" | grep -oP 'p\K\d+$') || true
fi
if [[ -z "$num" ]]; then
die "无法从 $part 提取分区号"
@@ -238,11 +238,11 @@ print_disk_status() {
if [[ "$LVM_DETECTED" == true ]]; then
info "--- LVM 信息 ---"
info "物理卷 (PV):"
pvs 2>/dev/null | tee -a "$LOG_FILE"
{ pvs 2>/dev/null || true; } | tee -a "$LOG_FILE"
info "卷组 (VG):"
vgs 2>/dev/null | tee -a "$LOG_FILE"
{ vgs 2>/dev/null || true; } | tee -a "$LOG_FILE"
info "逻辑卷 (LV):"
lvs 2>/dev/null | tee -a "$LOG_FILE"
{ lvs 2>/dev/null || true; } | tee -a "$LOG_FILE"
echo ""
fi
info "===================================="
@@ -260,17 +260,21 @@ check_expandable_space() {
}
#---------------------------------------
# 安全提取数值(去除小数部分,兼容 set -e
# 安全提取数值(去除小数/前缀/后缀,兼容 set -e
#---------------------------------------
parse_int() {
# 从字符串中提取整数部分,忽略小数和后缀
# 输入: "8217.60" / "8.22g" / " 100 " 等
# 输出: 纯整数字符串,如 "8217" / "8" / "100"
# 从字符串中提取整数部分
# 输入: "8217.60" / "<19.00" / "8.22g" / " 100 " / "0"
# 输出: 纯整数字符串,如 "8217" / "19" / "8" / "100" / "0"
local val="$1"
# 去除首尾空格
val=$(echo "$val" | xargs)
# 提取整数部分(兼容小数点)
echo "$val" | awk '{printf "%d", $1}'
# 去除首尾空格、< > 前缀、非数字字符(保留小数点)
val=$(echo "$val" | tr -d '<>' | sed 's/[^0-9.]//g')
if [[ -z "$val" ]] || [[ "$val" == "." ]]; then
echo "0"
return
fi
# 用 awk 取整数部分
echo "$val" | awk '{printf "%d", $1+0}'
}
#---------------------------------------
@@ -278,19 +282,19 @@ parse_int() {
#---------------------------------------
check_lvm_space() {
# 获取根设备所在的 VG
ROOT_VG=$(lvs -no vg_name "$ROOT_DEVICE" 2>/dev/null | xargs)
ROOT_VG=$(lvs -no vg_name "$ROOT_DEVICE" 2>/dev/null | xargs) || true
if [[ -z "$ROOT_VG" ]]; then
die "无法获取根逻辑卷所在的卷组"
fi
info "根目录所在卷组 (VG): $ROOT_VG"
# 获取 VG 的可用空间(人类可读格式,用于显示)
VG_FREE_HUMAN=$(vgs -no vg_free "$ROOT_VG" --units g --nosuffix 2>/dev/null | xargs)
VG_FREE_HUMAN=$(vgs -no vg_free "$ROOT_VG" --units g --nosuffix 2>/dev/null | tr -d '<> ' ) || true
info "卷组 $ROOT_VG 可用空间: ${VG_FREE_HUMAN}G"
# 检查 VG 是否有剩余空间(以 MB 为单位判断)
local vg_free_raw
vg_free_raw=$(vgs -no vg_free "$ROOT_VG" --units m --nosuffix 2>/dev/null)
vg_free_raw=$(vgs -no vg_free "$ROOT_VG" --units m --nosuffix 2>/dev/null) || true
VG_FREE_NUM=$(parse_int "$vg_free_raw")
info "卷组可用空间: ${VG_FREE_NUM}MB"
@@ -299,9 +303,9 @@ check_lvm_space() {
info "卷组可用空间不足,将检查是否需要扩展物理卷 (PV)..."
expand_pv_if_needed
# 重新获取可用空间
vg_free_raw=$(vgs -no vg_free "$ROOT_VG" --units m --nosuffix 2>/dev/null)
vg_free_raw=$(vgs -no vg_free "$ROOT_VG" --units m --nosuffix 2>/dev/null) || true
VG_FREE_NUM=$(parse_int "$vg_free_raw")
VG_FREE_HUMAN=$(vgs -no vg_free "$ROOT_VG" --units g --nosuffix 2>/dev/null | xargs)
VG_FREE_HUMAN=$(vgs -no vg_free "$ROOT_VG" --units g --nosuffix 2>/dev/null | tr -d '<> ') || true
if [[ -z "$VG_FREE_NUM" ]] || [[ "$VG_FREE_NUM" -lt 100 ]]; then
die "卷组 $ROOT_VG 没有足够的可用空间进行扩容(需要至少 100MB"
fi
@@ -316,7 +320,7 @@ check_lvm_space() {
expand_pv_if_needed() {
# 获取 VG 对应的 PV
local pv_dev
pv_dev=$(pvs -no pv_name "$ROOT_VG" 2>/dev/null | xargs)
pv_dev=$(pvs -no pv_name "$ROOT_VG" 2>/dev/null | xargs) || true
if [[ -z "$pv_dev" ]]; then
die "无法获取卷组 $ROOT_VG 的物理卷"
fi
@@ -547,9 +551,9 @@ verify_result() {
echo ""
if [[ "$LVM_DETECTED" == true ]]; then
info "--- LVM 信息 ---"
pvs 2>/dev/null | tee -a "$LOG_FILE"
vgs 2>/dev/null | tee -a "$LOG_FILE"
lvs 2>/dev/null | tee -a "$LOG_FILE"
{ pvs 2>/dev/null || true; } | tee -a "$LOG_FILE"
{ vgs 2>/dev/null || true; } | tee -a "$LOG_FILE"
{ lvs 2>/dev/null || true; } | tee -a "$LOG_FILE"
echo ""
fi
info "===================================="