# 練習 29:內核:內核消息,`dmesg`
> 原文:[Exercise 29. Kernel: kernel messages, dmesg](https://archive.fo/aZwFG)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
那么,如果你到達了這里,現在是談談[內核](http://en.wikipedia.org/wiki/Kernel_%28computing%29)的時候了。我們將使用維基百科的操作系統內核定義,開始這個討論:
> 在計算機中,內核(來自德語 Kern)是大多數計算機操作系統的主要組成部分;它是應用程序和硬件級別上進行的實際數據處理之間的橋梁。內核的職責包括管理系統的資源(硬件和軟件組件之間的通信)。通常,作為操作系統的基本組件,內核可以為資源(特別是處理器和 I/O 設備)提供最底層的抽象,應用軟件必須控制它來執行其功能。它通常通過進程間通信機制和系統調用,使這些設施可用于應用程序進程。
這是維基百科告訴我們的,Linux 內核的具體內容:
> Linux 內核是 Linux 系列類 Unix 操作系統使用的操作系統內核。它是自由和開源軟件最突出的例子之一。它支持真正的搶占式多任務(在用戶模式和內核模式下),虛擬內存,共享庫,按需加載,共享的寫時復制(COW)可執行文件,內存管理,互聯網協議組和線程。
現在是訪問相應的維基百科文章的好時機,并花費一些時間瘋狂點擊所有可怕的術語,它們描述 Linux 內核的技術特性。這樣做之后,讓我們談談更多的單調的主題,這是內核告訴我們的一種方式。例如,如果 USB 記憶棒連接到計算機,或者網絡鏈接斷開或掛載了文件系統,則會發生這種情況。為了能夠告訴你所有這些東西,內核使用一種稱為顯示消息 或驅動消息的機制,其名稱縮寫為`dmesg`。
該機制由固定大小的緩沖區表示,內核向它寫入消息。在 Debian Linux 上,系統日志守護進程啟動后,從緩沖區發布的信息也會被復制到`/var/log/dmesg`。這樣做是為了保留這些消息,否則將被新的消息覆蓋。
`dmesg`也是工具的名稱,它允許你查看當前在內核緩沖區中的那些消息,并更改此緩沖區大小。
讓我總結一下`dmesg`相關的文件和程序:
+ `dmesg` - 打印或控制內核環緩沖區
+ `/var/log/dmseg` - Debian 發行版中的日志文件,僅包含系統引導期間的`dmesg`消息副本,而不包含時間戳。
+ `/var/log/kern.log` - Debian 發行版中的日志文件,包含所有`dmesg`消息的副本,包括時間戳請注意,`rsyslog` 日志守護進程啟動后,這個時間戳開始變化,這意味著`rsyslog`啟動前,所有引導時的消息將具有相同的時間戳。此文件本身包含`/var/log/dmseg`。
+ `/var/log/messages` - Debian 發行版中的日志文件,記錄所有非調試和非關鍵消息。它本身包含`/var/log/dmesg`。
+ `/var/log/syslog` - Debian 發行版中的日志文件,記錄了所有信息,但權限相關的信息除外。它包含`/var/log/messages`和`/var/log/kern.log`中的所有消息。
## 這樣做
```
1: date
2: sudo umount /tmp ; sudo mount /tmp
3: sudo tail -f /var/log/dmesg /var/log/messages /var/log/syslog /var/log/kern.log
```
## 你會看到什么
```
user1@vm1:~$ date
Tue Jul 24 06:55:33 EDT 2012
user1@vm1:~$ sudo umount /tmp ; sudo mount /tmp
user1@vm1:~$ dmesg | tail
[ 7.166240] tun: Universal TUN/TAP device driver, 1.6
[ 7.166242] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
[ 7.432019] ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 7.435270] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
[ 7.435927] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 17.472049] tap0: no IPv6 routers present
[ 17.592044] eth0: no IPv6 routers present
[ 217.497357] kjournald starting. Commit interval 5 seconds
[ 217.497561] EXT3 FS on sda8, internal journal
[ 217.497564] EXT3-fs: mounted filesystem with ordered data mode.
user1@vm1:~$ sudo tail /var/log/dmesg /var/log/messages /var/log/syslog /var/log/kern.log
==> /var/log/dmesg <==
[ 6.762569] EXT3 FS on sda5, internal journal
[ 6.762572] EXT3-fs: mounted filesystem with ordered data mode.
[ 6.767237] kjournald starting. Commit interval 5 seconds
[ 6.767407] EXT3 FS on sda6, internal journal
[ 6.767410] EXT3-fs: mounted filesystem with ordered data mode.
[ 7.166240] tun: Universal TUN/TAP device driver, 1.6
[ 7.166242] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
[ 7.432019] ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 7.435270] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
[ 7.435927] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
==> /var/log/messages <==
Jul 24 06:52:07 vm1 kernel: [ 6.767407] EXT3 FS on sda6, internal journal
Jul 24 06:52:07 vm1 kernel: [ 6.767410] EXT3-fs: mounted filesystem with ordered data mode.
Jul 24 06:52:07 vm1 kernel: [ 7.166240] tun: Universal TUN/TAP device driver, 1.6
Jul 24 06:52:07 vm1 kernel: [ 7.166242] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
Jul 24 06:52:07 vm1 kernel: [ 7.432019] ADDRCONF(NETDEV_UP): eth0: link is not ready
Jul 24 06:52:07 vm1 kernel: [ 7.435270] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
Jul 24 06:52:07 vm1 kernel: [ 7.435927] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
Jul 24 06:55:36 vm1 kernel: [ 217.497357] kjournald starting. Commit interval 5 seconds
Jul 24 06:55:36 vm1 kernel: [ 217.497561] EXT3 FS on sda8, internal journal
Jul 24 06:55:36 vm1 kernel: [ 217.497564] EXT3-fs: mounted filesystem with ordered data mode.
==> /var/log/syslog <==
Jul 24 06:52:08 vm1 acpid: 1 rule loaded
Jul 24 06:52:08 vm1 acpid: waiting for events: event logging is off
Jul 24 06:52:08 vm1 /usr/sbin/cron[882]: (CRON) INFO (pidfile fd = 3)
Jul 24 06:52:08 vm1 /usr/sbin/cron[883]: (CRON) STARTUP (fork ok)
Jul 24 06:52:08 vm1 /usr/sbin/cron[883]: (CRON) INFO (Running @reboot jobs)
Jul 24 06:52:16 vm1 kernel: [ 17.472049] tap0: no IPv6 routers present
Jul 24 06:52:16 vm1 kernel: [ 17.592044] eth0: no IPv6 routers present
Jul 24 06:55:36 vm1 kernel: [ 217.497357] kjournald starting. Commit interval 5 seconds
Jul 24 06:55:36 vm1 kernel: [ 217.497561] EXT3 FS on sda8, internal journal
Jul 24 06:55:36 vm1 kernel: [ 217.497564] EXT3-fs: mounted filesystem with ordered data mode.
==> /var/log/kern.log <==
Jul 24 06:52:07 vm1 kernel: [ 7.166240] tun: Universal TUN/TAP device driver, 1.6
Jul 24 06:52:07 vm1 kernel: [ 7.166242] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
Jul 24 06:52:07 vm1 kernel: [ 7.432019] ADDRCONF(NETDEV_UP): eth0: link is not ready
Jul 24 06:52:07 vm1 kernel: [ 7.435270] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
Jul 24 06:52:07 vm1 kernel: [ 7.435927] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
Jul 24 06:52:16 vm1 kernel: [ 17.472049] tap0: no IPv6 routers present
Jul 24 06:52:16 vm1 kernel: [ 17.592044] eth0: no IPv6 routers present
Jul 24 06:55:36 vm1 kernel: [ 217.497357] kjournald starting. Commit interval 5 seconds
Jul 24 06:55:36 vm1 kernel: [ 217.497561] EXT3 FS on sda8, internal journal
Jul 24 06:55:36 vm1 kernel: [ 217.497564] EXT3-fs: mounted filesystem with ordered data mode.
```
## 解釋
1. 打印出當前日期和時間。
1. 從內核消息緩沖區打印最后 10 條消息。
1. 從`/var/log/dmesg`, `/var/log/messages`, `/var/log/syslog`和`/var/log/kern.log`打印最后 10 條消息。
## 附加題
這就完了,沒有附加題,哇哦!
- 笨辦法學 Linux 中文版
- 練習 0:起步
- 練習 1:文本編輯器,vim
- 練習 2:文本瀏覽器,少即是多
- 練習 3:Bash:Shell、.profile、.bashrc、.bash_history
- 練習 4:Bash:處理文件,pwd,ls,cp,mv,rm,touch
- 練習 5:Bash:環境變量,env,set,export
- 練習 6:Bash:語言設置,LANG,locale,dpkg-reconfigure locales
- 練習 7:Bash:重定向,stdin,stdout,stderr,<,>,>>,|,tee,pv
- 練習 8:更多的重定向和過濾:head,tail,awk,grep,sed
- 練習 9:Bash:任務控制,jobs,fg
- 練習 10:Bash:程序退出代碼(返回狀態)
- 練習 11:總結
- 練習 12:文檔:man,info
- 練習 13:文檔:Google
- 練習 14:包管理:Debian 包管理工具aptitude
- 練習 15:系統啟動:運行級別,/etc/init.d,rcconf,update-rc.d
- 練習 16:處理進程,ps,kill
- 練習 17:任務調度:cron,at
- 練習 18:日志:/var/log,rsyslog,logger
- 練習 19:文件系統:掛載,mount,/etc/fstab
- 練習 20:文件系統:修改和創建文件系統,tune2fs,mkfs
- 練習 21:文件系統:修改根目錄,chroot
- 練習 22:文件系統:移動數據,tar,dd
- 練習 23:文件系統:權限,chown,chmod,umask
- 練習 24:接口配置,ifconfig,netstat,iproute2,ss,route
- 練習 25:網絡:配置文件,/etc/network/interfaces
- 練習 26:網絡:封包過濾配置,iptables
- 練習 27:安全 Shell,ssh,sshd,scp
- 練習 28:性能:獲取性能情況,uptime,free,top
- 練習 29:內核:內核消息,dmesg
- 練習 30:打磨、洗練、重復:總復習
- 下一步做什么
- Debian 手動安裝