閱讀445 返回首頁    go 技術社區[雲棲]


linux kernel 為什麼需要initrd

今天看了一本書, linux內核技術手冊, 很多東西豁然開朗, 裏麵有一些東西寫點總結給大家看一下

其實我還挺喜歡看手冊之類的書, 因為看完之後, 可以對某個工具的所有功能有個大概的了解, 比如Makefile手冊, vim手冊, gcc手冊. 雖然所有的用法不會都去嚐試一遍, 但是知道了有這個東西, 哪天用得時候就會想起來, 不然的話, 需要解決一個問題的時候, 都不知道有這個東西的存在, 然後就是漫天滿地的找

其實大家關於linux的知識都是遇到什麼問題, 網上看什麼問題, 都比較零碎. 對於老手來說, 零碎的東西一看就知道了, 但是對於初學者來說, 零碎的東西還是比較難以理解.

看完之後, 把多年的一些問題想明白了.

之前一直不是很明白為什麼需要initrd, 原來是為了驅動root fs, 那為了驅動root fs, 把對應的驅動編譯進vmlinux裏麵也沒什麼問題, 根本的問題是在編譯vmlinux的時候, 不知道root fs是什麼驅動, 那不是要把所有的驅動都編譯進vmlinux, 那這樣內核就會變得很大, 但是對於一個確定的硬件, 可以隻把需要的驅動編譯進vmlinux, 就不存在內核太大的問題了.

在一般用qemu來啟動係統的情況下, 如果使用initrd的情況下, 要先編譯bzImage, 然後要編譯modules, 然後modules_install, 然後install生成initrd, 耗時太久, 如果bzImage包含了root fs的驅動的話, 隻需要bzImage, qemu就可以直接啟動了, 省去了很多步驟和時間

比如說我都是這樣啟動vm的

sudo qemu-system-x86_64 -vnc :11 -enable-kvm -drive file=centos7.vhd,if=virtio -serial mon:stdio -smp 1 -m 10240 -redir tcp:1011::22 -s -append "root=/dev/vda1 console=ttyS0" -kernel /home/shidao.ytt/alikernel/7u/arch/x86/boot/bzImage

想啟動什麼內核就啟動什麼內核, 如果每次都要把bzImage都拷進vm disk裏麵的話, 很容易搞錯版本, 因為中間增加了一個信息傳遞的過程

下麵就是如何把rootfs的驅動編譯進內核裏麵

首先查看是什麼文件係統, 這個很容易理解

/dev/root / ext4 rw,relatime,data=ordered 0 0

文件係統是ext4, 所以先把ext4編譯進內核

CONFIG_EXT4_FS=y

然後再看磁盤驅動

cd /sys/block/vda/device/
ls -l
lrwxrwxrwx 1 root root 0 Jun 17 09:42 driver -> ../../../../bus/virtio/drivers/virtio_blk

可以看到驅動是virtio_blk和virtio

CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_PCI=y

為什麼是這2個我就不贅述了, 可以看書裏麵有很詳細的描述

這樣編譯出來的bzImage就可以用qemu直接啟動了, 啟動命令還是和上麵一樣

可能大家會說, 一開始傳遞的就是 -drive file=centos7.vhd,if=virtio, 當然知道是virtio了, 那一開始不知道是virtio, 係統都啟動不了, 怎麼進入係統找驅動, 其實這個問題可以先用發行版的bzImage和initrd先啟動係統來找出驅動是什麼, qemu的參數就是-kernel xxx -initrd xxx

最後更新:2017-06-20 10:01:50

  上一篇:go  MyRocks之memtable切換與刷盤
  下一篇:go  阿裏雲前端周刊 - 第 12 期