设为首页
广告联系
加为书签

ASP酷首页

技术教程

代码教程

程序下载

技术论坛

邮件专家

.NET教程

ASP.NET

导航
>> ASP酷首页-程序下载-申请BBS-免费代码教程 -LINUX专栏

全部专栏 ASP专栏
PHP专栏 JSP专栏
XML专栏 网页教程
SCRIPT 图形处理 LINUX专栏

技术教程
全部教程
ASP教程
ASP.NET教程
C#.NET教程
VB.NET教程
UML教程
PHP教程
JSP教程
EJB教程
XML教程
LINUX教程
Script脚本
网页教程
图形处理

技术讨论区
ASP论坛
ASP.NET论坛
C#技术论坛
XML论坛
VBVC论坛
网页制作论坛

动手制做自己的Linux启动盘（1）

作者： 飞鹰   www.ASPCool.com 时间:2000-5-30
0:47:44  阅读次数:8695

动手制做自己的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

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

（未完待续）

相关文章

前1篇 基于Linux的目录服务实现
前2篇 Squid -- Linux下的一个优秀代理服务器软件使用详解
前3篇 用FIPS为LINUX分区
前4篇 Linux中的字型(FONTS)设定

后1篇 如何为Linux添加软件详解
后2篇 LINUX的引导过程
后3篇 关于Linux下编写和编译程序的几个问题
后4篇 中文BluePoint Linux 1.0RC 版安装介绍(二)

发表评论
注册新用户

对该文的评论

返回首页  关闭窗口

导航
>> ASP酷首页-茶秀虚拟社区-申请BBS-免费代码教程- 申请留言板 - LINUX专栏

关于本站 － 广告联系 － 友情联接 － 使用说明 － 版权说明 － 联系方式

© 2003 版权所有 ASP酷技术网(www.ASPCool.com)
技术问题请到技术论坛。