IBM AIX 5.3 系统管理 -- 文件系统
如何对无响应的启动过程进行恢复
如果您的系统无法启动,AIX 5L 提供了一些工具和方法以便对挂起的启动过程进行恢复。
这个部分将介绍可能导致系统在启动过程中出现挂起的情况。
bootlist 命令
您可以更改系统查找相关设备(以获得其启动代码)的顺序。bootlist 命令显示并改变可用于系统的启动设备列表。该命令的一般语法规则如下所示:
1
2
bootlist [ { -m Mode } [ -r ] [ -o ] [ [ -i ] | [ [ -f File ]
[ Device [ Attr=Value ... ] ... ] ] ]
表 1 中给出了 bootlist 命令最常使用的一些标志。
标志 说明
-m mode 指定所要显示或改变的启动列表。模式变量的可能取值为 normal、service、both 或者 prevboot。
-f File 表示从指定的文件名读取设备信息。
-i 表示由 -m 标志指定的设备列表应该失效。
-o 表示执行了任何指定的改变之后,将显示指定的启动列表。输出是设备名称列表。
-r 表示执行了任何指定的改变之后,将显示指定的启动列表。输出取决于硬件平台。
bootlist 命令允许用户显示和改变要启动的系统中可能的启动设备的列表。这个命令支持下面的更新:
常规启动列表:当系统以常规方式启动时,常规列表为此指定可能的启动设备。
服务启动列表:当系统以服务方式启动时,服务列表为此指定可能的启动设备。
前一启动设备条目:该条目指定了最近一次启动系统的设备。一些硬件平台可能试图在查找其他列表中的启动设备之前先从前一启动设备进行启动。
对这些启动列表的支持,可能随着平台的不同而不同,并且在某些平台中可能没有启动列表。当系统启动时,它将在启动列表中搜索启动设备,系统将选择列表中的第一个设备,并确定它是否可以启动。如果在第一个设备上没有检测到启动文件系统,该系统将转移至列表中的下一个设备。因此,设备在设备列表中的排序是非常重要的。
要显示启动列表(AIX Version 4.2 或更高版本),可以使用下面的命令:
1
2
3
4
5
6
7
# bootlist -m normal -o
cd0
hdisk0 blv=hd5
rmt0
如果您希望对正常的启动列表进行更改,并且删除 rmt0(举例来说),那么可以使用下面的命令:
1
# bootlist -m normal cd0 hdisk0
或者创建一个包含 cd0 hdisk0 的列表的文件(由空格进行分隔,或者每个设备占一行),并且使用下面的命令:
1
# bootlist -m normal -f filename
这将更改常规启动列表,以表示在启动系统时,它将首先尝试从 cd0 进行启动。如果在 cd0 中无法找到启动镜像,那么它将转向 hdisk0。如果搜索失败,那么它将显示一个 LED 代码,并等待用户进行干预。它不会继续搜索 rmt0。
在更改了启动列表之后,对其进行验证,如下所示:
1
2
3
4
5
# bootlist -m normal -o
hdisk0 blv=hd5
cd0
对这些启动列表的支持可能随着平台的不同而不同,并且在某些平台中可能没有启动列表。当搜索启动设备时,系统将选择列表中的第一个设备,并确定它是否可以启动。如果在第一个设备中没有检测到 BLV,那么系统将转移至列表中的下一个设备。因此,设备在设备列表中的排序是非常重要的。
启动设备选择
表 2 中提供了可以在您的启动列表中使用的命名规范。向启动列表所添加的每个设备都必须处于 AVAILABLE 状态。否则,bootlist 命令将失败,并且您将碰到与以下所示类似的错误:
1
0514-210 bootlist: Device xxxxx is not in the AVAILABLE state
表 2
设备 说明
hdiskxx 物理卷设备逻辑名
cdxx SCSI 和 IDE CD-ROM 设备逻辑名
rmtxx 磁带设备逻辑名
entxx 以太网适配器逻辑名
tokxx 令牌环适配器逻辑名
访问无法启动的系统
如果您无法启动系统,那么第一步是访问该系统,并查看导致该故障的可能原因。这个过程允许您获得系统提示符,以便您可以尝试从系统恢复数据,或者执行纠正性的操作以使得系统能够从硬盘启动。
要访问该系统,需要执行以下步骤:
将系统功能键(如果有的话)旋至 Service 位置,或者在基于 PCI 的系统中按 F5,以便使系统从磁带/CD-ROM/DVD-ROM 驱动器进行启动(在步骤 4 的执行过程中)。
在打开系统单元的电源之前,先打开所有外部设备的电源,如终端、CDROM 或 DVD-ROM 驱动器、磁带驱动器、监视器和外部磁盘驱动器。然后,打开系统单元以便从安装媒体进行启动。
将安装媒体 Volume 1 插入到磁带驱动器、CDROM 或 DVD-ROM 驱动器,关闭系统单元的电源。
将系统单元的电源开关切换到打开位置。在启动时,将会显示这样一个屏幕(在图 1 的屏幕之前),其中要求您按 F1 功能键以选择合适的显示器作为系统控制台。系统中每个显示器都将接收一个功能键数值,以便将其标识为系统控制台。系统从安装媒体启动。几分钟之后,LED 中将显示 c31(如果您的系统有 LED;否则,将会显示与图 1 所示类似的屏幕)。
图 1. BOS 安装和维护屏幕
BOS 安装和维护屏幕
选择选项 3“Start Maintenance Mode for System Recovery”,并按回车。这时将显示与图 2 所示类似的屏幕。
图 2. 维护菜单
维护菜单
输入 1,即“Access a Root Volume Group”。这时将显示与图 3 所示类似的屏幕。
图 3. 警告屏幕
警告屏幕
请记下警告信息。如果您希望返回到前一个菜单,请输入 99;否则,输入 0 以进行确认。这将显示图 4 中的屏幕。
图 4. 所找到的卷组的列表
所找到的卷组的列表
选择您希望显示逻辑卷信息的卷组。这是非常重要的,因为 rootvg 中将包含 hd5,即启动逻辑卷。输入卷组编号,并按回车。这时将显示与图 5 所示类似的屏幕。
图 5. 在所选择的卷组中找到的逻辑卷的列表
在所选择的卷组中找到的逻辑卷的列表
从“Volume Group Information”屏幕中选择一个选项,并按回车。其中每一项将进行以下操作:
选项 1:选择这个选项,将在系统为您提供 Shell 和系统提示符之前,先导入并激活 rootvg 卷组,并为根卷组装入文件系统。
选项 2:选择这个选项,将在为根卷组装入文件系统之前,先导入并激活 rootvg 卷组,并为您提供 Shell 和系统提示符。
选项 99:输入 99 将使您返回到“Access a Root Volume Group”屏幕。
使用适当的方法来恢复数据,或者采用动作(如使用 bosboot 命令)使系统可以正常地启动。
常见的启动 LED 代码
在系统初始化过程中,提供了操作员面板显示屏的服务器将显示一些 LED 代码,这些代码可以提供有关启动过程状态的信息。一些代码是指示服务器运行到启动过程哪一步的检查点。对于不同的服务器类型,这些代码也有所不同。
例如,在一个提供了 4 个字符的显示屏的服务器上,E1F1 表示系统定义的控制台已经激活,而在提供了 3 个字符的显示屏的服务器上,则使用 FF1 进行表示。Fxx(其中 xx 为十六进制数字)格式的代码一般是与固件有关的。
其他代码用来表示所检测到的错误。表 3 中给出了一些最常见的 LED 代码,它们用于表示启动问题,以及如何解决它们以使得您的系统能够再次启动并运行。
表 3
LED 201 - 启动镜像损坏
1. 按照“访问无法启动的系统”中所描述的过程来访问您的 rootvg。
2. 检查 / and /tmp 文件系统。如果它们几乎满了,那么创建更多的空间。
3. 使用 lslv -m hd5 命令来确定启动磁盘。
4. 使用 bosboot -a -d /dev/hdiskn 重建启动镜像,其中 n 是包含启动逻辑卷的磁盘的编号。
5. 在错误日志中检查 CHECKSTOP 错误。如果找到了这样的错误,它很可能表示硬件的故障。
6. 关闭并重新启动系统。
LED 223-229 - 无效的启动列表
1. 将键模式切换到 Service(或者 F5,对于那些没有键盘锁的系统),并打开计算机的电源。
2. 如果显示正常继续,则将键模式切换到 Normal 并继续第3步。如果没有得到提示,则进入第 4 步。
3. 当出现登录提示符时,登录并按照“bootlist 命令”中所描述的过程来更改启动列表。然后继续执行第 7 步。
4. 按照“访问无法启动的系统”中所描述的过程来访问您的 rootvg,并继续执行第 5 步。
5. 使用 lslv -m hd5 命令来确定启动磁盘。
6. 按照“bootlist 命令”中所描述的过程来更改启动列表。
7. 关闭并重新启动您的系统。
LED 551、555 和 557 - 损坏的文件系统、损坏的 JFS 日志等等
1. 在装入任何文件系统(“Volume Group Information”屏幕中的选项 2)之前,按照“访问无法启动的系统”中所描述的过程来访问 rootvg。
2. 验证并修改文件系统,如下所示:
fsck -y /dev/hd1
fsck -y /dev/hd2
fsck -y /dev/hd3
fsck -y /dev/hd4
fsck -y /dev/hd9var
3. 使用如下命令再次格式化 JFS 日志:
/usr/sbin/logform /dev/hd8
4. 使用 lslv -m hd5 获得启动磁盘。
5. 使用下面的命令重新创建启动镜像:
bosboot -a -d /dev/hdiskn
其中,n 是包含启动逻辑卷的磁盘的编号。
LED 552、554 和 556 - 损坏的超级块和损坏的自定义 ODM 数据库
1. 重复 LED 551、555 和 557 中的步骤 1 到 2。
2. 如果 fsck 显示 block 8 被破坏,那么说明文件系统的超级块遭到破坏,并且需要对其进行修复。输入下面的命令:
dd count=1 bs=4k skip=31 seek=1 if=/dev/hdn of=/dev/hdn
其中,n 是该文件系统的编号。
3. 使用如下的命令重新构建 JFS 日志:
/usr/sbin/logform /dev/hd8
4. 如果这样做可以解决问题,那么就停止;否则,继续执行第 5 步。
5. 您的 ODM 数据库遭到破坏。重新启动您的系统,在“Volume Group Information”屏幕中,使用选项 2 按照“访问无法启动的系统”中所描述的过程来访问 rootvg。
6. 装入根文件系统和 usr 文件系统,如下所示:
mount /dev/hd4 /mnt
mount /usr
7. 将系统配置复制到备份目录:
mkdir /mnt/etc/objrepos/backup
cp /mnt/etc/objrepos/Cu* /mnt/etc/objrepos/backup
8. 复制 RAM 文件系统的配置,如下所示:
cp /etc/objrepos/Cu* /mnt/etc/objrepos
9. 使用 umount all 命令卸载所有的文件系统。
10. 使用 lslv -m hd5 命令来确定启动磁盘。
11. 使用下面的命令保存干净的 ODM 到启动逻辑卷:
savebase -d/dev/hdiskn
其中,n 是包含启动逻辑卷的磁盘的编号。
12. 重新启动,如果系统无法引导,则重新安装 BOS。
常见的启动 LED 和解决方案
LED 553 - 损坏的 /etc/inittab 文件
1. 按照“访问无法启动的系统”中所描述的过程来访问所有已装入的文件系统的 rootvg。
2. 使用 df 命令,检查 /、/var 和 /tmp 中的空闲空间。
3. 检查 /etc/inittab 文件,如果存在一个空的 inittab 文件、inittab 文件缺失,或者在 inittab 文件中存在错误的条目,则纠正 inittab 问题。
4. 检查下列文件的问题:
/etc/environment file
/bin/sh
/bin/bsh
/etc/fsck
/etc/profile
/.profile
5. 关闭系统,并重新启动。
运行级别
在操作系统中执行维护任务,或在更改运行级别之前,您应该深入地研究各种运行级别。运行级别是只允许选定的一组进程存在的一种软件配置。
确定系统运行级别
这个部分描述如何确定系统当前所处的运行级别,以及如何显示以前的运行级别的历史。表 4 中列出了系统可用的运行级别。
表 4
运行级别 说明
0-1 保留为操作系统将来使用。
2 包含多用户环境下的所有终端进程和守护进程。这是缺省的运行级别。
3-9 可以根据用户的首选项进行定义。
a、b、c、h 这些并不是真正的运行级别;它们与运行级别的不同之处在于,init 命令无法请求整个系统进入这些运行级别。请参见上半部分的“/etc/inittab 文件”,以获得更详细的信息。
S、s、M、m 维护模式。当系统从其他运行级别进入维护模式时,只有系统控制台可以作为终端使用。
确定当前运行级别
在命令行中,输入下面的命令:
1
2
3
4
5
# cat /etc/.init.state
2
#
系统将显示一个数字,即当前运行级别。
显示以前的运行级别的历史
使用 fwtmp 命令,您可以显示以前的运行级别的历史,如下所示:
1. 以 root 用户的身份登录。 2. 输入下面的命令,系统将显示与下面所示类似的信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# /usr/lib/acct/fwtmp < /var/adm/wtmp |grep run-level
run-level 2 1 0 0062 0123 1132072406
Tue Nov 15 10:33:26 CST 2005
run-level 2 1 0 0062 0123 1132075614
Tue Nov 15 11:26:54 CST 2005
run-level 2 1 0 0062 0123 1132092491
Tue Nov 15 16:08:11 CST 2005
run-level 2 1 0 0062 0123 1132094756
Tue Nov 15 16:45:56 CST 2005
更改系统运行级别
系当系统第一次启动时,它会进入 /etc/inittab 文件中的 initdefault 项所定义的缺省运行级别。系统会一直在该运行级别中运行,直到它收到一个更改运行级别的信号。您可以执行 lsitab 命令,以查看您的系统的缺省运行级别:
1
2
3
4
5
# lsitab init
init:2:initdefault:
#
要更改运行级别,请执行下面的过程:
1. 检查 /etc/inittab 文件,以确认您将要改变到的运行级别是否支持您正在运行的进程。进程 getty 是很重要的,因为它可以控制系统控制台和其他登录的终端线路访问。确保 getty 进程在所有的运行级别中都可以运行。
2. 使用 wall 命令通知所有的用户,您将要改变系统运行级别,并要求这些用户退出系统。
3. 使用 telinit 命令(以您将要切换到的运行级别作为该命令的参数),例如:
1
# telinit M
telinit 命令
通过接受单个字符的参数,并发送信号以告知 init 进程执行适当的动作,telinit 命令可以直接控制 init 进程(进程 ID 为 1)的操作。通常情况下,telinit 命令将使系统进入到指定的运行级别。telinit 命令可以向 init 进程传递下列参数作为指令:
0-9:告知 init 进程将系统置于运行级别 0-9。
S、s、M、m:告知 init 进程将系统置于维护模式。
a、b、c:告知 init 进程仅检查 /etc/inittab 文件中在运行级别字段中包含 a、b、c 的那些记录。
Q、q:告知 init 进程重新检查整个 /etc/inittab 文件。
N:向重新生成的进程发送中止进程的信号。
例如,要进入到维护模式,可以输入:
1
# telinit M
注意:您还可以使用 shutdown -m 命令进入到维护模式。
执行运行级别脚本
运行级别脚本允许用户在更改运行级别时启动和停止所选择的应用程序。以 K 开头的脚本是停止脚本,以 S 开头的脚本是启动脚本。
这些脚本保存于它们所从属的运行级别的特定子目录中,每个子目录的格式为 rcn.d,其中 n 表示运行级别:
/etc/rc.d/rc2.d
/etc/rc.d/rc3.d
/etc/rc.d/rc4.d
/etc/rc.d/rc5.d
/etc/rc.d/rc6.d
/etc/rc.d/rc7.d
/etc/rc.d/rc8.d
/etc/rc.d/rc9.d
/etc/rc.d/rc 脚本将运行它在指定目录中发现的启动脚本,并在运行级别更改时执行该启动脚本。脚本将首先运行停止应用程序的脚本,然后运行启动应用程序的脚本。
rc.* 文件的介绍
rc 文件作为初始化过程中的一部分加以执行;它们为系统做好配置的准备,并做好运行的准备。
rc.boot 文件
/sbin/rc.boot 文件是一个可以由简单的 Shell init和标准 init 命令调用的、用来使系统启动的脚本。它可以控制计算机的启动进程。当系统启动时,在每个启动阶段都会调用 /sbin/rc.boot 文件,每次都使用一个不同的参数。
根据启动设备的类型,rc.boot 文件对设备进行配置,并调用合适的应用程序。合适的应用程序包括:
从磁盘进行启动(启动阶段 1)
激活根卷组(启动阶段 2)
启用文件系统(启动阶段 2)
调用 BOS 安装程序或者诊断程序
注意:rc.boot 程序只能由 init 进程调用;在一个正在运行的系统上执行 rc.boot 脚本会产生不可预知的结果。
/etc/rc 文件
/etc/rc 文件执行正常的启动初始化;在 /etc/inittab 文件中,它的条目位于 rc.boot 条目之后。init 命令将读取 /etc/inittab 文件,并为 /etc/rc 文件创建一个进程。对于不同的安装,/etc/rc 文件的内容也有所不同。如果所有必需的操作都已成功完成,那么文件会出现一个返回码 0,以便允许 init 命令启动登录程序来完成正常的初始化和启动。
/etc/rc 文件可以完成许多启动功能,如:
激活所有标记为自动激活的卷组。
激活 /etc/swapspaces 文件中列出的所有分页空间(使用 swapon -a 命令)。
配置所有的转储设备(使用 sysdumpdev -q 命令)。
执行文件系统检查(使用 fsck -fp 命令)。
装入在 /etc/filesystems 文件中列出的标记为 mount=true 的文件系统(使用 mount all 命令)。
注意:/、/usr、/var 和 /tmp 文件系统会在启动过程(阶段 2)中自动地装入。/etc/rc 文件在运行 mount all 命令时不会尝试再次装入这些文件系统。
rc.net 文件
/etc/rc.net 文件是一个包含网络配置信息的 Shell 脚本。其中的一些节允许您启用网络接口和设置主机名、缺省网关以及当前主机的静态路由信息。这个文件可用于进行单步配置,作为单独配置主机所需的一组命令和文件的替代方法。
rc.net Shell 脚本在配置过程的第二阶段中通过配置管理器程序运行。如果 TCP/IP 已经安装,那么在配置过程的第二阶段完成,并且 init 命令启动了 SRC 之后,由 init 命令运行第二个脚本 rc.tcp。
应该显示该文件中的节,以便提示用户目前的运行状态。
如果在系统配置完成之后运行 cfgmgr 命令,/etc/rc.net Shell 脚本还可以由配置管理器程序 (cfgmgr) 运行。它经常在系统添加新设备后,在系统启动时运行。如果 cfgmgr 命令运行 rc.net,那么配置方法和 rc.net 文件本身都要检查网络设备是否已经处于可用状态。如果是,那么就不改变设备的属性值,以避免覆盖启动之后的任何配置更改。
如果在运行 /etc/rc.net 时没有调用 cfgmgr 命令,那么将设备属性重设为在 ODM 库中的属性值,而不管它当前的状态如何。这就允许系统配置恢复为 ODM 库中指定的属性值。
rc.tcpip 文件
/etc/rc.tcpip 文件是一个 Shell 脚本,当它执行时,使用 SRC 命令初始化所选择的守护进程。在系统每次重新启动时,rc.tcpip 脚本文件都会自动地执行。它也可以在任何时间从命令行加以执行。
大多数守护进程可以由 TCP/IP 特定的 rc.tcpip 文件进行初始化。这些守护进程包括:
inetd(在缺省情况下会启动)
gated
routed
named
timed
rwhod
注意:在一台主机上同时运行 routed 和 gated 会引起不可预知的结果。
还有一些特定于基本操作系统或其他应用程序的守护进程,也可以在 rc.tcpip 文件中启动。这些守护进程包括:
lpd
portmap
sendmail
syslogd(在缺省情况下会启动)
以下的示例可以作为参考:
下面的命令将启动 syslogd 守护进程:
#启动 syslog 守护进程(用于错误和事件日志记录)
start /usr/sbin/syslogd "$src_running"
下面的节将启动 lpd 守护进程:
#启动 print 守护进程
start /usr/sbin/lpd "$src_running"
下面的节将启动 routed 守护进程,但是不启动 gated 守护进程:
#启动 routing 守护进程(仅启动一个)
start /usr/sbin/routed "$src_running" -g
#start /usr/sbin/gated "$src_running"