AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 498900
Accepted
Dok
Dok
Asked: 2013-04-13 12:15:14 +0800 CST2013-04-13 12:15:14 +0800 CST 2013-04-13 12:15:14 +0800 CST

故意在 Linux 中导致 I/O 错误?

  • 772

无论如何,对于 Linux,是否有意使块设备报告 I/O 错误,或者可能为了测试目的而模拟错误?

linux
  • 5 5 个回答
  • 12065 Views

5 个回答

  • Voted
  1. Best Answer
    Matthew Ife
    2013-04-13T14:33:25+08:002013-04-13T14:33:25+08:00

    是的,有一种非常合理的方法可以使用设备映射器来执行此操作。

    设备映射器可以将块设备重新组合成您选择的新映射/顺序。LVM 就是这样做的。它还支持其他目标(有些非常新颖),例如模拟故障磁盘的“flakey”和模拟磁盘故障区域的“错误”。

    可以构建一个故意在其上设置 IO 黑洞的设备,当越过时会报告 IO 错误。

    首先,创建一些虚拟卷用作目标并使其作为块设备可寻址。

    dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
    losetup /dev/loop0 /var/lib/virtualblock.img
    

    因此,首先创建一个 512M 的文件,它是我们的虚拟块设备的基础,我们将在其中打一个“洞”。不过目前还没有洞。如果你这样做,mkfs.ext4 /dev/loop0你会得到一个完全有效的文件系统。

    所以,让我们使用 dmsetup,它使用这个块设备——将创建一个有一些漏洞的新设备。这里先举个例子

    dmsetup create errdev0
    0 261144 linear /dev/loop0 0
    261144 5 error
    261149 787427 linear /dev/loop0 261139
    

    这将创建一个名为“errdev0”的设备(通常在 /dev/mapper 中)。当您键入dmsetup create errdev0时,它将等待 stdin 并在输入 ^D 时完成。

    在上面的示例中,我们在循环设备的扇区 261144 处创建了一个 5 扇区孔 (2.5kb)。然后我们照常继续通过循环设备。

    该脚本将尝试为您生成一个表,该表将在随机位置放置孔,大约分布在 16Mb 左右(尽管它非常随机)。

    #!/bin/bash
    start_sector=0
    good_sector_size=0
    
    for sector in {0..1048576}; do
    
        if [[ ${RANDOM} == 0 ]]; then
            echo "${start_sector} ${good_sector_size} linear /dev/loop0 ${start_sector}"
            echo "${sector} 1 error"
            start_sector=$((${sector}+1))
            good_sector_size=0
        else
            good_sector_size=$((${good_sector_size}+1))
        fi
    done
    
    echo "${start_sector} $((${good_sector_size}-1)) linear /dev/loop0 ${start_sector}"
    

    该脚本假定您还创建了一个 512Mb 的设备并且您的虚拟块设备处于打开状态/dev/loop0。

    您可以将此数据作为表格输出到文本文件,然后将其通过管道传输到dmsetup create errdev0.

    一旦你创建了设备,你就可以像普通的块设备一样开始使用它了,首先是格式化它,然后在上面放置文件。在某些时候,您应该遇到一些 IO 问题,您遇到的扇区实际上是虚拟设备中的 IO 漏洞。

    完成使用dmsetup remove errdev0后移除设备。

    如果你想让它更有可能出现 IO 错误,你可以更频繁地添加孔或更改你创建的孔的大小。请注意,在某些部分中放置错误可能会导致一开始就出现问题,将 32mb 的 IE 放入您无法编写 ext 通常会尝试执行的超级块的设备中,因此该格式将无法工作。

    为了增加乐趣——你实际上可以就在losetup那时mkfs.ext4 /dev/loop0用数据填充它。一旦你在那里有了一个很好的工作文件系统,只需卸载文件系统并使用 dmsetup 添加一些漏洞并重新安装它!

    • 54
  2. Raúl Salinas-Monteagudo
    2013-04-13T13:58:50+08:002013-04-13T13:58:50+08:00

    为了在输出失败时检查程序的健壮性,您可以使用伪设备/dev/full,它在写入时总是返回“ENOSPACE”。

    $ dd if=/dev/zero of=/dev/full
    dd: writing to `/dev/full': No space left on device
    1+0 records in
    0+0 records out
    
    • 16
  3. Dennis Kaarsemaker
    2013-04-13T12:46:25+08:002013-04-13T12:46:25+08:00

    取决于你想测试什么。使用LD_PRELOADed 库,您可以诱使应用程序思考诸如“所有写入都因ENOSPCor失败EIO”之类的事情。

    • 7
  4. Mark Wagner
    2013-04-13T14:56:05+08:002013-04-13T14:56:05+08:00

    您可以通过许多有趣的方式来做到这一点。请参阅https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt

    • 7
  5. Jure1873
    2013-04-13T13:01:13+08:002013-04-13T13:01:13+08:00

    也许您可以更改分区表并使分区比实际更大。这可能会导致 i/o 错误。或者,如果您的磁盘是可热插拔的,您可以只拔出一个。

    • 1

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve