我曾经sudo hdparm -W 0 /dev/sdb
关闭过硬盘的写缓存,信息/dev/sdb: write-caching = 0 (off)
显示写缓存确实关闭了。
但当我使用该指令时,sudo dmesg
它显示:
[23361.915713] sd 32:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
我看到写入缓存仍然启用,我想知道如何在 Ubuntu 中真正禁用外部硬盘的写入缓存功能(在 dmesg 中)。
答案1
输出dmesg
似乎是该设备首次发现时的输出。每次更改设备设置时,它不会重新打印该信息。
您这样做hdparm
应该真正禁用写入缓存。您可以通过hdparm -W /dev/sdb
再次运行查询来验证。
答案2
USB (MSC/UAS) 驱动器将自身呈现为操作系统的 SCSI 磁盘。当后台驱动器是 (S)ATA 驱动器时,SCSI-ATA 转换层 (SATL) 在适配器/机箱中的桥接芯片的固件中实现。
虽然 SATL 没有为 ATA/ACS 标准中的每个命令/功能实现映射,但它们通常具有针对写入缓存设置等典型功能的映射。无论哪种方式,映射到驱动器写缓存设置的相应 SCSI 功能(即缓存模式页的 WCE 位)是内核将监视的内容,以确定驱动器是否启用了写缓存。
换句话说,如果在更改hdparm
内核设置后没有意识到这一点,那是因为 SATL 没有检测/反映结果,或者因为内核没有收到通知。
我自己有一个外壳,它确实实现了缓存模式页面和 MODE SENSE / MODE SELECT 命令,但其 WCE 位根本不绑定到实际的写入缓存设置。读/写 WCE 位不会反映/更改驱动器本身的设置。
在这种最坏的情况下,如果您想要禁用写入缓存并通知内核新的缓存设置,您需要hdparm
分别更改 SATL 上的 和 WCE 位的实际设置。
我想可能会出现这样的情况:WCE 位确实反映了设置,但如果使用 更改了设置,则需要您触发并更新缓存的值hdparm
,这会使用 ATA PASS-THROUGH 命令来进行更改。在这种情况下,避免使用hdparm
但通过更改 WCE 位来更改设置可能就足够了。 (您可以使用hdparm
或smartctl
来确认实际设置已更改。)
要改变WCE位,至少有两种方法。一种是使用用户空间程序sdparm
:
sdparm --set WCE=0 /dev/sdX
另一种方法是写入write_through
scsi 磁盘cache_type
sysfs 文件。您可以使用以下命令找到该文件:
find /sys/ -type f -path '*scsi_disk*cache_type'
lsscsi
在eg (或USB驱动器)的帮助下lsusb.py -ui
,您应该能够轻松识别find
要修改结果中的哪一个。
(请注意,这/sys/block/sdX/queue/write_cache
不是您要查找的文件,即使其内容表示WCE 位的当前值也是如此。)
另请注意,这两个设置可能都是易失性的,这意味着它们在重新启动或电源循环后将无法保存,因此如果您需要它们持续存在,则需要在每次启动时运行上述程序/命令。
编辑:我刚刚意识到,每当我设置 WCE 时,我提到的附件实际上都会将实际写入缓存设置设置为启用,无论请求的值是1
或0
。如果您碰巧有类似的机箱,请确保始终先将 WCE 更改为 0,然后使用 更改实际缓存设置hdparm
。
答案3
要通过 USB 禁用任何可移动媒体上的写入缓存,请创建一个文件
/etc/udev/rules.d/99-udisks2-usb_mount.rules
(您可以随意命名它,只需确保它以 开头99
和结尾.rules
)并将其放入其中:
SUBSYSTEMS=="usb", SUBSYSTEM=="block", ENV{ID_FS_USAGE}=="filesystem", ENV{UDISKS_MOUNT_OPTIONS_DEFAULTS}+="sync", ENV{UDISKS_MOUNT_OPTIONS_ALLOW}+="sync"
然后重启或者运行命令sudo udevadm control --reload-rules
如果要禁用特定驱动器的写入缓存,则可以/etc/fstab
使用 gnome-disks 编辑或修改驱动器选项以包含安装选项sync