tim*_*day 6 linux debian usb-flash-drive usb data-integrity
我一直对验证备份到可移动媒体的数据有些偏执,所以在将内容复制到 USB 闪存驱动器或便携式硬盘后,我总是卸载驱动器,重新安装它并将存储的文件与原始文件进行 diff -q。
几年前我发现(至少在我拥有的设备上),我看到了 1bit/GByte 数量级的位错误。不知何故(我忘记了细节)我发现解决方法是,在写入任何数据之前,先做
echo 64 > /sys/block/sda/device/max_sectors
Run Code Online (Sandbox Code Playgroud)
(当然,假设媒体显示为 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 内核中尚不存在。Linux 默认使用 max_sectors=240(120kB),根据http://www.linux-usb.org/FAQ.html#i5(其中存在一些问题),Windows 似乎使用 64kB 传输(max_sectors=128)还提到了 Genesys Logic 制造的适配器)。
要自动设置 max_sectors:使用 udev 执行此任务。它允许您仅为您想要调整的设备配置 max_sectors 。
您可以检索有关 USB 设备运行的必要信息:
# udevadm info -a -p /sys/class/block/sda/
Run Code Online (Sandbox Code Playgroud)
或者对于旧的 udev 版本:
# udevinfo -a -p /sys/class/block/sda/
Run Code Online (Sandbox Code Playgroud)
然后获取您想要用于规则的属性并创建一个新文件,例如 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'"
Run Code Online (Sandbox Code Playgroud)
确保在编写规则文件后重新加载 udev(通过运行 /etc/init.d/udev reload)。为了测试您的配置文件,我建议使用:
# udevadm test /sys/class/block/sda/
Run Code Online (Sandbox Code Playgroud)
PS:如果我发现任何问题,我更喜欢更换硬件,因为通常不值得花精力去解决任何解决方法(而且我相信你知道墨菲,一旦你认为你有问题,他就会抓住你)它工作;))。
归档时间: |
|
查看次数: |
2123 次 |
最近记录: |