Next Previous Contents

3. 一般无关设备特性的启动参数

有些启动参数并非与任何设备或周边相关。 它们乃是与某个核心内部参数相关,像是内存的处理,内存磁盘的处理, 根文档系统的处理以及其它东东。

3.1 根文档系统选项

下列选项皆与核心如何选择及处理根文档系统有关。

`root=' 参数

此参数告诉核心启动时以那个设备作为根文档系统使用。 此设定的预设值为建造(bulid)核心时系统的根文档系统设备。 例如,如果核心是在一个以 `/dev/hda1' 作为根文档系统分割区的系统上建造的, 那么预设的根文档系统设备就是 `dev/hda1'。 要变更此预设值,并选择第二台软盘机作为根文档系统设备的话, 可以使用 `root=/dev/fd1'。

可用的根文档系统设备为下列设备其中之一:

(1) /dev/hdaN to /dev/hddN, 这是 ST-506 兼容磁盘 `a to d' 上的第 N 个分割区。

(2) /dev/sdaN to /dev/sdeN, 这是 SCSI 兼容磁盘 `a to e' 上的第 N 个分割区。

(3) /dev/sdaN to /dev/xdbN, 这是 XT 兼容磁盘 `a to b' 上的第 N 个分割区。

(4) /dev/fdN, 这是软盘机号码 N。 N=0 为 DOS 下的 `A:' 磁盘机,而 N=1 则为 `B:'。

(5) /dev/nfs, 这并非真的是个设备, 而是一个告诉核心经由网路取得根文档系统的旗标。

上述磁盘设备的另一种数字格式, 更为笨拙且更没有可携性的主要/次要(major/minor) 号码也能接受。 (例如 /dev/sda3 的主要号码为 8,次要号码为 3, 所以你可以使用 root=0x803 作为另一种指定方式。)

这是少数几个在核心中存有预设值, 所以可以用 rdev 公用程序改变的核心启动参数。

`ro' 参数

当核心启动时它需要有个根文档系统以读取一些基本的东西。 这就是挂在根目录的根文档系统。 然而,如果根文档系统以可以写入的方式挂上来的话, 你就无法在有文档写到一半的情况下确实地检查文档系统的完整性。 此 `ro' 选项告诉核心以唯读的方式挂入根文档系统, 如此任何文档系统一致性检查程序(fsck) 在执行检查时都可以安全地假设没有文档写到一半的情况。 没有任何程序或程序可以写入此文档系统直到它重新以可读写的方式挂入为止。

这是少数几个在核心中存有预设值, 所以可以用 rdev 公用程序改变的核心启动参数。

`rw' 参数

这与上一个完全相反,它告诉核心以可读取/写入的方式挂入根文档系统。 无论如何,预设是以可读写方式挂入根文档系统。 不要在以可读写方式挂入的文档系统上执行任何的 `fsck' 程序。

此参数使用的值与上一个储存于核心映像的参数相同,可经由 rdev 存取。

3.2 与内存磁盘(RAM Disk)管理有关的选项

下列选项皆与核心如何处理内存磁盘设备有关, 这种虚拟磁盘设备通常在安装阶段启动机器时使用, 或配合使用模块化驱动程序以存取根文档系统的机器上。

`ramdisk_start=' 参数

为了使核心映像能够与压缩的内存磁盘映像放在一张软盘内, 所以加入这个 `ramdisk_start=<offset>' 指令。 核心不能够放在压缩过的内存磁盘之文档系统映像里, 因为它得从最开始的第零磁区开始放置, 如此基本输出入系统(BIOS)才能载入启动磁区而核心也才能够开始启动执行。

注意:如果你使用的是没有压缩的内存磁盘映像, 那么核心可以是要载入内存磁盘之文档系统映像的一部份, 且该软盘可以由 LILO 启动,两者也可以如同压缩之映像般为分开的两部份。

如果你使用启动/根(boot/root)两张磁片的方式(核心一张, 内存磁盘映像放第二张)那么内存磁盘会由第零磁区开始, 并使用零作为偏移值(offset)。因为这是预设值,你根本不必真的去使用这个指令。

`load_ramdisk=' 参数

此参数告诉核心是否要载入一份内存磁盘映像。 `load_ramdisk=1' 指定核心将软盘载入至内存磁盘中。 预设值为零,表示核心不应该试著去载入内存磁盘。

请参阅 linux/Documentation/ramdisk.txt 文档中新的启动参数与如何使用它们的完整叙述。 它同时也说明如何藉由 `rdev' 来设定及储存这些个参数。

`prompt_ramdisk=' 参数

