Print-friendly Version
Solaris 10 作業系統功能焦點:預測自我修復
Amy Rich,2004 年 11 月
目錄:
過去,當 Solaris 系統上發生硬體或軟體錯誤時,通常會在 /etc/syslog.conf 中指定的適當裝置上記錄訊息,其餘的診斷與修復工作則交由管理員負責。Solaris 10 作業系統推出了預測自我修復技術,Software Express for Solaris 方案可讓您先睹為快。預測自我修復是一項全新設計而統整的架構與方法,可用以自動診斷、報告及處理軟硬體錯誤情況。這項新技術可縮短硬體或軟體問題的除錯時間,並可為管理員與 Sun 技術支援提供每項錯誤的相關詳細資料。架構中包含事件管理協定、錯誤管理員、軟體錯誤處理軟體以及 Solaris 服務管理員。
Solaris 錯誤管理員
發生硬體錯誤時,預測自我修復會發出後續將由基礎軟體產生相互關聯的二進位遙測事件,以加強傳統 syslog 訊息。接著,基礎軟體會自動診斷錯誤、通知管理員,並在情況允許時採取更正動作。Sun 的錯誤管理員也會提供錯誤代碼,並適時將管理員引導至 http://www.sun.com/msg/ 上對應的知識庫文章。Sun 的第一個錯誤管理員實作涵蓋了各種的 SPARC CPU、記憶體與 I/O 匯流排連結元件。後續版本預計要納入 x86 平台的 Solaris 作業系統適用的模組。
系統管理員與 Sun 錯誤管理員的主要互動會透過錯誤管理員常駐程式 fmd(1M) 進行。fmd(1M) 會在開機時啟動,並轉換在背景執行 (如需完整的詳細資訊,請參閱 fmd(1M) 線上手冊),然後繼續監視執行中的系統。當元件產生錯誤時,錯誤管理系統即會處理錯誤,然後將錯誤報告資料與之前的錯誤報告和其他相關資訊產生相互關聯,以進行診斷及因應潛在錯誤。診斷完成後,錯誤管理員會為問題指定通用唯一識別碼 (UUID),以便在任何一組系統上辨識此問題。若情況允許,fmd(1M) 會接著開始進行相關步驟以自我修復失敗的元件。fmd(1M) 程式也會適時將錯誤記錄到 syslogd 中,並 (或) 通知管理員。
錯誤管理的資源識別碼
錯誤管理的資源識別碼 (FMRI) 會識別錯誤管理員內的資源,以便進行錯誤與錯誤事件的傳遞。錯誤管理員的命名機制 (FMRI 為 URI 子類別) 是以 RFC 2396 中定義的 URI 語法為基礎。FMRI 語法具有數量不限的各種機制,分別可為相關資源的樹狀結構命名。FMRI 可以 URI 字串或元件的「名稱-值」組表示。例如,在 Sun Fire 15K 伺服器的網域 A 中,主機板 3 上的記憶體模組 2 之記憶體組 1 中的 DIMM 0 的 FMRI,可以下列 URI 字串表示(注意:實際使用時不應有斷行的情況)。
hc://chasis-id=138A2036,product-id=SunFire15000,domain-id=A/system-board=3/cpu-
module=2/memory-bank=1/dimm=0
或「元件-名稱」組:
名稱
值
類型
名稱
值
類型
機制
hc
字串
權限
機殼 ID:138A2036 產品 ID:SunFire15000 網域 ID:A
權限
主機板
3
uint32_t
cpu-module
2
uint32_t
memory-bank
1
uint32_t
dimm
0
uint32_t
錯誤管理員會將下列其中一種狀態與各個 FMRI 產生相互關聯:
ok:資源存在並使用中,且沒有已知問題。
unknown:資源不存在或無法使用,但沒有已知問題。這可能表示管理員已停用或取消配置資源。
degraded:資源存在並可使用,但已診斷出一或多個問題。
faulted:資源存在但無法使用,因為已診斷出有一或多個無法回復的問題。已停用資源以防止進一步損害系統,並需要人為介入。
錯誤管理員指令行工具
錯誤管理員的 Solaris 實作包含數項指令行工具,可觀察及修改 fmd(1M) 及其模組的運作方式。管理員最常用的工具會是 fmadm(1M)、fmdump(1M) 與 fmstat(1M) 工具。
fmadm(1M) 公用程式可檢視、載入及卸載模組,以及檢視與更新資源快取。它可為系統管理員提供適當的方法,以顯示 fmd(1M) 認為錯誤的每項資源。最常見的 fmadm(1M) 子指令 (如需完整的詳細資訊,請參閱 fmadm(1M) 線上手冊) 是:
config:顯示配置,包括每個元件模組的模組名稱、版本與說明。
faulty [-ai]:顯示目前判定為錯誤的資源清單。針對每項資源會列出 FMRI、資源狀態與診斷的 UUID。根據預設,fmadm faulty 指令只會針對目前存在且有錯誤的資源列出輸出。若指定 -a 選項,則會列出錯誤管理員所快取的所有資源資訊,包括系統中已不存在之元件的資訊。若指定 -i 選項,則會顯示錯誤管理員中每項資源的永久性快取識別碼,而非最近的狀態與 UUID。
load path:載入指定的模組。指定的路徑必須是絕對路徑,而且參考已定義的其中一個模組目錄中所包含的模組。
unload module:卸載指定的模組。模組名稱是 fmadm config 輸出中所指定的名稱。錯誤管理員通常會根據系統配置自動載入及卸載模組,因此這個指令應該很少使用。
rotate errlog | fltlog:為指定的錯誤管理員記錄檔排程自動重建。logadm(1M) 配置檔案中使用此子指令的某項目,會自動重建記錄檔。
fmdump(1M) 程式可讓系統管理員檢視所有與 fmd(1M) 相關聯的記錄檔,以及擷取所有診斷的特定詳細資訊。根據預設,fmdump(1M) 指令會顯示錯誤記錄,但若指定 -e 指令行參數,則會顯示錯誤記錄。fmdump(1M) 指令亦可使用指令行選項而僅選取特定的事件 (如需完整的詳細資訊,請參閱 fmdump(1M) 線上手冊):
-c class:選取符合指定類別的事件。
-t time:選取在指定時間當時或之後發生的事件。
-T time:選取在指定時間當時或之前發生的事件。
-U UUID:選取符合指定 UUID 的事件。
指定 -v 或 -V 可取得任何指令的詳細輸出。
fmstat(1M) 程式主要用於報告錯誤管理系統的統計資料。若指定 -m module 引數,fmstat(1M) 則會報告由指定之 module 所保存的統計資料。若未指定 -m,fmstat(1M) 則會報告每個模組的下列統計資料 (如需完整的詳細資訊,請參閱 fmstat(1M) 線上手冊):
module:fmadm config 所報告的模組名稱
ev_recv:模組所接收的事件數目
ev_acpt:模組對於相關診斷所接受的事件數目
wait:等待由模組檢查的事件之平均數目
svc_t:模組所接收之事件的平均服務時間 (毫秒)
%w:有事件待處理的時間百分比
%b:模組忙於處理事件的時間百分比
open:模組所擁有的使用中案例數目
solve:模組自載入後所解決的案例數目
memsz:模組目前所配置的動態記憶體容量
bufsz:模組目前所配置的永久性緩衝區空間容量
預測自我修復錯誤管理員範例
一旦發生 CPU 錯誤,管理員即可在主控台上看見此訊息,並記錄至 syslog:
SUNW-MSG-ID: SUN4U-8000-6H, TYPE: Fault, VER: 1, SEVERITY: Major
EVENT-TIME: Sun Oct 17 14:15:50 PDT 2004
PLATFORM: SUNW,Sun-Blade-1000, CSN: -, HOSTNAME: myhost
EVENT-ID: 64fe6c23-12b7-ccd1-f0a7-b531941738f8
DESC: The number of errors associated with this CPU has exceeded acceptable levels.
Refer to http://sun.com/msg/SUN4U-8000-6H for more information.
AUTO-RESPONSE: An attempt will be made to remove the affected CPU from service.
IMPACT: Performance of this system may be affected.
REC-ACTION: Schedule a repair procedure to replace the affected CPU. Use fmdump
-v -u <EVENT_ID> to identify the CPU.
CPU 狀態會從 ok 變更為 faulted,使用此 CPU 的程序將會終止,而 CPU 會離線。CPU 的狀態可透過 psrinfo(1M) 指令加以檢視:
psrinfo
0 on-line since 09/27/2004 16:57:30
1 faulted since 10/17/2004 14:15:50
執行錯誤訊息中所列的 fmdump(1M) 指令,使用 EVENT-ID 取得錯誤的更多資訊。輸出顯示 CPU 1 有問題,而 Slot 1 中的元件需要更換。文字 Slot 1 表示瑕疵零件的所在位置,可在主機板上找出。
fmdump -v -u 64fe6c23-12b7-ccd1-f0a7-b531941738f8
TIME UUID SUNW-MSG-ID
Oct 17 14:15:50.1630 64fe6c23-12b7-ccd1-f0a7-b531941738f8 SUN4U-8000-6H
100% fault.cpu.ultraSPARC-III.l2cachedata
FRU: hc:///component=Slot 1
rsrc: cpu:///cpuid=1/serial=1107C270C8A
替代的 CPU 送達後,Slot 1 中有問題的 CPU 即可進行更換與重新啟用。
Solaris 服務管理員
為了加強對軟體錯誤的處理,Sun 重新設計了它啟動及監視服務的方式。一改傳統的 /etc/init.d 啟動程序檔,Solaris 10 作業系統中的許多程式已轉而使用 Solaris 服務管理員的服務管理架構 (smf),以啟動、停止、修改及監視程式。服務管理員亦可用以識別軟體相互依存性,並確保服務會以正確的順序啟動。若服務 (如 sendmail) 突然中止,服務管理員會自動驗證 sendmail 服務的所有需求是否都在執行中,並重新產生必要的程式。硬體若發生錯誤並且離線,服務管理員可重新啟動在其控制下任何停止後需要啟動的程式,以移除提供服務的硬體。
每項受控於服務管理員的服務皆由 XML 配置檔案 (稱為清單) 所控制,此配置檔案可定義服務名稱、類型、相依性與其他重要資訊。這類清單會儲存在儲存庫中,可由儲存庫常駐程式 svc.configd(1M) 加以檢視及修改。主要重新啟動常駐程式 svc.startd(1M) 會讀取儲存庫,並視需要評估相依性及啟動服務。過去的 inetd 服務現在也是服務管理員的一部分。相同機制可啟用、停用或重新啟動所有的 inetd 服務,就像任何其他由服務管理員控制的程式一樣。
服務管理員指令行工具
服務管理員由許多程式所組成,其中有些程式係供管理員用以檢視及管理服務與服務特性。這些指令包括:svcadm(1M)、svcprop(1)、svcs(1) 與 svccfg(1M)。此外,還有 inetconv(1M) 與 inetadm(1M) 指令可協助轉換傳統的 inetd 服務,以及在服務管理員架構中加以管理。
svcadm(1M) 指令可讓您對服務配置儲存庫中的服務實例進行啟用、停用與狀態處理。修改這些特性會使對應的委任重新啟動程式採取動作,使服務實例進入適當的狀態。若未委託服務,主要重新啟動程式則會執行這些功能。-v 參數會將詳細資訊列示至標準輸出。svcadm(1M) 的有效子指令包括:
disable [-t] [FMRI | pattern]:停用運算元所指定的服務實例。若指定 -t 選項,實例會在重新開機時復原為其先前啟用的設定 (可能已停用的設定)。
enable [-rt] [FMRI | pattern]:啟用運算元所指定的服務實例。若指定 -r 選項,則會啟用實例,並以遞迴方式啟用其相依性。若指定 -t 選項,實例會在重新開機時復原為其先前啟用的設定 (可能已啟用的設定)。
refresh [FMRI| pattern]:重新整理運算元所指定的服務實例。實例應會重新讀取其配置。
restart [FMRI| pattern]:重新啟動運算元所指定的服務實例。
delegate restarter_FMRI [FMRI | pattern]:將指定實例的指定重新啟動程式,變更為 restarter_FMRI 特性所指定的重新啟動程式。將實例重新委託給 svc.startd(1M),也會有同等的效果。必須重新啟動,重新委託才會生效。並非所有的重新啟動程式皆支援相同的基礎應用程式模型。因此,並非所有的潛在委託均可產生有效的服務實例。
mark [-It] instance_state [FMRI| pattern]:使運算元所指定的服務實例進入指定的 instance_state (降級或維護)。服務必須處於線上狀態,才能進入降級狀態。若指定 -I 選項,服務實例會立即進入指定的狀態。若指定 -t 選項,則會暫時進入某狀態。其持續期間僅限於目前系統實例的使用期限。暫時進入某狀態的選項不適用於降級狀態。
milestone [-d] milestone_FMRI:使系統進入指定的里程碑。指定里程碑未直接或間接依存的所有服務都會暫時停用。若指定 -d 選項,指定的里程碑即會成為預設的最終里程碑,且在重新開機後仍是如此。
clear [FMRI| pattern]:針對處於維護狀態的服務,讓每個運算元所指定的服務實例進入未初始化的狀態,使其得以回到線上狀態。針對由標記子指令設為降級狀態的服務,使服務回到線上狀態。
svcprop(1) 程式會列示服務配置儲存庫中的特性值。您可透過 -p 選項與 FMRI 運算元選取特性。根據預設,選取單一特性後,其值會列示在以空格分隔的同一行上。支援的選項如下:
-c:擷取目前的特性值,不進行撰寫。
-f:依 FMRI 指定特性。包含選項 -t。
-p [name/]name:針對運算元所指定的每個特性群組、實例或服務,列示已命名特性或特性群組的值。
-q:無訊息。不產生輸出。
-s snapshot:使用已命名的快照擷取指定的特性或特性群組。若快照中沒有指定的特性群組,則會檢查目前的特性值。
-t:使用多重特性輸出格式。
-v:詳細。針對不存在的特性列示錯誤訊息,即使同時使用選項 -q 亦然。
-w:在列示任何項目之前,等待選取的特性群組或特性進行變更。
svcs(1) 指令會顯示服務配置儲存庫中所記錄的服務實例相關資訊。svcs(1) 指令具有三種不同的形式:
svcs [-aHpv?] [-o col[,col]...] [-R instance_FMRI]...
[-sS col]... [FMRI | pattern] ...
svcs {-d | -D} [-Hpv?] [-o col[,co= l]...] [-sS col]...
[FMRI | pattern] ...
svcs -l [FMRI | pattern] ...
第一種形式會針對引數所指定的服務實例列示單行的狀態清單。每個實例只會列出一次,且不含引數;所有啟用的服務實例皆會列出,即使暫時停用亦然。第二種指令形式會針對引數所指定之服務實例的相依性或附屬項目,列示單行的狀態清單。第三種形式會列示特定服務與實例的相關詳細資訊。上述三種指令說明中所呈現的選項包括:
-?:顯示進階的用法訊息,包括欄限定符號。
-a:同時選取停用的服務實例。
-d:列出指定的服務實例所依存的服務或服務實例。
-D:列出依存於指定之服務或服務實例的服務實例。
-H:省略欄標頭。
-l:顯示有關選定服務與服務實例的所有可用資訊,每一行顯示一個服務屬性。不同實例的資訊會以空白行分隔。
-o col[,col]...:列示指定的欄。每個 col 都應該是欄名稱。
-p:列出每個服務實例的相關程序。有些服務實例可能沒有相關的程序。每個程序的程序 ID、開始時間與指令名稱 (ps(1) 中的 PID、STIME 與 CMD 欄位) 皆會顯示。
-R instance_FMRI:選取以指定服務實例做為重新啟動程式的服務實例。
-s col:依欄加以排序輸出。col 應為欄名稱。多個選項會以附加的方式運作。
-S col:以選項的相反順序依 col 排序。
-v:顯示詳細欄:STATE、NSTATE、STIME、CTID 與 FMRI。
與 svcs(1) 指令搭配使用的欄名稱會區分大小寫,顯示如下:
CTID:服務實例的主要合約 ID (若有的話)。
DESC:服務範本元素中的服務簡短說明。有些服務可能沒有相關說明,這時會以連字符表示空值。
FMRI:服務實例的 FMRI。
INST:服務實例的實例名稱。
NSTA:服務實例的下一個狀態 (縮寫),如 STA 欄說明中所示。連字符表示實例未轉換,或是與 STA 相同。
NSTATE:服務的下一個狀態。連字符可用以表示實例未轉換,或是與 STATE 相同。
SCOPE:服務實例的範圍名稱。
SVC:服務實例的服務名稱。
STA:服務實例的縮寫狀態。
STATE:服務實例的狀態。轉換中的實例會加上星號,除非同時顯示 NSTA 或 NSTATE 欄。
STIME:若服務實例在過去 24 小時內進入目前的狀態,此欄會指出進入此狀態的時間。否則,此欄會指出進入此狀態的日期,並以底線取代空格。
svccfg(1M) 指令可用以匯入、匯出及修改儲存庫中各項服務的配置。只要指定子指令,或指定含有一系列子指令的指令檔,即可以互動方式呼叫此指令。呼叫形式有三種:
/usr/sbin/svccfg [-v]
/usr/sbin/svccfg [-v] subcommand [args...]
/usr/sbin/svccfg [-v] -f command-file
如需所有可用子指令的完整清單,請閱讀 svccfg(1M) 線上手冊。
inetconv(1M) 程式可將 inetd.conf 項目轉換為 smf(5) 清單,並將其匯入儲存庫中。來源指令行中服務名稱或協定的所有斜線字元,皆會以底線取代。根據預設,配置檔案會使用下列範本命名:
<svcname>-<proto>.xml
<svcname> 記號會取代為服務的名稱,而 <proto> 記號會取代為服務的協定。原始線索中服務名稱或協定所用的任何斜線字元,皆會以底線取代。每份產生的清單皆包含服務行做為註釋。若在轉換的過程中發現服務行的格式不正確或屬於內部 inetd 服務,則不會產生任何清單,而且會略過輸入檔案中的此服務行。inetconv(1M) 程式接受下列指令行選項:
-?:顯示用法訊息。
-e:啟用已在輸入檔案中啟用的 smf(5) 服務。
-f:若在目標目錄中發現與所要產生的服務清單同名的服務清單,且您已指定此選項,inetconv(5) 即會覆寫此清單。否則會產生錯誤訊息,而不會執行此服務的轉換。
-i srcfile:允許指定替代的輸入檔案 srcfile。若未指定此選項,則會以 inetd.conf(4) 檔案做為輸入。
-n:關閉在轉換期間所產生之清單的自動匯入功能。若稍後您要將產生的清單匯入 smf(5) 儲存庫中,可以使用 svccfg(1M) 公用程式來執行此作業。
-o destdir:允許為產生的配置檔案指定替代的目標目錄 destdir。若未指定此選項,清單則會存放在 /var/svc/manifest/network/rpc 中 (若為 RPC 服務),否則會存放在 /var/svc/manifest/network 中。
inetadm(1M) 程式會檢視及配置 inetd 控制的服務。支援的選項如下:
-?:顯示使用訊息。
-l FMRI:列出 name=value 組中之指定服務實例的所有特性。此外,若特性值繼承自 inetd 所提供的預設值,則會由記號識別 name=value 組 (預設值)。若特性沒有指定的服務實例預設值,則會繼承特性。
-e FMRI:啟用指定的服務實例。
-d FMRI:停用指定的服務。
-p:以 name=value 組的形式,列出 inetd 所提供的所有預設 inet 服務特性值。若此值屬於布林類型,則會以 TRUE 或 FALSE 的形式列出。
-m FMRI property_name=value [property_name=value...]:為指定服務實例變更指定特性的值。指定特性時採取 name=value 組的形式,並以空格字元分隔。若要移除特定實例值並接受特性的預設值,只要指定特性而不指定值即可。
-M property_name=value [property_name=value...]:變更指定的 inetd 預設特性值。指定特性時採取 name=value 組的形式,並以空格字元分隔。
預測自我修復服務管理員範例
使用 svcs(1) 檢視系統上的服務:
svcs
....
online Oct_31 svc:/system/filesystem/local:default
online Oct_31 svc:/network/rpc/bind:default
online Oct_31 svc:/system/cron:default
online Oct_31 svc:/system/sac:default
online Oct_31 svc:/system/system-log:default
online Oct_31 svc:/network/inetd:default
online Oct_31 svc:/network/nis/client:default
online Oct_31 svc:/network/rpc/keyserv:default
online Oct_31 svc:/network/rpc/gss:ticotsord
online Oct_31 svc:/network/security/ktkt_warn:ticotsord
online Oct_31 svc:/milestone/multi-user:default
....
使用 svcs -p 找出服務與程序之間的關係。此範例會顯示 NFS 伺服器服務:
svcs -p nfs/server
STATE STIME FMRI
online Oct_12 svc:/network/nfs/server:default
Oct_31 103729 mountd
Oct_31 103731 nfsd
服務若有問題,請使用服務管理員工具進行診斷,並檢閱建議的因應動作以更正此問題。例如,svcs -x 選項會列出每個未執行之服務的相關資訊,以及未執行的原因:
svcs -x
svc:/application/print/server:default (LP Print Service)
State: disabled since Tue Oct 05 22:27:55 2004
Reason: Disabled by an administrator.
See: http://sun.com/msg/SMF-8000-05
See: lpsched(1M)
Impact: 1 service is not running.
http://www.sun.com/msg/ 提供了問題類型的其他資訊,並提出取得其他資料及更正問題的建議步驟。
使用 svccfg(1) 可檢視 SMTP 伺服器的特性,並判斷其相依性:
svccfg
svc:> select network/smtp
svc:/network/smtp> listprop
system-log dependency
system-log/entities fmri svc:/system/system-log
system-log/grouping astring optional_all
system-log/restart_on astring none
system-log/type astring service
identity dependency
identity/entities fmri svc:/system/identity:domain
identity/grouping astring require_all
identity/restart_on astring refresh
identity/type astring service
name-services dependency
name-services/entities fmri svc:/milestone/name-services
name-services/grouping astring require_all
name-services/restart_on astring refresh
name-services/type astring service
network-service dependency
network-service/entities fmri svc:/network/service
network-service/grouping astring require_all
network-service/restart_on astring none
network-service/type astring service
fs-local dependency
fs-local/entities fmri svc:/system/filesystem/local
fs-local/grouping astring require_all
fs-local/restart_on astring none
fs-local/type astring service
general framework
general/entity_stability astring Unstable
general/single_instance boolean true
資源
Comments (latest comments first)
Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License .