成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux pstore 實現(xiàn)自動“抓捕”內(nèi)核崩潰日志

系統(tǒng) Linux
pstore文件系統(tǒng)(是的,這是個文件系統(tǒng))是Persistent Storage的縮寫,最早在2010年由 Tony Luck 設(shè)計并合入Linux主分支,設(shè)計的初衷是在內(nèi)核Panic/Oops時能自動轉(zhuǎn)存內(nèi)核日志(log_buf),在Panic重啟后,把轉(zhuǎn)存的日志以文件形式呈現(xiàn)到用戶空間以分析內(nèi)核崩潰問題。

 我設(shè)計的內(nèi)核模塊pstore/blk及其衍生的pstore/zone,mtdpstore終于在v5.8-rc1版本合入了torvalds/linux.git(見參考鏈接[1]),而且發(fā)現(xiàn)國內(nèi)外對pstore的介紹都好少好少,干脆來一波科普。

[[329610]]

簡介

pstore文件系統(tǒng)(是的,這是個文件系統(tǒng))是Persistent Storage的縮寫,最早在2010年由 Tony Luck 設(shè)計并合入Linux主分支,設(shè)計的初衷是在內(nèi)核Panic/Oops時能自動轉(zhuǎn)存內(nèi)核日志(log_buf),在Panic重啟后,把轉(zhuǎn)存的日志以文件形式呈現(xiàn)到用戶空間以分析內(nèi)核崩潰問題。

這對分析那種小概率且沒辦法抓到現(xiàn)場的問題非常實用,尤其是現(xiàn)在智能互聯(lián)網(wǎng)的設(shè)備逐漸普及的時候,遠(yuǎn)端的設(shè)備可以自己捕抓崩潰日志再通過網(wǎng)絡(luò)傳輸?shù)椒?wù)器,維護(hù)人員就可以根據(jù)收集來的日志定位和解決問題,然后通過OTA讓設(shè)備升級迭代。

根據(jù)網(wǎng)上搜尋的資料,在pstore文件系統(tǒng)之前其實有不少類似的實現(xiàn)。

  • apanic

Android最早的panic信息記錄的方案。在linux 2.6的安卓的內(nèi)核中找到,卻沒有提交到社區(qū),后來被放棄維護(hù)了。網(wǎng)上找不到放棄的原因,我自己猜測是因為其只適用于mtd nand,然而現(xiàn)在的Android基本用的都是emmc。apanic應(yīng)該是Android Panic的縮寫吧,可以實現(xiàn)在內(nèi)核崩潰時,把日志轉(zhuǎn)存到mtd nand。

  • ramoops

這里指的是最早的ramoops實現(xiàn),在最新代碼已經(jīng)整合入pstore中,以pstore/ram的后端形式存在。ramoops可以把日志轉(zhuǎn)存到重啟不掉電的ram中。這里對ram有一點要求,即使重啟ram的數(shù)據(jù)也不能丟失。

  • crashlog

這是openwrt提供的內(nèi)核patch,并沒有提交到內(nèi)核社區(qū)。它也是基于ram,只能轉(zhuǎn)存Panic/Oops的日志。

  • mtdoops

MTD子系統(tǒng)支持的功能,與pstore非常相似,只支持轉(zhuǎn)存Panic/Oops日志,不能以文件呈現(xiàn),需要用戶自行解析整個MTD分區(qū)。(因為功能的相似,我實現(xiàn)了mtdpstore用于替代mtdoops)

  • kdump

如果說pstore是個輕量級的內(nèi)核崩潰日志轉(zhuǎn)存的方案,kdump則是一個重量級的問題分析工具。在崩潰時,由kdump產(chǎn)生一個用于捕抓當(dāng)前信息的內(nèi)核,該內(nèi)核會收集內(nèi)存所有信息到dump core文件中。在重啟后,捕抓到的信息保存在特定的文件中。類似的還有netdump和diskdump。kdump的方案適用于服務(wù)器這種有大量資源的設(shè)備,功能也非常強大,但對嵌入式設(shè)備非常不友好。

