电脑技术学习

The Linux Bootdisk HOWTO 中译版

dn001
作者:;Tom;Fawcett;(;fawcett+BH@croftj.net)

译者:;朱汉农;
v4.0,;April;2000,;翻译日期:;27;July;2000;


--------------------------------------------------------------------------------
本文描述如何设计与建造你自己的;Linux;boot/root;磁片。这些磁片能用来当做救援磁片;(rescue;disks);,或是能用来测试新系统元件;(components);。在企图建造你自己的;bootdisk;之前,你应该要相当熟悉系统管理工作。如果你只是想要一张紧急时使用的救援磁片,请参考;Pre-made;bootdisks;。;
--------------------------------------------------------------------------------

1.;前言;--;Preface
1.1;版本注意事项;--;Version;notes;
1.2;尚未完成的事;
1.3;回应与感谢;--;Feedback;and;credits;
1.4;散布政策;--;Distribution;policy;

2.;简介;--;Introduction

3.;Bootdisks与开机流程;--;Bootdisks;and;the;boot;process
3.1;开机流程;--;The;boot;process;
3.2;磁碟类型;--;Disk;types;

4.;建立一个root;filesystem;--;Building;a;root;filesystem
4.1;概观;--;Overview;
4.2;制作;filesystem;--;Creating;the;filesystem;
4.3;移植档案系统;--;Populating;the;filesystem;
4.4;对;PAM;与;NSS;的提供;--;Providing;for;PAM;and;NSS;
4.5;模组;--;Modules;
4.6;一些最後的细节;--;Some;final;details;
4.7;Wrapping;it;up;

5.;选择一个;kernel;--;Choosing;a;kernel

6.;把它们放在一起:制作磁片(组);--;Putting;them;together:;Making;the;diskette(s)
6.1;用;LILO;传送;kernel;--;Transferring;the;kernel;with;LILO;
6.2;不使用;LILO;来传送;kernel;--;Transferring;the;kernel;without;LILO;
6.3;设定ramdisk;--;Setting;the;ramdisk;word;
6.4;传送root;filesystem;--;Transferring;the;root;filesystem;

7.;问题解决;--;Troubleshooting,;or;The;Agony;of;Defeat

8.;其它各种主题;--;Miscellaneous;topics
8.1;减少;root;filesystem;的;size;--;Reducing;root;filesystem;size;
8.2;Non-ramdisk;root;filesystems;
8.3;建造一张工具磁片;--;Building;a;utility;disk;

9.;How;the;pros;do;it

10.;常见问题;(FAQ);列表;--;Frequently;Asked;Question;(FAQ);list
Appendix

11.;资源与指示;--;Resources;and;pointers
11.1;预先做好的;Bootdisks;--;Pre-made;Bootdisks;
11.2;救援套件;--;Rescue;packages;
11.3;LILO;--;the;Linux;loader;
11.4;Linux;FAQ;与;HOWTOs;
11.5;Ramdisk使用方法;--;Ramdisk;usage;
11.6;Linux开机流程;--;The;Linux;boot;process;

12.;LILO;boot;error;codes

13.;Root;filesystem;列表样本;--;Sample;root;filesystem;listings

14.;工具程式磁片;(utility;disk);目录列表样本;--;Sample;utility;disk;directory;listing

--------------------------------------------------------------------------------


--------------------------------------------------------------------------------

1.;前言;--;Preface

这份文件可能已经过期了。;如果标题页上的日期距今已超过;6;个月,那麽请查阅;Bootdisk-HOWTO;homepage;看看是否已有较新的版本。;

虽然本文以;text;格式也是可以阅读,但是因为印刷符号的关系,;最好;还是以;Postscript;(.ps);、;PDF;或;HTML;的格式来阅读。;


1.1;版本注意事项;--;Version;notes;

Graham;Chapman;是原本;Bootdisk-HOWTO;的作者,他一直提供支援到;version;3.1;。;Tom;Fawcett;大约是在;kernel;v2;问市时成为合作作者。他是本文目前的维护者。;

文中资讯是给在;Intel;平台上运作的;Linux;使用。其中许多资讯也许能应用在其它平台的;Linux;,但是我们并没有尝试在其它平台制作;bootdisk;,也没有相关的资讯。如果你有在其它平台上制作;bootdisk;的经验,请与我们联络。;


1.2;尚未完成的事;

有任何自愿者吗;?;


请描述;(或是链结到另一份有叙述的文件)如何制作其它可开机的类磁片物品,诸如;CDROMs,;ZIP;disks;与;LS110;disks;。;
请描述如何处理巨大的;libc.so;共享函式库。基本上可选择获取较旧、较小的函式库,或是删减现有的函式库。;
重新分析;distribution;bootdisks;与更新;"How;the;Pros;do;it";这一节。;
删减叙述关於如何升级现有;distribution;bootdisks;的章节。;This;is;usually;more;trouble;than;it's;worth.;
重写;/;润饰;Troubleshooting;这一节。;

1.3;回应与感谢;--;Feedback;and;credits;

我接受任何关於本文内容之回应,无论是好是坏。我/我们;已力求这份文件内的指令与资讯是正确而可靠的。如果你发现任何错误或遗漏,请让我知道。在撰写时,;请指出你所参考的文件之版本号码;。;

我们感谢许多协助修正与给予建议之人。他们的贡献使得本文比我们自己独立完成它时还来得更好。;

请各位利用上述的;email;地址,给予作者你的批评、指正与疑问。我不介意尝试回答任何问题,但是如果你有特定问题是关於你的;bootdisk;不能运作,那麽请先阅读;Troubleshooting;。;


1.4;散布政策;--;Distribution;policy;
Copyright;?;1995,1996,1997,1998,1999,2000;by;Tom;Fawcett;and;Graham;Chapman.;本文可以在;Linux;Documentation;Project;License;的条件下流通。如果你未能拿到此;license;,请与作者联络。;

本文是一份免费文件。我们发行它是希望它能有助於你,但是;不能给你任何保证;;本文也没有;具有商业能力;或;适合特定用途;的保证。;




--------------------------------------------------------------------------------


--------------------------------------------------------------------------------

2.;简介;--;Introduction

Linux;开机磁片;(boot;disks);在很多情况下是很有用的,诸如;

测试一个新的核心;(kernel)。;
从磁碟错误中复原;(这类错误从遗失开机磁区到磁碟读写头毁损都有可能);。;
修复一个瘫痪;(disabled);的系统;
安全地升级临界共用;(critical);的系统档案;(诸如;libc.so);。;
有好几种获得;boot;disks;的方法:;


使用发行套件;(distribution);像是;Slackware;所提供的。它至少能让你开机。;
使用救援套件;(package);建造用来做为救援磁片的磁片。;
学习每一种;disk;运作系统时所需的东西,然後自己制作。;
有些人选择最後一种方法,如此他们能靠自己动手做。这样子,如果某处发生问题,就能找出办法去解决问题。此外也可以学到很多有关;Linux;如何运作的知识。;

