Mac OS X下(Ubuntu虚拟机)编译Linux内核
2017-07-07 11:16
218 查看
用了十天时间看完《Linux内核设计与实现》,想在Mac上编译Linux内核实践下。编译过程遇到了不少问题,根本原因还是对内核的编译流程理解不够。
安装时我给虚拟机划分了50G磁盘空间,其中30G给/,1G给swap,2G给/boot,剩下给/home。分的不太好,从编译安装完成后磁盘的使用情况就能看出来:
/boot是引导分区,放操作系统内核和Bootloader的(也就是下面会遇到的grub),1G足矣;/分区第一次分了10G不够用,用了这么多空间,是因为我把内核源码和各种modules都放在/usr/src下的缘故吗?
(2) 查看分区
可以通过命令行查看分区、分区、格式化磁盘等。
可以看到物理分区已经OK,之后就是等着Ubuntu启动,然后挂载到相应的Linux文件系统(或者叫Linux目录结构)上了。
编译模块的配置:是否开启内核抢占、是否启用SMP、有些功能块是否生成module形式
简化的内核配置工具:图形化的、字符型的、默认方式的
输出重定向以减少编译垃圾信息
多核处理器上衍生多个编译作业提高效率
书上讲得很细致,但是实践起来,How to Compile Your Own Linux Kernel 是我目前看过得介绍得最好最实用的文章。
Ubuntu分区太小,20G虚拟磁盘分出了10G给/,Linux编译中止,提示磁盘剩余空间不足
虚拟机内存太小,启动Linux中止,提示”Kernel Panic - not syncing : out of memory and no killable processes”
参考资料[2]写得太全面了,磁盘的基础知识读一读有个印象就好,重点还是理解“挂载-文件系统-目录“的概念。
2. 启动流程
参考了很多资料,画了启动的前三个阶段:BIOS、Grub、根文件系统挂载,这几个阶段也都是在BIOS的带领下完成的,之后就会将控制权切给内核,开始第一个Linux进程了。如果没有理解错的话,根文件系统在第三步经过了从内存中的虚拟根文件系统(VFS)到磁盘中的真实根文件系统切换这一流程的。Linux–根文件系统的挂载过程分析 里解释了“为什么不直接把真实的文件系统配置为根文件系统“,看起来就是时机未满,磁盘驱动未加载的原因。Linux如何挂载根文件系统 里对挂载过程中的虚拟根文件系统initrd执行过程描述得更详细。
3. grub
/boot下面放了已经存在的各种版本的内核映像,每个版本含有一个initrd.img和一个vmlinuz,另外还有一个grub文件夹,一般是不要直接编辑/boot/grub/grub.cfg的。
这篇文章详细介绍了安装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)
为了巩固一遍内核编译,参考这篇文章(和我编译的内核版本最接近)添加自定义系统调用,成功!
流程整理
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)
为了巩固一遍内核编译,参考这篇文章(和我编译的内核版本最接近)添加自定义系统调用,成功!
相关文章推荐
- 如何解决虚拟机Mac OS X 不支持二进制编译问题()
- Mac 远程访问Parallels Desktop 虚拟机里面的 Ubuntu Server OS
- Mac 远程访问Parallels Desktop 虚拟机里面的 Ubuntu Server OS
- 2.4基于虚拟机的Linux内核编译
- [转载]笔记本上虚拟机安装Mac OS X
- Mac OS X下CUDA Host端的编译选项设定
- install wireless driver under ubuntu os on mac
- aumenu在XCode(MacOS/IPhone)下的编译
- 【翻译】Ubuntu中编译Linux内核的简略方法
- linux内核编译并在ubuntu下运行
- [转载]笔记本上虚拟机安装Mac OS X
- VMware 虚拟机安装 Mac OS X
- 虚拟机Ubuntu创建交叉编译环境
- ubuntu 10.10 + VirtualBox 4 安装Mac OS X 10.6 雪豹操作系统图文详解
- ubuntu10.04 虚拟机上最简单的编译mplayer
- [转载]笔记本上虚拟机安装Mac OS X
- 在MacOS X下编译emacs23
- Ubuntu下编译android的linux内核
- Apple Mac OS 下编译Emacs 23
- VMware 虚拟机安装 Mac OS X