[Unix HW] Add messages to kernel and show when booting

這是 Unix 作業2、需要加訊息至kernel並在開機時顯示自己的學號。

我使用的環境是 Ubuntu 64-bit、依照以下步驟就可以完成了。

首先先介紹 Compile Kernel 的部分

  • 首先必須至kernel.org下載kernel(個人建議選擇比自己所安裝版本新的kernel)
    kernel.org
  • 下載後解壓縮、並放至/usr/src底下(個人習慣,和其他kernel一併放在一起)
    kernel folder
  • 再來需要設定檔、所以需要 make config、我總共試了三種、分別為 make config, make menuconfig, 和 make oldconfig

    • make config : 完全不推這個選項、除非需要仔細的去設定這個 kernel、否則他將會列出所有設定檔裡的選項、我只試過一次、按了整整兩分鐘的 Enter。

    • make menuconfig : 會有像 BIOS 的畫面能夠選擇設定檔來操作、其中有可能會遇到需要裝 ncurses
      ncurses

      安裝指令如下:
      install ncurses

      安裝後即可叫出 menuconfig
      menuconfig

    • make oldconfig : 既有的設定會直接讀取舊有的、如果下載較新版本的 kernel 通常會有新的設定、再選取預設的選項即可。
      oldconfig

  • 做好 config 後就可以開始 compile kernel 了、我 compile 的方式會透過 kernel-package、所以必須安裝、否則會跳出錯誤訊息 (如下圖)
    kernel-package

    裝好後就可以 compile 了、指令如下 :

1
2
make-kpkg clean # 表示將上一次 compile 的東西給 clean 掉
fakeroot make-kpkg --initrd kernel_image kernel_headers

第二行就是 compile 的指令、他表示分別會做出 kernel_image 及 kernel_headers 兩個 [initrd][initrdwiki]、此外、可以加入 -j 2 參數、這代表將以 雙核心 來 compile。開始 compile 後就可以先去做自己的事了、我在第一次 compile 的時候沒有加 -j 大約跑了三至四個小時、後來加了 -j 2 減少了一半的時間 !
(Compile 過程圖)
comiple progress
comiple progress

  • 經過漫長等待後、Compile成功的話能夠在/usr/src底下看到生成的initrd
    deb files
  • 再來就是安裝剛剛compile好的kernel、指令如下 :
1
2
sudo dpkg –i linux-image-3.13.8_3.13.8-10.00.Custom_amd64.deb
sudo dpkg -i linux-headers-3.13.8_3.13.8-10.00.Custom_ amd64.deb

安裝完成後重新開機時若進入grub就可以看到剛剛所安裝的kernel。
grub

  • 選擇進入所安裝的 kernel 後由於開機畫面跑太快所以我透過 grep 指令來 search string

    指令為 : grep "991524" /var/log/dmesg
    dmesg 為開機時所跑的所有訊息、亦可使用 dmesg | less 來一一檢視

    messages

以上就是整個 Compile 的過程、再來有兩個重要的部分、一個是 要印訊息加在哪 另一個是 如果無法進到自己新裝的 kernel 怎麼辦

  1. 要印訊息加在哪

    查了很久的資料後、找到kernel在跑時有個主要的檔案、在init/main.c、將要顯示的訊息加在這個檔案的 start_kernel function 裡、我個人是加在 Kernel command line 之後。

    init/main.c

    如果加入後並且 Compile 成功卻沒有顯示訊息的話、可能是 printk 的 log level 的問題、修改他就可以顯示了。

1
2
3
4
5
cat /proc/sys/kernel/printk
4 4 1 7
echo 5 > /proc/sys/kernel/printk
cat /proc/sys/kernel/printk
5 4 1 7
  1. 如果無法進到自己新裝的 kernel 怎麼辦
    這是因為 default 的 kernel 還是原先所裝的那個、必須進入 grub 選擇新裝的才可以。

    所以必須
    vim grub

    將顯示如下圖所示的檔案
    grub

    GRUB_HIDDEN_TIMEOUT 改為 10 (代表開機時倒數秒數)、還有將 GRUB_CMDLINE_LINUX_DEFAULT 改為 false。然後重新開機時、在倒數10秒時按住右邊shift 就可以進入 grub 了。

參考資料:

如果有錯誤的地方還請留言指教。

[initrdwiki]: http://zh.wikipedia.org/wiki/Initrd ‘Wikipidea of Initrd’