在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux pstore實現自動“抓捕”內核崩潰日志

Linux閱碼場 ? 來源:Linuxer ? 2020-06-28 09:50 ? 次閱讀

作者簡介

廖威雄,就職于珠海全志科技股份有限公司,負責Linux IO全棧研發、性能優化、開源社區開發交流、Linux 內核開源社區pstore/blk,mtdpstore模塊的作者、大客戶存儲技術支持、全志首個UBI存儲方案主導人、全志首個RTOS NFTL主導人

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

簡介

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

這對分析那種小概率且沒辦法抓到現場的問題非常實用,尤其是現在智能互聯網的設備逐漸普及的時候,遠端的設備可以自己捕抓崩潰日志再通過網絡傳輸到服務器,維護人員就可以根據收集來的日志定位和解決問題,然后通過OTA讓設備升級迭代。

根據網上搜尋的資料,在pstore文件系統之前其實有不少類似的實現。

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

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

crashlog
這是openwrt提供的內核patch,并沒有提交到內核社區。它也是基于ram,只能轉存Panic/Oops的日志。

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

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

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

pstore的前端,是指轉存的日志類型,pstore的后端,是指轉存到什么類型的設備。

目前支持以下幾個前端:

dmesg:主要是轉存Panic/Oops時log_buf里面的內核日志

pmsg:提供給用戶空間存儲日志的入口,在Android里有看到被用于存儲系統的日志。

console:終端日志

ftrace:function trace的信息

目前支持以下幾種后端:

pstore/ram:Persistent Ram,重啟不會丟數據的內存

pstore/blk:(v5.8以后的版本)所有可寫的塊設備,例如磁盤、U盤、emmc、NFTL nand等

mtd device:(v5.8以后的版本)mtd設備,例如 mtd nand。(mtd設備的支持依賴于 pstore/blk 后端,準確來說不是一種獨立后端)

怎么用

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

使能pstore

掛載pstore文件系統

讀取轉存的日志文件

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

Documentation/admin-guide/ramoops.rst

Documentation/admin-guide/pstore-blk.rst

使能

在menuconfig中選擇內核pstore模塊

$ make menuconfig |-> File systems |-> Miscellaneous filesystems |-> Persistent store support |-> Log kernel console messages # console 前端 |-> Log user space messages # pmsg 前端 |-> Persistent function tracer # ftrace 前端 |-> Log panic/oops to a RAM buffer # pstore/ram 后端 |-> Log panic/oops to a block device # pstore/blk 后端

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

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

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

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

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

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

在Kconfig中配置:

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

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

pstore_blk.blkdev=XXXX或者以模塊加載:

$sudoinsmodpstore_blk.koblkdev=XXX

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

/dev/: 例如,使用U盤的第2個分區,則是/dev/sdb2

::例如,mmc設備第6個分區,則是179:6

形式大概是這樣:

$sudoinsmodpstore_blk.koblkdev=/dev/sdb2或者

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

如果是mtd設備,可以直接指定mtd分區名或者編號,例如:

pstore_blk.blkdev=pstore#假設存在名為pstore的MTD分區

OK,對新同學來說,到這里配置就夠了??梢詮奈业膅ithub(見參考鏈接[2])上看到我之前是怎么測試的。如果需要知道每個配置項的作用,還是看內核文檔吧(ramoops.rst 或 pstore_blk.rst),或者在Kconfig中按h顯示相關配置項的說明。

掛載

在使能且正確配置設備后,啟動的時候應該會有這樣的日志:

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

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

mount-tpstorepstore/sys/fs/pstore掛載后,通過mount能看到類似這樣的信息:

# mount...pstore on /sys/fs/pstore type pstore (rw,relatime)...

如果曾經觸發過崩潰日志,在掛載點應該有類似這樣的文件:

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

如果需要驗證,咱們可以這樣主動觸發內核崩潰:

#echoc>/proc/sysrq-trigger

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

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

讀取

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

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

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

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

可以發現,第一行是累計總的觸發次數,第二行是上一次啟動觸發的次數。

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

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

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

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

展望未來

正如我前文說的,pstore在物聯網設備逐漸普及的現在,能發揮很大的作用,例如智能音箱和掃地機已經用起來了。

全功能支持

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

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

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

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

遷移pstore/ram

在當前pstore的目錄結構是這樣的:

$ tree fs/pstorefs/pstore/├── blk.c # pstore/blk 后端的實現├── ftrace.c # ftrace 前端的實現├── inode.c # pstore 文件系統的注冊與操作├── internal.h├── Kconfig├── Makefile├── platform.c # pstore 前后端功能的核心├── pmsg.c # pmsg 前端的實現├── ram.c # pstore/ram 后端的實現├── ram_core.c # pstore/ram 后端的實現└── zone.c # pstore/zone 實現存儲空間的分配和管理

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

dram空間分配與管理

dram的讀寫操作

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1403

    瀏覽量

    40946
  • Linux
    +關注

    關注

    87

    文章

    11420

    瀏覽量

    212307

