#!/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