linux内核 最小,制作最小linux内核(1)

深入理解 Linux 2.6 的 initramfs 機制 (上) 一文提到了制作简易initramfs的过程;而另一篇文章使用udevadm(modinfo)查找linux下设备对应的驱动 则提到了匹配设备驱动的方法,本文对上面两篇文章做个总结----定制一个最小系统。环境为:vmware10+ubuntu14.04(kernel 3.13.0)+Scsi虚拟磁盘。目标是用这个定制的内核引导系统,并往屏幕上输出Hello initramfs。

1.首先需要定制的原料:linux内核源码kernel 3.13.0和ubuntu做的patch补丁:linux-lts-trusty_3.13.0-91.138~precise1.diff.gz。应用了补丁以后,就开始定制之旅。既然写了是定制,那必然需要移除不必要的内核模块。因此,我们第一步就是运行make allnoconfig创建一个最小配置的内核,再这个基础上一步步完善OS。

eugen@ubuntu:~$ cd Desktop/linux-3.13/

eugen@ubuntu:~/Desktop/linux-3.13$ make distclean

...

CLEAN .config .config.old .version include/generated/uapi/linux/version.h Module.symvers

eugen@ubuntu:~/Desktop/linux-3.13$ make allnoconfig

...

scripts/kconfig/conf --allnoconfig Kconfig

#

# configuration written to .config

#执行了上述命令后,内核除了选中必选项外,其余都不选,够干净的了~

2.现在开始根据正在运行的OS来定制内核,这步需要配置处理器型号,还需要配置PCI总线,毕竟虚拟机里的设备还是要挂载在PCI总线上的

2.1.确定CPU型号:

eugen@ubuntu:~/Desktop/linux-3.13$ cat /proc/cpuinfo |grep "model name"

model name: Intel(R) Celeron(R) CPU E3500 @ 2.70GHz #赛扬处理器 见笑了2.2配置内核支持的CPU型号,运行make menuconfig,依次选择"Processor type and features"-"Processor family",我的CPU是赛扬,只能选"Pentium-4/Celeron(P4-base)"项,大家按自己CPU的型号,选不同的选项。如果没有与实际型号吻合的,可以选与它接近的一项:

2.1.1

0818b9ca8b590ca3270a3433284dd417.png

2.1.2

0818b9ca8b590ca3270a3433284dd417.png

2.1.3

0818b9ca8b590ca3270a3433284dd417.png

由于我的虚拟机被配置为单核单处理器,因此内核不需要支持SMP

2.2开始配置设备相关选项:

2.2.1.首先要启用内核动态加载/卸载模块的特性,依次勾选"Enable loadable module support"-"Module unloading":

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

2.3.开始配置磁盘驱动相关,这是最复杂的一步。定制错了后,OS引导后会报panic

2.3.1.首先确定磁盘驱动器信息,这需要用到/sys文件系统/udevadm工具和modinfo工具:

eugen@ubuntu:~$ ls /sys/class/block/

sda2/ sr1/

sda/ sda5/

sda1/ sr0/ #系统中只有sda一块磁盘

eugen@ubuntu:~$ udevadm info -a -p /sys/class/block/sda

looking at device '/devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0/block/sda':

KERNEL=="sda"

SUBSYSTEM=="block"

...

looking at parent device '/devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0':

KERNELS=="32:0:0:0"

SUBSYSTEMS=="scsi"

DRIVERS=="sd"

...

looking at parent device '/devices/pci0000:00/0000:00:10.0/host32/target32:0:0':

KERNELS=="target32:0:0"

SUBSYSTEMS=="scsi"

DRIVERS==""

looking at parent device '/devices/pci0000:00/0000:00:10.0/host32':

KERNELS=="host32"

SUBSYSTEMS=="scsi"

DRIVERS==""

looking at parent device '/devices/pci0000:00/0000:00:10.0':

KERNELS=="0000:00:10.0"

