第一步:裁减内核
打开终端,输入:cd /usr/src/linux2.4,然后输入make xconfig.现在编译内核正式开始了
1.1 “code maturity level options”选项,代表代码的成熟等级,因为这是一个试验的部分,我们不需要,所以关闭它。
1.2 “Loadable module support”可加载模块支持
可加载模块是指内核代码(kernel code)的一些片断,比如驱动程序,当编译内核的时候它们也被单独编译。因此,这些代码不是内核的一部分,但是当需要它的时候,它可以被加载并使用。内核代码编译成可加载模块,可以使内核更小,而且更稳定。所以里面的三项我们全选。
1.3 Processor type and features:处理器类型和特色
在这里,你可以选择你的处理器(Processor)的类型,决定是否选择不同的选项。通常“/dev/cpu”选项更高级,多数用户并不需要选择它。 “High Memory Support”只有当你的计算机有超过1GB内存(不是磁盘空间)时才是必须的。多数计算机的内存从64到512MB(并且拥有8到60GB硬盘空间),因此“High Memory Support”通常并不使用。实际上现在所有的处理器都集成了浮点运算单元(译者注:从586级开始所有CPU集成了浮点运算单元),所以通常你可以不选择这个选项。 “MTRR”选项允许在PCI或者AGP总线众进行更快速的通讯。由于现在所有系统都将它们的显卡接在PCI或AGP总线上,你通常需要选择 “MTRR”:无论如何,打开这个选项通常都是安全的——即使你的机器没有使用 PCI或AGP总线的显卡。对称多处理器(SMP)需要能够支持超过一个处理器的主板,比如一块支持双Pentium II处理器的主板。 “Symmetric multi-processing”选项保证内核能够以最佳方式加载双处理器。最后一个选项(“APIC”选项)通常也需要多处理器,但它通常是关闭的。所以在这一栏我只选了MTRR,其他都不选。
1.4 General setup:常规内核选项。
Networking support,linux网络支持,必须选上,否则无法编译内核。
Pci support 因为现在所有系统都使用PCI总线,所以选上。
PCI access mode PCI存取模式,选择any.
System V IPC 程序通信和同步,选上
BSD process accounting 保持进程结束时产生的错误代码,选上
Sysctl support 允许程序修改某些内核选项而不需要重新编译内核或者重新启动计算机,选上
Kernel support for a.out binaries a.out的执行文件是比较古老的可执行代码,但有些程序还要用上,所以选上
Kernel support for ELF binaries ,现在的可执行程序格式,选上
Power management support 电源管理支持,选上
1.5 Memory Technology Devices (MTD),配置存储设备(Memory Technology Devices),这个选项使Linux可以读取闪存卡(Flash Card)之类的存储器,关闭
1.6 Parallel port support,配置并口(parallel port).在USB技术出现以前,并口是最常用的连接计算机和打印机、扫描仪的方式,关闭
1.7 Plug and Play configuration配置即插即用(PnP)设备.因为我不需要USB设备,所以我关闭这个选项
1.8 Block devices 配置块设备(block devices)
Normal floppy disk support我要使用软驱,所以选上
1.9 Multi-device support (RAID and LVM) 配置多驱动器(multiple devices)不需要RAID(廉价冗余磁盘阵列)或者LVM支持,所以全部关闭
1.10 Networking options 网络配置选项
Packet Socket选项用来与网卡进行通信而不需要在内核中实现网络协议,选上
Unix domain sockets 进行网络链接,选上
TCP/IP networking此选项包括了Internet和内部网络所需要的协议。选上
1.11 Telephony Support 电话支持,不需要,关闭
1.12 ATA/IDE/MFM/RLL support 配置对ATA,IDE,MFM和RLL的支持(硬盘的通讯协议)
现在都用ATA,IDE格式硬盘,所以选上
Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support,基本上所有的计算机都使用IDE/ATAPI界面,因此选上
Include IDE/ATAPI CDROM support 支持光驱的时候需要,关闭
Include IDE/ATAPI TAPE support 关闭
Include IDE/ATAPI FLOPPY support 关闭
CMD640 chipset bugfix/support 关闭
1.13 SCSI support 配置SCSI支持.没有SCSI硬盘,也不用USB设备,所以关闭
1.14 Fusion MPT device support 为灰色,系统自动选关闭
1.15 I2O device support 配置I2O设备支持(I2O Device Support)
没有I2O界面,所以选择关闭。
1.16 Network device support 配置网卡支持(Network Device Support)
Network device support 在没有网卡支持的情况下,很难将内核编译成功,选上
Dummy net driver support(虚拟网卡驱动),系统会经常用到虚拟网卡,选为一个可加载模块。
Ethernet(10 or 100Mbit)配置以太网卡(Ethernet Device)根据自己的实际情况配置,比如我有一块3c509/3c529芯片的3com卡,则选3com cards并将3c509/3c529选为可加载模块
1.17 Amateur Radio support 配置业余广播支持(Amateur Radio Support)不需要,关闭
1.18 IrDA (infrared) support配置红外线(无线)通讯支持 不需要,关闭
1.19 ISDN subsystem 配置ISDN.不需要,关闭
1.20 Old CD-ROM drivers (not SCSI, not IDE) 配置老CDROM.没有老CDROM,关闭
1.21 Input core support 配置Input Core Support. 这个选项提供了2.4.x内核中最重要的特性之一的USB支持。 Input core support是处于内核与一些USB设备之间的层(Layer)。我不需要USB支持,所以,关闭
1.22 Character devices配置字符型设备(Character Devices)
virtual terminal允许在XWindow中打开xterm和使用字符界面登录,选上
support for console on virtual terminal告诉内核将诸如模块错误、内核错误启动信息之类的警告信息发送到什么地方,在XWindow下,通常设置一个专门的窗口来接收内核信息,但是在字符界面下,这些信息通常被发送到第一个虚拟终端(Virtual Terminal),所以,选上
standard/generic (8250/16550 and compatible UARTs) serial support,内核支持串行口,选上
mouse support (not serial and bus mice)用的是PS/2鼠标,所以。选上
PS/2 mouse (aka "auxiliary device" support) 用的是PS/2鼠标,所以。选上
unix98 PTY support 使用远程使用自己机器上的xterm,不需要,关闭
(除此以外的本栏选项,其他的选项全部选择关闭)
1.23 Multimedia devices 配置多媒体设备“Multimedia Devices”不需要,关闭
1.24 Crypto Hardware suppor,关闭
1.25 File systems配置文件系统(File System)
DOS FAT support windowsNT/2000文件系统,不选择,关闭
ISO 9660 CDROM file system support 光驱支持,不需要,关闭
/proc file system support /proc目录中的文件包含了关于系统状态的许多重要信息,比如那些中断正在使用 所以选择,打开
Second extended fs support此选项针对Linux的标准文件系统(Ext2 FS) 必须打开这个选项,所以,打开
UDF file system support不需要,关闭
Network file systems假如计算机处于一个需要使用Network file systems选项的大型网络之中,否则不需要,所以,关闭
Partition Types此选项是一个很高级但对于有效的使用Linux内核来说并不必要的选项,关闭
native language support在这个菜单中,可以选择那些编码将被Linux用来处理DOS和Windows下的文件名,因为刚才选择了不支持DOS 和WINDOWS,所以,关闭
1.26 Console drivers 配置控制台驱动,
VGA text console选项在VGA模式下启动字符模式,打开
video mode selection support此选项使启动的时候能够使用字符模式的分辨率,不需要,关闭
1.27 sound 声卡配置
根据自己的声卡选择相关的驱动,比如我的是nforce系列的声卡,所以我就选择了这一个系列的。
1.28 USB support配置USB支持
因为我将USB驱动关闭了,所以我比需要配置USB支持,所以,关闭
1.29 Kernel hacking 配置“kernel hacking”选项系统默认
1.30 Save and Exit 保存并退出
(注:没有提到的选项,安系统默认选项)
1.31 在终端输入命令make dep (读取配置过程生成的配置文件,创建对应于配置的依赖关系树)
1.32 make clean (完成删除前面步骤留下的文件,以避免出现一些错误)
1.33 make bzImage (完全编译压缩内核)
到此,裁减内核就完成了,这个内核大小是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 -m 0 -i 2000 /dev/ram0,这样就创建了一个 虚拟盘 mke2fs将会自动判断设备容量的大小并相应地配置自身,-m 0 参数防止它给root保留空间,这样会腾出更多的有用空间。
(2)接着把虚拟盘挂在节点/mnt上:
在终端输入命令:mount -t ext2 /dev/ram0 /mnt/floppy
(3) 接着是创建目录。根文件系统最少应该有如下8个目录:
/dev — 设备
/proc — proc 文件系统所需目录
/etc — 系统配置文件
/sbin — 重要的系统程序
/bin — 基本应用程序
/lib — 共享函数库
/mnt — 装载其他磁盘节点
/usr — 附加应用程序
执行如下命令创建这些目录:
#cd /mnt/floppy
#mkdir dev proc etc sbin bin lib mnt usr
(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 访问物理内存;
Null null设备;
Ram ram disk 设备,是/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 / ext2 defaults
/dev/fd0 / ext2 defaults
/proc /proc proc defaults
init.d符号连接到/etc/rc.d/init.d
inittab init配置文件
inittab包括:
id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
modules.conf 模块的配置文件
mtab 已经挂载的文件系统列表
nsswitch.conf name service switch 的配置文件
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
dd if=/dev/ram0 bs=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
写完引导后
#cp vmlinuz-jou /mnt/floppy/boot (复制内核到boot文件夹下)
#cp gj.gz /mnt/floppy/boot (复制压缩文件系统到boot文件夹下)
#cp /boot/grub/grub.conf /mnt/floppy/boot/grub (把引导配置文件复制到grub下面)
编辑grub.conf, 内容如下:
timeout 10
default 0
title My little Linux
root (fd0)
kernel /boot/vmlinuz-jou ro root=/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(退出软盘)
制作完成!