0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

借助Linux内核文件操作监控机制inotify协助定位

麦辣鸡腿堡 来源:嵌入式软件那些事 作者:静以修身 2023-11-01 14:58 次阅读

嵌入式Linux系统在运行时,除了小概率的因突然断电等非正常关机造成的文件系统损坏之外,更大概率的是因为应用程序编程不当,造成对Nandflash的频繁擦写,行业术语称之为 过度编程(Over Program ,逼近Nandflash约十万次的擦写寿命,表现为Nandflash的某些块/页陆续出现位反转(bit flip,所谓位反转,指的是原先Nandflash中存储的某个数据位变化了,即要么从1变成了0,要么从0变成了1)的现象,少量的位反转是可以靠硬件/软件ECC(Error Checking and Correction,错误检查和纠正)算法自纠过来的,但大量的位反转超出ECC的纠正能力之后,会导致文件系统数据损坏,严重时会导致系统崩溃,终端运行不起来。

图片

对于大规模量产的终端设备而言,这种问题一旦发生,往往不是升级下应用程序就能解决的,因为底层存储器件的寿命已到,必需要更换硬件才行,这会给公司带来大量的人力、物力及财力消耗,公司产品口碑也会受到影响,后果是非常严重的。

然而现实中,采用嵌入式Linux系统的应用程序,其代码规模一般都不会很小,少则几万十几万行,多则几十上百万行,想要快速找到应用程序中对文件写操作比较频繁的地方,犹如大海捞针。这种情况下,寻找一种快速有效的方法,协助我们研发人员快速定位问题所在,将有问题的应用程序在家里提前暴露出来,不要流到现场等着问题去爆发,就显得尤为重要。

Linux内核从2.6.13版本起,加入了inotify特性,这是一种文件系统的变化通知机制,通过inotify可以监控文件系统中添加、删除、修改,移动等各种文件操作,当事件发生时可及时发出相关的事件警告。利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况。

具体实施方式

以嵌入式Linux系统常用的ubi文件系统为例,具体步骤如下:

步骤1: 观察内核启动时挂载ubi文件系统时的打印信息,或者在系统正常运行过程中随时输入ubinfo命令,查看目前文件系统对Nandflash闪存的最大擦写次数。

ubinfo -d 0

ubi0

Volumes count: 1

Logical eraseblock size: 126976 bytes, 124.0 KiB

Total amount of logical eraseblocks: 400 (50790400 bytes, 48.4 MiB)

Amount of available logical eraseblocks: 0 (0 bytes)

Maximum count of volumes 128

Count of bad physical eraseblocks: 0

Count of reserved physical eraseblocks: 8

Current maximum erase counter value: 36864

Minimum input/output unit size: 2048 bytes

Character device major/minor: 251:0

Present volumes: 0

步骤2: 正常如果应用程序没有过度编程的话,上面显示的最大擦写次数(Current maximum erase counter value)一般不会很大,如果看到这种几万次的擦写次数,或者短时间内这个最大擦写次数增长比较快,说明应用程序中应该有过度编程的情况,这时我们可以借助Linux系统中的文件操作监控工具inotify协助定位。

步骤3: 在inotify的站点下载inotify-tools监控工具源代码,这里以版本inotify-tools-3.13.tar.gz为例。

步骤4: 由于嵌入式Linux系统一般运行在ARM平台上,需要将上面下载的源代码进行交叉编译(cross-compiling,所谓交叉编译,就是在一种平台上编译,编译出来的程序,放到别的平台上运行,即编译环境和运行环境不一样,这个概念主要和嵌入式开发有关,一般是在x86平台上编译,在ARM平台上运行),生成inotifywait、inotifywatch可执行程序及运行时需要的库文件。

make CC=arm-none-linux-gnueabi-gcc

步骤5: 将交叉编译后生成的inotifywait、inotifywatch可执行程序上传到嵌入式Linux设备的/sbin目录下,并修改可执行权限。

chmod 755 inotifywait
chmod 755 inotifywatch

步骤6: 将交叉编译后生成的库文件libinotifytools.so.0.4.1上传到嵌入式Linux设备的/lib目录下,并在/lib目录下建立符号链接。

ln -s libinotifytools.so.0.4.1 libinotifytools.so.0

步骤7: 执行如下命令即可启动对文件操作的监听。

inotifywait -mrq --timefmt '%y/%m/%d %H:%M' --format '%T %w %f %e' -e modify,delete,create,attrib --exclude 'ptmx|pts|ttyS*' /

其中:

--timefmt选项用于控制打印出来的时间格式,这里采用了“年/月/日 时:分”的格式。

--exclude选项用于剔除过滤不需要监控的文件名称,支持通配符*过滤。

-e选项用于注册要监听的文件操作事件。

步骤8: 这时应该就可以看到inotify打印的监听到的文件操作,根据打印信息再到代码里面去搜索对应的文件操作,便可以很容易定位。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4990

    文章

    18344

    浏览量

    289614
  • 内核
    +关注

    关注

    3

    文章

    1310

    浏览量

    39882
  • Linux
    +关注

    关注

    87

    文章

    11005

    浏览量

    206824
  • 程序
    +关注

    关注

    114

    文章

    3630

    浏览量

    79631
收藏 人收藏

    评论

    相关推荐

    Linux内核的作用

    Linux操作系统是当今世界上最为广泛使用的开源操作系统之一,内核则是一个操作系统的核心和灵魂所在。对于一名
    发表于 07-06 11:46 1274次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的作用

    关于Inotifylinux文件系统的监控

    Linux提供了hotplup(热插拔),udev和inotify机制帮助我们可以看到底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好地服务。Inotify通过如下三个系
    发表于 10-19 16:01

    linux中的inotify机制的一点认识

    Linux中一切皆文件,在应用程序中,有时候我们需要对文件系统的目录或者文件进行监控,以便于我们能根据
    发表于 11-29 17:00

    Linux inotify基本用法

    Linux inotify监听文件状态
    发表于 07-02 14:47

    linuxinotify机制

    linux下开发过程中,用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如 hotplug、udev
    发表于 07-22 08:05

    基于Linux内核2_6的进程拦截机制的研究和实现_王全民

    基于Linux内核2_6的进程拦截机制的研究和实现_王全民
    发表于 03-18 09:15 3次下载

    linux内核rcu机制详解

    Linux内核源码当中,关于RCU的文档比较齐全,你可以在 /Documentation/RCU/ 目录下找到这些文件。Paul E. McKenney 是内核中RCU源码的主要实现者
    发表于 11-13 16:47 8549次阅读
    <b class='flag-5'>linux</b><b class='flag-5'>内核</b>rcu<b class='flag-5'>机制</b>详解

    linux内核机制有哪些

     在操作系统引入了进程概念,进程成为调度实体后,系统就具备了并发执行多个进程的能力,但也导致了系统中各个进程之间的资源竞争和共享。另外,由于中断、异常机制的引入,以及内核态抢占都导致了这些内核
    发表于 11-14 15:25 5372次阅读
    <b class='flag-5'>linux</b><b class='flag-5'>内核</b><b class='flag-5'>机制</b>有哪些

    linux内核机制

    在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问。尤其是在多处理器系统上,更需要一些同步
    发表于 11-14 15:52 6524次阅读

    inotify框架的使用和原理!如何添加对于目标文件的watch呢?

    为了防止文件描述符fd的快速消耗,inotify提出了一个inotify instance(inotify实例)的概念。每一个inotify
    的头像 发表于 08-15 17:43 1.1w次阅读
    <b class='flag-5'>inotify</b>框架的使用和原理!如何添加对于目标<b class='flag-5'>文件</b>的watch呢?

    需要了解的Linux inotify功能及实现原理

    众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件
    发表于 05-13 09:47 399次阅读

    可以了解并学习Linux 内核的同步机制

    Linux内核同步机制,挺复杂的一个东西,常用的有自旋锁,信号量,互斥体,原子操作,顺序锁,RCU,内存屏障等。
    发表于 05-14 14:10 578次阅读

    Linux 内核文件 Cache 管理机制介绍

    的问题了。下面我们介绍一下 Linux 内核文件 Cache 管理的机制。本文以 2.6 系列内核为基准,主要讲述工作原理、数据结构和算法
    发表于 04-02 14:38 364次阅读

    Linux内核文件Cache机制

    Linux内核文件Cache机制(开关电源技术与设计 第二版)-Linux内核
    发表于 08-31 16:34 4次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b><b class='flag-5'>文件</b>Cache<b class='flag-5'>机制</b>

    深入剖析Linux内核虚拟文件系统

    虚拟文件系统(Virtual File System,简称VFS)是Linux内核的子系统之一,它为用户程序提供文件文件系统
    的头像 发表于 05-14 15:53 2757次阅读
    深入剖析<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>虚拟<b class='flag-5'>文件</b>系统