嵌入式Linux系統(tǒng)在運(yùn)行時,除了小概率的因突然斷電等非正常關(guān)機(jī)造成的文件系統(tǒng)損壞之外,更大概率的是因為應(yīng)用程序編程不當(dāng),造成對Nandflash的頻繁擦寫,行業(yè)術(shù)語稱之為 過度編程(Over Program) ,逼近Nandflash約十萬次的擦寫壽命,表現(xiàn)為Nandflash的某些塊/頁陸續(xù)出現(xiàn)位反轉(zhuǎn)(bit flip,所謂位反轉(zhuǎn),指的是原先Nandflash中存儲的某個數(shù)據(jù)位變化了,即要么從1變成了0,要么從0變成了1)的現(xiàn)象,少量的位反轉(zhuǎn)是可以靠硬件/軟件ECC(Error Checking and Correction,錯誤檢查和糾正)算法自糾過來的,但大量的位反轉(zhuǎn)超出ECC的糾正能力之后,會導(dǎo)致文件系統(tǒng)數(shù)據(jù)損壞,嚴(yán)重時會導(dǎo)致系統(tǒng)崩潰,終端運(yùn)行不起來。
對于大規(guī)模量產(chǎn)的終端設(shè)備而言,這種問題一旦發(fā)生,往往不是升級下應(yīng)用程序就能解決的,因為底層存儲器件的壽命已到,必需要更換硬件才行,這會給公司帶來大量的人力、物力及財力消耗,公司產(chǎn)品口碑也會受到影響,后果是非常嚴(yán)重的。
然而現(xiàn)實(shí)中,采用嵌入式Linux系統(tǒng)的應(yīng)用程序,其代碼規(guī)模一般都不會很小,少則幾萬十幾萬行,多則幾十上百萬行,想要快速找到應(yīng)用程序中對文件寫操作比較頻繁的地方,猶如大海撈針。這種情況下,尋找一種快速有效的方法,協(xié)助我們研發(fā)人員快速定位問題所在,將有問題的應(yīng)用程序在家里提前暴露出來,不要流到現(xiàn)場等著問題去爆發(fā),就顯得尤為重要。
Linux內(nèi)核從2.6.13版本起,加入了inotify特性,這是一種文件系統(tǒng)的變化通知機(jī)制,通過inotify可以監(jiān)控文件系統(tǒng)中添加、刪除、修改,移動等各種文件操作,當(dāng)事件發(fā)生時可及時發(fā)出相關(guān)的事件警告。利用這個內(nèi)核接口,第三方軟件就可以監(jiān)控文件系統(tǒng)下文件的各種變化情況。
具體實(shí)施方式
以嵌入式Linux系統(tǒng)常用的ubi文件系統(tǒng)為例,具體步驟如下:
步驟1: 觀察內(nèi)核啟動時掛載ubi文件系統(tǒng)時的打印信息,或者在系統(tǒng)正常運(yùn)行過程中隨時輸入ubinfo命令,查看目前文件系統(tǒng)對Nandflash閃存的最大擦寫次數(shù)。
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: 正常如果應(yīng)用程序沒有過度編程的話,上面顯示的最大擦寫次數(shù)(Current maximum erase counter value)一般不會很大,如果看到這種幾萬次的擦寫次數(shù),或者短時間內(nèi)這個最大擦寫次數(shù)增長比較快,說明應(yīng)用程序中應(yīng)該有過度編程的情況,這時我們可以借助Linux系統(tǒng)中的文件操作監(jiān)控工具inotify協(xié)助定位。
步驟3: 在inotify的站點(diǎn)下載inotify-tools監(jiān)控工具源代碼,這里以版本inotify-tools-3.13.tar.gz為例。
步驟4: 由于嵌入式Linux系統(tǒng)一般運(yùn)行在ARM平臺上,需要將上面下載的源代碼進(jìn)行交叉編譯(cross-compiling,所謂交叉編譯,就是在一種平臺上編譯,編譯出來的程序,放到別的平臺上運(yùn)行,即編譯環(huán)境和運(yùn)行環(huán)境不一樣,這個概念主要和嵌入式開發(fā)有關(guān),一般是在x86平臺上編譯,在ARM平臺上運(yùn)行),生成inotifywait、inotifywatch可執(zhí)行程序及運(yùn)行時需要的庫文件。
make CC=arm-none-linux-gnueabi-gcc
步驟5: 將交叉編譯后生成的inotifywait、inotifywatch可執(zhí)行程序上傳到嵌入式Linux設(shè)備的/sbin目錄下,并修改可執(zhí)行權(quán)限。
chmod 755 inotifywait
chmod 755 inotifywatch
步驟6: 將交叉編譯后生成的庫文件libinotifytools.so.0.4.1上傳到嵌入式Linux設(shè)備的/lib目錄下,并在/lib目錄下建立符號鏈接。
ln -s libinotifytools.so.0.4.1 libinotifytools.so.0
步驟7: 執(zhí)行如下命令即可啟動對文件操作的監(jiān)聽。
inotifywait -mrq --timefmt '%y/%m/%d %H:%M' --format '%T %w %f %e' -e modify,delete,create,attrib --exclude 'ptmx|pts|ttyS*' /
其中:
--timefmt選項用于控制打印出來的時間格式,這里采用了“年/月/日 時:分”的格式。
--exclude選項用于剔除過濾不需要監(jiān)控的文件名稱,支持通配符*過濾。
-e選項用于注冊要監(jiān)聽的文件操作事件。
步驟8: 這時應(yīng)該就可以看到inotify打印的監(jiān)聽到的文件操作,根據(jù)打印信息再到代碼里面去搜索對應(yīng)的文件操作,便可以很容易定位。
-
嵌入式
+關(guān)注
關(guān)注
5089文章
19170瀏覽量
306801 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1381瀏覽量
40364 -
Linux
+關(guān)注
關(guān)注
87文章
11336瀏覽量
210100 -
程序
+關(guān)注
關(guān)注
117文章
3794瀏覽量
81281
發(fā)布評論請先 登錄
相關(guān)推薦
評論