Linux系统启动盘制作关键技术的探讨

 

Linux系统启动盘制作关键技术的探讨

 

詹玲,李锐,韩德志

 

(信阳师范学院,河南信阳 464000)

 

 

摘要:本文通过对一种Linux系统启动盘制作方法的介绍,详细地论述了在制作Linux系统启动盘时,Linux文件系统的创建、内核的选择及系统整合技术。

关键词:根文件系统;内核选择;系统整合

 

 

1 引言

Linux系统启动软盘,对只装有Linux系统的主机来说是很重要的。当系统出现错误时,它不仅能测试新内核、恢复系统的错误,而且能升级重要的系统文件。我们知道,所有的PC机都是通过执行ROM中的代码加载启动盘的0柱面0扇区中的代码来启动整个系统的。在Linux系统中,启动盘的0柱面0扇区中含有的是启动装载器LILO,它定位内核,装载它,最后执行它。一旦内核装载后,它先是进行基本设备初始化,接着试图加载并登录磁盘中根文件系统,如果内核找不到可装载的根文件系统,启动过程会就此停止。如果根文件系统装载完毕并登录成功后,就会看到一行信息:VFS:Mounted root (ext2 filesystem) read only,之后,系统发现init程序并执行它,init程序寻找它的配置文件/etc/inittab,并开始执行其中的脚本,这些脚本是一些Shell命令的组合,用来执行如下命令:加载所需模块、装载SWAP、初始化网络、装载fstab中列出的所有驱动器等。最后启动一个getty程序,它负责console和ttys之间的通信,它在显示器上打印login提示符并激活login程序,login处理登录的有效性并建立与用户的对话。至此,启动过程完毕。了解Linux的启动过程是为了更好地理解Linux系统盘制作的关键技术。

2 制做启动盘

创建一个Linux系统启动盘首先必须创建根文件系统,由于软盘容量有限,因此常采用压缩的根文件系统。下面详细的介绍怎样创建压缩格式根文件系统。

2.1 制作启动盘的准备

一个根文件系统必须包括支持完整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控制系统启动。为了能创建以上的根文件系统,必须有一个空闲的、能够放下大约4M文件的RAMDISK。如果使用LILO控制启动,先检查一下LILO的配置文件/etc/lilo.conf中定义的RAMDISK的大小。/etc/lilo.conf 中有一行RAMDISK-SIZE = nnn ,它决定RAMDISK可使用的最大内存为nnn,缺省情况下为4096k,这样大的空间也就够了。但是,如果系统只有8M内存,千万不要使用4M的RAMDISK。最后检查一下系统设备中是否有一个叫/dev/ram0或/dev/ram的设备,这是RAMDISK的设备名,如果没有,用命令mknod创建一个设备/dev/ram0。

2.2 创建根文件系统

Linux内核识别两种可以直接拷贝到RAMDISK的文件系统:minix 和ext2,ext2性能更好。如果使用ext2,会发现使用-i选项定义比缺省更多的信息节点非常有用。mke2fs缺省情况下在1.44M的软盘上产生360个信息节点,使用压缩格式的根文件系统需要更多的信息节点,所以使用如下命令创建文件系统可以创建2000个信息节点,一般不会用完:

mke2fs -m 0 -i 2000 /dev/ram0。

mke2fs会自动判断设备容量的大小并相应的配置自身;-m 0参数防止它给root保留空间,这样会腾出更多的有用空间。接着把虚拟盘挂在节点/mnt上:

mount -t ext2 /dev/ram0 /mnt

如果没有节点/mnt,建一个。接着是创建目录。根文件系统最少应该有如下8个目录:/dev 设备;/proc 文件系统所需目录;/etc 系统配置文件;/sbin 重要的系统程序;/bin 基本应用程序;/lib共享函数库;/mnt装载其他磁盘节点;/usr附加应用程序。其中/proc,/mnt和/usr在此情况下都是空的,只需用mkdir创建它们即可,其余的目录应根据需要分别创建。

