您的位置:首页 > 运维架构 > Linux

Mac OS X下(Ubuntu虚拟机)编译Linux内核

2017-07-07 11:16 218 查看
用了十天时间看完《Linux内核设计与实现》,想在Mac上编译Linux内核实践下。编译过程遇到了不少问题,根本原因还是对内核的编译流程理解不够。

流程整理

1. 安装VMware和Ubuntu

(1) 我的配置: Mac OS X 10.10.5,VMware Fusion 8,Ubuntu 16.04.2

安装时我给虚拟机划分了50G磁盘空间,其中30G给/,1G给swap,2G给/boot,剩下给/home。分的不太好,从编译安装完成后磁盘的使用情况就能看出来:



/boot是引导分区,放操作系统内核和Bootloader的(也就是下面会遇到的grub),1G足矣;/分区第一次分了10G不够用,用了这么多空间,是因为我把内核源码和各种modules都放在/usr/src下的缘故吗?

(2) 查看分区

可以通过命令行查看分区、分区、格式化磁盘等。



可以看到物理分区已经OK,之后就是等着Ubuntu启动,然后挂载到相应的Linux文件系统(或者叫Linux目录结构)上了。

2. Linux内核源码的下载、配置、编译、安装

《Linux内核设计与实现》第二章详细介绍了make过程:

编译模块的配置:是否开启内核抢占、是否启用SMP、有些功能块是否生成module形式

简化的内核配置工具:图形化的、字符型的、默认方式的

输出重定向以减少编译垃圾信息

多核处理器上衍生多个编译作业提高效率

书上讲得很细致,但是实践起来,How to Compile Your Own Linux Kernel 是我目前看过得介绍得最好最实用的文章。

//(1)下载源码并解压、下载可能用到的库
apt-get update
apt-get install linux-source
apt-get install build-essential gcc libncurses5-dev libssl-dev

cd /usr/src
tar xjvf linux-source-4.4.0.tar.bz2

//(2)编译配置(图形化配置工具)
make nconfig

//(3)编译
make

//(4)安装
make modules_install
make install

//(5)启动引导grub配置(有了这个,在启动引导程序grub中就可以切换到任意已经安装的内核版本了)
nano /etc/default/grub  //注释了两处代码,使启动时首先进行内核选择
grub-mkconfig -o /boot/grub/grub.cfg //根据上一行的修改自动生成配置文件

reboot


遇到过的问题

**Ubuntu没有分区(?)**Linux无法启动,卡在initramfs,提示“Alert! UUID/xxxxxxxxxxxx does not exist. Dropping to a shell”

Ubuntu分区太小,20G虚拟磁盘分出了10G给/,Linux编译中止,提示磁盘剩余空间不足

虚拟机内存太小,启动Linux中止,提示”Kernel Panic - not syncing : out of memory and no killable processes”

Linux内核编译和启动过程中遇到的知识

1. 磁盘分区、文件系统

参考资料[2]写得太全面了,磁盘的基础知识读一读有个印象就好,重点还是理解“挂载-文件系统-目录“的概念。

2. 启动流程

参考了很多资料,画了启动的前三个阶段:BIOS、Grub、根文件系统挂载,这几个阶段也都是在BIOS的带领下完成的,之后就会将控制权切给内核,开始第一个Linux进程了。如果没有理解错的话,根文件系统在第三步经过了从内存中的虚拟根文件系统(VFS)到磁盘中的真实根文件系统切换这一流程的。Linux–根文件系统的挂载过程分析 里解释了“为什么不直接把真实的文件系统配置为根文件系统“,看起来就是时机未满,磁盘驱动未加载的原因。Linux如何挂载根文件系统 里对挂载过程中的虚拟根文件系统initrd执行过程描述得更详细。



3. grub

/boot下面放了已经存在的各种版本的内核映像,每个版本含有一个initrd.img和一个vmlinuz,另外还有一个grub文件夹,一般是不要直接编辑/boot/grub/grub.cfg的。

参考资料

[1]. 手把手交大家在mac上用VMWare虚拟机装Linux-Ubuntu–及Ubuntu安装Vmware Tools

这篇文章详细介绍了安装Ubuntu流程,也解决了VMware屏幕未全屏的问题,但VMware Fusion创建虚拟机默认20G磁盘空间,编译Linux内核不够用,所以要在VMware Fusion -> Virtual Machine -> Settings -> Hard Disk中修改下Disk size的大小

[2]. 磁盘、分区及Linux文件系统

创建虚拟机跑Ubuntu时,是建议手动分区的。看了这篇图文并茂的文章,理解了磁盘分区的意义、Linux文件系统如何对一个文件分成多个数据块存储并索引、物理分区又是如何与逻辑树结构挂载的。

[3]. 《鸟哥的Linux私房菜》第七章:Linux磁碟与档案系统管理

《Linux内核设计与实现》第十三章虚拟文件系统(VFS)介绍的很详细,现阶段有些难理解,不如鸟哥这章介绍的简单、实用。

[4]. 《深入理解Linux内核》附录一:系统启动

了解系统启动的流程对于理解编译Linux内核过程遇到的命令、文件、配置项很关键。经典的书,介绍的也很学院派,细致到连BIOS在ROM中的物理地址、内核映像中的的函数setup()偏移量、引导程序(grub)字节数大小都会给出来。

[5]. linux添加系统调用总结(内核版本4.4.4)

为了巩固一遍内核编译,参考这篇文章(和我编译的内核版本最接近)添加自定义系统调用,成功!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: