定制内核.docx
《定制内核.docx》由会员分享,可在线阅读,更多相关《定制内核.docx(23页珍藏版)》请在冰豆网上搜索。
![定制内核.docx](https://file1.bdocx.com/fileroot1/2023-1/27/1064b48e-dbcf-4231-a053-a935c3ddabd0/1064b48e-dbcf-4231-a053-a935c3ddabd01.gif)
定制内核
第六章定制内核
4.3定制内核
对于Linux系统管理员来说,定制系统内核是一件相当简单的事情,这主要是因为它提供源代码和编译器。
困难之处仅仅是必须理解每一个选项是什么。
你可以看到我也不能完全解释配置内核时的各种选项,一般来说,由于内核配置包含了如此多的东西,你只要关心和自己有关的东西就可以了。
4.3.1配置系统内核
配置内核的命令是满简单的,不过选项实在是太多了,所以我们强烈建议你使用基于菜单的配置程序。
要配置内核,首先必须安装内核的源代码,通常可以使用rpm命令,安装的目标位置是
/usr/src/下面,例如我用2.2.14的内核,源代码就被安装到/usr/src/linux-2.2.14这个目录下。
如果你是从网络上下载的gz或tgz文件,请将它展开的/usr/src目录下。
另外,一般建议建立一个名为/usr/src/linux的符号连接:
ln–slinux-2.2.12linux
然后进入这个目录,内核源代码的目录一般是这样的:
[openlab]#ls
COPYINGMakefileSystem.mapincludelibscripts
CREDITSREADMEarchinitmmvmlinux
DocumentationREPORTING-BUGSdriversipcmodules
MAINTAINERSRules.makefskernelnet
可以有三种启动配置程序的方法:
makeconfig启动交互式的命令行配置程序
makemenuconfig启动文本菜单形式的配置程序
makexconfig启动图形界面的配置程序,这个命令必须在XWindow下执行,我们将以
这个命令的界面为例子,其他两种配置的内容是一样的,只是输入方式有所不同。
图4.6配置内核
每个菜单选项被按下后都会出现一个子菜单,给出一些选择项,例如:
Codemanturityleveloptions会给出下面的选择菜单:
图4.7内核配置
(2)
设置好了一个子菜单之后,按下next可以进入下一个选单,每个选项都可以用help按钮取得帮助。
对我们而言,下面的一些选择可能是重要的:
(注意这里只给出一些主要的选择项,其他的你可以自己根据help判断,而且那些选项对服务器通常没有多少影响
)
Codemanturityleveloptions子选单
Promptfordevelopmentand/orincompletecode/drivers(y/n)
这个选项问你是否有兴趣尝试那些还处在开发测试阶段的内核功能,除非你是Linux的测试人员,否则选N,因为这些内核功能还不是十分可靠,对于服务器最好不用。
Processortypeandfeatures子选单Processorfamily
这个选项问你的处理器类型,可以选择从386到PentiumPro/MMX(PentiumII)在内的任何一种,但是如果你选择了Pentium处理器,编译出的内核将不能在386/486上运行。
相反,386代码可以在任何可以运行Linux的系统上运行,但是可能无法发挥PentiumII的全部性能,自己选择合乎自己系统的选项。
Mathemulation数学协处理器仿真,选否。
MaximumPhysicalMemory设置系统可以使用的最大内存量,缺省是1GB,不过如果你正好有一台梦幻级x86系统,可能必须将它改成2GB。
Symmetricmulti-processingsupport,这个选项用于支持多处理器,如果你有两个以上的处理器,选yes,否则选N。
Loadablemodulesupport子选单Enableloadablemodulesupport是否使用可装载模块,选yes,否则无法使用装载模块功能。
Kernelmoduleloader自动装载模块功能,这个功能允许核心在必要时自动装入对应的模块,不过这样很容易出错,通常应该禁止。
Setversioninformationonallsymbolsformodules这个选项通常禁止。
Generalsetup子选单Networksupport网络支持,选yes
PCIsupportPCI设备支持,选yes
PlugandPlay子选单PlugandPlaysupport即插即用功能的支持,由于目前Linux的即插即用特性还不是很好,通常禁止。
BlockDevices子选单
这个选单用来设置内核支持的外部存储设备,通常,除了你的服务器上确实存在的设备之外,其他的设备都可以选N,如果没有什么把握,也可以使用m选项将其编译为可装载模块。
当然你启动Linux用的磁盘的驱动程序必须选Y。
Networkoptions子选单大部分的选项都可以选yes,除了下面的一些选项:
IP:
optimizeasrouternothost这个选项将按照路由器设置调整你的TCP/IP工作模式,如果你用Linux作为软件路由器,那么可以选Y,否则选N。
IP:
tunneling这个选项允许IP隧道,这对早期的的Netware是很重要的一种TCP/IP实现方式,但今天已经不再需要。
如果担心由个别的程序使用这个功能,将它编译为模块。
TheIPXprotocol是否支持IPX协议。
如果需要支持老式的netware3.x或4.x文件服务,需要打开这个选项,否则禁止。
AppleTalkDDP是否支持AppleTalk,选禁止。
TCPsyncookiesupport这个选项是一个补丁,用于对付“SYNflood”攻击,选yes。
SCSIsupport子选单和SCSIlow-leveldrivers子选单
在这两个选单里选择你使用的SCSI控制器和设备类型,通常启动磁盘的驱动程序必须编译进内核(y)
Networkdevicesupport子选单及相关选单
在这几个选单里选择你使用的网络适配器类型。
通常我们将它们编译成可装载模块(m)。
Characterdevices子选单
缺省设置通常就已经很好了,不过有一个选项必须注意,即
MaximumnumberofUnix98PTYsinuse(0-2048)这个选项可以理解为最大的telnet
进程数(包含ssh,rsh,rlogin等),缺省值是256,这对一般系统已经足够,然而也许你要开设一个有几百人上站的BBS,在这种情况下,将它提高到2048。
Filesystems子选单它设置内核中支持的文件系统类型,可以参考第二章的解释。
NetworkFileSystems子选单
设置支持的网络文件系统,NFS和SMB文件系统是必须支持的,其他系统可以编译成模块。
PartitionTypes子选单
选择系统支持的分区格式。
NativelanguageSupport子选单
可以将各种语言的支持程序都编译成模块。
kernelhacking子选单
MagicSysRqKey这个选项允许你通过sysrq(Alt+PrintScreen)来强行控制系统,即使在系统崩溃之后。
除非你准备调试内核,否则选N。
当全部选项设置完毕后,选择主选单的SaveandExit退回,然后开始编译:
openlab$makebzImage
makebzImage命令将按照你的选择重新编译系统内核源代码并生成核心映像,这需要一段时间。
注意建立启动映像有两个办法,即makezImage或者makebzImage。
其中,makebzImage对核心映像进行压缩,由于服务器用到的核心驱动比较多,通常应该选择makebzImage,否则用makezImage可能发生映像文件太大而无法安装的情况。
下一步是编译模块,使用命令
openlab$makemodules
将产生对应的内核模块。
4.3.2使用新内核
编译通过了一个新内核之后,可以用新内核引导系统,这样就可以使用新内核提供的功能了。
为了使用新内核进行引导,首先要把编译出的内核模块安装到/lib/modules目录下,这可以用modules_install选项完成
[openlab]$makemodules_install
这个操作必须在root权限下执行。
然后需要为新的内核创建启动选择,通常我们建议不要用新内核覆盖旧内核,而是用lilo程序配置一个新的启动选择项,首先我们要把生成的内核映像拷贝出来,这个映像按照我们的设定应该是
/usr/src/linux/arch/i386/boot/bzImage
另外,为了正确地装入模块,下面的文件也是必要的:
/usr/src/linux/System.map
将这两个文件拷贝到合适的地方,例如/bootimage,然后在lilo.conf中建立新的启动项,例如:
(加粗体的是增加的内容)
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hda1
read-only
image=/bootimage/bzImage
label=new
root=/dev/hda1
read-only
然后执行lilo程序,显示
linux*
new
表示核心已经安装成功,重新启动,在lilo:
提示符下输入new回车,就可以启动新的内核了。
在新内核测试确认无误以后,将default改成新内核对应的项,重新运行lilo程序,就不需要手工引导新内核了。
4.3.3从灾难中恢复
安装在主引导扇区的的Lilo是容易被破坏的,一旦发生这种情况,系统将无法启动,这也是教科书上一般建议从软盘启动系统的原因之一。
但是,如同我们所说的那样,我们不主张这样做,相反,我们主张准备一张Linux启动盘,然后在万一出现问题时从软盘引导系统并且进行灾难恢复。
通常,可以制作标准的Linux软盘系统,然后用软盘启动系统,这需要将软盘做成Linux启动格式,但是更好的办法是将系统引导到DOS下,然后用loadlin.exe程序来引导Linux。
为了达到这个目的,你首先要找到一个能够正确引导系统的内核,根据你的系统中的/etc/lilo.conf就可以知道目前使用的内核映像是哪一个文件,将它拷贝到一张在DOS下格式化的软盘。
然后到安装Linux的光盘上找到loadlin.exe程序,拷贝到软盘上。
要使用loadlin,首先用DOS软盘启动系统,然后在包含内核映像的软盘上使用loadlin.exe,例如你的映像文件为bzImage,而Linux系统的根分区是hda1,则可以使用下面的语法:
loadlin.exebzImageroot=/dev/hda1ro
ro表示第一趟连接/文件系统的时候使用read-only方式,这也是lilo.conf中使用的方式。
执行这一条命令之后,Linux将象平时一样启动,只是使用的是软盘上的内核。
启动完毕之后,只要正确设置/etc/lilo.conf并且重新执行lilo程序就可以恢复lilo了。
不过由于Linux内核建立在保护模式下,所以最好用纯DOS方式启动loadlin,不要使用emm386和himem,更不要在windows95的dos框中执行loadlin。
另外一种常见的灾难是由于某些原因,系统的启动脚本发生错误,特别是与网络相关的脚本发生了错误,或是某些网络文件系统损坏等等。
如果发生这样的情况,常常必须进入运行级1来修改系统脚本。
要想在启动时直接进入某个运行级,可以在lilo:
提示符下使用命令行,例如,你的启动选项中某个启动项为sel,要使用这个启动项的运行级1,在lilo:
下输入sel1回车后,就会自动进入运行级1。
运行级1有其特殊的含义,因为它代表“单用户模式”,这个模式启动系统时无需输入口令就可以获得一个rootshell。
如果你忘记了超级用户口令,就可以使用这个办法进
入系统更改口令。
当然这带来了一些安全性问题,特别是在可能有人接触你的机器时,
解决的方法是为lilo设置口令,见有关安全性的部分。
还有一种比较可怕的灾难是文件系统损坏,这时只能从包含Linux根文件系统的软盘加
载文件,然后手工安装文件系统了。
4.4使用硬盘
4.4.1为系统安装新的硬盘
或迟或早你的硬盘空间总会耗尽,当硬盘空间开始紧张的时候,你可以通过删除文件
腾出一些空间,然而必须存储的文件总是比你能买到的硬盘的容量大一些。
在这种情况
下,更有效的方法是为系统添加一块新的硬盘,在笔者写这部分内容的时候,28GB的ID
E和37GB的SCSI硬盘已经成为新的时尚。
(PC的最大好处就是你可以在任何有必要的时候
扩展你的系统!
)
如同一般书上建议的那样,SCSI硬盘在服务器方面具有对IDE硬盘的先天优势。
不过,
与NT不同,Linux并不十分依赖于SCSI,高性能的磁盘缓冲在很大程度上抵消了IDE的弱
点,因为你可以把买SCSI控制器的钱转用于购买128MB内存。
当然,如果你的服务比较繁
重,特别是内存比较紧张而需要使用交换,那么SCSI的性能优势会迅速的体现出来。
许多服务器主板上带有SCSI控制器,你可以将SCSI硬盘直接连接在上面,否则你需要
一块SCSI控制卡,不过,一定要确认你的Linux内核支持你购买的SCSI控制卡,就我知道
的,Linux对SCSI的支持远不象对以太网卡那样令人满意。
然后,为了确保工作,你需要
将SCSI支持加入内核,并且编译相应的SCSI卡驱动程序。
相对来说,IDE硬盘的安装极其简单,只要确认你的系统BIOS能够识别你的硬盘,将I
DE硬盘正确连接,上电就可以了,而且几乎可以肯定Linux内核会自动识别你的硬盘。
由于作者假定你有一定的DIY基础,所以不打算处理如SCSI连接,IDE的跳线等等问题
,你可以自己查阅有关的资料,或者最简单的找人给你安装一遍。
4.4.2分区和建立文件系统
如同在DOS和Windows9x下一样,一个新的硬盘必须通过分区和格式化(在Linux下叫
做“建立文件系统”)才能被Linux所使用。
通常我们总是建议将新的分区格式化为ext
2文件系统。
分区可以使用许多程序来完成,例如fdisk,cfdisk,DiskDruid等等。
在安装那一章
我们已经看到了DiskDruid程序和CFDISK程序,这里我们主要介绍的是fdisk。
每个Linu
x发行版本都会带有这个程序,而且它的使用虽然不直观,却非常简单。
要使用fdisk程序,使用命令fdisk[设备名],例如,要给第二个IDE主磁盘分区,使
用
fdisk/dev/hdc
然后出现下面的选项:
Thenumberofcylindersforthisdiskissetto3467.
Thereisnothingwrongwiththat,butthisislargerthan1024,
andcouldincertainsetupscauseproblemswith:
1)softwarethatrunsatboottime(e.g.,LILO)
2)bootingandpartitioningsoftwarefromotherOSs
(e.g.,DOSFDISK,OS/2FDISK)
Command(mforhelp):
注意这里的提示信息,这里警告你的柱面数大于1024。
Linux可以支持柱面数大于102
4的硬盘,但是启动分区通常必须保留在1024以内,如果你的启动分区太大,那么Lilo程
序可能无法正常安装(在目前的发行版本中的lilo都不能支持超过1024个柱面的启动分
区,如果一定要这样用,你需要去下载新版本的lilo)。
按下m键并回车可以得到命令列表:
a设置活动分区
b对磁盘进行BSD类型的分区
c切换DOS兼容标志
d删除某个分区
l列出已知的分区类型
m显示这个帮助信息
n建立新的分区
o清空分区表
p显示当前分区形式
q放弃并退出
s对磁盘进行Sun风格的分区
t改变某个分区的标志
u改变显示的单位
v校验分区表
w存盘并退出
x专家模式
这些命令的含义都十分简单,例如,要建立一个新的分区,使用命令n
Command(mforhelp):
n
Commandaction
eextended
pprimarypartition(1-4)
p就是普通的分区,而e代表扩展分区。
如果要建立一个普通的分区,输入p并且回车:
p
Partitionnumber(1-4):
输入1,表示使用第一个分区表项,然后将输入起始和结束柱面号,完毕后,返回分区
界面。
由于普通的分区(主分区)的分区表项只能使用1-4的数值,也就是最多只有四个,这
在许多情况下是不够用的,因此我们通常还要使用扩展分区:
Command(mforhelp):
n
Commandaction
eextended
pprimarypartition(1-4)
e
Partitionnumber(1-4):
1
Firstcylinder(1-3467,default1):
Usingdefaultvalue1
Lastcylinderor+sizeor+sizeMor+sizeK(1-3467,default3467):
Usingdefaultvalue3467
上述操作把整个硬盘划成了扩展分区,在存在扩展分区时,就可以使用逻辑分区划分
了(类似于DOS的逻辑盘):
Command(mforhelp):
n
Commandaction
llogical(5orover)
pprimarypartition(1-4)
注意在有扩展分区的时候出现了l选项,这个选项将扩展分区分划为逻辑盘,分区方法
与前面基本上是一样的,区别在于逻辑分区的分区号是从5开始。
Commandaction
llogical(5orover)
pprimarypartition(1-4)
l
Firstcylinder(1-3467,default1):
Usingdefaultvalue1
Lastcylinderor+sizeor+sizeMor+sizeK(1-3467,default3467):
+1000M
上述操作建立了一个1GB的逻辑分区,如此下去可以建立更多的逻辑分区。
分区结束之后,可以用p命令显示,确认无误后用w命令存盘退出。
如果有必要,重新
启动计算机。
分区正确后,下一步要为Linux建立文件系统,这可以用mkfs命令完成:
mkfs[-V][-t文件系统类型][-l][-c]分区名
-V选项输出完整的信息,-l从系统中读入坏块的列表,-c选项用于在建立文件系统的
同时检测磁盘介质。
文件系统类型选ext2。
[openlab]#mkfs-text2-c/dev/hdc1
mke2fs1.15,18-Jul-1999forEXT2FS0.5b,95/08/09
Filesystemlabel=
OStype:
Linux
Blocksize=1024(log=0)
Fragmentsize=1024(log=0)
32128inodes,128488blocks
6424blocks(5.00%)reservedforthesuperuser
Firstdatablock=1
16blockgroups
8192blockspergroup,8192fragmentspergroup
2008inodespergroup
Superblockbackupsstoredonblocks:
8193,24577,40961,57345,73729,
Checkingforbadblocks(read-onlytest):
done
Writinginodetables:
done
Writingsuperblocksandfilesystemaccountinginformation:
done
建立了文件系统之后,就可以连接到系统上使用了。
但是,一般情况下,我们总是希望启动系统时自动挂接文件系统,这可以通过编辑/e
tc/fstab来实现,/etc/fstab是一个用来描述文件系统的文件:
[openlab]#cat/etc/fstab
/dev/hda1/ext2exec,dev,suid,rw,usrquota,grpquota
11
/dev/cdrom/mnt/cdromiso9660noauto,owner,ro00
/dev/hda2/usrext2defaults12
/dev/fd0/mnt/floppyext2noauto,owner00
none/procprocdefaults00
none/dev/ptsdevptsgid=5,mode=62000
它的基本格式是这样:
设备名连接点文件系统类型选项备份频度文件系统检查的趟数
其中,最后的检查趟数是一个用在fsck中的数值,对于根文件系统,这个值为1,其他
本地文件系统是2,如果设置为0,那么将不检查这个文件系统。
至于备份频度栏,只要
设置为1就可以了。
显然,cdrom不需要备份,也不需要做完整性检查,所以都是0。
现在要把新分的这个分区加入进去,设备名是/dev/hdc1,可以随便设置一个连接点,
比如/export,文件系统显然是ext2,选项由于现在还没有设置,可以直接设为default
s,所以只要加入这样一行:
/dev/hdc1/exportext2defaults12
然后建立/export目录,重新启动计算机就可以使用新的硬盘了。
如果你觉得重新启动
太复杂,也可以使用mount–a命令。
4.4.3交换分区
通常很少需要更改交换分区的大小,或是使用新的交换,无论如何我们还是解释一下
,建立swap分区的工作和建立常规文件系统几乎是一样的,仅有两点区别:
第一个区别
是,建立swap分区的办法是,首先建立一个常规的Linux分区:
fdisk/dev/hda2
…………
n
#fdisk/dev/hda1
Command(mforhelp):
Command(mforhelp):
n
Commandaction
eextended
pprimarypartition(1-4)
p
Partitionnumber(1-4):
4
Firstcylinder(46-3467,default1):
46
Lastcylinderor+sizeor+sizeMor+s