The Linux Bootdisk HOWTO 作者: Tom Fawcett () 译者: v4.0, April 2000, 翻译日期: 27 July 2000 本文描述如何设计与建造你自己的 Linux boot/root 磁片。这些磁片能用来当做救援磁片 (rescue disks) ,或是能用来测试新系统元件 (components) 。在企图建造你自己的 bootdisk 之前,你应该要相当熟悉系统管理工作。如果你只是想要一张紧急时使用的救援磁片,请参考 前言 -- Preface

这份文件可能已经过期了。 如果标题页上的日期距今已超过 6 个月,那麽请查阅 看看是否已有较新的版本。 虽然本文以 text 格式也是可以阅读,但是因为印刷符号的关系, 版本注意事项 -- Version notes

尚未完成的事

有任何自愿者吗 ? 请描述 (或是链结到另一份有叙述的文件)如何制作其它可开机的类磁片物品,诸如 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 这一节。 回应与感谢 -- Feedback and credits

我接受任何关於本文内容之回应,无论是好是坏。我/我们 已力求这份文件内的指令与资讯是正确而可靠的。如果你发现任何错误或遗漏,请让我知道。在撰写时, 散布政策 -- Distribution policy

Copyright © 1995,1996,1997,1998,1999,2000 by Tom Fawcett and Graham Chapman. 本文可以在 的条件下流通。如果你未能拿到此 license ,请与作者联络。 本文是一份免费文件。我们发行它是希望它能有助於你,但是 不能给你任何保证 ;本文也没有 具有商业能力 适合特定用途 的保证。

简介 -- Introduction

Linux 开机磁片 (boot disks) 在很多情况下是很有用的,诸如 测试一个新的核心 (kernel)。 从磁碟错误中复原 (这类错误从遗失开机磁区到磁碟读写头毁损都有可能) 。 修复一个瘫痪 (disabled) 的系统 安全地升级临界共用 (critical) 的系统档案 (诸如 libc.so) 。 有好几种获得 boot disks 的方法: 使用发行套件 (distribution) 像是 Slackware 所提供的。它至少能让你开机。 使用救援套件 (package) 建造用来做为救援磁片的磁片。 学习每一种 disk 运作系统时所需的东西,然後自己制作。 有些人选择最後一种方法,如此他们能靠自己动手做。这样子,如果某处发生问题,就能找 出办法去解决问题。此外也可以学到很多有关 Linux 如何运作的知识。 本文假设读者已熟悉基本的 Linux 系统管理观念。举例来说,你应该知道有关目录、 filesystems 与软碟片的议题。你也应该知道如何使用 /etc/passwd 与 fstab 这两个档案的用途以及它们看起来像什麽。最後,你应该知道 HOWTO 文件内大部分的指令,都要以 root 的身份来执行。 刚开始制作你自己的 bootdisk 是很复杂的。如果你未曾读过 Linux FAQ 与相关文件,诸如 Linux Installation HOWTO 与 Linux Installation Guide ,那麽你不应该尝试建造开机磁片。如果你只需要紧急时用的 bootdisk ,下载一个别人事先完成的 bootdisk 拿来用会 为容易。请参考下面的 以得知在哪里可以找到这些东西。 Bootdisks与开机流程 -- Bootdisks and the boot process

开机流程 -- The boot process

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 只是一个被挂上当作 ``/'' 目录的 filesystem 。 kernel 必须被告知可从哪里找到此 root filesystem ;如果 kernel 在那里找不到一个可载入的影像档 (image) ,系统就会停止运作 (halt) 。 在某些开机情况下 -- 常常是从软碟片开机 -- root filesystem 会被载入到 中,也就是被系统所存取的 RAM ,如同系统存取磁碟一般。为何系统会载入到 ramdisk 的理由有二。第一, RAM 是几个比软碟片快的有序磁性体,所以系统在其上运作较快; 第二, kernel 可以从软碟片载入一个 并且在解压缩後放到 ramdisk 上,如此可让更多的档案储存在软碟片上。 一旦 root filesystem 被载入并挂上,你会看到一行讯息像: VFS: Mounted root (ext2 filesystem) readonly. init inittab sysinit 此时系统会在 root filesystem 上找到 /bin or /sbin) 并执行它。 init 读取它的组态设定档 (configuration file) /etc/inittab ,找出档中标明 /etc/rc 或 /etc/init.d/boot 这两个档。这个 script 是一组建立基本系统服务的 shell 指令,诸如: 对所有磁碟执行 载入必备的核心模组 (modules), 启动 swapping, 进行网路初始化, 将指定在 内的磁碟挂上。 这个 script 常会启动其它各种不同的 scripts 执行模组的 (modular) 初始化。举例来说,在一般的 SysVinit 架构下, /etc/rc.d/ 这个目录包含一个复杂的子目录架构,其中的档案指出如何启动与关闭大部分的系统服务。然而,在一张 bootdisk 上,这样的 sysinit script 常常是非常简单的。 当 sysinit script 结束後,控制权回到 预设的runlevel ,此预设的 runlevel 以 inittab 内。此 runlevel line 通常指定一个像 的程式,这个程式负责处理 console 与 ttys 之间的通讯。事实上,就是 磁碟类型 -- Disk types

