Files
AVM360/bash/disk_tool.sh

163 lines
5.2 KiB
Bash
Raw Normal View History

2026-04-01 14:11:47 +08:00
#!/bin/bash
# ================= 配置区 =================
# 注意:这里不再硬编码 /dev/sda1脚本会自动检测第一个非系统盘的 SATA/USB 设备
TARGET_LABEL=""
MOUNT_POINT="/videos"
FSTAB_FILE="/etc/fstab"
# ==========================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 1. 检查 Root 权限
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}❌ 权限不足!请使用 sudo 运行此脚本${NC}"
exit 1
fi
# 2. 自动检测硬盘设备 (智能查找)
# 逻辑:查找名为 sda1, sdb1, sdc1 等且不是根分区的设备
detect_device() {
# 尝试找 sda1
if [ -b "/dev/sda1" ] && [ "$(df /dev/sda1 2>/dev/null | tail -1 | awk '{print $NF}')" != "/" ]; then
echo "/dev/sda1"
return
fi
# 尝试找 sdb1
if [ -b "/dev/sdb1" ]; then
echo "/dev/sdb1"
return
fi
# 尝试找 mmcblk 以外的第一个大容量分区 (针对更复杂情况)
lsblk -ndpo NAME,TYPE,SIZE,MOUNTPOINT | grep -E "part|disk" | grep -v "mmcblk" | head -n 1 | awk '{print $1}'
}
DEVICE=$(detect_device)
if [ -z "$DEVICE" ]; then
echo -e "${RED}❌ 未检测到可用的外接硬盘设备 (sda1/sdb1 等)。请检查硬件连接。${NC}"
exit 1
fi
# 3. 获取 UUID (核心步骤)
UUID=$(blkid -s UUID -o value "$DEVICE" 2>/dev/null)
if [ -z "$UUID" ]; then
echo -e "${RED}❌ 无法获取设备 $DEVICE 的 UUID。可能文件系统损坏或未格式化。${NC}"
echo "提示:尝试执行 'sudo mkfs.ext4 $DEVICE' 进行格式化 (数据会丢失!)"
exit 1
fi
# 获取文件系统类型
FS_TYPE=$(blkid -s TYPE -o value "$DEVICE" 2>/dev/null)
echo -e "${GREEN}✅ 检测到设备:${NC} $DEVICE"
echo -e "${GREEN}✅ 文件系统:${NC} $FS_TYPE"
echo -e "${GREEN}✅ UUID:${NC} $UUID"
echo ""
# 4. 确保挂载点目录存在
if [ ! -d "$MOUNT_POINT" ]; then
echo "正在创建挂载点: $MOUNT_POINT"
mkdir -p "$MOUNT_POINT"
chmod 777 "$MOUNT_POINT"
fi
# 5. 菜单界面
echo "=========================================="
echo " RK3588 硬盘挂载工具"
echo "=========================================="
echo "目标设备: $DEVICE ($FS_TYPE)"
echo "设备 UUID: $UUID"
echo "挂载目录: $MOUNT_POINT"
echo "------------------------------------------"
echo " 1) 立即挂载硬盘 (Mount Now)"
echo " 2) 立即取消挂载 (Unmount Now)"
echo " 3) 开启开机自动挂载 (Enable Auto-Mount via UUID)"
echo " 4) 取消开机自动挂载 (Disable Auto-Mount)"
echo " 5) 查看当前磁盘状态 (Status)"
echo " 6) 退出 (Exit)"
echo "=========================================="
read -p "请输入选项 [1-6]: " choice
case $choice in
1)
echo "正在挂载 UUID=$UUID$MOUNT_POINT ..."
# 使用 UUID 挂载命令
mount -U "$UUID" "$MOUNT_POINT"
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 挂载成功!${NC}"
df -h | grep "$MOUNT_POINT"
else
echo -e "${RED}❌ 挂载失败!${NC}"
echo "可能原因:文件系统类型不支持或需要 fsck 修复。"
echo "尝试手动修复sudo fsck -y $DEVICE"
fi
;;
2)
echo "正在卸载 $MOUNT_POINT ..."
umount "$MOUNT_POINT"
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 卸载成功!${NC}"
else
echo -e "${RED}❌ 卸载失败!${NC} 可能有程序正在使用该目录 (如日志写入、视频录制)。"
echo "提示:使用 'lsof +D $MOUNT_POINT' 查看占用进程。"
fi
;;
3)
# 检查 fstab 中是否已经存在该 UUID 的记录
if grep -q "$UUID" "$FSTAB_FILE"; then
echo -e "${YELLOW}⚠️ 开机自动挂载已存在 (基于 UUID),无需重复设置。${NC}"
else
# 构造 fstab 行UUID=xxxx /videos auto defaults,nofail,x-systemd.device-timeout=30 0 2
FSTAB_ENTRY="UUID=$UUID $MOUNT_POINT $FS_TYPE defaults,nofail,x-systemd.device-timeout=30 0 2"
echo "即将写入配置:"
echo " $FSTAB_ENTRY"
read -p "确认写入?(y/n): " confirm
if [ "$confirm" == "y" ] || [ "$confirm" == "Y" ]; then
echo "$FSTAB_ENTRY" >> "$FSTAB_FILE"
echo -e "${GREEN}✅ 开机自动挂载已启用!${NC}"
# 尝试立即应用配置测试
echo "正在测试配置有效性..."
umount "$MOUNT_POINT" 2>/dev/null
if mount -a; then
echo -e "${GREEN}✅ 配置测试通过mount -a 执行成功。${NC}"
else
echo -e "${RED}⚠️ 警告mount -a 测试失败,请检查 /etc/fstab 格式。${NC}"
fi
else
echo "操作已取消。"
fi
fi
;;
4)
# 删除包含该 UUID 的行
if grep -q "$UUID" "$FSTAB_FILE"; then
sed -i "/$UUID/d" "$FSTAB_FILE"
echo -e "${GREEN}✅ 开机自动挂载已清理!${NC}"
else
echo "未找到该 UUID 的配置记录。"
fi
;;
5)
echo "--- 当前磁盘使用情况 ---"
df -hT | grep -E "Filesystem|$MOUNT_POINT|/dev/sd"
echo ""
echo "--- /etc/fstab 内容预览 ---"
tail -n 5 "$FSTAB_FILE"
;;
6)
echo "退出脚本。"
exit 0
;;
*)
echo -e "${RED}❌ 错误:输入无效。${NC}"
;;
esac