模拟一次XFS故障,分析原因并进行修复

模拟一次XFS故障

在平常处理问题时经常会遇到文件系统损坏的问题,有时候是日志里面出现了报错但文件系统还是可以读写,有时候是文件系统已经无法读写了

image-20240806125241742

image-20240806125253577

分析下不同现象的原因和一些可能出现的情况。

通过直接修改块存储损坏文件系统

1、制作一个xfs文件系统,创建时会打印块大小bsize 4096和 inode大小iszie 512,如果是已经存在的xfs可以通过xfs_info /dev/nvme1n1查看

#mkfs.xfs /dev/nvme1n1
meta-data=/dev/nvme1n1           isize=512    agcount=16, agsize=163840 blks=                       sectsz=512   attr=2, projid32bit=1=                       crc=1        finobt=1, sparse=1, rmapbt=0=                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=2621440, imaxpct=25=                       sunit=1      swidth=1 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=16384, version=2=                       sectsz=512   sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

2、查看inode信息

[root@ip-172-31-35-68 mnt]# ls -Rli
.:
total 0
131 drwxr-xr-x. 2 root root 22 Aug  6 05:24 testxfs./testxfs:
total 0
132 -rw-r--r--. 1 root root 0 Aug  6 05:24 testfile

3、计算inode132的便宜量

  • 计算 inode 132 在 inode 表中的偏移量:

    inode_offset = inode_number * inode_size
    inode_offset = 132 * 512 = 67584 bytes
    
  • 计算 inode 132 所在的块号:

    block_number = inode_offset / block_size
    block_number = 67584 / 4096 = 16 blocks
    
  • 计算 inode 132 在块内的偏移量:

    offset_within_block = inode_offset % block_size
    offset_within_block = 67584 % 4096 = 2048 bytes=0x800 bytes
    

    因此,inode 132 在第 16 个块内的偏移量为 2048 字节。

查看一下indeo 132的信息core.magic = 0x494emagic 字段通常用于标识文件系统结构的类型。每种不同的结构都有一个唯一的 magic 数值,用于快速验证该结构的类型和一致性。magic 针对不同类型的元数据永远不会变

[root@ip-172-31-35-68 /]# xfs_db -r /dev/nvme1n1
xfs_db> inode 132
xfs_db> p
core.magic = 0x494e
core.mode = 0100644
core.version = 3
core.format = 2 (extents)
.......

4、现在来尝试修改magic来损坏文件系统

# 读取第16个block内容,拷贝到block_data_16.bin文件
dd if=/dev/nvme1n1 of=block_data_16.bin bs=4096 count=1 skip=16
#按照之前的记录16个block 的2048个字节是indoe 132,转换为16进制是0x800,修改block_data_16.bin的0x800位(hexedit/xdd)的magic0x494e为0x0043
#dd回磁盘
dd if=block_data_16.bin of=/dev/nvme1n1 bs=4096 count=1 seek=16
#检查修改是否成功
hexdump -C -s $((4096 * 16 + 2048)) /dev/nvme1n1 |head

image-20240806140347490

修改完成后访问还是没有问题,这是因为只要访问过一次在内存中就会保存inode信息,不需要重新读取,但当内存里面没有了(内存回收/重新启动等),则无法访问

image-20240806135947947

5、重新挂载时候会报错mount: /mnt: mount(2) system call failed: Structure needs cleaning. 通过dmesg日志中的记录可以看到在xfs_inode这个block的的magic已经为0x004e,校验失败导致文件系统需要修复,这是因为mount的时候会进行redo log,当redo loge时发现内存中的元数据与文件系统中的元数据不一致导致mount时的校验不通过

image-20240806140818183

XFS标准修复流程

修复,xfs有一套标准的修复步骤,不过需要按照恰当的步骤来进行恢复,否则造成的损失难以挽回。

#备份整个文件系统,这一步保证如果接下来的步骤出现问题,仍然有重来的机会。
创建snapshot/dd
#重新mount 整个文件系统。这一步极度容易忽略。如果直接用xfs_repair 进行修复,则无法充分利用日志信息。日志信息中包含有因为断电而没有完整进行的操作。重新mount 文件系统,系统会在mount 时重新执行那些因为断电而没有完整进行的操作。执行mount 完成后,等待几秒,等待这些操作真正落盘.完成后尝试xfs_repair 修复,修复前可通过xfs_repair -n 先查看修复内容,并保留截图以供后续问题排查。
mount /dev/nvme1n1 /mnt/
umount /mnt
xfs_repair -n /dev/nvme1n1  > /tmp/xfs_repair.log 2>&1
xfs_repair  /dev/nvme1n1 
#修复时会将操作打印文件系统的错误,例如检查到文件系统的inode块损坏,和文件偏移等信息
Metadata corruption detected at 0x5634a0011d66, xfs_inode block 0x80/0x4000
bad CRC for inode 132
bad magic number 0x4e on inode 132
bad CRC for inode 132, will rewrite
bad magic number 0x4e on inode 132, resetting magic number
cleared inode 132
#如果无法修复的话可能需要丢弃日志进行修复
xfs_repair -L /dev/nvme1n1 

完整的修复日志如下:

[root@ip-172-31-35-68 /]# xfs_repair /dev/nvme1n1
Phase 1 - find and verify superblock...- reporting progress in intervals of 15 minutes
Phase 2 - using internal log- zero log...- 06:10:26: zeroing log - 16384 of 16384 blocks done- scan filesystem freespace and inode maps...- 06:10:26: scanning filesystem freespace - 16 of 16 allocation groups done- found root inode chunk
Phase 3 - for each AG...- scan and clear agi unlinked lists...- 06:10:26: scanning agi unlinked lists - 16 of 16 allocation groups done- process known inodes and perform inode discovery...- agno = 15- agno = 0
Metadata corruption detected at 0x5634a0011d66, xfs_inode block 0x80/0x4000
bad CRC for inode 132
bad magic number 0x4e on inode 132
bad CRC for inode 132, will rewrite
bad magic number 0x4e on inode 132, resetting magic number
cleared inode 132- agno = 1- agno = 2- agno = 3- agno = 4- agno = 5- agno = 6- agno = 7- agno = 8- agno = 9- agno = 10- agno = 11- agno = 12- agno = 13- agno = 14- 06:10:26: process known inodes and inode discovery - 64 of 64 inodes done- process newly discovered inodes...- 06:10:26: process newly discovered inodes - 16 of 16 allocation groups done
Phase 4 - check for duplicate blocks...- setting up duplicate extent list...- 06:10:26: setting up duplicate extent list - 16 of 16 allocation groups done- check for inodes claiming duplicate blocks...- agno = 0- agno = 1- agno = 4- agno = 5- agno = 6- agno = 8- agno = 9- agno = 10- agno = 11- agno = 12- agno = 13- agno = 14- agno = 15- agno = 2- agno = 7- agno = 3- 06:10:26: check for inodes claiming duplicate blocks - 64 of 64 inodes done
Phase 5 - rebuild AG headers and trees...- 06:10:26: rebuild AG headers and trees - 16 of 16 allocation groups done- reset superblock...
Phase 6 - check inode connectivity...- resetting contents of realtime bitmap and summary inodes- traversing filesystem ...- traversal finished ...- moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...- 06:10:26: verify and correct link counts - 16 of 16 allocation groups done
done

修复完成后我们可以看到indoe 132的magic已经修复完成了

image-20240806142009793

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/393336.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android图像显示SurfaceFlinger总结

1 介绍 1.1 框架中位置 ​​ 上图为Android的图形显示系统框架图。 首先上层应用通过ViewRoot的scheduleTraversals函数发起绘制任务,并通过HWUI调用OpenGL接口将绘制数据传递给GPU处理;SF会接收所有应用更新的绘制数据,并根据Z-Order、透明…

计算机网络(网络层)

网络层概述 网络层是干什么的? 网络层的主要任务是实现不同异构网络互连,进而实现数据包在各网络之间的传输相比于数据链路层的以太网通信,网络层则是将一个个数据链路层连接的以太网通过路由器连接起来。从而实现不同数据链路层的互联。 这…

​【香菇带你学Mysql】Mysql超长执行sql定位和优化【建议收藏】

本文为MySQL数据库管理员和开发人员提供了一套全面的超时SQL定位和优化解决方案。通过合理运用这些方法和技巧,可以显著提升MySQL数据库的性能和稳定性,减少超时SQL语句的发生,确保数据库的高效运行。 0. 引言 最近某个Mysql数据库频繁告警…

登录页滑块验证图

效果图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> <b…

【Kubernetes】k8s集群中pod的容器资源限制和三种探针

目录 一.关于pod容器的资源限制 1.资源限制的单位 1.1.CPU 资源单位 1.2.内存 资源单位 二.关于QOS服务质量&#xff08;pod的调度和驱逐有限制&#xff09; 1.QoS服务质量分类 2.驱逐顺序 三.关于pod容器的三种探针 1.探针的三种规则 2.Probe支持三种检查方法 3.探…

docker安装及使用

一、docker优点及作用 优点&#xff1a; 基础镜像MB级别创建简单隔离性强启动速度秒级移植与分享放便 作用&#xff1a;资源隔离 cpu、memory资源隔离与限制访问设备隔离与限制网络隔离与限制用户、用户组隔离限制 二、docker安装 2.1.配置yum源 yum install -y yum-uti…

Mysql开启SSL

等二测出未开启SSL,如下 have_openssl、have_ssl都是DISABLED也不知道当时为啥没开&#xff0c;看最近的都是开启的,整改必去得开了&#xff0c;开启步骤 1.生成秘钥 进入mysql的bin目录下&#xff0c;运行 ./mysql_ssl_rsa_setup运行后会生成证书 默认证书会在mysql的data…

主从备份(复制)

一、备份的三种类型 备份的三种主要类型包括热备份、逻辑备份和物理备份&#xff0c;每种备份类型都有其特定的应用场景和优缺点。 1. 热备份 定义&#xff1a; 热备份是在数据库或系统处于正常运行状态下进行的备份。这种备份方式允许在不停机的情况下对数据库或系统数据进…

【Python】Django Web 框架

一、常用的Web开发框架 1.Django Django是一个由Python写成的开放源代码的Web应用框架。这套框架的主要目标是使开发复杂、数据库驱动的网站变得简单。Django注重组件的重用性和“可拔插性”、敏捷开发和DRY(Dont Repeat Yourself)法则 2.Flask Flask是一个微型的Python开发…

反序列化靶机实战serial(保姆级教程)

一.信息收集 靶机地址下载&#xff1a;https://download.vulnhub.com/serial/serial.zip 打开靶机&#xff0c;在kali虚拟机中进行主机存活探测 可以知道靶机ip地址为192.168.133.171 然后扫描端口 可以发现有一个22端口跟80端口 然后接下来用kali扫描它的目录 可以发现有一…

Django-Oscar开发独立站/外贸商城教程与问题记录

​特别说明&#xff1a; 本博客为个人开发Django-Oscar时的经验总结&#xff0c;方便后期维护&#xff01;&#xff08;第一次这么认真的记录这种大型项目&#xff0c;打个广告吧&#xff1a;本人可接单算法程序开发&#xff0c;包含深度学习和图像相关……等相关&#xff09;…

Unity补完计划 之 音效

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 首先&#xff0c;音频这块组件较少&#xff0c;但是内容很重要&#xff0c;因为对于任何一款非特殊面向人群的游戏来说&a…

STM32入门三(开漏输出点亮外接的LED)

前面2章用的是推免输出&#xff0c; 推免输出: 输出端由两个晶体管构成&#xff1a;一个N沟道晶体管和一个P沟道晶体管。这两个晶体管一般不会同时导通&#xff0c;避免短路; 白话&#xff0c;就是输入高还是低&#xff0c;由你的GPIO 控制&#xff08;GPIO 输出高就高&#xf…

【LeetCode 1991 找到数组的中间位置 / LeetCode 724 寻找数组的中心下标】中间索引问题

1991 题目描述 暴力解法1&#xff1a; 思路&#xff1a; 遍历下标&#xff0c;求出左边和和右边和比较两边是否相等相等直接返回值没有符合的返回 -1 class Solution {public int findMiddleIndex(int[] nums) {int lennums.length;//初始化一个变量 midIndex 为 -1&#xff…

C# Unity 面向对象补全计划 七大原则 之 接口隔离原则 (ISP) 难度:☆ 总结:大接口分成小的,然后该干啥干啥

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识&#xff0c;看不懂没关系 请看专栏&#xff1a;http://t.csdnimg.cn/mIitr&#xff0c;查漏补缺 1.接口隔离原则 (ISP) 这…

MySQL--查询数据

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。其基本格式为&#xff1a; select {* | <字段列表>}[from <表1>,&l…

贝壳找房:基于OceanBase构建实时字典服务的实践 | OceanBase案例

贝壳找房作为领先的居住服务综合平台&#xff0c;一直在推进居住产业的数字化与智能化升级。该平台通过汇聚并赋能优质的服务者&#xff0c;旨在为中国广大家庭带来涵盖二手房买卖、新房交易、房屋租赁、家装、家居以及家庭服务等全方位、高质量且高效的居住服务体验。 在贝壳…

0803实操-数字取证

0803实操-数字取证 易失性数据收集 创建应急工具箱&#xff0c;并生成工具箱校验和&#xff0c;能在最低限度地改变系统状态的情况下收集易失性数据。 数据箱 使用md5sums.exe对工具目录中的所有文件进行计算 获取计算机本地日期和时间。输入命令date/t>timefront.txt和…

鸿蒙图形开发【3D引擎接口示例】

介绍 本实例主要介绍3D引擎提供的接口功能。提供了ohos.graphics.scene中接口的功能演示。 3D引擎渲染的画面会被显示在Component3D这一控件中。点击按钮触发不同的功能&#xff0c;用户可以观察渲染画面的改变。 效果预览 使用说明 在主界面&#xff0c;可以点击按钮进入不…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——4Bin模型转化过程

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——4Bin模型转化过程 ​ 大家好&#xff0c;经过前几期的介绍&#xff0c;对于X3派上的Yolo模型部署&#xff0c;我们已经可以进行到最后一步了 ​ 今天给大家带来&#xff0c;转模型的关键步骤&#xff0…