Next Previous Contents

5. 進階的主題

5.1 PCMCIA 設備的資源分配

理論上, 哪一個插斷被使用到哪個設備上都沒關係。 只要兩個 (或以上 ) 設備不被建構成使用相同的插斷即可。在 /etc/pcmcia/config.opts 裏你可以發現有個地方用來排除那些被非 PCMCIA 設備所使用著的插斷。

同樣地,也沒有辦法可以直接指定 I/O 位址給一個 PCMCIA 卡來使用。 /etc/pcmcia/config.opts 檔案允許你指定可被所有的 PCMCIA 設備所使用的埠範圍, 或是排除那些會和其他設備相衝突的埠範圍。

在修改了 /etc/pcmcia/config.opts後,你可以使用 ``kill -HUP'' 來重新啟動 cardmgr

被用來監視卡片狀態的插斷是在 cardmgr 處理 /etc/pcmcia/config 檔案之前由低階的插槽驅動程式模組 (i82365tcic) 所選擇 的。因此改變這個檔案並不會有什麼影響。要設定這個插斷,在插槽驅動程 式被載入時,設定在 /etc/rc.d/rc.pcmcia 內的 PCIC_OPTS 變數使用 cs_irq= 選項。

所有的客戶端卡片驅動程式都有個叫做 irq_list 的參數。 被用來指 定哪些插斷可用試著用來配置給他們的。這些驅動程式選項應該被設定在你 的 /etc/pcmcia/config 檔案裏。例如:

device "serial_cs"
  module "serial_cs" opts "irq_list=8,12"
  ...

會指定串列埠驅動程式只使用 irq 8 或 irq 12。 不管 irq_list 的設定如何, 卡片服務程式 Card Services 絕不會分配已被其他設備所使 用了的插斷,或是在建構檔裏被排除的插斷。

5.2 我怎樣才能為家庭及工作的使用做各別的設備設定呢?

我們可以很簡單地使用 PCMCIA ``scheme'' 支援來達成。 使用兩種不同的 建構 schemes,分別叫 ``home'' 及 ``work''。 以下是個有 scheme 指定 的設定的 network.opts 手稿範例:

case "$ADDRESS" in
work,*,*,*)
    # definitions for network card in work scheme
    ...
    ;;
home,*,*,*|default,*,*,*)
    # definitions for network card in home scheme
    ...
    ;;
esac

PCMCIA 設備位址的首要部份都是建構 scheme。 在這個例子中, 第二個 ``case'' 句子會從 ``homee'' 和 ``default'' schemes 中挑選一個。 因 此,不管任何理由 scheme 並沒被設定了,內定值是 ``home'' 設定。

現在,要在二個設定集裏頭挑選一個,可執行:

cardctl scheme home

或者是

cardctl scheme work

cardctl 命令相當於關掉所有的卡片後再重啟動它們。 不管 PCMCIA 系統是否被載入,這個命令都可安全地被執行。但是如果你在當時正在使用 其他的 PCMCIA 設備時這個命令可能會失敗。 (雖然他們的建構並不完全依 靠 scheme 的設定。 )。

要知道目前 PCMCIA scheme 的設定,執行:

cardctl scheme

5.3 從 PCMCIA 設備開機

要在一個 PCMCIA 設備上做個檔案系統需要耍個小把戲可行, 因為 Linux 的 PCMCIA 系統並沒有設計成連接到核心程式上。它的主要元件,可載入式 核心模組以及使用者模式的 cardmgr 精靈是仰賴在一個已經在執行的系統 上。核心的 ``initrd'' 以允許 Linux 使用一個有最小化的根 映像檔、載入驅動程式的暫時性的動態記憶體磁碟來開機,然後再重新掛上 一個不同的根檔案系統。這個暫時的根系統可以建構 PCMCIA 設備,然後再 把它重新掛成一個根系統。

initrd 映像檔絕對必須存放在一個可開機的設備上: 一般來說這就無法放 到 PCMCIA 設備上了。這是因為 BIOS 的限制,可不是核心的限制。在這裏 , 能夠分辨出 `` 可開機的 (boot-able)'' 設備 (例如,任何可以做開機 使用的設備 ) 與 `` 可做根系統的 (root-able)'' 設備 (例如,可以被掛 入成為根系統的設備 ) 的不同處也是很重要的。 `` 可開機的 (Boot-able) '' 設備是由 BIOS 所決定的, 通常是內部軟碟機和硬式磁碟 機。`` 可做根系統的 (root-able)'' 設備是任何可以在被載入即即被核心 所支援的區塊設備。 initrd 的功能可使更多的設備變成 `` 可做根系統的 (root-able)'',而非 ``可開機的 (boot-able)''。

有些 Linux 供應版本允許安裝到 PCMCIA SCSI 卡接著的設備上。使得它們 無意地多出了可支援從 PCMCIA SCSI CD-ROM 設備來安裝的邊際效應。 然而, 到目前為止, 並沒有任何 Linux 安裝工具支援建構一個可以從 PCMCIA 根檔案系統上開機到 Linux 的合適 ``initrd''。 設立一個以 PCMCIA 根檔案的 Linux 系統需要您使用其他的 Linux 系統來產生一個 ``initrd'' 映像檔案。如果沒有可用的其他 Linux 系統,另一個替代方法 是做最小安裝到非 PCMCIA 磁碟上,建立一個 initrd 映像檔,然後再重新 安裝到 PCMCIA 目地設備上。

在 Linux Bootdisk-HOWTO 裏有一些關於設定開機磁碟片的一般資訊,但卻 沒有任何有關於 initrd 的資訊。 initrd 的主要文件被放在最新的核心程 式碼供應版本裏頭, 在 linux/Documentation/initrd.txt。 在開始前,你應該要先讀一下這份文件。 對於 lilo 的熟悉也是有助 益的。 要使用 initrd 也需要你已有個將 CONFIG_BLK_DEV_RAMCONFIG_BLK_DEV_INITRD 功能打開後所編譯出來的核心。

