作者: 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 。 |