如果外部硬盘驱动器物理断开并且使用设备映射器安装设备,则不会进行清理。
尤其:
- 驱动器安装目录为空
- 该挂载点仍存在于 mount(8) 中
- 设备映射器设备仍然存在
- 物理设备仍然存在
/dev/sd*
在这种情况下,如果不清理上述项目,前三个步骤需要手动清理(通过 umount、dmsetup remove 和 udevadm trigger --subsystem-match=block)。即便如此,磁盘的 sysfs 目录仍然存在,/sys/bus/scsi/drivers/sd
您需要手动 echo 1 > delete 以确保 SCSI 设备已取消注册。没有它,重新插入磁盘不起作用。
所以我的问题是 - 是否有一个程序可以检测已被设备映射的物理磁盘何时不再响应并执行必要的清理?
答案1
我不知道有什么程序可以帮你实现这一点,但是我曾经有一个设备,它会定期突然断开连接,从而进入这种状态。手动完成上述步骤后,它会重新连接,我的解决方案依赖于注意到当它发生时,挂载点确实显示为空,尽管系统仍然认为有东西挂载了。
我的解决方案是将一个简单的空文件放到驱动器上,然后可以通过 shell 脚本检查该文件是否存在并自动清理。我不再有驱动器或完整的 shell 脚本,但我可以为您提供一个基本示例,说明如何创建自己的脚本,您可以添加必须运行的命令,以便在执行此操作时手动进行清理。
请注意,在此示例中,我将使用 /mnt/externalhd 作为挂载点,并假设我们要查找的文件在其根文件系统中名为 .isonline。您可以检查驱动器上是否存在现有文件,同时假设它在操作期间永远不会更改。请注意,if 语句还会检查 /dev 条目,因此我们不会在等待设备重新连接时创建清理循环,但是,如果设备的连接顺序可能发生变化,则查找和使用磁盘正确的 /dev/disk/by-uuid/* 条目会更准确,而且必不可少,幸运的是,我从未遇到过这个问题。
if [ ! -e /mnt/externalhd/.isonline ] && [ -e /dev/sdb ]; then {
# This line optionally logs the disconnect to a file for your records.
echo "`date '+%d %b %Y %H:%M:%S'` OFFLINE: /dev/sdb disconnected, cleaning up" >> /var/log/externalhd.log
# Do whatever you need to do to clean up the bad unmount and enable reconnection
# Optionally log the completion of the cleanup process
echo "`date '+%d %b %Y %H:%M:%S'` CLEANUP: /dev/sdb cleanup process completed" >> /var/log/externalhd.log
}
fi
希望对您有所帮助,我对完成全面清理所需要运行的命令有点模糊,似乎驱动器本身最终坏掉时我删除了旧脚本。一旦您设置了脚本,其中包含清理驱动器所需运行的命令,它们将与您手动执行时使用的命令相同,但您应该sudo
从中删除部分。
然后可以通过 cron 运行该脚本,定期检查是否存在错误卸载,并在检测到错误卸载时自动清理。假设该脚本保存在 /home/user/cleanumount 中,则以下步骤可以为其添加一个 cron 作业,示例将每 5 分钟运行一次检查。
首先运行以下命令:
sudo crontab -u root -e
您可能会被要求通过按菜单中的数字从列表中选择一个文本编辑器,如果是这样,只需按相应的数字选择您喜欢的编辑器即可。
然后将以下两行添加到您的 crontab(顶行是可选的,但建议添加注释,以便您知道它的作用)。
# Run /home/user/cleanumount every 5 minutes to cleanly unmount /dev/sdb after sudden disconnects
*/5 * * * * /home/user/cleanumount
然后保存文件并退出文本编辑器,新的 crontab 将自动安装并加载到 cron 守护进程中。
如果 5 分钟的频率不够高,您可以调整该行的第一部分,将其更改为简单的 * 表示每分钟运行一次,或者例如 */2 表示每 2 分钟运行一次 */3 表示每 3 分钟运行一次等等。可以通过运行以下命令找到有关 crontab 的更多详细信息man 5 crontab
希望你觉得这很有用,除非其他聪明人带着一个漂亮的工具来使我为你写的所有这些信息变得多余,如果真是这样就太好了:)