我正在编写一个bash脚本,该脚本旨在判断给定的驱动器是否连接到系统,如果是,则将一些数据(需要异地进行的备份)复制到该驱动器。
我想做的是通过UUID识别驱动器/分区,这样我就可以有一个脚本,经常扫描该驱动器的存在,当它插入时,将数据复制到它(通过rsync,所以我不特别关心这部分是否运行多次,因为后面的运行是I/O便宜的)。我希望这尽可能简单,这样我就可以把有问题的驱动器交给一个非技术人员,然后说“把它插在这里,然后拔下插头带走”
在mount
中,我似乎找不到任何选项可以做到这一点,而且在/etc/fstab
中查找并不能告诉我驱动器是否实际安装。
如果给定一个UUID,我如何判断是否挂载了具有该UUID的驱动器,以及它的挂载点是什么?
5条答案
按热度按时间xsuvu9jc1#
一个设备可以通过它的符号链接来挂载。如果是这种情况,mount命令将通过它的符号链接来引用它,但是你可能会通过它的真实的路径来引用它,或者更糟的是另一个符号链接。
多个块设备文件可以指向一个块设备(!),这使得情况更加复杂。这可以通过使用mknod命令来完成。
我能找到的准确获取此信息的唯一方法是将
/proc/mounts
中所有条目的主编号和次编号与您正在查找的UUID的主编号和次编号进行比较。这里有一个函数/脚本可以做到这一点。
字符串
j8yoct9x2#
/dev/disk/by-uuid/是附加卷的符号链接场。它不会告诉你卷是否已挂载,但会告诉你它是否已插入-所以无论如何都可能满足您的特定用例。
字符串
有帮助吗?
rlcwz9us3#
字符串
p5fdfcr14#
我发现最好的方法是使用blkid将UUID转换为unix文件系统上的块设备,例如。
字符串
然后grep mount命令的输出。
型
然后grep它为所需的挂载点
型
完整的命令是
型
我把它放到一个if语句中,并隐藏输出,用一个漂亮的小消息替换它:-)。
型
wj8zmpe15#
首先,我将为您添加几个要求:您说您希望非技术用户删除驱动器以进行异地存储。因此,还需要:
a)当rsync完成时,卸载驱动器,这样可以安全地删除它。
B)如果驱动器在下一个运行间隔仍然连接,则在启动rsync之前安装驱动器。
假设我们做了(a)和(B),你的最后一个问题就不再相关了,因为我们只需要确定是否有一个或多个目标uuid磁盘被附加,如果是,script将在预定的挂载点挂载它。
这个基本的例子使用了一个名为
backup.disks
的配置文件。它应该在单行上包含您的目标uuid。可以选择添加多个uuid,每行一个,rsync将运行到找到的第一个磁盘。字符串
感谢博格备份项目,上面的脚本就是从这个项目派生出来的。上面的脚本涵盖了你的问题。来自博格备份的完整脚本提供了额外的选项,比如创建一个服务来监视特定的UUID,并在连接目标UUID后立即启动备份。用rsync替换博格命令非常简单。
下面是博格脚本:Borg Backup, Automated backups