我有一个移动硬盘用来备份数据,我希望当我的移动插入主机时,自动执行某个脚本把需要备份的数据自动同步到我这个移动硬盘中。

流程概述

要实现这个功能,可以分为以下几个步骤:

  1. 获取移动硬盘特定的卷标

  2. 移动硬盘插入后系统自动执行挂载命令,将磁盘挂载到指定路径。

  3. 监控挂载点的变更,触发需要执行的命令。

获取移动硬盘卷标

  1. 可以通过 blkid 命令获取

      $ sudo blkid /dev/sdb1
      /dev/sdb1: LABEL="BAKUP" UUID="xxxxxx-xxxxxx-xxxxxx-xxxxx-xxxxxxxa" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="xxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxx"
  2. 也可以通过 lsblk 命令获取

      $ lsblk -f /dev/sdb1
      NAME FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT
      sdb1 ext4   1.0   BAKUP xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx    10.9T    29% /media/BAKUP

挂载USB硬盘

硬盘需要挂载到 /media/<label> 这个位置,因为接下来的服务文件是以这个位置为依据编写的。比如卷标是 BAKUP 那么挂载路径就是 /media/BAKUP

可以手动挂载,也可以通过 udev 来实现自动挂载。

监控挂载点

  1. 首先需要创建一个服务文件 vim /etc/systemd/system/auto-backup.service ,内容如下:

      [Unit]
      Description=auto back data to u-disk
      Requires=media-BAKUP.mount
      After=media-BAKUP.mount
    
      [Service]
      ExecStart=/usr/local/bin/auto-bakup.sh
    
      [Install]
      WantedBy=media-BAKUP.mount
    
  2. 编辑脚本文件 /usr/local/bin/auto-bakup.sh 实现自己需要执行的命令。

  3. 安装这个服务

      sudo systemctl daemon-reload
      sudo systemctl enable auto-backup.service

总结

  1. systemd默认会为每个挂载点创建一个 .mount 单元,这个单元的名字是根据挂载路来指定的,比如 /media/BAKUP 会生成 media-BAKUP.mount , /mnt/any/usb 会生成 mnt-any-usb.mount 。 可以通过如下命令查看 .mount 单元名称:

      systemctl list-units -t mount
  2. 因为 auto-backup.service 安装到 media-BAKUP.mount 的触发目录中,所以当 media-BAKUP.mount 生成是会启动 auto-backup.service 服务,同时 auto-backup.service 指定 After 选项,所这个服务会在 mount 之后运行。