本文假设读者已熟悉基本的;Linux;系统管理观念。举例来说,你应该知道有关目录、;filesystems;与软碟片的议题。你也应该知道如何使用;mount;与;df;。你还应该知道;/etc/passwd;与;fstab;这两个档案的用途以及它们看起来像什麽。最後,你应该知道;HOWTO;文件内大部分的指令,都要以;root;的身份来执行。;

刚开始制作你自己的;bootdisk;是很复杂的。如果你未曾读过;Linux;FAQ;与相关文件,诸如;Linux;Installation;HOWTO;与;Linux;Installation;Guide;,那麽你不应该尝试建造开机磁片。如果你只需要紧急时用的;bootdisk;,下载一个别人事先完成的;bootdisk;拿来用会;更;为容易。请参考下面的;Pre-made;bootdisks;以得知在哪里可以找到这些东西。;



--------------------------------------------------------------------------------


--------------------------------------------------------------------------------

3.;Bootdisks与开机流程;--;Bootdisks;and;the;boot;process

bootdisk;基本上是放在软碟片内的一个小型而自足的;Linux;系统。它必须执行许多和完整又;full-size;的;Linux;系统相同的功能。在建造;bootdisk;之前,你应该了解基本的;Linux;开机流程。我们在此只做基本的介绍,但已足够让你了解本文之後的内容。很多细节与替代选项已被省略。;


3.1;开机流程;--;The;boot;process;

所有;PC;系统开始开机流程都是藉由执行;ROM;(明确地说,就是;BIOS);中的程式,从开机磁碟机的第;0;磁区、第;0;磁柱载入可供开机的磁区。开机磁碟机通常是第一台软碟机;(如;DOS;的;A槽;与;Linux;的;/dev/fd0)。接著;BIOS;会尝试执行这个磁区。在大部分可开机的;disks;上,第;0;磁区、第;0;磁柱包含以下两者之一:;


开机载入程式;(boot;loader;,如;LILO)的程式码,它会找出;kernel;所在位置,接著载入并执行它以启动开机程序。;
一个作业系统;kernel;的开头;(start);,诸如;Linux;。;
如果一个;Linux;kernel;已利用;raw-copied;的方式置入一张磁片内,那麽这张磁片的第一个磁区就是;Linux;kernel;本身的第一个磁区。这个磁区将从开机设备载入;kernel;的剩馀部分以继续开机流程。;

一旦;kernel;载入完毕,一些基本设备也完成初始化;(initialization);。然後系统将尝试从某个设备载入以及挂上;(mount);root;filesystem;。所谓的;root;filesystem;只是一个被挂上当作;``/'';目录的;filesystem;。;kernel;必须被告知可从哪里找到此;root;filesystem;;如果;kernel;在那里找不到一个可载入的影像档;(image);,系统就会停止运作;(halt);。;

在某些开机情况下;--;常常是从软碟片开机;--;root;filesystem;会被载入到;ramdisk;中,也就是被系统所存取的;RAM;,如同系统存取磁碟一般。为何系统会载入到;ramdisk;的理由有二。第一,;RAM;是几个比软碟片快的有序磁性体,所以系统在其上运作较快;;第二,;kernel;可以从软碟片载入一个;压缩的filesystem;并且在解压缩後放到;ramdisk;上,如此可让更多的档案储存在软碟片上。;

一旦;root;filesystem;被载入并挂上,你会看到一行讯息像:;

VFS:;Mounted;root;(ext2;filesystem);readonly.


此时系统会在;root;filesystem;上找到;init;程式;(;在;/bin;or;/sbin);并执行它。;init;读取它的组态设定档;(configuration;file);/etc/inittab;,找出档中标明;sysinit;的一行,并执行被指名的script。这个;sysinit;script;通常类似;/etc/rc;或;/etc/init.d/boot;这两个档。这个;script;是一组建立基本系统服务的;shell;指令,诸如:;


对所有磁碟执行;fsck,;
载入必备的核心模组;(modules),;
启动;swapping,;
进行网路初始化,;
将指定在;fstab;内的磁碟挂上。;
这个;script;常会启动其它各种不同的;scripts;执行模组的;(modular);初始化。举例来说,在一般的;SysVinit;架构下,;/etc/rc.d/;这个目录包含一个复杂的子目录架构,其中的档案指出如何启动与关闭大部分的系统服务。然而,在一张;bootdisk;上,这样的;sysinit;script;常常是非常简单的。;

当;sysinit;script;结束後,控制权回到;init;上,接著进入;预设的runlevel;,此预设的;runlevel;以;initdefault;这个关键字被指定在;inittab;内。此;runlevel;line;通常指定一个像;getty;的程式,这个程式负责处理;console;与;ttys;之间的通讯。事实上,就是;getty;程式在萤幕上印出熟悉的;``login:'';提示。;getty;程式并转而呼叫;login;程式以处理;login;是否有效,并於之後建立;user;sessions;。;


3.2;磁碟类型;--;Disk;types;

如果你已了解基本的开机流程,那麽我们现在可以定义所涉及到之各种不同类型的磁碟。我们将磁碟分类成四种。本文与在此讨论所称之;``磁碟;(disk)'';除非有特别声明,否则都是指软碟片,虽然绝大部分的讨论也同样可应用在硬碟上。;



boot
一张包含可被启动之;kernel;的磁片。这张磁片被用来启动;kernel;,接著这个;kernel;会载入在另一张磁片上的;root;file;system;。在;bootdisk;上的;kernel;通常必须被告知到哪去找它的;root;filesystem;。;

