Linux dmesg --查看开机信息/打印或控制内核环形缓冲区

本文介绍了Linux系统下dmesg命令的使用方法及其应用场景。dmesg用于打印系统的开机启动信息,帮助用户诊断启动过程中的问题。文章还提供了多个实例,展示了如何结合其他命令如less、tail等来查看和管理开机日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用途说明

dmesg命令用于打印Linux系统开机启动信息,kernel会将开机信息存储在ringbuffer中。您若是开机时来不及查看信息,可利用dmesg来查看(print or control the kernel ring buffer)。开机信息亦保存在/var/log/dmesg的文件里。某些硬件设备(比如七号信令卡、语音卡之类)在安装的时候,通常会安装驱动程序 (内核模块),会打印一些信息,就可以通过dmesg命令来查看。

 

常用参数

格式:dmesg

查看开机信息。

 

格式:dmesg -c

清除开机信息,但/var/log/dmesg文件中仍然有这些信息。

 

因为dmesg命令输出的东西有点多,通常与less/more/tail/grep等命令配合使用。

 

使用示例

示例一 将开机信息发邮件

man dmesg 写道

The program helpsusers to print out their bootup messages. Instead of copying the messages byhand, the user need only:

dmesg >boot.messages

and mail theboot.messages file to whoever can debug their problem.

 

[root@new55 ~]# dmesg >boot.messages

[root@new55 ~]# ls -l boot.messages

-rw-r--r-- 1 rootroot 15838 12-09 12:55 boot.messages

[root@new55 ~]# mail -s "Boot Log of Linux Server"public@web3q.net <boot.messages

[root@new55 ~]#

示例二 浏览dmesg输出的信息

[root@new55 ~]# uname -a

Linux new552.6.18-194.el5 #1 SMP Tue Mar 16 21:52:43 EDT 2010 i686 i686 i386 GNU/Linux

[root@new55 ~]# dmesg | less

Linux version2.6.18-194.el5 (mockbuild@x86-007.build.bos.redhat.com) (gcc version 4.1.220080704 (Red Hat 4.1.2-48)) #1 SMP Tue Mar 16 21:52:43 EDT 2010

BIOS-providedphysical RAM map:

 BIOS-e820:0000000000010000 - 000000000009fc00 (usable)

 BIOS-e820:000000000009fc00 - 00000000000a0000 (reserved)

 BIOS-e820:00000000000e0000 - 0000000000100000 (reserved)

 BIOS-e820:0000000000100000 - 000000001f7d0000 (usable)

 BIOS-e820:000000001f7d0000 - 000000001f7efc00 (reserved)

 BIOS-e820:000000001f7efc00 - 000000001f7fb000 (ACPI NVS)

 BIOS-e820:000000001f7fb000 - 000000001f800000 (reserved)

 BIOS-e820:00000000e0000000 - 00000000f0000000 (reserved)

 BIOS-e820:00000000fec00000 - 00000000fec02000 (reserved)

 BIOS-e820:00000000fed20000 - 00000000fed9b000 (reserved)

 BIOS-e820:00000000feda0000 - 00000000fedc0000 (reserved)

 BIOS-e820:00000000ffb00000 - 00000000ffc00000 (reserved)

 BIOS-e820:00000000fff00000 - 0000000100000000 (reserved)

0MB HIGHMEMavailable.

503MB LOWMEMavailable.

Memory for crashkernel (0x0 to 0x0) notwithin permissible range

disabling kdump

Using x86 segmentlimits to approximate NX protection

On node 0totalpages: 128976

  DMA zone:4096 pages, LIFO batch:0

  Normal zone:124880 pages, LIFO batch:31

DMI 2.3 present.

Using APIC driverdefault

ACPI: RSDP (v000HP                                   ) @ 0x000fe270

ACPI: RSDT (v001HP     30C4     0x31100620HP   0x00000001) @ 0x1f7efc84

ACPI: FADT (v002HP     30C4     0x00000002HP   0x00000001) @ 0x1f7efc00

ACPI: MADT (v001HP     30C4     0x00000001HP   0x00000001) @ 0x1f7efcb8

ACPI: MCFG (v001HP     30C4     0x00000001HP   0x00000001) @ 0x1f7efd14

