This commit is contained in:
zj
2026-02-03 04:49:37 +08:00
parent c6c9ece1e9
commit 5862588fd1
25 changed files with 21704 additions and 1671 deletions

View File

@@ -683,49 +683,53 @@ class MainWindow(QMainWindow):
self.refresh_all_info()
def _handle_create_lv(self):
lvm_info = self.system_manager.get_lvm_info()
available_vgs = []
vg_sizes = {}
for vg in lvm_info.get('vgs', []):
vg_name = vg.get('vg_name')
if vg_name and vg_name != 'N/A':
available_vgs.append(vg_name)
lvm_info = self.system_manager.get_lvm_info()
available_vgs = []
vg_sizes = {}
for vg in lvm_info.get('vgs', []):
vg_name = vg.get('vg_name')
if vg_name and vg_name != 'N/A':
available_vgs.append(vg_name)
free_size_str = vg.get('vg_free', '0B').strip()
current_vg_size_gb = 0.0
# 将字符串转换为小写并去除可能存在的 '<' 符号,以便更准确地匹配
free_size_str = vg.get('vg_free', '0B').strip().lower()
current_vg_size_gb = 0.0
match = re.match(r'(\d+\.?\d*)\s*([gmktb])?', free_size_str, re.IGNORECASE)
if match:
value = float(match.group(1))
unit = match.group(2).lower() if match.group(2) else ''
# 修正正则表达式:
# 1. 允许可选的 '<' 符号在数字前
# 2. 确保单位匹配正确,如果单位缺失,默认按 GB 处理 (LVM 的 vg_free 常常默认 GB)
match = re.match(r'<?(\d+\.?\d*)\s*([gmktb])?', free_size_str)
if match:
value = float(match.group(1))
unit = match.group(2) # unit will be 'g', 'm', 't', 'k', 'b' or None
if unit == 'k':
current_vg_size_gb = value / (1024 * 1024)
elif unit == 'm':
current_vg_size_gb = value / 1024
elif unit == 'g':
current_vg_size_gb = value
elif unit == 't':
current_vg_size_gb = value * 1024
elif unit == 'b' or unit == '':
current_vg_size_gb = value / (1024 * 1024 * 1024)
else:
logger.warning(f"未知LVM单位: '{unit}' for '{free_size_str}'")
if unit == 'k':
current_vg_size_gb = value / (1024 * 1024) # KB to GB
elif unit == 'm':
current_vg_size_gb = value / 1024 # MB to GB
elif unit == 'g' or unit is None: # 如果单位是 'g' 或没有指定单位,则认为是 GB
current_vg_size_gb = value
elif unit == 't':
current_vg_size_gb = value * 1024 # TB to GB
elif unit == 'b': # Bytes to GB
current_vg_size_gb = value / (1024 * 1024 * 1024)
else:
logger.warning(f"无法解析LVM空闲大小字符串: '{free_size_str}'")
logger.warning(f"未知LVM单位: '{unit}' for '{free_size_str}'")
else:
logger.warning(f"无法解析LVM空闲大小字符串: '{free_size_str}'")
vg_sizes[vg_name] = current_vg_size_gb
vg_sizes[vg_name] = current_vg_size_gb
if not available_vgs:
QMessageBox.warning(self, "警告", "没有可用于创建逻辑卷的卷组。")
return
if not available_vgs:
QMessageBox.warning(self, "警告", "没有可用于创建逻辑卷的卷组。")
return
dialog = CreateLvDialog(self, available_vgs, vg_sizes)
if dialog.exec() == QDialog.Accepted:
info = dialog.get_lv_info()
if info:
if self.lvm_ops.create_lv(info['lv_name'], info['vg_name'], info['size_gb'], info['use_max_space']):
self.refresh_all_info()
dialog = CreateLvDialog(self, available_vgs, vg_sizes)
if dialog.exec() == QDialog.Accepted:
info = dialog.get_lv_info()
if info:
if self.lvm_ops.create_lv(info['lv_name'], info['vg_name'], info['size_gb'], info['use_max_space']):
self.refresh_all_info()
def _handle_delete_lv(self, lv_name, vg_name):
lv_path = f"/dev/{vg_name}/{lv_name}"