SUBSYSTEMS=="pci"

DRIVERS=="mptspi" #scsi磁盘驱动器用的模块是mptspi

...

looking at parent device '/devices/pci0000:00':

KERNELS=="pci0000:00" #scsi磁盘挂载在PCI总线上

SUBSYSTEMS==""

DRIVERS==""根据以上信息,定制这个最小系统需要PCI/mptspi/scsi等驱动,这就需要modinfo来查看相应驱动信息:

eugen@ubuntu:~$ lsmod

Module Size Used by

mptspi 22158 2

mptscsih 38998 1 mptspi

ahci 25579 0

mptbase 95810 2 mptspi,mptscsih

libahci 27082 1 ahci

eugen@ubuntu:~$ modinfo mptbase

filename: /lib/modules/3.13.0-32-generic/kernel/drivers/message/fusion/mptbase.ko

version: 3.04.20

license: GPL

description: Fusion MPT base driver

...

eugen@ubuntu:~$ modinfo mptspi

filename: /lib/modules/3.13.0-32-generic/kernel/drivers/message/fusion/mptspi.ko

version: 3.04.20

license: GPL

description: Fusion MPT SPI Host driver

...

eugen@ubuntu:~$ modinfo ahci

filename: /lib/modules/3.13.0-32-generic/kernel/drivers/ata/ahci.ko

version: 3.0

license: GPL

description: AHCI SATA low-level driver

...2.3.2.配置PCI总线驱动,依次选"Bus Option"-"Pci support":

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

2.3.3.前面看到我的磁盘是Scsi类型,因此需要配置Scsi,依次选"Device Drivers"-"Scsi device support"--"Scsi device support","Scsi disk support"

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

2.3.4.Scsi磁盘需要Sata控制器,这一步比较关键,要从不同厂商的控制器驱动中挑选出合适的驱动。根据前面udevadm的输出我的虚拟机,使用的是Fusion LSI磁盘驱动:依次选取1)"Device Driver"-"Serial ATA and Parallel ATA driver"-"AHCI SATA support";2)"Device Driver"-"Fusion MPT device support"-"Fusion MPT ScsiHost driver for SPI";

3)"Device Driver"-"Scsi device support"-"SCSI low-level drivers"-"LSI MPT Fusion SAS 2.0 Device Driver"

1).

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

2).

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

3).

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

3.设备驱动配置完毕,需要再配置内核支持的文件系统和ELF文件格式,同时配置内核支持initramfs

3.1.选取"File Systems"-"The Extend 4(ext4) filesystem"

3.2.选取"Executable file formats"-"kernel support for ELF binaries"

3.3.选取"General setup"-"Initial Ram filesystem and Ram disk"

0818b9ca8b590ca3270a3433284dd417.png

完成这些以后,就可以编译内核并拷贝bzImage到/boot目录下:make all -j4&& sudo cp arch/x86/boot/bzImage /boot

4.制作initramfs.

上面的步骤仅仅完成了内核部分的制作,这还是不够的:我们还差个根文件系统。所以现在开始制作根文件系统。

先静态编译init.c用于往屏幕上输出Hello World!

$ cd initramfs

$ cat init.c

#include

int main()

{

printf("Hello World!\n");

sleep(99999);

return 0;

}

$ gcc -static -o init init.c

$ mkdir -p dev

$ sudo mknod dev/console c 5 1

恩,printf输出的目标是屏幕,因此我们还需要一个console设备节点,这个可以用mknod生成。最后是将initramfs/目录下的文件打包:

$find .|cpio -o -H newc|gzip -3 > ../initrd.img

$sudo cp ../initrd.img /boot5.制作启动引导项,这个只要将/boot/grub/grub.cfg中的引导项复制一份照着修改即可:

0818b9ca8b590ca3270a3433284dd417.png

6.重启系统,选择grub中设置的引导项,最终在屏幕上输出"Hello World":

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值