ACPI: SSDT (v001HP       HPQPpc 0x00001001 MSFT 0x0100000e) @0x1f7f6698

ACPI: DSDT (v001HP       DAU00  0x00010000 MSFT 0x0100000e)@ 0x00000000

ACPI: PM-Timer IOPort: 0x1008

ACPI: Local APICaddress 0xfec01000

ACPI: LAPIC(acpi_id[0x01] lapic_id[0x00] enabled)

Processor #0 6:13APIC version 20

ACPI: LAPIC_NMI(acpi_id[0x01] high edge lint[0x1])

ACPI: IOAPIC(id[0x01] address[0xfec00000] gsi_base[0])

IOAPIC[0]: apic_id1, version 32, address 0xfec00000, GSI 0-23

:

 

示例三 查看dmesg尾部的信息

[root@new55 ~]# dmesg | tail

Bluetooth: L2CAP ver2.8

Bluetooth: L2CAPsocket layer initialized

Bluetooth: RFCOMMsocket layer initialized

Bluetooth: RFCOMMTTY layer initialized

Bluetooth: RFCOMMver 1.8

Bluetooth: HIDP(Human Interface Emulation) ver 1.1

eth0: no IPv6routers present

Installing knfsd(copyright (C) 1996 okir@monad.swb.de).

NFSD: Using/var/lib/nfs/v4recovery as the NFSv4 state recovery directory

NFSD: starting90-second grace period

[root@new55 ~]#

 

示例四 安装SS7卡驱动时的内核日志

[root@localhostss7dpklnx]# cd SS7HD_DRIVER/

[root@localhostSS7HD_DRIVER]# ls

bbdddlnx_iss.h bbd_hbi.h  bbd_ioc.c  bbd_isr.c  bbd_pci.c BSD_license.txt  GPL_V2-only_license.txt  install_ss7hd.sh Makefile26

bbd_def.h      bbd_hs.c   bbd_ioc.h  bbd_lnx.c  bbd_pro.h build_ss7hd.sh  i21555.h                Makefile24

[root@localhostSS7HD_DRIVER]# ./build_ss7hd.sh

make: Enteringdirectory `/usr/src/kernels/2.6.9-22.EL-i686'

  CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_hs.o

  CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_ioc.o

  CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_isr.o

  CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_pci.o

  CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_lnx.o

  LD [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/ss7hddvr26.o

  Buildingmodules, stage 2.

  MODPOST

 CC     /root/setup/ss7dpklnx/SS7HD_DRIVER/ss7hddvr26.mod.o

  LD [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/ss7hddvr26.ko

make: Leavingdirectory `/usr/src/kernels/2.6.9-22.EL-i686'

[root@localhostSS7HD_DRIVER]# ./install_ss7hd.sh

[root@localhostSS7HD_DRIVER]# lsmod | grep ss7

ss7hddvr26            25808  0

[root@localhostSS7HD_DRIVER]# dmesg | tail

ACPI: PCI interrupt0000:02:0d.0[?] -> GSI 9 (level, low) -> IRQ 9

BBD[0] 64bit

SS7HD[0] - suspend

 

 

Dialogic SS7HDDevice Driver V100.00 (Source V1.21)

Copyright (C)Dialogic Corporation 2003-2010.  All Rights Reserved

Using major devicenumber 251.

ACPI: PCI interrupt0000:02:0d.0[?] -> GSI 9 (level, low) -> IRQ 9

BBD[0] 64bit

[root@localhostSS7HD_DRIVER]# ./install_ss7hd.sh remove

[root@localhostSS7HD_DRIVER]# lsmod | grep ss7

[root@localhostSS7HD_DRIVER]# dmesg | tail

BBD[0] 64bit

SS7HD[0] - suspend

 

 

Dialogic SS7HDDevice Driver V100.00 (Source V1.21)

Copyright (C)Dialogic Corporation 2003-2010.  All Rights Reserved

Using major devicenumber 251.

ACPI: PCI interrupt0000:02:0d.0[?] -> GSI 9 (level, low) -> IRQ 9

BBD[0] 64bit

SS7HD[0] - suspend

[root@localhostSS7HD_DRIVER]#

 

示例五 打印并清除内核环形缓冲区

[root@new55 ~]# dmesg -c

