如何在Ubuntu中真正禁用外部硬盘的写入缓存功能(在dmesg中)?

如何在Ubuntu中真正禁用外部硬盘的写入缓存功能(在dmesg中)?

我曾经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 位来更改设置可能就足够了。 (您可以使用hdparmsmartctl来确认实际设置已更改。)

要改变WCE位,至少有两种方法。一种是使用用户空间程序sdparm

sdparm --set WCE=0 /dev/sdX

另一种方法是写入write_throughscsi 磁盘cache_typesysfs 文件。您可以使用以下命令找到该文件:

find /sys/ -type f -path '*scsi_disk*cache_type'

lsscsi在eg (或USB驱动器)的帮助下lsusb.py -ui,您应该能够轻松识别find要修改结果中的哪一个。

(请注意,这/sys/block/sdX/queue/write_cache不是您要查找的文件,即使其内容表示WCE 位的当前值也是如此。)

另请注意,这两个设置可能都是易失性的,这意味着它们在重新启动或电源循环后将无法保存,因此如果您需要它们持续存在,则需要在每次启动时运行上述程序/命令。

编辑:我刚刚意识到,每当我设置 WCE 时,我提到的附件实际上都会将实际写入缓存设置设置为启用,无论请求的值是10。如果您碰巧有类似的机箱,请确保始终先将 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

相关内容