/dev:/dev中含有系统不可缺少的设备文件,虽然该目录很普通,可以用 mkdir创建,然而,目录中的设备文件必须用mknod创建,当然也有捷径,可以把现有系统中/dev的文件拷贝过来,然后删除不必要的文件。命令cp -dpR /dev /mnt会拷贝/dev整个目录,但不拷贝文件内容,dp开关保证链结文件仍然不变,不会拷贝链结所指原文件,而且属性不变。必须注意的是,每一个设备文件占用一个信息节点,而软盘上节点数是有限的,因此有必要删除没用的设备文件。例如,如果没有SCSI设备,删除所有的以sd开头的文件;如果不想使用串口设备,删除所有以cua开头的文件。不过记住,一定要保留console,kmem, mem, null, ram, tty1等文件。

/etc:这个目录中含有一些必不可少的系统配置文件,那么到底哪些文件是必需的,哪些可有可无呢?用命令ls ?ltru,该命令会根据最后使用日期反列一下目录/etc中的文件,如果一些文件很长时间没有被进入过,基本上可以从启动盘中删去。

我们制作的启动盘中含有15个配置文件,大致可分为3部分,它们都是启动盘中必须含有的文件:rc.d/* -- 系统启动脚本;fstab 列出要登录的文件系统;inittab 包含启动过程参数。rc应该包括:

#!/bin/sh

#!/bin/sh

/bin/mount -av

/bin/hostname yjy

fstab应包括:

/dev/ram0 / ext2 defaults

/dev/fd0 / ext2 defaults

/proc /proc proc defaults

inittab包括:

id:2:initdefault:

si::sysinit:/etc/rc

1:2345:respawn:/sbin/getty 9600 tty1

2:23:respawn:/sbin/getty 9600 tty2

整理系统所需文件包括:passwd 用户名和目录;group 用户组;shadow 用户加密密码。如果觉得这不安全,就把passwd和shadow删掉,这样只有root可以进入系统。偶尔使用的文件可根据实际情况选择。

/bin和/sbin:该目录中包含必不可少的应用程序,如ls, mv, cat,可根据需要选择,不过要记住包括以下程序:init, getty,login, mount,运行rc的外壳shell。

/lib: 该目录中包含有启动盘启动过程中所需要的共享函数库,如果缺少必须的函数库,系统会停止启动或出现一大堆错误信息,所以一定要注意。

2.3 模块

如果有一个模块化的内核,还必须考虑要加载的模块,它们都位于/lib/modules,可以把不是很重要的模块放到别的盘上,当系统启动后再加载,这样会节省启动盘的空间。

2.4 打包

一旦完成了上述工作,卸下虚拟盘,拷贝到一个文件中,然后压缩。

umount /mnt

dd if=/dev/ram0 bs=1k | gzip -v9 > rootfs.gz

压缩结束后,就拥有了一个压缩的根文件系统,不过应检查其大小,如果大了,还得去掉一些东西。

3 选择内核

在完成了制作压缩的根文件系统后,下一步就是选择或自己创建一个内核。多数情况下,可以拷贝现有系统的内核,但在有些情况下不得不自己另外创建一个。最可能出现的问题就是容量限制:如果想做单张的启动盘,盘中最大的文件往往是内核,所以必须设法压缩内核的体积。要想压缩内核体积,创建它时就得把不必要的功能去掉,如去掉对网络的支持和对不必要设备的支持。但是,一定要记住保留内核对RAMDISK和ext2的支持,否则启动盘将不能工作。还有就是要记住把对备份所用设备的支持加到内核中去,因为启动盘的最大用处就是检测和修复损坏的系统,如果没有把对备份设备的支持加到内核中,则无法修复损坏的系统,只能再重装Linux。创建新内核的方法这里就不叙述了,如有问题,请查阅相关资料。重建完内核后记住用“make zImage压缩内核。

4 系统整合

有了根文件系统和内核之后,最后的工作就是把它们整合在一起。先检查总文件的大小,如果超出1.44M,就得考虑重新创建他们或用两张磁盘。上述问题解决好后,接着就是确定是用LILO控制启动还是直接用拷贝到盘上的内核控制启动。用LILO的好处是能增加支持初始化硬件的参数到内核中,缺点是较复杂且占用珍贵的磁盘空间。下面分别介绍用内核控制启动和用LILO控制启动的过程。

用内核控制启动的方法如下:

cp zImage /dev/fd0 或 cat zImage > /dev/fd0

rdev -R /dev/fd0 0

rdev /dev/fd0 root-device

rdev -R /dev/fd0 0 能使根mount成read-write,否则启动后/是read-only的;rdev /dev/fd0 root-device中如用软盘做rootdisk,则应写成rdev /dev/fd0 /dev/fd0,用硬盘做为root,则应写成rdev /dev/fd0 /dev/hda1。这样做出的bootdisk,kernel从0道1扇区开始,所以无所谓文件格式。

LILO控制启动,首先就得写一个LILO配置文件,以下是一个最简单的配置文件,但是已经够用了。

boot =/dev/fd0

install =/boot/boot.b

map =/boot/map

read-write

backup =/dev/null

compact

image = KERNEL

label = Bootdisk

root =/dev/fd0

参数说明见相关资料。把上面的配置文件命名为hdlilo.conf。 

接下来就是创建一个内核文件系统。把一张干净的软盘插入软驱,在上面创建ext2 文件系统。

mke2fs -i 8192 -m 0 /dev/fd0 50

-i 8192表示每8192位创建一个信息节点。接着登录系统:

mount /dev/fd0 /mnt

rm -rf /mnt/lost+found

mkdir /mnt/{boot,dev}

删去目录/ lost+found,创建两个目录/boot和/dev。再拷贝现有系统到目录/dev中,

cp -R /dev/{null,fd0} /mnt/dev

接着拷贝启动加载器boot.b到目录/boot中,

cp /boot/boot.b /mnt/boot

最后,拷贝创建的配置文件lilo.conf和内核到内核文件系统的根目录下,

cp bdlilo.conf KERNEL /mnt

现在,根文件系统所需所有文件都准备就绪了,可以运行它了,运行结果应该没有错误,否则就应该仔细检查一下。接着设置内核镜像文件中的ramdisk的偏移量,以指出如何确定定位根文件系统。该指示词可通过命令rdev来设置,其内容含义如下:bits 0-10: ramdisk开始的偏移量, 在1024 byte数据块中;bits 11-13: 不用;bit 14: ramdisk加载的提示标记;bit 15: 加载根文件系统之前提示标记。如果位15被设置,当系统盘启动时将会提示你准备好另一张软盘,如果启动盘是两张的话,这个设置很有用。对于使用单张和两张启动盘的用户,ramdisk的偏移量是不同的:如果启动盘只有一张,那么压缩的根文件系统会被放置在内核之后,因此偏移量将会是第一个空闲的数据块,bit 14 应设置为1,bit 15设置为0。例如,如果启动盘根文件系统起始于数据块253(十进制),ramdisk偏移量应该是253 + 214 = 253+ 16384 = 16637。如果启动盘有两张,那么根文件系统起始于第二张盘的0数据块,所以偏移量是0,bit 14 应设置为1,bit 15应设置为1,最终值为214 + 215 = 49152。计算好偏移量后,用命令rdev -r进行设置,记住用十进制:

rdev -r /mnt/vmlinuz 偏移量设置完后,从/mnt卸下软盘。

最后一步是传输根文件系统,分两种情况:如果内核与根文件系统在同一张软盘上,用加选项seek的命令dd传输,dd if=rootfs.gz of=/dev/fd0 bs=1k seek=内核数据块数。如果根文件系统位于第二张软盘上,移走第一张软盘,插入第二张盘,然后传输根文件系统dd if=rootfs.gz of=/dev/fd0 bs=1k。启动盘已经做好了,剩下的就是测试启动盘的正确性了,如果有问题,要按上述步骤从头细仔地再做一遍。

5 结束语

Linux是为386(486)AT设计的操作系统,具备POSIX所有特性;同时它又是一个开放式的系统,任何用户都可为它开发相关的驱动程序和应用程序;其原代码也是公开的,用户可以很方便地从网上免费下载相关程序的原代码。Linux由于具有上述特性和优点,在国内被越来越多的用户接受和使用,并在其平台上开发各种应用程序,所以,制作一张高效的系统启动盘,对系统出现故障时进行快速恢复有着重要意义。

[参考文献]

1]Sohu Linux.http://202.198.162.121/linux/sohulinux.htm[OL].

2]Linux Kernel Newsgroup Archive.http://banyan.dlut.edu.cn/news/[OL].

3]Linux 中文资料.http://soft1.gz168.com/linuxdoc/source.html[OL].

4]黄庆生,吴振华,苏哲.Linux 基础教程[M].人民邮电出版社,1996.6.

5]Michael K. Johnson,Erik W.Troan. Linux Application Development[M]. AddisionWesley Longman Inc, 1998.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值