---- Linux 的 引 導 可 以 采 用 多 種 方 式, 其 加 載 器LILO(Linux Loader) 是 一 個 靈 活 的 引 導 加 載 程 序, 對 其 深 入 的 理 解, 將 有 助 於 我 們 方 便 地 處 理 多 重 系 統、 網 絡 引 導、 大 硬 盤 及 大 內 存 等 諸 多 問 題。 一、 LILO 的 引 導 機 制 ---- 眾 所 周 知, 計 算 機 的 最 初 啟 動 是 由BIOS 控 制 的, 在 對 一 些 硬 件( 如 內 存、 鍵 盤 等) 初 始 化 之 後, 它 會 試 圖 加 載 硬 盤 的 主 引 導 記 錄(MBR) 或 軟 盤 的 引 導 扇 區。 ---- MBR 可 通 過 兩 種 方 式 運 行: 其 一 是 定 位 到 活 動 分 區 並 加 載 相 應 的 引 導 扇 區, 然 後 由 引 導 扇 區 完 成 該 分 區 內 操 作 系 統 的 基 本 組 件 的 加 載; 其 二 是 直 接 從 一 指 定 分 區 中 加 載 信 息, 並 通 過 它 裝 入 任 一 分 區 中 的 操 作 系 統, 諸 如LILO、OS/2 Boot Loader 以 及Partition Magic 等 引 導 加 載 程 序 都 可 以 配 置 成 這 種 方 式。 軟 盤 的 引 導 扇 區 相 當 於 硬 盤 活 動 分 區 的 引 導 扇 區, 它 用 於 裝 入 軟 盤 上 的 操 作 系 統。 ---- 由 此 可 見, 只 要 把LILO 安 裝 在MBR、 活 動 分 區 或 者 引 導 軟 盤 上, 就 能 接 管 計 算 機 的 控 制 權, 然 後 由LILO 完 成 後 繼 的 引 導 過 程。LILO 中 建 有 一 個 引 導 表 地 址 編 碼, 借 此, 它 的 引 導 程 序 就 能 定 位 到Linux 的 內 核 文 件, 這 種 地 址 編 碼 既 可 以 按 照 柱 面/ 磁 頭/ 扇 區(CHS) 模 式, 又 可 以 采 用LBA 的 線 性 塊 號 模 式, 因 此, 即 使 是 對 某 些SCSI 控 制 程 序,LILO 也 能 良 好 運 行。 ---- 當LILO 定 位 到 配 置 文 件 後, 經 過 預 引 導 過 程, 就 顯 示 提 示 符"LILO boot:", 此 時, 系 統 允 許 選 擇 引 導 不 同 的 操 作 系 統 或 者 不 同 的 內 核 配 置, 按Tab 鍵 顯 示 可 選 項 列 表, 然 後 輸 入 可 選 項 或 者 直 接 回 車 選 擇 缺 省 配 置, 如 果 選 擇 了 引 導Linux, 還 可 以 直 接 傳 遞 參 數 到 系 統 內 核。 ---- 和 其 他 系 統 的 引 導 加 載 程 序 相 比,LILO 具 有 更 高 的 靈 活 性, 其 引 導 方 式 也 更 豐 富: ---- ① 當LILO 被 安 裝 在 硬 盤 的MBR、 活 動 分 區 或 引 導 軟 盤 上 時, 作 為 原 引 導 程 序 的 替 身, 它 能 引 導 任 一 硬 盤 任 一 分 區 上 的 Linux 和 其 他 操 作 系 統。 ---- ② 除 了 引 導 扇 區, 它 沒 有 任 何 隱 含 文 件, 也 不 需 要 使 用 特 定 的 分 區, 它 的 配 置 文 件 可 以 在 任 何 分 區, 甚 至 是 存 放 在 與Linux 毫 不 相 干 的DOS 分 區 的 某 個 子 目 錄 下。 ---- ③ 它 能 引 導 幾 個 不 同 的 內 核 配 置, 甚 至 是 幾 個 不 同 的 內 核。 ---- ④ 它 能 引 導 同 一 機 器 上 的 多 個Linux 版 本。 ---- ⑤ 它 能 從 網 絡 上 引 導Linux。 ---- 正 是 由 於LILO 的 靈 活 性, 使 得 其 配 置 變 得 相 當 復 雜, 當 有 多 個 系 統 共 存 時, 建 議 先 安 裝 其 他 操 作 系 統, 最 後 再 安 裝 Linux, 這 樣, 設 置LILO 對 其 他 系 統 的 引 導 會 相 對 簡 單 一 些。 二、LILO 引 導 的 幾 個 參 數 ---- 在 此 只 介 紹 本 文 涉 及 到 的 幾 個 參 數。 ---- 'boot=': 此 參 數 指 明 包 含 引 導 扇 區 的 設 備 名( 如/dev/had), 若 此 項 忽 略, 則 從 當 前 的 根 分 區 中 讀 取 引 導 扇 區。 ---- 'root=': 此 參 數 告 訴 內 核 啟 動 時 以 哪 個 設 備 作 為 根 文 件 系 統 使 用, 其 設 定 值 為 構 造 內 核 時 根 文 件 系 統 的 設 備 名, 可 用 的 設 備 名 有: ---- ①/dev/hdaN~/dev/hddN:ST-506 兼 容 硬 盤,a 到d 上 的N 個 分 區。 ---- ②/dev/sdaN~/dev/sdeN:SCSI 兼 容 硬 盤,a 到e 上 的N 個 分 區。 ---- ③/dev/xdaN~/dev/xdbN:XT 兼 容 硬 盤,a 到b 上 的N 個 分 區。 ---- ④/dev/fdN: 軟 盤,A:(N=0) 或B:(N=1)。 ---- ⑤/dev/nfs: 由 網 絡 取 得 根 文 件 系 統 的 標 志。 ---- 'image=': 指 定Linux 的 內 核 文 件。 ---- 'delay=': 設 定 引 導 第 一 個 映 像 前 的 等 待 時 間。 ---- 'disk=': 此 參 數 為 某 一 特 殊 的 硬 盤 定 義 非 標 准 參 數。 ---- 'append=': 為 內 核 傳 遞 一 個 可 選 的 參 數 行, 其 典 型 的 應 用 是 為 不 能 完 全 由 系 統 自 動 識 別 的 硬 盤 指 定 參 數, 如 append="hd=64,32,202"。 ---- 'label=': 此 參 數 為 每 個 映 像 指 定 一 個 名 字, 以 供 引 導 時 選 擇。 ---- 'install=': 安 裝 一 個 指 定 文 件 作 為 新 的 引 導 扇 區, 缺 省 為 /boot/boot.b。 ---- 'table=': 說 明 包 含 分 區 表 的 設 備 名, 如 果 此 參 數 忽 略, 引 導 加 載 程 序 將 不 能 傳 遞 分 區 信 息 到 已 引 導 的 操 作 系 統。 三、LILO 典 型 配 置 方 法 ---- 通 常 情 況 下,Linux 的 安 裝 程 序 自 身 就 可 以 完 成LILO 的 安 裝 配 置, 從 而 較 好 地 解 決 多 重 系 統 的 引 導 問 題, 如 果 系 統 不 能 自 動 完 成 這 種 配 置, 那 麼 可 以 通 過 手 工 修 改 配 置 文 件 /etc/lilo.conf 來 實 現 不 同 條 件 下 的 引 導。 ---- 1 . 當 系 統 能 自 動 完 成 配 置 時 ---- 對 於 這 種 情 況, 只 有 一 個 建 議: 將LILO 安 裝 到Linux 分 區 的 根 上, 而 不 是MBR。 假 設 當 前hda1 中 裝 有DOS/Windows,hda2 中 安 裝 Linux, 則/etc/lilo.conf 的 內 容 大 致 如 下: boot=/dev/hda2 #指定引導位置 compact delay=5 #延時5秒 root=current #根在當前分區 image=/boot/vmlinux #指定Linux的內核文件 label=linux #用Linux為代表名稱 other=/dev/hda1 #其他操作系統所在的分區 table=/dev/hda #指定包含分區表的硬盤 label=dos #用dos為代表名稱 ---- 2 . 當 系 統 無 法 自 動 完 成 配 置 時 ---- 不 外 乎 兩 種 情 況: 其 一 是BIOS 不 能 直 接 看 到Linux 的 根 分 區 ; 其 二 是BIOS 只 能 讀 寫 標 准IDE 硬 盤 的 前504MB。 這 時, 必 須 遵 循 一 個 最 基 本 的 原 則: 建 立 一 個BIOS 能 存 取 的 較 小 的Linux 分 區, 其 中 包 含 內 核 文 件、 映 射 文 件 以 及 鏈 加 載 程 序 等 必 要 的 內 容, 而 根 則 可 以 是 另 外 一 個 獨 立 的 分 區。 至 於 配 置 上 的 其 他 細 節, 從 以 下 實 例 來 說 明。 ---- 例1: 主 硬 盤 為IDE 接 口, 第 二 硬 盤 為SCSI 接 口, 根 文 件 在SCSI 上。 ---- 對 策: 在IDE 硬 盤 上 劃 分 一 個 較 小 的Linux 分 區(/dev/hda2), 其 中 包 含 基 本 文 件, 掛 接 到/u2 下, 其 配 置 文 件/etc/lilo.conf 的 主 要 內 容 為: boot=/dev/hda #LILO裝在主IDE的MBR install=/u2/etc/lilo/boot.b #從boot.b安裝LILO引導記錄 map=/u2/etc/lilo/map #安裝程序建立此映射文件, 告訴引導載入程序內核塊的位置 compact timeout=50 image=/u2/vmlinux #內核文件應事先拷貝到/u2下 label=linux root=/dev/sda1 #告訴內核根系統在SCSI硬盤上 read-only other=/dev/hda1 loader=/u2/etc/lilo/chain.b #指明加載程序 label=dos ---- 例2: 一 個 標 准 的IDE 大 硬 盤 需 安 裝Linux 和DOS/Windows。 ---- BIOS 的int 13 調 用 是 采 用3 個 位 元 組 的 CHS 編 碼,10 位 為 柱 面 號,8 位 為 磁 頭 號,6 位 為 扇 區 號。 可 能 的 柱 面 號 碼 是0 ~1023, 可 能 的 磁 頭 號 碼 是0 ~255, 而 磁 道 上 可 能 的 扇 區 號 碼 是1 ~63, 以 這24 位 最 多 可 以 定 址7.875GB。 但 不 幸 的 是, 標 准 的IDE 界 面 容 許 256 個 扇 區 / 磁 道、 65536 個 柱 面 以 及16 個 磁 頭。 它 自 己 本 身 可 以 存 取128GB, 但 是 除 去BIOS 方 面63 個 扇 區 與1024 個 柱 面 後 只 剩 504MB 可 以 定 址。 ---- 對 策: 在 硬 盤 的 前500MB 中 劃 分350MB(/dev/hda1) 給DOS, 150MB(/dev/hda2) 給Linux, 在 相 應 的 配 置 文 件 中 應 說 明 硬 盤 的 參 數: boot=/dev/hda ... disk=/dev/hda bios=0x80 sectors=63 heads=16 cylinders=2100 image=/vmlinux append="hd=2100,16,23" root=/dev/hda2 label=linux 四、 LILO 的 卸 裝 ---- 當LILO 覆 蓋 了 引 導 扇 區 時, 它 會 保 留 一 個 引 導 扇 區 的 備 份 在/boot/boot.xxyy 中, 其 中xxyy 是 十 六 進 制 的 設 備 主 / 次 號 碼 (major/minor numbers), 利 用 命 令"ls -l /dev/device" 就 可 獲 得 硬 盤 或 分 區 的 主 / 次 號 碼。 若 要 卸 裝LILO, 只 需 恢 復 初 始 的 引 導 扇 區。 例 如:LILO 安 裝 在/dev/had, 對 應 的 備 份 文 件 為 /boot/boot.0300, 使 用 下 面 的 命 令 即 可: ---- dd if=/boot/boot.0300 of=/dev/_had bs=446 count=1 ---- ( 作 者 地 址: 巨 化 集 團 公 司 計 算 中 心,324004; 收 稿 日 期:1999年6 月)