- 博客(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
原创 软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
原创 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
原创 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
原创 /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
原创 shell 脚本expect
expect 脚本可以接受从bash传递过来的参数,可以使用 [lindex $argv n]获得,n从0开始,分别表示第1个到第n个参数。主要:判断输出结果是否包含某项字符串,如果没有设置超时时间,则立即返回,如果设置了超时时间,则等待一段时间后返回。这里我希望ssh上去之后判断某个文件夹是否存在,如果存在先删除,然后在创建,如果不存在则直接创建。执行完后保持交互状态,把控制权交给控制台,如果不添加这一项,交互命令会自动推出。设置超时时间,单位是秒,如果设为 timeout -1,表示永远不超时。
2023-03-17 23:17:21 2024
linux objdump binary file
2020-10-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人