如果你已了解基本的开机流程,那麽我们现在可以定义所涉及到之各种不同类型的磁碟。我们将磁碟分类成四种。本文与在此讨论所称之 ``磁碟 (disk)'' 除非有特别声明,否则都是指软碟片,虽然绝大部分的讨论也同样可应用在硬碟上。 root 在其 filesystem 上包含运作 Linux 系统必备档案的一张磁片。这张磁片不一定有 kernel 或 boot loader 。 boot/root boot/root disk 一张同时包含 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 以处理多出来的东西。 建立一个root filesystem -- Building a root filesystem

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 磁碟机未被挂上时,对其执行 使用档案 (archive) 与压缩工具程式,诸如 我们将叙述如何建造一个 压缩的 filesystem ,就是平时被压缩在磁片上,只有当开机时,才会解压缩後存入ramdisk 。 制作 filesystem -- Creating the filesystem

以下是你的 root filesystem 最起码该有的目录 此处所呈现之目录架构仅供 root diskette 使用。真正的 Linux 系统有一套更为复杂且设计良好的架构方法,称为 ,它决定档案应该如何放置。 : /dev -- 里面存放设备档 (Devices) ,为达成 I/O 工作所需 /proc -- Directory stub required by the proc filesystem /etc -- 里面存放系统组态设定档 /sbin -- 重要的 (critical) 系统二进位执行档 (binaries) /bin -- 被认为是系统一部分的基本二进位执行档 /lib -- 提供 run-time 支援的共享函式库 /mnt -- 维护其它磁碟所用的磁碟挂入点 (mount point) /usr -- 额外的工具程式与应用程式 /proc 目录基本上是一个把 proc filesystem 放置於其下的 stub 。 /mnt/usr 这两个目录只是在 boot/root 系统运作时所使用的 mount points 。因此再重覆一次,这些目录只需要被造出来就可以了。 剩下的四个目录描述於以下各节。 /dev

/dev 目录包含一群特别的档案,这些档案是给系统上所有设备使用的,这样的 /dev 目录每个 Linux 系统都一定会有。这个目录本身是一个普通目录,可以以一般的方法用 指令造出来。 但还是有一条捷径 -- 直接 copy 你现有 /dev 目录的内容,然後再清除你不想要的设备档。唯一的要求是 copy 这些特别的设备档时,要用 大写字母 R 。这个指令是: cp -dpR /dev /mnt 在此我们假设磁片是被挂在 /mnt 底下。 使用磁带设备,如果你想要从 bootdisk 存取软式磁带机,你就需要 copy 所有有关的设备档。 请注意,每一个设备档需要一个 inode ,但 /dev 目录移除任何你所不需要的设备档是有意义的。举例来说,如果你没有 SCSI 磁碟,你可以放心地移除所有以 请确定从这个目录放入了以下档案的: console, kmem, mem, null, ram0 and tty1. /etc