pstore經(jīng)過長期迭代,除了轉(zhuǎn)存Panic/Oops的日志之外(dmesg前端),還支持pmsg、console和ftrace的前端,除了pstore/ram的后端之外,還有我設(shè)計的pstore/blk后端,除了支持轉(zhuǎn)存到ram之外,還有block device和mtd device。

pstore的前端,是指轉(zhuǎn)存的日志類型,pstore的后端,是指轉(zhuǎn)存到什么類型的設(shè)備。

目前支持以下幾個前端:

  • dmesg:主要是轉(zhuǎn)存Panic/Oops時log_buf里面的內(nèi)核日志
  • pmsg:提供給用戶空間存儲日志的入口,在Android里有看到被用于存儲系統(tǒng)的日志。
  • console:終端日志
  • ftrace:function trace的信息

目前支持以下幾種后端:

  • pstore/ram:Persistent Ram,重啟不會丟數(shù)據(jù)的內(nèi)存
  • pstore/blk:(v5.8以后的版本)所有可寫的塊設(shè)備,例如磁盤、U盤、emmc、NFTL nand等
  • mtd device:(v5.8以后的版本)mtd設(shè)備,例如 mtd nand。(mtd設(shè)備的支持依賴于 pstore/blk 后端,準(zhǔn)確來說不是一種獨立后端)

怎么用

就像把大象裝入冰箱只需要打開冰箱,把大象放進(jìn)去,關(guān)上冰箱門的3個步驟,使用pstore也只需要3個步驟:

  • 使能 pstore
  • 掛載 pstore文件系統(tǒng)
  • 讀取 轉(zhuǎn)存的日志文件

詳細(xì)的說明可以看源碼上的文檔,本文只做基本功能的介紹。

Documentation/admin-guide/ramoops.rst

Documentation/admin-guide/pstore-blk.rst

使能

在menuconfig中選擇內(nèi)核pstore模塊

  1. $ make menuconfig 
  2.   |-> File systems 
  3.     |-> Miscellaneous filesystems 
  4.       |-> Persistent store support 
  5.         |-> Log kernel console messages    # console 前端 
  6.         |-> Log user space messages      # pmsg 前端 
  7.         |-> Persistent function tracer      # ftrace 前端 
  8.         |-> Log panic/oops to a RAM buffer     # pstore/ram 后端 
  9.         |-> Log panic/oops to a block device   # pstore/blk 后端 

上述兩個后端2選1即可,前端就根據(jù)自己的需求選擇,至于dmesg前端,默認(rèn)使能沒得選。如果希望用在mtd設(shè)備上,還需要選擇mtdpstore模塊:

  1. $ make menuconfig 
  2.   |-> Device Drivers 
  3.     |-> Memory Technology Device (MTD) support 
  4.       |-> Log panic/oops to an MTD buffer based on pstore 

選上就可以用了?雖然我非常想說“是的”,但事實卻有點“骨感”。即使所有前端都使用默認(rèn)配置,pstore/ram至少也需要知道可用的內(nèi)存范圍吧?pstore/blk至少也需要知道使用哪個塊設(shè)備吧?

pstore/ram支持 模塊參數(shù)(cmdline)、設(shè)備樹、和Platform Data的3種配置方式,從代碼來看,優(yōu)先級關(guān)系是:模塊參數(shù) > Platform Data > 設(shè)備樹。

pstore/blk支持 Kconfig和 模塊參數(shù)(cmdline)的兩種配置方式,且模塊參數(shù)比Kconfig有更高的優(yōu)先級。

pstore/ram我接觸也不多,直接介紹pstore/blk的使用方法。對新同學(xué)來說,請忽略一大堆亂七八糟的屬性配置(使用默認(rèn)值),只需要告訴pstore/blk后端使用哪個塊設(shè)備即可。

在Kconfig中配置:

  1. $ make menuconfig 
  2.   |-> File systems 
  3.     |-> Miscellaneous filesystems 
  4.       |-> Persistent store support 
  5.         |-> Log panic/oops to a block device   # pstore/blk 后端 
  6.           |-> () block device identifier      # 使用哪個塊設(shè)備? 

如果使用cmdline,可以這么寫:

  1. pstore_blk.blkdev=XXXX 

或者以模塊加載:

  1. $ sudo insmod pstore_blk.ko blkdev=XXX 

