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