有时,Linux 内核不知道外部 USB 存储设备的驱动器写入缓存。在这种情况下是否有必要在分离这些设备之前显式刷新这些缓存?
我使用 WD Elements 外置 USB 硬盘,上面hdparm -I
写着
...
Commands/features:
Enabled Supported:
...
* Write cache
...
Run Code Online (Sandbox Code Playgroud)
和hdparm -W
:
...
write-caching = 1 (on)
Run Code Online (Sandbox Code Playgroud)
另一方面,当我插入驱动器时,我收到以下内核消息:
... No Caching mode page found
... Assuming drive cache: write through
Run Code Online (Sandbox Code Playgroud)
根据Kyle Jones 的这个回答,这些内核消息表明内核假设它的写操作将直接进入盘片。
Linux 内核文档中的文件Documentation/block/queue-sysfs.txt 的“write_cache (RW)”部分描述了内核假设通过缓存写入模式的含义(感谢Wayne Conrad):
...“直写”,...还将消除内核发出的缓存刷新。
到目前为止,我从 Linux 系统分离外部 USB 存储设备的标准方法是卸载它上所有已安装的分区,等到驱动器的 LED 停止闪烁,物理拔下 USB 连接器,如果这不会关闭电源设备(有些具有单独的电源),以明确关闭电源。
这种方法是否安全,或者它是否意味着在驱动器写入缓存中丢失未刷新数据的风险,特别是如果内核不知道该缓存?
在后一种情况下,似乎建议在卸载后通过发送 SCSI 同步命令显式刷新驱动器上的写入缓存。例如sg_sync
,可以使用 sg3-utils 附带的 which来完成: …
在 Linux 上运行blockdev --flushbufs
和在实践上有区别sync(1)
吗?(除了blockdev
针对特定设备进行刷新和sync
系统范围内的冲洗)。
sync(1)
手册页说它刷新文件系统缓冲区(仅?)。如果在dd
不经过文件系统层的情况下对驱动器进行 I/O(比如),sync
真的无效吗?
我什么时候应该使用一个而不是另一个?
块设备提供缓冲。这意味着write()
在内核将数据写入设备之前,块设备上可以返回成功。程序可以通过调用 来等待所有缓冲的写入fsync()
。
我已使用dd
(或cat
) 将文件系统映像写入设备。默认情况下不调用这些命令fsync()
。
接下来,假设我想将mount
写入的块设备作为文件系统。
我认为最安全的做法是在安装之前使用该sync
命令。但是如果我不同步块设备怎么办?文件系统是否可能尝试读取一些尚未写入设备的块?那么它是否可以读取设备的旧内容,而不是文件系统映像中的正确数据?
我的主要兴趣是 Linux 行为。(StackExchange 鼓励我提出一个具体问题。不过,我也可以对任何替代或历史行为投赞成票:-)。
该zerofree
命令在ext2或ext3文件系统中查找未分配的非零块并用零填充它们
一台带有机械驱动器的 NTFS Windows 机器从 7 升级到 10。驱动器很旧,我怀疑大部分可用空间实际上有数据而不是用零填充。
是否有可能(如何?)将可用空间归零,以便在创建图像时,尺寸最小?
假设使用 Ubuntu 或 SysRescueCD 配置的可启动 USB 可用于通过安装 NTFS 分区来处理 HDD(NTFS-3G
如有必要)
linux ×3
buffer ×2
cache ×2
block-device ×1
command-line ×1
disk ×1
filesystems ×1
ntfs ×1
unmounting ×1
usb ×1