這里的塊設(shè)備可以是代表整個磁盤的sda,也可以是代表某個分區(qū)的mmcblk0p4。雖然支持7種變體,但常用的還是兩種:

  • /dev/<disk_name>: 例如,使用U盤的第2個分區(qū),則是/dev/sdb2
  • <major>:<minor>:例如,mmc設(shè)備第6個分區(qū),則是179:6

形式大概是這樣:

  1. $ sudo insmod pstore_blk.ko blkdev=/dev/sdb2 

或者

  1. $ cat /proc/cmdline 
  2. .... pstore_blk.blkdev=179:6 ... 

如果是mtd設(shè)備,可以直接指定mtd分區(qū)名或者編號,例如:

  1. pstore_blk.blkdev=pstore  # 假設(shè)存在名為pstore的MTD分區(qū) 

OK,對新同學(xué)來說,到這里配置就夠了。可以從我的github(見參考鏈接[2])上看到我之前是怎么測試的。如果需要知道每個配置項的作用,還是看內(nèi)核文檔吧(ramoops.rst 或 pstore_blk.rst),或者在Kconfig中按h顯示相關(guān)配置項的說明。

掛載

在使能且正確配置設(shè)備后,啟動的時候應(yīng)該會有這樣的日志:

  1. pstore_zone: registered pstore_blk as backend for kmsg(Oops,panic_write) 
  2. pstore: Registered pstore_blk as persistent store backend 

這代表pstore找到了設(shè)備且正常注冊。接下來,我們還需要通過掛載的形式觸發(fā)pstore從設(shè)備讀取數(shù)據(jù)。常見的掛載是這樣的:

  1. mount -t pstore pstore /sys/fs/pstore 

掛載后,通過mount能看到類似這樣的信息:

  1. # mount 
  2. ... 
  3. pstore on /sys/fs/pstore type pstore (rw,relatime) 
  4. ... 

如果曾經(jīng)觸發(fā)過崩潰日志,在掛載點應(yīng)該有類似這樣的文件:

  1. # ll /sys/fs/pstore 
  2. ... 
  3. -r--r--r--    1 root     root         15521 Jan  1 00:06 dmesg-pstore_blk-0 
  4. ... 

如果需要驗證,咱們可以這樣主動觸發(fā)內(nèi)核崩潰:

  1. # echo c > /proc/sysrq-trigger 

我是在U盤、SD卡、mmc、nand上驗證的,maintainer Kees Cook 提供了另外一種基于loop的驗證方法,實現(xiàn)用文件模擬塊設(shè)備。當(dāng)然這方法不適用于轉(zhuǎn)存Panic日志,只能用于Oops或者其他前端:

  1. # insmod pstore.ko compress=off 
  2. # insmod pstore_zone.ko 
  3. truncate pstore-blk.raw --size 100M 
  4. # losetup -f --show pstore-blk.raw 
  5. /dev/loop0 
  6. # insmod pstore_blk.ko blkdev=/dev/loop0 kmsg_size=16 console_size=64 best_effort=on 

讀取

經(jīng)過上述的掛載后,可以在掛載點看到轉(zhuǎn)存的日志文件。既然是文件,肯定支持文件的一系列操作,例如讀取、刪除。

  1. root@TinaLinux:/sys/fs/pstore# head -n 10 dmesg-pstore_blk-1 
  2. Oops: Total 2 times 
  3. Oops#1 Part1 
  4. <6>[    2.743794] Bluetooth: RFCOMM socket layer initialized 
  5. <6>[    2.743813] Bluetooth: RFCOMM ver 1.11 
  6. <6>[    2.743822] 8021q: 802.1Q VLAN Support v1.8 
  7. <3>[    2.751766] reg-virt-consumer reg-virt-consumer.1: Failed to obtain supply 'drivevbus': -517 
  8. <3>[    2.752330] reg-virt-consumer reg-virt-consumer.1: Failed to obtain supply 'drivevbus': -517 
  9. <5>[    2.752742] ubi0: attaching mtd4 
  10. <5>[    2.890302] random: crng init done 
  11. <5>[    2.965927] ubi0: scanning is finished 
  12.  
  13. root@TinaLinux:/sys/fs/pstore# ll 
  14. drwxr-x---    2 root     root             0 Jan  1 00:11 . 
  15. drwxr-xr-x    5 root     root             0 Jan  1 00:11 .. 
  16. -r--r--r--    1 root     root         15521 Jan  1 00:06 dmesg-pstore_blk-0 
  17. -r--r--r--    1 root     root         15128 Jan  1 00:11 dmesg-pstore_blk-1 
  18.  
  19. root@TinaLinux:/sys/fs/pstore# rm dmesg-pstore_blk-1 
  20.  
  21. root@TinaLinux:/sys/fs/pstore# ll 
  22. drwxr-x---    2 root     root             0 Jan  1 00:13 . 
  23. drwxr-xr-x    5 root     root             0 Jan  1 00:11 .. 
  24. -r--r--r--    1 root     root         15521 Jan  1 00:06 dmesg-pstore_blk-0 