原文標題:Linux pstore 實現自動“抓捕”內核崩潰日志

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    S32G3板卡上內核崩潰自動重啟怎么解決?

    我目前正在將我的 S32G3 板配置為在內核崩潰自動重啟。但是,盡管在 sysctl.conf 文件中進行了必要的更改并觸發了重啟,但開發板并未按預期執行自動重啟。它顯示消息“Reb
    發表于 03-31 08:26

    基于OpenSBI的linux nommu實現

    Linux內核6.10提供了對沒有mmu的riscv處理器工作在S模式下的內核的支持,本文介紹基于OpenSBI的linuxnommu的實現,供大家參考。1、OpenSBI介紹SBI
    的頭像 發表于 02-08 13:43 ?438次閱讀
    基于OpenSBI的<b class='flag-5'>linux</b> nommu<b class='flag-5'>實現</b>

    如果系統日志顯示驅動問題,我該怎么辦?

    如果系統日志顯示驅動問題,您可以按照以下步驟進行排查和解決: 1.檢查內核日志 使用 dmesg 命令查看內核日志,過濾出與驅動相關的錯誤信
    的頭像 發表于 01-20 17:38 ?379次閱讀

    Linux實時查看日志的四種命令詳解

    如何在Linux中實時查看日志文件的內容?那么有很多實用程序可以幫助用戶在文件更改或不斷更新時輸出文件的內容。在Linux中實時顯示文件內容的常用命令是tail命令(有效地管理文件)。 1.
    的頭像 發表于 01-13 10:45 ?2158次閱讀
    <b class='flag-5'>Linux</b>實時查看<b class='flag-5'>日志</b>的四種命令詳解

    Wine開發系列——如何使用Wine日志調試問題

    ? 輸出調試日志是調試程序的一種常見方法,尤其是處理那些難以捉摸的多線程錯誤、隨機崩潰等問題時。 通過在合適的位置輸出調試日志,可以幫助我們更快地定位問題所在。 對于不熟悉的代碼,經常打日志
    的頭像 發表于 01-06 11:29 ?653次閱讀

    嵌入式工程師都在找的【Linux內核調試技術】建議收藏!

    在嵌入式系統的開發中,Linux內核調試是一個至關重要的環節。 隨著處理器技術的不斷進步和嵌入式領域的蓬勃發展,掌握有效的內核調試技術成為了開發者們的一項必備技能。本文將介紹幾種常見的Lin
    發表于 11-28 15:37

    deepin社區亮相第19屆中國Linux內核開發者大會

    中國 Linux 內核開發者大會,作為中國 Linux 內核領域最具影響力的峰會之一,一直以來都備受矚目。
    的頭像 發表于 10-29 16:35 ?774次閱讀

    linux內核中通用HID觸摸驅動

    linux內核中,為HID觸摸面板實現了一個通用的驅動程序,位于/drivers/hid/hid-multitouch.c文件中。hid觸摸驅動是以struct hid_driver實現
    的頭像 發表于 10-29 10:55 ?1794次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內核</b>中通用HID觸摸驅動

    Linux日志管理經驗總結

    日志內容,合理的日志內容(日志錨點,內容格式,等)可以為應用服務的執行記錄、問題排查提供最有力的幫助。
    的頭像 發表于 10-24 17:36 ?416次閱讀

    日志篇:模組日志總體介紹

    ?今天我們學習合宙模組日志總體介紹,以下進入正文。 一、本文討論的邊界 本文是對合宙 4G 模組, 以及 4G+GNSS 模組的日志功能的總體介紹。通過日志,可以對研發過程中,以及模組運行過程中
    的頭像 發表于 10-24 07:16 ?438次閱讀
    <b class='flag-5'>日志</b>篇:模組<b class='flag-5'>日志</b>總體介紹

    linux驅動程序如何加載進內核

    Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動程序的編寫是
    的頭像 發表于 08-30 15:02 ?871次閱讀

    linux日志管理之journalctl命令

    journalctl 用來查詢 systemd-journald 服務收集到的日志。systemd-journald 服務是 systemd init 系統提供的收集系統日志的服務。
    的頭像 發表于 08-14 18:18 ?3350次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>日志</b>管理之journalctl命令

    Linux內核測試技術

    。內核測試技術是實現這一目標的關鍵手段。本文將詳細介紹 Linux 內核測試的各種技術,包括單元測試、集成測試、功能測試和性能測試等,并討論不同測試方法的優缺點及其適用場景。
    的頭像 發表于 08-13 13:42 ?832次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    Linux內核中的頁面分配機制

    Linux內核中是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux內核是如何管
    的頭像 發表于 08-07 15:51 ?508次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中的頁面分配機制

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    1 華為宣布鴻蒙內核已超越Linux內核 ? 6月21日,在華為開發者大會上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨立于安卓和iOS的鴻蒙操作系統,正式登場。這是HarmonyOS
    的頭像 發表于 06-27 11:30 ?1080次閱讀
    主站蜘蛛池模板: 婷婷6月| 四虎看片| 91久久青草精品38国产 | 久草资源在线播放 | 国内黄色一级片 | 手机看片国产免费 | 视频免费观看网址 | 两性色视频 | 亚洲欧美一区二区三区另类 | 好男人社区www的视频免费 | 日本色片在线观看 | 日产乱码免费一卡二卡在线 | 国产一级特黄aa大片爽爽 | 国产高清美女一级a毛片 | 日本大片免aaa费观看视频 | 亚洲 欧美 另类 综合 日韩 | 乱色伦图片区 | 视频综合网 | 久久久中文 | avbobo官网在线入口 | 怡红院色视频在线 | 天天操2023| 一级片黄色免费 | 一级视频在线 | 国内真实下药迷j在线观看 国内自拍 亚洲系列 欧美系列 | 日本久操 | 福利视频午夜 | 色多多视频成人影院 | 萌白酱一线天粉嫩喷水在线观看 | 三级视频国产 | 在线免费视频你懂的 | 婷婷综合久久狠狠色99h | 四虎网站网址 | 久久久久久国产精品免费免费 | 国产高清在线播放免费观看 | 特级毛片s级全部免费 | 亚州人成网在线播放 | 超大乳抖乳露双乳视频 | 永久免费观看视频 | 亚洲一区二区中文 | 免看乌克兰a一级 |