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打印的监听到的文件操作,根据打印信息再到代码里面去搜索对应的文件操作,便可以很容易定位。

图片

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

    关注

    5064

    文章

    18994

    浏览量

    302601
  • 内核
    +关注

    关注

    3

    文章

    1362

    浏览量

    40205
  • Linux
    +关注

    关注

    87

    文章

    11216

    浏览量

    208814
  • 程序
    +关注

    关注

    116

    文章

    3769

    浏览量

    80806
收藏 人收藏

    评论

    相关推荐

    Linux内核的作用

    Linux操作系统是当今世界上最为广泛使用的开源操作系统之一,内核则是一个操作系统的核心和灵魂所在。对于一名
    发表于 07-06 11:46 1772次阅读
    <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内核rcu机制详解

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

    linux内核oom机制分析

    Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制监控那些占用内存过大,尤其是瞬间很快消耗
    发表于 11-13 17:01 1281次阅读
    <b class='flag-5'>linux</b><b class='flag-5'>内核</b>oom<b class='flag-5'>机制</b>分析

    linux内核机制有哪些

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

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

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

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

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

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

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

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

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

    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 3037次阅读
    深入剖析<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>虚拟<b class='flag-5'>文件</b>系统

    详解linux内核的uevent机制

    linux内核中,uevent机制是一种内核和用户空间通信的机制,用于通知用户空间应用程序各种硬件更改或其他事件,比如插入或移除硬件设备(
    的头像 发表于 09-29 17:01 444次阅读