此参数告诉核心是否要给你个提示要求插入含内存磁盘映像的磁片。

在只用一张软盘的配置下内存磁盘映像与刚刚载入/启动的核心在相同的软盘上故不需要提示。 这种情况可以用 `prompt_ramdisk=0'。 在使用两张软盘的配置下你需要有个抽换磁片的机会,故可以使用 `prompt_ramdisk=1'。 因为这是预设值,所以不必真的去指定它。 (轶闻:从前人们习惯使用 `vga=ask' 这个 LILO 选项来暂时停止启动程序以取得抽换启动磁片及根磁片的机会。)

请参阅 linux/Documentation/ramdisk.txt 文档中新的启动参数与如何使用它们的完整叙述。 它同时也说明如何藉由 `rdev' 来设定及储存这些个参数。

`ramdisk_size=' 参数

因为内存磁盘实际上会依需求动态成长, 所以其大小有个上限加以限制以免它用光所有可用的内存而坏事。 预设值 4096(i.e. 4MB) 应该足够满足大部份的需求。 你可以用这个启动参数变更此预设值。

请参阅 linux/Documentation/ramdisk.txt 文档中新的启动参数与如何使用它们的完整叙述。 它同时也说明如何藉由 `rdev' 来设定及储存这些个参数。

`ramdisk=' 参数(过气了)

(注意:这个参数是旧的,除了 v1.3.47 版以及更旧的的核心之外不应该使用。 应该使用的是前面所述的指令)

这个参数以千位元组(kB)为单位指定内存磁盘设备的大小。 例如,如果想要把位于一张 1.44MB 软盘上的根文档系统载入至内存磁盘设备, 可以用:


        ramdisk=1440

这是少数几个在核心中存有预设值,所以可以用 rdev 公用程序改变的核心启动参数。

`noinitrd'(启始内存磁盘)参数

v2.x 及更新的核心有个特性,根文档系统最初是内存磁盘, 然后核心执行内存映像上的 /linuxrc。 这个特性典型系用于载入某些挂入真正的根文档系统所需要的模块 (例如,载入储存于内存磁盘映像里的 SCSI 驱动程序, 然后挂入在某 SCSI 磁盘里真正的根文档系统。)

实际的 `noinitrd' 参数决定核心启动之后如何处理 initrd 资料。 如果有指定,它可以经由 /dev/initrd 存取, 可以在内存释放回系统之前读取一次。 有关初始之内存磁盘的完整细节与使用请参阅 linux/Documentation/initrd.txt。 此外,最新版的 LILOLOADLIN 应该会包含其它有用的信息。

3.3 与内存管理有关的参数

下列参数会改变 linux 侦测或处理系统实体及虚拟内存的方式。

