01
环境搭建--安装Debian7.3
本系列文章假定读者已对linux有一定的了解,虽然学习linux内核不须要有很深的关于linux的知识,只须要了解以下内容:linux基础知识及基本shell命令;现代操作系统的基本概念;C语言和gcc基本使用。
在开始我们的linux内核学习之前。首先须要搭建我们的工作学习环境,即安装linux系统。关于linux系统建立本身的学问早已复杂到可以成为一个独立的学科了,虽然这不是我们学习的内容,所以我选择最简单的方式:选择一个linux发行版进行安装。
01选择linux发行版
虽然使用最简单的建立工作环境的方式,也花费了我许多时间。
“选择”之所以这样困难,正是由于可供选择的太多了!
linux发行版有成百上千种,每位发行版都有不同的特性,确实让人难于抉择。我先后试装过Gentoo,Arch,debian,fedora。发行版的选择见仁见智,我不敢说那个发行版好,那个不好,每位发行版都有它的拥趸。这儿建议在选择时考虑几个问题:设计哲学linux下载,社区支持和包管理器。
实际上,选择哪种发行版都关系不大,发行版之间的差异基本上都是外围组件,对linux的内核的更改都不会好多。
毕竟我们在学习linux内核,或则开发linux驱动时,通常都是以官方内核(即Linus维护的主线内核)为基准.所以我们搭建好环境后几乎都是要选择一个版本的官方内核来重新编绎以备用的。
现阶段有时间可以多试试不同的发行版,选择自己最喜欢,用上去最顺手的,一旦选择好了,就不要再改了,仍然坚持用它,把它用得滚瓜烂熟.人们会关注你在linux环境中是否得心应手,通常不会关心你懂得用多少种linux发行版。
经过反复的试用,比较,我最终选择了Debian,吸引我的是它的崇尚自由的设计哲学;强悍的社区支持;数目庞大的软件包.相对而言debian还是比较保守的,我用的当前的最新稳定版Debian7.3,在2013年12月发布,它使用的内核还是3.2的(现今官方最新的稳定版内核为3.12.8),不过它配套的工具如GCC,make等linux内核烧写,虽然拿来编绎最新版的内核也早已够用了。
02选择主机环境
网上好多有经验的linux专家级人物都建议直接在自己的工作机或家庭机上安装linux系统,所有日常工作,生活都在linux系统里完成。
不过对于大多数人来说,这太不现实了了。作为桌面系统,当对于windows而言,linux还是有许多不便捷的,即便是近来几年特别火的ubuntu,堪称可以替换windows的发行版,在日常使用的软件方面,还是有不小的差别;
此外,我们在工作中经常还是须要开发windows程序,而家里更不合适了,家里人基本上都用惯了windows,总不能逼迫她们去用不懂的linux系统吧。为此,windows+vmware作为主机环境对于许多人来说,还是第一选择。
另外还须要一台真实笔记本上安装linux系统,由于在vmware里的顾客系统难以访问主机中一些硬件,如pci设备等,当开发这种设备的驱动时必须在真实机器上调试。
我使用的主机环境有两个:windows7+vmware10.0.1环境中安装debian以及x86-64位机器上的windows7+debian双系统。
03安装打算
安装打算工作的第一步其实是下载安装镜像了。Debian的下载地址:
。
由于在公司限制上网,另外也不喜欢老是在线安装软件,就直接下载了一个用于amd64平台的DVD安装镜像.有3G多,常用的软件都有了,须要时直接从DVD里安装就行了,一劳永逸。
3.1vmware
首先使用vmware创建vmware虚拟机,创建时侯,”Guestoperationsystem”选择”Debian764位”这一项。
内核分配512M即可,硬碟20G足够了。vmware虚拟机可以直接将iso文件作为顾客机的光碟使用,因而安装上去十分便捷。
只须要在虚拟设置中的DVD硬盘的联接选项设置为”使用ISO映象文件”,并指定DVD安装ISO镜像的路径即可(前面为了简约起见,将这一操作称为”ISO镜像加入虚拟机”),接出来开机即可用光碟引导(假如虚拟机c盘已安装有系统,则须要在虚拟机的BIOS里设置光碟启动,这跟普通笔记本设置方式是相同的)。
3.2×86-64机器
在真实的机器上,使用U盘安装愈加便捷。我们将在已装windwos7的x86-64机器上用U盘安装,确保你的笔记本能用U盘启动,假若不行只能选择烧录ISO到DVD光碟中用光碟安盘了。其次要确保硬碟有足够的空间,假如没有的话,可以调整windows使用的c盘空间大小(假如不懂设置方式,可以自己百度一下),我的硬碟预留了20G的空间。
接出来制做U盘安装盘,这儿须要用到Universal-USB-Installer工具(我用的是1.9.5.1版本)。步骤如下:
在windows系统下插入U盘;打开Universal-USB-Installer程序;
在step1中选择”tryunlistedlinuxISO”;
step2中选择DVD安装ISO的路径;step3选择要安装的U盘(推荐勾选”Format”);
开始写入U盘,经过几十分钟的等待,U盘安装完毕,可以使用该U盘启动了。
(用U盘启动的方式与显卡的类型相关,可在网上搜索相关的内容)
04安装系统
为了使用便捷,两个系统将采用相同的安装配置,另外我只安装基本的shell环境和必要的工具软件。
使用GUI模式似乎美观,看上去爽,并且对我们这种硬件资源贫乏的穷人来说,运行GUI就是种浪费;其次,与windows不同,linux的XWindow完全运行在用户态,与内核关系不大;总之,在漂亮的桌面环境上放一个终端窗口,总感觉很奇特。
我认为内核和驱动开发者都应当用shell环境,只在须要进行UI相关的测试或编撰UI程序时才使用GUI环境。
言归正传,继续进行我们的系统安装吧。经过前面的步骤,不管是vmware还是x86-64机器,debian安装界面终于是出现了。
选择”advancedoption”-->”expertinstall”步入专家安装模式(现今专家这么多,咱也来假扮一回吧!!)。弹出了一列选项,虽然上面有很多选项都没必要使用的,大部份都可以在系统安装完成后进行设置。
选项列表的后面是安装语言和按键设置,那些可以跳过,就用默认的English就行了,总之在文本模式下也显示不了英文。首先要执行的是”Loadinstallercomponentsfromcd”,这一步会加载ISO(或U盘)中的安装组件,全部选择默认则可。
加载完后,安装选项又多了不少。下一步可以”setupuserandpasswords”,在配置选择中,最好选择“不使用root账号”,root账户权限太大,现今的linux界普遍觉得不用为妙,可以使用sudo工具执行特权操作,创建自己的用户名和密码,按提示操作即可。
接着就要配置c盘分区了,首先要”detectdisks”,让安装程序先检查c盘,之后进行”partitiondisks”,怕安装程序损坏我的c盘,我喜欢选择了”Manual”模式。懒得去设计分区,将剩余空间全部划成了一个”/”分区,分区的属性分别是:”ext4″类型,”primary”,”bootable”选项。完成分成,忽视关于没有交换分区的警告,写入c盘就完了。
如今可以开始”installthebasesystem”。安装过程中有个提示,问你要选择那个内核,我选了”linux-image-3.2.0-4-amd64″,没去研究供选择的两个内核有何不同;接出来又提示initrd的选择,为了节约空间,选择了”targeted:only…..”。
接出来可以”configurethepackagemanager”,由于我不想让系统连网,所以就在”useanetworkmirror”选择了”no”,另外其他的”service”也全部不选,其实这种选项都可以在系统安装好之后进行更改。
最后选择安装软件:”selectandinstallsoftware”,在软件列表中,我只选择了安装”standardsystemutilities”,其他全部不装。
到这儿,实质上的系统早已安装完了,就差引导部份了。有grub和lilo可选,我更喜欢grub,因而选择:”installthegrubbootloader”。debian7.3用的是grub2,功能十分强悍。
在安装过程中grub会手动检查当前c盘中安装的其他的系统,可以放心将grub安装到MBR中,何必害怕你的windows会难以启动。安装完毕linux源代码分析,选择”finishtheinstall”,重启系统吧!
05安装开发工具
如今我们有了一个基本的debian系统,并且还没有gcc等开发工具,难以进行日常工作,须要安装这种工具。
5.1设置安装源
debian的包管理器十分健全,我们如今安装软件就用debian强悍的apt-get命令。并且在使用前要先配置安装源,以告诉apt-get命令去哪儿找我们的软件。
安装软件尽量都从下载的ISO安装,既然下载了这么大的一个ISO镜像,就别浪费了。debian可以设置几种安装源,如CD安装源,网路安装源,本地安装源。
5.1.1设置CD安装源
在vmware中,可以将ISO文件当成光碟使用,实在是太便捷了。因而,在vmware中我们设置以CD作为安装源,实际上在安装系统时,系统的包管理器就早已把DVD安装盘加入安装源了,可以查看/etc/apt/sources.list文件。
假如没有加入linux内核烧写,或则想加入别的CD安装源也十分简单,只需执行以下操作:
5.1.2设置本地安装源
在真实的x86-64机器上,系统未能把安装U盘辨识为光碟,不能将安装U盘作为CD安装源加入。
不过我们可以将ISO文件挂载到某个目录,再将该目录作为本地安装源加入包管理器,步骤如下:
5.2安装开发工具
5.2.1安装VIM,执行命令:sudoapt-getinstallvim
安装系统时安装的是精简版的VIM:vim.tiny,功能不齐全,因而安装完整的VIM,喜欢其他代码编辑工具的网路可以安装其他工具。
VIM安装完后进行配置,在/etc/vim/vimrc文件最后加上以下几行(不包括括弧内容):
5.2.2安装开发工具包:sudoapt-getinstallbuild-essential
build-essential包含了常用的gcc,g++,make等开发工具.
5.2.3安装linux-headers:sudoapt-getinstall
linux-headers-3.2.0-4-amd6
须要编绎系统自带内核相关的模块时,必须安装该内核对应的linux-headers,上面包含内核配置信息,内核头文件等。
5.2.4安装ncurses-dev:sudoapt-getinstalllibncurses5-dev
内核配置脚本依赖于该工具,假如没有安装的话,配置内核里会出错。
5.2.5安装git:sudoapt-getinstallgit
知名的流行的分布式版本管理工具,由Linus开发,官方内核开发用的版本管理工具也是git。Linus的作品,不能不用啊!
git须要先配置用户名和email:
06环境搭建完成
可以即将开始我们的linux内核学习之旅了。
02编译内核
环境搭好后,马上就步入到下一环节--编译内核。linux的内核是整个系统最核心的部份,内核的功能基本上决定了系统的能力。
linux的内核代码使用的是GPL授权,容许自由下载,更改并重新发布内核,只要求发布更改后的内核的同时提供源代码。
各类各样的内核版本诸多,几乎所有的linux发行版还会对内核进行或多或少的更改,debian也不例外。这种内核都有个源头,即Linus维护的官方内核,其他的内核几乎都是构建在官方内核的基础上的。我们的内核学习,也是以官方内核为准。
linux官方内核的网站是:。从上面可以了解到内核开发的最新动态,如今就把该网址加入收藏夹吧。
(另外有个网站:上面有许多linux大牛发表的观点,也值得收藏)。
从linux内核3.0开始,内核版本命名采用的策略跟先前不一样,命名格式为3.A.B,其中A为内核的版本,B为补丁的版本。即3.A.B与3.A.C的内核是相同的版本,具有相同的功能,假如C>B,只是说明3.A.C相比3.A.B修复了一些BUG而已。
步入内核3.0时代后,内核的开发工作发展迅速,版本更新得很快,第一个3.0版本是在2011年7月,而如今,最新的稳定版已是3.12.8,而新的3.13版内核开发工作也已接近尾声,将要发布稳定版了。(“
/wiki/linux”内核”介绍了部份版本的特点)。
01选择内核版本
首先我们须要从选择一个版本。实际上从2.6版本开始,内核的构架没有非常大的变动,基本上是添加新的功能,添加新的驱动的支持,内核插口有一些变动。
另外,除非不得已,不要再使用2.4及更低版本,由于2.6内核的整个构架经过全面重新设计,效率更高,功能更建立,也更安全。
我感觉尽量选择与发行版使用的内核版本差不多的话会比较好点,内核跟其他组件相对会配合得好些,不知是不是这样。debian7.3使用的内核是3.2的,而如今该内核版本的最新版为3.2.54,使用相同内核版本的带有最新补丁的内核重编译并替换原先的内核,可以最大程度上降低与系统其他部份的兼容性问题,这样我们可以将主要精力集中在内核的学习上。
下载得到的内核名为linux-3.2.54.tar.xz。
下边将描述在上一课中搭建的“windows7+vmware10.0.1+debian7.3”的系统中编译内核linux-3.2.54的步骤,在真实机器上安装的debian7.3系统上编译的方式也是类似的。
02安装vmware-tools
内核文件下载好后,需复制到vmware顾客系统(即debian系统)。
最好的方式是使用vmware提供的文件共享功能,这个功能由vmware-tools软件包提供,须要先安装该软件包。首先设置共享目录,在VMware菜单栏上点击”虚拟机”-->”设置”,打开设置页面,点击”选项”属性页,点击”共享文件夹”,在右端选择”总是启用”,再点击”添加”,按提示设置主机中用于共享的目录路径和共享名称(我用的是workspace)。
启动debian系统后,点击菜单栏的”虚拟机”-->”安装VMWareTools”。稍等片刻后,虚拟机的CD光驱动应当早已有了vmware-tools的安装盘。在debian系统按以下步骤进行:
挂载光碟:sudomount/dev/cdrom/media/cdrom
复制安装包:cp/media/cdrom/VM*.tar.gz./
解压安装包:tar-xvf./VM*.tar.gz
cd./vmware-tools-distrib
安装:sudo./vmware-install.pl(安装过程中所有选项都使用默认即可)
安装完成了,检测发觉/mnt目录下多了一项hgfs目录,上面是主机共享目录,即/mnt/hgfs/workspace。
03打算新的内核源代码
将下载的内核源代码放到上一步中设置的主机共享目录中,之后解压到默认的内核源代码目录:sudotar-xvf
/mnt/hgfs/workspace/linux-*.tar.gz-C/usr/src
/usr/src目录下是专门储存内核源代码的。
置于其他目录也可以编译的,不过我们还是遵守通用的规则吧。
我们的debian系统是64位版本(即将名称是x86_64),为了防止出现问题,我们的内核也将编译成x86_64版本,故更改下源代码目录名称:sudomv/usr/src/linux-3.2.54
/usr/src/linux-3.2.54.x86_64.同时把源代码目录下的Makefile文件内容也改一下:
sudovim
/usr/src/linux-3.2.54.x86_64/Makefile
搜索字符串”EXTRAVERSION=”,在”=”前面加上”.x86_64″。
这样,编译下来的内核镜像,模块目录等就会手动加上”.x86_64″后缀。
04配置内核
配置内核就是告诉编译器,源代码中的什么功能要编译进内核,什么编译成模块,什么不须要编译。源码中包含了几千个选择,因而配置内核是个很复杂很费力的工作,为了简化这个工作,内核开发者为各个平台编撰了默认的简单配置文件。以x86平台为例,配置文件置于”arch/x86/configs”目录下,可将这种配置文件作为配置工作的起点,选择其中一个文件复制到源码目录下,并命令名为”.config”(注意上面有个”.”,它是隐藏文件),这是内核编译时使用的配置文件,也是内核配置工具启动时加载的文件,其实内核配置更改后的配置信息也保存在这个文件里。
因为VMWare的硬件与普通的硬件不同,用内核开发者提供的配置文件编译下来的内核未能引导系统,我们先暂时忽视有关内核配置的复杂细节,走条捷径,以debian系统安装时形成的配置文件作为我们配置内核的起点。
既然debian能引导,用它编译下来的内核应当不会有哪些大问题,复制debian的配置文件到源代码目录,并配置:
sudocp
/boot/config-3.2.0-4-amd64
/usr/src/linux-3.2.54.x86_64/.config
cd
/usr/src/linux-3.2.54.x86_64/
sudomakemenuconfig
虽然不更改内核的配置还是须要执行sudomakemenuconfig,由于发行版的内核可能经过更改,使用的.config也可能会有差别,执行一下sudomakemenuconfig,它会重新剖析.config文件,设置文件中描述的配置信息,退出后再保存成新内核适用的.config文件(退出时,配置工具会寻问你是否保存更改,须要选择”yes”)。
05编译,安装新内核
内核配置完成了,可以编译内核了,分别执行以下命令,进行编译并安装内核:
sudomakesudomakemodules_installsudomakeinstall
make命令按照配置信息进行编译,包括模块。debian系统默认加入了许多驱动模块,整个编译过程比较历时,恐怕历时1.5~2个小时,在编译时可能出现各类问题,须要依照错误提示进行更改。
本次编译模块时就提示“drivers/staging/rts5139”这个模块编译出错,这是一个USB优盘的驱动,不是哪些必需的驱动,直接在内核配置中去除该模块吧。
因而,重新执行sudomakemenuconfig,找到该模块:“DeviceDrivers”-->”Stagingdrivers”-->”RealtekRTS5139USBcardreadersupport”。除去该模块支持,退出保存,重新执行sudomake。
makemodules_install命令用于安装可装载模块,这种模块会手动安装到
/lib/modules/3.2.54.x86_64下。
makeinstall命令执行三个操作:复制内核镜像到/boot目录下;生成initrd-img;更新grub。命令成功执行成功后,新的内核已可以使用,但是列在引导菜单中。
06重启系统
重启系统,grub引导选项中多了我们新编译的内核选择,选择新内核引导。步入系统后执行命令uname-r查看当前的内核版本,显示为“3.2.54.x86_64”,确实是我们新编译的内核。
不过,在VMWare中重编译内核后,vmware-tools的文件共享功能不起作用了,这是由于vmware-tools中包含了内核模块,重编译后,这种模块不能再正常加载了。
只需执行命令:sudovmware-config-tools.pl(全部使用默认选项),重新配置vmware-tools即可让共享功能正常使用。