相关疑难解决方法(0)

是否有必要显式刷新 HDD 磁盘写入缓存?

抽象的

有时,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 command-line cache usb unmounting

12
推荐指数
1
解决办法
2334
查看次数

Linux 上“blockdev --flushbufs”和“sync”之间的区别?

在 Linux 上运行blockdev --flushbufs和在实践上有区别sync(1)吗?(除了blockdev针对特定设备进行刷新和sync系统范围内的冲洗)。

sync(1)手册页说它刷新文件系统缓冲区(仅?)。如果在dd不经过文件系统层的情况下对驱动器进行 I/O(比如),sync真的无效吗?

我什么时候应该使用一个而不是另一个?

linux buffer disk

5
推荐指数
1
解决办法
3034
查看次数

块设备缓存与文件系统

块设备提供缓冲。这意味着write()在内核将数据写入设备之前,块设备上可以返回成功。程序可以通过调用 来等待所有缓冲的写入fsync()

我已使用dd(或cat) 将文件系统映像写入设备。默认情况下不调用这些命令fsync()

接下来,假设我想将mount写入的块设备作为文件系统。

我认为最安全的做法是在安装之前使用该sync命令。但是如果我不同步块设备怎么办?文件系统是否可能尝试读取一些尚未写入设备的块?那么它是否可以读取设备的旧内容,而不是文件系统映像中的正确数据?

我的主要兴趣是 Linux 行为。(StackExchange 鼓励我提出一个具体问题。不过,我也可以对任何替代或历史行为投赞成票:-)。

linux cache buffer block-device

5
推荐指数
1
解决办法
2034
查看次数

清零 NTFS 可用空间

zerofree 命令ext2ext3文件系统中查找未分配的非零块并用零填充它们

一台带有机械驱动器的 NTFS Windows 机器从 7 升级到 10。驱动器很旧,我怀疑大部分可用空间实际上有数据而不是用零填充。

是否有可能(如何?)将可用空间归零,以便在创建图像时,尺寸最小?

假设使用 Ubuntu 或 SysRescueCD 配置的可启动 USB 可用于通过安装 NTFS 分区来处理 HDD(NTFS-3G如有必要)

filesystems ntfs

5
推荐指数
2
解决办法
2294
查看次数

标签 统计

linux ×3

buffer ×2

cache ×2

block-device ×1

command-line ×1

disk ×1

filesystems ×1

ntfs ×1

unmounting ×1

usb ×1