The Linux Bootdisk HOWTO 作者: Tom Fawcett ( [1]fawcett+BH@croftj.net) 译者: [2]朱汉农 v4.0, April 2000, 翻译日期: 27 July 2000 _________________________________________________________________ 本文描述如何设计与建造你自己的 Linux boot/root 磁片。这些磁片能用来当 做救援磁片 (rescue disks) ,或是能用来测试新系统元件 (components) 。在 企图建造你自己的 bootdisk 之前,你应该要相当熟悉系统管理工作。如果你只 是想要一张紧急时使用的救援磁片,请参考 [3]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 个月,那麽请查 阅 [4]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 尚未完成的事 有任何自愿者吗 ? 1. 请描述 (或是链结到另一份有叙述的文件)如何制作其它可开机的类磁片物 品,诸如 CDROMs, ZIP disks 与 LS110 disks 。 2. 请描述如何处理巨大的 libc.so 共享函式库。基本上可选择获取较旧、较 小的函式库,或是删减现有的函式库。 3. 重新分析 distribution bootdisks 与更新 "How the Pros do it" 这一节 。 4. 删减叙述关於如何升级现有 distribution bootdisks 的章节。 This is usually more trouble than it's worth. 5. 重写 / 润饰 Troubleshooting 这一节。 1.3 回应与感谢 -- Feedback and credits 我接受任何关於本文内容之回应,无论是好是坏。我/我们 已力求这份文件内的 指令与资讯是正确而可靠的。如果你发现任何错误或遗漏,请让我知道。在撰写 时, 请指出你所参考的文件之版本号码 。 我们感谢许多协助修正与给予建议之人。他们的贡献使得本文比我们自己独立完 成它时还来得更好。 请各位利用上述的 email 地址,给予作者你的批评、指正与疑问。我不介意尝 试回答任何问题,但是如果你有特定问题是关於你的 bootdisk 不能运作,那麽 请先阅读 [5]Troubleshooting 。 1.4 散布政策 -- Distribution policy Copyright (c) 1995,1996,1997,1998,1999,2000 by Tom Fawcett and Graham Chapman. 本文可以在 [6]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 拿来用会 更 为容易。请参考下面的 [7]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 是较不普遍的观念;这个替 代方案叙述在 [8]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 ,你可以从 [9] 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 系统有一套更 为复杂且设计良好的架构方法,称为 [10]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 这个目录包含了重要的组态设定档。在大部分的系统上,这些档案被分为三个群 组: 1. 一直都是必备的, e.g. rc, fstab, passwd 。 2. 可能是必备的,但是没有人能十分确定。 3. 偷跑进来的垃报。 通常可以用以下指令识出哪些是非基本的档案: ls -ltru 这个指令将档案依据上次被存取的日期,以先早後晚 (reverse) 的顺序列出, 所以如果有任何档案不会被存取,那麽它们就可以从 root 磁片中删去。 在我的 root 磁片上,我的组态档数目已减至 15 个。这可减少我处理以下三种 档案的工作: 1. 我必须为 boot/root 系统进行组态设定的档案: 1. rc.d/* -- 系统启动与改变 run level 的 scripts 2. fstab -- 要被挂上的 file systems 清单 3. inittab -- 给 init process 的参数,於开机时启动的第一个 process 。 2. 我们应该为 boot/root 系统整理的档案: 1. passwd -- 重要的使用者、 home 目录等其它项目的清单。 2. group -- 使用者群组。 3. shadow -- 使用者的密码。你可能没有这个档。 4. termcap -- the terminal capability database. 如果系统安全 (security) 对你很重要,那麽 passwd 与 shadow 应该被删 减,以避免将使用者密码 copy 出系统,这样当你从磁片开机时,不想要的 logins 会被拒绝。 请确定 passwd 至少包含了 root 。如果你要让其他的 使用者 login ,请确定他们的 home 目录与 shells 都存在。 termcap , 终端机资料库,一般而言有几百个 kilobytes 。你 boot/root 磁片的版本 应该被删减到只包含你所使用的终端机,这通常就是 linux 或 linux-console 项目 (entry) 。 3. 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) 者,请参考在 [11]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 这两 个目录的档案清单□例请见 [12]Sample rootdisk directory listings 。但□ 例中并没有包括任何从备份复原时所需之工具程式,诸如 cpio, tar 与 gzip 。这是因为我把这些东西放在另一张 (separate) 工具程式磁片上,以节省 boot/root 磁片的空间。一旦 boot/root 磁片被开机启动,就会被 copy 到 ramdisk 并释放软碟机,让软碟机能挂上另一张磁片,就是工具程式片。我通常 把它挂上当做 /usr 。 工具程式磁片 (utility diskette) 的制作被描述在下面 [13]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 的同时,你可能需要除去一些函式库。请看 [14]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, stri pped /lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not s tripped 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 以确保它能放在一张软碟片上;如果不行, 你就必须回溯并移除一些档案。 [15]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 ,先跳过此 ,直接到 [16]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 有稍微不同,请不用担心。 现在请把磁片留在软碟机内,然後前进到 [17]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" 的磁片组 ,这里会产生两种情况。 1. 如果你是建造一张单一磁片,压缩的 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 进位, 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 设定是否正确。 以上已经涵盖一般部分,以下是一些更特定的档案与检查项目: 1. 请确定 init 是以 /sbin/init 或 /bin/init 的形式被包括进来。并且确 认它是可执行的。 2. 请执行 ldd init 以检查 init 的函式库。通常这个就是 libc.so ,但是 请无论如何还是检查一下。请确定你已放入了必备的函式库与 loaders。 3. 请确定你把正确的 loader 给你的函式库 -- ld.so 是给 a.out 而 ld-linux.so 是给 ELF 。 4. 请针对 getty (或某种类似 getty 的程式,诸如 agetty, mgetty 或 getty_ps)的呼叫,检查你bootdisk filesystem上的 /etc/inittab。请针 对你硬碟的 inittab 检查两次。再检查你所使用的程式的 man pages 以确 定这些是有意义的。 inittab 可能是最诡异的部分,因为它的语法与内容 ,依据所使用的 init 程式与系统本质而有所不同。解决的唯一之道就是去 阅读 init 与 inittab 的man pages,然後再正确地做出既存系统开机时所 做的事。请检查以确定 /etc/inittab 有一个系统初始化的记录 (entry) 。它应该包括一个指令以执行必定存在的系统初始化 script 。 5. 如同 init ,对你的 getty 执行 ldd 以了解它需要什麽,同时确定必备的 函式库档案与 loaders 是否被放入你的 root filesystem 。 6. 请确认你已放入一个 shell 程式 (e.g., bash or ash),它能够执行你所 有的 rc scripts 。 7. 如果在你的救援磁片上,有一个 /etc/ld.so.cache 的档案,请重新制作 (remake) 它。 如果 init 启动,但是你却得到一行讯息像是: Id xxx respawning too fast: disabled for 5 minutes 它是来自於 init ,通常指出 getty 或 login 被终结只要 init 启动。请检查 getty 与 login 的可执行档与相依的函式库。请确定在 /etc/inittab 内的呼 叫 (invocations) 是正确的。如果你得到来自 getty 的奇怪讯息,它可能是指 /etc/inittab 内的呼叫格式是错误的。 如果你得到一个 login 提示 (prompt) ,然後你输入一个有效的 login name ,但是系统却立即提示你要输入另一个 login name ,那麽这个问题可能是出在 PAM 或 NSS 。请看 [18]PAM and NSS 这一节。问题也可能是你使用 shadow passwords 而你却没有 copy /etc/shadow 到你的 bootdisk 上。 如果你尝试去执行某个可执行档,诸如 df ,而这个执行档是在你的救援磁片上 ,执行时却出现像这样的讯息: df: not found ,这时请检查两件事:(1)请确 定包含二进位档的目录有设定在你的 PATH ,(2)请确定你有程式所需的函式库 (与 loaders)。 8. 其它各种主题 -- Miscellaneous topics 8.1 减少 root filesystem 的 size -- Reducing root filesystem size 有时 root filesystem 会因太大而无法塞入一张软碟片内,甚至在压缩过後还 是这样。这里有一些方法可减少 filesystem 的 size : 1. 增加磁碟片密度 (density) 。 依照预设,软碟片会以 1440 K 来进行格式 化,但是现在也有更高密度的格式。 fdformat会为以下 sizes 的磁片进行 格式化: 1600, 1680, 1722, 1743, 1760, 1840, 以及 1920 。大部分的 1440 K 软碟机可支援 1722 K ,我一直都是使用这个来制作 bootdisks 。 请参考 fdformat man page与 /usr/src/linux/Documentation/devices.txt 。 2. 替换你的 shell 。 一些在 Linux 上广受欢迎的 shells ,诸如 bash 与 tcsh ,是相当大且需要许多函式库。 Light-weight 的选择於是存在,诸 如 ash, lsh, kiss 与 smash,它们小很多而且只需要很少 (或是不需要) 函式库。大部分这些用来代替的 shells 可以在 [19] http://metalab.unc.edu/pub/Linux/system/shells/ 找得到。请确定你所 使用的任何 shell ,能够执行你放在你 bootdisk 内的所有 rc 档案中的 指令。 3. 删去函式库与二进位档 。 很多函式库与二进位档一般而言是未被删去的 ( 包括debugging symbols)。如果如此,对这些档案执行 file 会告诉你 ``not stripped'' 。 当 copy 二进位档到你的 root filesystem 时,这 是一个好练习去使用: objcopy --strip-all FROM TO 当 copy 函式库时,请确定使用的是 strip-debug 而不是 strip-all 。 4. 如果你在制作 root filesystem 时,删除或移动过多档案,请再重新制作 一次。请看上述关於不要在 filesystem 内有 dirty blocks 之重要性的注 意事项。 5. 移动非关键档案到工具磁片 (utility disk) 上 。 如果你的一些二进位档 对 boot 或 login 来说并非立即需要,那麽你就可以把它们移到工具磁片 上。细节请看 [20]Building a utility disk 这一节。你同样可考虑把 modules 移到工具磁片上。 8.2 Non-ramdisk root filesystems [21]Building a root filesystem 这一节曾给予指示以建造一个压缩的 root filesystem ,它会在系统开机时被载入到 ramdisk 。这个方法有许多优点,所 以通常都采用此法。然而,一些只有一点点记忆体的系统无法负担此法所需的 RAM ,因此,这些系统必须使用直接从软碟片挂上的 root filesystems 。 这样的 filesystems 实际上比压缩的 root filesystems 更容易建造,因为它 们可以被造在一张磁片上,而非某个其它的设备上,另外,它们也不必被压缩。 当异於前述的指示时,我们将叙述该程序的要点。如果你选择这样做,请记得你 可获得的剩馀 空间会变少 。 1. 请计算你将有多少空间可供 root files 使用。 如果你建造的是一张单一 的 boot/root 磁片,你必须让所有给 kernel 的 blocks 以及所有给 root filesystem 的 blocks 都能容纳於同一张磁片上。 2. 使用 mke2fs ,在适当 size 的软碟片上造出一个 root filesystem 。 3. 如同前述的方法殖入於此 filesystem 。 4. 完成後, unmount 此 filesystem 并且传送它使之成为一个磁片档案,但 是 不要压缩它 。 5. 以前述之方法,把 kernel 传送到一张软碟片上。当计算 ramdisk word 时 , 把 bit 14 设成 0 ,以指示不要把 root filesystem 载入到 ramdisk 。请以前述之方法执行 rdev 指令。 6. 如同以往,传送此 root filesystem 。 有好几种捷径你可采用。如果你建造的是一套双磁片组,你可以直接把完整的 root filesystem建造在第二张磁片上,而且你并不需要把它传送成一个硬碟档 案然後再存回磁片上。同样地,如果你建造的是一张单一的 boot/root 磁片而 且使用 LILO ,你可以在整张磁片上建立 单一的 filesystem,包含 kernel 、 LILO files 与 root files ,然後只要执行 LILO 做为最後一步。 8.3 建造一张工具磁片 -- Building a utility disk 建造一张工具磁片相对来说简单多了 -- 只要在一张已格式化的磁片上造出一个 filesystem ,然後 copy 档案於其上即可。为了跟 bootdisk 一起使用它,请 在系统启动以後,用手动的方式 mount 它。 在前面的指示中,我们曾提及 utility disk 可以被 mount 做为 /usr 。在这 个情况下,二进位档可以被放在你 utility disk 之 /bin 目录内,以便於将 /usr/bin 设入你的 path 中可以存取它们。二进位档所需之其它函式库被放在 utility disk 之 /lib 目录内。 当设计 utilitu disk 时,有几个重点要记住: 1. 不要把关键的系统二进位档或函式库放到 utility disk 上,因为直到系统 顺利启动之前, utility disk 不会被挂上,其上的档案也无法供系统使用 。 2. 你不能同时存取一张软碟片与一台磁带机。意指如果你有一台磁带机,那麽 当你正在使用 (mount) utility disk 时,你将不能存取那台磁带机。 3. 存取 utility disk 上的档案会很慢。 [22]Sample utility disk directory listing 提供了utility disk的档案之样 本。以下是一些建议关於一些你会发现有用的档案:检查与操作磁片(format, fdisk)、 filesystems (mke2fs, fsck, debugfs, isofs.o)的程式,小型的文 书编辑器 (elvis, jove),压缩与档案工具 (gzip, tar, cpio, afio), 磁带工 具 (mt, tob, taper),通讯工具 (ppp.o, slip.o, minicom)与给设备使用的工 具 (setserial, mknod)。 9. How the pros do it 您可能已经注意到,那些被诸如 Slackware、RedHat、Debian 等主要 distribution 所使用的 bootdisks ,似乎比本文中所描述的还要来得复杂许多 。专业的 distribution bootdisks 以在此所提出的相同原则为基础,但是采用 各式各样的技巧,因为它们的 bootdisks 有一些额外的需求。第一,它们必须 能够在各种不同的硬体上运作,所以它们必须能够与使用者互动,并且能载入各 式各样的设备驱动程式。第二,它们必须准备以许多不同的安装选项、不同的自 动化程度来运作。最後, distribution bootdisks 通常结合了安装磁片与救援 磁片的能力。 某些 bootdisks 使用名为 initrd(initial ramdisk)的特性。这个特性大约在 2.0.x 版时引入,它允许 kernel 以两阶段开机。当 kernel 开机时,它从 boot disk 载入一个initial ramdisk映像档。这个 initial ramdisk 是一个 root filesystem ,包含一个在真正的 root fs 被载入之前所执行的程式。这 个程式通常会检查作业环境, 以及/或 要求使用者选择不同的开机选项,例如 选择从哪一个设备载入真正的 rootdisk 。一般来说,它会载入未被内建在 kernel 内的额外模组。当这个初始化 (initial) 程式结束 (exit) 时, kernel 就载入真正的 root 映像档,开机动作将依一般情况继续执行下去。若 要进一步得知 initrd 的资讯,请详阅你机器上的 [23] /usr/src/linux/Documentation/initrd.txt ,以及 [24] ftp://elserv.ffm.fgan.de/pub/linux/loadlin-1.6/initrd-example.tgz 。 以下是每一家 distribution的安装磁片如何运作的摘要,这份摘要以检阅 (inspect) 它们的filesystems 以及/或 它们的原始码为基础。我们不保证这份 资讯完全正确无误,或是自从版本noted以来,这些运作方式未被改变。 Slackware(v.3.1) 使用一种与 [25]Transferring the kernel with LILO 这节 所描述类似的前向式 (straightforward) LILO 开机法。 Slackware 的 bookdisk 利用 LILO 的 讯息 参数印出一个 bootup 讯息 ("Welcome to the Slackware Linux boot kernel disk!") 。假如必要的话,这里会指示使用者输 入一个开机参数行(boot parameter line)。在开机之後,一个root档案系统会 从第二张磁片载入。此时使用者唤起(invoke)一个 setup script,这个script 将启动安装程序。Slackware并非使用一个模组化 kernel ,相反地,它提供许 多不同的 kernel ,并且靠使用者自己选择一个符合 他/她 硬体需求的 kernel 。 RedHat(v.4.0) 也使用 LILO 开机法。它从第一张磁片载入一个压缩的 ramdisk ,这动作执行一个 custom init 程式。这个程式查询驱动程式,然後,假如必 要的话,从 supplemental 磁片载入额外的档案。 Debian(v1.3) 可能是最复杂的安装磁片集。它使用 SYSLINUX loader 去安排各 式各样的载入选项,然後使用一个 initrd 映像档指示使用者完成安装程序。它 显然使用了一个客制化的 init 与一个客制化的 shell 两者。 10. 常见问题 (FAQ) 列表 -- Frequently Asked Question (FAQ) list Q. 我从我的 boot/root 磁片开机,但是什麽都跑不出来。我现在怎麽办 ? 请看之前的 [26]Troubleshooting 这节。 Q. Slackware/Debian/RedHat 的 bootdisk 如何运作 ? 请看之前的 [27]What the pros do 这节。 Q. 我要如何以 XYZ 驱动程式制作一张开机磁片 ? 最简单的方法是去从离你最近的 Slackware 映射站拿到一个 Slackware 的 kernel 。 Slackware 的 kernel 是一般的 (generic) kernel ,这些 kernel 企图将许多设备的驱动程式尽可能地包含於其中,因此,假如你有一个 SCSI 或IDE控制器,试试看,很有可能它的驱动程式会在 Slackware 的 kernel 当中 。 找到 a1 目录,并且依据你所拥有的控制器种类,选择 IDE 或 SCSI 两者之一 的 kernel 。对所选择的 kernel 检视其 xxxxkern.cfg 档,并且去了解这份 kernel 中所拥有的驱动程式。如果你想要使用的设备在这份列表中,那麽这个 符合的 kernel 就应该能用来开机。下载 xxxxkern.tgz 档,并且用之前在有关 making boot disks 的章节中所描述之方法, copy 它到你的开机磁片中。 然後你必须检查在 kernel 中的 root 设备,使用 rdev zImage 这个指令。接 著 rdev 将显示目前在 kernel 中的 root 设备。如果这和你所想要的 root 设 备不同,那麽使用 rdev 改变它。举例来说,我试的 kernel 设定到 /dev/sda2 ,但是我的 root SCSI partition 是 /dev/sda8 。为了能使用 root 磁片,你 将必须使用这个指令 rdev zImage dev/fd0/ 。 假如你还想知道如何 set up 一张 Slackware 的 root 磁片,这就已经超出这 份 HOWTO 的□围,所以我建议你查阅 Linux Install Guide ,或是设法取得 Slackware distribution 。详情请看在这份 HOWTO 中,标题为 ``Reference'' 的章节。 Q. 我如何以新的档案更新我的 root 磁片 ? 最简单的方法是从 rootdisk copy 档案系统回你所使用的那个 DEVICE (从之前 的 [28]Creating the filesystem 这节而得的)。然後挂上这个档案系统并且进 行改变动作。你必须记住你的 root 档案系统从哪里开始,以及它占了多少 block: dd if=/dev/fd0 bs=1k skip=ROOTBEGIN count=BLOCKS | gunzip > DEVICE mount -t ext2 DEVICE /mnt 在完成改变之後,如同之前一样进行下去 (在 [29]Wrapping it up 这节中) , 并且把 root filesystem 传送回那张磁片上。如果你并没有改变新的 root filesystem 的启始位置,你应该不用再重传 kernel ,或是重新计算 ramdisk 的 word。 Q. 我要如何移除 LILO ,好让我能再用 DOS 开机 ? 这个问题并非真的是 Bootdisk 的一个主题,只是这个问题常常被问到。在 Linux 的环境下,你可以执行: /sbin/lilo -u 你也可以使用 dd 这个指令把被 LILO 所储存的备份, copy 到开机磁区上。如 果你想要这样做,请参考 LILO 的文件。 在 DOS 与 Windows 的环境下,你可以使用这个 DOS 指令: FDISK /MBR MBR 是 Master Boot Record(主要开机记录)的缩写,它会用一个乾净的 DOS 开 机磁区,替换原本的开机磁区,而且这个动作不会影响 partition table 。一 些有洁癖的人 (purists) 并不同意这一点,可是就连 LILO 的原作者, Werner Almesberger ,都同意此作法。这个作法简单,而且有用。 Q. 如果我遗失了我的 kernel 与 我的开机磁片,我要如何开机 ? 如果你并没有一张已准备好的开机磁片,最简单的作法可能是要依照你的磁碟控 制器类型 (IDE 或 SCSI) 取得一份 Slackware kernel ,如同之前所述的 ``我 如何用XXX驱动程式制作一张开机磁片 ?'' 。然後你就可以用这个 kernel 开机 ,接著修理有损坏的地方。 你取得的 kernel 可能没有与你想要的磁碟种类和 partition 相对应的 root 设备集。举例来说, Slackware 的 generic SCSI kernel 有与 /dev/sda2 相 对应的 root设备集,然而,我的 root Linux partition 是在 /dev/sda8 。在 此情况下, kernel 中的 root 设备将必须被改变。 你仍然可以改变 kernel 的 root 设备与 ramdisk 的设定,纵使你手上只有一 个 kernel 和某种其它的作业系统,像 DOS 。 rdev 藉著改变在 kernel 档案里,在固定位移位置 (offset) 上的值,来改变 kernel 的设定,因此,如果你手上有一个 hex 编辑器 (on whatever systems you do still have running) ,你可以完成相同的事 -- 例如在 DOS 环境下的 Norton Utilities Disk Editor 。接著,你需要进行检查,如果必要的话,你 得改变 kernel 档案里,在以下位移位置上的值: HEX(16进位) DEC(10进位) DESCRIPTION(用途描述) 0x01F8 504 RAMDISK word的低字元组 (Low byte of RAMDISK word) 0x01F9 505 RAMDISK word的高字元组 (High byte of RAMDISK word ) 0x01FC 508 Root minor设备号码 - 详见其後 0X01FD 509 Root major设备号码 - 详见其後 关於 ramdisk word 之解释,写在之前的 [30]Setting the ramdisk word 这节 里。 Major 与 minor 设备号码必须设成你想要挂你的 root filesystem 於其上的设 备。一些可供选择的有用参考数值如下: DEVICE MAJOR MINOR /dev/fd0 2 0 第一台软碟机 /dev/hda1 3 1 在第一颗IDE硬碟上的partition 1 /dev/sda1 8 1 在第一颗SCSI硬碟上的partition 1 /dev/sda8 8 8 在第一颗SCSI硬碟上的partition 8 一旦你设定了这些值,接下来你可以将这个档案写入一张磁片内,你可以利用 Norton Utilities Disk Editor ,不然就是利用名为 rawrite.exe 的这支程式 。这支程式在所有的 distribution 都找得到。这支程式是一支在DOS环境下执 行的程式,它能将档案写入一张 ``raw'' disk ,从开机磁区开始写入,而不是 将档案写入档案系统。如果你使用 Norton Utilities ,你必须将档案写入一张 实体磁片,从磁片的头开始写入。 Q. 我要如何制作 boot/root 磁片的额外备份 ? 因为磁性媒介可能在一段时间後遭遇损害,你应该保留几张你的救援磁片的备份 ,以防原来的那一片不能被电脑读取。 制作任何磁片的备份,包括开机用与公用程式 (utility) 磁片,最简单的方法 是利用 dd 这个指令,去 copy 原来那张磁片的内容到你硬碟上的一个档案之中 ,然後再用相同的指令将这个档案 copy 回一张新磁片上。请注意,你并不需要 ,也不应该去 mount 这张磁片,因为 dd利用raw设备介面。 要 copy 原磁片,请输入以下指令: dd if=DEVICENAME of=FILENAME 在此, DEVICENAME 是指这台磁碟机的设备名 (译按:/dev/fd0) ,而 FILENAME 是指(存在硬碟上的)输出档案档名。省略 count 参数让 dd 去copy整 张磁片 (如果是高密度磁片,有 2880 个 blocks) 。 要把从上面得到的档案 copy 到一张新磁片上,请插入一张新磁片并输入相反的 指令: dd if=FILENAME of=DEVICENAME 请注意,以上的讨论是假设你只有一台软碟机。假如相同种类的软碟机你有两台 ,你可以利用像下面的指令去 copy 磁片: dd if=/dev/fd0 of=/dev/fd1 Q. 我如何能在每一次开机时,不用输入 "ahaxxxx=nn,nn,nn" ? 当一台磁碟设备不能被自动侦测时,就有必要提供 kernel 指定的设备参数字串 ,诸如: aha152x=0x340,11,3,1 这行参数字串可以利用 LILO 以数种方法提供给 kernel : * 每次当系统以 LILO 开机时,你可以在命令列输入它。但是每次这样做会很 烦。 * 你可以使用 LILO 的 lock 这个关键字,使 LILO 储存这行命令列,并做为 预设的命令列,这样每当开机时, LILO 就会使用相同的选项。 * 你可以在 LILO 的组态档中,使用 append= 这个叙述。请注意参数字串必 须被双引号 (quotes) 夹住。 举例来说,一行使用上述参数字串的样本命令列将长成这样: zImage aha152x=0x340,11,3,1 root=/dev/sda1 lock 如此将会传递设备参数字串给 kernel ,同时也要求 kernel 把 root 设备设定 到 /dev/sda1 ,并且储存整行命令列,让以後开机时都能再使用这个命令列。 以下是一个 APPEND 叙述的样本: APPEND = "aha152x=0x340,11,3,1" 请注意参数字串在命令列上 不能 被双引号夹住,但是参数字串在 APPEND 叙述 中 一定要 被双引号夹住。 另外也请注意,为了能让参数字串起作用, kernel 内必须有符合这个磁碟类型 的驱动程式。如果没有,那麽就没有东西会去接受 (listen for) 这个参数字串 ,所以你将必须重新建造一个包含指定驱动程式的 kernel 。有关重新建立 kernel 的细节,请至目录 /usr/src/linux 阅读其 README 档,以及 Linux FAQ 与 Installation HOWTO 。 Alternatively ,你可以为这种磁碟类型取得 一个 generic kernel 并且安装它。 在体验 LILO 安装之前,强烈建议读者先读过 LILO 文件。不小心使用 BOOT 叙 述将会损坏 partition 。 Q. 在开机的时候,出现了 "A: cannot execute B" 的错误讯息。为什麽 ? 程式名称有好几种不同的写法被写死 (hardcoded) 在不同的公用程式里。这些 写法不会在每个地方都发生,但是它们可能说明了为什麽一个显而易见的可执行 档,不能在你的系统上被发现,纵使你看到它就在那里。你可以找出是否一个已 知的程式有另一种被写死的名称,你可以利用 strings 这个指令,并且利用管 道方法 (译按: piping, |) 将输出透过 grep 呈现出来。 已知关於写死的例子有: * 在某些版本中, Shutdown 有把 /etc/reboot 写死在其程式码内,所以 reboot 必须被放置在 /etc 这个目录下。 * 因为有不能够找到 init 的 kernel 存在, init 已至少为一个人带来问题 。 为了修正这些问题,不是移动这些程式到正确的目录,就是更改设定档 (e.g. inittab)以指向正确的目录。假如有所怀疑,就请先把程式如同它们在你硬碟上 一样,放入相同的目录,并且如同它们显现在你硬碟上一样,使用相同的 inittab 与 /etc/rc.d 档。 Q. 我的 kernel 支援 ramdisk ,但是却初始化 0K 的 ramdisk 。为什麽 ? 当 kernel 正在进行开机动作时,在问题发生之处,会出现一个像这样的 kernel 讯息: Ramdisk driver initialized : 16 ramdisks of 0K size 这可能是因为 size 已被 kernel 参数在开机时设成 0 。这可能是由於一个 overlooked LILO组态设定档参数所导致: ramdisk= 0 在某些较旧的 distributions 里,这个会被包含在 LILO 组态设定档样本中, 这放在那里是为了 override 任何 kernel 原先的设定。如果你有这样的一行, 请移除之。 请注意,如果企图使用一个已被设定成 0 size 的 ramdisk ,这样的行为将会 导致不可预测的结果,同时也会让 kernel 不知如何是好。 Appendix 11. 资源与指示 -- Resources and pointers 当拿取一个套件时,除非你有好的理由,否则请一定要拿最新的版本。 11.1 预先做好的 Bootdisks -- Pre-made Bootdisks 这些是 distribution bootdisks 的来源。 请选择映射站台下载以减少这些主 机的负荷。 * [31]Slackware bootdisks, [32]rootdisks 与 [33]Slackware 映射站台 * [34]RedHat bootdisks 与 [35]Red Hat 映射站台 * [36]Debian bootdisks 与 [37]Debian 映射站台 除了 distribution bootdisks 以外,也可以得到以下的救援磁片映像档。除非 有另外特别指定,否则这些都可在 [38] http://metalab.unc.edu/pub/Linux/system/recovery/!INDEX.html 的目录中 找到。 * tomsrtbt, 由 Tom Oehser 制作,是一张以 kernel 2.0 为基础而制作出来 的单片装 boot/root 磁片,with a large set of features and support programs。它支援 IDE 、 SCSI 、磁带、网路卡、 PCMCIA 等还有很多其 它设备。其中有大约 100 种工具程式与工具可以用来修护与备份磁碟。此 套件也包含一些 script 用来解译与重建构映像档,以便於在必要时可以加 入新的 material 。 * rescue02, 由 John Comyns 制作,是一张以 kernel 1.3.84 为基础而制作 出来的救援磁片,其支援 IDE 、 Adaptec 1542 与 NCR53C7,8xx 。它使用 ELF 两进位档,但是却有足够的指令以利其能在任何系统上使用。它拥有能 在开机後才被载入给所有其它 SCSI 卡使用的模组。但它也许不能在只有 4 mb 随机存取记忆体的系统上执行,因为它用到了 3 mb 的ram disk。 * resque_disk-2.0.22, 由 Sergei Viznyuk 制作,是一套以 kernel 2.0.22 为基础,内建支援 IDE 与许多不同的 SCSI 控制卡,以及 ELF/AOUT 的全 功能 boot/root 磁片。同时也包含许多模组,以及用来修□及备份硬碟的 有用工具程式。 * [39]cramdisk 映像档,以 kernel 2.0.23 为基础,可使用在 4 meg 与 8 meg 的机器上。它们包含了数学模拟器与网路工具 (PPP与dialin script 、NE2000、3C509),或是平行埠 ZIP 磁碟机的支援。这些磁片映像档可在 备有 4MB 随机存取记忆体的 386 主机上开机。 MSDOS 支援也被包含在其 中,因此你可以从网路上下载它到 DOS partition 上。 11.2 救援套件 -- Rescue packages 目前可以从 metalab.unc.edu 取得数种制作救援磁片的套件。利用这些套件, 你可以指定包含一组档案,接著软体就会自动地进行 bootdisk 的制作 (自动化 程度会有所不同)。请看 [40] http://metalab.unc.edu/pub/Linux/system/recovery/!INDEX.html 以取得进 一步的资讯。 请仔细检查档案日期 。一些套件有数年未被更新,而这些套件将无法支援「载 入至 ramdisk 之压缩 root filesystem 」的制作。就目前所知, [41]Yard 是 唯一可支援此的套件。 11.3 LILO -- the Linux loader 由 Werner Almesberger 撰写。一个优秀的 boot loader ,其文件包含了开机 磁区内容的资讯,以及开机流程的初期阶段。 请从 [42]ftp://tsx-11.mit.edu/pub/linux/packages/lilo/ 以FTP下载。也可 以从 Metalab 与映射站台内取得。 11.4 Linux FAQ 与 HOWTOs 这些文件可以从诸多来源中取得。这些文件可以从诸多来源中取得。请见 usenet 新闻论坛 news.answers 与 comp.os.linux.announce。 这些 FAQ 可以从 [43]http://linuxdoc.org/FAQ/Linux-FAQ.html 中取得,而 HOWTOs 可以从 [44]http://linuxdoc.org/HOWTO/HOWTO-INDEX.html 中取得。 大部分 Linux 文件可以在 [45]The Linux Documentation Project homepage 中找得到。 11.5 Ramdisk使用方法 -- Ramdisk usage 有关新的ramdisk 程式码如何运作的完整叙述,可以在随附於 Linux kernel 的 文件中找到。请看 /usr/src/linux/Documentation/ramdisk.txt 。这份文件是 由 Paul Gortmaker 所编写,同时包含了一节关於制作压缩的 ramdisk 。 11.6 Linux开机流程 -- The Linux boot process 若想了解关於Linux开机流程的更多细节,以下有一些指示文件: * 在 [46]http://linuxdoc.org/LDP/sag/c1596.htmlLinux System Administrators' Guide 中,有一节是关於 booting 。 * 在 [47] http://metalab.unc.edu/pub/Linux/system/boot/lilo/lilo-t-21.ps.gz LILO ``Technical overview'' 中,拥有关於开机流程一直到 kernel 从何 处被启动之决定性 (definitive) 技术上 low-level 的叙述。 * Source code 是你永远的指南。以下是一些与开机流程有关的 kernel files 。如果你有 Linux 核心的原始码,你可以在你机器上的 /usr/src/linux 之中找到这些档案;此外, Shigo Yamguchi ( [48] shigio@tamacom.com)有非常棒的 [49]hypertext kernel browser ,可以 用来读 kernel source files 。以下是一些可供参考的有关档案: arch/i386/boot/bootsect.S and setup.S 包含 bootsector 自 己的组合码。 arch/i386/boot/compressed/misc.c 包含未压缩的 kernel 程式 码。 arch/i386/kernel/ 包含了 kernel 初始化程式码的目录。 setup.c 定义了 ramdisk 的 word 。 drivers/block/rd.c 包含 ramdisk 的驱动程式。 rd_load 与 rd_load_image 这两个程序从一个设备中载入区块 (blocks) 到 ramdisk 内。 identify_ramdisk_image 这个程序决定找到的 filesystem 是什麽种类,还有它是否是被压缩的 filesystem 。 12. LILO boot error codes 有关这些错误码的问题时常在 Usenet 上被人提到,所以我们以服务的心情将它 们表列如下。这份摘要引用自 Werner Almsberger 的 [50]LILO User Documentation 。 当 LILO 载入自己时,萤幕上会显示 LILO 这个字。每一个字母 (letter) 会在 执行某个特定动作之前或之後被印在萤幕上。如果 LILO 在某点上不能完成任务 ,到此为止所印出的字母可以用来辨认出发生了什麽问题。 (nothing) LILO 完全没有被载入。 LILO 不是没有被安装好,就是 LILO 开机磁区 所在的 partition 并非使用中的 partition 。 L 第一阶段的 boot loader 已被载入并启动,但是无法载入第二阶段的 boot loader 。这些二位数的错误码指出问题属於什麽种类。(请看 "Disk error codes" 这一节。)这个情况通常是指媒体错误或是几何不 相配 (geometry mismatch)(举例来说,错误的磁碟参数)。 LI 第一阶段的 boot loader 能够载入第二阶段的 boot loader ,但是却 不能够执行它。这个情形是因为 geometry mismatch 抑或是在没有执行 map installer 的情况下,移动了 /boot/boot.b 所造成。 LIL 第二阶段的 boot loader 已被启动,但是却不能从 map file 载入 descriptor table 。一般而言,这是因为媒体错误或是 geometry mismatch 所造成。 LIL? 第二阶段的 boot loader 被载入到一个不正确的位址。一般而言,这是 因为 subtle geometry mismatch ,或是在没有执行 map installer 的 情况下,移动了 /boot/boot.b 所造成。 LIL- Descriptor table 损毁。这个情形是因为 geometry mismatch 抑或是 在没有执行 map installer 的情况下,移动了 /boot/map 所造成。 LILO LILO 的所有部分均已成功载入。 如果在 LILO 正试著载入 boot image 时, BIOS 发出一个错误讯号,那麽相对 映的 (respective)错误码会显示出来。错误码的□围从 0x00 到 0xbb 。请看 LILO User Guide for an explanation of these 。 13. Root filesystem 列表样本 -- Sample root filesystem listings /: drwx--x--x 2 root root 1024 Nov 1 15:39 bin drwx--x--x 2 root root 4096 Nov 1 15:39 dev drwx--x--x 3 root root 1024 Nov 1 15:39 etc drwx--x--x 4 root root 1024 Nov 1 15:39 lib drwx--x--x 5 root root 1024 Nov 1 15:39 mnt drwx--x--x 2 root root 1024 Nov 1 15:39 proc drwx--x--x 2 root root 1024 Nov 1 15:39 root drwx--x--x 2 root root 1024 Nov 1 15:39 sbin drwx--x--x 2 root root 1024 Nov 1 15:39 tmp drwx--x--x 7 root root 1024 Nov 1 15:39 usr drwx--x--x 5 root root 1024 Nov 1 15:39 var /bin: -rwx--x--x 1 root root 62660 Nov 1 15:39 ash -rwx--x--x 1 root root 9032 Nov 1 15:39 cat -rwx--x--x 1 root root 10276 Nov 1 15:39 chmod -rwx--x--x 1 root root 9592 Nov 1 15:39 chown -rwx--x--x 1 root root 23124 Nov 1 15:39 cp -rwx--x--x 1 root root 23028 Nov 1 15:39 date -rwx--x--x 1 root root 14052 Nov 1 15:39 dd -rwx--x--x 1 root root 14144 Nov 1 15:39 df -rwx--x--x 1 root root 69444 Nov 1 15:39 egrep -rwx--x--x 1 root root 395 Nov 1 15:39 false -rwx--x--x 1 root root 69444 Nov 1 15:39 fgrep -rwx--x--x 1 root root 69444 Nov 1 15:39 grep -rwx--x--x 3 root root 45436 Nov 1 15:39 gunzip -rwx--x--x 3 root root 45436 Nov 1 15:39 gzip -rwx--x--x 1 root root 8008 Nov 1 15:39 hostname -rwx--x--x 1 root root 12736 Nov 1 15:39 ln -rws--x--x 1 root root 15284 Nov 1 15:39 login -rwx--x--x 1 root root 29308 Nov 1 15:39 ls -rwx--x--x 1 root root 8268 Nov 1 15:39 mkdir -rwx--x--x 1 root root 8920 Nov 1 15:39 mknod -rwx--x--x 1 root root 24836 Nov 1 15:39 more -rws--x--x 1 root root 37640 Nov 1 15:39 mount -rwx--x--x 1 root root 12240 Nov 1 15:39 mt -rwx--x--x 1 root root 12932 Nov 1 15:39 mv -r-x--x--x 1 root root 12324 Nov 1 15:39 ps -rwx--x--x 1 root root 5388 Nov 1 15:39 pwd -rwx--x--x 1 root root 10092 Nov 1 15:39 rm lrwxrwxrwx 1 root root 3 Nov 1 15:39 sh -> ash -rwx--x--x 1 root root 25296 Nov 1 15:39 stty -rws--x--x 1 root root 12648 Nov 1 15:39 su -rwx--x--x 1 root root 4444 Nov 1 15:39 sync -rwx--x--x 1 root root 110668 Nov 1 15:39 tar -rwx--x--x 1 root root 19712 Nov 1 15:39 touch -rwx--x--x 1 root root 395 Nov 1 15:39 true -rws--x--x 1 root root 19084 Nov 1 15:39 umount -rwx--x--x 1 root root 5368 Nov 1 15:39 uname -rwx--x--x 3 root root 45436 Nov 1 15:39 zcat /dev: lrwxrwxrwx 1 root root 6 Nov 1 15:39 cdrom -> cdu31a brw-rw-r-- 1 root root 15, 0 May 5 1998 cdu31a crw------- 1 root root 4, 0 Nov 1 15:29 console crw-rw-rw- 1 root uucp 5, 64 Sep 9 19:46 cua0 crw-rw-rw- 1 root uucp 5, 65 May 5 1998 cua1 crw-rw-rw- 1 root uucp 5, 66 May 5 1998 cua2 crw-rw-rw- 1 root uucp 5, 67 May 5 1998 cua3 brw-rw---- 1 root floppy 2, 0 Aug 8 13:54 fd0 brw-rw---- 1 root floppy 2, 36 Aug 8 13:54 fd0CompaQ brw-rw---- 1 root floppy 2, 84 Aug 8 13:55 fd0D1040 brw-rw---- 1 root floppy 2, 88 Aug 8 13:55 fd0D1120 brw-rw---- 1 root floppy 2, 12 Aug 8 13:54 fd0D360 brw-rw---- 1 root floppy 2, 16 Aug 8 13:54 fd0D720 brw-rw---- 1 root floppy 2, 120 Aug 8 13:55 fd0D800 brw-rw---- 1 root floppy 2, 32 Aug 8 13:54 fd0E2880 brw-rw---- 1 root floppy 2, 104 Aug 8 13:55 fd0E3200 brw-rw---- 1 root floppy 2, 108 Aug 8 13:55 fd0E3520 brw-rw---- 1 root floppy 2, 112 Aug 8 13:55 fd0E3840 brw-rw---- 1 root floppy 2, 28 Aug 8 13:54 fd0H1440 brw-rw---- 1 root floppy 2, 124 Aug 8 13:55 fd0H1600 brw-rw---- 1 root floppy 2, 44 Aug 8 13:55 fd0H1680 brw-rw---- 1 root floppy 2, 60 Aug 8 13:55 fd0H1722 brw-rw---- 1 root floppy 2, 76 Aug 8 13:55 fd0H1743 brw-rw---- 1 root floppy 2, 96 Aug 8 13:55 fd0H1760 brw-rw---- 1 root floppy 2, 116 Aug 8 13:55 fd0H1840 brw-rw---- 1 root floppy 2, 100 Aug 8 13:55 fd0H1920 lrwxrwxrwx 1 root root 7 Nov 1 15:39 fd0H360 -> fd0D360 lrwxrwxrwx 1 root root 7 Nov 1 15:39 fd0H720 -> fd0D720 brw-rw---- 1 root floppy 2, 52 Aug 8 13:55 fd0H820 brw-rw---- 1 root floppy 2, 68 Aug 8 13:55 fd0H830 brw-rw---- 1 root floppy 2, 4 Aug 8 13:54 fd0d360 brw-rw---- 1 root floppy 2, 8 Aug 8 13:54 fd0h1200 brw-rw---- 1 root floppy 2, 40 Aug 8 13:54 fd0h1440 brw-rw---- 1 root floppy 2, 56 Aug 8 13:55 fd0h1476 brw-rw---- 1 root floppy 2, 72 Aug 8 13:55 fd0h1494 brw-rw---- 1 root floppy 2, 92 Aug 8 13:55 fd0h1600 brw-rw---- 1 root floppy 2, 20 Aug 8 13:54 fd0h360 brw-rw---- 1 root floppy 2, 48 Aug 8 13:55 fd0h410 brw-rw---- 1 root floppy 2, 64 Aug 8 13:55 fd0h420 brw-rw---- 1 root floppy 2, 24 Aug 8 13:54 fd0h720 brw-rw---- 1 root floppy 2, 80 Aug 8 13:55 fd0h880 brw-rw---- 1 root disk 3, 0 May 5 1998 hda brw-rw---- 1 root disk 3, 1 May 5 1998 hda1 brw-rw---- 1 root disk 3, 2 May 5 1998 hda2 brw-rw---- 1 root disk 3, 3 May 5 1998 hda3 brw-rw---- 1 root disk 3, 4 May 5 1998 hda4 brw-rw---- 1 root disk 3, 5 May 5 1998 hda5 brw-rw---- 1 root disk 3, 6 May 5 1998 hda6 brw-rw---- 1 root disk 3, 64 May 5 1998 hdb brw-rw---- 1 root disk 3, 65 May 5 1998 hdb1 brw-rw---- 1 root disk 3, 66 May 5 1998 hdb2 brw-rw---- 1 root disk 3, 67 May 5 1998 hdb3 brw-rw---- 1 root disk 3, 68 May 5 1998 hdb4 brw-rw---- 1 root disk 3, 69 May 5 1998 hdb5 brw-rw---- 1 root disk 3, 70 May 5 1998 hdb6 crw-r----- 1 root kmem 1, 2 May 5 1998 kmem crw-r----- 1 root kmem 1, 1 May 5 1998 mem lrwxrwxrwx 1 root root 12 Nov 1 15:39 modem -> ttyS1 lrwxrwxrwx 1 root root 12 Nov 1 15:39 mouse -> psaux crw-rw-rw- 1 root root 1, 3 May 5 1998 null crwxrwxrwx 1 root root 10, 1 Oct 5 20:22 psaux brw-r----- 1 root disk 1, 1 May 5 1998 ram brw-rw---- 1 root disk 1, 0 May 5 1998 ram0 brw-rw---- 1 root disk 1, 1 May 5 1998 ram1 brw-rw---- 1 root disk 1, 2 May 5 1998 ram2 brw-rw---- 1 root disk 1, 3 May 5 1998 ram3 brw-rw---- 1 root disk 1, 4 May 5 1998 ram4 brw-rw---- 1 root disk 1, 5 May 5 1998 ram5 brw-rw---- 1 root disk 1, 6 May 5 1998 ram6 brw-rw---- 1 root disk 1, 7 May 5 1998 ram7 brw-rw---- 1 root disk 1, 8 May 5 1998 ram8 brw-rw---- 1 root disk 1, 9 May 5 1998 ram9 lrwxrwxrwx 1 root root 4 Nov 1 15:39 ramdisk -> ram0 *** 我只把供我目前的 IDE partition 利用的设备包括进来。 *** 如果你使用 SCSI ,那麽请改用 /dev/sdXX 的设备。 crw------- 1 root root 4, 0 May 5 1998 tty0 crw-w----- 1 root tty 4, 1 Nov 1 15:39 tty1 crw------- 1 root root 4, 2 Nov 1 15:29 tty2 crw------- 1 root root 4, 3 Nov 1 15:29 tty3 crw------- 1 root root 4, 4 Nov 1 15:29 tty4 crw------- 1 root root 4, 5 Nov 1 15:29 tty5 crw------- 1 root root 4, 6 Nov 1 15:29 tty6 crw------- 1 root root 4, 7 May 5 1998 tty7 crw------- 1 root tty 4, 8 May 5 1998 tty8 crw------- 1 root tty 4, 9 May 8 12:57 tty9 crw-rw-rw- 1 root root 4, 65 Nov 1 12:17 ttyS1 crw-rw-rw- 1 root root 1, 5 May 5 1998 zero /etc: -rw------- 1 root root 164 Nov 1 15:39 conf.modules -rw------- 1 root root 668 Nov 1 15:39 fstab -rw------- 1 root root 71 Nov 1 15:39 gettydefs -rw------- 1 root root 389 Nov 1 15:39 group -rw------- 1 root root 413 Nov 1 15:39 inittab -rw------- 1 root root 65 Nov 1 15:39 issue -rw-r--r-- 1 root root 746 Nov 1 15:39 ld.so.cache -rw------- 1 root root 32 Nov 1 15:39 motd -rw------- 1 root root 949 Nov 1 15:39 nsswitch.conf drwx--x--x 2 root root 1024 Nov 1 15:39 pam.d -rw------- 1 root root 139 Nov 1 15:39 passwd -rw------- 1 root root 516 Nov 1 15:39 profile -rwx--x--x 1 root root 387 Nov 1 15:39 rc -rw------- 1 root root 55 Nov 1 15:39 shells -rw------- 1 root root 774 Nov 1 15:39 termcap -rw------- 1 root root 78 Nov 1 15:39 ttytype lrwxrwxrwx 1 root root 15 Nov 1 15:39 utmp -> ../var/run/utmp lrwxrwxrwx 1 root root 15 Nov 1 15:39 wtmp -> ../var/log/wtmp /etc/pam.d: -rw------- 1 root root 356 Nov 1 15:39 other /lib: -rwxr-xr-x 1 root root 45415 Nov 1 15:39 ld-2.0.7.so lrwxrwxrwx 1 root root 11 Nov 1 15:39 ld-linux.so.2 -> ld-2.0. 7.so -rwxr-xr-x 1 root root 731548 Nov 1 15:39 libc-2.0.7.so lrwxrwxrwx 1 root root 13 Nov 1 15:39 libc.so.6 -> libc-2.0.7. so lrwxrwxrwx 1 root root 17 Nov 1 15:39 libcom_err.so.2 -> libco m_err.so.2.0 -rwxr-xr-x 1 root root 6209 Nov 1 15:39 libcom_err.so.2.0 -rwxr-xr-x 1 root root 153881 Nov 1 15:39 libcrypt-2.0.7.so lrwxrwxrwx 1 root root 17 Nov 1 15:39 libcrypt.so.1 -> libcryp t-2.0.7.so -rwxr-xr-x 1 root root 12962 Nov 1 15:39 libdl-2.0.7.so lrwxrwxrwx 1 root root 14 Nov 1 15:39 libdl.so.2 -> libdl-2.0. 7.so lrwxrwxrwx 1 root root 16 Nov 1 15:39 libext2fs.so.2 -> libext 2fs.so.2.4 -rwxr-xr-x 1 root root 81382 Nov 1 15:39 libext2fs.so.2.4 -rwxr-xr-x 1 root root 25222 Nov 1 15:39 libnsl-2.0.7.so lrwxrwxrwx 1 root root 15 Nov 1 15:39 libnsl.so.1 -> libnsl-2. 0.7.so -rwx--x--x 1 root root 178336 Nov 1 15:39 libnss_files-2.0.7.so lrwxrwxrwx 1 root root 21 Nov 1 15:39 libnss_files.so.1 -> lib nss_files-2.0.7.so lrwxrwxrwx 1 root root 14 Nov 1 15:39 libpam.so.0 -> libpam.so .0.64 -rwxr-xr-x 1 root root 26906 Nov 1 15:39 libpam.so.0.64 lrwxrwxrwx 1 root root 19 Nov 1 15:39 libpam_misc.so.0 -> libp am_misc.so.0.64 -rwxr-xr-x 1 root root 7086 Nov 1 15:39 libpam_misc.so.0.64 -r-xr-xr-x 1 root root 35615 Nov 1 15:39 libproc.so.1.2.6 lrwxrwxrwx 1 root root 15 Nov 1 15:39 libpwdb.so.0 -> libpwdb. so.0.54 -rw-r-r--- 1 root root 121899 Nov 1 15:39 libpwdb.so.0.54 lrwxrwxrwx 1 root root 19 Nov 1 15:39 libtermcap.so.2 -> libte rmcap.so.2.0.8 -rwxr-xr-x 1 root root 12041 Nov 1 15:39 libtermcap.so.2.0.8 -rwxr-xr-x 1 root root 12874 Nov 1 15:39 libutil-2.0.7.so lrwxrwxrwx 1 root root 16 Nov 1 15:39 libutil.so.1 -> libutil- 2.0.7.so lrwxrwxrwx 1 root root 14 Nov 1 15:39 libuuid.so.1 -> libuuid. so.1.1 -rwxr-xr-x 1 root root 8039 Nov 1 15:39 libuuid.so.1.1 drwx--x--x 3 root root 1024 Nov 1 15:39 modules drwx--x--x 2 root root 1024 Nov 1 15:39 security /lib/modules: drwx--x--x 4 root root 1024 Nov 1 15:39 2.0.35 /lib/modules/2.0.35: drwx--x--x 2 root root 1024 Nov 1 15:39 block drwx--x--x 2 root root 1024 Nov 1 15:39 cdrom /lib/modules/2.0.35/block: drwx------ 1 root root 7156 Nov 1 15:39 loop.o /lib/modules/2.0.35/cdrom: drwx------ 1 root root 24108 Nov 1 15:39 cdu31a.o /lib/security: -rwx--x--x 1 root root 8771 Nov 1 15:39 pam_permit.so *** 供 mount 时使用的 Directory stubs /mnt: drwx--x--x 2 root root 1024 Nov 1 15:39 cdrom drwx--x--x 2 root root 1024 Nov 1 15:39 floppy /proc: /root: -rw------- 1 root root 176 Nov 1 15:39 .bashrc -rw------- 1 root root 182 Nov 1 15:39 .cshrc -rwx--x--x 1 root root 455 Nov 1 15:39 .profile -rw------- 1 root root 4014 Nov 1 15:39 .tcshrc /sbin: -rwx--x--x 1 root root 23976 Nov 1 15:39 depmod -rwx--x--x 2 root root 274600 Nov 1 15:39 e2fsck -rwx--x--x 1 root root 41268 Nov 1 15:39 fdisk -rwx--x--x 1 root root 9396 Nov 1 15:39 fsck -rwx--x--x 2 root root 274600 Nov 1 15:39 fsck.ext2 -rwx--x--x 1 root root 29556 Nov 1 15:39 getty -rwx--x--x 1 root root 6620 Nov 1 15:39 halt -rwx--x--x 1 root root 23116 Nov 1 15:39 init -rwx--x--x 1 root root 25612 Nov 1 15:39 insmod -rwx--x--x 1 root root 10368 Nov 1 15:39 kerneld -rwx--x--x 1 root root 110400 Nov 1 15:39 ldconfig -rwx--x--x 1 root root 6108 Nov 1 15:39 lsmod -rwx--x--x 2 root root 17400 Nov 1 15:39 mke2fs -rwx--x--x 1 root root 4072 Nov 1 15:39 mkfs -rwx--x--x 2 root root 17400 Nov 1 15:39 mkfs.ext2 -rwx--x--x 1 root root 5664 Nov 1 15:39 mkswap -rwx--x--x 1 root root 22032 Nov 1 15:39 modprobe lrwxrwxrwx 1 root root 4 Nov 1 15:39 reboot -> halt -rwx--x--x 1 root root 7492 Nov 1 15:39 rmmod -rwx--x--x 1 root root 12932 Nov 1 15:39 shutdown lrwxrwxrwx 1 root root 6 Nov 1 15:39 swapoff -> swapon -rwx--x--x 1 root root 5124 Nov 1 15:39 swapon lrwxrwxrwx 1 root root 4 Nov 1 15:39 telinit -> init -rwx--x--x 1 root root 6944 Nov 1 15:39 update /tmp: /usr: drwx--x--x 2 root root 1024 Nov 1 15:39 bin drwx--x--x 2 root root 1024 Nov 1 15:39 lib drwx--x--x 3 root root 1024 Nov 1 15:39 man drwx--x--x 2 root root 1024 Nov 1 15:39 sbin drwx--x--x 3 root root 1024 Nov 1 15:39 share lrwxrwxrwx 1 root root 10 Nov 1 15:39 tmp -> ../var/tmp /usr/bin: -rwx--x--x 1 root root 37164 Nov 1 15:39 afio -rwx--x--x 1 root root 5044 Nov 1 15:39 chroot -rwx--x--x 1 root root 10656 Nov 1 15:39 cut -rwx--x--x 1 root root 63652 Nov 1 15:39 diff -rwx--x--x 1 root root 12972 Nov 1 15:39 du -rwx--x--x 1 root root 56552 Nov 1 15:39 find -r-x--x--x 1 root root 6280 Nov 1 15:39 free -rwx--x--x 1 root root 7680 Nov 1 15:39 head -rwx--x--x 1 root root 8504 Nov 1 15:39 id -r-sr-xr-x 1 root bin 4200 Nov 1 15:39 passwd -rwx--x--x 1 root root 14856 Nov 1 15:39 tail -rwx--x--x 1 root root 19008 Nov 1 15:39 tr -rwx--x--x 1 root root 7160 Nov 1 15:39 wc -rwx--x--x 1 root root 4412 Nov 1 15:39 whoami /usr/lib: lrwxrwxrwx 1 root root 17 Nov 1 15:39 libncurses.so.4 -> libnc urses.so.4.2 -rw-r-r--- 1 root root 260474 Nov 1 15:39 libncurses.so.4.2 /usr/sbin: -r-x--x--x 1 root root 13684 Nov 1 15:39 fuser -rwx--x--x 1 root root 3876 Nov 1 15:39 mklost+found /usr/share: drwx--x--x 4 root root 1024 Nov 1 15:39 terminfo /usr/share/terminfo: drwx--x--x 2 root root 1024 Nov 1 15:39 l drwx--x--x 2 root root 1024 Nov 1 15:39 v /usr/share/terminfo/l: -rw------- 1 root root 1552 Nov 1 15:39 linux -rw------- 1 root root 1516 Nov 1 15:39 linux-m -rw------- 1 root root 1583 Nov 1 15:39 linux-nic /usr/share/terminfo/v: -rw------- 2 root root 1143 Nov 1 15:39 vt100 -rw------- 2 root root 1143 Nov 1 15:39 vt100-am /var: drwx--x--x 2 root root 1024 Nov 1 15:39 log drwx--x--x 2 root root 1024 Nov 1 15:39 run drwx--x--x 2 root root 1024 Nov 1 15:39 tmp /var/log: -rw------- 1 root root 0 Nov 1 15:39 wtmp /var/run: -rw------- 1 root root 0 Nov 1 15:39 utmp /var/tmp: 14. 工具程式磁片 (utility disk) 目录列表样本 -- Sample utility disk directory listing total 579 -rwxr-xr-x 1 root root 42333 Jul 28 19:05 cpio -rwxr-xr-x 1 root root 32844 Aug 28 19:50 debugfs -rwxr-xr-x 1 root root 103560 Jul 29 21:31 elvis -rwxr-xr-x 1 root root 29536 Jul 28 19:04 fdisk -rw-r-r--- 1 root root 128254 Jul 28 19:03 ftape.o -rwxr-xr-x 1 root root 17564 Jul 25 03:21 ftmt -rwxr-xr-x 1 root root 64161 Jul 29 20:47 grep -rwxr-xr-x 1 root root 45309 Jul 29 20:48 gzip -rwxr-xr-x 1 root root 23560 Jul 28 19:04 insmod -rwxr-xr-x 1 root root 118 Jul 28 19:04 lsmod lrwxrwxrwx 1 root root 5 Jul 28 19:04 mt -> mt-st -rwxr-xr-x 1 root root 9573 Jul 28 19:03 mt-st lrwxrwxrwx 1 root root 6 Jul 28 19:05 rmmod -> insmod -rwxr-xr-x 1 root root 104085 Jul 28 19:05 tar lrwxrwxrwx 1 root root 5 Jul 29 21:35 vi -> elvis References 1. mailto:fawcett+BH@croftj.net 2. mailto:odiechu@venus.seed.net.tw 3. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#PreMade 4. http://www.croftj.net/~fawcett/Bootdisk-HOWTO/index.html 5. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#Troubleshooting 6. http://linuxdoc.org/copyright.html 7. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#PreMade 8. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#NonRamdiskRoot 9. ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/ 10. http://www.pathname.com/fhs/2.0/fhs-toc.html 11. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#Listings 12. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#Listings 13. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#UtilityDisk 14. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#Slimfast 15. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#Slimfast 16. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#TransferringWithoutLILO 17. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#SettingRamdiskWord 18. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#PAMandNSS 19. http://metalab.unc.edu/pub/Linux/system/shells/ 20. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#UtilityDisk 21. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#BuildRoot 22. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#utilitylist 23. file://localhost/usr/src/linux/Documentation/initrd.txt 24. ftp://elserv.ffm.fgan.de/pub/linux/loadlin-1.6/initrd-example.tgz 25. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#TransferringWithLILO 26. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#Troubleshooting 27. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#Pros 28. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#CreatingRootFS 29. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#WrappingItUp 30. file://localhost/tmp/zh-sgmltools.19379/Bootdisk-HOWTO.txt.html#SettingRamdiskWord 31. http://metalab.unc.edu/pub/Linux/distributions/slackware/bootdsks.144/ 32. http://metalab.unc.edu/pub/Linux/distributions/slackware/rootdsks/ 33. http://www.slackware.com/getslack/ 34. http://metalab.unc.edu/pub/Linux/distributions/redhat/current/i386/images/ 35. http://www.redhat.com/mirrors.html 36. ftp://ftp.debian.org/pub/debian/dists/stable/main/disks-i386/current/ 37. ftp://ftp.debian.org/pub/debian/README.mirrors.html 38. http://metalab.unc.edu/pub/Linux/system/recovery/!INDEX.html 39. http://metalab.unc.edu/pub/Linux/system/recovery/images 40. http://metalab.unc.edu/pub/Linux/system/recovery/!INDEX.html 41. http://www.croftj.net/~fawcett/yard/index.html 42. ftp://tsx-11.mit.edu/pub/linux/packages/lilo/ 43. http://linuxdoc.org/FAQ/Linux-FAQ.html 44. http://linuxdoc.org/HOWTO/HOWTO-INDEX.html 45. http://linuxdoc.org/ 46. http://linuxdoc.org/LDP/sag/c1596.html 47. http://metalab.unc.edu/pub/Linux/system/boot/lilo/lilo-t-21.ps.gz 48. mailto:shigio@tamacom.com 49. http://www.tamacom.com/tour/linux/index.html 50. http://metalab.unc.edu/pub/Linux/system/boot/lilo/lilo-u-21.ps.gz