對dmesg前端的Panic/Oops日志,pstore會自動添加兩行統(tǒng)計信息。例如:

  1. Oops: Total 2 times      # 表示觸發(fā)了Oops,且是自系統(tǒng)安裝后第一次啟動以來第2次觸發(fā)Oops。 
  2. Oops#1 Part1        # 表示這是上一次運行期間第1次觸發(fā)Oops的日志。 

可以發(fā)現(xiàn),第一行是累計總的觸發(fā)次數(shù),第二行是上一次啟動觸發(fā)的次數(shù)。

每個文件名的格式都是<前端名>-<后端名>-,例如dmesg-pstore_blk-1表示dmesg前端,pstore_blk后端以及是dmesg前端的第1個zone的日志。

當(dāng)然,除了dmesg前端外,其他前端的名字大概是這樣的:

  1. # ll 
  2. -r--r--r-- 1 root root    31 1月  15 11:53 console-pstore-blk-0 
  3. -r--r--r-- 1 root root  3666 1月  15 11:53 demsg-pstore-blk-0 
  4. -r--r--r-- 1 root root 65524 1月  15 11:53 ftrace-pstore-blk-0 
  5. -r--r--r-- 1 root root     9 1月  15 11:53 pmsg-pstore-blk-0 

除此之外,每個文件的時間戳表示 崩潰觸發(fā)的時間。上例中,由于系統(tǒng)并沒有實現(xiàn)同步更新系統(tǒng)時間,所以時間戳不合理。

展望未來

正如我前文說的,pstore在物聯(lián)網(wǎng)設(shè)備逐漸普及的現(xiàn)在,能發(fā)揮很大的作用,例如智能音箱和掃地機已經(jīng)用起來了。

全功能支持

到目前為止,不管是塊設(shè)備還是mtd設(shè)備,社區(qū)的代碼都沒能做到pstore的全部前端的支持。

設(shè)備 dmesg(Oops) dmesg(Panic) pmsg console ftrace
塊設(shè)備 Y N Y Y Y
MTD設(shè)備 Y Y N N N
ram設(shè)備 Y Y Y Y Y

塊設(shè)備如果需要記錄Panic日志,需要提供一個在Panic時寫塊設(shè)備的接口。我在全志的mmc和nand驅(qū)動中實現(xiàn)了這樣的接口,卻因為種種原因不適合提交到社區(qū)。社區(qū)塊驅(qū)動的適配寄希望于更多同學(xué)的努力了。

MTD設(shè)備很早前就有了panic_write()的定義,因此可以支持Panic日志轉(zhuǎn)存。不支持其他前端,則是因為其擦寫的物理特性。對pmsg,console,ftrace等這些不能頁對齊寫入的前端,還需要更多的適配工作。

遷移pstore/ram

在當(dāng)前pstore的目錄結(jié)構(gòu)是這樣的:

  1. $ tree fs/pstore 
  2. fs/pstore/ 
  3. ├── blk.c      # pstore/blk 后端的實現(xiàn) 
  4. ├── ftrace.c    # ftrace 前端的實現(xiàn) 
  5. ├── inode.c    # pstore 文件系統(tǒng)的注冊與操作 
  6. ├── internal.h 
  7. ├── Kconfig 
  8. ├── Makefile 
  9. ├── platform.c    # pstore 前后端功能的核心 
  10. ├── pmsg.c    # pmsg 前端的實現(xiàn) 
  11. ├── ram.c      # pstore/ram 后端的實現(xiàn) 
  12. ├── ram_core.c    # pstore/ram 后端的實現(xiàn) 
  13. └── zone.c      # pstore/zone 實現(xiàn)存儲空間的分配和管理 

