Linux启动盘boot、root盘的制作

  SDADFDGFGGF ·  2008-01-21 19:38  ·  47946 次点击
boot/root盘由两部分组成,即核心和根文件系统。要把这两部分都放到一个1.44MB的软盘上去,通常要对内核和根文件系统进行压缩,压缩核心的最好方法是进行重新编译内核,将一些不必要的支持去掉,如对网络和其它周边设备的支持,重要的一点是记住内核必须支持RAMDISK及ext2,否则系统不能正常引导。关于内核的编译本文不再阐述,下面重点介绍如何生成根文件系统的压缩包。对于根文件系统的压缩包括两方面的问题,第一是只保留必要的根文件系统组件,第二是将根文件系统做成一个压缩包,类似于内核工作的原理。
(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控制系统启动。
为了能创建以上的根文件系统,你必须有一个空闲的能够放下大约4MB文件的RAMDISK。系统缺省情况下已替我们建好了一个大小为4096KB的RAMDISK,其设备名一般为/dev/ram0,我们就使用它来保存我们预先准备好的根文件系统。
(2)创建根文件系统
Linux内核识别两种可以直接拷贝到RAMDISK的文件系统,它们是minix和ext2,ext2性能更好。mke2fs缺省情况下在1.44M的软盘上产生360个信息节点,使用压缩格式的根文件系统需要更多的信息节点,所以使用如下命令创建文件系统可以创建2000个信息节点,而且一般不会用完。
mke2fs-m0-i2000/dev/ram0
mke2fs将会自动判断设备容量的大小并相应地配置自身,-m0参数防止它给root保留空间,这样会腾出更多的有用空间。接着把虚拟盘挂在节点/mnt上:
mount-text2/dev/ram0/mnt/floppy
接着是创建目录。根文件系统最少应该有如下8个目录:
/dev—设备
/proc—proc文件系统所需目录
/etc—系统配置文件
/sbin—重要的系统程序
/bin—基本应用程序
/lib—共享函数库
/mnt—装载其他磁盘节点
/usr—附加应用程序
执行如下命令创建这些目录:
#cd/mnt/floppy
#mkdirdevprocetcsbinbinlibmntusr
接下来的工作就是确定各个目录下的内容了:
/dev:/dev中含有系统不可缺少的设备文件。可以把现有系统中/dev的文件拷贝过来,然后删除不必要的文件。命令cp-dpR/dev/mnt会拷贝/dev整个目录但不拷贝文件内容,dp开关保证链接文件仍然不变,不会拷贝链接所指原文件,而且属性不变。如果你没有SCSI设备,删除所有的以sd开头的文件。如果你不想使用串口设备,删除所有以cua开头的文件。不过记住一定要保留console、kmem、mem、null、ram、tty1等文件。
/etc:这个目录中含有一些必不可少的系统配置文件。这下面的文件比较多,那么到底哪些文件是必需的,哪些可有可无呢?由于这下面的文件一般是一些文本文件,都不是很大,干脆全部保留算了。
我的启动盘中含有不到15个配置文件,大致可分为3部分:
rc.d/*—系统启动脚本
fstab—列出要登录的文件系统
inittab—包含启动过程参数
而且这些文件都是最简单的。rc应该包括:
#!/bin/sh
/bin/mount-av
/bin/hostnameyjy
fstab应包括:
/dev/ram0/ext2defaults
/dev/fd0/ext2defaults
/proc/procprocdefaults
inittab包括:
id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty9600tty1
2:23:respawn:/sbin/getty9600tty2
/bin和/sbin:该目录中包含有必不可少的应用程序,如ls,mv,cat,你可以根据自己的需要选择,不过一定要记住包括以下程序:init,getty,login,mount,运行你的rc的外壳shell。
/lib:该目录中包含有你的启动盘启动过程中所需要的共享函数库,如果缺少必须的函数库,系统会停止启动或出现一大堆错误信息,所以一定要注意。
几乎所有的程序都需要libc库,列一下目录/lib中的libc:
ls-l/lib/libc*
-rwxr-xr-x1rootroot4016683Apr1618:48libc-2.1.1.so*
lrwxrwxrwx1rootroot13Apr1012:25libc.so.6->libc-2.1.1.so*
libc.so.6的6表示版本号,它指向的文件才是你真正需要的。
查看每一个程序使用的函数库,用命令ldd,如:
ldd/sbin/mke2fs
libext2fs.so.2=>/lib/libext2fs.so.2(0x40014000)
libcom_err.so.2=>/lib/libcom_err.so.2(0x40026000)
libuuid.so.1=>/lib/libuuid.so.1(0x40028000)
libc.so.6=>/lib/libc.so.6(0x4002c000)
/lib/ld-linux.so.2=>/lib/ld-linux.so.2(0x40000000)www_bitscn_com
输出右边的库都是必须的,有的可能是链接文件。
在/lib目录下你还必须有函数库装载器,这个装载器或是ld.so(对a.out库)或是ld-linux.so(对ELF库)。新版本的ldd一般会告诉你所需库的装载器。
把装载器和库拷贝到/lib后,再仔细检查一遍,一定保证没有遗漏。
模块
如果你有一个模块化的内核,你还得考虑需要加载的模块,它们都位于/lib/modules,你可以把不是很重要的模块放到别的盘上,当系统启动后再加载,这样会节省启动盘的空间。
打包
一旦你完成了上述工作,卸下虚拟盘,拷贝到一个文件中,然后压缩。
umount/mnt
ddif=/dev/ram0bs=1k|gzip-v9>rfs.gz
压缩结束后,你就拥有了一个压缩的根文件系统,不过你得检查它的大小,如果大了,你还得删除一些东西。

0 条回复

暂无讨论,说说你的看法吧!

 回复

你需要  登录  或  注册  后参与讨论!