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
    • 最新
    • 标签
主页 / unix / 问题 / 730307
Accepted
std_unordered_map
std_unordered_map
Asked: 2023-01-03 05:13:16 +0800 CST2023-01-03 05:13:16 +0800 CST 2023-01-03 05:13:16 +0800 CST

查找 raid 阵列扇区中包含的文件

  • 772

今天我检查我的 raid6 阵列(使用 ext4 文件系统)并弹出两条内核消息:

mismatch sector in range 2842495632-2842495640
mismatch sector in range 2927793488-2927793496

截至目前,我不可能通过谷歌搜索任何有用的信息,因为我无法找出哪些(如果有的话)文件驻留在这些扇区中。

也许这更好地解释了我的问题:给定一个假设的实用程序find-file,我想调用find-file 2842495632并得到类似的答案/mnt/raid/this-file-has-a-mismatch。

linux
  • 1 1 个回答
  • 45 Views

1 个回答

  • Voted
  1. Best Answer
    Hermid
    2023-01-05T08:59:20+08:002023-01-05T08:59:20+08:00

    免责声明:
    这可能都是错误的,我在这里处于深水状态,很容易犯错误,但很难验证你是否正确。我假设报告的扇区都是 512 字节。还有一些偏移量可能是错误的。
    我希望我的理解足够正确,但时间会证明一切。如果您发现错误,请纠正我!
    所有命令都需要 root 权限才能运行。备份总是好的。

    背景

    我正在努力解决与您相同的问题。由于磁盘控制器卡损坏,RAID6 中的一半驱动器消失了。不好。我现在有 48 个不匹配的 MD 扇区,想知道那里可能存储了哪些文件。我的设置与您的类似,但我还混合了 LVM。

    这个答案是针对我的设置的,因为我认为许多人实际上也使用 LVM,而您没有提供那么多设置细节。这也是我唯一可以测试的。
    在您的情况下,只需跳过 LVM 周围的部分。如果您对 md 数组进行了分区,您还必须找到文件系统的偏移量。无论哪种情况,它至少应该给你一些想法。

    设置

    存储设置如下所示:
    6 个 SATA 驱动器上的 Mdraid RAID6 作为 /dev/md1。该数组用作 LVM2 卷组“vg_arch”的 PV。VG中有多个LV,其中一个是“lv_arch2”,格式为Ext4。

    所以我们有:HDD→MD→LVM→Ext4

    问题

    在对您的 mdraid 阵列 ( /usr/share/mdadm/checkarray -a /dev/md1) 运行检查后,您在 中发现了类似这样的行/var/log/syslog:

    Jan  4 03:28:28 orion kernel: [36199.659889] md1: mismatch sector in range 2684449552-2684449560
    Jan  4 03:28:28 orion kernel: [36199.659897] md1: mismatch sector in range 2684449560-2684449568
    Jan  4 03:28:28 orion kernel: [36199.659901] md1: mismatch sector in range 2684449568-2684449576
    Jan  4 03:28:28 orion kernel: [36199.659904] md1: mismatch sector in range 2684449576-2684449584
    Jan  4 03:28:28 orion kernel: [36199.659921] md1: mismatch sector in range 2684449584-2684449592
    Jan  4 03:28:28 orion kernel: [36199.659925] md1: mismatch sector in range 2684449592-2684449600
    

    这里的问题是 RAID 阵列中的某些块已损坏,数据不可信。造成这种情况的不同原因几乎是无限的,但扇区坏了,我们现在必须查明是否有文件存储在那里,如果有,是什么文件。
    在我的例子中,数组被分成 50/50,所以 mdraid 不可能知道要使用什么数据。

    坏道范围为2684449552-2684449600,共48个。

    最好先阅读有关 RAID 恢复的信息,并在尝试恢复时使用覆盖,以免破坏您的数据。摧毁这一切非常容易。

    • https://raid.wiki.kernel.org/index.php/Recovering_a_failed_software_RAID
    • https://raid.wiki.kernel.org/index.php/Irreversible_mdadm_failure_recovery
    • https://raid.wiki.kernel.org/index.php/Linux_Raid#When_Things_Go_Wrogn

    我假设您的阵列已经组装好并且可以正常工作,至少是在只读模式下。我在测试时使用了覆盖,所以我没有错误地向真实数组写入任何内容。本指南只需要只读访问权限。

    行业狩猎

    首先,我们从内核获得的扇区号是 md 数组的扇区(至少这是我的假设)。这很好,因为我们不需要考虑较低级别的存储堆栈(分区偏移等),这使它更容易一些。

    这是我们必须遵循的路径:HDD→MD→LVM→Ext4→file

    LVM

    我们已经在MD层面了,现在我们需要看看LVM。

    LVM 堆栈的底部是物理卷 (PV)。这些被分割成区段,一个或多个区段组成一个逻辑卷 (LV)。物理卷只是底层设备,所以在这种情况下是/dev/md1.

    PV 中的数据不直接从扇区 0 开始,而是有一个偏移量。第一个扇区用于 LVM 元数据。我们首先必须计算出范围从 PV 开始到多远:

    # pvs --noheadings -o pe_start --units s /dev/md1
    2048S
    

    数据从 PV 中的 2048 个扇区开始。有问题的扇区从2684449552-2048 = 2684447504LVM 中的扇区开始,到2684449600-2048 = 335555944.

    接下来我们需要知道 LVM extent 有多大:

    # pvdisplay --units s /dev/md1 | grep 'PE Size'
    PE Size               8192 Se
    

    每个 LVM 范围有 8192 个扇区。

    现在我们可以计算问题开始的程度:2684447504/8192 = 327691,345703125 extents

    它是小数,因为该扇区不在精确的 PE 边界上。余数将为我们提供 PE 中的扇区偏移量: 0,345703125*8192 = +2832 sectors

    下一步是尝试找到使用 PE 327691 的 LV:

    # pvdisplay --maps /dev/md1 | grep -A1 'Physical extent'
      Physical extent 0 to 2621439:
        Logical volume  /dev/vg_arch/lv_arch2
    --
      Physical extent 2621440 to 3801087:
        Logical volume  /dev/vg_arch/lv_test
    

    我们可以看到 PE 属于 LV /dev/vg_arch/lv_arch2,并且没有偏移量。如果它有偏移量,我们必须考虑到这一点。

    文件系统 Ext4

    我们现在有足够的信息可以进入文件系统级别。首先,我们必须知道我们正在使用的扇区/块大小:

    # fdisk -u -l /dev/md1
    Disk /dev/md1: 14.52 TiB, 15959456743424 bytes, 31170813952 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 1048576 bytes / 4194304 bytes
    

    md 数组使用 512 字节扇区(我有点不确定这是否正确。我基本上只是假设内核在报告错误时使用相同的扇区大小)。

    要获取 Ext4 块大小:

    # tune2fs -l /dev/vg_arch/lv_arch2 | grep Block
    Block count:              2684354560
    Block size:               4096
    

    文件系统使用 4KiB 块,相当于每个块 8 个扇区。

    现在我们必须将 mdadm 扇区号转换为 Ext4 块号,因为它们不相同。为此,我们可以使用以下公式:

    (mdadm sector number) / ((filesystem block size) / (mdadm sector size)) = Ext4 block number
    

    在这种情况下,我们有:

    2684447504 / (4096 / 512) = 335555938 (start)
    2684447552 / (4096 / 512) = 335555944 (stop)
    

    因此,在 Ext4 文件系统中,有问题的块范围是 335555938 到 335555944。

    文件检查

    当我们现在有了块号时,我们可以继续尝试找到存储在那里的文件。这可以使用debugfs.

    # debugfs
    debugfs:
    

    然后在debugfs控制台中,使用 open 命令打开文件系统(它必须尚未挂载):

    debugfs:  open /dev/vg_arch/lv_arch2
    

    如果您的文件系统很大,此操作可能需要一些时间。

    现在我们可以开始测试块是否被使用了。如果幸运的话,坏块没有被任何文件使用。用来testb blocknumber测试它。

    debugfs:  testb 335555938
    Block 335555938 not in use
    

    对您拥有的每个坏块重复此命令并记录任何使用过的坏块,如下所示:

    debugfs:  testb 335555944
    Block 335555944 marked in use
    

    如果所有块都未使用,您就完成了。恭喜!如果没有,那我们就得继续寻找受影响的文件。

    下一步是找到正在使用此块的索引节点:

    debugfs:  icheck 335555944
    Block   Inode number
    335555944   279577043
    

    所以我们有一个受影响的 inode 279577043,让我们找到文件名:

    debugfs:  ncheck 279577043
    Inode   Pathname
    279577043   /my_files/file.dat
    

    最后,我们找到了受损坏的 mdadm 扇区影响的文件。那不是太难。;-)

    最后,运行命令close并quit退出debugfs。

    来源

    很难找到有关此问题的信息,但以下是我使用最多的站点:

    • https://raid.wiki.kernel.org/index.php/Recovering_a_failed_software_RAID - Mdadm 恢复
    • https://strugglers.net/~andy/blog/2021/07/24/resolving-a-sector-offset-to-a-logical-volume/ - 解决扇区偏移
    • https://wiki.archlinux.org/title/Identify_damaged_files - 文件系统调试
      https://serverfault.com/questions/315700/how-to-determine-which-file-inode-occupies-a-given-sector
    • md raid5: translate md internal sector numbers to offsets - 扇区翻译
    • https://raid.wiki.kernel.org/index.php/RAID_superblock_formats - RAID 超级块格式
    • 2

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve