自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(164)
  • 资源 (1)
  • 收藏
  • 关注

原创 软raid - - fix_read_error

在RAID未降级的场景下,读修复的逻辑为尝试从故障磁盘再读一次,如果尝试重新读还是失败,则从另一成员盘中读取数据,再写入故障盘。

2024-08-11 10:04:20 162

原创 软raid - - udev规则

FROM AI:udev是Linux 2.6内核及以后版本中引入的一个设备管理框架,它取代了之前的devfs系统。udev以守护进程的形式运行,并且工作在用户空间而不是内核空间。它的主要功能是动态地创建和管理/dev目录下的设备节点,并且能够根据系统中硬件设备的状态变化来动态更新这些节点。udev利用了sysfs文件系统提供的信息来管理设备节点。sysfs是一个虚拟的文件系统,它以文件和目录的形式展示了系统中的实际硬件设备和总线。

2024-08-03 09:56:22 1040

原创 软raid /proc/mdstat内核实现 -- mdstat_poll

内核调用md_new_event时会将md_event的计数自加,并且wake_up等待事件的进程,告诉用户态进程raid状态发生变化,用户态程序再做相应的动作。在mdadm相关函数中定义了这么一个函数,用来打印raid事件信息,其中event表示当前发生的事件类型。函数时,通常需要在循环中调用它,以便定期检查文件描述符的状态,并根据返回的事件类型执行相应的操作。结构体数组的指针,数组中的每个元素都描述了一个文件描述符及其相关的事件。函数会等待指定的毫秒数,如果在这个时间内没有事件发生,函数会返回。

2024-03-25 15:09:42 924 1

原创 软raid /proc/mdstat内核实现

实际显示是在md_seq_open初始化的seq_operations,也就是seq file的操作方法。从用户态开到的是show方法打印的raid信息,重点看md_seq_show,哪里会调用show方法?md_new_event函数其实就是给全局变量md_event_count加了1。上述函数的[1/2]分别表示什么意思呢?注册的md_seq_fops操作方法,涉及seq_file相关操作。内核在哪里注册了/proc/mdstat节点。同步状态信息查询的函数还挺大。看看seq_open干了啥?

2024-03-25 09:05:51 491

原创 mdam raid管理常见命令

mdadm reporaid基础知识:https://zhuanlan.zhihu.com/p/667925807。

2024-03-22 21:19:29 768

原创 软raid sync_action

在执行“检查”和“修复”,以及可能在执行“重新同步”时,md 将计算发现的错误数量。在“mismatch_cnt”中的计数是重新写入的扇区数量,或者(对于“检查”)本应该重新写入的扇区数量。由于大多数 RAID 级别以页面为单位工作,而不是以扇区为单位,因此这个数量可能会比实际错误数量大,大约是页面中扇区数量的倍数。被清理掉的逻辑发生在md_clean和md_do_sync同步完成后再下check命令的场景下。数据同步的默认单位是64K,也就是128个扇区,也就是说这个值记录的是某次IO操作尺寸。

2024-03-12 20:38:45 426

原创 Linux 软raid auto-detect

raid_setup函数会根据内核启动参数来设定raid自动探测相关参数,也就是说即使在编译内核时将对应的配置选项打开,也可以通过内核参数将该能力关闭。从上述描述来看,只有分区类型为0xfd且超级块类型为0.0的分区才能被自动探测并组装成raid,那如何修改分区type?答:Linux内核会扫描所有磁盘,查找分区为0xfd类型,如果不包含分区类型为0xfd的分区,0xfd类型分区链表为空。选项在编译时被打开,raid_noautodetect被初始化为0,表示需要自动探测软raid。

2024-03-06 10:25:04 616

原创 kretprobe kretprobe_instance私有数据区

这段初始化申请的内存是所有kretprobe实例共用的,也就是说是轮转使用的,所以在ret_handler使用完这段内存之后,需要将私有数据区的相关字段set为0。从上述内存申请的逻辑来看,被跟踪的实例是存在限制的,在注册kretprobe时可以根据实际情况进行调整。从内核代码出发,看看在注册kretprobe的时候是怎么分配内存的?的大小是在register_kretprobe时根据设定的data_size来设定。的size由结构体struct kretprobe的成员data_size来初始化。

2024-03-05 19:16:22 906

原创 Linux 内核获取函数size

还是要骚操作获取,在内核中没有看到直接获取函数。,从计算的结果来看,加上偏移与调用栈打印的函数。对目标文件进行反汇编,从汇编代码中计算。是函数在代码中的偏移量。表示函数的总大小(以字节为单位)。,因此也可以直接调用该函数获取函数。,免去上述复杂的字符串解析过程。表示函数内部代码的偏移量,为动态打印进程调用栈信息。获取到的字符串信息示例为。,这种方式需要从数组。

2024-03-01 09:04:33 765

原创 Linux 内核irq_stack遍历

环境Centos 4.18.0-80.el8.x86_64。

2024-03-01 08:57:52 1131

原创 软raid v0.9元数据存放区域计算

的目的是为了将20971520低七位清零,形成一种64K对齐的效果,对齐之后取最后一个64KB作为元数据的存放区域,对于磁盘非64K对齐的区域软raid不进行管理。宏MD_NEW_SIZE_SECTORS用来计算元数据存放的扇区位置,传参为磁盘的扇区数x,如果磁盘大小为10G,磁盘扇区数为。,对于磁盘大小为10G的磁盘来讲,刚好保留了最后64K用来存放软raid元数据,当然也包括bitmap相关信息。,用来被保存raid superblock的总大小为64KB。假设设备的磁盘大小为10G,换算成字节。

2024-02-29 09:12:40 409

原创 Linux 软raid函数 - - align_to_barrier_unit_end

len的值是取到最接近BARRIER_UNIT_SECTOR_SIZE整数倍的值,然后再减去扇区的起始扇区的值,len的值就是是start_sector所属的屏障单元从start_sector到bucket末端的扇区数。所以此时,round_up的返回值为BARRIER_UNIT_SECTOR_SIZE << 1,就是1<<18,是BARRIER_UNIT_SECTOR_SIZE 的两倍。举个例子,假设要对齐的起始扇区号为7,BARRIER_UNIT_SECTOR_SIZE的值为1<<17。

2024-01-09 10:23:24 712

原创 linux 内核工作延迟机制-工作队列

作用:内核中执行延迟执行或者异步执行的机制,运行在抢占上下文中,中断下半部分需要要睡眠,工作队列是唯一选择。睡眠是指处理I/O数据、持有互斥锁、延迟,以及可能导致睡眠或将任务移出运行队列的所有其他任务,工作队列是内核中的一种机制,用于将需要延迟执行的任务排队,这些任务会在将来某个时刻由工作线程来执行。这对于不能在中断上下文中执行的任务或者不应该长时间阻塞的任务非常有用。内核使用场景:设备驱动程序:在设备驱动程序中,有些操作可能需要花费较长的时间来完成,例如硬盘读写、网络数据传输等。

2024-01-05 10:58:32 1476

原创 Linux 软raid - - Barrier

在linux软raid中,用来处理正常IO和同步IO的并发问题,可以简单理解为专用于软raid的锁。软raid在做resync/recovery,或者配置操作时需要raise 屏障,于此同时必须暂停正常IO。barrier是可以被多次raise的一个计数器,来计算有多少个相关活动事件在发生,其中不包括正常IO。raise 屏障的条件是没有pending的IO即nr_pending=0。只有在没有人等待barrier down的情况下,才会选择raise barrier。

2024-01-02 22:20:11 861

原创 Linux 系统设置cpu频率

cpufreq-set allows you to modify cpufreq settings without having to type e.g. “/sys/devices/system/cpu/cpu0/cpufreq/scaling_set_speed” all the time.(不需要直接操作sysfs相关节点即可调整cpufreq).conservative,翻译成保守(中庸)模 式,会自动在频率上下限调整,ondemand的区别在于它会按需分配频率,而不是一味追求最高频率;

2023-12-07 10:56:14 1114

原创 open与openat的区别

open 与 openat

2023-11-29 22:07:23 1062

原创 einj 注入内存ue/ce故障

einj 注入内存ue/ce故障

2023-11-29 22:04:36 4086

原创 `kprobe`和`kretprobe`同一个函数能不能调注册多个回调?

kprobe使用

2023-11-28 09:04:01 463

原创 Linux tc 使用

tc模拟延时丢包等网络故障依赖的内核驱动有些系统并不是默认就安装上该驱动的,如果没有安装该驱动,构造网络故障时会报错。安装驱动可是为什么安装好内核驱动之后还是会报错??内核驱动源码路径尝试自己编译下这个内核驱动?- - 自己编译了之后,发现是同样的情况??尝试用其他命令尝试注入网络时延故障 - - 发现做网络延时是没有问题的,这就有理由怀疑是命令格式问题?最后还是自己去翻了以下man手册,最终找到了答案,change是用来修改某个网卡网络规则的(无脑拷贝他人命令的结果),add。

2023-11-19 12:05:30 2012

原创 Linux pcie AER

Linux内核AER内核驱动代码路径:(CONFIG_PCIEAER_INJECT=y or CONFIG_PCIEAER_INJECT=m)drivers/pci/pcie/aer_inject.c(如果系统中已经将该模块编译,modprobe aer_inject加载驱动即可)用户态控制程序repo:控制程序根据linux内核源码中头文件对AER相关错误类型做了拓展。

2023-11-19 11:59:32 432

原创 内核驱动获取函数size

还是要骚操作获取,在内核中没有看到直接获取函数。,从计算的结果来看,加上偏移与调用栈打印的函数。对目标文件进行反汇编,从汇编代码中计算。是函数在代码中的偏移量。表示函数的总大小(以字节为单位)。,因此也可以直接调用该函数获取函数。方式三:通过内核函数动态获取函数。表示函数内部代码的偏移量,为动态打印进程调用栈信息。直接从目标文件中获取函数。获取到的字符串信息示例为。,这种方式需要从数组。

2023-09-22 09:05:25 127

原创 Linux 驱动扫描所有线程调用栈

函数,为非导出函数,如何使用未导出函数之前的文章有介绍过。文件系统,将进程的栈信息透给用户态,调用链如下所示。从函数的定义来看需要将内核调试选项。从调用栈上来看,最终调用的是函数。打开,核心程序调用的是。

2023-09-20 22:10:30 450 1

原创 linux ebpf - kprobe_do_sys_open

_x64_sys_openat 是一种以绝对路径或相对路径打开文件的方式,需要指定打开文件的完整路径和用于查找文件的基础目录(该目录由另一个文件描述符指定)。接着,内核会分配一个新的文件描述符,并维护进程和该文件描述符之间的映射关系。上述代码存在一个问题,设置读取map的时间间隔比较短,读取的map信息可能是上一次更新的数据。,没有进行初始化,bpf字节码不会为该结构体申请空间,根本原因是没有进行结构体的初始化!声明部分,**看来还是得学一学bpf的汇编,**从报错信息来看,是非法从直接从栈中读取数据?

2023-07-14 22:26:52 887

原创 树莓派perf执行报错

来获取当前内核版本,然后去执行perf_$version,也就是/usr/bin/perf_6.1,原始的raspios没有安装该包。从提示信息来看,perf命令去系统中招perf_6.1,但是没有找到该文件,结果发现。上,需要简单修改下shell脚本,修改perf版本信息为刚才安装pef版本就行。查找适合当前系统的package,从结果来看,当前系统支持的报名为。安装过后执行perf命令仍然报错,问题处在。修改过后可以正常使用perf工具。是一个shell脚本。

2023-06-30 19:46:05 542

原创 linux内核 fault-injection

实验环境raspi 4b。

2023-06-30 07:57:40 1031

原创 ebpf执行报错no BTF found for kernel

在该方案中,eBPF 程序一次编译,然后在运行时进行更新(patched):基于运行的机器的内核结构布局更新运行指令。CO-RE依赖BTF是因为BTF提供了BPF程序的类型信息,这对于CO-RE的优化和动态加载非常重要。CO-RE需要使用BTF来检查BPF程序的类型正确性,以及在运行时动态解析BPF程序的符号和类型信息。它可以将BPF程序的字节码和相关的元数据打包成一个可重定位的对象文件,然后在运行时动态加载和共享这个对象文件。这样可以避免重复编译和加载相同的BPF程序,从而提高系统的性能和可维护性。

2023-06-29 08:27:07 1061

原创 查找文件所在磁盘扇区

它提供了与 ext 文件系统相关的功能,如查看和修改文件系统的超级块、组描述符、索引节点等。可以看到,文件所属的块设备为 /dev/sdb,挂载点是/media/curtis/58506ab8-491f-4d42-a643-1fe7576d742f。提示信息已经可以很明显的看出挂在失败的原因,文件系统超级块存在问题,根本原因是U盘没有正确的格式化。表述的是逻辑扇区号,所以需要获取文件系统的块大小,如上所示,文件系统的块大小为4k。代表的是文件所在的逻辑扇区号,有可能是连续,也有可能不连续。

2023-06-29 07:53:11 1194

原创 树莓派4b raspberrypi os 更换内核

强烈建议参考官网

2023-06-28 08:02:31 667

原创 /proc/kallsyms 符号表说明

在Linux内核中,kallsyms是一个符号表,它包含了内核中所有的符号信息,包括函数、变量、常量等等。这些符号信息可以被内核模块和其他程序使用,这些符号类型可以帮助开发人员更好地理解内核中的符号信息,从而更好地进行内核开发和调试。上述函数可以使用符号名找到在内核中的地址,使用该方法可以使用内核中未导出的内核函数。B:表示该符号是一个未初始化的全局变量,它的值在程序启动时被初始化为0。b:表示该符号是一个未初始化的局部变量,它的值在程序启动时被初始化为0。T:表示该符号是一个函数,可以被其他代码调用。

2023-04-04 08:29:30 2820 1

原创 ftrace使用实战

诉求:遇到一个问题 echo blocked > /sys/class/block/sdb/device/state 报非法参数,想要知道根因,但是对这块内核代码不熟悉,不知道从哪里下手,那就先用ftrace看看内核调用栈,如下所示。在 IO 请求的处理过程中,数据需要在不同的层次之间传递和转换,因此 IO 性能的优化需要考虑整个调用栈的影响。是一个很快的过程,没有办法精准的知道什么时候把trace打开,所以只能采集相对来说比较泛的数据,为了减少一些无用的数据,可以通过写两个脚本来实现,先抓取。

2023-03-31 08:30:03 379

原创 ext文件系统找到文件在磁盘中对应的扇区

验证思路:在/目录下创建一个文件test,并且写入测试字符串,使用debugfs的方式查看文件所对应的扇区。好巧,测试的文件系统是ext4(ext4用的最广泛?诉求:想要找到一个文件存放在物理磁盘的哪个扇区?

2023-03-29 22:36:51 436

原创 kprobe 在某个函数offset处插桩

对于符号来讲好找,查一查内核符号表就行了,可是想要知道某个函数内语句相对于函数起始地址的偏移还是需要一定方法。使用dis -s可以查看内核函数源码,dis -l 可以获取汇编代码对应源码的行号,如下所示便是。处插桩,如何获取到对应的offset。需求:想要在以下函数。

2023-03-21 14:30:49 265

原创 Linux 内核likely与unlikey

这里的意思是exp==c的概率很大,用来引导GCC用来条件分支预测,开发人员最清楚最可能执行哪个分支,并将最有可能执行的分支告诉编译器,让编译器优化指令序列排序,使指令尽可能的顺序执行,从而提高CPU预取指令的正确性,提升CPU执行性能。的值不为0的可能性大一些,执行else机会大一些,加上这种修饰,编译成二进制代码时likely使得if后面的执行语句紧跟着前面的程序,unlikely使得else后面的语句紧跟着前面的程序,这样就会被cache预读取,增加程序的执行速度。先得学一学GCC提供的内建函数!

2023-03-19 12:29:49 524

原创 linux kernel 5.0 inline hook框架

linux kernel inline hook

2023-03-18 21:37:23 1150

原创 内核延迟执行-sleep-dealy

内核延迟

2023-03-18 09:51:42 518

原创 内核中的高精度定时器

内核启动hrtimer使用

2023-03-18 08:39:16 904

原创 shell 脚本expect

expect 脚本可以接受从bash传递过来的参数,可以使用 [lindex $argv n]获得,n从0开始,分别表示第1个到第n个参数。主要:判断输出结果是否包含某项字符串,如果没有设置超时时间,则立即返回,如果设置了超时时间,则等待一段时间后返回。这里我希望ssh上去之后判断某个文件夹是否存在,如果存在先删除,然后在创建,如果不存在则直接创建。执行完后保持交互状态,把控制权交给控制台,如果不添加这一项,交互命令会自动推出。设置超时时间,单位是秒,如果设为 timeout -1,表示永远不超时。

2023-03-17 23:17:21 2024

原创 linux awk获取倒数某一列

awk

2023-03-14 17:19:58 782

原创 vmware openfiler 安装踩坑指南

iscsi openfiler

2023-03-09 23:08:07 1345

原创 Centos-stream-9 iscsi 外置存储搭建

iscsi服务器搭建

2023-03-09 08:30:57 698 1

fsstress binary file

fsstress文件系统测试工具二进制文件

2023-03-05

postmark binary file

postmark文件系统性能测试工具二进制文件

2023-03-05

linux objdump binary file

编译出objdump二进制文件,可以直接使用,用于反汇编; 修改权限:chmod +x objdump 使用示例:objdump -d a.out(gcc编译出的可执行文件)

2020-10-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除