這是個高等建構技術, 需要您對 Linux 以及 PCMCIA 系統有一定程度的熟 悉度。請確認在您閱讀完所有相關的文件後再開始。下面的 `` 食譜 '' 應 該是可行的, 但是一旦不依照範例來做的話, 就會很快地將你推向未知及 `` 不被支援的 '' 地方,那你就得自己來的。

這方法需要你一定要使用 PCMCIA 驅動程式 2.9.5 或最新的版本才可以。 舊的 PCMCIA 套件或是個別的元件並不能在 initrd 裏使用。請不要將不同 的版本的元件混合了。

pcinitrd 輔助員手稿

pcinitrd 手稿用來建立一個使用 PCMCIA 根磁區分割來啟動 Linux 的基本 initrd 映像檔。 該映像檔裏包含一個最小的目錄層級結構 、 以及有用的設備檔案、一些二進位檔案、共用程式庫檔以及一套 PCMCIA 驅動程式模組。 當你執行 pcinitrd 時,要指定要要包含進去映像檔 裏面的驅動程式模組名稱。 而主要 PCMCIA 核心元件 pcmcia_coreds會被自動地包含進去。

例如,假設你的筆記電腦使用一個 i82365 同容的 PCMCIA 主控制器,而你 想從一個接著 Adaptec SlimSCSI 卡而裝有根檔案系統的硬碟上啟動 Linux 。你可以建立一個合適的 initrd 映像檔,方法如下:

pcinitrd -v initrd pcmcia/i82365.o pcmcia/aha152x_cs.o

來自訂 initrd 啟使排程,你可以用下面的命令來使用 ``loopback'' 設備 來掛上該映像檔案:

mount -o loop -t ext2 initrd /mnt

然後編修 linuxrc 手稿。 PCMCIA 建構的檔案會被安裝到映像檔案裏 頭的 /etc 內, 當然你也可以自已設定。 細節請看 pcinitrd 的 man 頁。

建立一個 initrd 開機軟碟片

在建立了 pcinitrd 映像檔後, 你可以利用拷貝核心的方式來做一片 可開機的磁碟片, 並把被壓縮的 initrd 映像檔、支援給 lilo 使用 的檔案到一張空白磁碟片上。 下面的列子, 我們假設我們需要的 PCMCIA 根設備是 /dev/sda1:

mke2fs /dev/fd0
mount /dev/fd0 /mnt
mkdir /mnt/etc /mnt/boot /mnt/dev
cp -a /dev/fd0 /dev/sda1 /mnt/dev
cp [kernel-image] /mnt/vmlinuz
gzip < [initrd-image] > /mnt/initrd

建立一個包含下面內容的 /mnt/etc/lilo.conf 檔案:

boot=/dev/fd0
compact
image=/vmlinuz
    label=linux
    initrd=/initrd
    read-only
    root=/dev/sda1

最後,執行 lilo 如下:

lilo -r /mnt

lilo 被執行時配合使用 -r 選項,它會做所有與被指定的根 目錄的相關動作。 在 /mnt/dev 裏建立設備檔案的理由是, 當它是在替代的根目錄模式下 lilo 並無法使用在 /dev 內 的檔案。

安裝 initrd 映象檔到非Linux 磁碟內

initrd 功能一般都使用在當內部的硬碟機被分派給其他的作業系統使用時 。 Linux 核心以及 initrd 映像檔可以被放在非 Linux 的磁區分割內, 而且 lilo 或是 LOADLIN 可以被設定由這些映像檔來開啟 Linux 系統。

假設你有個已被建構好合適的根設備,且 initrd 映像檔被建立在另外的系 統上了,啟動 Linux 系統的最容易方法是使用 LOADLIN,如下:

LOADLIN <kernel> initrd=<initrd-image>

一旦你可以在你的目標機器上啟動 Linux, 你就可以安裝 lilo 來允 許直接地啟動 Linux 了。 例如,假設 /dev/hda1 是個非 Linux 的目標磁區分割,且 /mnt 可以被用做為掛入點。 首先,在目標 磁區分割上建立一個放 Linux 檔案的子目錄:

mount /dev/hda1 /mnt
mkdir /mnt/linux
cp [kernel-image] /mnt/linux/vmlinuz
cp [initrd-image] /mnt/linux/initrd

在這個例子中, 假設 /dev/sda1 是我們要做為 Linux 根分割的 磁碟, 它是個經由 PCMCIA SCSI 卡所掛上的 SCSI 硬碟機。 要安裝 lilo,請建立一個有以下內容的 lilo.conf 檔:

boot=/dev/hda
map=/mnt/linux/map
compact
image=/mnt/linux/vmlinuz
        label=linux
        root=/dev/sda1
        initrd=/mnt/linux/initrd
        read-only
other=/dev/hda1
        table=/dev/hda
        label=windows

boot= 這行裏說要在指定的設備之主開機記錄 MBR( master boot record) 裏安裝開機載入程式。 root= 這行指出在載入 initrd 映像 檔後需要使用的根檔案系統,如果核心映像檔裏已這麼建構了那就不需這麼 做了。 在 other= 那行是用來描述說有其他的作業系統被安裝在 /dev/hda1 裏。

要安裝這個例子裏的 lilo ,使用:

lilo -C lilo.conf

記得在這個案子裏,lilo.conf 檔案使用了包括 /mnt 在內 的絕對位址。我用這個例子的原因是目標檔案系統並不一定支援使用 boot=root= 選項來建立 Linux 設備檔案的建立。


Next Previous Contents