disk-shock-protection.txt 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. Hard disk shock protection
  2. ==========================
  3. Author: Elias Oltmanns <eo@nebensachen.de>
  4. Last modified: 2008-10-03
  5. 0. Contents
  6. -----------
  7. 1. Intro
  8. 2. The interface
  9. 3. References
  10. 4. CREDITS
  11. 1. Intro
  12. --------
  13. ATA/ATAPI-7 specifies the IDLE IMMEDIATE command with unload feature.
  14. Issuing this command should cause the drive to switch to idle mode and
  15. unload disk heads. This feature is being used in modern laptops in
  16. conjunction with accelerometers and appropriate software to implement
  17. a shock protection facility. The idea is to stop all I/O operations on
  18. the internal hard drive and park its heads on the ramp when critical
  19. situations are anticipated. The desire to have such a feature
  20. available on GNU/Linux systems has been the original motivation to
  21. implement a generic disk head parking interface in the Linux kernel.
  22. Please note, however, that other components have to be set up on your
  23. system in order to get disk shock protection working (see
  24. section 3. References below for pointers to more information about
  25. that).
  26. 2. The interface
  27. ----------------
  28. For each ATA device, the kernel exports the file
  29. block/*/device/unload_heads in sysfs (here assumed to be mounted under
  30. /sys). Access to /sys/block/*/device/unload_heads is denied with
  31. -EOPNOTSUPP if the device does not support the unload feature.
  32. Otherwise, writing an integer value to this file will take the heads
  33. of the respective drive off the platter and block all I/O operations
  34. for the specified number of milliseconds. When the timeout expires and
  35. no further disk head park request has been issued in the meantime,
  36. normal operation will be resumed. The maximal value accepted for a
  37. timeout is 30000 milliseconds. Exceeding this limit will return
  38. -EOVERFLOW, but heads will be parked anyway and the timeout will be
  39. set to 30 seconds. However, you can always change a timeout to any
  40. value between 0 and 30000 by issuing a subsequent head park request
  41. before the timeout of the previous one has expired. In particular, the
  42. total timeout can exceed 30 seconds and, more importantly, you can
  43. cancel a previously set timeout and resume normal operation
  44. immediately by specifying a timeout of 0. Values below -2 are rejected
  45. with -EINVAL (see below for the special meaning of -1 and -2). If the
  46. timeout specified for a recent head park request has not yet expired,
  47. reading from /sys/block/*/device/unload_heads will report the number
  48. of milliseconds remaining until normal operation will be resumed;
  49. otherwise, reading the unload_heads attribute will return 0.
  50. For example, do the following in order to park the heads of drive
  51. /dev/sda and stop all I/O operations for five seconds:
  52. # echo 5000 > /sys/block/sda/device/unload_heads
  53. A simple
  54. # cat /sys/block/sda/device/unload_heads
  55. will show you how many milliseconds are left before normal operation
  56. will be resumed.
  57. A word of caution: The fact that the interface operates on a basis of
  58. milliseconds may raise expectations that cannot be satisfied in
  59. reality. In fact, the ATA specs clearly state that the time for an
  60. unload operation to complete is vendor specific. The hint in ATA-7
  61. that this will typically be within 500 milliseconds apparently has
  62. been dropped in ATA-8.
  63. There is a technical detail of this implementation that may cause some
  64. confusion and should be discussed here. When a head park request has
  65. been issued to a device successfully, all I/O operations on the
  66. controller port this device is attached to will be deferred. That is
  67. to say, any other device that may be connected to the same port will
  68. be affected too. The only exception is that a subsequent head unload
  69. request to that other device will be executed immediately. Further
  70. operations on that port will be deferred until the timeout specified
  71. for either device on the port has expired. As far as PATA (old style
  72. IDE) configurations are concerned, there can only be two devices
  73. attached to any single port. In SATA world we have port multipliers
  74. which means that a user-issued head parking request to one device may
  75. actually result in stopping I/O to a whole bunch of devices. However,
  76. since this feature is supposed to be used on laptops and does not seem
  77. to be very useful in any other environment, there will be mostly one
  78. device per port. Even if the CD/DVD writer happens to be connected to
  79. the same port as the hard drive, it generally *should* recover just
  80. fine from the occasional buffer under-run incurred by a head park
  81. request to the HD. Actually, when you are using an ide driver rather
  82. than its libata counterpart (i.e. your disk is called /dev/hda
  83. instead of /dev/sda), then parking the heads of one drive (drive X)
  84. will generally not affect the mode of operation of another drive
  85. (drive Y) on the same port as described above. It is only when a port
  86. reset is required to recover from an exception on drive Y that further
  87. I/O operations on that drive (and the reset itself) will be delayed
  88. until drive X is no longer in the parked state.
  89. Finally, there are some hard drives that only comply with an earlier
  90. version of the ATA standard than ATA-7, but do support the unload
  91. feature nonetheless. Unfortunately, there is no safe way Linux can
  92. detect these devices, so you won't be able to write to the
  93. unload_heads attribute. If you know that your device really does
  94. support the unload feature (for instance, because the vendor of your
  95. laptop or the hard drive itself told you so), then you can tell the
  96. kernel to enable the usage of this feature for that drive by writing
  97. the special value -1 to the unload_heads attribute:
  98. # echo -1 > /sys/block/sda/device/unload_heads
  99. will enable the feature for /dev/sda, and giving -2 instead of -1 will
  100. disable it again.
  101. 3. References
  102. -------------
  103. There are several laptops from different vendors featuring shock
  104. protection capabilities. As manufacturers have refused to support open
  105. source development of the required software components so far, Linux
  106. support for shock protection varies considerably between different
  107. hardware implementations. Ideally, this section should contain a list
  108. of pointers at different projects aiming at an implementation of shock
  109. protection on different systems. Unfortunately, I only know of a
  110. single project which, although still considered experimental, is fit
  111. for use. Please feel free to add projects that have been the victims
  112. of my ignorance.
  113. - http://www.thinkwiki.org/wiki/HDAPS
  114. See this page for information about Linux support of the hard disk
  115. active protection system as implemented in IBM/Lenovo Thinkpads.
  116. 4. CREDITS
  117. ----------
  118. This implementation of disk head parking has been inspired by a patch
  119. originally published by Jon Escombe <lists@dresco.co.uk>. My efforts
  120. to develop an implementation of this feature that is fit to be merged
  121. into mainline have been aided by various kernel developers, in
  122. particular by Tejun Heo and Bartlomiej Zolnierkiewicz.