今天看了一本书, 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