一直都是必备的, 可能是必备的,但是没有人能十分确定。 偷跑进来的垃报。 通常可以用以下指令识出哪些是非基本的档案: ls -ltru 这个指令将档案依据上次被存取的日期,以先早後晚 (reverse) 的顺序列出,所以如果有任何档案不会被存取,那麽它们就可以从 root 磁片中删去。 在我的 root 磁片上,我的组态档数目已减至 15 个。这可减少我处理以下三种档案的工作: 我必须为 boot/root 系统进行组态设定的档案: rc.d/* -- 系统启动与改变 run level 的 scripts -- 要被挂上的 file systems 清单 -- 给 我们应该为 boot/root 系统整理的档案: -- 重要的使用者、 home 目录等其它项目的清单。 group -- 使用者群组。 shadow -- 使用者的密码。你可能没有这个档。 termcap -- the terminal capability database. 如果系统安全 (security) 对你很重要,那麽 passwdshadow 应该被删减,以避免将使用者密码 copy 出系统,这样当你从磁片开机时,不想要的 logins 会被拒绝。 至少包含了 termcap ,终端机资料库,一般而言有几百个 kilobytes 。你 boot/root 磁片的版本应该被删减到只包含你所使用的终端机,这通常就是 The rest. They work at the moment, so I leave them alone. Out of this, 我实际上只必须设定两个档,而它们所应包含的项目惊人地少。 rc 应该包含: #!/bin/sh /bin/mount -av /bin/hostname Kangaroo 请确定上述的目录都是正确的。你并不需要真地去执行 -- 如果你执行只是让系统比较好看 (译注:如此系统会有个名字) 。 应该至少要包含: /dev/ram0 / ext2 defaults /dev/fd0 / ext2 defaults /proc /proc proc defaults 你可以从你现存的 fstab copy 你想要的项目,但是你并不应该自动地挂上你硬碟任何的 partitions ;请对这些项目使用 你的 应该被改变,以使其中 rc 或无论什麽将被执行的基本开机 script 。同时,如果你想要确保不可从序列埠 login ,请在所有行尾包括 ttysttySgetty 项目前加上「#」符号 (comment out) 。请保留 tty 埠以让你可以在 console 前 login 。 一个最起码的 档看起来样这样: id:2:initdefault: si::sysinit:/etc/rc 1:2345:respawn:/sbin/getty 9600 tty1 2:23:respawn:/sbin/getty 9600 tty2 档定义了系统在各种不同的情况中将执行什麽项目,包括 startup 、切换至多使用者模式等等。请仔细地检查在 inittab 中被提及的档案名称 (filenames) ;如果 /etc/shutdown 已把 /etc/reboot 的位置写死在其中。如果我移动了 reboot/bin/reboot,然後下达一个 /etc 目录中的所有文字档 (text files) ,再加上在你 /etc 目录中,你无法确定你需不需要的所有可执行档。需要指示 (guide) 者,请参考在 的样本清单。也许只要 copy 这些档案就足够了,但是系统差异会有很大的影响,所以你无法确定你系统上相同的档案组合,就一定等於清单中的档案。唯一确定的方法就是从 /etc/rc.d/ 目录,其中包含给不同 run levels 的shell scripts 。最起码会有一个单一的 rc script,但是仅从你现存的系统 copy /etc/rc.d 这两个目录,然後删减 rc.d 目录中的 shell scripts 以移除和磁片系统环境无关的 processing ,会是较为简单的做法。 /bin 与 /sbin

/bin 目录是一个放置为了执行基本作业 (operations) 而所需之额外工具程式的方便好地方,这些工具程式诸如 /sbin 这两个目录的档案清单□例请见 。但□例中并没有包括任何从备份复原时所需之工具程式,诸如 /usr 。 工具程式磁片 ( 这节。保留一份相同版本之备份用工具程式的copy是比较好的,这个备份用工具程式被用来制作备份,如此你就不用浪费时间在尝试安装不能读取你备份磁带的版本。 请确定你包括了以下程式: /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 /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 的同时,你可能需要除去一些函式库。请看 这一节以了解 instructions 。 /lib 内,你也必须包括一个 loader 供这些函式库使用。这个 loader 不是 ld.so (给 A.OUT 函式库使用),就是 ld-linux.so (给 ELF 函式库使用)。较新版的 % 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 仔细地检查 。如果 kernel 不能载入所需的函式库,那麽 kernel 就会在没有错误讯息的情况下停止运作。 对 PAM 与 NSS 的提供 -- Providing for PAM and NSS

如果你的系统使用 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 中。 模组 -- Modules

/lib/modules 。你同时也应该包括 /etc/conf.modules 一起包括进来。 然而,使用模组的主要优点在於你可以把非关键 (non-critical)模组移到 utility disk 上,在需要用到时才载入,这样在你的 root disk 上会使用比较少的空间。如果你要处理许多不同的设备,这个方法比建立一个内建支援许多设备的巨大 kernel 来得好。 请注意,为了启动 (boot) 一个压缩的 ext2 filesystem ,你必须有 ramdisk 与内建 ext2 支援。 它们不能够以模组的方式被提供。 一些最後的细节 -- Some final details

某些系统程式,诸如 /var/run/utmp 档与 /var/log 目录不存在时,会发出警告。所以: mkdir -p /mnt/var/{log,run{ touch /mnt/var/run/utmp 最後,在你设定 (set up) 完所有你所需的函式库後,执行 /etc/ld.so.cache 。这个 cache 会告诉 loader 到哪里找到函式库。要重新制作 ld.so.cache,请下达以下指令: chdir /mnt; chroot /mnt /sbin/ldconfig Wrapping it up

/usr/src/linux 为起点。如果你在建造 kernel 上有困难,你或许不应该企图不择手段地建造 boot/root systems 。请记得用 ``把它们放在一起:制作磁片(组) -- 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 档。如果这个档存在,而且有一行像``kernel filesystem,在其中你传送 kernel 以及一些 LILO 所需的其它档案。 这一节。 用 LILO 传送 kernel -- Transferring the kernel with LILO

最後一步是要传送 root filesystem 。 如果 root filesystem 将被放置在做为 kernel 之 相同 磁片上,请使用 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 挪为紧急使用之前,请记得先测试它 !如果你的成品不能执行,请继续读下去。 问题解决 -- Troubleshooting, or The Agony of Defeat

如果 Id xxx respawning too fast: disabled for 5 minutes 它是来自於 /etc/inittab 内的呼叫 (invocations) 是正确的。如果你得到来自 /etc/inittab 内的呼叫格式是错误的。 如果你得到一个 login 提示 (prompt) ,然後你输入一个有效的 login name ,但是系统却立即提示你要输入另一个 login name ,那麽这个问题可能是出在 PAM 或 NSS 。请看 这一节。问题也可能是你使用 shadow passwords 而你却没有 copy /etc/shadow 到你的 bootdisk 上。 如果你尝试去执行某个可执行档,诸如 其它各种主题 -- Miscellaneous topics

减少 root filesystem 的 size -- Reducing root filesystem size

Q. 我从我的 boot/root 磁片开机,但是什麽都跑不出来。我现在怎麽办 ?

请看之前的 这节。 Q. Slackware/Debian/RedHat 的 bootdisk 如何运作 ?

请看之前的 这节。 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 它到你的开机磁片中。 /dev/sda2 ,但是我的 root SCSI partition 是 /dev/sda8 。为了能使用 root 磁片,你将必须使用这个指令 Q. 我如何以新的档案更新我的 root 磁片 ?

这节而得的)。然後挂上这个档案系统并且进行改变动作。你必须记住你的 root 档案系统从哪里开始,以及它占了多少 block: dd if=/dev/fd0 bs=1k skip=ROOTBEGIN count=BLOCKS | gunzip > DEVICE mount -t ext2 DEVICE /mnt 在完成改变之後,如同之前一样进行下去 (在 这节中) ,并且把 root filesystem 传送回那张磁片上。如果你并没有改变新的 root filesystem 的启始位置,你应该不用再重传 kernel ,或是重新计算 ramdisk 的 word。 Q. 我要如何移除 LILO ,好让我能再用 DOS 开机 ?

/sbin/lilo -u 你也可以使用 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 。 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 之解释,写在之前的 这节里。 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 ,不然就是利用名为 Q. 我要如何制作 boot/root 磁片的额外备份 ?

因为磁性媒介可能在一段时间後遭遇损害,你应该保留几张你的救援磁片的备份,以防原来的那一片不能被电脑读取。 制作任何磁片的备份,包括开机用与公用程式 (utility) 磁片,最简单的方法是利用 dd if=DEVICENAME of=FILENAME 在此, dd if=FILENAME of=DEVICENAME 请注意,以上的讨论是假设你只有一台软碟机。假如相同种类的软碟机你有两台,你可以利用像下面的指令去 copy 磁片: dd if=/dev/fd0 of=/dev/fd1 Q. 我如何能在每一次开机时,不用输入 “ahaxxxx=nn,nn,nn” ?

aha152x=0x340,11,3,1 这行参数字串可以利用 LILO 以数种方法提供给 kernel : 每次当系统以 LILO 开机时,你可以在命令列输入它。但是每次这样做会很烦。 你可以使用 LILO 的 你可以在 LILO 的组态档中,使用 举例来说,一行使用上述参数字串的样本命令列将长成这样: zImage aha152x=0x340,11,3,1 root=/dev/sda1 lock 如此将会传递设备参数字串给 kernel ,同时也要求 kernel 把 root 设备设定到 /dev/sda1 ,并且储存整行命令列,让以後开机时都能再使用这个命令列。 以下是一个 APPEND 叙述的样本: APPEND = “aha152x=0x340,11,3,1” 请注意参数字串在命令列上 不能 被双引号夹住,但是参数字串在 一定要 被双引号夹住。 另外也请注意,为了能让参数字串起作用, kernel 内必须有符合这个磁碟类型的驱动程式。如果没有,那麽就没有东西会去接受 (listen for) 这个参数字串,所以你将必须重新建造一个包含指定驱动程式的 kernel 。有关重新建立 kernel 的细节,请至目录 /usr/src/linux 阅读其 README 档,以及 Linux FAQ 与 Installation HOWTO 。 Alternatively ,你可以为这种磁碟类型取得一个 generic kernel 并且安装它。 在体验 LILO 安装之前,强烈建议读者先读过 LILO 文件。不小心使用 Q. 在开机的时候,出现了 “

在某些版本中, /etc/reboot 写死在其程式码内,所以 /etc 这个目录下。 因为有不能够找到 为了修正这些问题,不是移动这些程式到正确的目录,就是更改设定档 (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 不知如何是好。 资源与指示 -- Resources and pointers

救援套件 -- Rescue packages

目前可以从 metalab.unc.edu 取得数种制作救援磁片的套件。利用这些套件,你可以指定包含一组档案,接著软体就会自动地进行 bootdisk 的制作 (自动化程度会有所不同)。请看 以取得进一步的资讯。 请仔细检查档案日期 。一些套件有数年未被更新,而这些套件将无法支援「载入至 ramdisk 之压缩 root filesystem 」的制作。就目前所知, 是唯一可支援此的套件。 LILO -- the Linux loader

由 Werner Almesberger 撰写。一个优秀的 boot loader ,其文件包含了开机磁区内容的资讯,以及开机流程的初期阶段。 请从 以FTP下载。也可以从 Metalab 与映射站台内取得。 Linux FAQ 与 HOWTOs

这些文件可以从诸多来源中取得。这些文件可以从诸多来源中取得。请见 usenet 新闻论坛 中取得,而 HOWTOs 可以从 中取得。大部分 Linux 文件可以在 中找得到。 Ramdisk使用方法 -- Ramdisk usage

/usr/src/linux/Documentation/ramdisk.txt 。这份文件是由 Paul Gortmaker 所编写,同时包含了一节关於制作压缩的 ramdisk 。 Linux开机流程 -- The Linux boot process

Linux System Administrators' Guide 中,有一节是关於 booting 。 LILO ``Technical overview'' 中,拥有关於开机流程一直到 kernel 从何处被启动之决定性 (definitive) 技术上 low-level 的叙述。 Source code 是你永远的指南。以下是一些与开机流程有关的 kernel files 。如果你有 Linux 核心的原始码,你可以在你机器上的 /usr/src/linux 之中找到这些档案;此外, Shigo Yamguchi ()有非常棒的 ,可以用来读 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 的驱动程式。 LILO boot error codes

。 当 LILO 载入自己时,萤幕上会显示 (nothing) LILO 完全没有被载入。 LILO 不是没有被安装好,就是 LILO 开机磁区所在的 partition 并非使用中的 partition 。 /boot/boot.b 所造成。 如果在 LILO 正试著载入 boot image 时, BIOS 发出一个错误讯号,那麽相对映的 (respective)错误码会显示出来。错误码的□围从 Root filesystem 列表样本 -- Sample root filesystem listings