專利名稱:在軟件部署中進行故障管理的方法和系統的制作方法
技術領域:
本發明總體上涉及計算機系統管理,并且具體地涉及管理軟件部署中的故障的方法和系統。
背景技術:
隨著現代計算機系統復雜性的增加,需要改善對軟件部署的管理。軟件部署管理涉及按照特定順序的多個管理任務,直到完成軟件安裝為止。然而,在部署軟件的過程中, 可能發生錯誤或故障。特別是因為發生在執行給定任務期間的錯誤可能影響其他任務的執行,因此監控這種錯誤是重要的挑戰。在向目標機器部署操作系統期間進行故障管理更具挑戰,因為目標機器在部署操作系統之前具有非常有限的能力。US 2008/0077935提供了如下解決方案,該解決方案用于在執行系統管理流時,使用工作流引擎與該工作流引擎所調用的任務之間的標準協議來處理可解決的和不可解決的錯誤。然而,這一方法是靜態的,并且需要來自管理員的人工干預來補救故障。進一步, 該方法不允許處理目標機器上的遠程控制的軟件安裝中的錯誤。因此,該方法不適于在操作系統部署期間或在復雜的服務器級系統中自動地管理故障。
發明內容
為了解決這些和其他問題,提供了根據所附獨立權利要求1的、處理目標數字設備上的遠程控制的軟件安裝中的錯誤的方法,以及分別根據所附權利要求11、12和13的計算機程序、計算機可讀介質以及系統。在所附從屬權利要求中限定了優選實施方式。本發明相應地提供了用于特別是在復雜的/差別化的服務器級環境中處理遠程操作系統(OS)部署中的錯誤的有效的解決方案。本發明進一步提供并利用了向服務器發送的清單(inventory)信息(硬件細節、 BIOS等級、DASD-直接存取存儲設備接口細節),其有助于在服務器側識別正確的補救措施。本發明的另一優點是對可能發生在所考慮的環境中的掛起情形進行補救。在計算系統(諸如個人計算機或服務器)中,在單個計算機程序或整個系統未能對用戶輸入(例如鍵盤和鼠標輸入、或者利用控制設備輸入鍵入的其他命令)進行響應時,發生掛起或凍結。根據本發明的實施方式,可以通過在網卡中利用帶外(out-of-boimd)通信、強制遠程重新引導,來解決由服務器檢測到的掛起狀況。然后,這使得可以自動恢復操作系統(OS) 部署流。本發明還使得能夠用在將要在所述預OS環境中運行的BIOS和1/0驅動器接口上的測試套件來仿真真實的行為。與限于靜態查看的現有技術文獻不同,本發明的進一步優點是處理如下場景在操作系統(OS)設置場景期間,目標故障被漸進發現,并且需要響應于檢測到引導故障并根據硬件清單和癥狀目錄,例如利用自動的BIOS刷新或其他的固件更新或重新配置,來動態地解決該目標故障。在研究附圖和詳細描述后,本發明的進一步優點對于本領域技術人員將變得清楚。旨在將任何附加的優點都包含在其中。
現在將參考附圖、通過示例的方式描述本發明的實施方式,其中相似的參考標號表示類似的元件,并且其中圖1示意性地圖示了操作系統部署(OSD)內核與執行I/O操作的I/O驅動器之間的交互;圖2示意性地示出了用于實現操作系統部署的示例性架構;圖3示出了根據本發明特定實施方式的故障管理系統;圖4A和圖4B表示在OS部署的硬件發現階段期間捕獲的示例性清單數據;圖5示出了用于OS部署的流程圖;以及圖6示出了用于OS部署期間的故障管理的流程圖。
具體實施例方式根據本發明的特定實施方式,提供了一種用于自動地管理對目標機器的操作系統部署期間的故障的方法。目標機器可以是任何類型的計算機機器或系統,無論是物理的還是虛擬的(例如工作站、移動/手持設備等)。本發明可以應用于對具有客戶端庫的增強型瀏覽器、或管理程序、或虛擬機、或其組合的按需的或實時的安裝中的故障管理。通常緊接在引導之后從系統存儲器加載和執行操作系統。預OS引導用于在加載和執行操作系統之前引導計算機系統。在預OS環境期間,計算機系統能力是有限的,這提供有限的資源來監控OS部署故障。為便于理解本發明,下面是在特定優選實施方式的詳細描述中使用的特定表達的定義巡表示操作系統。OSD表示操作系統部署。操作系統(OS)表示管理計算設備的硬件和軟件的軟件,該計算設備諸如智能電話、計算機、手持計算機、臺式計算機、膝上型計算機、超級計算機、視頻游戲控制臺、機器人、如洗碗機或洗衣機之類的家用電器、便攜式媒體播放器等。操作系統向應用程序和用戶提供多個服務。應用通過應用編程接口(API)或系統調用來訪問這些服務。常見的當代操作系統包括AIX或Linux。NTFS是Microsoft Windows系統的標準文件系統。10(或I/O)代表“輸入/輸出”,并且表示信息處理系統的不同的功能性單元用來彼此通信的接口集合。_代表基本輸入/輸出系統,其是限定引導固件的事實上的標準。BIOS的功能是識別、測試和初始化系統設備,諸如視頻顯卡、硬盤、軟盤、以及其他硬件。BIOS將機器準備為已知狀態,從而使得存儲在兼容介質上的軟件能夠被加載、執行對計算機給出控制。大多數時候,BIOS程序存儲在芯片上。某些組件攜帶其自身的BIOS擴展R0M,該ROM提供附加的功能性。操作系統和軟件取代這些基本的功能性并向應用提供替代軟件接口。當存儲在可重寫存儲器中時,刷新BIOS表示用BIOS映像重寫BIOS內容的處理。將BIOS更新到較新版本以修復特定缺陷(bug),用以支持較新的硬件,或者用以修復受損的BIOS。如果沒有正確地進行操作,則其可能致使系統不可操作。■(或EFI或UEFI)是“(統一)可擴展固件接口”的縮寫,其是定義操作系統與平臺固件之間的軟件接口的規范。EFI是計算機中存在的BIOS固件接口的大得多的、更復雜的、類OS的替代。EFI規范由統一 EFI論壇管理。PXE是指“預引導執行環境”并且又稱為預執行環境或“pixie”。其表示用以使用獨立于可用數據存儲設備(諸如硬盤)或所安裝的操作系統的網絡接口來引導計算機(客戶端或服務器)的環境。PXE利用若干網絡協議,如網際協議(IP)、用戶數據報協議(UDP)、 動態主機配置協議(DHCP)以及小文件傳輸協議(TFTP),并且利用多個概念,如全球唯一標識符(⑶ID)、通用唯一標識符(UUID)以及通用網絡設備接口。其利用一組預定應用編程接口(API)來擴展PXE客戶端(有待經由PXE引導裝入(bootstrap)的計算機)的固件。 術語PXE客戶端僅僅是指機器在PXE引導處理中所承擔的角色。PXE客戶端可以是配備有 PXE引導代碼的服務器、臺式機、膝上型計算機或者任何其他機器。WINPE表示“Windows預安裝環境”,其是用于部署工作站和服務器的某些Windows 系統的輕量級版本。其是在Windows安裝階段期間MS-DOS的替代,并且能夠經由PXE或存儲設備來引導。對于Windows的部署,可以使用微軟公司的Windows ΡΕ。對于Linux的部署,可以使用IBM的MCP Linux環境。設置管理器是指設置管理器系統,諸如TPMfOSD (用于操作系統部署的Tivoli設置管理器)。Tivoli是IBM公司的商標。盡管描述利用TPMfOSD提供了示例,但應當理解, 本發明的實施方式不限于這一特定環境。用于遠程地管理裸機目標(例如個人計算機)上的OS安裝和部署的系統通常以無人管理的方式與遠程機器交互(通過其BIOS),從而加載預引導微型OS環境(例如網絡之上的PXE),轉移和準備可安裝或可恢復的映像,然后作用于它們。結果可能是克隆的機器或者模板機器的特定化。在預引導階段期間的所有情況下,利用在目標系統BIOS中可用的特征和接口而發生交互。這例如可以使用用于OS部署的Tivoli設置管理器(TPMfOSD)來完成。這一系統顯露特征以利用PXE協議集在裸機機器上安裝OS映像。操作者一般地將硬件配置任務綁定到OS映像的部署。這些配置任務通常在實際部署OS映像之前執行以便正確地配置機器固件;這種任務的示例包括刷新/設置BIOS或RAID盤配置。TPMfOSD中的硬件配置的典型場景包括以下步驟1.管理員在服務器上輸入特定硬件工具包;2.操作者配置選擇目標機器的任務;3.在發布硬件配置任務后,將與所發現的硬件目標和任務配置設置匹配的工具包下載到目標機器上。然后在目標機器上執行以下附加步驟-將該環境加載在作為RAM盤的存儲器中;RAM盤是仿佛該存儲器是盤驅動(輔助存儲設備)那樣對待計算機的軟件的一塊RAM(主存儲設備或易失性存儲器)。其有時稱為虛擬RAM驅動或軟件RAM驅動,以將其作為“主存儲設備”的用法與使用包含RAM的分立硬件的“硬件RAM驅動”(諸如固態驅動)區分開。-基于經由web接口作出的選擇,將任何附加的二進制或配置文件添加到RAM盤;-計算機引導RAM盤;-執行硬件配置任務;-RAM盤重新引導;-如果進行了任何選擇,則恢復進行部署序列,但硬件配置還可以作為單獨任務而運行。對于“臺式機”和“膝上型計算機”環境,對于OS部署而言待管理的特征是穩定的, 這是因為它們在這一等級的系統中表現為高標準化級別。特征是從BIOS以及可能地從某些內核IO驅動器(例如NTFS)實現的。當試圖解決服務器級系統時,由于BIOS中的高差別化和低級別軟件組件而出現了若干問題。例如,可能存在某些不穩定性和性能問題。管理這種交互時的故障將通過“掛起”或連續的重新引導來顯示(manifest)其本身。圖1圖示了 OSD內核與執行I/O操作所需的I/O驅動器之間的交互。如圖所示,BIOS和預引導環境可操作地交互。為執行I/O操作,操作系統部署 (OSD)內核100進行對BI0S/EUFI 110或對內部NTFS驅動器101的調用。備選地,NTFS驅動器101可以調用BI0S/EUFI110,BI0S/EUFI 110可以調用I/O驅動器120。I/O驅動器 120實現實際I/O操作。當前,通過手動地檢測和修復發生故障的BIOS以及通過刷新目標機器上的BIOS 更新,來解決“掛起”或連續重新引導問題。這一非自動處理缺乏效率并且可能極其繁瑣。 其可能需要特定版本的BIOS。不可能將這種任務作為標準軟件依賴關系來管理同一 BIOS 版本能夠在給定的硬件環境上工作,而不能在另一硬件環境上工作。本發明改善了用于管理OS部署期間的故障的方法和系統的情形,特別是對于復雜的和差別化的服務器級系統而言。即使本發明具有針對復雜的和差別化的服務器級系統的特定優點,其也不限于這種系統。來自硬件/固件準備和OS安裝步驟的多數常見故障通過異常、利用服務器側癥狀目錄來處理并且通過觸發最適當的設置動作(例如BIOS刷新、 其他固件更新和重新配置)來自動地補救。圖2圖示了根據本發明某些實施方式的用于將操作系統部署到目標機器的示例性部署架構20。部署架構20包括-參考計算機機器200,用于捕獲要在操作系統部署處理期間使用的操作系統映像;-操作部署服務器210,用作用于操作系統部署的設置管理器。提供服務器210以捕獲操作系統映像和在目標計算機機器上部署這些操作系統映像,以及還使用與所考慮的目標機器相關的清單信息以及與檢測到的故障相關的信息來管理OS部署期間的故障。-目標機器220和221,在其上,服務器210以聯機模式(即通過與目標機器220 和221的直接網絡連接)執行操作系統部署操作;-脫機存儲設備230,諸如CD或DVD或硬驅動或適于存儲的任何其他設備,在其上,服務器210以脫機模式存儲其先前已經針對部署目標計算機系統而克隆和準備的操作系統映像;以及-目標計算機機器231,在其上,服務器210以脫機模式執行操作系統部署操作,即不需要或要求來自服務器210的直接網絡連接。圖2中所表示的系統組件在操作系統克隆和部署處理期間進行協作。操作系統和軟件先前已經安裝到參考計算機機器200,其形成參考操作系統映像。參考操作系統映像將是由OSD服務器210執行的操作系統部署操作的對象。OSD服務器210從參考計算機機器 200創建克隆參考操作系統映像,并將這一克隆的映像存儲在其本地存儲設備中,從而使得其準備好在操作系統部署操作期間使用。備選地,服務器210還將這一克隆的映像存儲在脫機存儲設備230 (諸如DVD或CD)上,從而使得其準備好在操作系統部署操作期間使用。OSD服務器210可以支持兩種類型的操作系統部署。第一 OS部署類型以聯機模式執行并使用服務器210與目標機器220或221之間的直接網絡連接。在這一聯機模式中, OSD服務器計算機210在目標機器220或221上直接部署克隆的參考操作系統映像。第二 OS部署類型以脫機模式發生,因為在服務器210與目標機器231之間不需要直接連接。在這一第二 OS部署中,操作者或管理員使用存儲設備230(克隆的操作系統映像存儲在其上), 并且將操作系統手動地部署在目標機器231上。圖3圖示了根據本發明某些實施方式的用于處理OS部署期間的故障的系統。任何時候,用信號通知OSD服務器210所實現的用以向目標機器31部署OS的OS部署過程的進行狀況,并且OSD服務器210適于接收與OS部署過程的每個階段的結果相關的通知(成功通知、故障通知或者其他類型的指示符)。根據本發明的某些實施方式,OS部署服務器210配備有錯誤處理組件332。錯誤處理組件332使用來自清單數據存儲庫333的、源于目標機器處的漸進的硬件發現的清單信息,來自動地管理故障通知(目標和源發服務器)。硬件發現(或硬件捕獲)在每次PXE引導時捕獲與目標機器相關的硬件信息。圖4A和圖4B表示在清單信息存儲庫333中能夠維持的示例性清單信息。清單信息包括與目標機器相關的、將用于在檢測到故障時確定所需的補救措施的參數,諸如標識硬件機器的 PCI 代碼(VersionID、DevicelD、SUbdevice ID,...)。返回到圖3,錯誤處理組件332包括故障檢測單元334,用于檢測OS部署期間的故障;以及補救處理單元335,用于響應于故障檢測、基于從故障檢測單元接收的故障信息和在清單信息存儲庫333中維持的清單信息,而觸發補救措施。當檢測到故障時,補救處理單元335使用所報告的故障搜索補救存儲庫336(在下文中也稱為錯誤目錄)以獲取適當的補救措施。補救存儲庫336將補救措施與故障代碼和清單信息相關聯,諸如以下示例性表所示
故障代碼清單信息補救惜施故障代碼XPCI代碼XBIOS版本χ故障代碼yPCI代碼yBIOS版本y
錯誤處理組件332進一步適于控制從補救存儲庫336獲取的補救措施的執行。補救措施可以包括例如用于BIOS更新的BIOS刷新動作或者任何其他適當的補救措施。可選地,BIOS和IO驅動器接口上的測試套件可以在預OS環境中運行。這一測試套件可以在PXE 引導之后運行,并且可以幫助在實際工作期間減少故障發生。測試套件能夠使用信令協議。圖5是根據本發明某些實施方式的用于OS部署的流程圖。在步驟500中,在目標機器激活后,將控制傳遞到BIOS以便檢查引導序列。通過 PXE協議將引導序列設置為從網絡啟動。BI0S/PXE邏輯聯系引導服務器(通過示例的方式,引導服務器在TPMfOSD服務器本身中運行),并且預OS內核被下載并在目標機器31上啟動。在步驟510中,預OS內核執行硬件發現并向OSD服務器210發送回清單數據。將服務器接收到的清單數據存儲在清單存儲庫333中。在步驟510中,反復地執行BIOS測試套件以基于在清單存儲庫333中維持的清單信息,而檢測OS部署期間的故障(下面參考圖6而描述)。然后從OSD服務器下載虛擬盤(ramdisk)(諸如WINPE和/或MCP虛擬盤)并啟動該虛擬盤。在步驟511中,可以執行硬件配置任務(例如刷新或設置BIOS)。可以加載用于配置硬件的特定工具并在WINPE/MCP之上運行該特定工具,從而使得使用標準OS運行時間來實際地執行任務。在步驟520中,OSD代理在WINPE之上運行,并執行分區創建和對文件系統中的文件的實際復制。可以加載用于創建分區和復制文件的OSD代理并在虛擬盤(例如WINPE/ MCP)之上運行該OSD代理,以便使用標準OS運行時間來實際地執行任務。一旦完成這些操作,虛擬盤WINPE/MCP就重新引導(因為直接加載預OS內核一般是不可能的)。在步驟MO中,在重新引導后,BIOS再次承擔控制并重復步驟500到520。在步驟550中,預OS內核檢測在前一階段中是否已經發生了錯誤。其將任何錯誤傳送給OSD服務器。其還檢查待執行的附加任務。在這一階段,其在硬盤上引導0S,并且還前進到設置待在OS起動時運行的OSD代理。在步驟560中,當OS引導時,OSD工具啟動并激活特定OS工具以定制OS(諸如OS 聯網配置、用戶設置、語言設置等)。例如,在Microsoft Windows (Windows是微軟公司在美國和其他國家的注冊商標)的情況下,可以執行“syspr印”工具,特別是以便使操作系統準備好經由磁盤映像來進行磁盤克隆和恢復。在這一步驟之后,可以安裝附加的安裝包。然后“ syspr印”重新引導和重新引導序列再次啟動。在步驟570中,當重新引導時,BIOS再次承擔控制并像在步驟500中一樣重新啟動該序列。在步驟580中,預OS內核檢查故障和附加任務,然后可以可選地安裝附加的安裝包。在步驟590中,如果沒有其他動作要執行,則OS被引導和正常地啟動。圖6是用于故障監控和OS部署補救的流程圖。流程圖的左邊部分表示由預OS內核執行的步驟,而流程圖的右邊部分表示由OSD服務器210執行的步驟。
故障監控在預OS內核的漸進的硬件發現階段期間執行。在步驟600中,預OS內核將在硬件捕獲期間所發現的清單數據發送給OSD服務器210用于存儲。在步驟602中將由服務器接收到的清單數據存儲在清單存儲庫333中。在步驟603中,通過向服務器210通知測試啟動來發起測試套件。在步驟604中,服務器210注冊測試啟動時間,然后在步驟605中在預OS內核側運行BIOS測試套件。并行地,服務器210等待預定時間量(步驟606)直到向目標通知測試完成(607)為止。如果向目標通知了測試完成,則服務器210在步驟608中復位啟動測試時間,然后在步驟609中確定該測試是否成功。如果測試成功,則部署繼續到步驟610。否則,如果已經檢測到故障,則部署過程在步驟611中結束。當在測試套件期間檢測到故障時,生成故障代碼。然后,使用故障代碼和在清單存儲庫333中可獲得的清單信息,來從補救存儲庫336中確定補救措施。補救措施可以包括識別將被刷新的新BIOS版本。 然后,步驟612刷新所識別的新BIOS,并且通過返回到步驟600來重新啟動部署流。如果服務器在預定時間量已經到期之后沒有接收到測試完成通知(步驟613和 614),則服務器210確定目標機器處于掛起狀態并且在步驟615中依賴于硬件配置而選擇新的BIOS版本。步驟616使用帶外技術(即AMT)將新的BIOS刷新到目標上。然后,重新引導機器,并且通過返回到步驟600來重新啟動部署流。本發明由此提供了用于處理OS部署期間的故障的自動和高效的方法,而不需要來自用戶或管理員的手動操作。錯誤處理組件332使用在硬件發現期間所發現的信息來檢測故障,并基于故障信息來確定要在發生故障的目標上執行的補救措施。刷新BIOS被認為是危險的操作,其可能致使目標機器無法使用。通過根據檢測到的故障以及由已更新的 BIOS版本,在硬件發現期間漸進地捕獲的清單信息自動地提供補救措施,本發明進一步避免了此類不希望的/不適當的BIOS刷新操作。本發明可以采取完全硬件實施方式、完全軟件實施方式或者包含硬件元件和軟件元件兩者的實施方式的形式。在優選實施方式中,本發明以軟件實現,該軟件包括但不限于固件、駐留軟件、微代碼等。特別地,應當意識到,圖5和圖6的很多組件的功能性可以借助于軟件、硬件或者這些軟件和硬件的任何組合的固件來實現。例如,在高性能系統中,Java 執行的硬件實現可以證明是有利的。另外,本發明可以采取計算機程序產品的形式,該計算機程序產品可從計算機可用或計算機可讀介質訪問,該計算機可用或計算機可讀介質提供由計算機或任何指令執行系統使用或者結合計算機或任何指令執行系統使用的程序代碼。出于本描述的目的,計算機可用或計算機可讀介質可以是能夠包含、存儲、傳送、傳播或傳輸由指令執行系統、裝置或設備使用或者結合指令執行系統、裝置或設備使用的程序的任何裝置。Tivoli是IBM公司在美國、其他國家或這兩者中的商標。其他公司、產品或服務名稱可以是其他的商標或服務標記。
權利要求
1.一種在向目標機器的操作系統部署中進行故障管理的方法,所述操作系統部署包括運行漸進的硬件發現,以捕獲與所述目標機器有關的清單信息,以及將所述清單信息存儲在清單數據存儲庫中,其中所述方法包括a-監控所述操作系統部署以在預定持續時間內檢測預操作系統環境中的操作系統部署中的故障,b-響應于所述預定持續時間到期而發出故障監控完成通知,C-確定在所述監控所述操作系統部署的步驟期間是否已經生成了故障代碼,以及d-如果在步驟c中檢測到故障代碼,則使用所述故障代碼和所述清單信息,來確定與 BIOS有關的至少一個補救措施,并且執行所述至少一個補救措施。
2.根據權利要求1所述的方法,其中所述方法包括如果在所述預定持續時間內沒有發出故障監控完成通知,則檢測所述目標機器的掛起狀態,并且響應于檢測到所述掛起狀態而執行至少一個補救措施。
3.根據權利要求2所述的方法,其中響應于檢測到所述掛起狀態而執行的所述至少一個補救措施包括-依賴于硬件配置而選擇新的BIOS版本,以及-使用帶外技術將所述新的BIOS刷新到目標上。
4.根據權利要求2或3所述的方法,其中響應于檢測到所述掛起狀態而執行的所述至少一個補救措施進一步包括強制遠程重新引導所述目標機器。
5.根據權利要求4所述的方法,其中所述強制遠程重新引導的步驟在所述目標機器的網卡中使用帶外通信。
6.根據任一前述權利要求所述的方法,其中所述步驟d包括從補救存儲庫確定所述至少一個補救措施。
7.根據任一前述權利要求所述的方法,其中在步驟d中確定的所述至少一個補救措施包括依賴于所述故障代碼和所述清單信息而選擇新的BIOS版本,以及刷新所述新的BIOS 版本。
8.根據任一前述權利要求所述的方法,其中在步驟d中確定的所述至少一個補救措施包括更新或重新配置所述目標機器的固件。
9.根據任一前述權利要求所述的方法,其中所述清單信息包括以下信息之中的至少一個硬件細節、BIOS等級或者直接存取存儲設備接口細節。
10.根據任一前述權利要求所述的方法,其中所述監控操作系統部署的步驟包括用在將要在所述預操作系統環境中運行的BIOS和I/O驅動器接口上執行的一系列測試來仿真所述機器的行為。
11.一種計算機程序,包括當在合適的計算機上執行所述計算機程序時用于執行根據權利要求1到10中任一項的方法的步驟的指令。
12.—種計算機可讀介質,其上編碼有根據權利要求11的計算機程序。
13.—種系統,包括適于執行根據權利要求1到10中任一項所述的方法的步驟的裝置。
全文摘要
本發明涉及在軟件部署中進行故障管理的方法和系統。具體地,本發明提供了一種向目標機器的操作系統部署期間進行故障管理故障的方法,所述操作系統部署包括運行漸進的硬件發現以捕獲與目標機器有關的清單信息,以及將所述清單信息存儲在清單數據存儲庫中。該方法包括監控OS部署以在預定持續時間內檢測預OS環境中的操作系統部署中的故障;響應于該預定持續時間到期而發出故障監控完成通知;確定在監控操作系統部署的步驟期間是否已經生成了故障代碼;如果檢測到故障代碼,則使用該故障代碼和清單信息來從補救存儲庫確定與BIOS有關的補救措施,并且執行該補救措施。
文檔編號G06F11/07GK102375764SQ20111022862
公開日2012年3月14日 申請日期2011年8月5日 優先權日2010年8月13日
發明者A·佩羅尼, C·馬里內利, L·皮徹蒂, R·薩勒姆 申請人:國際商業機器公司