如果模块都已正确加载,则在未插入任何卡的情况下,lsmod
命令的输出应如下所示
Module Size Used by
ds 5640 2
i82365 15452 2
pcmcia_core 30012 3 [ds i82365]
系统日志还应包含来自套接字驱动程序的输出,描述找到的主机控制器以及检测到的套接字数量。
cardmgr
守护进程负责监控 PCMCIA 套接字,在需要时加载客户端驱动程序,以及运行用户级脚本以响应卡的插入和移除。它将其操作记录在系统日志中,但也使用蜂鸣声来指示卡状态的变化。蜂鸣声的音调表示特定配置步骤的成功或失败。两声高音蜂鸣表示卡已被识别并成功配置。一声高音蜂鸣后跟一声低音蜂鸣表示卡已被识别,但由于某种原因无法配置。一声低音蜂鸣表示卡无法识别。
cardmgr
守护进程基于保存在 /etc/pcmcia/config
中的已知卡类型数据库来配置卡。此文件描述了各种客户端驱动程序,然后描述了如何识别各种卡,以及哪些驱动程序属于哪些卡。此文件的格式在 pcmcia(5)
手册页中描述。
Cardmgr
将每个套接字的设备信息记录在 /var/lib/pcmcia/stab
中。以下是一个 stab
列表示例
Socket 0: Adaptec APA-1460 SlimSCSI
0 scsi aha152x_cs 0 sda 8 0
0 scsi aha152x_cs 1 scd0 11 0
Socket 1: Serial or Modem Card
1 serial serial_cs 0 ttyS1 5 65
对于描述设备的行,第一个字段是套接字,第二个字段是设备类别,第三个字段是驱动程序名称,第四个字段用于编号与同一驱动程序关联的多个设备,第五个字段是设备名称,最后两个字段是此设备的主设备号和次设备号(如果适用)。有关更多信息,请参见 stab
手册页。
在 2.4 及更高版本的内核中,CardBus 卡的热插拔 PCI 驱动程序不由 cardmgr
管理;它们由 hotplug
子系统管理。有关此工具的更多信息,请参见 http://linux-hotplug.sourceforge.net。当 cardmgr
看到一张由热插拔 PCI 驱动程序拥有的卡时,它将忽略该卡。当这些卡插入或弹出时,会有一声蜂鸣,但它们在系统日志和 stab
文件中仅被识别为“CardBus 热插拔设备”。
cardctl
命令可用于检查套接字的状态,或查看其配置方式。它也可以用于更改卡的配置状态。以下是“cardctl config
”命令的输出示例
Socket 0:
not configured
Socket 1:
Vcc = 5.0, Vpp1 = 0.0, Vpp2 = 0.0
Card type is memory and I/O
IRQ 3 is dynamic shared, level mode, enabled
Speaker output is enabled
Function 0:
Config register base = 0x0800
Option = 0x63, status = 0x08
I/O window 1: 0x0280 to 0x02bf, auto sized
I/O window 2: 0x02f8 to 0x02ff, 8 bit
或 “cardctl ident
”,以获取卡识别信息
Socket 0:
no product info available
Socket 1:
product info: "LINKSYS", "PCMLM336", "A", "0040052D6400"
manfid: 0x0143, 0xc0ab
function: 0 (multifunction)
“cardctl suspend
” 和 “cardctl resume
” 命令可用于关闭卡,而无需卸载其关联的驱动程序。“cardctl reset
” 命令尝试重置和重新配置卡。“cardctl insert
” 和 “cardctl eject
” 模拟物理插入或弹出卡时执行的操作,包括加载或卸载驱动程序以及配置或关闭设备。
如果您正在运行 X,则 cardinfo
实用程序会生成一个图形显示,显示所有 PCMCIA 套接字的当前状态,内容与 “cardctl config
” 类似。它还为大多数其他 cardctl
功能提供图形界面。
理论上,您可以随时插入和移除 PCMCIA 卡。但是,最好不要弹出当前正在被应用程序使用的卡。早于 1.1.77 的内核在弹出串行/调制解调器卡时经常会锁定,但这现在应该已修复。
某些卡类型不能安全地热弹出。具体来说,ATA/IDE 和 SCSI 接口卡不是热插拔安全的。这不太可能被修复,因为完整的解决方案将需要对 Linux 块设备模型进行重大更改。此外,通常热弹出任何类型的 CardBus 卡都是不安全的。随着 CardBus 驱动程序中的热插拔错误被发现和修复,这种情况可能会逐渐改善。对于这些卡类型(IDE、SCSI、CardBus),建议您在弹出之前始终使用 “cardctl eject
”。
如果您已将内核配置为支持 APM,则卡服务可以编译为支持 APM(高级电源管理)。APM 内核驱动程序由 Stephen Rothwell (Stephen.Rothwell@canb.auug.org.au) 维护。apmd
守护进程由 Avery Pennarun (apenwarr@worldvisions.ca) 维护,更多信息请访问 http://www.worldvisions.ca/~apenwarr/apmd/。如果在您的系统上检测到兼容版本,PCMCIA 模块将自动配置为 APM。
无论是否配置了 APM,您都可以在挂起笔记本电脑之前使用 “cardctl suspend
”,并在恢复后使用 “cardctl resume
”,以干净地关闭和重启您的 PCMCIA 卡。这不适用于正在使用的调制解调器,因为串行驱动程序无法保存和恢复调制解调器的操作参数。
APM 在某些系统上似乎不稳定。如果您在系统上遇到 APM 和 PCMCIA 的问题,请尝试将问题缩小到其中一个软件包,然后再报告错误。
某些驱动程序,特别是 PCMCIA SCSI 驱动程序,无法从挂起/恢复周期中恢复。当使用 PCMCIA SCSI 卡时,始终在挂起系统之前使用 “cardctl eject
”。
要卸载整个 PCMCIA 软件包,请使用以下命令调用 rc.pcmcia
/etc/rc.d/rc.pcmcia stop
此脚本将运行几秒钟,以便所有客户端驱动程序有时间优雅地关闭。如果设备当前正在使用,则关闭将不完整,并且某些内核模块可能不会被卸载。为避免这种情况,请在使用 rc.pcmcia
之前使用 “cardctl eject
” 关闭所有套接字。cardctl
命令的退出状态将指示是否有任何套接字无法关闭。
以下信息适用于由 cardmgr
管理的卡。在 2.4 及更高版本的内核中,如果内核 PCMCIA 子系统处于活动状态,则 CardBus 卡由 hotplug
子系统管理,并且不使用 PCMCIA 脚本。
每个 PCMCIA 设备都有一个关联的 “class”(类别),用于描述应如何配置和管理它。类别与 /etc/pcmcia/config
中的设备驱动程序相关联。目前有五个 IO 设备类别(network、SCSI、cdrom、fixed disk 和 serial)和两个内存设备类别(memory 和 FTL)。对于每个类别,/etc/pcmcia
中都有两个脚本:一个主配置文件脚本(即,SCSI 设备的 /etc/pcmcia/scsi
)和一个选项脚本(即,/etc/pcmcia/scsi.opts
)。设备的卡插入时,将调用设备的主脚本来配置该设备,而在卡移除时,将调用它来关闭设备。对于具有多个关联设备的卡,将为每个设备调用该脚本。
配置脚本首先从 stab
文件中提取有关设备的一些信息。每个脚本都在 ADDRESS
shell 变量中构造一个 “device address”(设备地址),该地址唯一地描述了已被要求配置的设备。这被传递给 *.opts
脚本,该脚本应返回有关如何配置此地址处的设备的信息。对于某些设备,设备地址只是套接字号。对于其他设备,它包含额外的可能有助于决定如何配置设备的信息。例如,网络设备将其硬件以太网地址作为设备地址的一部分传递,因此 network.opts
脚本可以使用它从几种不同的配置中进行选择。
所有设备地址的第一部分是当前的 PCMCIA “scheme”(方案)。此参数用于支持基于单个外部用户指定变量的多组设备配置。方案的一种用途是拥有一个 “home”(家庭)方案和一个 “work”(工作)方案,其中将包括不同的网络配置参数集。当前方案使用 “cardctl scheme
” 命令选择。如果没有设置方案,则默认方案为 “default”。
除了 ADDRESS
之外,还有一些额外的 shell 变量可以在 *.opts
文件中使用
SOCKET
, CLASS
, DRIVER
, INSTANCE
, DEVICE
, MAJOR
, MINOR
这些对应于 stab
文件中一行中的各个字段。有关详细信息,请参见其手册页。
PRODID_1
, PRODID_2
, PRODID_3
, PRODID_4
, MANFID
, FUNCID
这些等效于 “cardctl info
” 的输出,并提供更详细的卡识别信息。
由于 *.opts
文件只是 shell 脚本,因此不需要它们遵循示例的形式,示例只是返回基于 ADDRESS
的设置。
作为一般规则,在为笔记本电脑配置 Linux 时,PCMCIA 设备应仅从 PCMCIA 设备脚本配置。不要尝试以与配置永久连接设备相同的方式配置 PCMCIA 设备。但是,某些 Linux 发行版提供了 PCMCIA 软件包,这些软件包已连接到这些发行版自己的设备配置工具中。在这种情况下,以下某些章节可能不适用;理想情况下,这将由发行版维护者记录在案。
Linux 以太网类型的网络接口通常具有诸如 eth0
、eth1
等名称。令牌环适配器的处理方式类似,但是它们的名称为 tr0
、tr1
等。ifconfig
命令用于查看或修改网络接口的状态。Linux 的一个特点是网络接口在 /dev
下没有相应的设备文件,因此如果您找不到它们,请不要感到惊讶。
当检测到以太网卡时,将为其分配第一个可用的接口名称,通常为 eth0
。Cardmgr
将运行 /etc/pcmcia/network
脚本来配置接口,该脚本通常从 /etc/pcmcia/network.opts
读取网络设置。network
和 network.opts
脚本仅在您的以太网卡实际存在时才执行。如果您的系统具有自动网络配置工具,则它可能是也可能不是 PCMCIA 感知的。请查阅您的 Linux 发行版的文档和 关于特定 Linux 发行版的注释,以确定是否应使用自动工具或通过编辑 network.opts
来配置 PCMCIA 网络设备。
传递给 network.opts
的设备地址由四个逗号分隔的字段组成:方案、套接字号、设备实例和卡的硬件以太网地址。设备实例用于为具有多个网络接口的卡编号设备,因此通常为 0。如果您有多个用于不同用途的网卡,一种选择是基于套接字位置配置卡,如下所示
case "$ADDRESS" in
*,0,*,*)
# definitions for network card in socket 0
;;
*,1,*,*)
# definitions for network card in socket 1
;;
esac
或者,它们可以使用其硬件地址进行配置,如下所示
case "$ADDRESS" in
*,*,*,00:80:C8:76:00:B1)
# definitions for a D-Link card
;;
*,*,*,08:00:5A:44:80:01)
# definitions for an IBM card
esac
以下参数可以在 network.opts
中定义
IF_PORT
指定以太网收发器类型,对于某些不自动检测的 16 位卡。有关更多信息,请参见 “man ifport
” 和 “man mii-tool
”。
BOOTP
布尔值 (y/n):指示是否应使用 BOOTP 协议(使用 bootpc
或 pump
)获取主机的 IP 地址和路由信息。
DHCP
布尔值 (y/n):指示是否应从 DHCP 服务器获取主机的 IP 地址和路由信息。网络脚本首先查找 dhcpcd
,然后查找 dhclient
,然后查找 pump
。
DHCP_HOSTNAME
指定要传递给 dhcpcd
或 pump
的主机名,以包含在 DHCP 消息中。
IPADDR
此接口的 IP 地址。
NETMASK
, BROADCAST
, NETWORK
基本网络参数:有关更多信息,请参见网络 HOWTO。
GATEWAY
此主机子网的网关 IP 地址。目标地址在此子网之外的数据包将被路由到此网关。
DOMAIN
此主机的本地网络域名,用于创建 /etc/resolv.conf
。
SEARCH
用于主机名查找的搜索列表,将添加到 /etc/resolv.conf
。DOMAIN
和 SEARCH
是互斥的:有关更多信息,请参见 “man resolver
”。
DNS_1
, DNS_2
, DNS_3
此接口的名称服务器的主机名或 IP 地址,将添加到 /etc/resolv.conf
MOUNTS
要为此接口挂载的 NFS 挂载点的空格分隔列表。
IPX_FRAME
, IPX_NETNUM
对于 IPX 网络:帧类型和网络号,传递给 ipx_interface
命令。
NO_CHECK
, NO_FUSER
用于卡弹出策略的布尔值 (y/n) 设置。如果设置了 NO_CHECK
,则即使存在打开的连接,“cardctl eject
” 也会关闭设备。如果设置了 NO_FUSER
,则脚本将不检查繁忙的 NFS 挂载或杀死使用这些挂载的进程。
例如
case "$ADDRESS" in
*,*,*,*)
IF_PORT="10base2"
BOOTP="n"
IPADDR="10.0.0.1"
NETMASK="255.255.255.0"
NETWORK="10.0.0.0"
BROADCAST="10.0.0.255"
GATEWAY="10.0.0.1"
DOMAIN="domain.org"
DNS_1="dns1.domain.org"
;;
esac
要自动挂载和卸载 NFS 文件系统,首先将所有这些文件系统添加到 /etc/fstab
,但在挂载选项中包含 noauto
。在 network.opts
中,在 MOUNTS
变量中列出文件系统挂载点。当 NFS 挂载处于活动状态时,尤其重要的是使用 cardctl
或 cardinfo
关闭网卡。如果只是在没有警告的情况下弹出网卡,则无法干净地卸载 NFS 文件系统。
除了通常的网络配置参数外,network.opts
脚本还可以指定在配置接口后或关闭接口之前要采取的额外操作。如果 network.opts
定义了一个名为 start_fn
的 shell 函数,则网络脚本将在配置接口后调用它,并将接口名称作为其第一个(也是唯一的)参数传递给该函数。类似地,如果定义了 stop_fn
,则将在关闭接口之前调用它。
某些(主要是旧的)卡的收发器类型必须使用 IF_PORT
设置手动选择。这可以是数值,也可以是标识收发器类型的关键字。所有网络驱动程序默认都尽可能自动检测接口,否则默认为 10baseT。ifport
命令可用于检查或设置当前收发器类型。例如
# ifport eth0 10base2
#
# ifport eth0
eth0 2 (10base2)
大多数现代 10/100baseT 卡都使用 “媒体独立接口”(MII)收发器,该收发器自动选择线路速度和双工设置。mii-tool
命令可用于监视和控制 MII 接口的行为。
pcnet_cs
模块的 mem_speed=#
选项增加内存访问时间。标准 config.opts
文件中给出了如何执行此操作的示例。尝试高达 1000 的速度(以纳秒为单位)。pcmcia_core
模块时使用 io_speed=#
选项增加 IO 端口访问时间。编辑启动脚本中的 CORE_OPTS
以设置此选项。ifconfig
报告硬件地址全为 0,则可能是由于内存窗口配置问题。pcnet_cs
、3c574_cs
、smc91c92_cs
或 xirc2ps_cs
驱动程序的卡)都永远无法实现完整的 100baseT 吞吐量。只有 CardBus 网络适配器才能充分利用 100baseT 数据速率。jt@hpl.hp.com
) 在 http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/ 整理了一个无线 HOWTO。
debug-tools
子目录中的 test_network
脚本将发现一些常见问题。cardmgr
正确识别了卡并启动了其中一个网络驱动程序。如果不是,如果您的卡与受支持的卡兼容,则可能仍然可以使用。如果卡声称 “NE2000 兼容”,则这将最容易完成。cardmgr
识别,但仍然无法工作,则可能是与另一个设备存在中断或端口冲突。找出卡正在使用的资源(从系统日志中),并尝试在 /etc/pcmcia/config.opts
中排除这些资源,以强制卡使用其他资源。/etc/pcmcia/network.opts
中指定的路由信息不正确。此确切消息是路由错误的绝对可靠指示。另一方面,配置错误的卡通常会静默失败。/etc/pcmcia/network.opts
中的问题,请首先尝试使用 IP 地址 ping 同一子网上的其他系统。然后尝试 ping 您的网关,然后再 ping 其他子网上的计算机。仅在尝试这些更简单的测试后才按名称 ping 计算机。/etc/pcmcia/network.opts
脚本的修改。确保您的下垂电缆、“T” 型接头、终端器等工作正常。
Linux 串行设备通过 /dev/ttyS*
和 /dev/cua*
特殊设备文件访问。在 2.2 之前的内核中,ttyS*
设备用于传入连接,例如直接连接的终端,而 cua*
设备用于传出连接,例如调制解调器。在当前内核中,cua*
设备的使用已被弃用,ttyS*
可用于所有应用程序。可以使用 setserial
命令检查和修改串行设备的配置。
当检测到串行或调制解调器卡时,将为其分配第一个可用的串行设备插槽。这通常是 /dev/ttyS1
(cua1
) 或 /dev/ttyS2
(cua2
),具体取决于内置串行端口的数量。ttyS*
设备是在 stab
中报告的设备。默认串行设备选项脚本 /etc/pcmcia/serial.opts
会将设备文件链接到 /dev/modem
以方便使用。对于 2.2 之前的内核,链接将创建到 cua*
设备。
不要尝试使用 /etc/rc.d/rc.serial
配置 PCMCIA 调制解调器。此脚本应仅用于配置不可移动的设备。如果您想执行任何特殊操作来设置调制解调器,请修改 /etc/pcmcia/serial.opts
。此外,不要尝试使用 setserial
更改串行设备的 IO 端口和中断设置。这将告诉串行驱动程序在不同的位置查找设备,但不会更改卡的硬件实际配置方式。串行配置脚本允许您指定其他 setserial
选项,以及是否应为此端口添加到 /etc/inittab
中的行。
传递给 serial.opts
的设备地址具有三个逗号分隔的字段:第一个是方案,第二个是套接字号,第三个是设备实例。对于支持多个串行端口的卡,设备实例可以采用多个值,但对于单端口卡,它将始终为 0。如果您通常使用多个调制解调器,您可能希望根据套接字位置指定不同的设置,如下所示
case "$ADDRESS" in
*,0,*)
# Options for modem in socket 0
LINK=/dev/modem0
;;
*,1,*)
# Options for modem in socket 1
LINK=/dev/modem1
;;
esac
如果在 Linux 启动时已配置 PCMCIA 调制解调器,则可能会错误地将其识别为普通的内置串行端口。这是无害的,但是,当 PCMCIA 驱动程序控制调制解调器时,将为其分配不同的设备插槽。最好解析 stab
或使用 /dev/modem
,而不是期望 PCMCIA 调制解调器始终具有相同的设备分配。
如果您将内核配置为将基本 Linux 串行端口驱动程序作为模块加载,则必须编辑 /etc/pcmcia/config
以指示必须加载此模块。编辑串行设备条目以读取
device "serial_cs"
class "serial" module "misc/serial", "serial_cs"
以下参数可以在 serial.opts
中定义
LINK
指定要为 “callout” 设备创建符号链接的路径(例如,对于 2.2 之前的内核为 /dev/cua*
,对于 2.2 内核为 /dev/ttyS*
)。
SERIAL_OPTS
指定要传递给 setserial
命令的选项。
INITTAB
如果指定,这将用于为此设备构造 inittab
条目。
NO_CHECK
, NO_FUSER
用于卡弹出策略的布尔值 (y/n) 设置。如果 NO_CHECK
为真,则即使设备繁忙,“cardctl eject
” 也会关闭设备。如果 NO_FUSER
为真,则脚本将不会尝试杀死使用弹出设备的进程。
例如
case "$ADDRESS" in
*,*,*)
LINK="/dev/modem"
SERIAL_OPTS=""
INITTAB="/sbin/getty"
/etc/pcmcia/serial.opts
中指定 SERIAL_OPTS="baud_base 460800"
。
debug-tools
子目录中的 test_modem
脚本将发现一些常见问题。cardmgr
正确识别了卡并启动了 serial_cs
驱动程序。如果不是,您可能需要在 /etc/pcmcia/config
文件中添加一个新条目,以便正确识别它。有关详细信息,请参见 配置无法识别的卡 部分。/etc/pcmcia/config.opts
并排除为调制解调器分配的端口范围。setserial
将 irq 更改为 0,看看调制解调器是否工作。这会导致串行驱动程序使用较慢的轮询模式而不是使用中断。如果这似乎解决了问题,则很可能是系统中的某些其他设备正在使用 serial_cs 选择的中断。您应该在 /etc/pcmcia/config.opts
中添加一行以排除此中断。/etc/pcmcia/config
以指示应在 serial_cs
之前加载 serial
模块。
Linux 并行端口驱动程序是分层的,以便多个高级设备类型可以共享使用同一个低级端口驱动程序。打印机设备通过 /dev/lp*
特殊设备文件访问。可以使用 tunelp
命令检查和修改打印机设备的配置。
parport_cs
模块依赖于 parport
和 parport_pc
驱动程序,这些驱动程序可以编译到内核中,也可以编译为模块。分层驱动程序结构意味着任何顶层并行驱动程序(例如 plip 驱动程序、打印机驱动程序等)都必须编译为模块。这些驱动程序仅在模块启动时识别并行端口设备,因此需要在配置任何 PC 卡并行设备后加载它们。
传递给 parport.opts
的设备地址具有三个逗号分隔的字段:第一个是方案,第二个是套接字号,第三个是设备实例。对于支持多个并行端口的卡,设备实例可以采用多个值,但对于单端口卡,它将始终为 0。如果您通常使用多个此类卡,您可能希望根据套接字位置指定不同的设置,如下所示
case "$ADDRESS" in
*,0,*)
# Options for card in socket 0
LINK=/dev/printer0
;;
*,1,*)
# Options for card in socket 1
LINK=/dev/printer1
;;
esac
以下参数可以在 parport.opts
中定义
LINK
指定要为打印机端口创建符号链接的路径。
LP_OPTS
指定要传递给 tunelp
命令的选项。
NO_CHECK
, NO_FUSER
用于卡弹出策略的布尔值 (y/n) 设置。如果 NO_CHECK
为真,则即使设备繁忙,“cardctl eject
” 也会关闭设备。如果 NO_FUSER
为真,则脚本将不会尝试杀死使用弹出设备的进程。
例如
case "$ADDRESS" in
*,*,*,*)
LINK="/dev/printer"
LP_OPTS=""
tunelp
将 irq 更改为 0,看看情况是否有所改善。这会将驱动程序切换到轮询模式。如果这似乎解决了问题,则很可能是系统中的某些其他设备正在使用 parport_cs 选择的中断。您应该在 /etc/pcmcia/config.opts
中添加一行以排除此中断。parport_cs
模块的内核消息,则意味着您的内核不支持并行设备。如果您已将并行驱动程序编译为模块,则可能需要修改 /etc/pcmcia/config
以指示应在 parport_cs
之前加载 parport
和 parport_pc
模块。
当前所有受支持的 PCMCIA SCSI 卡都是以下 ISA 总线卡之一的仿制品:Qlogic、Adaptec AHA-152X 或 Future Domain TMC-16x0。PCMCIA 驱动程序是通过将一些 PCMCIA 特定的代码(在 qlogic_cs.c
、aha152x_cs.c
或 fdomain_cs.c
中)与从 Linux 内核源代码树中提取的普通 Linux SCSI 驱动程序链接来构建的。Adaptec APA1480 CardBus 驱动程序基于内核 aic7xxx PCI 驱动程序。由于 Linux SCSI 驱动程序模型的限制,每个驱动程序仅支持一个可移动卡。
当检测到新的 SCSI 主机适配器时,SCSI 驱动程序将探测设备。检查系统日志以确保您的设备已正确检测到。新的 SCSI 设备将被分配给第一个可用的 SCSI 设备文件。第一个 SCSI 磁盘将是 /dev/sda
,第一个 SCSI 磁带将是 /dev/st0
,第一个 CD-ROM 将是 /dev/scd0
。
连接到此主机适配器的 SCSI 设备列表将显示在 stab
中,并且对于每个连接的设备,将调用 SCSI 配置脚本 /etc/pcmcia/scsi
一次,以配置或关闭该设备。默认脚本不采取任何操作来配置 SCSI 设备,但在移除卡时,将正确卸载 SCSI 设备上的文件系统。
传递给 scsi.opts
的设备地址很复杂,因为可以连接到 SCSI 适配器的东西种类繁多。地址由六个或七个逗号分隔的字段组成:当前方案、设备类型、套接字号、SCSI 通道、ID 和逻辑单元号,以及可选的分区号。设备类型对于磁盘将为 “sd”,对于磁带将为 “st”,对于 CD-ROM 设备将为 “sr”,对于通用 SCSI 设备将为 “sg”。对于大多数设置,SCSI 通道和逻辑单元号将为 0。对于具有多个分区的磁盘设备,将首先为整个设备调用 scsi.opts
,地址为五个字段。脚本应将 PARTS
变量设置为分区列表。然后,将为每个分区调用 scsi.opts
,地址为较长的六个字段。
如果您的内核没有特定 SCSI 设备的顶层驱动程序(磁盘、磁带等),则 PCMCIA 驱动程序将不会配置该设备。作为副作用,设备在 stab
中的名称将类似于 “sd#nnnn”,其中 “nnnn” 是一个四位十六进制数。当 cardmgr
无法将 SCSI 设备 ID 转换为相应的 Linux 设备名称时,就会发生这种情况。
可以模块化顶层 SCSI 驱动程序,以便按需加载它们。为此,您需要编辑 /etc/pcmcia/config
以告知 cardmgr
在配置适配器时需要加载哪些额外的模块。例如
device "aha152x_cs"
class "scsi" module "scsi/scsi_mod", "scsi/sd_mod", "aha152x_cs"
会指示在加载常规 PCMCIA 驱动程序模块之前加载核心 SCSI 模块和顶层磁盘驱动程序模块。
始终在打开笔记本电脑电源或插入适配器卡之前打开 SCSI 设备,以便在配置适配器时正确终止 SCSI 总线。还要非常小心地弹出 SCSI 适配器。确保在弹出卡之前卸载并关闭所有关联的 SCSI 设备。确保此操作的最佳方法是使用 cardctl
或 cardinfo
请求移除卡,然后再物理弹出卡。目前,所有 SCSI 设备都应在插入 SCSI 适配器之前上电,并应保持连接状态,直到您拔下适配器和/或关闭笔记本电脑电源之后。
使用这些卡时存在一个潜在的复杂情况,这在普通 ISA 总线适配器中不会出现。SCSI 总线携带一个 “终止电源” 信号,这对于普通被动 SCSI 终端器的正常运行是必需的。PCMCIA SCSI 适配器不提供终止电源,因此如果需要,则必须由外部设备提供。某些外部 SCSI 设备可以配置为提供终止电源。其他设备(例如 Zip Drive 和 Syquest EZ-Drive)使用不依赖于它的有源终端器。在某些情况下,可能需要使用特殊的终端器块,例如 APS SCSI Sentry 2,它具有外部电源。在配置 SCSI 设备链时,请注意您的任何设备是否需要或可以提供终止电源。
以下参数可以在 scsi.opts
中定义
LINK
指定要为此设备创建符号链接的路径。
DO_FSTAB
布尔值 (y/n) 设置:指定是否应为此设备添加到 /etc/fstab
的条目。
DO_FSCK
布尔值 (y/n) 设置:指定是否应在挂载文件系统之前检查文件系统,使用 ``fsck -Ta
''。
DO_MOUNT
布尔值 (y/n) 设置:指定是否应在插入卡时自动挂载此设备。
FSTYPE
, OPTS
, MOUNTPT
文件系统类型、挂载选项和挂载点,用于 fstab 条目和/或挂载设备。
NO_CHECK
, NO_FUSER
用于卡弹出策略的布尔值 (y/n) 设置。如果 NO_CHECK
为真,则即使设备繁忙,“cardctl eject
” 也会关闭设备。如果 NO_FUSER
为真,则脚本将不会尝试杀死使用弹出设备的进程。
例如,这是一个用于配置 SCSI ID 为 3 的磁盘设备(带有两个分区)和 SCSI ID 为 6 的 CD-ROM 的脚本
case "$ADDRESS" in
*,sd,*,0,3,0)
# This device has two partitions...
PARTS="1 2"
;;
*,sd,*,0,3,0,1)
# Options for partition 1:
# update /etc/fstab, and mount an ext2 fs on /usr1
DO_FSTAB="y" ; DO_FSCK="y" ; DO_MOUNT="y"
FSTYPE="ext2"
OPTS=""
MOUNTPT="/usr1"
;;
*,sd,*,0,3,0,2)
# Options for partition 2:
# update /etc/fstab, and mount an MS-DOS fs on /usr2
DO_FSTAB="y" ; DO_FSCK="y" ; DO_MOUNT="y"
FSTYPE="msdos"
OPTS=""
MOUNTPT="/usr2"
;;
*,sr,*,0,6,0)
# Options for CD-ROM at SCSI ID 6
PARTS=""
DO_FSTAB="y" ; DO_FSCK="n" ; DO_MOUNT="y"
FSTYPE="iso9660"
OPTS="ro"
MOUNTPT="/cdrom"
;;
esac
/etc/pcmcia/config.opts
中的 IO 端口区域,以保证可以找到如此大的窗口。
aha152x_cs
驱动程序(Adaptec、New Media 和其他一些驱动程序使用),SCSI 断开/重新连接支持似乎是磁带驱动器频繁出现问题的根源。要禁用此“功能”,请将以下内容添加到 /etc/pcmcia/config.opts
module "aha152x_cs" opts "reconnect=0"
aha152x_cs
驱动程序,某些设备似乎需要更长的启动延迟,这通过 reset_delay
模块参数控制。Yamaha 4416S CDR 驱动器就是这样一种设备。结果是设备已成功识别,然后系统挂起。在这种情况下,请尝试
module "aha152x_cs" opts "reset_delay=500"
CONFIG_SCSI_MULTI_LUN
选项。CONFIG_SCSI
为“m”),您可能需要修改 /etc/pcmcia/config
以在加载相应的 *_cs
驱动程序之前加载 SCSI 模块。
memory_cs
驱动程序处理所有类型的存储卡,并为具有其他功能的卡提供对 PCMCIA 内存地址空间的直接访问。加载后,它会创建字符设备和块设备的组合。有关设备命名方案的完整描述,请参见该模块的 man 手册。块设备用于类似磁盘的访问(创建和挂载文件系统等)。字符设备用于在任意位置进行“原始”无缓冲的读写。
传递给 memory.opts
的设备地址由两个字段组成:方案和插槽号。这些选项应用于相应存储卡上的第一个公共内存分区。
一些闪存卡和大多数简单的静态 RAM 卡缺少“卡信息结构”(CIS),这是 PCMCIA 卡用于识别自己的系统。通常,cardmgr
会假定任何缺少 CIS 的卡都是简单的存储卡,并加载 memory_cs
驱动程序。因此,一般卡识别问题的常见副作用是,其他类型的卡可能会被错误地检测为存储卡。
在处理没有 CIS 信息的存储卡时,还有另一个问题需要考虑。在启动时,PCMCIA 包尝试使用检测到的第一张卡来确定哪些内存区域可用于 PCMCIA。如果该卡是简单的存储卡,则内存扫描可能会被愚弄。如果您计划经常使用存储卡,最好将 /etc/pcmcia/config.opts
中的内存窗口限制为已知良好的区域。
memory_cs
驱动程序使用启发式方法来猜测这些卡的容量。该启发式方法不适用于写保护卡,并且在其他一些情况下也可能出错。如果卡被错误检测,则应在使用诸如 dd
或 mkfs
等命令时显式指定其大小。memory_cs
模块还具有用于覆盖大小检测的参数。请参见 man 手册。
以下参数可以在 memory.opts
中指定
DO_FSTAB
布尔值 (y/n) 设置:指定是否应为此设备添加到 /etc/fstab
的条目。
DO_FSCK
布尔值 (y/n) 设置:指定是否应在挂载文件系统之前检查文件系统,使用 ``fsck -Ta
''。
DO_MOUNT
布尔值 (y/n) 设置:指定是否应在插入卡时自动挂载此设备。
FSTYPE
, OPTS
, MOUNTPT
文件系统类型、挂载选项和挂载点,用于 fstab 条目和/或挂载设备。
NO_CHECK
, NO_FUSER
用于卡弹出策略的布尔值 (y/n) 设置。如果 NO_CHECK
为真,则即使设备繁忙,“cardctl eject
” 也会关闭设备。如果 NO_FUSER
为真,则脚本将不会尝试杀死使用弹出设备的进程。
这是一个脚本示例,该脚本将根据存储卡插入的插槽自动挂载存储卡
case "$ADDRESS" in
*,0,0)
# Mount filesystem, but don't update /etc/fstab
DO_FSTAB="n" ; DO_FSCK="y" ; DO_MOUNT="y"
FSTYPE="ext2" ; OPTS=""
MOUNTPT="/mem0"
;;
*,1,0)
# Mount filesystem, but don't update /etc/fstab
DO_FSTAB="n" ; DO_FSCK="y" ; DO_MOUNT="y"
FSTYPE="ext2" ; OPTS=""
MOUNTPT="/mem1"
;;
esac
以下信息仅适用于所谓的“线性闪存”存储卡。许多闪存卡,包括所有 SmartMedia 和 CompactFlash 卡,实际上都包含电路以模拟 IDE 磁盘设备。因此,这些卡被视为 IDE 设备,而不是存储卡。
闪存卡有两种主要格式:FTL 或“闪存转换层”样式,以及 Microsoft 闪存文件系统。FTL 格式通常更灵活,因为它允许在闪存卡上使用任何普通的高级文件系统(ext2、ms-dos 等),就像它是普通磁盘设备一样。FFS 是一种完全不同的文件系统类型。Linux 目前无法处理使用 FFS 格式化的卡。
要将闪存卡用作普通的类磁盘块设备,首先使用 ftl_format
命令在设备上创建 FTL 分区。此层隐藏了闪存编程的设备特定细节,并使卡看起来像一个简单的块设备。例如
ftl_format -i /dev/mem0c0c
请注意,此命令通过“原始”存储卡接口访问卡。格式化后,可以通过 ftl_cs
驱动程序将卡作为普通块设备访问。例如
mke2fs /dev/ftl0c0
mount -t ext2 /dev/ftl0c0 /mnt
FTL 设备的设备命名很棘手。次设备号包含三个部分:卡号、该卡上的区域号,以及可选的分区号。一个区域可以被视为没有分区表的单个块设备(如软盘),也可以像硬盘设备一样进行分区。“ftl0c0”设备是卡 0,公共内存区域 0,整个区域。“ftl0c0p1”到“ftl0c0p4”设备是主分区 1 到 4,如果该区域已分区。
FTL 分区的配置选项可以在 ftl.opts
中给出,其结构类似于 memory.opts
。传递给 ftl.opts
的设备地址由三个或四个字段组成:方案、插槽号、区域号以及可选的分区号。大多数闪存卡只有一个闪存区域,因此区域号通常始终为零。
Intel Series 100 闪存卡使用前 128K 闪存块来存储卡的配置信息。为了防止意外擦除此信息,ftl_format
将自动检测到这一点,并在创建 FTL 分区时跳过第一个块。
ATA/IDE 驱动器支持基于常规内核 IDE 驱动程序。这包括 SmartMedia 和 CompactFlash 设备:这些闪存卡被设置为模拟 IDE 接口。驱动程序的 PCMCIA 特定部分是 ide_cs
。请务必在使用 cardctl
或 cardinfo
关闭 ATA/IDE 卡后再弹出它,因为该驱动程序尚未“热插拔”安全。
传递给 ide.opts
的设备地址由三个或四个字段组成:当前方案、插槽号、驱动器的序列号以及可选的分区号。ide_info
命令可用于获取 IDE 设备的序列号。与 SCSI 设备一样,首先为整个设备调用 ide.opts
。如果 ide.opts
在 PARTS
变量中返回分区列表,则将为每个分区调用该脚本。
以下参数可以在 ide.opts
中指定
DO_FSTAB
布尔值 (y/n) 设置:指定是否应为此设备添加到 /etc/fstab
的条目。
DO_FSCK
布尔值 (y/n) 设置:指定是否应在挂载文件系统之前检查文件系统,使用 ``fsck -Ta
''。
DO_MOUNT
布尔值 (y/n) 设置:指定是否应在插入卡时自动挂载此设备。
FSTYPE
, OPTS
, MOUNTPT
文件系统类型、挂载选项和挂载点,用于 fstab 条目和/或挂载设备。
NO_CHECK
, NO_FUSER
用于卡弹出策略的布尔值 (y/n) 设置。如果 NO_CHECK
为真,则即使设备繁忙,“cardctl eject
” 也会关闭设备。如果 NO_FUSER
为真,则脚本将不会尝试杀死使用弹出设备的进程。
这是一个 ide.opts
文件示例,用于将任何 ATA/IDE 卡的第一个分区挂载到 /mnt
上。
case "$ADDRESS" in
*,*,*,1)
DO_FSTAB="y" ; DO_FSCK="y" ; DO_MOUNT="y"
FSTYPE="msdos"
OPTS=""
MOUNTPT="/mnt"
;;
*,*,*)
PARTS="1"
;;
esac
INVALID GEOMETRY: 0 PHYSICAL HEADS?
”。要修复此问题,请尝试在 /etc/pcmcia/config.opts
中排除选定的 IO 端口范围。pcmcia_core
模块的 unreset_delay
和/或 unreset_limit
参数,以便为驱动器提供更多启动时间;有关参数详细信息,请参见 pcmcia_core
man 手册。例如
CORE_OPTS="unreset_delay=400"
CONFIG_BLK_DEV_IDECD
。对于标准内核,通常是这种情况,但是如果您编译自定义内核,则需要注意这一点。/dev/hde1
,而不是 /dev/hde
)。
单个中断可以由多个驱动程序共享,例如串行驱动程序和以太网驱动程序:实际上,PCMCIA 规范要求所有卡功能共享同一个中断。通常,所有卡功能都可用,而无需交换驱动程序。所有 Linux 内核都支持这种中断共享。
同时使用两个卡功能是“棘手的”,各种硬件供应商以他们自己不兼容(有时是专有的)方式实现了中断共享。某些卡(Ositech Jack of Diamonds、3Com 3c562 和相关卡、Linksys 卡)的驱动程序正确支持同时访问,但其他卡(尤其是较旧的 Megahertz 卡)则不支持。如果您在使用卡时遇到两个功能都激活的问题,请尝试隔离使用每个功能。这可能需要显式执行“ifconfig down
”以关闭网络接口并在同一张卡上使用调制解调器。