Linux

USB 儲存介質 - linux 上的數據完整性問題

  • June 6, 2009

對於驗證備份到可移動媒體的數據,我總是有些偏執,因此在將內容複製到 USB 快閃記憶體驅動器或攜帶式 HDD 之後,我總是解除安裝驅動器,重新安裝它並將儲存的文件與原始文件進行 diff -q。

幾年前,我發現(至少在我擁有的設備上),我看到了大約 1bit/GByte 的位錯誤。不知何故(我忘記了細節)我發現解決方法是,在寫任何數據之前,做

echo 64 > /sys/block/sda/device/max_sectors

(假設媒體當然顯示為 sda)。只要我記得這樣做,我就從來沒有遇到過任何問題。(我相信預設max_sectors值為 128)。

我的問題是:

  • 這只是我嗎?我已經看到了各種快閃記憶體驅動器、攜帶式硬碟驅動器、主機板和筆記型電腦的問題(但從未對所有組合進行詳盡的測試,看看我是否有任何真正可靠的組合)。與 windows 一起使用的媒體,以及雙啟動 windows 的機器,似乎在那裡沒有類似的問題,所以它似乎是 linux 特定的。
  • 究竟是什麼導致了這個問題?是不符合標準的媒體、晶片組、電纜嗎?
  • 我可以在我的系統(Debian Lenny)上配置什麼會自動設置max_sectors?(一些 HAL 腳本或 sysctl 調整?更全域的 /sys 參數?)。大概預設的 128 在核心中的某個地方,但是自定義核心似乎有點激烈。

感謝您的任何建議

首先,當您獲得一個新設備時,我建議您向其寫入數據,然後使用 md5sum/sha1sum/ 驗證數據…尤其是便宜的 USB 設備往往會損壞。:( USB 筆在前幾(百)MB 上工作正常,但在最後幾 MB 上往往會失去數據,這並不罕見。遺憾的是,許多使用者沒有意識到這一點,並且太晚才注意到問題:當 USB 筆快滿時.

您所說的問題通常位於 USB 晶片組上(儘管有時它僅在使用特殊的硬體組合時才可見)。如果它在 Windows 上工作,但在使用相同硬體的 Linux 上失敗,這聽起來像是 Windows 驅動程序中有一個在 Linux 核心中不存在的解決方法(目前)。根據http://www.linux-usb.org/FAQ.html#i5(其中一些問題),雖然 Linux 預設使用 max_sectors=240(為 120kB),但對於 Windows 似乎是 64kB 傳輸(max_sectors=128)還提到了 Genesys Logic 製造的適配器)。

要自動設置 max_sectors:請使用 udev 執行此任務。它允許您僅為要調整的設備配置 max_sectors。

您可以檢索有關正在執行的 USB 設備的必要資訊:

# udevadm info -a -p /sys/class/block/sda/

或者對於較舊的 udev 版本:

# udevinfo -a -p /sys/class/block/sda/

然後獲取您想用於規則的屬性並創建一個新文件,如 42-fix-max_sectors.rules 並將其放在 /lib/udev/rules.d (使用最新的 udev 版本時)或 /etc/udev /rules.d(適用於較舊的 udev 版本)。要了解此配置文件的外觀:

SUBSYSTEM=="block", ATTRS{model}=="Voyager Mini    ", RUN+="/bin/sh -c '/bin/echo 64 > /sys/block/%k/device/max_sectors'"

確保在編寫規則文件後重新載入 udev(通過執行 /etc/init.d/udev reload)。為了測試您的配置文件,我可以推薦使用:

# udevadm test /sys/class/block/sda/

PS:如果我發現任何問題,我更願意更換硬體,因為通常不值得努力解決任何變通辦法(而且我相信你知道墨菲無論如何都會在你認為你有它工作;))。

引用自:https://serverfault.com/questions/21081