Files
AVM360/bash/disk_tool.sh
2026-04-01 14:11:47 +08:00

163 lines
5.2 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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