在我的補丁之前,只支持轉(zhuǎn)存日志到ram,因此如果研讀代碼,我們會發(fā)現(xiàn)ram.c和ram_core.c實現(xiàn)了兩部分功能:

  1. dram空間分配與管理
  2. dram的讀寫操作

我實現(xiàn)的blk.c支持了轉(zhuǎn)存到塊設(shè)備。但是后來發(fā)現(xiàn)不管pstore/ram還是pstore/blk,他們對于存儲空間的分配和管理極度相似,我就提煉出了pstore/zone。于是乎,期望的代碼層次應(yīng)該是這樣的:

 

 

 

 

pstore/ram要整合入pstore/zone已經(jīng)與maintainer達(dá)成共識,但還需要更多同學(xué)一同努力做更多兼容,例如ecc的支持。

參考

https://git.kernel.org/torvalds/c/829f3b9401fe7cc3c1f3642bb2520751a42a87dfhttps://github.com/gmpy/articles/blob/master/pstore/Test-Pstore-Block.md

本文轉(zhuǎn)載自微信公眾號「 Linux閱碼場」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 Linux閱碼場公眾號。

 

責(zé)任編輯:武曉燕 來源: Linux閱碼場
相關(guān)推薦

2023-12-26 15:06:00

Linux內(nèi)核轉(zhuǎn)儲

2017-08-02 14:37:31

LinuxKdump內(nèi)核崩潰

2021-03-05 07:14:08

Linuxcrashvmcore

2021-09-29 09:50:41

Linux內(nèi)核日志

2021-09-08 05:46:51

Linux內(nèi)核日志

2025-06-11 01:00:00

2021-11-14 07:29:55

Linux 內(nèi)核靜態(tài)追蹤Linux 系統(tǒng)

2021-11-15 04:00:07

Linux 內(nèi)核動態(tài)

2022-05-11 10:58:11

MetricKitiOS13系統(tǒng)崩潰診斷

2015-08-03 16:23:27

2013-04-15 15:07:43

清理日志Linux系統(tǒng)

2021-02-20 06:08:07

LinuxWindows內(nèi)核

2016-11-16 09:52:39

Linux讀書筆記內(nèi)核

2023-03-10 14:56:37

Linuxconnect系統(tǒng)

2023-03-01 23:53:30

Linuxshutdown進(jìn)程

2025-04-01 02:00:22

2025-04-02 00:33:00

2023-03-01 23:56:11

2010-03-02 09:17:32

Linux local

2023-11-24 11:24:16

Linux系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 521av网站 | 神马久久久久久久久久 | 老司机成人在线 | 日本一区二区不卡 | 天天干天天操 | 久久久久国产 | 欧美日韩专区 | 日本一卡精品视频免费 | 亚洲一区在线日韩在线深爱 | 香蕉视频91 | 超级碰在线 | 久久久亚洲精品视频 | 国产清纯白嫩初高生视频在线观看 | 天堂一区二区三区四区 | 亚洲国产成人久久综合一区,久久久国产99 | 国产高清精品在线 | 久久最新精品 | 一级黄大片 | 日韩国产在线观看 | 日韩精品1区2区3区 成人黄页在线观看 | 欧美白人做受xxxx视频 | 午夜影视免费片在线观看 | 99免费精品视频 | 欧区一欧区二欧区三免费 | 久久精品色欧美aⅴ一区二区 | 久一精品| 日韩精品av| 欧美午夜视频 | 特a毛片| 亚洲一区中文字幕 | 91国语清晰打电话对白 | 日本欧美在线视频 | 欧美性另类 | 国产精品永久在线观看 | 精品亚洲一区二区三区四区五区 | 欧洲一级黄 | 欧美日在线 | 国产精品18久久久久久久 | 午夜精品久久久 | 人人人艹 | 国产精品久久久久久久久免费相片 |