163 lines
5.2 KiB
Bash
163 lines
5.2 KiB
Bash
|
|
#!/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
|