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