要想用 IBM® blade 構建高可用的 Linux® 伺服器環境,首先需要在 blade 和任何外部存儲之間設置一個容錯的環境。這可以提供冗餘並啟用多路徑。在本文中,學習如何集成一個基於 x86 的 IBM BladeCenter® 伺服器和外部 IBM BladeCenter Boot Disk System (DS3200) SAS 存儲,這是實現可靠的 Linux/blade 伺服器環境的重要的前提條件。還討論一些 Linux Volume Manager 的 “hot-add” 特性,幫助滿足不斷增加的存儲系統需求。
本文介紹如何使用 IBM BladeCenter-H 以及基於 x86 的 BladeCenter HS21 和 LS21 從 SAS 存儲(在這裡是 IBM System Storage DS3200)進行引導。(對於 BladeCenter-E,請查閱 參考資料 中的 blade 兼容性表格,了解是否支持您的環境)。本文還講解如何在 Linux 中啟用多路徑。多路徑或多路徑 I/O 是一種容錯和性能改進技術,它在 CPU 和它的大規模存儲設備之間建立多個物理路徑。例如,一個 SCSI 磁碟連接同一計算機上兩個 SCSI 控制器,或者一個磁碟連接兩個 Fibre Channel 埠。
只使用外部存儲的主要優點是提高伺服器的可用性。儘管可以只使用 blade 中的本地磁碟配置不同的 RAID 級,但是必須關閉系統才能替換出故障的驅動器。通過使用外部存儲和熱交換驅動器,無需中斷服務也可以替換出故障的驅動器。最近,IBM 發布了 blade 伺服器 BladeCenter HS12 和 JS12 伺服器,它們支持熱交換 SAS 驅動器,但是它們都是單處理器機器。
下面是六個步驟:
步驟 1:準備 BladeCenter 伺服器並收集信息
一定要正確地安裝 SAS Switching Modules 並連接到兩個 DS3200 控制器。應該假設控制器 A(從機器背面看,在左邊)連接到 bay 3 中的 SAS 交換機,控制器 B 連接到 bay 4 中的 SAS 交換機。線纜插入哪個埠都沒關係,只要不修改 BladeCenter Management Module 中的默認分區(zoning),每個 blade 都可以訪問所有外部埠。
在默認情況下,所有外部埠都是禁用的。可以以兩種方式啟用它們 —— 通過 Web 或命令行界面。
通過 Web 界面。登錄到 Management Module 的 Web 界面,單擊左邊 I/O Module 部分中的 Admin/Power/Restart。選擇第三個 I/O 模塊,啟用外部埠,單擊右邊的 Save 按鈕。
通過命令行界面。通過 telnet 或 SSH 登錄 Management Module。執行以下命令:
system> ifconfig -ep enabled -T switch[3] system> ifconfig -ep enabled -T switch[4] |
這會啟用 bay 3 和 4 中兩個 SAS 交換機的外部埠。
為了把存儲分區映射到 blade,需要 SAS 子卡的 WWN (world wide name)。此名稱在 SAS 域中惟一地定義介面。通過 Web 或命令行收集 WWN。
通過 Web 界面。在 Management Module Web 界面中,單擊左邊面板中的 Hardware VPD。
通過命令行界面。通過 telnet 或 SSH 登錄 Management Module。可以用 list -l 2 列出可用的 blade。執行以下命令可以在列表中包含安裝的子卡:
system> list -l 3 |
對 blade 插槽(在此示例中是插槽 4)的子卡執行 info 以收集 WWN。
system> info -T blade[4]:exp[1] Manufacturer: LSI (Not Available) Manufacturer ID: 20301 Product ID: 118 Mach type/model: SAS Expansion Option Mach serial number: Not Available Manuf date: 02/08 Hardware rev: 3 Part no.: 39Y9187 FRU no.: 39Y9188 FRU serial no.: YK105481E006 CLEI: Not Available SAS ID 1: 50:00:62:b0:00:0b:26:24 SAS ID 2: 50:00:62:b0:00:0b:26:25 SAS ID 3: Not Available SAS ID 4: Not Available SAS ID 5: Not Available SAS ID 6: Not Available SAS ID 7: Not Available SAS ID 8: Not Available MAC Address 1: Not Available MAC Address 2: Not Available MAC Address 3: Not Available MAC Address 4: Not Available MAC Address 5: Not Available MAC Address 6: Not Available MAC Address 7: Not Available MAC Address 8: Not Available |
SAS ID 1 和 SAS ID 2 顯示埠 1(映射到交換機 bay 3)和埠 2(映射到交換機 bay 4)的 WWN。
步驟 2:準備存儲子系統
定義存儲單元並作為 LUN 映射到 blade。(邏輯單元號是分配給邏輯單元的數字。邏輯單元是一個 SCSI 協議實體,可以通過實際的 I/O 操作訪問它們)。可以使用 DS3000 Storage Manager 或 DS4000 Storage Manager 軟體。通過 Configure 選項卡進行初始配置;通過 Modify 選項卡進行修改。
在 Storage Manager 中,可以通過 Configure Host Access (Manual) 定義 blade 並把兩個 SAS 子卡的 WWN 與 blade 關聯起來。一定要選擇 LNXCLVMWARE 主機類型。這會禁用 AVT (Automatic Volume Transfer),在 Linux 上使用 RDAC 驅動程序時這是必需的。
現在,通過 Create Logical Drives 菜單為 blade 分配一些存儲。然後,通過 Create Host-to-Logical Drive Mappings 菜單把邏輯驅動器映射到 blade。一定要作為 LUN 0 映射(編號應該是連續的,一些環境在找到未使用的編號之後會停止掃描)。
步驟 3:配置 SAS BIOS
為了進行順利的安裝和從外部 SAS 存儲引導,需要確保 blade BIOS 和 SAS 子卡 BIOS 中的設置是正確的。最近發布的 x86 blade(2008 年年中)的默認設置即可正常工作;更早的版本可能需要做一些修改。
通過 LSI 配置實用程序檢查子卡是否已經啟用並包含在引導列表中,子卡最好是第一個引導設備。SAS1064 是子卡,SAS1064E 是這個 blade 的板上控制器。
另外,確保子卡屬性 Enabled BIOS & OS 的值是 Boot Support 並對所有 LUN 進行 BIOS 掃描。檢查的方法是選擇 Advanced Adapter Properties,然後選擇 Advanced Device Properties。如果不確定的話,就恢復默認設置。
在 blade BIOS 中,確保沒有禁用子卡插槽。
根據邏輯單元的首選路徑不同(控制器 A 或 B),可以把 hd0 或 hd1 設置為 blade 的第一個引導設備。如果像下面這樣在 Management Module 上設置:
system> bootseq hd0 hd1 -T blade[X] |
可能會產生一個錯誤 I9990301 Disk failure or disk reset failed,這時必須切換引導次序,讓 hd1 成為第一個引導設備。在我們的設置中,控制器 A 連接到 I/O bay 3,bay 3 映射到 hd0。控制器 B 連接到 I/O bay 4,bay 4 映射到 hd1。
步驟 4:安裝操作系統
|
在安裝 Red Hat Enterprise Linux 5.2 操作系統時,安裝程序會看到兩個設備 /dev/sda 和 /dev/sdb。儘管它們實際上代表相同的磁碟空間,但是安裝程序不了解路徑的冗餘性質,所以顯示相同的 LUN 兩次。這並不妨礙系統正常工作,因為只在 /dev/sda 上進行安裝。對於 /dev/sdb,會看到錯誤消息,可以按 cancel 忽略這些消息。
完成安裝之後,會出現關於 /dev/sdb 的 I/O 錯誤。檢查 dmesg 或查看 /var/log/messages。消除這些錯誤消息的惟一方法是安裝多路徑驅動程序。
Jul 1 19:47:26 localhost kernel: Buffer I/O error on device sdb, logical block 13107184 Jul 1 19:47:26 localhost kernel: end_request: I/O error, dev sdb, sector 104857472 Jul 1 19:47:26 localhost kernel: Buffer I/O error on device sdb, logical block 13107184 Jul 1 19:47:27 localhost kernel: end_request: I/O error, dev sdb, sector 0 Jul 1 19:47:27 localhost kernel: Buffer I/O error on device sdb, logical block 0 Jul 1 19:47:27 localhost kernel: Buffer I/O error on device sdb, logical block 1 Jul 1 19:47:27 localhost kernel: Buffer I/O error on device sdb, logical block 2 Jul 1 19:47:27 localhost kernel: Buffer I/O error on device sdb, logical block 3 Jul 1 19:47:27 localhost kernel: end_request: I/O error, dev sdb, sector 0 Jul 1 19:47:28 localhost kernel: end_request: I/O error, dev sdb, sector 2 |
步驟 5:啟用多路徑
在 Linux 上啟用多路徑有兩種方法 —— 使用 IBM/LSI 提供的官方 RDAC 驅動程序和設備映射器的開放源碼多路徑工具。此示例使用 LSI 網站上提供的 RDAC 驅動程序。
一定要安裝下面的包:
從 LSI 網站下載 RDAC 源代碼並在 /usr/src 中用 make && make install 命令編譯。
結束時會看到清單 6 所示的消息。
Checking Host Adapter Configuration... Detected 2 LSI Host Adapter Port(s) on the system Please wait while we modify the system configuration files. Your kernel version is 2.6.18-92.el5xen Preparing to install MPP driver against this kernel version... Generating module dependencies... Creating new MPP initrd image... You must now edit your boot loader configuration file, /boot/grub/menu.lst, to add a new boot menu, which uses mpp-2.6.18-92.el5xen.img as the initrd image. Now Reboot the system for MPP to take effect. The new boot menu entry should look something like this (note that it may vary with different system configuration): ... title Red Hat Linux (2.6.18-92.el5xen) with MPP support root (hd0,5) kernel /vmlinuz-2.6.18-92.el5xen ro root=LABEL=RH9 initrd /mpp-2.6.18-92.el5xen.img ... MPP driver package has been successfully installed on your system. |
按照消息的說明,編輯 /boot/grub/grub.conf 以使用新的原始磁碟。對於運行啟用 Xen 的內核的 RHEL5.2 系統,做以下修改:
default=1 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux Server (2.6.18-92.el5xen) root (hd0,0) kernel /xen.gz-2.6.18-92.el5 module /vmlinuz-2.6.18-92.el5xen ro root=/dev/VolGroup00/LogVol00 module /initrd-2.6.18-92.el5xen.img title Red Hat Enterprise Linux Server with MPP support (2.6.18-92.el5xen) root (hd0,0) kernel /xen.gz-2.6.18-92.el5 module /vmlinuz-2.6.18-92.el5xen ro root=/dev/VolGroup00/LogVol00 module /mpp-2.6.18-92.el5xen.img |
mppUtil -a(清單 8)顯示發現的所有陣列,在這裡只有一個名稱 Infra-sas2。
[root@localhost ~]# mppUtil -a Hostname = localhost Domainname = (none) Time = GMT 07/01/2008 19:56:01 --------------------------------------------------------------- Info of Array Module's seen by this Host. --------------------------------------------------------------- ID WWN Name --------------------------------------------------------------- 0 600a0b80002f746e0000000047d02718 Infra-sas2 --------------------------------------------------------------- |
如果需要基本 LUN 映射信息,可以執行 /opt/mpp/lsvdev:
[root@localhost ~]# /opt/mpp/lsvdev Array Name Lun sd device ------------------------------------- Infra-sas2 0 -> /dev/sda |
mppUtil -a [array name] 顯示此陣列的詳細信息:
[root@localhost ~]# mppUtil -a Infra-sas2 Hostname = localhost Domainname = (none) Time = GMT 07/01/2008 19:56:27 MPP Information: ---------------- ModuleName: Infra-sas2 SingleController: N VirtualTargetID: 0x000 ScanTriggered: N ObjectCount: 0x000 AVTEnabled: N WWN: 600a0b80002f746e0000000047d02718 RestoreCfg: N ModuleHandle: none Page2CSubPage: Y FirmwareVersion: 6.30.1.xx ScanTaskState: 0x00000000 Controller 'A' Status: ----------------------- ControllerHandle: none ControllerPresent: Y UTMLunExists: N Failed: N NumberOfPaths: 1 FailoverInProg: N ServiceMode: N Path #1 --------- DirectoryVertex: present Present: Y PathState: OPTIMAL hostId: 1, targetId: 0, channelId: 0 Controller 'B' Status: ----------------------- ControllerHandle: none ControllerPresent: Y UTMLunExists: N Failed: N NumberOfPaths: 1 FailoverInProg: N ServiceMode: N Path #1 --------- DirectoryVertex: present Present: Y PathState: OPTIMAL hostId: 1, targetId: 1, channelId: 0 Lun Information --------------- Lun #0 - WWN: 600a0b8000369d3f00000775481870af ---------------- LunObject: present CurrentOwningPath: A RemoveEligible: N BootOwningPath: A NotConfigured: N PreferredPath: A DevState: OPTIMAL ReportedPresent: Y ReportedMissing: N NeedsReservationCheck: N TASBitSet: Y NotReady: N Busy: N Quiescent: N Controller 'A' Path -------------------- NumLunObjects: 1 RoundRobinIndex: 1 Path #1: LunPathDevice: present IoCount: 0 DevState: OPTIMAL RemoveState: 0x0 StartState: 0x1 PowerState: 0x0 Controller 'B' Path -------------------- NumLunObjects: 1 RoundRobinIndex: 0 Path #1: LunPathDevice: present IoCount: 0 DevState: OPTIMAL RemoveState: 0x0 StartState: 0x1 PowerState: 0x0 |
最後兩部分表明,當前控制器 A 正在處理通信流 (RoundRobinIndex: 1)。兩個路徑都存在並處於優化狀態 (LUNPathDevice present, DevState optimal)。
顯示所有可用陣列和 LUN 的多路徑信息的另一種方法是執行 ls -lR /proc/mpp 命令。它列出可用的控制器和每個陣列的所有可用 LUN。通過顯示各個 LUN proc 條目的內容,可以獲得詳細信息。中間目錄 mptsas_h1c0t0 反映 Linux SCSI 地址(主機、通道、目標):
[root@localhost ~]# cat /proc/mpp/Infra-sas2/controllerA/mptsas_h1c0t0/LUN0 Linux MPP driver. Version:09.01.C5.19 Build:Tue Apr 1 13:30:42 CDT 2008 Lun WWN:600a0b8000369d3f00000775481870af Physical HBA driver: mptsas Device Scsi Address: host_no:1 channel:0 target:0 Lun:0 Queue Depth = 64 I/O Statistics: Number of IOs:8846 Longest trip of all I/Os:1 Shortest trip of all I/Os:0 Number of occurrences of IO failed events:0 |
通過 /etc/mpp.conf 配置 MPP。如果做了任何修改,那麼必須運行 mppUpdate 以便用新的配置文件重新構建原始磁碟。需要重新引導修改才會生效。
步驟 6:用更多的 LUN 擴展文件系統
如果需要給操作系統分配更多磁碟空間,只需給 blade 分配更多存儲單元,把它們添加到 LVM 中,並用新的磁碟空間擴展文件系統。
但是,在定義和使用新的存儲單元之前,需要談談 Logical Volume Manager (LVM)。LVM 提供底層存儲的抽象。它把一個或多個物理卷(磁碟)組合成卷組。卷組作為一個或多個邏輯卷的邏輯容器,它作為一個 SCSI 設備在 Linux 中出現(見圖 7)。
現在開始擴展文件系統。
在 Storage Manager 中定義新單元
用 Storage Manager 工具創建新的存儲單元(見步驟 2)。
通過 LVM 在 Linux 中使用它們
在 Linux 中使用新的存儲單元是一個分兩階段的過程。必須先把它們添加到 LVM 中,然後才能擴展實際的 Linux 文件系統。
用 hot_add 實用程序(它是 mppBusRescan 的鏈接)重新掃描 SAS 匯流排,尋找新映射的存儲單元:
[root@localhost ~]# hot_add Starting new devices re-scan... scan mptsas HBA host /sys/class/scsi_host/host1... found 1:0:0:1 found 1:0:1:1 scan mptsas HBA host /sys/class/scsi_host/host0... no new device found run /usr/sbin/mppUtil -s busscan... scan mpp virtual host /sys/class/scsi_host/host3... found 3:0:0:1->/dev/sdb /usr/sbin/hot_add is completed. |
Linux 找到了一個新單元並把它映射到 /dev/sdb。注意,新單元由多路徑驅動程序自動地管理。
為了為 LVM 準備此單元,創建一個包含整個磁碟的主 LVM 分區(分區類型 8e):
[root@localhost ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. The number of cylinders for this disk is set to 51200. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-51200, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-51200, default 51200): Using default value 51200 Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. |
現在,把新單元集成到現有的卷組中。清單 14 說明在擴展之前和之後如何用 vgdisplay -s 進行檢查:
[root@localhost ~]# vgdisplay -s "VolGroupBoot" 49.88 GB [49.88 GB used / 0 free] [root@localhost ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created [root@localhost ~]# vgextend VolGroupBoot /dev/sdb1 Volume group "VolGroupBoot" successfully extended [root@localhost ~]# vgdisplay -s "VolGroupBoot" 49.88 GB [49.88 GB used / 49.97 free] |
接下來,增加此卷組中的邏輯卷。可以用 lvdisplay 進行檢查,比較 LV Size 行:
[root@localhost ~]# lvdisplay /dev/VolGroupBoot/LogVolSlash --- Logical volume --- LV Name /dev/VolGroupBoot/LogVolSlash VG Name VolGroupBoot LV UUID dIanEg-J6Mf-60Ec-eUKb-rgoJ-dOM0-QmjQ3Q LV Write Access read/write LV Status available # open 1 LV Size 47.94 GB Current LE 1534 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 [root@localhost ~]# lvextend -l +100%FREE /dev/VolGroupBoot/LogVolSlash /dev/sdb1 Extending logical volume LogVolSlash to 97.91 GB Logical volume LogVolSlash successfully resized [root@localhost ~]# lvdisplay /dev/VolGroupBoot/LogVolSlash --- Logical volume --- LV Name /dev/VolGroupBoot/LogVolSlash VG Name VolGroupBoot LV UUID dIanEg-J6Mf-60Ec-eUKb-rgoJ-dOM0-QmjQ3Q LV Write Access read/write LV Status available # open 1 LV Size 97.91 GB Current LE 3133 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 |
現在,可以調整文件系統的大小了(對於 SAS 驅動器上的 50GB 空間,這需要大約兩分鐘)。如果調整根文件系統的大小,那麼只有 ext3 支持聯機調整(這意味著不必安排維護窗口)。
[root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroupBoot-LogVolSlash 47G 2.3G 42G 6% / [root@localhost ~]# resize2fs -p /dev/VolGroupBoot/LogVolSlash resize2fs 1.39 (29-May-2006) Filesystem at /dev/VolGroupBoot/LogVolSlash is mounted on /; on-line resizing required Performing an on-line resize of /dev/VolGroupBoot/LogVolSlash to 25665536 (4k) blocks. The filesystem on /dev/VolGroupBoot/LogVolSlash is now 25665536 blocks long. [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroupBoot-LogVolSlash 95G 2.3G 88G 3% / |
現在完成了!
結束語
我講解了如何從 SAS 控制的 IBM BladeCenter Boot Disk System (DS3200) 成功地引導 BladeCenter 伺服器。還討論了:
請記住,只使用外部存儲可以提高 blade 伺服器的可用性;在這種情況下,不必停止伺服器就可以更換或升級驅動器。(責任編輯:A6)
[火星人 ] Blade 和外部存儲:設置一個容錯環境已經有783次圍觀