`mem=' 参数

 这个参数有两个目的:原先的目的是指定机器所安装的内存数量 (如果你想限制 linux 能使用的内存数量可以指定一个较小的值)。 第二个(很少用)目的则是指定 mem=nopentium 以便告诉 linux 核心不要使用 4MB 分页表(page table)这个效率特性。

在个人电脑规格中, 原先定义回传安装内存数量的基本输出入呼叫被设计成最多只能回报最多 64MB。 (是的,另一个缺乏远见的设计,就像 1024 磁簇的磁盘限制   哎。) Linux 在启动时会使用此基本输出入呼叫以确定安装的内存数量。 如果你安装的内存超过 64MB,可以用这个启动参数告诉 Linux 你有多少内存。 下面引用 Linus 对 mem= 参数的说明。

”核心会接受任何你所给予的 `mem=xx' 参数,而如果它发现你骗它, 那它迟早一定会当的很难看。 这个参数指示可以定址的最高内存位址,所以, 例如 `mem=0x1000000' 表示你有 16MB 的内存。 对拥有 96MB 的机器而言此值为 `mem=0x6000000'。

注意注意注意:

某些机器可能会使用最上层(top)的内存作为基本输出入系统的快取等等一类用途, 所以你可能并非实际拥有 96MB 的可定址空间。反之亦然:

某些蕊片组会将基本输出入系统涵盖的实体内存区域对应(map)到最上层内存后面, 所以内存最上层实际上可能是 96MB + 384kB。 如果你告诉 linux 的内存比它实际上拥有的还多,那就会出状况:也许不会立刻出事, 但最后一定会发生。”

注意,此参数并非一定得是十六进位型态, 而且可以使用 `k' 与 `M'(大小写无关)字尾分别指定千位元组以及百万位元组。 (`k' 会把你给的值旋转(shift) 10 位元,而 `M' 会旋转 20 位元。) 上述警告依然没变,沿上例, 一台 96MB 的机器也许可以设 mem=97920k 而无法使用 mem=98304kmem=96M

`swap=' 参数

这允许使用者调整某些与磁盘置换(swapping)有关的虚拟内存参数(VM)。 它接受下列八个参数:


        MAX_PAGE_AGE
        PAGE_ADVANCE
        PAGE_DECLINE
        PAGE_INITIAL_AGE
        AGE_CLUSTER_FRACT
        AGE_CLUSTER_MIN
        PAGEOUT_WEIGHT
        BUFFEROUT_WEIGHT

有兴趣的玩家建议你阅读 linux/mm/swap.c 并注意 /proc/sys/vm 里面的东西。

`buff=' 参数

类似 `swap=' 参数,这允许使用者调整某些与缓冲内存(buffer)之管理相关的参数。 它接受下列六个参数。


        MAX_BUFF_AGE
        BUFF_ADVANCE
        BUFF_DECLINE
        BUFF_INITIAL_AGE
        BUFFEROUT_WEIGHT
        BUFFERMEM_GRACE

有兴趣的玩家建议你阅读 linux/mm/swap.c 并注意 /proc/sys/vm 里面的东西。

3.4 以网路文档系统(NFS)作为根文档系统使用的参数

藉由透过网路文档系统(NFS: Network FileSystem) 提供根文档系统 Linux 支持无碟(diskless)工作站这样的系统。 这些参数系用来告诉无碟工作站要从那一台机器取得其系统。 同时要注意 root=/dev/nfs 参数是必须的。 有关使用网路文档系统作为根文档系统之细节说明在 linux/Documentation/nfsroot.txt 文档里。 你应该阅读这个文档, 因为下面只是从那个文档直接拿过来的快速摘要。

`nfsroot=' 参数

这个参数告诉核心以那一台机器, 那个目录以及哪些个网路文档系统选项作为根文档系统使用。 此参数的格式如下:


        nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

如果指令列上没有给定 nfsroot 参数,则将使用 `/tftpboot/%s' 预设值。 其它选项如下:

<server-ip> -- 指定网路文档系统伺服端的网际网路位址(IP address)。 如果没有给定此栏位,则使用由 nfsaddrs 变数(见下面)所决定的值。 此参数的用途之一是允许使用不同机器作为反向位址解析协定(RARP) 及网路文档系统伺服端。通常你可以不管它(设为空白)。

<root-dir> -- 伺服端上要作为根挂入的目录名称。如果字串中有个 `%s' 符记(token), 此符记将代换为客户端网际网路位址之 ASCII 表示法。

<nfs-options> -- 标准的网路文档系统选项。所有选项都以逗号分开。 如果没有给定此选项栏位则使用下列的预设值:

        port            = as given by server portmap daemon
        rsize           = 1024
        wsize           = 1024
        timeo           = 7
        retrans         = 3
        acregmin        = 3
        acregmax        = 60
        acdirmin        = 30
        acdirmax        = 60
        flags           = hard, nointr, noposix, cto, ac

`nfsaddrs=' 参数

这个启动参数设定网路通讯所需的各种网路界面位址。如果没有给定这个参数, 则核心会试著使用反向位址解析协定以及/或是启动协定(BOOTP)以找出这些参数。 其格式如下:


        nfsaddrs=<my-ip>:<serv-ip>:<gw-ip>:<netmask>:<name>:<dev>:<auto>

<my-ip> -- 客户端的网际网路位址。如果没设, 此位址将由反向位址解析协定或启动协定来决定。 使用何种协定端视配置核心时打开的选项以及 <auto> 参数而定。 如果设定此参数,就不会使用反向位址解析协定或启动协定。

<serv-ip> -- 网路文档系统伺服端之网际网路位址。 如果使用反向位址解析协定来决定客户端位址并且设定此参数, 则只接受从指定之伺服端传来的回应。 要使用不同的机器作为反向位址解析与网路文档系统伺服端的话, 在此指定你的反向位址解析协定伺服端(保持空白)并在 nfsroot 参数(见上述) 中指定你的网路文档系统伺服端。 如果此项目空白则使用回答反向位址解析协定或启动协定之伺服端的位址。

<gw-ip> -- 闸道(gateway)之网际网路位址,若伺服端位于不同的子网路上时。 如果此项目空白则不使用任何闸道并假设伺服端在本地的(local)网路上, 除非由启动协定接收到值。

<netmask> -- 本地网路界面的网路遮罩。 如果为空白,则网路遮罩由客户端的网际网路位址导出,除非由启动协定接收到值。

<name> -- 客户端的名称。 如果空白,则使用客户端网际网路位址之 ASCII-标记法,或由启动协定接收的值。

<dev> -- 要使用的网路设备名称。 如果为空白,所有设备都会用来发出反向位址解析请求, 启动协定请求由最先找到的设备发出。 网路文档系统使用接收到反向位址解析协定或启动协定回应的设备。 如果你只有一个设备那你可以不管它。

<auto> -- 用以作为自动配置的方法。 如果是 `rarp' 或是 `bootp' 则使用所指示的协定。 如果此值为 `both' 或空白,若配置核心时有打开这两种协定则都使用。 `none' 表示不使用自动配置。这种情况下你必须指定前述栏位中所有必要的值。

此 <auto> 参数可以作为 nfsaddrs 的参数单独使用(前面没有任何 `:` 字元), 这种情况下会使用自动配置。然而,此种情况不能使用 `none'作为值。

3.5 其它另外的核心启动参数

这些启动参数让使用者调整某些核心内部的参数。

The `debug' Argument

核心经由 printk() 函式传达重要(以及没那么重要)的信息给管理者(operator)。 如果信息很重要, printk() 函式也会显示到主控台(console)上, 就如同丢给 klogd() 记录到磁盘上一般。 如同记录到磁盘上一般在主控台上显示重要信息的原因是因为在不幸的状况下 (例如磁盘损坏)信息将无法存入磁盘而漏失。

到底什么重要什么不重要其门槛藉由 console_loglevel 变数设定。 预设是把任何比 DEBUG(等级 7)重要的东西记录到主控台上去。 (这些等级定义在 kernel.h 含入档中)指定 debug 启动参数将使主控台的记录等级设为 10, 所以所有核心信息都会出现在主控台上。

主控台记录等级通常也可以在执行期间经由 klogd() 程序选项设定。 查看你系统之安装版本的线上说明页看看该怎么做。

`init=' 参数

核心启动时预设执行 `init' 程序,这支程序接下来经由执行 getty 程序, 跑 `rc' 指令稿(scripts)以及诸如此类的东东为使用者设定电脑。 核心首先寻找 /sbin/init ,然后是 /etc/init (depreciated), 而最后它会去试 /bin/sh (可能在 /etc/rc )。 如果说,例如,如果你的 init 程序坏掉了,只要使用 init=/bin/sh

这个启动参数就能让你在启动时直接跳到解译环境(shell),使你能够换掉坏掉的程序。

`no387' 参数

某些 i387 协同处理器蕊片有臭虫(bugs),在 32 位元保护模式下会出现。 例如,部份早期的 ULSI-387 蕊片在执行浮点运算时会死当, 这似乎是因为 FRSAV/FRRESTOR 指令的一只虫。 使用 `no387' 启动参数使 Linux 就算你真的有数值辅助处理器也忽略它的存在。 当然编译核心时你必须加入数值模拟支持! 如果你有某些能够使用 80287 浮点处理单元(FPU)的古董级 386 机器那这也很有用, 因为 linux 无法使用 80287。

`no-hlt' 参数

i386(及其后继者) 家族的中央处理器有个 `hlt' 指令用来告诉中央处理器现在闲闲没事做, 直到某个外部设备(键盘,数据机,磁盘等等)呼叫中央处理器执行任务为止。 这个指令会使中央处理器进入?省电'模式, 像个死人(zombie)般坐在那里直到有个外部设备叫它起来 (经由中断(interrupt) ,通常是)。 部份早期的 i486DX-100 蕊片处理这个 `hlt' 指令有问题, 使用过这个指令后它们不能可靠地回到运作模式。 使用 `no-hlt' 这个指令告诉 Linux当无事可做时跑个无穷回圈而停住你的中央处理器。 让有这些蕊片的人们能够使用 Linux,然而还是建议有可能的话就换掉这些蕊片。

`no-scroll' 参数

启动时使用这个参数可以关闭卷页(scrolling)特性,这个特性使得 Braille 终端机难以使用。

`panic=' 参数

在不太可能发生的核心异常(kernel panic)事件下(像是核心侦测到内部错误, 并认为这样的错误严重到应该发出警告并停止任何作业),

预设的处理方式是就停在那儿直到有人过来并注意到萤幕上的异常警告然后重新启动机器。

然而如果机器是在无法触及,隔离的地方跑的话也许会希望它能自动重置自己然后回到线上。 例如,启动时使用 panic=30 会使核心在发生核心异常 30 秒后试著重新启动自己。 若此值为零则使用预设的处理方式,就是一直在那儿等。

注意,这个逾时(timeout)设定也可经由 /proc/sys/kernel/panic 系统控制 (sysctl)界面读取与设定。

`profile=' 参数

核心发展者们可以打开某个选项以得知核心如何使用中央处理器时间以及用在那里, 以便最大化效率(efficiency)与效率(performance)。 这个选项让你在启动时设定观察变化的计数(the profile shift count)。 此值一般设为二。你也可以在编译核心时打开此功能。无论那种情况,你都需要像 readprofile.c 这类可以处理 /proc/profile 输出的工具。

`reboot=' 选项

这个选项控制重置电脑时 (典型是经由 /sbin/init 处理的 Control-Alt-Delete 动作) Linux 所做的重新启动之种类。 新的 v2.0 核心预设的动作是做?冷'开机 (完全重置,基本输出入系统执行内存检查等等)以代替?暖'开机 (没有完全重置,没有内存检查)。

改为预设冷开机是为了要在便宜的/烂烂的,暖开机请求没办法重新启动的硬件上工作。 可以使用 reboot=w 设为原先的方式(暖开机),其实可以用任何以 w 开头的字来设定。

为什么这会造成困扰? 某些具有内存快取的磁盘控制器能够感测到暖开机, 并且把所有暂存的资料写到磁盘上。 冷开机可能会重设该卡,在快取卡内存里面的回写(write-back)资料就会漏失。 已经有人回报系统内存检查很花时间以及/或是小型电脑智慧界面基本输出入系统 (SCSI BIOSes)冷开机时花较久的时间初始化是使用暖开机的好理由。

`reserve=' 参数

这是用来保护输出入埠区域不要侦测。这个指令的格式是:

reserve=iobase,extent[,iobase,extent]...

在某些机器上也许必须避免设备驱动程序去检查(自动侦测)在某些特殊区域的设备。 这可能是因为硬件设计的不良而会使得启动终止(像是某些乙太网路卡), 会被误认的硬件,状态会因为较前面的侦测而改变的硬件, 或者只是你不想让核心初始化的硬件。

reserve 启动时期参数藉由指定一段不要侦测的输出入埠范围以解决此问题。 此段区域在核心的输出入埠注册表格当中被视为已经在该处找到设备 (名称为 reserved )而保留。注意,绝大部份的机器都不需要此机制。 只有真的有问题或特殊情况才会需要用到这东东。

位于指定之区域中的输出入埠乃是靠著在侦测一段输出入区域之前先执行 check_region() 以避免设备侦测。 这用于某些遇上 NE2000 会挂掉或者会误认其它设备的驱动程序。

正确的设备驱动程序不应该去侦测保留区域,除非另一个启动参数明确地指示它这样做。 这意谓著 reserve 经常与其它启动参数一起使用。 如果你指定一段保留区域以保护某特定设备的话, 你必须明确地指定此设备的侦测范围, 大部份的驱动程序如果有给它们明确的位址就会忽略输出入埠注册表。

例如,此启动列


        reserve=0x300,32  blah=0x300

保留 0x300-0x31f 不让除了 `blah' 的设备驱动程序外的所有驱动程序去侦侧。

如同一般启动时期所用的格式,它也有 11 个参数之限制, 因此每个 reserve 关键字只能指定 5 个保留区域。 如果你有异常复杂的需求,可以使用多重 reserve 指定。

`vga=' 参数

注意,这并不真的是个启动参数。它是由 LILO 解译的选项, 与所有其它由核心处理的启动参数并不相同。 然而因为它的使用变得如此普遍故值得在此加上一笔。 这个选项也可以经由使用 rdev -v 或相同的 vidmode 指令对 vmlinuz 文档作设定。 这使得设定程序码能够在真的启动 Linux 核心之前使用视讯(video)基本输出入系统改变预设的显示模式。 典型的模式是 80x50, 132x44 等等。 使用此选项最好的方式是以 vga=ask 启动, 如此在启动核心前会有个列表提示你的显示卡可以使用的各种模式。 一旦你从上述列表得知你想使用的号码,以后就可以把它放在 `ask' 的位置。 更进一步的信息请参阅随附于所有新版核心的 linux/Documentation/svga.txt 文档。

注意,新的核心(2.1 版以上)有改变显示模式的设定程序码选项 Video mode selection support, 所以如果你想使用这个特性那么你就得打开这个选项。


Next Previous Contents