有没有办法检查USB驱动器是否停止?

时间:2008-12-23 14:06:04

标签: linux shell hardware usb opensuse

我每晚都写了一个脚本来备份服务器的HD。在脚本结束时,我同步,等待几分钟,同步,然后我发出sg_start --stop来停止设备。我们的想法是通过在增量备份十分钟后关闭HD来延长设备的使用寿命(桌面磁盘将经历数千次开/关循环,但只能连续运行几百小时)。

这并不总是有效;我经常发现第二天早上驱动器还在旋转。是否有一个shell命令可用于检查驱动器是否已停止(因此我可以再次发出stop命令[EDIT2]或编写脚本以在驱动器运行时创建进程列表,因此我可以调试此[/ EDIT2] ])?

[编辑]我试过sg_inq(如sg_start手册页所示),但此命令始终返回0.

我已经尝试了hdparm但它总是返回“驱动器状态为:未知”的USB驱动器(通过/ dev / sdX连接),当尝试关闭驱动器时,我得到“HDIO_DRIVE_CMD(setidle1)失败:输入/输出错误“。

sdparm似乎支持在驱动器上设置空闲计时器(请参阅“电源模式条件页面”),但IDLE选项具有“可更改:n”,我还没有找到一个选项告诉我驱动电源状态。

[EDIT2]注意:我可以从控制台使用sg_start --stop停止驱动器。这总是有效的;它并不总是一直持续到午夜。服务器在地下室(它很好很凉爽)我宁愿有办法从温暖的起居室检查驱动器是否启动:)如果我有一个命令告诉我驱动器的状态,我可以编写一个脚本,当它旋转时提醒我(检查每一分钟),然后我可以试着找出可能导致这种情况的原因。

如果重要:我正在使用openSUSE 11.1。

6 个答案:

答案 0 :(得分:3)

当你说你尝试过hdparm时,你没有说过你曾尝试过的 。我在机箱中有一些USB硬盘驱动器,有些命令适用于它而其他命令不适用,但我想这一切都取决于传输机制的所有方面。

  hdparm  -S 120  /dev/sda  

在大约10分钟不活动后,应该告诉驱动器自己睡觉。

我猜你已经尝试过了,但这并不明显,把它写成 的答案可能有助于未来的读者。

Nothing accesses the drive but the backup script.

理论上这很好,但我发现在奇数场合这还不够。有很多进程和任务,如果他们甚至看起来在驱动器上,如果由于某种原因从磁盘缓存中查找,可能会发生旋转。

常见的罪魁祸首是updatedb扫描文件的所有安装工具,famgamin执行时髦的工作来监控磁盘的更改。

如果有疑问,请在执行脚本之前通过挂载设备添加一层确定性,并在完成后卸载它。

看到可能导致唤醒的事情

 lsof +D /mountpoint

在尝试卸载之前,你应该解析它的输出,以确保没有任何东西仍在尝试使用它。

你可能也应该做一个懒惰的umount

 umount -l /mountpoint 

因此,如果您在执行lsof| grep和调用umount之间有任何访问权限,那么它仍会卸载驱动器并停止读取它。

HAL和朋友

也有可能HAL和朋友正在对驱动器进行连接/移除状态的唤醒。我真的希望它不是,但它在某些设备类型上做到了。这似乎不太可能,但我会考虑任何可能的事情。

尝试像

这样有趣的东西
lsof /dev/devicehere 

lsof /dev/devicehere1 

这似乎可以直接或间接地获得将要访问句柄的所有内容的完整列表。

答案 1 :(得分:2)

您还需要检查挂载选项并使用“noatime”作为挂载选项,否则内核仍会定期更新访问时间。所以这也可能是你问题的原因。

答案 2 :(得分:1)

如果hdparm返回以下内容:

 drive state is:  unknown

然后smartctl返回此信息:

CHECK POWER MODE: incomplete response, ATA output registers missing
CHECK POWER MODE not implemented, ignoring -n option

然后将无法获取USB驱动器的睡眠状态。我tried multiple creative things喜欢USB功耗或监视文件访问,但没有发现任何东西可以验证驱动器的状态。

唯一的解决方案是用另一个USB桥接芯片替换USB SATA适配器(或机箱)。不适用于我的计算机使用了JMicron JMS567(152d:0578 / 0x152d 0x0578),它可能是updated,但由于更新工具需要ARM CPU,因此我无法对其进行测试。现在,我使用两个不同的适配器,它们都使用Asmedia ASM1051E / ASM1053E / ASM1153 / ASM1153E,它们都通过所有命令。

您可以按以下步骤检查USB SATA适配器/机箱的桥接芯片:

lsusb -v | grep -E ': ID |idVendor|idProduct'

哪个返回类似:

Bus 002 Device 003: ID 174c:55aa ASMedia Technology Inc. ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge
  idVendor           0x174c ASMedia Technology Inc.
  idProduct          0x55aa ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge

答案 3 :(得分:0)

我经常发现第二天早上驱动器还在旋转。

这不可能是因为它在服务器上再次旋转,例如。在夜间写入日志文件或其他内容?您可以尝试使用sdparm,它可以返回驱动器上的状态信息。但我认为最好只在你的BIOS中设置一个选项,让你的HD在一定程度的不活动后自动旋转,这样更容易。

答案 4 :(得分:0)

您是否尝试使用以下命令停止驱动器:

eject -t /dev/yourHD

这对我的USB硬盘非常有用。

答案 5 :(得分:0)

如果hdparm -C /dev/sdadrive state is: unknown而不是您的驱动器不支持,则无法告诉

您的其他问题(已由其他人回答)

  • 使用驱动器的是什么?
    • lsof的
    • 定影
    • 触发器
  • 如何强迫驱动器保持睡眠状态?
    • hdparm的
    • 卸除
    • 你的设备在卸载时仍然可以被唤醒,但可能只是你做的事情(smartctl,blkid等)

相关:如果驱动器变热,您还可以自动暂停备份或一小时。