Linux version2.6.18-194.el5 (mockbuild@x86-007.build.bos.redhat.com) (gcc version 4.1.220080704 (Red Hat 4.1.2-48)) #1 SMP Tue Mar 16 21:52:43 EDT 2010

BIOS-providedphysical RAM map:

 BIOS-e820:0000000000010000 - 000000000009fc00 (usable)

 BIOS-e820:000000000009fc00 - 00000000000a0000 (reserved)

 BIOS-e820:00000000000e0000 - 0000000000100000 (reserved)

 BIOS-e820:0000000000100000 - 000000001f7d0000 (usable)

 BIOS-e820:000000001f7d0000 - 000000001f7efc00 (reserved)

 BIOS-e820:000000001f7efc00 - 000000001f7fb000 (ACPI NVS)

 BIOS-e820:000000001f7fb000 - 000000001f800000 (reserved)

 BIOS-e820:00000000e0000000 - 00000000f0000000 (reserved)

 BIOS-e820:00000000fec00000 - 00000000fec02000 (reserved)

 BIOS-e820:00000000fed20000 - 00000000fed9b000 (reserved)

 BIOS-e820:00000000feda0000 - 00000000fedc0000 (reserved)

 BIOS-e820:00000000ffb00000 - 00000000ffc00000 (reserved)

 BIOS-e820:00000000fff00000 - 0000000100000000 (reserved)

0MB HIGHMEMavailable.

503MB LOWMEMavailable.

Memory for crashkernel (0x0 to 0x0) notwithin permissible range

disabling kdump

Using x86 segmentlimits to approximate NX protection

On node 0totalpages: 128976

  DMA zone:4096 pages, LIFO batch:0

  Normal zone:124880 pages, LIFO batch:31

DMI 2.3 present.

省略输出

Bluetooth: HIDP(Human Interface Emulation) ver 1.1

eth0: no IPv6routers present

Installing knfsd(copyright (C) 1996 okir@monad.swb.de).

NFSD: Using/var/lib/nfs/v4recovery as the NFSv4 state recovery directory

NFSD: starting90-second grace period

[root@new55 ~]# dmesg

[root@new55 ~]# less /var/log/dmesg

Linux version2.6.18-194.el5 (mockbuild@x86-007.build.bos.redhat.com) (gcc version 4.1.220080704 (Red Hat 4.1.2-48)) #1 SMP Tue Mar 16 21:52:43 EDT 2010

BIOS-providedphysical RAM map:

 BIOS-e820:0000000000010000 - 000000000009fc00 (usable)

 BIOS-e820:000000000009fc00 - 00000000000a0000 (reserved)

 BIOS-e820:00000000000e0000 - 0000000000100000 (reserved)

 BIOS-e820:0000000000100000 - 000000001f7d0000 (usable)

 BIOS-e820:000000001f7d0000 - 000000001f7efc00 (reserved)

 BIOS-e820:000000001f7efc00 - 000000001f7fb000 (ACPI NVS)

 BIOS-e820:000000001f7fb000 - 000000001f800000 (reserved)

 BIOS-e820:00000000e0000000 - 00000000f0000000 (reserved)

 BIOS-e820:00000000fec00000 - 00000000fec02000 (reserved)

 BIOS-e820:00000000fed20000 - 00000000fed9b000 (reserved)

 BIOS-e820:00000000feda0000 - 00000000fedc0000 (reserved)

 BIOS-e820:00000000ffb00000 - 00000000ffc00000 (reserved)

 BIOS-e820:00000000fff00000 - 0000000100000000 (reserved)

0MB HIGHMEMavailable.

503MB LOWMEMavailable.

Memory for crashkernel (0x0 to 0x0) notwithin permissible range

disabling kdump

Using x86 segmentlimits to approximate NX protection

On node 0totalpages: 128976

  DMA zone:4096 pages, LIFO batch:0

  Normal zone:124880 pages, LIFO batch:31

DMI 2.3 present.

Using APIC driverdefault

ACPI: RSDP (v000HP                                   ) @ 0x000fe270

ACPI: RSDT (v001HP     30C4     0x31100620HP   0x00000001) @ 0x1f7efc84

ACPI: FADT (v002HP     30C4     0x00000002HP   0x00000001) @ 0x1f7efc00

