荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: lvyou (风雨同路卡拉Baby), 信区: Linux
标  题: 动手制做自己的Linux启动盘(1)
发信站: 荔园晨风BBS站 (Sat Feb  2 20:54:51 2002), 转信

动手制做自己的Linux启动盘(1)
作者: 飞鹰   www.ASPCool.com 时间:2000-5-30 0:47:44  阅读次数:1859

     动手制做自己的Linux启动盘(1)
  · 闫建勇·CPCW

  凡是接触计算机久的朋友肯定都使用过DOS启动软盘,至于启动软盘的重要性大家肯定也
都清楚。在Linux底下启动软盘同样重要,它不仅能测试新内核、恢复系统错误,而且能升
级重要的系统文件。但是在Linux下制做启动盘不象在DOS下那么容易,下面我就一步一步的
教大家制做自己系统的启动软盘。


  1. Linux启动过程简介

  一个启动盘实际上是一个完整系统的缩影,它能够执行一个完整系统的大部分功能。因此
,如果想制做Linux启动盘,你必须了解Linux系统启动的基本过程。接下来我就先简要介绍
一下Linux的启动过程。

  所有的PC机都是通过执行ROM中的代码加载启动盘的0柱面0扇区中的代码来启动整个系统
。在Linux系统中启动盘的0柱面0扇区中含有的是启动装载器LILO,它定位内核,装载它,
最后执行它。一旦内核装载后,它先是进行基本设备初始化,接着试图加载并登陆磁盘中根
文件系统,如果内核找不到可装载的根文件系统,启动过程会就此停止。如果根文件系统装
载完毕并登陆成功后,你会看到一行信息:

  VFS: Mounted root (ext2 filesystem) readonly.

  之后,系统发现init程序并执行它,init程序寻找它的配置文件/etc/inittab,并开始执
行其中的脚本,这些脚本是一些SHELL命令的组合,用来执行如下命令,如加载所需模块、
装载SWAP、初始化网络、装载fstab中列出的所有驱动器等。最后启动一个叫getty的程序,
它负责console和ttys之间的通信,它在显示器上打印login提示符并激活login程序,
login处理登陆的有效性并建立与用户的对话。至此,启动过程完毕。


  2. 制做启动盘

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

  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 -- 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/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可以进入系统。

  (3)偶尔使用的文件,可根据自己的实际情况选择。


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

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

  几乎所有的程序都需要libc库,列一下目录/lib中的libc:

  % ls -l /lib/libc*

  -rwxr-xr-x 1 root root 4016683 Apr 16 18:48 libc-2.1.1.so*

  lrwxrwxrwx 1 root root 13 Apr 10 12:25 libc.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)

  输出右边的库都是必须的,有的可能是链结文件。

  在/lib目录下你还必须有函数库装载器,这个装载器或是ld.so (对 a.out 库) 或是
ld-linux.so (对 ELF 库)。新版本的ldd一般会告诉你所需库的加载器。

  把装载器和库拷贝到/lib后,在仔细检查一遍,一定保证没有遗漏。

  2.3 模块

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

  2.4 打包

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

  umount /mnt

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

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


  (未完待续)



--

   ■◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆■
   ■   喜 欢 与 爱 之 间 的 路 上 我 等 着 你   ■
   ■◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆■

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 203.93.19.1]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店