Linux内核裁减及根文件系统定制之一Linux内核裁减.docx
《Linux内核裁减及根文件系统定制之一Linux内核裁减.docx》由会员分享,可在线阅读,更多相关《Linux内核裁减及根文件系统定制之一Linux内核裁减.docx(15页珍藏版)》请在冰豆网上搜索。
![Linux内核裁减及根文件系统定制之一Linux内核裁减.docx](https://file1.bdocx.com/fileroot1/2023-2/4/2676df42-69e5-43f6-a0fe-efd1e2b9facf/2676df42-69e5-43f6-a0fe-efd1e2b9facf1.gif)
Linux内核裁减及根文件系统定制之一Linux内核裁减
Linux系统裁减指南
第一步:
裁减内核
打开终端,输入:
cd/usr/src/linux2.4,然后输入makexconfig.现在编译内核正式开始了
1.1 “codematurityleveloptions”选项,代表代码的成熟等级,因为这是一个试验的部分,我们不需要,所以关闭它。
1.2 “Loadablemodulesupport”可加载模块支持
可加载模块是指内核代码(kernelcode)的一些片断,比如驱动程序,当编译内核的时候它们也被单独编译。
因此,这些代码不是内核的一部分,但是当需要它的时候,它可以被加载并使用。
内核代码编译成可加载模块,可以使内核更小,而且更稳定。
所以里面的三项我们全选。
1.3 Processortypeandfeatures:
处理器类型和特色
在这里,你可以选择你的处理器(Processor)的类型,决定是否选择不同的选项。
通常“/dev/cpu”选项更高级,多数用户并不需要选择它。
“HighMemorySupport”只有当你的计算机有超过1GB内存(不是磁盘空间)时才是必须的。
多数计算机的内存从64到512MB(并且拥有8到60GB硬盘空间),因此“HighMemorySupport”通常并不使用。
实际上现在所有的处理器都集成了浮点运算单元(译者注:
从586级开始所有CPU集成了浮点运算单元),所以通常你可以不选择这个选项。
“MTRR”选项允许在PCI或者AGP总线众进行更快速的通讯。
由于现在所有系统都将它们的显卡接在PCI或AGP总线上,你通常需要选择“MTRR”:
无论如何,打开这个选项通常都是安全的——即使你的机器没有使用PCI或AGP总线的显卡。
对称多处理器(SMP)需要能够支持超过一个处理器的主板,比如一块支持双PentiumII处理器的主板。
“Symmetricmulti-processing”选项保证内核能够以最佳方式加载双处理器。
最后一个选项(“APIC”选项)通常也需要多处理器,但它通常是关闭的。
所以在这一栏我只选了MTRR,其他都不选。
1.4Generalsetup:
常规内核选项。
Networkingsupport,linux网络支持,必须选上,否则无法编译内核。
Pcisupport因为现在所有系统都使用PCI总线,所以选上。
PCIaccessmodePCI存取模式,选择any.
SystemVIPC程序通信和同步,选上
BSDprocessaccounting保持进程结束时产生的错误代码,选上
Sysctlsupport允许程序修改某些内核选项而不需要重新编译内核或者重新启动计算机,选上
Kernelsupportfora.outbinariesa.out的执行文件是比较古老的可执行代码,但有些程序还要用上,所以选上
KernelsupportforELFbinaries,现在的可执行程序格式,选上
Powermanagementsupport电源管理支持,选上
1.5MemoryTechnologyDevices(MTD),配置存储设备(MemoryTechnologyDevices),这个选项使Linux可以读取闪存卡(FlashCard)之类的存储器,关闭
1.6 Parallelportsupport,配置并口(parallelport).在USB技术出现以前,并口是最常用的连接计算机和打印机、扫描仪的方式,关闭
1.7 PlugandPlayconfiguration配置即插即用(PnP)设备.因为我不需要USB设备,所以我关闭这个选项
1.8 Blockdevices配置块设备(blockdevices)
Normalfloppydisksupport我要使用软驱,所以选上
1.9Multi-devicesupport(RAIDandLVM) 配置多驱动器(multipledevices)不需要RAID(廉价冗余磁盘阵列)或者LVM支持,所以全部关闭
1.10Networkingoptions 网络配置选项
PacketSocket选项用来与网卡进行通信而不需要在内核中实现网络协议,选上
Unixdomainsockets进行网络链接,选上
TCP/IPnetworking此选项包括了Internet和内部网络所需要的协议。
选上
1.11TelephonySupport电话支持,不需要,关闭
1.12ATA/IDE/MFM/RLLsupport配置对ATA,IDE,MFM和RLL的支持(硬盘的通讯协议)
现在都用ATA,IDE格式硬盘,所以选上
EnhancedIDE/MFM/RLLdisk/cdrom/tape/floppysupport,基本上所有的计算机都使用IDE/ATAPI界面,因此选上
IncludeIDE/ATAPICDROMsupport支持光驱的时候需要,关闭
IncludeIDE/ATAPITAPEsupport关闭
IncludeIDE/ATAPIFLOPPYsupport关闭
CMD640chipsetbugfix/support关闭
1.13SCSIsupport配置SCSI支持.没有SCSI硬盘,也不用USB设备,所以关闭
1.14FusionMPTdevicesupport为灰色,系统自动选关闭
1.15I2Odevicesupport 配置I2O设备支持(I2ODeviceSupport)
没有I2O界面,所以选择关闭。
1.16Networkdevicesupport配置网卡支持(NetworkDeviceSupport)
Networkdevicesupport在没有网卡支持的情况下,很难将内核编译成功,选上
Dummynetdriversupport(虚拟网卡驱动),系统会经常用到虚拟网卡,选为一个可加载模块。
Ethernet(10or100Mbit)配置以太网卡(EthernetDevice)根据自己的实际情况配置,比如我有一块3c509/3c529芯片的3com卡,则选3comcards并将3c509/3c529选为可加载模块
1.17AmateurRadiosupport 配置业余广播支持(AmateurRadioSupport)不需要,关闭
1.18IrDA(infrared)support配置红外线(无线)通讯支持不需要,关闭
1.19ISDNsubsystem配置ISDN.不需要,关闭
1.20OldCD-ROMdrivers(notSCSI,notIDE)配置老CDROM.没有老CDROM,关闭
1.21Inputcoresupport配置InputCoreSupport.这个选项提供了2.4.x内核中最重要的特性之一的USB支持。
Inputcoresupport是处于内核与一些USB设备之间的层(Layer)。
我不需要USB支持,所以,关闭
1.22Characterdevices配置字符型设备(CharacterDevices)
virtualterminal允许在XWindow中打开xterm和使用字符界面登录,选上
supportforconsoleonvirtualterminal告诉内核将诸如模块错误、内核错误启动信息之类的警告信息发送到什么地方,在XWindow下,通常设置一个专门的窗口来接收内核信息,但是在字符界面下,这些信息通常被发送到第一个虚拟终端(VirtualTerminal),所以,选上
standard/generic(8250/16550andcompatibleUARTs)serialsupport,内核支持串行口,选上
mousesupport(notserialandbusmice)用的是PS/2鼠标,所以。
选上
PS/2mouse(aka"auxiliarydevice"support)用的是PS/2鼠标,所以。
选上
unix98PTYsupport使用远程使用自己机器上的xterm,不需要,关闭
(除此以外的本栏选项,其他的选项全部选择关闭)
1.23Multimediadevices配置多媒体设备“MultimediaDevices”不需要,关闭
1.24CryptoHardwaresuppor,关闭
1.25Filesystems配置文件系统(FileSystem)
DOSFATsupportwindowsNT/2000文件系统,不选择,关闭
ISO9660CDROMfilesystemsupport光驱支持,不需要,关闭
/procfilesystemsupport/proc目录中的文件包含了关于系统状态的许多重要信息,比如那些中断正在使用所以选择,打开
Secondextendedfssupport此选项针对Linux的标准文件系统(Ext2FS)必须打开这个选项,所以,打开
UDFfilesystemsupport不需要,关闭
Networkfilesystems假如计算机处于一个需要使用Networkfilesystems选项的大型网络之中,否则不需要,所以,关闭
PartitionTypes此选项是一个很高级但对于有效的使用Linux内核来说并不必要的选项,关闭
nativelanguagesupport在这个菜单中,可以选择那些编码将被Linux用来处理DOS和Windows下的文件名,因为刚才选择了不支持DOS和WINDOWS,所以,关闭
1.26Consoledrivers配置控制台驱动,
VGAtextconsole选项在VGA模式下启动字符模式,打开
videomodeselectionsupport此选项使启动的时候能够使用字符模式的分辨率,不需要,关闭
1.27sound声卡配置
根据自己的声卡选择相关的驱动,比如我的是nforce系列的声卡,所以我就选择了这一个系列的。
1.28USBsupport配置USB支持
因为我将USB驱动关闭了,所以我比需要配置USB支持,所以,关闭
1.29Kernelhacking 配置“kernelhacking”选项系统默认
1.30SaveandExit保存并退出
(注:
没有提到的选项,安系统默认选项)
1.31在终端输入命令makedep(读取配置过程生成的配置文件,创建对应于配置的依赖关系树)
1.32makeclean(完成删除前面步骤留下的文件,以避免出现一些错误)
1.33makebzImage(完全编译压缩内核)
到此,裁减内核就完成了,这个内核大小是740k
第二步:
根文件系统的制作
boot/root盘由两部分组成,即核心和根文件系统。
要把这两部分都放到一个1.44MB的软盘上去,通常要对内核和根文件系统进行压缩,压缩核心的最好方法是进行重新编译内核,将一些不必要的支持去掉,这一步我们已经完成了,下面我们是做一个根文件系统的压缩包。
对于根文件系统的压缩包括两方面的问题,第一是只保留必要的根文件系统组件,第二是将根文件系统做成一个压缩包,类似于内核工作的原理。
根文件系统概述
一个根文件系统必须包括支持完整Linux系统的全部东西,它至少应包括以下几项:
•基本文件系统结构
•至少含有以下目录:
/dev、/proc、/bin、/etc、/lib、/usr、/tmp
•最基本的应用程序,如sh、ls、cp、mv等
•最低限度的配置文件,如rc、inittab、fstab等
•设备:
/dev/hd*、/dev/tty*、/dev/fd0
•基本程序运行所需的库函数
以上所需文件一般情况下会超过1.44M,因此我们是先准备好内容后再压缩到软盘中,当用软盘启动时,再把文件解压到内存中,形成一个虚拟盘(RAMDISK),通过RAMDISK控制系统启动。
为了能创建以上的根文件系统,必须有一个空闲的能够放下大约4MB文件的RAMDISK。
系统缺省情况下已替我们建好了一个大小为4096KB的RAMDISK,其设备名一般为/dev/ram0,我们就使用它来保存我们预先准备好的根文件系统。
创建根文件系统
(1)在终端输入命令:
mke2fs-m0-i2000/dev/ram0,这样就创建了一个虚拟盘mke2fs将会自动判断设备容量的大小并相应地配置自身,-m0 参数防止它给root保留空间,这样会腾出更多的有用空间。
(2)接着把虚拟盘挂在节点/mnt上:
在终端输入命令:
mount-text2/dev/ram0/mnt/floppy
(3)接着是创建目录。
根文件系统最少应该有如下8个目录:
/dev—设备
/proc—proc文件系统所需目录
/etc—系统配置文件
/sbin—重要的系统程序
/bin—基本应用程序
/lib—共享函数库
/mnt—装载其他磁盘节点
/usr—附加应用程序
执行如下命令创建这些目录:
#cd/mnt/floppy
#mkdirdevprocetcsbinbinlibmntusr
(4)接下来的工作就是确定各个目录下的内容了:
/dev:
/dev中含有系统不可缺少的设备文件。
用命令:
cp–dpr/dev/{console,fd0.hda,hda8,hda9,hda10,initctl,initrd,kmem,mem,null,ram,ram0,ramdisj,sda,tty1,tty}/mnt/flopp/dev/将console,fd0.hda,hda8,hda9,hda10,initctl,kmem,mem,null,ram,ram0,ramdisj,sda,tty1,tty等必须的设备文件复制到dev文件夹中。
其中参数-dpr是为了保证连接文件仍然不变。
Console为系统控制台设备,非常重要;
Fd0,第一个软驱;
Had,hda8,hda9,hda10为硬盘设备,其中hda8,hda9,hda10不是必须的;
Initctl为一个FIFO设备,和init有关;
Initrd初始化设备;
Kmem内核虚拟内存;
Mem访问物理内存;
Nullnull设备;
Ramramdisk设备,是/dev/ram0应用initrd机制所必须的;
Tty当前tty设备;
•/etc:
这个目录中含有一些必不可少的系统配置文件。
用命令:
cp/etc/{default,ld.so.cache,ld.so.conf,login.defs,fstab,groub,init.d,inittab,issue,modules.conf,mtab,nsswitch.conf,pam.d,profile,rc.d}/mnt/floppy/etc/将文件default,ld.so.cache,ld.so.conf,login.defs,fstab,groub,init.d,inittab,issue,modules.conf,mtab,nsswitch.conf,pam.d,profile,rc.d复制到当前文件夹etc下面。
Default某个命令的缺省设置;
Ld.so.cache由idconfig命令根据/etc/id.so.conf文件产生;
ld.so.conf库文件路径配置文件;
login.defs全局缺省设置;
fstab文件系统列表,
fstab应包括:
/dev/ram0/ext2defaults
/dev/fd0/ext2defaults
/proc/procprocdefaults
init.d符号连接到/etc/rc.d/init.d
inittabinit配置文件
inittab包括:
id:
2:
initdefault:
si:
:
sysinit:
/etc/rc
1:
2345:
respawn:
/sbin/getty9600tty1
2:
23:
respawn:
/sbin/getty9600tty2
modules.conf模块的配置文件
mtab已经挂载的文件系统列表
nsswitch.confnameserviceswitch的配置文件
pam.d放置PAM配置文件的目录
profile系统环境变量和登陆配置文件
rc.d放置启动脚本的目录
/bin和/sbin:
该目录中包含有必不可少的应用程序,在该目录下放置init, getty,login,mount,以次来运行rc的外壳shell。
/lib:
该目录中包含有你的启动盘启动过程中所需要的共享函数库。
几乎所有的程序都需要libc库,列一下目录/lib中的libc:
libext2fs.so.2,libcom_err.so.2,libuuid.so.1,libc.so.6,ld-linux.so.2,libnss_files*,pam_unix.so
(5)打包
完成了上述工作,卸下虚拟盘,拷贝到一个文件中,然后压缩。
umount/mnt
ddif=/dev/ram0bs=1k|gzip-v9>gj.gz
压缩结束后,就拥有了一个压缩的根文件系统,这个压缩文件的名字叫gi.gz,检查它的大小,如果大了,还得删除一些东西。
第三:
组织引导盘
有了根文件系统和内核之后,最后的工作就是把它们组织在一起。
接下来创建一个内核文件系统。
把一张干净的软盘插入软驱,在上面创建ext2文件系统。
相继在shell中输入命令:
?
?
mke2fs/dev/fd0(创建文件系统)
mount/dev/fd0/mnt/floppy(挂载软盘)
rm-rf/mnt/floppy/lost+found(删除系统生成的文件夹)
mkdir/mnt/floppy{boot,dev}(创建两个文件夹)
mkdir/mnt/floppy/boot/grub
再执行:
cp-R/dev/{null,fd0}/mnt/floppy/dev
cp/boot/grub/stage1/mnt/floppy/boot/grub
cp/boot/grub/stage2/mnt/floppy/boot/grub
接着拷贝启动加载器boot.b到目录/boot中,
cp/boot/boot.b/mnt/floppy/boot
把grub引导写到软盘上面
#grub
在grub>;提示符处,输入:
grub>;root(fd0)
grub>;setup(fd0)
grub>;quit
写完引导后
#cpvmlinuz-jou/mnt/floppy/boot (复制内核到boot文件夹下)
#cpgj.gz /mnt/floppy/boot (复制压缩文件系统到boot文件夹下)
#cp/boot/grub/grub.conf /mnt/floppy/boot/grub(把引导配置文件复制到grub下面)
编辑grub.conf,内容如下:
timeout10
default0
titleMylittleLinux
root(fd0)
kernel/boot/vmlinuz-jouroroot=/dev/ram0
initrd/boot/gj.gz
然后制作grub.conf的link文件menu.lst
#ln-s/mnt/floppy/boot/grub/grub.conf/mnt/floppy/boot/grub/menu.lst
#umount/mnt/floppy(退出软盘)
裁减linux内核
工作目标:
制作一个小的linux系统,使之体积尽可能地少,功能尽可能地简化,以在其上能够运行一个RedHatLinux下编译的可执行程序为限。
工作结果:
制成一个U盘上的linux小系统,总共大小为60M左右。
能够从U盘引导,完全脱离硬盘运行,提供全部的linux内核功能,以字符界面方式提供RedHatLinux常用功能包括帐户、文件管理和网络等常用服务等功能,并且可以扩展。
工作环境:
PC机一台,U盘(至少64M为宜),网络
RedHatLinux9.0(可以使用vmware虚拟)
工作流程:
第一阶段:
配置和编译内核
第二阶段:
移植内核到U盘上
第三阶段:
裁减文件系统
一、配置和编译内核。
(1)准备linux内核源码,放于目录/usr/src下。
这里使用的版本是:
linux-2.6.18
(2)配置内核:
在源码所在的目录下,使用命令makemenuconfig对内核进行配置。
在图形界面下可以使用makexconfig命令开始这项工作。
对内核的配置涉及到很多软硬件的选项,网上资料很多,这里不一一累述。
但是这里因为工作目标是要做成U盘启动,所以应该增加对USB设备的支持,而且linux把USB存储器当成SCSI设备处理,所以也应增加SCSI支持。
编译的时候,必须的功能应该选择y编译进内核,部分功能可以选择M表示以模块加载的形式提供支持。
非必要的尽量不要选,以减小目标内核的体积。
配置内核完成后,在退出的时候选择“保存”配置结果。
(3)编译内核:
首先需要用makedep命令生成所配置的内核选项中的依赖关系,不过在2.6.*的版本中这一步骤已经不需要显式地进行。
如果此前曾在这个源码目录里面进行过内核编译的工作,可以用makeclean清除上次编译的结果,以免造成影响。
生成内核映象的命令是makebzImage.这一过程用时较长,具体时间取决于所配置的内核选项和计算机的处理速度。
结束的时候,会告知生成的内核映象是./arch/i386/boot/bzImage文件,这就是这一阶段主要的成果了.除此以外,在当前目录下会生成一个System.map的文件,这是内核中的符号表。
(4)生成模块。
一般我们都会把或多或少的内核功能配置为模块支持。
所以我们需要用命令makemodules生成这些模块。
接下来用makemodules_install把模块拷贝到指定的目录,也就是/lib/modules/目录下以所编译的内核版本号为文件夹名为目录名的文件里。
这里的目录是/lib/modules/2.6.18.如果编译的目标内核版本号与当前系统的版本号相同,最好先对同一目录的文件进行备份。
(5)生成initrd文件。
RedHatLinux使用了一种称之为initrd的工作方式来阶段化系统的初