检测到设备已安装到特定文件夹?

检测到设备已安装到特定文件夹?

作为改进备份方案的一部分,我现在添加了旋转外部硬盘驱动器,使一个始终安全地不在现场,而另一个则在接收备份数据。当然,为了确保我的备份真正完成,备份将被编写脚本并按计划执行。

我的计划是手动插入并安装硬盘驱动器,然后将其留在那里,直到需要卸载它(再次手动),将其拿走,引入下一个,然后(手动)安装该硬盘。两个驱动器都将安装到例如/mnt/backup。

现在,问题来了:如果我忘记插入或安装硬盘驱动器,我不希望备份脚本运行。因此,我需要能够在允许脚本运行之前检测是否有设备安装到 /mnt/backup 。我的第一个想法是将一个名为“NO_DRIVE_MOUNTED”的文件放在(已卸载的)/mnt/backup 目录中,然后确保它确实如此不是在运行备份例程之前就存在,但这感觉很黑客。 (同样,将名为“BACKUP_DEVICE_READY”的文件放入每个外部硬盘驱动器并检查该文件的相反操作存在感觉就像黑客一样。)

有没有更好的方法来检测设备是否安装到给定目录?我宁愿避免检查设备本身,因为我的经验是,在 Linux 中插入驱动器只会将其分配给下一个可用的 /dev/sdX,因此,虽然有一天备份驱动器可能是 /dev/sdf,但如果我下次连接备份驱动器时插入不同的驱动器,它将是 /dev/sdg,这意味着 /dev/sdf 测试将失败!我还希望避免特定于设备的标识(例如通过 UUID),以便我可以更轻松、更透明地更换/升级驱动器。

这将在 Ubuntu 10.10 上进行(或者可能是 11.04,如果我拖延得足够长,因为我正在重建整个服务器),理想情况下,我想要一个简单的单行测试,我可以将其作为前缀我的备份命令直接在我的 crontab 中(但我也不害怕 Bash 脚本,如果这是必要的话)。

答案1

您可以像在 cron 中那样运行备份脚本

fgrep -q /mnt/backup /proc/mounts && backup.sh

但最好在脚本中添加测试,以记录失败的尝试

答案2

这里有两种方法来检查是否/mnt/backup是挂载点。该/proc/mounts方法针对Linux,该df方法可移植到所有unix系统;除此之外,没有什么重要理由选择其中之一。当安装点包含空格时,两者都可能在极端情况下失败(只是……不要这样做!)。

case $(df -P /var) in *" /var") echo mounted;; esac
if fgrep -q " /tmp " </proc/mounts; then echo mounted; fi

请注意,您可以根据设备序列号、文件系统 UUID 或文件系统标签(后者可能是可靠的指示符)等条件为特定可移动驱动器分配特定设备名称。只需要 udev 配置中的一行即可。但是,虽然这对于方便安装在适当的安装点上是一个好主意,但依赖设备的存在并不好:设备可能存在但未安装,因此如果您的脚本依赖于已安装的设备,则应该检查安装观点。

答案3

还有另一种(更好?更安全?)的方法来实现您想做的事情。与其检查备份驱动器是否已安装,不如将其保持插入状态,但在实际不使用时将其卸载。

这可能对磁盘更好(有些磁盘会休息),并且可以避免意外访问它。 cron 作业可以mount在启动时执行,并umount在完成时执行。这可以作为普通用户使用命令mount /mnt/backup和来完成umount /mnt/backup,前提是您在 的条目中描述了您想要的内容/etc/fstabusers如果以普通用户身份完成安装,则该条目必须包含该选项。现在只需检测磁盘是否真正插入即可。该mount命令将告诉您,尝试安装未插入的磁盘会失败并出现错误 32(该错误还有其他原因)。

最后一点是告诉 /etc/fstab 如何完成这项工作。正如您所注意到的,您不能依赖设备名称,因为它一直在变化。但实际设备可以被自身识别。对于硬盘,分区有一个可以通过适当的工具确定的名称,例如blkidvol_id。该命令blkid适用于普通用户调用/sbin/blkid. (顺便说一句,这也适用于 DVD)。

例如,我有一个带有两个分区的磁盘,当前位于设备上/dev/sdc。我将通过以超级用户身份调用来获取第一个分区的“UUID”:

$ /sbin/blkid /dev/sdc1
/dev/sdc1: UUID="7aeb2d15-9a1b-410a-b5ed-5437e68cb528" SEC_TYPE="ext2" TYPE="ext3" 

然后我添加到/etc/fstab该行

UUID="7aeb2d15-9a1b-410a-b5ed-5437e68cb528" /mnt/backup ext3 users,noauto,rw,relatime,data=ordered

并将/etc/fstab提供正确的信息以mount /mnt/backup在 上安装正确的分区(如果可用)/mnt/backup。也同样如此umount

不幸的是,只有当您有一张备份 DVD 时,此方法才有效。原因是该命令将使用其中的mount /mnt/backup第一个条目作为安装点。如果它碰巧与您插入的磁盘不匹配,那么它将失败,而不寻找可能使用不同磁盘为同一安装点完成工作的进一步条目(我真的很想知道为什么)。/etc/fstab/mnt/backup

解决方案是将所有备份磁盘与/mnt/backup中的挂载点关联起来/etc/fstab。脚本(即使在普通用户模式下)可以尝试使用 挂载每个备份磁盘分区mount -U 'xxxxxxx',何时xxxxxxx使用该磁盘(分区)的 UID 来标识它/etc/fstab。如果插入其中一个备份磁盘,该脚本最终将成功。

请注意,这还可以防止误认为备份磁盘的磁盘被意外损坏。如果插入脚本不认识的磁盘,脚本将无法安装它,即使该磁盘在/etc/fstab.

要检查的另一种(甚至更简单)可能性(我从未使用过)是使用将安装条目包含选项mount -a -O my_option的所有磁盘的命令。当然,您必须在 中的备份磁盘的每个条目中添加该选项。这样做的风险是,如果插入两个备份磁盘,它们可能会在.这应该不是问题,因为只有顶部的第二个才是可见的。但我不确定一个人必须多小心才能确保最后两者都被下马。一些实验可能是有序的。/etc/fstab'my_option'/etc/fstab/mnt/backup

然而,似乎mount -a -O my_option仅对超级用户可用,即使对于普通用户可以根据 挂载的设备也是如此/etc/fstab。我再次想知道为什么。

答案4

实际上我找到了一种方法来防止写入该安装目录。 /mnt/备份

  • 如果未安装,请使用“chmod ugo -w /mnt/backup”

挂载目录

  • “chmod ugo+w /mnt/备份”

如果我尝试在已卸载的目录中写入,我会收到权限被拒绝的消息。

触摸平等触摸:无法触摸“平等”:权限被拒绝

相关内容