PROM 设备树(DeviceTree)(完整设备路径名(Full Device Pathnames))
OpenBoot和系统中的硬件直接打交道。每一个设备都有一个唯一的名字,这个名字能够表示设备的类型,及其在设备树中的位置。OpenBoot使用POST阶段收集到的信息构建一棵包含所有设备的设备树。Sun使用设备树来管理所有连接到系统的设备。设备树被加载到系统内存,内核会在启动阶段使用设备树来识别所有的已配置设备。设备树中的路径样式很多,取决于系统的类型及其设备配置。下面的例子展示了一个旧的使用SBus总线架构的Sun系统(比如SPARCstation20)的完整设备路径名:
/sbus@1f,0/esp@0,40000/sd@3,0:a
注意:
设备树和设备路径名的区别:这二者经常互换,本文中都会使用,表示相同的内容。
下面的例子展示了一个使用PCI(peripheral component interconnect 外设组件互连)总线的系统(比如Ultra5)上的内部硬盘
/pci@1f,0/pci@1,1/ide@3/disk
通常,OBP使用disk和cdrom作为启动盘和CD-ROM盘。
下面的例子展示了位于一台使用PCI-SCSI总线的Ultra系统上的硬盘设备。
/pci@1f,0/pci@1/isptwo@4/sd@3,0
设备树是由一组由‘/’分开的节点名组成。设备树的顶点是根设备节点(root device node).紧跟着根设备节点,并且由‘/’分开的,是总线连接节点(bus nexus node)。连接到总线互联节点的是叶子节点,通常是设备的控制器(controller).每一个设备路径名都是如下格式:
driver-name@unit-address:device-arguments
设备路径名里的各个组件的具体描述请参考表3.3
表 3.3 – 设备路径名参数
Parameter |
Description |
driver-name |
根节点,由1-31个字符,数字或者如下的标点符号组成: , (逗号) . (句号) _ (下划线) + (加号) -(减号) 字母区分大小写。某些情况下,driver name里面包含了设备制造商和设备的型号(model),由逗号分开。通常,设备制造商的大写,上市的股票符号被用作制造商的名字(比如SUNW,hme0)。对于内建的设备,通常会省略掉制造商名字(比如sbus或者pci)。 @符号必须在地址参数的前面,它作为driver name和unit address之间的分割器。 |
@ |
必须位于地址(address)参数之前 |
unit-address |
一个字符串,代表该设备位于其父设备的地址空间的物理地址。地址确切的意义,取决于该设备所连接的总线。在下面的例子里: /sbus@3,0/SUNW,fas@3,0/sd@0,0 sbus@3,0 表示的是在slot1里面的I/O board,位于系统的背面(the back of the system),SUNW,fas@3,0 表示同一个board上面的板载的fast/wide SCSI 控制器. 下面是常用的 driver names: fas—Fast/wide SCSI 控制器. hme—Fast (10/100Mbps) 以太网. isp—Differential SCSI 控制器 和SunSwift 卡. glm—UltraSCSI 控制器. scsi—SCSI 设备. sf—SCSI-compliant nexus driver that supports the Fibre Channel Protocol for SCSI on Private Fibre Channel Arbitrated Loops (FC-ALs). soc—Serial optical controller (SOC) device driver. socal—The Fibre Channel host bus adapter, which is an SBus card that implements two full-duplex Fibre Channel interfaces. Each Fibre Channel interface can connect to an FC-AL. sd@0,0 is the SCSI disk (sd) set to target id 0. (In this case, it is an internal disk because only internal disks should be controlled by the onboard SCSI controller of the I/O board in slot 1.) |
: |
必须位于变量(argument)参数之前 |
device-arguments |
一个字符串,其格式由具体的设备决定. device-arguments 可以用于传递额外的数据给设备的软件.下面的例子: /pci@1f,0/pci@1,1/ide@3/atapicd@2,0:f 硬盘设备的参数是f. 这个设备的驱动会把这个参数理解为硬盘的分区,因此该设备路径名表示一个CD-ROM上的f分区。 |
下面的例子:
/sbus@1f,0/esp@0,40000/sd@3,0:a
1f,0 表示主系统总线上面的一个地址,因为在本例子里SBus直接连接到主系统总线。
0,40000是一个SBus槽编号(也就是0)和一个偏移地址(也就是4000),因为esp设备位于SBus的0号槽上面的卡的偏移地址40000
3,0是一个SCSI目标(target)和逻辑单元(logic unit)编号,因为这个磁盘连接在SCSI总线的目标3,逻辑单元0上面。
Driver name和@unit-address都是可以省略的,不过这容易引起误解,比如:
/sbus/esp@0,40000/sd@3,0或者/sbus/@2,1/sd@3,0
可以使用OpenBoot的show-devs命令来获取设备树的信息,并且显示出所有的设备路径名。这个命令用于显示系统所知道的位于设备层次结构中的指定设备下的所有设备。不指定参数,则显示完整的设备树。
okshow-devs
显示完整的设备树:
/SUNW,UltraSPARC-IIi@0,0
/pci@1f,0
/virtual-memory
/memory@0,10000000
/aliases
/options
/openprom
/chosen
/packages
/pci@1f,0/pci@1
/pci@1f,0/pci@1,1
/pci@1f,0/pci@1/pci@1
/pci@1f,0/pci@1/pci@1/SUNW,qfe@3,1
/pci@1f,0/pci@1/pci@1/pci108e,1000@3
/pci@1f,0/pci@1/pci@1/SUNW,qfe@2,1
/pci@1f,0/pci@1/pci@1/pci108e,1000@2
/pci@1f,0/pci@1/pci@1/SUNW,qfe@1,1
/pci@1f,0/pci@1/pci@1/pci108e,1000@1
/pci@1f,0/pci@1/pci@1/SUNW,qfe@0,1
/pci@1f,0/pci@1/pci@1/pci108e,1000@0
/pci@1f,0/pci@1,1/ide@3
/pci@1f,0/pci@1,1/SUNW,m64B@2
用于展示设备树的命令列表:
Command |
Description |
.properties |
显示当前节点属性的名字和值。 |
dev <device-path> |
选择指定的设备节点并使之为当前设备节点。 |
dev <node-name> |
使用指定的名字搜索当前设备节点的子树并选择第一个找到的节点。 |
dev .. |
选择当前节点的父节点 |
dev / |
选择根设备节点 |
device-end |
离开设备树 |
<device-path> find-device |
选择指定的设备节点, 功能类似于 dev. |
ls |
显示当前设备节点的所有子节点的名字 |
pwd |
显示当前节点的设备路径名 |
see <wordname> |
Decompiles 指定的词. |
show-devs <device-path> |
显示位于指定path下的所有设备。不指定参数则显示整个设备树. |
words |
显示当前节点的方法(methods)的名字 |
<device-path>" select-dev |
选择指定的设备并将其设为活动(active)节点。 |
在Unixshell下,可以使用prtconf –vp命令来浏览设备路径。
OpenBoot 设备别名(Device Aliases)
创建和移除设备别名。
设备路径名可以很长且很复杂. 设备别名,就像Unix别名一样,允许你使用一个短名字替换一个长名字. 一个别名代表一个完整的设备路径名而不是它的一部分。比如disk0 可以代表下面的设备路径名:
/sbus@1,f8000000/esp@0,40000/sd@3,0:a
OpenBoot对于常用的设备,预定义了设备别名,参考表3.5,所以通常你不要输入完整的设备路径名但要注意,不同的平台,可能设备别名和路径名并不相同, 下表的别名来自于Sun Ultra 5 系统:
预定义设备别名
Alias |
Device Pathname |
disk |
/pci@1f,0/pci@1,1/ide@3/disk@0,0 |
disk0 |
/pci@1f,0/pci@1,1/ide@3/disk@0,0 |
disk1 |
/pci@1f,0/pci@1,1/ide@3/disk@1,0 |
disk2 |
/pci@1f,0/pci@1,1/ide@3/disk@2,0 |
disk3 |
/pci@1f,0/pci@1,1/ide@3/disk@3,0 |
cdrom |
/pci@1f,0/pci@1,1/ide@3/cdrom@2,0:f |
如果你添加一块硬盘,或者改变启动盘,你需要修改设备别名。表3.6描述了devalias命令,它用于浏览,创建和修改OpenBoot的别名。
注意:
如果别名已经存在,新设定的别名会覆盖旧的。
Table 3.6 - devalias 命令
Command |
Description |
devalias |
显示当前所有的设备别名 |
devalias <alias> |
显示alias所对应的设备路径名 |
devalias_alias <device-path> |
定义表示 device-path的别名 |
下面的例子创建一个名为disk3的别名,用来表示一个Ultra 5 系统上面的target ID为3的IDE硬盘:
devaliasdisk3 /pci@1f,0/pci@1,1/ide@3/disk@3,0
为了证实是否设置成功,输入 devalias:
okdevalias
系统会打印出当前所有的别名:
screen /pci@1f,0/pci@1,1/SUNW,m64B@2
net /pci@1f,0/pci@1,1/network@1,1
cdrom /pci@1f,0/pci@1,1/ide@3/cdrom@2,0:f
disk /pci@1f,0/pci@1,1/ide@3/disk@0,0
disk3 /pci@1f,0/pci@1,1/ide@3/disk@3,0
disk2 /pci@1f,0/pci@1,1/ide@3/disk@2,0
disk1 /pci@1f,0/pci@1,1/ide@3/disk@1,0
disk0 /pci@1f,0/pci@1,1/ide@3/disk@0,0
ide /pci@1f,0/pci@1,1/ide@3
floppy /pci@1f,0/pci@1,1/ebus@1/fdthree
ttyb /pci@1f,0/pci@1,1/ebus@1/se:b
ttya /pci@1f,0/pci@1,1/ebus@1/se:a
keyboard! /pci@1f,0/pci@1,1/ebus@1/su@14,3083f8:forcemode
keyboard /pci@1f,0/pci@1,1/ebus@1/su@14,3083f8
mouse /pci@1f,0/pci@1,1/ebus@1/su@14,3062f8
name aliases
你可以在Unixshell中使用prtconf –vp获取所有的别名。
用户自定义的别名会在系统重启后失效,除非你创建永久别名。想要创建永久别名,你可以手动的存储该别名到NVRAMRC里面,它是NVRAM的一部分,或者你也可以使用nvalias和nvunalias命令。下面的部分描述了如何在Sun系统的NVRAM中配置永久别名。
OpenBoot NVRAM
显示,修改和恢复默认的NVRAM参数
从Shell查看和修改NVRAM参数。
系统配置变量存储在系统的VNRAM中。这些OpenBoot变量决定了启动设备配置和相关的通信参数表。如果你修改了这些配置变量,即使重启了设备,这些修改仍然有效。对这些配置变量的修改要尽量谨慎,因为错误的设置可能会导致你无法启动系统。
Table3.7 描述了OpenBoot的 NVRAM 配置变量,默认值,及他们的功能。
NVRAM 变量
Variable |
Default |
Description |
auto-boot? |
true |
如果auto-boot?是true,系统会在上电或者重启之后自动启动,如果是false,系统会在上电或者重启之后停在 OpenBoot 提示符 (ok). |
boot-command |
boot |
如果auto-boot? 是 true,将要执行的命令. |
boot-device |
disk or net |
启动的设备 |
boot-file |
Empty string |
传递给已启动程序的参数 |
diag-device |
net |
诊断启动的源设备 |
diag-file |
Empty string |
在诊断模式里传递给启动程序的参数 |
diag-switch? |
false |
是否运行于诊断模式 |
fcode-debug? |
false |
Plug-in设备的FCode是否包含name filed。 |
input-device |
keyboard |
Console 输入设备(通常是 keyboard, ttya, 或者 ttyb). |
nvramrc |
Empty |
NVRAMRC的内容。 |
oem-banner |
Empty string |
OEM的banner。(oem-banner?为 true时才有效). |
oem-banner? |
false |
如果是 true, 使用OEM banner. |
oem-logo |
No default |
OEM logo的数组 (oem-logo?为 true时才有效). 显示为hexadecimal格式 |
oem-logo? |
false |
如果为true,使用 OEM logo;否则使用 Sun logo. |
output-device |
screen |
Console 输出设备(通常是 screen, ttya, or ttyb). |
sbus-probe-list |
0123 |
Probe哪个 SBus slots及以什么顺序。 |
screen-#columns |
80 |
显示器的列数 (characters/line). |
screen-#rows |
34 |
显示器的行数 (lines). |
security-#badlogins |
No default |
错误密码的尝试次数。 |
security-mode |
none |
Firmware的安全级别 (可设为: none, command,或者 full). |
security-password |
No default |
Firmware的密码(不会显示出来). |
use-nvramrc? |
false |
如果为true,当系统启动时,执行NVRAMRC里面的命令。 |
注意:OpenBoot版本
因为旧的SPARC系统使用旧版本的OpenBoot,它们可能使用和表3.7中不同的默认值或者配置变量。这里是OpenBoot 版本4的值。
你可以使用表3.8中列出的命令来浏览或者修改NVRAM配置变量。
Table 3.8 - 用于浏览和修改配置变量的命令
Command |
Description |
password |
设置安全密码 |
printenv |
显示每个变量的当前值和默认值。想要查看指定变量的当前值,使用printenv <parameter-name> |
setenv <variable> <value> |
设置<variable> 为制定的数字或者字符串 <value>. 修改是持久的,但通常需要重启之后才会生效。 |
set-default <variable> |
重置<variable> 的值为出厂值。 |
set-defaults |
重置所有的变量值为出厂值。 |
下面的例子展示了如何使用表3.8中的命令。所有的命令都是在ok这个OpenBoot提示符之后。
使用printenv命令,不带任何参数,来显示所有变量的当前值和默认值:
okprintenv
系统显示如下内容:
VariableName Value Default Value
tpe-link-test? true true
scsi-initiator-id 7 7
keyboard-click? false false
keymap
ttyb-rts-dtr-off false false
ttyb-ignore-cd true true
ttya-rts-dtr-off false false
ttya-ignore-cd true true
ttyb-mode 9600,8,n,1,- 9600,8,n,1,-
ttya-mode 9600,8,n,1,- 9600,8,n,1,-
pcia-probe-list 1,2,3,4 1,2,3,4
pcib-probe-list 1,2,3 1,2,3
mfg-mode off off
diag-level max max
#power-cycles 89
system-board-serial#
system-board-date
fcode-debug? false false
output-device screen screen
input-device keyboard keyboard
load-base 16384 16384
boot-command boot boot
auto-boot? false true
watchdog-reboot? false false
diag-file
diag-device net net
boot-file
boot-device disk:a disk net disk net
local-mac-address? false false
ansi-terminal? true true
screen-#columns 80 80
screen-#rows 34 34
silent-mode? false false
use-nvramrc? false false
nvramrc
security-mode none
security-password
security-#badlogins 0
oem-logo
oem-logo? false false
oem-banner
oem-banner? false false
hardware-revision
last-hardware-update
diag-switch? false false
注意:
printenv命令的结果取决于你系统的OpenBoot版本。这个例子使用的是V3.15.
想要设置auto-boot?变量的值位false,输入如下:
oksetenv auto-boot? false
系统的反馈为:
auto-boot?= false
你可以输入如下内容来验证结果:
okprintenv auto-boot?
系统反馈为:
auto-boot?= true
想要重置变量的值为默认值,输入如下:
okset-default auto-boot?
系统没有任何反馈信息,只有另外一个OpenBoot提示符。你可以使用如下命令来验证结果:
okprintenv auto-boot?
系统反馈如下:
auto-boot?= true
想要重置所有的变量为他们的默认值,输入如下:
okset-defaults
系统反馈:
SettingNVRAM parameters to default values.
可以在Unixshell下执行eeprom命令来设置所有变量的值为默认值。必须是root用户才能执行这个命令,但是任意用户都能够查看这些参数,但只有root用户才能修改这些参数。比如,想要设置auto-boot?的值为true,在shell中执行如下命令:eeprom auto-boot\?=true
任何非root用户都能查看OpenBoot的配置变量值,输入如下命令:
/usr/sbin/eeprom
比如,想要修改security-password这个参数的值,必须登录为root并执行如下命令:
example#eeprom security-password=
ChangingPROM password:
Newpassword:
Retypenew password:
注意:
设置OpenBoot的安全模式和密码可能会很危险:如果你忘记了密码,系统将会无法启动.唯一的办法就是把CPU邮寄给Sun,请他们重置PROM.OpenBoot的安全问题将会在章节”OpenBoot安全”里面详细讨论.
密码的长度介于0到8个字符之间.长于8个字符的部分会被忽略掉.设置密码后,你不需要重启系统;安全功能会在你执行完命令后立即生效.
如果不指定参数,eeprom命令会显示所有的OpenBoot配置设定,和OpenBoot的printenv命令功能相同.
想要浏览所有的OpenBoot参数,在Unixshell执行prtconf –vp即可.
你可以使用在表3.9中列出的NVRAM命令来修改设备别名,这些修改将是持久的,即使重启系统也不会丢失。
注意:
NOTE
如果你修改了SPARC系统的NVRAM设定,并且系统还未启动过,你可以重置NVRAM的变量为其默认值,做法是在机器启动时按住Stop+N。如果你想使用Stop+N,需要在SPRAC系统上电的瞬间立即按住,并且一直按住几秒钟直到你看的Banner(如果有显示器并且显示设备可用)。
强迫NVRAM变量处于已知状态,下面两种方式都是不错的方式:
Table 3.9 - NVRAM 命令
Command |
Description |
nvalias <alias> <device-path> |
保存设备别名到NVRAMRC (这个别名将会一直存在直到执行 nvunalias 或者 set-defaults) 这个命令将会开启use-nvramrc?. |
nvunalias <alias> |
从NVRAMRC中删除别名 |
比如,想要在SPARCstation10系统中持久的创建一个叫做disk3的别名,这个别名指向一个包含target ID为3的SCSI 硬盘,输入如下指令:
nvaliasdisk3 /pci@1f,0/pci@1,1/ide@3/disk@3,0