【问题标题】:What happen if write() encounters disk bad sectors on Linux ext3如果 write() 在 Linux ext3 上遇到磁盘坏扇区会发生什么
【发布时间】:2018-05-12 04:10:42
【问题描述】:

假设我的程序调用 write() 将一些数据写入使用 ext3 格式化的磁盘分区。磁盘恰好生成了一个坏扇区,数据将刷新到该扇区。

write() 会返回 errno 吗?或者操作系统将移动到另一个好的扇区并且 write() 返回 OK(同时标记那个坏扇区不再使用)?

【问题讨论】:

    标签: linux filesystems


    【解决方案1】:

    假设您使用的是刚刚打开()的文件描述符,您将通过内核 vfs 层缓冲访问磁盘。当您 write() 时,您的写入将被放入内核中的缓冲区,而不是实际写入磁盘。所以 write() 会正常成功。

    如果您想强制写入更改,您必须发送至sync()。如果磁盘出现错误,sync() 也会成功。出现错误的地方是dmesg

    请注意,如果这是一个可恢复的错误,它可能会被静默避免,并为该磁盘更新坏块列表。

    【讨论】:

    • 假设错误不可恢复,它是硬件损坏。你提到 sync() 也会成功,所以 close() 也会成功,对吧?因此,在 open-wirte-sync-close 操作之后,某个目录中会存在一个文件。不知道是文件坏了还是没问题?
    • 我不是 100% 确定,但我的猜测是 close 也会成功。如果没有,您将在 errno 中获得 EIO。它可能还取决于底层存储(即 SAS 或 SATA)支持的功能。大多数(所有现代?)磁盘都会保留校验和并在物理介质上使用 ECC 来检测错误,但在重新读取数据之前可能不会出现。
    猜你喜欢
    • 2019-12-05
    • 2023-03-23
    • 2013-03-18
    • 2019-01-29
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2022-01-23
    相关资源
    最近更新 更多