ACPI: MADT (v001HP     30C4     0x00000001HP   0x00000001) @ 0x1f7efcb8

ACPI: MCFG (v001HP     30C4     0x00000001HP   0x00000001) @ 0x1f7efd14

ACPI: SSDT (v001HP       HPQPpc 0x00001001 MSFT 0x0100000e) @0x1f7f6698

ACPI: DSDT (v001HP       DAU00  0x00010000 MSFT 0x0100000e)@ 0x00000000

ACPI: PM-Timer IOPort: 0x1008

ACPI: Local APICaddress 0xfec01000

ACPI: LAPIC(acpi_id[0x01] lapic_id[0x00] enabled)

Processor #0 6:13APIC version 20

ACPI: LAPIC_NMI(acpi_id[0x01] high edge lint[0x1])

ACPI: IOAPIC(id[0x01] address[0xfec00000] gsi_base[0])

IOAPIC[0]: apic_id1, version 32, address 0xfec00000, GSI 0-23

[root@new55 ~]#

 

<think>我们正在讨论dmesg和串口日志输出的关系。根据引用内容,dmesg用于查看内核环形缓冲区中的信息,而串口输出是一种硬件级别的日志传输方式。下面我将逐步解释它们之间的关系。 1. **dmesg命令的作用** dmesg用于访问内核环形缓冲区(ring buffer)中存储的日志信息。这些信息包括: - 系统启动时的硬件检测信息(如CPU、内存、USB设备、串口设备等) - 内核模块加载时的调试信息(如驱动程序初始化) - 运行时内核产生的错误警告 引用[1]和[3]明确指出: > "dmesg命令显示linux内核环形缓冲区信息" > "开机信息亦保存在/var/log/dmesg的文件里" 2. **串口日志输出的本质** 串口(Serial Port)是一种物理通信接口,常用于嵌入式系统和服务器调试。通过配置内核参数,可将内核日志实时输出到串口: - 引用[2]提到:通过修改GRUB配置(如`console=ttyS0`)可将内核日志重定向到串口 - 引用[3]说明:串口设备信息可通过dmesg查看(如`dmesg | grep ttyS`) 3. **两者的核心关系** - **相同点**: 两者都承载内核产生的原始日志(包括硬件检测、驱动初始化等)。 - **同点**: | 特性 | dmesg | 串口日志输出 | |---------------|-------------------------------|--------------------------| | **数据来源** | 内核环形缓冲区 | 直接来自内核日志流 | | **输出方式** | 用户态命令读取 | 实时物理串口传输 | | **使用场景** | 系统启动后查看历史日志 | 实时调试(如无显示器环境)| | **持久性** | 缓冲区循环覆盖(需定期保存) | 需外部设备持续记录 | 4. **工作流程示意图** ```mermaid graph LR A[内核日志生成] --> B(内核环形缓冲区) B --> C[dmesg命令读取] B --> D[/dev/ttyS0 串口设备/] D --> E[Windows/物理终端捕获] ``` 5. **典型应用场景对比** - **dmesg**: - 快速检查USB设备识别情况(`dmesg | grep usb`)[^3] - 查看语音卡驱动加载日志[^1] - **串口输出**: - 虚拟机调试(如VMware将串口输出重定向到文件)[^2] - 嵌入式设备故障诊断(通过串口线连接调试机) 6. **配置串口输出的关键步骤** 根据引用[2]: a. 虚拟机添加串口设备并映射到文件 b. Linux中修改GRUB配置: ```bash GRUB_CMDLINE_LINUX="console=ttyS0,115200n8" # 将内核日志定向到串口0 ``` c. 降低printk日志级别阈值(确保所有级别日志输出): ```bash echo 8 > /proc/sys/kernel/printk # 8表示DEBUG级别(最低阈值) ``` --- ### 常见问题解答 **Q: 为什么串口有时没有输出?** - 可能原因1:内核未配置串口控制台(检查`/proc/cmdline`是否包含`console=ttyS0`) - 可能原因2:硬件串口未启用驱动未加载(用`dmesg | grep ttyS`验证)[^3] **Q: dmesg显示的内容和串口输出的内容是否一致?** - 理论上一致(同源),但串口可能因波特率配置错误导致乱码,而dmesg直接从内存读取无此问题。 --- ### 进阶应用 **持久化保存dmesg日志** ```bash # 开机时将缓冲区内容保存到文件 dmesg -s 131072 > /var/log/dmesg # -s指定缓冲区大小(128KB) ``` **串口日志与网络转发** 通过`socat`工具将串口数据转发到网络端口: ```bash socat -d -d /dev/ttyS0,rawer TCP-LISTEN:8888 # 可通过TCP远程访问串口日志 ``` --- ### 相关问题 1. 如何配置Linux内核将所有printk日志实时输出到串口? 2. dmesg环形缓冲区的大小如何调整? 3. 在无串口的云服务器上如何实现类似串口日志的实时调试功能? 4. 为什么某些硬件设备的日志只在dmesg中出现而会出现在系统日志文件(如/var/log/syslog)中? 5. Android系统中的`logcat`与`dmesg`有何区别?[^1]</think>### dmesg 与串口日志输出的关系解析 dmesg 和串口日志输出都是获取 Linux 内核日志的重要方式,它们之间的关系如下: #### 1. **数据来源相同** - **内核环形缓冲区**:两者都从同一个源头获取数据——Linux 内核环形缓冲区(ring buffer)[^1][^3]。 - **日志生成时机**:当内核启动、硬件设备初始化(如 USB/串口驱动加载)内核模块运行时,日志会实时写入该缓冲区。 #### 2. **输出方式差异** | **特性** | **dmesg 命令** | **串口日志输出** | |----------------|-----------------------------------|-------------------------------| | **访问方式** | 用户空间命令读取缓冲区内容 | 内核直接将日志输出到物理串口 | | **实时性** | 需手动执行命令查看 | 实时输出(无延迟) | | **依赖条件** | 需系统正常运行 | 需预先配置串口控制台(如 `console=ttyS0`)[^2] | | **使用场景** | 系统运行时调试 | 系统崩溃/启动失败的调试 | #### 3. **工作流程对比** ```mermaid graph LR A[内核事件] --> B(环形缓冲区) B --> C[dmesg命令读取] B --> D[串口控制台输出] C --> E[终端显示/文件保存] D --> F[物理串口设备] F --> G[Windows/外部设备捕获][^2] ``` #### 4. **关键配置点** 1. **启用串口输出**(以 Ubuntu 为例): ```bash # 修改 GRUB 配置 sudo nano /etc/default/grub # 添加串口控制台参数 GRUB_CMDLINE_LINUX="console=ttyS0,115200n8" sudo update-grub ``` 2. **降低日志级别**(确保所有日志输出): ```bash # 允许所有级别的内核日志 echo 8 > /proc/sys/kernel/printk ``` 3. **虚拟机配置**(VMware): - 添加 Serial Port → 输出到文件[^2] - 启动后通过串口监控软件捕获日志 #### 5. **典型应用场景** - **dmesg 更适合**: - 快速检查硬件识别(如 `dmesg | grep usb`)[^3] - 查看驱动加载状态(如语音卡、信令卡)[^1] - 运行时内核错误分析 - **串口输出更适合**: - 系统启动失败时的调试(屏幕无输出) - 无图形界面服务器的故障诊断 - 嵌入式设备开发(如 ARM 开发板) > **关键区别**:dmesg 是**被动查询工具**,而串口日志是内核的**主动输出通道**。串口输出在系统崩溃时仍可能工作(只要串口驱动已加载),而 dmesg 需要系统基本功能正常[^2]。 #### 6. **日志内容对比** | **日志类型** | dmesg 是否包含 | 串口是否包含 | |--------------------|---------------|-------------| | 内核初始化过程 | ✓ | ✓ | | 硬件检测(CPU/内存)| ✓ | ✓ | | USB 设备识别 | ✓ | ✓ [^3] | | 内核模块加载信息 | ✓ | ✓ | | 系统崩溃前的最后日志| ✘(可能丢失) | ✓(关键优势)| --- ### 相关问题 1. 如何将 Android 设备的 `dmesg` 日志导出到电脑? 2. 系统崩溃时,除了串口日志还有哪些调试手段? 3. 如何配置 `rsyslog` 将内核日志自动保存到文件? 4. 为什么有时 `dmesg` 看到 USB 设备插拔记录?如何解决? 5. 在云服务器环境中如何实现类似串口日志的调试功能?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值