Linux下检测并自动挂载NTFS分区实现USB同步脚本


阅读 2 次

问题场景描述

在Linux系统中,我们经常需要将USB设备与NTFS格式的分区进行数据同步。但NTFS分区默认不会自动挂载,这就导致直接运行rsync命令时会失败。本文分享一个实用的bash脚本解决方案。

关键技术点

实现这个功能需要解决两个核心问题:

  1. 准确检测NTFS分区是否已挂载
  2. 在未挂载时自动完成挂载操作

完整脚本实现

下面是一个经过优化的完整脚本,增加了错误处理和日志记录功能:

#!/bin/bash
# 配置部分
MOUNT_DRIVE="/dev/disk/by-id/scsi-SATA_Hitachi_HTS5416_SB3404GRGJRKBS-part5"
MOUNT_POINT="/media/Windows/"
LOG_FILE="/var/log/ntfs_sync.log"
SYNC_LOC="/media/Windows/vasia/Disertatie/"
SYNC_DEV="Disertatie"

# 创建日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

# 检查挂载点是否存在
if [ ! -d "$MOUNT_POINT" ]; then
    mkdir -p "$MOUNT_POINT" || {
        log "创建挂载点目录失败: $MOUNT_POINT"
        exit 1
    }
fi

# 检测分区是否已挂载
if mount | grep -q "$MOUNT_POINT"; then
    log "NTFS分区已挂载"
else
    log "尝试挂载NTFS分区..."
    if mount "$MOUNT_DRIVE" "$MOUNT_POINT"; then
        log "挂载成功"
    else
        log "挂载失败"
        exit 1
    fi
fi

# 等待设备稳定
sleep 10

# 执行同步操作
log "开始同步数据..."
if rsync -axu "/media/DISK_IMG/${SYNC_DEV}/" "${SYNC_LOC}/"; then
    log "同步完成"
    # 可选:添加桌面通知
    if which zenity >/dev/null; then
        zenity --title "USB同步" --info --text "文件同步已完成" &
    fi
else
    log "同步过程中出现错误"
    exit 1
fi

脚本优化建议

在实际使用中,还可以考虑以下改进:

  • 添加UUID检测代替设备路径,避免设备名变化导致的问题
  • 增加文件锁机制,防止脚本重复执行
  • 添加邮件通知功能,便于远程监控

定时任务配置

如果需要定期执行同步,可以设置cron任务:

# 每天凌晨3点执行同步
0 3 * * * /path/to/ntfs_sync.sh

注意事项

使用该脚本前请确保:

  1. 已安装ntfs-3g驱动
  2. 当前用户有挂载权限
  3. 目标分区没有损坏