我有一个移动硬盘用来备份数据,我希望当我的移动插入主机时,自动执行某个脚本把需要备份的数据自动同步到我这个移动硬盘中。
流程概述
要实现这个功能,可以分为以下几个步骤:
-
获取移动硬盘特定的卷标
-
移动硬盘插入后系统自动执行挂载命令,将磁盘挂载到指定路径。
-
监控挂载点的变更,触发需要执行的命令。
获取移动硬盘卷标
-
可以通过
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"
-
也可以通过
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
来实现自动挂载。
监控挂载点
-
首先需要创建一个服务文件
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
-
编辑脚本文件
/usr/local/bin/auto-bakup.sh
实现自己需要执行的命令。 -
安装这个服务
sudo systemctl daemon-reload sudo systemctl enable auto-backup.service
总结
-
systemd默认会为每个挂载点创建一个
.mount
单元,这个单元的名字是根据挂载路来指定的,比如/media/BAKUP
会生成media-BAKUP.mount
,/mnt/any/usb
会生成mnt-any-usb.mount
。 可以通过如下命令查看.mount
单元名称:systemctl list-units -t mount
-
因为
auto-backup.service
安装到media-BAKUP.mount
的触发目录中,所以当media-BAKUP.mount
生成是会启动auto-backup.service
服务,同时auto-backup.service
指定After
选项,所这个服务会在mount
之后运行。