Linux FC/iSCSI存儲設備管理系列(一):Linux系統設備驅動入門
轉載請在文首保留原文出處:EMC中文支持論壇 - https://community.emc.com/go/chinese
介紹
Linux FC/iSCSI存儲設備管理系列,主要介紹Linux系統管理FC/iSCSI磁盤設備的相關概念與技術細節,內容包括:
- Linux磁盤設備驅動介紹
- 磁盤設備管理(一):FC磁盤管理
磁盤設備管理(二):iSCSI磁盤管理
- HBA管理與配置
- 文件系統結構
- 磁盤在線調整
- SCSI驅動調優與排錯
本文作為系列之一,主要介紹了Linux版本,內核模塊及啟動過程,設備驅動基礎,以及動態配置磁盤設備的步驟。
更多信息
Linux版本概述:
Linux是與Unix類似的操作系統,與傳統操作系統和花費較高的Unix系統相比,它為個人電腦用戶提供了一個免費或價格相對低廉的操作系統。Linux以快速高效著稱,與其他服務器操作系統一樣,它具有多重應用。
Linux廠商發行版本有Red Hat,Debian,Fedora,Gentoo,SuSE,TurboLinux等,其中一部分可以下載。FTP發行商如:Sunsinte.org.uk, Sunsinte.unc.edu, www.isoimages.org。
可通過以下URL找到Linux相關信息:
www. linux.com 和 www.linix.com
www.xfree86.com
Redhat企業版是一種常見的版本。它支持如Intel X86, Intel Itanium, AMD AMD64 and IBM z系列, POWER 系列, and S/390。Redhat使用最新版本穩定的2.5/2.6 Linux內核。
Redhat發展歷程:
1991年,Linux內核發布。同年Bob Yong(加拿大人,多倫多大學畢業)在紐約UNIX用戶組引入系統管理自由軟件。
1993年,Bob Yang 建立了ACC公司,營銷Linux和UNIX的支持軟件和書籍雜志。
1994年,Marc Ewing(美國人,卡內基梅隆大學畢業)建立了自己的Linux分銷業務,發布了Red Hat Linux 1.0。
1995年,Bob Yang 收購了Marc Ewing的業務,合並后的ACC公司成為新的Red Hat 軟件公司,發布了Red Hat Linux 2.0。
1997年12月,Red Hat Linux 5.0發布,它支持Intel、alpha和Sparc平台和大多數的應用軟件。極其簡單易用的RPM模塊化的安裝、配置和卸載工具,使程序的安裝可在15分鍾內完成。軟件升級也很方便,這對剛開始使用Linux的用戶來說是一大福音。
2003年4月,Red Hat Linux 9.0發布。重點放在改善桌面應用方面,包括改進安裝過程、更好的字體瀏覽、更好的打印服務等。統計表明,2003年,Red Hat的 Linux市場份額為86% 。
2004年4月30日,Red Hat公司正式停止對Red Hat 9.0版本的支持,標志著Red Hat Linux的正式完結。原本的桌面版Red Hat Linux發行包則與來自民間的Fedora計划合並,成為Fedora Core發行版本。Red Hat公司不再開發桌面版的Linux發行包,而將全部力量集中在服務器版的開發上,也就是Red Hat EnterpriseLinux版。 2005年10月RHEL4發布。
2007年3月,現行主流版本RHEL5發布(最新版本5.5)
2010年4月RHEL6 BETA測試版發布。
2011年04月12日 Oracle發布的Linux系統6.0(基於RedHat Enterprise Linux 6.0)
本文中,將采用Redhat企業版作為示例操作系統。
Linux內核模塊及啟動:
Linux內核采用模塊化設計。系統啟動時,只有最近貯存的內核會加載到內存中。此后,每當用戶請求一個當前內核中不具備的功能,將動態加載一個內核模塊(有時稱為驅動)到內存中。
在安裝過程中,對系統硬件進行探測。基於本次探測及用戶提供的信息,安裝程序決定在啟動時加載哪一種模塊。安裝程序建立了動態加載機制以實現透明操作。
如果安裝結束后新添加了硬件,並且該硬件需要一個內核模塊,則系統必須為新硬件配置並加載合適的內核模塊。
上圖列出了BIOS(Basic Input and Output System)的啟動過程。
不同類型的服務器使用了不同的引導裝載程序。以上圖例中,如果服務器是基於Intel的則引導裝載程序可能是GRUB或LILO。如果是mainframe大型機則有可能使用IBM s390引導加載程序。
BIOS發起第一階段主引導加載程序。BIOS將位於引導介質第一扇區中的程序加載入內存,我們稱之為主引導記錄(Master Boot Record或MBR)。主引導記錄只有512字節大小,包含啟動設備所需的機器代碼,也稱為引導加載程序(boot loader)。一旦BIOS將引導加載程序找到並將其加載入內存后,它就將啟動程序的控制權交給二級引導加載程序。
在第一階段,主引導加載程序通過BIOS從主引導記錄被讀入內存。它的主要工作是加載位於不同介質上任意位置的數據,通過這步操作來定位第二階段引導加載程序。
第二階段引導裝載程序由第一階段的引導裝載程序發起,它包含有加載程序更需要磁盤空間的部分,如用戶界面和內核引導程序。該階段允許用戶選擇啟動的操作系統或Linux內核。可用的兩個啟動加載程序是GRUB或LILO。GRUB是較新的啟動加載程序,能夠閱讀ext2和ext3類型文件分區並在啟動時加載它的配置文件——/boot/grub/grub.conf。LILO是較老的版本,它使用主引導記錄中的信息以確定用戶可用的啟動選項。這意味着無論何時配置發生更改或內核被手動升級,必須通過命令來講合適的信息寫入MBR。命令為:/sbin/lilo -v -v。
GRUB 與 LILO 的比較
所有引導加載程序都以類似的方式工作,滿足共同的目的。不過,LILO 和 GRUB 之間有很多不同之處:
- LILO 沒有交互式命令界面,而GRUB 擁有。
- LILO 不支持網絡引導,而GRUB 支持。
- LILO 將關於可以引導的操作系統位置的信息物理上存儲在MBR 中。如果修改了LILO 配置文件,必須將LILO 第一階段引導加載程序重寫到MBR。相對於 GRUB,這是一個更為危險的選擇,因為錯誤配置的MBR 可能會讓系統無法引導。使用GRUB,如果配置文件配置錯誤,則只是默認轉到GRUB 命令行界面。
接下來,系統將操作系統加載入內存並將設備的控制權轉交給該操作系統。操作系統將會處理/etc/inittab文件,並依據/etc/inittab設定的內容,依序啟動相關進程。首先啟動的程序為/etc/rc.sysinit。rc.sysinit設置環境變量,啟動置換空間,檢查文件系統,並執行所有系統初始化所需的其他步驟。例如,絕大多數系統使用時鍾,因此rc.sysinit讀取/etc/sysconfig/clock配置文件以初始化硬件時鍾。另一個例子是如果要初始化串口,rc.sysinit將會執行/etc/rc.serial文件。
Linux磁盤設備驅動基礎:
Linux內核中采用可加載的模塊化設計,常見的驅動程序是作為內核模塊動態加載的。
模塊的相關命令:
- lsmod——列出當前系統加載的模塊
- rmmod——將當前模塊卸載
- insmod——加載當前模塊
- mknod——創建相關模塊
Linux將設備看作文件,每個設備對應一個文件名,內核中對應一個索引節點,對文件操作的系統調用大都適用於設備文件。對某個具體設備而言,文件操作和設備驅動是同一事物的不同層次。Linux將設備分為兩大類,一類是像磁盤那樣的以塊或扇區為單位、成塊進行輸入/輸出的設備,稱為塊設備;另一類是像鍵盤那樣以字符(字節)為單位,逐個字符進行輸入/輸出的設備,稱為字符設備;文件系統通常建立在塊設備上。
本文將以SCSI磁盤為例來介紹磁盤設備驅動的基礎知識。
SCSI(小型計算機系統接口)總線是一種高效的點對點數據總線,它最多可以支持8個設備,其中包括多個主設備。在總線上的兩個設備間數據可以以同步或異步方式,在32位數據寬度下傳輸率為40M字節來交換數據。SCSI總線上可以在設備間同時傳輸數據與狀態信息。
Linux SCSI子系統由兩個基本部分組成,每個由一個數據結構來表示。
Host
一個SCSI host即一個硬件設備:SCSI控制權。在Linux系統中可以存在相同類型的多個SCSI控制權,每個由一個單獨的SCSI host來表示。這意味着一個SCSI設備驅動可以控制多個控制權實例。SCSI host總是SCSI命令的initiator設備。
Device
雖然SCSI支持多種類型設備如磁帶機、CD-ROM等等,但最常見的SCSI設備是SCSI磁盤。SCSI設備總是SCSI命令的target。這些設備必須區別對待,例如象CD-ROM或者磁帶機這種可移動設備,Linux必須檢測介質是否已經移動。不同的磁盤類型有不同的主設備號,這樣Linux可以將塊設備請求發送到正確的SCSI設備。
SCSI子系統的初始化非常復雜,它必須反映出SCSI總線及其設備的動態性。Linux在啟動時初始化SCSI子系統。 如果它找到一個SCSI控制器(即SCSI hosts)則會掃描此SCSI總線來找出總線上的所有設備。然后初始化這些設備並通過普通文件和buffer cache塊設備操作使Linux內核的其它部分能使用這些設備。
一旦SCSI子系統初始化完成這些SCSI設備就可以使用了。每個活動的SCSI設備類型將其自身登記到內核以便Linux正確定向塊設備請求。
如前所述,一個設備文件(即設備節點)可以通過mknod命令來創建,其中指定了主設備號和次設備號。主設備號表明某一類設備,一般對應着確定的驅動程序;次設備號一般是用於區分標明不同屬性,例如不同的使用方法,不同的位置,不同的操作等,它標志着某個具體的物理設備。高字節為主設備號和底字節為次設備號。例如,在系統中的塊設備SCSI 磁盤的主設備號是3,而多個SCSI 磁盤及其各個分區分別賦予次設備號1、2、3……
SCSI系統中磁盤設備驅動層級如下:sd——直接訪問磁盤,sg——SCSI通用接口,sr——Data CD-ROMs,st——磁帶。sg驅動是基於字符的設備而其他三個驅動都是塊設備驅動。sg驅動主要用於掃描儀,刻錄機,以及打印機。從第一個SCSI控制器開始,sg設備文件動態映射到SCSI總線上的SCSI IDs/LUNs。
塊設備的本地文件名具有以下格式:/dev/sdln,l表示物理設備而n表示該物理設備上的分區號。當主機總線適配器發現附加連接的存儲后Linux會在設備文件/dev/sd[l][n]中定義這些設備。當主機總線適配器監測到隨機附帶存儲后Linux將會定義設備文件/dev/sd[l][n]。
按照以上定義,以文件/dev/sda1為例,物理設備是“a”而分區是“1”。Linux內核為SCSI設備保留了16個主設備編號,各主設備編號可擁有0-255個從設備編號。這些從設備編號包括SCSI設備的分區。對於每個磁盤設備Linux支持0到15個分區。其中,1至4為主分區,分區5以上為邏輯分區或擴展分區;以上限制只適用於Intel平台。默認情況下,Linux並不使用slice這一概念。因此,16個主設備編號和16個從設備編號意味着256個SCSI磁盤設備,內核能夠掃描范圍從1至255的磁盤設備。Red Hat Linux和SuSE SLES 7最大支持128個SCSI設備,而SuSE SLES 8版本支持256個SCSI設備。
動態設備配置步驟:
在Linux內核中,與其他類型的UNIX系統(如:Sun,SGI,HP-UX,BSD)不同,設備名中並沒有使用SCSI地址。如前文所述,塊設備名格式為/dev/sdln,l是表示物理設備驅動的字符而數字n代表該物理設備驅動的分區號。設備名在啟動時或設備加載時按發現順序動態指定。
如果添加了硬件設備之后系統重新啟動,設備編號將會更改從而造成主機的掛載列表不准確。為了保持設備編號的准確性並減少掛在列表出現偏差的可能性,應當把新的設備附加在當前設備列表中。例如,如果主機包含多個HBA,最好將新設備附加在最后一個HBA的磁盤設備列表的末端,這樣就無需更改掛載列表中的現有記錄。如果新設備添加到第一個HBA中,那么在系統重啟之后,所有設備編號都會在原有數字加一同時掛在列表記錄也需隨着該設備發生偏移。如果只有一個HBA,則新設備可方便地添加到原有設備列表中並相應地改變掛載列表。
目前Linux系統缺乏植入到內核中的、如同drvconfig或ioscan這樣能夠動態配置SCSI通道的命令。
重新配置Linux主機的三種方式有:
- 重啟系統
- 卸載並重新加載HBA驅動模塊
- echo /proc文件系統
重啟主機:
重啟主機是檢測新添加磁盤設備的可靠方式。在所有I/O停止之后方可重啟主機,同時靜態或以模塊方式連接磁盤驅動。系統初始化時會掃描PCI總線,因此掛載其上的SCSI host adapter會被掃描到,並生成一個PCI device。之后掃描軟件會為該PCI device加載相應的驅動程序。加載SCSI host驅動時,其探測函數會初始化SCSI host,注冊中斷處理函數,最后調用scsi_scan_host函數掃描scsi host adapter所管理的所有scsi總線。
卸載並重新加載HBA驅動模塊:
通常情況下,HBA驅動在系統中以模塊形式加載。從而允許模塊被卸載並重新加載,在該過程中SCSI掃描函數得以調用。通常,在卸載HBA驅動之前,SCSI設備的所有I/O都應該停止,卸載文件系統,多路徑服務應用也需停止。如果有代理或HBA應用幫助模塊,也應當中止。
命令示例:
例如,rac節點上某台服務器執行fdisk –l命令看不到共享磁盤,可嘗試執行如下命令:
# modprobe -r lpfc(卸載驅動)
# modprobe lpfc(加載驅動)
/proc下SCSI掃描:
2.4內核中,/proc文件系統提供了可用SCSI設備的列表。如果系統中SCSI設備重新配置,那么所有這些改變通過echo /proc接口反映到SCSI設備中。添加一個設備,主機,channel,target ID,以及磁盤設備的LUN編號會被添加到/proc/scsi/,需指定scsi編號。
命令示例:
# echo "scsi add-single-device 0 1 2 3" > /proc/scsi/scsi
0:主機ID
1:channel ID
2:target ID
3:LUN編號
該命令會將新磁盤設備添加到/proc/scsi/scsi文件中。如果沒有找到相應文件,需為/dev路徑下新增磁盤設備創建設備文件名。
如果要刪除一個磁盤設備,使用適當的主機,channel,target ID及LUN編號運行如下格式命令:
# echo "scsi remove-single-device 0 1 2 3" > /proc/scsi/scsi
0:主機ID
1:channel ID
2:target ID
3:LUN編號
參考
Accessing Disks Through Linux Servers