bootdisk;常会从另一张磁片载入一个;root;filesystem;,但是相反地,;bootdisk;也有可能被设定成载入硬碟的;root;filesystem;。一般在测试新;kernel;时会这样做;(事实上,;``make;zdisk'';会自动地从;kernel;的原始码制造出这样的一张;bootdisk;。;


root
在其;filesystem;上包含运作;Linux;系统必备档案的一张磁片。这张磁片不一定有;kernel;或;boot;loader;。;

一旦;kernel;被启动後,;root;disk;就可以独立於其它磁片来运作系统。通常;root;disk;的内容会被自动地;copy;到;RAM;而成为;ramdisk;。这使得;root;disk;的存取变得更为快速,而且可释放一台软碟机给工具程式磁片;(utility;disk)。;


boot/root
一张同时包含;kernel;与;root;filesystem;的磁片。换句话说,这张磁片包含不用硬碟而能启动与运作;Linux;系统之所有必备项目。这种磁片的优点在於简单轻便;--;每一项必备的东西都放在同一张磁片上。然而,随著档案;size;的逐渐增加,让所有东西都存在同一张磁片上就越显困难,甚至利用压缩也一样。;


utility
一张包含;filesystem;的磁片,但是并不是要挂上做为;root;file;system;来使用。这张磁片可视为额外的资料片;(data;disk);。你可以利用这种磁片把原本过多而不能放在;root;disk;上的工具程式放在其上。;

一般而言,当我们提及;``建造一张;bootdisk'';时,是指造出;boot;(;kernel;);与;root;(files);这两个部分。这两个部分不是放在一起;(一张单张的boot/root;disk);,就是两张分开的磁片;(boot;+;root;disks);。对救援磁片而言最具弹性之做法,可能是使用两张分开的;boot;与;root;磁片,再加上一张或多张的;utility;diskettes;以处理多出来的东西。;



--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

4.;建立一个root;filesystem;--;Building;a;root;filesystem

造出;root;filesystem;涉及选择能让系统正常运作所必备的档案。在这一节中,我们将叙述如何建造一个;压缩的;root;filesystem;。在磁片上建造一个直接挂上做为根目录;(root);之未经压缩的;filesystem;是较不普遍的观念;这个替代方案叙述在;Non-ramdisk;Root;Filesystem;这一节中。;


4.1;概观;--;Overview;

root;filesystem;必须包含支援完整;Linux;系统运作所需的每一个项目。为了能够达成这个目的,这张磁片必须包括能让;Linux;系统运作最起码;(minimum);的需求:;


基本的档案系统架构,;
最起码的目录:;/dev,;/proc,;/bin,;/etc,;/lib,;/usr,;/tmp,;
基本的工具程式:;sh,;ls,;cp,;mv,;etc.,;
最起码的组态设定档:;rc,;inittab,;fstab,;etc.,;
设备档:;/dev/hd*,;/dev/tty*,;/dev/fd0,;etc.,;
Runtime;函式库以提供工具程式所使用之基本功能;(functions);。;
当然,任何系统只有在你能於其上执行某些东西时才会显得有用,而一张;root;磁片通常只有在你能做到以下事情时才会显得有用:;


检查另一台磁碟机的;file;system;,举例来说,检查你硬碟上的;root;file;system;,你必须能够从另一台磁碟机启动;Linux;,例如你可以用一张;root;磁片办到这件事。然後你可以在你原本的;root;磁碟机未被挂上时,对其执行;fsck;。;
使用档案;(archive);与压缩工具程式,诸如;cpio,;tar,;gzip;与;ftape;,从备份;(backup);恢复储存所有或部分你原本;root;磁碟机的资料。;
我们将叙述如何建造一个;压缩的;filesystem;,就是平时被压缩在磁片上,只有当开机时,才会解压缩後存入ramdisk;。;用压缩;filesystem;的方式,你可以在一张标准的;1440K;磁片上放入很多档案;(大约;6;megabytes);。因为;filesystem;比磁片大很多,我们不能直接把它建在磁片上。我们必须在其它地方建立它,压缩它,然後再把它;copy;到磁片上。;


4.2;制作;filesystem;--;Creating;the;filesystem;

为了建造如此的一个;filesystem;,你需要一个多出而够大的设备,能够让你在压缩之前存放所有的档案。你将需要一个能够存放大约;4;megabytes档案的设备。有以下几种选择:;


使用;ramdisk;(DEVICE;=;/dev/ram0)。在这种情况下,记忆体被模拟成一台磁碟机。;Ramdisk;必须大到能够存放一个适当大小的;filesystem;。如果你使用;LILO;,请检查你的组态设定档;(/etc/lilo.conf);,找到一行像;
RAMDISK;=;nnn

这行决定可以分配给;ramdisk;的;RAM;之极大值。预设值是;4096K;,这应该是足够了。你应该不可能尝试在一台少於;8MB;RAM;的电脑上使用如此的;ramdisk;。;请检查以确认你有一个设备档像是;/dev/ram0,;/dev/ram;或是;/dev/ramdisk;。如果没有,请自己以;mknod;(major;number;1,;minor;0)造出;/dev/ram0;。;
如果你有一个未使用且够大的硬碟;partition;(差不多几megabytes大就可以了),就使用它吧。;
使用一个;loopback;device;,这可以把一个磁碟档案当做是一台设备来使用。使用;loopback;device;时,你可以在硬碟上造出一个;3;megabyte;的档案,并於其上建造;filesystem;。;键入;man;losetup;找寻指令以使用;loopback;devices;。如果你没有;losetup;,你可以从;ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/;目录中,;util-linux;套件;(package);内相容版本之;mount;与;unmount;的随附物中找到它。;如果在你的系统上没有;loop;device;档;(/dev/loop0,;/dev/loop1,;etc.),那麽你必须用;``mknod;/dev/loop0;b;7;0'';自己造出一个。一旦安装好这些特别的;mount;与;umount;二进位档,就请在一台容量够大的硬碟上造出一个暂存档;(temporary;file)(eg,;/tmp/fsfile);。你可以使用像这样子的指令:;
dd;if=/dev/zero;of=/tmp/fsfile;bs=1k;count=nnn;
以造出一个;nnn-block;的档案。;请使用自己的档名取代以下的;DEVICE;。当你下了;mount;指令,你同时要加上;``-o;loop'';选项以告知;mount;是使用;loopback;device;。;举例来说:;
mount;-o;loop;-t;ext2;/tmp/fsfile;/mnt

以挂上;loopback;device;的方式,把;/tmp/fsfile;挂上;/mnt;这个;mount;point;。用;df;指令可让你看到以上的结果。;
在你选择其中一种方法後,请准备;DEVICE;以:;

dd;if=/dev/zero;of=DEVICE;bs=1k;count=4096

这行指令送出一堆;0;把DEVICE填满。用;0;填满;device;是关键的一步,因为;filesystem之後将会被压缩,所以所有未使用的部分应被用;0;填满以达到最大的压缩比。无论何时你从你的;root;filesystem;删除档案,请记得这个事实。实际上;filesystem;只是释出;(de-allocate);这些;blocks;,;但是并没有再把它们填为;0;。如果你执行过很多次删除与;copy;的动作,你的压缩;filesystem;最後会比必要的大出很多。;

下一步就是造出;filesystem;。;Linux;kernel;承认两种能让;root;disks;自动地被;copy;到;ramdisk;上的;file;system;。它们是;minix;与;ext2;,其中;ext2;是比较受欢迎的。如果使用;ext2;,你会发现使用;-i;选项指定比预设值更多的;inodes;是有助益的;我们建议用;-i;2000;,这样你就不会用完;inodes;。如果不用上述选项,你可以移除许多不必要的;/dev;档案以节省;inodes;。;mke2fs;预设会造出;360;个;inodes在一张;1.44Mb;的磁片上。我发现在我目前的救援;root;磁片上,;120;个;inodes;是相当足够了,但是如果你把所有的设备档都放入;/dev;目录中,那麽你很容易会超过;360;个inodes;。使用压缩的;root;filesystem;可让你拥有较大的;filesystem;,同时预设会有更多的;inodes;,但是你仍然必须要不就是减少档案数量,要不就是增加;inodes;数目。;

因此,你所使用的指令看起来会像这样:;

mke2fs;-m;0;-i;2000;DEVICE

(如果你使用的是一个;loopback;device;,那麽请用你目前所用的磁碟档案替换掉上面的;DEVICE;。);

mke2fs;指令会自动地侦测可获得的空间,然後依据侦测对自身进行组态设定。;``-m;0'';参数避免保留空间给;root;,因此可提供更多可用的磁碟空间。;

下一步,挂上这个;device;:;


mount;-t;ext2;DEVICE;/mnt

(如果;mount;point;并不存在,你必须自行造出一个;mount;point;/mnt;。);在剩下的章节中,所有的目的;(destination);目录都被假设是相对於;/mnt;。;

4.3;移植档案系统;--;Populating;the;filesystem;

以下是你的;root;filesystem;最起码该有的目录;

此处所呈现之目录架构仅供;root;diskette;使用。真正的;Linux;系统有一套更为复杂且设计良好的架构方法,称为;Filesystem;Hierarchy;Standard;,它决定档案应该如何放置。;:;


/dev;--;里面存放设备档;(Devices);,为达成;I/O;工作所需;
/proc;--;Directory;stub;required;by;the;proc;filesystem;
/etc;--;里面存放系统组态设定档;
/sbin;--;重要的;(critical);系统二进位执行档;(binaries);
/bin;--;被认为是系统一部分的基本二进位执行档;
/lib;--;提供;run-time;支援的共享函式库;
/mnt;--;维护其它磁碟所用的磁碟挂入点;(mount;point);
/usr;--;额外的工具程式与应用程式;

上述目录的其中三个在;root;filesystem;上会是空的,所以它们只需要用;mkdir;造出来。;/proc;目录基本上是一个把;proc;filesystem;放置於其下的;stub;。;/mnt;与;/usr;这两个目录只是在;boot/root;系统运作时所使用的;mount;points;。因此再重覆一次,这些目录只需要被造出来就可以了。;

剩下的四个目录描述於以下各节。;


/dev


/dev;目录包含一群特别的档案,这些档案是给系统上所有设备使用的,这样的;/dev;目录每个;Linux;系统都一定会有。这个目录本身是一个普通目录,可以以一般的方法用;mkdir;造出来。然而,这些特别的档案必须以特别的方法用;mknod;指令造出来。;

但还是有一条捷径;--;直接;copy;你现有;/dev;目录的内容,然後再清除你不想要的设备档。唯一的要求是;copy;这些特别的设备档时,要用;-R;选项。这个选项会;copy;整个目录中的档案,但是不会;copy;这些档案的内容。请确定使用;大写字母;R;。这个指令是:;

cp;-dpR;/dev;/mnt

在此我们假设磁片是被挂在;/mnt;底下。;dp;选项;(switches);确保;symbolic;links;是以;links;的方式来;copy;,而不是;copy;链结档所指向的;target;file;,同时原本的档案属性也被保留,因此保留了档案的所有权资讯。;

如果你想要用高难度技巧完成这个任务,就利用;ls;-l;列出你想要的设备档之;major;与;minor;device;numbers;,然後再用;mknod;在磁片上造出它们。;

无论如何;copy;这些设备档,还是要检查任何你所需之设备档;(device;special;file);是否已放入这张救援磁片中。举例来说,;ftape;使用磁带设备,如果你想要从;bootdisk;存取软式磁带机,你就需要;copy;所有有关的设备档。;

请注意,每一个设备档需要一个;inode;,但;inodes;一直都是稀少的资源,特别是在磁片;filesystems;上。因此,从磁片上的;/dev;目录移除任何你所不需要的设备档是有意义的。举例来说,如果你没有;SCSI;磁碟,你可以放心地移除所有以;sd;开头的设备档。同样地,如果你并不想使用你的序列埠;(serial;port);,那麽你也可以移除所有以;cua;开头的设备档。;

请确定从这个目录放入了以下档案的:;console,;kmem,;mem,;null,;ram0;and;tty1.;


/etc

这个目录包含了重要的组态设定档。在大部分的系统上,这些档案被分为三个群组:;


一直都是必备的,;e.g.;rc,;fstab,;passwd;。;
可能是必备的,但是没有人能十分确定。;
偷跑进来的垃报。;
通常可以用以下指令识出哪些是非基本的档案:;


ls;-ltru

这个指令将档案依据上次被存取的日期,以先早後晚;(reverse);的顺序列出,所以如果有任何档案不会被存取,那麽它们就可以从;root;磁片中删去。;

在我的;root;磁片上,我的组态档数目已减至;15;个。这可减少我处理以下三种档案的工作:;


我必须为;boot/root;系统进行组态设定的档案:;
rc.d/*;--;系统启动与改变;run;level;的;scripts;
fstab;--;要被挂上的;file;systems;清单;
inittab;--;给;init;process;的参数,於开机时启动的第一个;process;。;
我们应该为;boot/root;系统整理的档案:;
passwd;--;重要的使用者、;home;目录等其它项目的清单。;
group;--;使用者群组。;
shadow;--;使用者的密码。你可能没有这个档。;
termcap;--;the;terminal;capability;database.;
如果系统安全;(security);对你很重要,那麽;passwd;与;shadow;应该被删减,以避免将使用者密码;copy;出系统,这样当你从磁片开机时,不想要的;logins;会被拒绝。;请确定;passwd;至少包含了;root;。如果你要让其他的使用者;login;,请确定他们的;home;目录与;shells;都存在。;termcap;,终端机资料库,一般而言有几百个;kilobytes;。你;boot/root;磁片的版本应该被删减到只包含你所使用的终端机,这通常就是;linux;或;linux-console;项目;(entry);。;
The;rest.;They;work;at;the;moment,;so;I;leave;them;alone.;
Out;of;this,;我实际上只必须设定两个档,而它们所应包含的项目惊人地少。;

rc;应该包含:;
#!/bin/sh
/bin/mount;-av
/bin/hostname;Kangaroo

请确定上述的目录都是正确的。你并不需要真地去执行;hostname;--;如果你执行只是让系统比较好看;(译注:如此系统会有个名字);。;
fstab;应该至少要包含:;
/dev/ram0;;;;;;;/;;;;;;;ext2;;;;defaults
/dev/fd0/;;;;;;;ext2;;;;defaults
/proc;;;/proc;;;proc;;;;defaults

你可以从你现存的;fstab;copy;你想要的项目,但是你并不应该自动地挂上你硬碟任何的;partitions;;请对这些项目使用;noauto;关键字;(译注:用;noauto;代替;default;);。当使用;bootdisk;时,你的硬碟可能是早已损坏或挂了。;
你的;inittab;应该被改变,以使其中;sysinit;这行能执行;rc;或无论什麽将被执行的基本开机;script;。同时,如果你想要确保不可从序列埠;login;,请在所有行尾包括;ttys;或;ttyS;的;getty;项目前加上「#」符号;(comment;out);。请保留;tty;埠以让你可以在;console;前;login;。;

一个最起码的;inittab;档看起来样这样:;

id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty;9600;tty1
2:23:respawn:/sbin/getty;9600;tty2

inittab;档定义了系统在各种不同的情况中将执行什麽项目,包括;startup;、切换至多使用者模式等等。请仔细地检查在;inittab;中被提及的档案名称;(filenames);;如果;init;不能找到所提及的程式,那麽;bootdisk;将会停止运作,而你甚至不会得到错误讯息。;


请注意,某些程式不能被移到其它地方,因为其它程式已在撰写时,就把它们的档案位置写死了;(hardcode);。举例来说在我的系统上,;/etc/shutdown;已把;/etc/reboot;的位置写死在其中。如果我移动了;reboot;到;/bin/reboot,然後下达一个;shutdown;指令,将会因为找不到;reboot;档而发生错误。;


剩下来的,就是;copy;在你;/etc;目录中的所有文字档;(text;files);,再加上在你;/etc;目录中,你无法确定你需不需要的所有可执行档。需要指示;(guide);者,请参考在;Sample;roodisk;directory;listings;的样本清单。也许只要;copy;这些档案就足够了,但是系统差异会有很大的影响,所以你无法确定你系统上相同的档案组合,就一定等於清单中的档案。唯一确定的方法就是从;inittab;著手,并找出需要什麽。;

现在大部分的系统使用;/etc/rc.d/;目录,其中包含给不同;run;levels;的shell;scripts;。最起码会有一个单一的;rc;script,但是仅从你现存的系统;copy;inittab;与;/etc/rc.d;这两个目录,然後删减;rc.d;目录中的;shell;scripts;以移除和磁片系统环境无关的;processing;,会是较为简单的做法。;


/bin;与;/sbin

/bin;目录是一个放置为了执行基本作业;(operations);而所需之额外工具程式的方便好地方,这些工具程式诸如;ls,;mv,;cat;与;dd;。;bin/;与;/sbin;这两个目录的档案清单□例请见;Sample;rootdisk;directory;listings;。但□例中并没有包括任何从备份复原时所需之工具程式,诸如;cpio,;tar;与;gzip;。这是因为我把这些东西放在另一张;(separate);工具程式磁片上,以节省;boot/root;磁片的空间。一旦;boot/root;磁片被开机启动,就会被;copy;到;ramdisk;并释放软碟机,让软碟机能挂上另一张磁片,就是工具程式片。我通常把它挂上当做;/usr;。;

工具程式磁片;(utility;diskette);的制作被描述在下面;Building;a;utility;disk;这节。保留一份相同版本之备份用工具程式的copy是比较好的,这个备份用工具程式被用来制作备份,如此你就不用浪费时间在尝试安装不能读取你备份磁带的版本。;

请确定你包括了以下程式:;init,;getty;或相等的程式,;login,;mount,;某种可以执行你rc;scripts;的;shell,;以及一个从;sh;指向这个;shell;的;link;。;



/lib

在;/lib;中,你要放入必要的共享函式库;(libraries);与载入程式;(loaders);。如果无法在你的;/lib;目录中找到必要的函式库,那麽系统将不能够开机。如果你很幸运,你可能会看到告诉你为什麽会发生如此情况的错误讯息。;

近来每一个程式至少都要求;libc;函式库,;libc.so.N;,其中;N;是目前版本的编号。请检查你的;/lib;目录。;Libc.so.N;通常是一个;symlink;,它指向一个具有完整版本编号的档名:;


%;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-2.1.1.so;。为了找到其它函式库,你应该要看过所有你打算包括的二进位档,并且用;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)

在右手边的每一个档案是一定要有的。有些档案可能是一个;symbolic;link;。;
请注意某些函式库;相当地大;,而且并不能轻易地配合你的;root;filesystem;。举例来说,上述的;libc.so;大约有;4;megabytes;。因此,在你;copy;它们到你;root;filesystem;的同时,你可能需要除去一些函式库。请看;Reducing;root;filesystem;size;这一节以了解;instructions;。;


在;/lib;内,你也必须包括一个;loader;供这些函式库使用。这个;loader;不是;ld.so;(给;A.OUT;函式库使用),就是;ld-linux.so;(给;ELF;函式库使用)。较新版的;ldd;会如同上述的例子,正确地告诉你需要哪一种;loader;,然而旧版的就不会。如果你并不确定你需要哪一种;loader;,就对函式库执行;file;指令。举例来说:;

%;file;/lib/libc.so.4.7.2;/lib/libc.so.5.4.33;/lib/libc-2.1.1.so
/lib/libc.so.4.7.2:;Linux/i386;demand-paged;executable;(QMAGIC),;stripped
/lib/libc.so.5.4.33:;ELF;32-bit;LSB;shared;object,;Intel;80386,;version;1,;stripped
/lib/libc-2.1.1.so:;ELF;32-bit;LSB;shared;object,;Intel;80386,;version;1,;not;stripped

QMAGIC;指出;4.7.2;版是给;A.OUT;函式库使用,而;ELF;指出;5.4.33;以及;2.1.1;版是给;ELF;使用。;
请;copy;你所需要的指定;loader(s);到你所建立的;root;filesystem;。针对所包括的二进位档,函式库与;loaders;应该被;仔细地检查;。如果;kernel;不能载入所需的函式库,那麽;kernel;就会在没有错误讯息的情况下停止运作。;


4.4;对;PAM;与;NSS;的提供;--;Providing;for;PAM;and;NSS;

你的系统可能会需要动态地载入未被;ldd;所见的函式库。如果你没有提供函式库给这些项目,那麽你会在登录;(log;in);或使用你的;bootdisk;时遭遇到困难。;


PAM;(Pluggable;Authentication;Modules)

如果你的系统使用;PAM;(Pluggable;Authentication;Modules);,那麽你必须在你的;bootdisk上为;PAM;做一些预备。简而言之,;PAM;是一种复杂精密的模组化方法,针对使用者认证以及控制使用者对服务的存取。一个决定你的系统是否使用;PAM;的简单方法,是对你的;login;可执行档执行;ldd;;如果输出包括;libpam.so;,你就需要;PAM;。;

幸运地,安全性通常并非;bootdisk;所关心的议题,因为任何对机器有实际存取权的人,通常能做任何他们无论如何想做的事。因此,你可以有效地关闭;PAM;,只要在你的;root;filesystem;造出一个简单的;/etc/pam.conf;档,这个档看起来像这样:;



--------------------------------------------------------------------------------

OTHER;;;auth;;;;;;;optional;;;;;/lib/security/pam_permit.so
OTHER;;;account;;;;optional;;;;;/lib/security/pam_permit.so
OTHER;;;password;;;optional;;;;;/lib/security/pam_permit.so
OTHER;;;session;;;;optional;;;;;/lib/security/pam_permit.so


--------------------------------------------------------------------------------

请记得也;copy;/lib/security/pam_permit.so;这个档到你的;root;filesystem;。这个函式库只有大约;8K;,因此它只占用极小量的;overhead;。;

请记得这个组态设定允许任何人对这台机器上的档案以及服务有完整的存取权。如果你因某种理由而在乎你;bootdisk;的安全性,那麽你就必须;copy;一些或是全部你硬碟的;PAM;setup;到你的;root;filesystem;。请确定曾仔细地读过;PAM;文件,并且;copy;任何在;/lib/security;中所需要的函式库到你的;root;filesystem;上。;

你同时必须包含;/lib/libpam.so;到你的;bootdisk;上。但是你已知这件事,因为你已对;/bin/login;执行过;ldd;,这动作显示了其相依性。;


NSS;(Name;Service;Switch)

如果你正使用;glibc;(aka;libc6);,你就必须为名称服务;(name;switch);进行预备,否则你会无法;log;in;。;/etc/nsswitch.conf;这个档案控制资料库对各式服务之搜寻;(lookups);。如果你并不打算从网路上存取服务;(比如说:;DNS或;NIS;搜寻),那麽你只需要准备一个简单的;nsswitch.conf;档,这个档案看起来像这样:;



--------------------------------------------------------------------------------

passwd:;;;;;files
shadow:;;;;;files
group:;;;;;;files
hosts:;;;;;;files
services:;;;files
networks:;;;files
protocols:;;files
rpc:files
ethers:;;;;;files
netmasks:;;;files
bootparams:;files
automount:;;files
aliases:;;;;files
netgroup:;;;files
publickey:;;files


--------------------------------------------------------------------------------

这样就指定每一项服务只被;local;files;提供。你同时需要包括;/lib/libnss_files.so.X;,在此;X;是;1;的话是指;glibc;2.0;,而;2;的话是指;glibc;2.1;。这个函式库将被以动态方式载入以处理档案搜寻。;

如果你打算从你的;bootdisk;存取网路,那麽你会想要制作一个更精巧复杂的;nsswitch.conf;档。细节请参考;nsswitch;man;page。最後,请记得你必须为你所指定的每一项;服务;(service);,把;/lib/libnss_service.so.1;档放入;bootdisk;中。;


4.5;模组;--;Modules;

如果你有一个模组化的;kernel;,你必须考量在开机後,你想要从你的;bootdisk;上载入哪一种模组。你可能会想要包括;ftape;与;zftape;模组;(如果你的备份磁带是floppy;tape),以及给;SCSI;设备用的模组;(如果你有;SCSI;设备),也可能是;PPP;或;SLIP;支援的模组;(如果你在紧急情况下想要存取网路)。;

这些模组可能会被放在;/lib/modules;。你同时也应该包括;insmod,;rmmod;与;lsmod;。根据你是否想要自动地载入模组,你可能也要包括;modprobe,;depmod;与;swapout;。如果你使用;kerneld,请与;/etc/conf.modules;一起包括进来。;

然而,使用模组的主要优点在於你可以把非关键;(non-critical)模组移到;utility;disk;上,在需要用到时才载入,这样在你的;root;disk;上会使用比较少的空间。如果你要处理许多不同的设备,这个方法比建立一个内建支援许多设备的巨大;kernel;来得好。;

请注意,为了启动;(boot);一个压缩的;ext2;filesystem;,你必须有;ramdisk;与内建;ext2;支援。;它们不能够以模组的方式被提供。;


4.6;一些最後的细节;--;Some;final;details;

某些系统程式,诸如;login;,当;/var/run/utmp;档与;/var/log;目录不存在时,会发出警告。所以:;


mkdir;-p;/mnt/var/{log,run{
touch;/mnt/var/run/utmp

最後,在你设定;(set;up);完所有你所需的函式库後,执行;ldconfig;以在;root;filesystem上重新制作;(remake);/etc/ld.so.cache;。这个;cache;会告诉;loader;到哪里找到函式库。要重新制作;ld.so.cache,请下达以下指令:;

chdir;/mnt;;chroot;/mnt;/sbin/ldconfig


chroot;是必要的,因为;ldconfig;总是会为;root;filesystem;重新制作;cache;。;


4.7;Wrapping;it;up;

一旦你完成;root;filesystem;的建构工作,就;unmount;它,将之;copy;成一个档案并压缩它:;

umount;/mnt
dd;if=DEVICE;bs=1k;|;gzip;-v9;>;rootfs.gz

结束後,你会有一个名为;rootfs.gz;的档案,这就是你被压缩过的;root;filesystem。你应该检查它的;size;以确保它能放在一张软碟片上;如果不行,你就必须回溯并移除一些档案。;Reducing;root;filesystem;size;这节有一些提示,告诉你有关减少;root;filesystem;的;size;。;



--------------------------------------------------------------------------------


--------------------------------------------------------------------------------

5.;选择一个;kernel;--;Choosing;a;kernel

现在,你已有一个完整的被压缩过的root;filesystem。下一步是要建立或是选择一个;kernel;。在大部分的情况下,;copy;你目前所使用的;kernel;并且从它启动软碟片是可能的。然而,会有一些情况,你会希望建立一个独立的;(separate);kernel;。;

理由之一是;size;的考量。如果你正建立一张单一的;boot/root;磁片,;kernel;将会是磁片上最大的档案之一,也因此你必须尽可能地减少;kernel;的;size;。为了减少;kernel;size;,请用能支援所想要的系统之必要最起码的设备来建立;kernel;。这是指丢去你所不想要的每一项。网路功能是可以丢去的好选择,另外还有当运作你的;boot/root;filesystem;时,任何你所不需要的磁碟机与其它设备的支援。如同前述,你的;kernel;必须有;ramdisk;与;ext2;支援内建於其中。;

如果你已完成一套最起码的;(minimum);设备组合以便於将之放入;kernel;中,那麽接下来你需要开始进行要把什麽加入回来。或许一套;boot/root;磁片组之最常见用途,是为了要能检查与回复;(restore);一个已损毁的;root;file;system;,而为了达成这个目标,你需要;kernel;的支援。举例来说,如果你的备份都放在磁带上,并使用;Ftape;存取你的磁带机,那麽,如果你失去了你目前的root;drive与含有;Ftape;的;drive;,你将不能够从你的备份磁带进行回复储存。你将必须重新安装;Linux;,下载并重装;ftape;,然後试著读取你的备份。;

此处的要点是,无论你已加入什麽;I/O;支援到你的;kernel;内以支援备份,你同时也应该把它们加入到你的;boot/root;kernel;中。;


实际建造;kernel;的程序详述在随附於;kernel;的文件中。你可以轻易地照著指示进行,所以可以;/usr/src/linux;为起点。如果你在建造;kernel;上有困难,你或许不应该企图不择手段地建造;boot/root;systems;。请记得用;``make;zImage''压缩;kernel;。;



--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

6.;把它们放在一起:制作磁片(组);--;Putting;them;together:;Making;the;diskette(s)

进行到这里,你已经有一个;kernel;与一个压缩的;root;filesystem;。如果你正在制作一张;boot/root;磁片,请检查它们的;size;,以确定它们都能放在同一张磁片上。如果你正在制作一套两张磁片的;boot;+;root;磁片组。请检查;root;filesystem;以确定它能放在一张磁片上。;

你应该决定是否使用;LILO;以启动;bootdisk的;kernel;。替代的方法是直接把;kernel;copy;到磁片上,然後不使用;LILO;开机。使用;LILO;的好处在於让你能够提供一些参数给;kernel;,这些参数对初始化硬体来说可能是必要的(请检查你系统上的;/etc/lilo.conf;档。如果这个档存在,而且有一行像``append=...'',你可能需要这个特点;(feature))。使用;LILO;的缺点在於建造;bootdisk;变得更为复杂,并且占用稍嫌较多的空间。你将必须设定一个小型而独立的;filesystem;,我们称之为;kernel;filesystem,在其中你传送;kernel;以及一些;LILO;所需的其它档案。;


如果你将要使用;LILO;,请继续读下去;如果你要直接传送;kernel;,先跳过此,直接到;Without;using;LILO;这一节。;


6.1;用;LILO;传送;kernel;--;Transferring;the;kernel;with;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


--------------------------------------------------------------------------------
关於这些参数的说明请看;LILO's;user;documentation;。你或许也会想从你硬碟上的;/etc/lilo.conf;档,加入一行;append=...;到这个组态档中。;
把这个组态档存成;bdlilo.conf;。;

现在你必须制作一个小型的档案系统,我们称之为;kernel;filesystem;,有别於;root;filesystem;。;

首先,指出这个;filesystem;应该会有多大。用;blocks;计算你;kernel;的;size;(这个;size;用;``ls;-l;KERNEL'';显示出来,是被;1024;所除并强迫进位),然後加;50;。这个;50;blocks;是估计的空间,为;inodes;与其它档案所需。如果你想要,你可以精确地计算这个数字,或是就用;50;就好了。如果你正在制作两张磁片的磁片组,你会高估这个空间,因为无论如何第一张磁片只给;kernel;使用。我们称这个数字会;KERNEL_BLOCKS;。;

请把软碟片放入软碟机;(为求简便,我们假设是;/dev/fd0),然後在其上制作;ext2;kernel;filesystem;。;

mke2fs;-i;8192;-m;0;/dev/fd0;KERNEL_BLOCKS

``-i;8192'';指定我们想要每;8192;bytes;一个;node;。接下来,;mount;这个;filesystem;,移除;lost+found;目录,然後为;LILO;造出;dev;与;boot;这两个目录:;

mount;/dev/fd0;/mnt
rm;-rf;/mnt/lost+found
mkdir;/mnt/{boot,dev}

再来,造出设备档;/dev/null;与;/dev/fd0;。不用寻找设备号码,你只要从你的硬碟上用;-R;copy它们:;

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

LILO;需要一份它的;boot;loader;的;copy;,;boot.b;,你可以从你的硬碟得到它。它通常是放在;/boot;目录内。;
cp;/boot/boot.b;/mnt/boot

最後,随附你的;kernel;,;copy;你在上一节所编写的;LILO;组态档。它们两者可以被放在根目录下。;
cp;bdlilo.conf;KERNEL;/mnt

LILO;所需的每一项现在都在;kernel;filesystem上,所以你已准备好去执行它。;LILO;的;-r;旗号(flag)被用作安装;boot;loader;在某个其它的;root;上:;
lilo;-v;-C;bdlilo.conf;-r;/mnt

LILO;应该可以在无错的情况下执行,在此之後,你可以看看你的;kernel;filesystem;,应该长得像这样:;


--------------------------------------------------------------------------------

total;361
1;-rw-r--r--;;;1;root;;;;;root;;176;Jan;10;07:22;bdlilo.conf
1;drwxr-xr-x;;;2;root;;;;;root;1024;Jan;10;07:23;boot/
1;drwxr-xr-x;;;2;root;;;;;root;1024;Jan;10;07:22;dev/
358;-rw-r--r--;;;1;root;;;;;root;;;;;;;362707;Jan;10;07:23;vmlinuz
boot:
total;8
4;-rw-r--r--;;;1;root;;;;;root;3708;Jan;10;07:22;boot.b
4;-rw-------;;;1;root;;;;;root;3584;Jan;10;07:23;map
dev:
total;0
0;brw-r-----;;;1;root;;;;;root;;;;;;;2,;;;0;Jan;10;07:22;fd0
0;crw-r--r--;;;1;root;;;;;root;;;;;;;1,;;;3;Jan;10;07:22;null;


--------------------------------------------------------------------------------


如果档案;size;和你自己的;filesystem;有稍微不同,请不用担心。;

现在请把磁片留在软碟机内,然後前进到;Setting;the;ramdisk;word;这一节。;


6.2;不使用;LILO;来传送;kernel;--;Transferring;the;kernel;without;LILO;

如果你;不;使用LILO,那麽就用;dd;指令来传送;kernel;给;bootdisk;:;

%;dd;if=KERNEL;of=/dev/fd0;bs=1k
353+1;records;in
353+1;records;out

在这个例子中,;dd;写入了;353;个完整记录(records);+;1个partial;record;,所以;kernel;占用了;354;个软碟片的;blocks;。这个数字称为;KERNEL_BLOCKS;,请记得它,这个数字要给下一节使用。;

最後,请设定;root;device;为软碟片自己,然後再设定;root;要被载入成;read/write;:;

rdev;/dev/fd0;/dev/fd0
rdev;-R;/dev/fd0;0


在第二个;rdev;指令中,请小心地使用;-R;。;


6.3;设定ramdisk;--;Setting;the;ramdisk;word;

在;kernel;image内的是;ramdisk;word;,它伴随其它选项,指定了;root;filesystem;应该在哪里被找到。这个;word;会被以;rdev;指令,来进行存取与设定,而它的内容被解释如下:;


bits;;0-10:;;;;;Offset;to;start;of;ramdisk,;in;1024;byte;blocks
bits;11-13:;;;;;unused
bit;;;;;14:;;;;;Flag;indicating;that;ramdisk;is;to;be;loaded
bit;;;;;15:;;;;;Flag;indicating;to;prompt;before;loading;rootfs

如果;bit;15;被设定,在开机时;(boot-up);,会提示你把一张新的软碟片放入软碟机中。这对一套双磁片的开机磁片组来说是必要的。;

依据你是建造一张单一的;boot/root;磁片,还是两张;"boot;+;root";的磁片组,这里会产生两种情况。;


如果你是建造一张单一磁片,压缩的;root;filesystem;会被放置在;kernel;之後,所以;offset;会是第一块;free;block;(这个值应该会与;KERNEL_BLOCKS;相等);。;Bit;14;会被设定为;1;,而;bit;15;会被设定为;0;。;举例来说,假设你正建造一张单一磁片,而;root;filesystem;将自;block;253;(10进位)开始。那麽,;ramdisk;word;值应该是;253;(10进位);,;bit;14;设为;1;而;bit;15;设为;0;。要计算这个值,你可以简单地加一加这个;10;进位数字。;253;+;(2^14);=;253;+;16384;=;16637;。如果你并不十分了解这个数字从何而来,把这数字放到工程计算机上,然後把它转换为;2;进位,;
如果你建造的是一套双磁片组,那麽;root;filesystem;将自第二张磁片的;block;0;开始,所以;offset;为;0;。;Bit;14;设为;1;而;bit;15;设为;1;。在这个情况下,;10;进位值是;2^14;+;2^15;=;49152;。;

在仔细地为;ramdisk;word;计算後,请用;rdev;-r;设定它。请注意要使用;10;进位;值。如果你使用;LILO;,传给;rdev;的引数在此应该是;mounted;kernel;path;,比如说;/mnt/vmlinuz;如果你用;dd;来;copy;kernel;,替换成使用软碟机名称(;比如说;/dev/fd0)。;

rdev;-r;KERNEL_OR_FLOPPY_DRIVE;;VALUE

如果你使用;LILO;,现在请把磁片;unmount;。;


6.4;传送root;filesystem;--;Transferring;the;root;filesystem;

最後一步是要传送;root;filesystem;。;


如果;root;filesystem;将被放置在做为;kernel;之;相同;磁片上,请使用;dd;指令及其;seek;选项传送它,这会指定要跳过多少个;blocks;:;
dd;if=rootfs.gz;of=/dev/fd0;bs=1k;seek=KERNEL_BLOCKS

如果;root;filesystem;会被放置在;第二张;磁片上,请自磁碟机中拿走第一张软碟片然後放入第二张磁碟片,接著将;root;filesystem;传送到其上:;
dd;if=rootfs.gz;of=/dev/fd0;bs=1k

恭喜你,已经完成了!;

在把;bootdisk;挪为紧急使用之前,请记得先测试它;!如果你的成品不能执行,请继续读下去。;



--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

7.;问题解决;--;Troubleshooting,;or;The;Agony;of;Defeat

当建造;bootdisks;时,开始的几次尝试结果常常是无法开机。建造一张;root;disk;的一般方法是组合来自你现有系统的元件;(compnents);,接著尝试与得到这个以磁片为基础的系统;(diskette-based;system);,直到它在;console;上显示讯息。一旦它开始与你交谈,这场战斗就结束一半了,因为你可以了解它在抱怨什麽,而且你可以解决个别的问题直至系统能平顺地运作。如果系统停止运作而没有任何说明,要找到这原因会是一件困难的事。为了让系统能启动到能与你交谈的阶段,这需要使用到好几种元件,而且这些元件要经过正确地组态。以下是调查系统无法与你交谈之问题的建议程序:;


你会看到一行讯息像这样:;
kernel;panic:;VFS:;Unable;to;mount;root;fs;on;XX:YY

这是常见的问题,而它只有一些原因。首先,请根据;device;code;清单检查;device;XX:YY;;它是正确的;root;device;吗;?如果不是,那你可能没有做过;rdev;-R;,或者是你是对错误的;image;执行rdev;-R。如果;device;code;是正确的,那麽请仔细地检查被编译到你;kernel;内的;device;驱动程式。请确定它有内建软碟片、;ext2;filesystem;支援。;
如果你看到许多错误讯息像是:;
end_request:;I/O;error,;dev;01:00;(ramdisk),;sector;NNN

这是;ramdisk;driver;所报告的;I/O;错误讯息,可能是因为;kernel;正尝试写入超越了设备的结尾。你的;ramdisk;因为太小而不能持有你的;root;filesystem;。请检查你的;bootdisk;kernel;的初始化讯息,找一行像是:;
Ramdisk;driver;initialized;:;16;ramdisks;of;4096K;size

请针对;root;filesystem;未经压缩的;size检查上述的;size;。如果;ramdisks;不够大,那就让它更大吧。;
请检查;root;disk;实际上有包含你所认为应该被包含的目录。;Copy;到错误的;level;是容易犯的错误,以致於到最後在你的;root;磁碟片上,你会有像是;/rootdisk/bin;的目录,而非;/bin。;
请检查是否有;/lib/libc.so;,而它是否有与你硬碟内;/lib;目录中所显示之相同;link;。;
请检查你既存系统;/dev;目录内的;symbolic;links;是否同时也存在於你的;root;磁碟片;filesystem;上,在此,那些;links;是连往你已包括在你;root;磁碟片上的;devices;。尤其是在很多情况下,;/dev/console;links是最基本的。;
请检查你是否已包括了;/dev/tty1,;/dev/null,;/dev/zero,;/dev/mem,;/dev/ram;与;/dev/kmem;这些档案。;
请检查你的;kernel;组态设定;-;对於直到登录点;(login;point);所需之所有资源的支援必须被内建,不能使用模组。所以;ramdisk;与;ext2;支援必须被内建;。;
请检查你的;kernel;root;device;与;ramdisk;设定是否正确。;
以上已经涵盖一般部分,以下是一些更特定的档案与检查项目:;


请确定;init;是以;/sbin/init;或;/bin/init;的形式被包括进来。并且确认它是可执行的。;
请执行;ldd;init;以检查;init;的函式库。通常这个就是;libc.so;,但是请无论如何还是检查一下。请确定你已放入了必备的函式库与;loaders。;
请确定你把正确的;loader;给你的函式库;--;ld.so;是给;a.out;而;ld-linux.so;是给;ELF;。;
请针对;getty;(或某种类似;getty;的程式,诸如;agetty,;mgetty;或;getty_ps)的呼叫,检查你bootdisk;filesystem上的;/etc/inittab。请针对你硬碟的;inittab;检查两次。再检查你所使用的程式的;man;pages;以确定这些是有意义的。;inittab;可能是最诡异的部分,因为它的语法与内容,依据所使用的;init;程式与系统本质而有所不同。解决的唯一之道就是去阅读;init;与;inittab;的man;pages,然後再正确地做出既存系统开机时所做的事。请检查以确定;/etc/inittab;有一个系统初始化的记录;(entry);。它应该包括一个指令以执行必定存在的系统初始化;script;。;

标签: linux