Linux系統(tǒng)下基于SCST的SCSI-Target驅(qū)動設(shè)計碩士畢業(yè)論文_第1頁
Linux系統(tǒng)下基于SCST的SCSI-Target驅(qū)動設(shè)計碩士畢業(yè)論文_第2頁
Linux系統(tǒng)下基于SCST的SCSI-Target驅(qū)動設(shè)計碩士畢業(yè)論文_第3頁
Linux系統(tǒng)下基于SCST的SCSI-Target驅(qū)動設(shè)計碩士畢業(yè)論文_第4頁
Linux系統(tǒng)下基于SCST的SCSI-Target驅(qū)動設(shè)計碩士畢業(yè)論文_第5頁
已閱讀5頁,還剩152頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

摘要集中、異地容災等應用中充分體現(xiàn)出來。存儲局域網(wǎng)(SAN)是配功能。整個SCSItarget驅(qū)動分三層模塊,最底層模塊處理與磁盤模塊則響應I/0請求,完成數(shù)據(jù)的最終讀寫操作。這三個模關(guān)鍵詞:虛擬存儲,SCSI,SAN,SCST,光纖通道Withthedeepeningdevelopmscalabilitythathasbeenwidelyusedinrecentyeas.FC-SANchannels.Thisassaydescriptsthedesignofscsitargetdriver.SCSItargetdriverworkswithHostbusadapters,processesandresponsestoI/0requestsdata,thenpassthemtothetopmodule.ThevirtualdiskmoduleresponsetheI/0requestsanddoth浙江大學碩士學位論文目錄I i V 11.1虛擬存儲現(xiàn)狀 2 2 3 4 81.4本章小結(jié) 9 2.1SCSI協(xié)議框架 2.3SCSI系統(tǒng)與設(shè)備 2.3.2SCSI域 浙江大學碩士學位論文目錄Ⅱ 2.6總體描述 2.7本章小結(jié) 3.2.1scsidevice的抽象 3.2.3scsitarget的抽象 浙江大學碩士學位論文目錄3.3.3scsi_dispatch_cmd函數(shù) 3.5.3會話管理模塊 3.6本章小結(jié) 第4章Target驅(qū)動程序設(shè)計實現(xiàn) 4.1底層驅(qū)動設(shè)計 4.1.4I/0及事件處理函數(shù)接口 4.2.1Qlogic驅(qū)動注冊 4.3磁盤驅(qū)動模塊 4.4系統(tǒng)測試與性能 浙江大學碩士學位論文目錄 4.5本章小結(jié) 5.1全文總結(jié) 5.2后續(xù)開發(fā) 錯誤!未定義書簽。 錯誤!未定義書簽。浙江大學碩士學位論文目錄V圖目錄圖2.1SCSI協(xié)議框架 圖2.3SCSI應用系統(tǒng)與SCSI域 圖2.4多個SCSI域的計算機 圖2.5SCSI設(shè)備控制器的組成 圖2.6SCSI狀態(tài)轉(zhuǎn)換 圖2.7六字節(jié)命令描述塊 圖2.8邏輯單元組成 圖3.3scsi_request_fn函數(shù)調(diào)用 圖3.6SCSI客戶端/服務(wù)器模型 圖3.8采用下半部機制的會話注冊過程 圖4.1Target驅(qū)動與固件通信模式 浙江大學碩士學位論文目錄 圖4.5系統(tǒng)I/0吞吐量 浙江大學碩士學位論文目錄 表4.1IOMeterI/0測試 1第1章緒論虛擬存儲(StorageVirtualization)是指將多個物理上獨立存在的存儲體通過軟硬件的手段集中管理起來。形成一個邏輯上的虛擬存儲單元供主機訪問,這個虛擬邏輯單元的存儲容量是各物理存儲體的存儲容量之和,而它的訪問帶寬則接近各個物理存儲體的訪問帶寬之和。虛擬存儲實際上是邏輯存儲,把物理設(shè)備變成完全不同的邏輯鏡像呈現(xiàn)給用戶,既充分利用了物理設(shè)備的高性能、高可用的優(yōu)勢,又打破了物理設(shè)備本身不可克服的局限是管理存儲空間而不是物理存儲部件。虛擬存儲可以適應和包容豐富多樣、迅速發(fā)展的存儲設(shè)備。具備為異構(gòu)服務(wù)器和客戶機提供服務(wù)的能力。因此,虛擬存儲系到光纖通道協(xié)議,能夠支持異構(gòu)存儲和服務(wù)器環(huán)境。鏡像和空閑驅(qū)動器、產(chǎn)生合成式驅(qū)動器、連接多個存儲子系統(tǒng)構(gòu)成單一驅(qū)動器、實現(xiàn)集中式管理以及靈活的存儲容量擴充。(3)具有可視性和可管理性,能夠在更新和恢復等突發(fā)事件21.1虛擬存儲現(xiàn)狀1.1.1虛擬存儲的現(xiàn)實需求企業(yè)級的客戶主要面臨下面4個挑戰(zhàn):email、數(shù)據(jù)倉庫、電子商務(wù)、媒體、科研、醫(yī)療和其他應我們看到越來越多的系統(tǒng)操作環(huán)境使用不同廠商的硬件和這4個挑戰(zhàn)歸結(jié)起來就是:如何以有限的IT資源,經(jīng)濟有3效地管理好不斷增長的信息,簡化管理異構(gòu)操作環(huán)境的復雜性。所以,虛擬存儲以其獨特的商務(wù)優(yōu)勢成為企業(yè)尋求的解決方案。1.1.2存儲虛擬化網(wǎng)絡(luò)的關(guān)鍵技術(shù)存儲虛擬化的核心工作是物理存儲設(shè)備到單一邏輯資源池的映射,通過虛擬化技術(shù),為用戶和應用程序提供虛擬化磁盤或虛擬卷,而且用戶可以根據(jù)需求對它進行任意分割,并分配給特定的主機或應用程序,而為用戶隱藏或屏蔽了具體物理設(shè)備的各種物理特性。實現(xiàn)虛擬存儲化關(guān)鍵技術(shù)如下:存儲虛擬化的一個主要功能是實現(xiàn)存儲數(shù)據(jù)的共享,普通的文件系統(tǒng)只允許對數(shù)據(jù)進行獨占式訪問,但是商業(yè)應用需要在操作系統(tǒng)和“數(shù)據(jù)倉庫”之間共享數(shù)據(jù)。數(shù)據(jù)的不同拷貝應能在不同服務(wù)器操作系統(tǒng)所帶來的存儲共享和并行存儲時的I/0訪問沖一致性等技術(shù),來保證數(shù)據(jù)之間的連貫性和一致性。2)異構(gòu)適應性虛擬存儲的另一個主要目標是實現(xiàn)真正意義上的設(shè)備互操作性,簡化在在由不同主機操作系統(tǒng)和不同設(shè)備類型組成的異構(gòu)存儲環(huán)境中的系統(tǒng)管理和用戶操作,實現(xiàn)真正意義上的存儲設(shè)備3)系統(tǒng)存儲空間的動態(tài)擴展浙江大學碩士學位論文第1章緒論4開放系統(tǒng)的計算機模型經(jīng)歷了一個從單一的、大而全的結(jié)構(gòu)過渡到“n-層、分布式的或并行”的結(jié)構(gòu)。每一層都可以獨立擴資源,而對邏輯層和應用層透明。因此,系統(tǒng)管理員可以以兆字節(jié)為單位來擴充存儲容量,而不破壞重要的應用。按需存儲將是4)數(shù)據(jù)存儲與容錯策略由于應用和數(shù)據(jù)服務(wù)是透明的,必須避免越權(quán)訪問和惡意攻擊,數(shù)據(jù)安全性由整個系統(tǒng)的管理軟件來保證,因此保證數(shù)據(jù)安全性是存儲虛擬化技術(shù)的難點之一。虛擬存儲也必須以較小的容錯開銷建立容錯功能,克服系統(tǒng)單點故障,避免不可恢復的數(shù)據(jù)損失,同時也必須擁有數(shù)據(jù)容錯備份系統(tǒng),以保證因不可抗力而1.2虛擬存儲的意義和價值數(shù)據(jù)存儲設(shè)備用戶基本上都是從性能、可用性、價格和易于管理幾個方面評測存儲設(shè)備。虛擬存儲在這四個方面都能有效地I/0性能:數(shù)據(jù)訪問和傳輸速度越來越多地決定了計算機應用的質(zhì)量。比如說,如果數(shù)據(jù)不能夠按照視頻媒體播放器的要求速度傳遞到客戶端,那么視頻點播系統(tǒng)就不可能實現(xiàn);如果信用卡數(shù)據(jù)庫信息不能夠及時更新,那么整個金融服務(wù)體系將會陷入5混亂。虛擬技術(shù)可以通過“Stripe”實現(xiàn)數(shù)據(jù)地址在多個存儲設(shè)備上帶狀分布和拆分實現(xiàn)并行的讀寫,最終達到整個存儲系統(tǒng)面向應用的整體I/0性能的提高??捎眯裕盒畔⒒纳鐣絹碓揭笮畔⑾到y(tǒng)能夠在7*24的條件下保持在線狀態(tài)。系統(tǒng)故障引起的應用服務(wù)的不順暢給企業(yè)和個人帶來的損失和不便將越來越不能容忍,尤其是在重要的部門和行業(yè),如能源、交通、公共安全、金融等,數(shù)據(jù)的價值已經(jīng)不能夠估量。他們對存儲系統(tǒng)得可用性的要求比以往更高。虛擬技術(shù)可以通過鏡像技術(shù)實現(xiàn)對單一數(shù)據(jù)在多個存儲介質(zhì)上創(chuàng)建副本防止因個別存儲介質(zhì)的損壞對整個系統(tǒng)得影響,確保系統(tǒng)的存儲容量成本:隨著磁盤存儲設(shè)備的價格降低,在各個領(lǐng)域存儲系統(tǒng)的消費不斷增加。但是由于對數(shù)據(jù)安全的要求的不斷提高,鏡像和遠程數(shù)據(jù)復制遷移形式的虛擬存儲應用增加更為迅速。從而存儲容量成本依舊是一個重要的衡量因素。虛擬技術(shù)可以通過聚合多個存儲設(shè)備的空間和根據(jù)不同服務(wù)器需要重新部署存儲空間的分配實現(xiàn)現(xiàn)有存儲空間的高利用率,避免不必要的可管理性:目前的普遍的信息技術(shù)應用都存在著隨著系統(tǒng)復雜度的增加系統(tǒng)管理開銷遞增,以及由于系統(tǒng)管理原因造成的錯誤率的遞增。一般來講,管理成本已經(jīng)達到了設(shè)備成本的5到106一體化的管理是最為理想的管理模式。虛擬技術(shù)可以將多個小設(shè)備整合成一個大設(shè)備,來降低直接被管理的設(shè)備數(shù)量。由此,提虛擬存儲除了在以上四個作為存儲系統(tǒng)基本的評估指標發(fā)揮積極作用外,在現(xiàn)實應用中,通過虛擬技術(shù)在如下十個方面體1.提高存儲空間利用率(Improvedutilization):虛擬化存儲可以提高40%至50%的空間利用率,尤其是在為遠端設(shè)置鏡像存儲時更加體現(xiàn)優(yōu)勢。2.災難恢復(DisasterRecovery):在沒有虛擬存儲前,數(shù)據(jù)復制遷移只能在對稱的磁盤陣列或主機間進行。通過虛擬技術(shù),復制遷移和鏡像可以在不對稱的設(shè)備間部署,不必要在容災恢復端準備一個與主站同樣的主機或者磁盤陣列。3.快速備份(Rapidbackup):通過文件系統(tǒng)的快照技術(shù),虛擬存儲系統(tǒng)可以避免由于在應用服務(wù)器代理軟件和備份服務(wù)器的通訊產(chǎn)生的瓶頸。由于備份將給予快照,備份窗口可以任意4.數(shù)據(jù)移植(Datamigration):大部分的磁盤廠商都提供了特有的工具幫助在其自有平臺的磁盤間移植數(shù)據(jù)。虛擬存儲可浙江大學碩士學位論文第1章緒論75.自動化的空間擴充(Scalability):在綜合的虛擬化系6.在線基于磁盤的恢復(On-LineDiskRecovery):基于7.服務(wù)應用程序測試(ApplicationTesting):通過虛擬存8.提高數(shù)據(jù)庫性能(Highdatabaseperformance):虛擬系統(tǒng)將數(shù)據(jù)庫的hotfiles動態(tài)地置于某個solid-state磁盤上可9.高可用性(HighAvailability):虛擬系統(tǒng)將IT系統(tǒng)的10.在不同服務(wù)器平臺間的有效資源共享(StorageShare81.3論文研究內(nèi)容和意義課題主在研究基于SCST(SCSItargetmid-levelsubsystem卡構(gòu)筑的存儲網(wǎng)絡(luò)以及存儲的虛擬化管理。將不同廠商的統(tǒng)一管理、監(jiān)控和使用的公用存儲池。基于SCSTtarget驅(qū)動,存儲服務(wù)器不僅能夠?qū)崿F(xiàn)對客戶端系統(tǒng)的數(shù)據(jù)保護、文件的共享服務(wù)、存儲的可擴展性也能實現(xiàn)對客戶端各種平臺操作系統(tǒng)的保護,在客戶端磁盤故障或其他硬件故障造成服務(wù)中斷時,在最短的時間內(nèi)恢復應用,恢復數(shù)據(jù)。同時,存儲管理端結(jié)合各種raid技術(shù)以及snapshot,cdp技術(shù)保證數(shù)據(jù)的安全性和可靠性,實現(xiàn)數(shù)據(jù)的連續(xù)實時數(shù)據(jù)保護,避免關(guān)鍵業(yè)務(wù)數(shù)據(jù)的丟失,為企業(yè)挽目前存儲市場上基于windows平臺的存儲解決方案已經(jīng)有很多,無疑這些解決方案都存在windows平臺依賴而導致的安全性還是在系統(tǒng)穩(wěn)定性上都有著絕對的優(yōu)勢。再者,Linux系統(tǒng)下有很多成熟的開源軟件,例如邏輯卷管理器LVM,RAID管理程序件,不僅可以大大的縮短開發(fā)周期和開發(fā)費用,還可以提高程序浙江大學碩士學位論文第1章緒論9存儲管理器提供存儲,實現(xiàn)了光纖網(wǎng)絡(luò)的存儲分配和管理服務(wù)。1.4本章小結(jié)本章主要講述了當今虛擬存儲的技術(shù)現(xiàn)狀及其現(xiàn)實意義以第2章SCSI技術(shù)Interface)就是試圖為計算機的外圍設(shè)備建立一個標準的接口SCSI技術(shù)起源于1979年設(shè)備制造商Shugart試圖為磁盤控8位的數(shù)據(jù)和控制命令傳輸。計算機以前通常通過控制線來控制來控制磁盤,而SCSI采用標準命令集來控制磁盤。自從1981年Shugart和NCR向ANSIX3T9.2提交設(shè)計規(guī)范后,該技術(shù)就定名為SCSI,并與1986年成為ANSI的標準X3.121-1986,也就是簡條SCSI總線上可有多個主伺配器等,現(xiàn)在的SCSI技術(shù)已演化為浙江大學碩士學位論文第2章SCSI技術(shù)是21世紀的新I/0技術(shù)。正是這些特點使得SCSI技術(shù)在I/0技術(shù)和存儲技術(shù)的市場2.1SCSI協(xié)議框架ANSI批準。整個SCSI協(xié)議框架如圖2.1所示:(年5,585A1.碼(AD1.4,]ukpbox(SA5.ChanbelProtocol2,FCP-)(S8P-2.光纖通道協(xié)議FCP,IP網(wǎng)絡(luò)SCSI協(xié)議ISCSI等),設(shè)備互聯(lián)標準2.2SCSI發(fā)展現(xiàn)狀目前市場上有著多種多樣的SCSI的系列和產(chǎn)品,各個系列和產(chǎn)品間可能存在數(shù)據(jù)交換速率、電信號、總線寬度等的不同。這些不同特性在滿足用戶各種需求的同時,也使用戶在開始時難以選擇合適的產(chǎn)品。在此,通過對SCSI發(fā)展過程和現(xiàn)狀的介紹,最初的SCSI支持8位總線寬和5MB/s的總線速率。總線寬度是SCSI的一個重要指標,8位總線寬指的是SCSI使用8根總線一起作為其數(shù)據(jù)總線。在其后發(fā)展的SCSI-2提供了跟多的命令和更高的數(shù)據(jù)交換速率,以及16位的數(shù)據(jù)總線和多種命令集。在其基礎(chǔ)上,又有多個方面的發(fā)展個提高,退出了SCSI-3以提和完善。最新的SCSI是第四代SCSI-3--ultra320和正在定義的第五代SCSI-3-ultra640,ultra320定義了320MB/s的總線從下表可見,SCSI的速率逐漸提高,而且總線也盡量向16著SCSI的發(fā)展有所增加。表2.1SCSI總線參數(shù)一覽表SCSI名稱協(xié)議標準數(shù)據(jù)總線信號最大總線長度速率(兆字節(jié)/寬度設(shè)備數(shù)普通SCSI8865寬SCSI6快SCSI3快寬SCSI38825/1.5寬寬88ULTRA2寬備注:SCSI的三種電信號方式為SE(single2.3SCSI系統(tǒng)與設(shè)備域。一個SCSI域的結(jié)構(gòu)化模型是由一些SCSI設(shè)備組成的,這些設(shè)備都和抽象服務(wù)分發(fā)子系統(tǒng)連接,圖2.2展示了完整的SCSI-3域SCSI設(shè)備服務(wù)分發(fā)子系統(tǒng)目標器啟動器服務(wù)分發(fā)接口連接子系統(tǒng)任務(wù)管理器LUN應用客戶設(shè)備服務(wù)器任務(wù)集(隊列)圖2.2SCSI對象層次2.3.2SCSI域送SCSI命令和任務(wù)管理請求的SCSI端口定義為SCSI發(fā)起端;在功能上接收和處理SCSI命令和任務(wù)管理的端口為SCSI目標上面的所有SCSI設(shè)備,使得主機免于處理一些I/0任務(wù)。如圖2.3將一個實際SCSI應用系統(tǒng)抽象為一個SCSI域,域中有多個SCSI設(shè)備。而且,帶SCSI驅(qū)動器的計算機也看成是一個SCSI設(shè)備。盡管可以允許多個SCSI設(shè)備在同一總線上,SCSI協(xié)議實際定義的是設(shè)備間的一對一的數(shù)據(jù)交換,同一時刻在SCSI總線上只允許兩個設(shè)備見的數(shù)據(jù)交換。這兩個設(shè)備,一個是含有發(fā)起端的設(shè)備,另一個則擁有目標端的設(shè)備。某一具體存儲設(shè)備可以有發(fā)起端、目標端,或兼有發(fā)起端和目標端。如果某一SCSI設(shè)備上兼有發(fā)起端和目標端,基于總線分時使用的原則沒在某一特定參照SCSI域的定義,在一個具體的SCSI域中,必須有至少下主機配置了SCSI控制器,其中至少有一個SCSI發(fā)起端。而磁盤設(shè)備等則主要是依據(jù)需要提供存儲和數(shù)據(jù)服務(wù),一般有目標端。SCSI發(fā)起端和目標端的定義是依據(jù)SCSI的命令和任務(wù)而言對存儲用戶則是對應數(shù)據(jù)的磁盤寫或讀操作等。0(發(fā)起端)SCSI設(shè)備磁帶設(shè)備2SCSI設(shè)備2(目標端)計算機磁盤1SCSI總線圖2.3SCSI應用系統(tǒng)與SCSI域2.3.3主機總線適配器主機總線適配器(HostBusAdapter,HBA)是用來連接計路板(HBA卡),大多數(shù)PC系統(tǒng)都是這么做的。它也可以繼承到一臺計算機可以有幾個主機適配器,它們可以把幾條SCSI線是獨立的SCSI域。因而,可以在不同的SCSI總線上使用相同域的計算機如圖2.4所示.磁盤1磁盤1主機流設(shè)備流設(shè)備流設(shè)備磁盤2圖2.4多個SCSI域的計算機2.3.4SCSI設(shè)備控制器在每個SCSI設(shè)備內(nèi),都有一個以上的SCSI設(shè)備控制器,其功能如同網(wǎng)絡(luò)設(shè)備中的網(wǎng)卡。它實現(xiàn)SCSI存儲設(shè)備與其他設(shè)備以及計算設(shè)備的具體通信。在邏輯上,每個SCSI設(shè)備控制卡有一個任務(wù)管理單元和一個以上的邏輯單元(LU)。如圖所示,有多個邏輯單元。任務(wù)管理單元對來自SCSI發(fā)起端(如計算設(shè)備)的各種任務(wù)管理請求進行管理和處理,并通知和答復發(fā)起端設(shè)邏輯單元圖2.5SCSI設(shè)備控制器的組成在一個簡單的SCSI事務(wù)處理中,啟動器為取得總線的控制權(quán)而進行仲裁。一旦它獲得了對總線的控制權(quán),它就選擇一個目為即將到來的事務(wù)處理建立程序規(guī)則。斷開連接的優(yōu)先權(quán)、數(shù)據(jù)傳輸寬度、和同步傳輸?shù)臅r序都通過消息來協(xié)商。當協(xié)商完成以后,啟動器就給啟動器發(fā)送一個狀態(tài)碼指示結(jié)果。在總線被釋放之前,還可以進行一些其他消息發(fā)送。這個過程按照一定的順序發(fā)生,從一個階段到另一個階段。雖然由啟動器發(fā)起這個過程,但是當前總現(xiàn)階段卻是由目標器來控制的。啟動器可以要求把當前階段改變到一個特殊的階段,但是最終是由目標器決定從一個階段改變到另外一個階段。SCSI協(xié)議定義了8個不同的階段:選擇階段重新選擇階段命令階段數(shù)據(jù)階段狀態(tài)階段消息階段這些階段不一定按照以上列出的順序發(fā)生。消息階段幾乎可以在任何時候發(fā)生。是否支持重新選擇取決于目標器設(shè)備是否有斷開連接的權(quán)力。數(shù)據(jù)階段僅僅應用與傳輸數(shù)據(jù)的操作。這些階段中的每一個都被SCSI總線上的不同信號的結(jié)合和所交換的明確的數(shù)據(jù)類型標識出來。在SCSI總線上的6個信號決定了它處于哪一個階段,以及傳輸?shù)臄?shù)據(jù)的類型和方向。這些BSY(忙)表示總線正在使用的信號SEL(選擇)表示選擇一個目標器或者重選一個啟動器的信號C/D(控制/數(shù)據(jù))表示控制或數(shù)據(jù)信息的信號I/0(輸入/輸出)表示數(shù)據(jù)相對于啟動器的傳輸方向的信號MSG(消息)表示消息階段的信號ATN(注意)表示啟動器用來請求消息階段的信號總線空閑階段在總線空閑階段,總線上沒有活動。沒有I/0進程處于等待狀態(tài),沒有設(shè)備提出使用總線的要求,總線隨時可以被占用。上面列出的信號沒有一個是活動的。仲裁階段在仲裁階段,啟動器為取得總線的控制權(quán)進行協(xié)商。它聲明一盒BSY信號,表示總線正在被使用,并驅(qū)動對應于它的SCSIID的數(shù)據(jù)線。對一個8位的數(shù)據(jù)總線來說,數(shù)據(jù)線的編號是從DB (0)到DB(7)。一個ID號為7的啟動器聲明DB(7)為真,以此提出使用總線的要求。在一個規(guī)定的時間延遲后,啟動器檢查是否有另外一個設(shè)備正在試圖獲得總線控制權(quán)。如果和另外一個設(shè)備ID對應的數(shù)據(jù)線被聲明為真,俺么這個設(shè)備就也在試圖獲取總線的控制權(quán)。最一般來說,SCSI主機適配器被分配給較高的ID號,以保證它們在仲裁中獲得許可。一旦仲裁器獲得總線的控制權(quán),它就聲明SEL信號來結(jié)束仲裁階段,并進入選擇階段。選擇階段在BSY信號仍然為真的時候,聲明SEL信號就使啟動器選擇了一個目標器。然后它就聲明對應于它自己的SCSIID的數(shù)據(jù)線和對應于它選擇的目標器的SCSIID的數(shù)據(jù)線。這里的I/0信號在選擇階段之后。這一步在SCSI-1下是可選的,但是在SCSI-2對一個目標起來說,當SEL信號和它的ID位都為真,并且在SCSI-2中,在設(shè)備選擇階段之后必須跟隨消息輸出階段。在初始的消息輸出階段,只是一小部分消息是有效的。在正常的情況下,啟動器將會發(fā)送一條Identify消息。這條消息在啟動器和目標器設(shè)備內(nèi)的邏輯單元之間建立起了連接。這個連接被稱為ITL連接。對于支持目標器例行程序而不是邏輯單元的設(shè)備,可以建立一個ITR連接。對目標器例行程序的支持,雖然是在SCSI-2中提出的,但是在SCSI-3中被逐步淘汰了。在Identify消息之后可能跟隨著其他的消息。對標簽隊列的請求和同步傳輸或?qū)挃?shù)據(jù)傳輸也在這里發(fā)生。命令階段信號的電平,使I/0信號和MSG信號反相,以此來表明進入了命令階段。這就通知了啟動器:目標器已經(jīng)為接收一個CDB(命令描述塊)做好了準備。CDB的大小隨著其所屬的命令組而不同。命令組號告訴目標器在CDB中有多少個字節(jié)。一旦它收到了整個命令塊,可能會發(fā)生一下幾種情況:如果CDB的大小或格式有錯誤,目標器將切換到消息階段來報告錯誤。如果命令要求數(shù)據(jù)傳輸,目標器就切換到數(shù)據(jù)輸出或數(shù)據(jù)輸入階段,這取決與所發(fā)出的命令。如果不要求數(shù)據(jù)傳輸,目標器就切換到狀態(tài)階段,并且給啟動器發(fā)送一個狀態(tài)字節(jié)來報告命令的輸出。數(shù)據(jù)輸入和數(shù)據(jù)輸出如果一條SCSI命令要求數(shù)據(jù)傳輸,而且參與數(shù)據(jù)傳輸?shù)哪繕似饕呀?jīng)為數(shù)據(jù)接收或者發(fā)送做好準備,目標器就將總線設(shè)置為數(shù)據(jù)輸出或數(shù)據(jù)輸入狀態(tài)。在簡單的情況下,在命令階段和數(shù)據(jù)階段中啟動器和目標器保持連接。在較為復雜的情況下,目標器可以和啟動器斷開,當輸出準備好之后在和啟動器重新連接。這要求啟動器在選擇階段后發(fā)送給目標器的Identify消息中已經(jīng)例如,磁盤驅(qū)動器在尋道和讀取指定扇區(qū)的時候就可以斷開連接。這就使得當目標器被占用的時候,啟動器可以被釋放出來它根據(jù)相對于啟動器而言的數(shù)據(jù)傳輸方向來提高或降低I/0信號握手的方式來協(xié)調(diào)它們之間的數(shù)據(jù)傳輸。如果它們之間協(xié)調(diào)同步傳輸,在數(shù)據(jù)字節(jié)和能夠被預定發(fā)送的REQ脈沖序號之間的時序狀態(tài)階段在命令和任何相關(guān)數(shù)據(jù)的傳輸完成后,目標器就切換到狀態(tài)階段。它聲明C/D和I/0信號為真,并把MSG信號反相。狀態(tài)階段之后命令就結(jié)束了,除非命令是非正常終止的。一條消息會引起進程異常終止,意外的設(shè)備復位或斷開連接,或者總線復位都會引起命令的非正常終止。狀態(tài)碼只有一個字節(jié),表示命令執(zhí)行的成功或失敗。它可能會指出目標器忙或者目標器被一個啟動器保留,也可能指出一系列命令的中間某一條命令執(zhí)行成功,它也可以告訴啟動器哪些被稱為檢測數(shù)據(jù)的擴展信息是可以利用的。消息輸入階段消息輸入階段是SCSI事務(wù)處理的最后一個階段。目標器聲明C/D和MSG信號為真,從而進入了消息階段,并且聲明I/0信號為真表示消息對于啟動器來說是輸入的。經(jīng)常,目標器將發(fā)送一條CommandComplete消息來表示命令處理已經(jīng)結(jié)束了,而且已經(jīng)發(fā)送了一個狀態(tài)字節(jié)。它也可以發(fā)送消息表是錯誤狀態(tài)或者在命令處理的過程中,在它從總線上斷開連接之前給啟動器發(fā)出警告。階段序列從一個階段轉(zhuǎn)移到另外一個階段是被嚴格定義的,而且是復雜的。實際上,一旦啟動其選擇了一個目標器,階段序列可以按照一定的路徑進行.圖2.6說明了在階段之間可能的狀態(tài)轉(zhuǎn)換。消息輸出仲裁總線空閑數(shù)據(jù)輸入或仲裁總線空閑接受消息圖2.6SCSI狀態(tài)轉(zhuǎn)換2.5SCSI傳輸層協(xié)議由于本課題主要內(nèi)容基于SCSI傳輸層,因此著重對SCSI傳算機上有某一文件需要寫到SCSI磁盤上或從SCSI磁帶上讀取某文件時,都是發(fā)起端和目標端設(shè)備在互聯(lián)層已建立的基礎(chǔ)上,通過傳輸層協(xié)調(diào)實現(xiàn)的。傳輸層提供了兩類服務(wù):命令的執(zhí)行和確認;數(shù)據(jù)的傳輸。命令的執(zhí)行是總線進入命令階段后,由發(fā)起端通過命令描述塊(CommandDescriptionBlock,CDB)向目標端發(fā)傳輸則是建立在數(shù)據(jù)階段(數(shù)據(jù)出或數(shù)據(jù)入)上的。依賴于這兩2.5.1命令描述塊對存儲設(shè)備的實際操作是通過對目標端發(fā)送一個命令描述不同的規(guī)定長度,如6字節(jié)或10字節(jié)的命令描述塊。無論哪種 (OPCODE),邏輯單元號(LUN),邏輯區(qū)地址(LBA),傳遞數(shù)據(jù)圖2.7給出了一個典型的6字節(jié)的CDB的格式。圖中,每一6個字節(jié)組成。其中,字節(jié)“O”為操作碼字節(jié)。5432101保留位(最高位)2邏輯區(qū)地址(如需要)3(最低位)4傳遞數(shù)據(jù)長度(如有)參數(shù)表長度(如有)分配長度(如有)(最低位)5控制字節(jié)圖2.7六字節(jié)命令描述塊1.操作碼操作碼定義CDB的具體操作。這8位在理論上共有256個可的8個位又分為兩個區(qū):位5~7為分組碼,指示其后的命令具體屬于哪個分組,如“000”為分組“0”,為6字節(jié)CDB命令組;為0~4則是具體的命令碼。例如比較常見的6字節(jié)讀指令read(6)操作碼為08H,6字節(jié)寫指令write(6)操作碼為0AH。代表命令組的高3為可以有8個不同的組合,所以可以代表8個命組操作碼說明06字節(jié)命令110字節(jié)命令210字節(jié)命令3保留416字節(jié)命令512字節(jié)命令6廠商自定7廠商自定2.邏輯區(qū)地址該地址是邏輯單元或磁盤分區(qū)中的起始操作塊的位置。在6字節(jié)CDB中,有21為的邏輯地址區(qū),其他格式的CDB有更大的邏輯地址區(qū),以尋址和訪問更大的存儲空間。3.傳遞數(shù)據(jù)長度且長度范圍為1~255個塊。該參數(shù)可以為零,但對不同的CDB格4.參數(shù)表長度該長度定義了在CDB之后(數(shù)據(jù)階段)發(fā)送的參數(shù)的長度。它是以字節(jié)為單位的。對于需要在CDB之后發(fā)送的一些參數(shù),如5.分配長度6.控制字節(jié)僅包含了在標準中定義的兩位,它們是連接位(Linkb個連接的I/0過程。這就可以組織其他I/0過程的命令插入這個浙江大學碩士學位論文第2章SCSI技術(shù)contingentallegiance)的所寫,它是在命令執(zhí)行過程中萬一2.5.2邏輯單元邏輯單元是SCSI設(shè)備的組成部分。可以認為是一個虛擬的、備上可以有多個邏輯單元,所以LU適當擴展了SCSI總線對可訪問設(shè)備數(shù)目的限制,使得目標端設(shè)備上可以有多個可被訪問的設(shè)邏輯單元的一個特定的編號,即邏輯單元號實現(xiàn)的。如圖2.8所示,一個邏輯單元包括:一個邏輯單元號(LogicUnitNumber,LUN),一個以上的邏輯單元名,一個設(shè)備服務(wù)器,一個任務(wù)管理器以及一個以上的任務(wù)集。其中,任務(wù)管理器負責個SCSI傳輸協(xié)議,則它需要多個設(shè)備名。在目標端的每個邏輯設(shè)備服務(wù)器圖2.8邏輯單元組成不同于SCSIID,邏輯單元的地址范圍是不依賴于SCSI總線的范圍,比如在SCSI-2中,一個SCSIID的設(shè)備可以有8個邏輯單元,其編號是0~7.邏輯單元的尋址方式有四種,其方式的定義由尋址數(shù)據(jù)的第7和第6為決定。如下表所示:表2.3邏輯單元尋址數(shù)據(jù)位字艾76543210尋址方式N這四種LU尋址方式為:邏輯單元尋址(logicunitaddressing),外圍設(shè)備尋址(peripheraldeviceaddressing),表2.4LUN的四種尋址方式二進制數(shù)功能外圍設(shè)備尋址平地址范圍尋址邏輯單元尋址擴展邏輯單元尋址在LUN中,LUNO是一個所有SCSI設(shè)備必須接受的地址。應用程序可通過對LUN0的訪問獲取關(guān)于SCSI目標端設(shè)備以及其2.6總體描述2.6.1數(shù)據(jù)讀將用戶的讀取操作通過SCSII/0的應用程序編程接口 讀操作,并在操作完成后通過相應的API返回相應的值。發(fā)起端應用客戶①②等待活動任務(wù)工作④③時間時間圖2.9SCSI數(shù)據(jù)讀操作在SCSI域內(nèi),這個操作在傳輸層簡單地描述為5個主要過程,如圖2.9所示。1)發(fā)起端通過CDB發(fā)送SCSI的讀(READ)命2)目標端接收到該請求,制定的邏輯單元(LU)中設(shè)備管理3)目標端以字節(jié)為單位向發(fā)送端傳遞數(shù)據(jù)。并非所有SCSI命4)在數(shù)據(jù)傳輸完畢后,目標端向發(fā)起端發(fā)送任務(wù)完成。5)發(fā)起端接收到完成的命令。當然這些過程是建立在SCSI的互聯(lián)層基礎(chǔ)上的。其中,在第一個過程之前,包括SCSI總線由空置階段進入總線仲裁和選址。之后,目標端空置操作(如讀操作)進入第一個過程。2.6.2數(shù)據(jù)和文件的寫操作體的SCSI的各個階段,并需要各個SCSI信號以及SCSI命令,如寫(WRITE)命令等。它基本上與上面的讀操作類似。另外,在此將從另一個角度描述寫操作過程。不同于簡單的數(shù)據(jù)讀或存儲設(shè)備(如磁盤)的邏輯塊地址(LogicBlockAddress,LBA);LUNO,并將數(shù)據(jù)以存儲設(shè)備認可的方式分批或一次性地傳遞到2.7本章小結(jié)本章主要講述了SCSI技術(shù)架構(gòu),主要部分為SCSI傳輸層協(xié)第3章LinuxSCSI子系統(tǒng)與SCST中間層3.1LinuxSCSI子系統(tǒng)驅(qū)動框架高層和較低層的一些公共服務(wù)。最后是較低層(LLD),代表的是適用于SCSI的物理接口的實際驅(qū)動器.3.1.1SCSI較高層SCSI子系統(tǒng)的較高層代表的是內(nèi)核(設(shè)備級)最高級別的接 (比如VFS)的請求并將其轉(zhuǎn)換成SCSI請求。較高層負責完成SCSI命令并將狀態(tài)信息通知上層。SCSI磁盤驅(qū)動器在./linux/drivers/scsi/sd.c內(nèi)實現(xiàn)。SCSI磁盤驅(qū)動器通過調(diào)用registerblkdev(作為塊驅(qū)動器)進行自初始化并通過scsi_register_driver提供一組函數(shù)以表示所有SCSI設(shè)備。其中sdprobe和sdinitcommand這兩個函數(shù)用sdprobe函數(shù)。sdprobe函數(shù)可決定此設(shè)備是否由SCSI磁盤驅(qū)動器管理,如果是,就創(chuàng)建新的scsidisk結(jié)構(gòu)來表示它。sd_init_command函數(shù)將來自文件系統(tǒng)層的請求轉(zhuǎn)變成SCSI讀或SCSI磁帶驅(qū)動器在./linux/drivers/scsi/st.c內(nèi)實現(xiàn)。磁帶驅(qū)動器是順序存取設(shè)備,會通過registerchrdevregion數(shù),稱為stprobe。該函數(shù)會創(chuàng)建一種新磁帶設(shè)備并將其添加到稱為scsitapes的向量。SCSI磁帶驅(qū)動器的獨特之處在于,如果可能,它可以直接從用戶空間執(zhí)行I/0傳輸。否則,數(shù)據(jù)會通似的函數(shù)集。srprobe函數(shù)可用來創(chuàng)建scsisd結(jié)構(gòu)以表示SCSIgeneric驅(qū)動器在./linux/drivers/scsi/sg.c內(nèi)實現(xiàn)。該驅(qū)動器允許用戶應用程序向設(shè)備發(fā)送SCSI命令(比如格式化、模式感知或診斷命令)。通過sg3utils包還可以從用戶空3.1.2SCSI中間層SCSI中間層是SCSI較高層和較低層的公共服務(wù)層(可以間的連接層。中間層很重要,原因是它抽象化了較低層驅(qū)動器 (LLD)的實現(xiàn),可以在./linux/drivers/scsi/hosts.c中部分地實現(xiàn)。這意味著可以以同樣的方式使用帶不同接口的Fibre還提供了較高層和較低層間的SCSI命令排隊。SCSI中間層的一個重要功能是將來自較高層的命令請求轉(zhuǎn)換成SCSI請求。它也負責管理特定于SCSI的錯誤恢復。中間層可以連接SCSI子系統(tǒng)的較高層和較低層。它接受對 (如./linux/drivers/scsi/scsilib.c中所示)。當這些命令完成后,它接受來自LLD的SCSI響應并通知較較高層此請求已中間層最重要的職責之一是錯誤和超時處理。如果SCSI命令沒有在合理的時間內(nèi)完成或者SCSI請求返回錯誤,中間層就會管理錯誤或重新發(fā)送此請求。中間層還可管理較高層恢復,比3.1.3SCSI較低層在最低層的是一組驅(qū)動器,稱為SCSI低層驅(qū)動器。它們是一些可與物理設(shè)備(比如HBA)鏈接的特定驅(qū)動器。LLD提供了了到特定底層硬件的接口,但所使用的到中間層的接口卻是一組適配器類型。例如,F(xiàn)ibreChannel協(xié)議包含了針對Emulex和3.2重要數(shù)據(jù)結(jié)構(gòu)每一個scsidevice都是對scsi總線上的lun的抽象,用 求隊列*/unsignedintdevicebusy;/*命令執(zhí)行標記.*/structscsicmndcurrentcmnd;/當前執(zhí)行的命令*/浙江大學碩士學位論文第3章LinuxSCSI子系統(tǒng)與SCST中間層intid,lun,channel;/*SCSI設(shè)備的標識*/intmanufacturer;/*設(shè)備供應商標識符hostdata;/通常指向low-leveldriver定義的scsi3.2.2scsihost的抽象數(shù)據(jù)結(jié)構(gòu)ScsiHost描述的是一個總線控制器,物理上,它代表PCI插槽上的HBA卡。也就是說,如果PCI總線上有兩塊每個scsihost可以存在多個channel,一個channel實際擴展了一條SCSI總線。每個channel可以連接多個scsi節(jié)點,具體連接的數(shù)量與scsi總線帶載能力有關(guān)。scsihost的重要域描述structscsi_host_tempunsignedinthostbusy;/*scsihost忙標記*/unsignedintmaxid;/*最大的scsinode數(shù)量*/intmaxlun;/*最大的lun數(shù)量*/intmaxchannel;/*最大的channel數(shù)量*/charmaxcmdlen;/*scsi命令的長度*/intcanqueue;/*scsicmd是否可以queue在host標記table大小*/3.2.3scsitarget的抽象scsitarget對scsi總線上的scsinode進行了抽象。每個scsitarget可能擁有多個lun,即多個scsidevie。scsitargetdevice鏈表*/channel號*/3.2.4Low-level驅(qū)動接口scsihost代表了每一塊物理上存在的HBA卡,而scsihosttemplate則代表了物理上每種HBA卡,也就是說,如同一個scsihosttemplate結(jié)構(gòu)調(diào)用scsihost的具體方法,卡,則它們使用不同的scsihosttemplate數(shù)據(jù)結(jié)構(gòu)。在scsihostdriver向middlelevel注冊host對象的同時需要注冊scsihosttemplate方法,該方法被注冊到scsihost對象中。提交給lowlevel層驅(qū)動,并且告訴lowlevel驅(qū)動完成后需要/*更改scsi設(shè)備的隊列深度*/unsignedshortsgtablesize;/*scatter-gathertableshortcmdperlun;/*每個lun能夠queue的命令數(shù)*/unsignedemulated:1;/*虛擬scsihostflag*/3.3關(guān)鍵函數(shù)分析scsimiddlelevel層提供了scsihost掃描函數(shù),在設(shè)備掃描,當然host驅(qū)動也可以調(diào)用更加底層的函數(shù)對scsi總線進開始開始循環(huán)掃描循環(huán)掃描通過INQUIRY命令將scsidevice信息添加到系統(tǒng)中,并且加載設(shè)備的驅(qū)動程序結(jié)束數(shù)通常被注冊到requestqueue->requestfn上。塊設(shè)備請求的bio最終會merge到requestqueue中,然后通過unplugfn函數(shù)調(diào)用requestqueue->requestfn,實現(xiàn)scs隊列中摘取一個request,然后通過q->preprqfn函數(shù)將請求浙江大學碩士學位論文第3章LinuxSCSI子系統(tǒng)與SCST中間層轉(zhuǎn)換成scsi命令,并且對scsicommand進行初始化,最后通過scsidispatchcmd函數(shù)將scsi命令分發(fā)給底層的scsihost驅(qū)在scsirequestfn函數(shù)的實現(xiàn)過程中,需要通過塊設(shè)備發(fā)下來的請求構(gòu)造相應的scsi命令,而scsi命令的生成與具體的設(shè)備驅(qū)動相關(guān),其需要調(diào)用設(shè)備驅(qū)動提供的scsi命令初始化函數(shù)*_initcommand完成命令初始化過程。假設(shè)請求發(fā)送給scsidisk設(shè)備,那么在各層之間的函數(shù)調(diào)用關(guān)系如下圖所示:圖3.3scsirequestfn函數(shù)調(diào)用從前面分析可以看出,請求隊列queue是較高層與中間層之間的紐帶。上層請求會在請求隊列中維護,處理函數(shù)的方法由上下各層提供。在請求隊列的處理過程中,將普通的塊設(shè)備請求轉(zhuǎn)換成標準的scsi命令,然后再通過中間層與較低層之間的接口將請求遞交給scsihostscsidispatchcmd函數(shù)將一個scsi命令提交給底層scsi如果所有條件都滿足,那么會調(diào)用上下層之間的接口函數(shù)Queuecomand函數(shù)的實現(xiàn)由scsihostdriver完成。通常該函數(shù)的實現(xiàn)很簡單,只需要將傳下來的scsi命令掛載到host的下文中運行,所以不宜做過多復雜的操作,否則很容易導致程序3.4scsi設(shè)備掃描過程在計算機系統(tǒng)啟動過程中,操作系統(tǒng)會掃描默認的PCI根節(jié)點,從而觸發(fā)了PCI設(shè)備掃描的過程,開始構(gòu)建PCI設(shè)備樹。scsihost作為PCI設(shè)備會被PCI總線驅(qū)動層掃描到(PCI設(shè)備的掃描采用配置信息讀取的方式),掃描到scsihost之后,bus。scsibus的掃描通過scsimiddlescsihostdriver可以調(diào)用scsimiddlelevel提供的掃描算法一個對象,注冊到scsimiddlelevel。息,得知scsi設(shè)備的vendorid、productid以及設(shè)備類型等并且向scsimiddlelevel注冊了scsi設(shè)備對象——scsi4、根據(jù)scsi設(shè)備的信息初始化scsidevice對象,并且通知內(nèi)核去加載該設(shè)備的驅(qū)動程序。如果被枚舉的設(shè)備為scsi5、循環(huán)(2)(3)(4)將scsi總線掃描完畢。結(jié)束scsihost在scsi總線掃描過程中用到了scs2、scsiadddevice:探測具體的device,并且將其加入3、scsi_probe_and_add_lun:探測具體指定的lun,并且將scsi_probe_and_add_lunscsi_sequential_lun_scscsi_probe_lunscsi_圖3.4SCSI總線掃描浙江大學碩士學位論文第3章LinuxSCSI子系統(tǒng)與SCST中間層3.5SCST中間層SCSItargetsubsystemforLinux(SCST)是Linux平臺下的SCSItarget中間層子系統(tǒng),它為SCSItarget驅(qū)動提供了3.5.1SCST框架SCSI中間層。下圖為SCST與SCSI中間層以及SCSItarget驅(qū)驅(qū)動疆圖3.5SCST子系統(tǒng)框架我們現(xiàn)在支持多種SCSITarget設(shè)備,如IP-SAN的iscsiLinux內(nèi)核大量采用鏈表結(jié)構(gòu)來組織數(shù)據(jù),為了更好的管理這些驅(qū)動模塊,SCST子系統(tǒng)中也采用鏈表來組織所有的Target驅(qū)動及驅(qū)動模板。Target驅(qū)動必須向SCST子系統(tǒng)注冊一個Target驅(qū)動模板,這是SCST層調(diào)用Target驅(qū)動處理例程的入口。每一個Target驅(qū)動模板均由一個scsttgttemplate結(jié)構(gòu)來表示。通過unsignedxmitresponseatomic:1;unsignedrdytoxferatomic:1;unsignedreportaenatomic:1;『sg_tablesize:是否允許使用聚散(scatter-gather)DMA方式,另一種傳輸方式為塊緩存(buffer)方式。若驅(qū)動不支持該配器最大限制為16.這種方式能夠提高系統(tǒng)的吞吐量。name:驅(qū)動模板名用物理內(nèi)存的低16MB空間,如果設(shè)置該位,上層驅(qū)動代碼將保輸方式,該位置0.對于基于ELSA總線的驅(qū)動來說,該位也置0使用固定I0塊大小的設(shè)備該位置0。int(*detect)(structscsttgttem指向驅(qū)動程序中探測系統(tǒng)中工作在target模式的HBA適配器函備的資源。釋放成功返回0,負值表示釋放不成功。該函數(shù)必須定義!須定義! status()獲取任務(wù)完成狀態(tài)信息。如果targetHBA適配器支持intlunlen)該函數(shù)用于異步事件通知(AsynchronousEventNotification).驅(qū)動程序負責通知所有initiatot端該異步事函數(shù)xmitresponse(),rdytoxfer(),都必須是非阻塞的。scsttgttemplate*vtt,constchar*targetname);該函數(shù)浙江大學碩士學位論文第3章LinuxSCSI子系統(tǒng)與SCST中間層將scst_tgt添加到相對應的驅(qū)動模板接口上,成功則返回指向成功分配的scsttgt數(shù)據(jù)結(jié)構(gòu)。該結(jié)構(gòu)主要字段定義如下:structlistheadsesslist;/*保存所有遠程會話的鏈表*//*保存同一個target驅(qū)動模板的驅(qū)動實例鏈表*/structscsttgttemplate*tgtt;/*所屬的target驅(qū)動模板*/void*tgtpriv;/*用來保存targetdriver的內(nèi)部數(shù)據(jù)*/結(jié)束的等待隊列*/intprocnum;/*proc文件系統(tǒng)里的設(shè)備號*/char*defaultgroupname;/*每個target均有一個默認的組*/相對應的驅(qū)動注銷及驅(qū)動模板注銷函數(shù)分別為voidscstunregistertargettemplate(struct3.5.3會話管理模塊1)SCSI客戶機/服務(wù)器模型SCSI啟動器與SCSI存儲目標端的通信我們通過會話來描述。所有SCSI啟動器發(fā)送到SCSI存儲目標端的命令,數(shù)據(jù)都會傳遞到SCST會話管理模塊。簡而言之,會話抽象了客戶端與存儲服在主機和存儲介質(zhì)進行通信期間,主機通常充當SCSI啟動程序。在計算機存儲中,SCSI啟動程序是啟動SCSI會話的端點,這意味著它會發(fā)送SCSI命令。存儲介質(zhì)通常充當SCSI目標,它接收和處理SCSI命令。SCSI目標等待啟動程序的命令,SCSI目標通常為啟動程序提供一個或多個邏輯單元號 邏輯單元是一個SCSI協(xié)議實體,實際的I/0操作只處理這種實體。每個SCSI目標可以提供一個或多個邏輯單元;它本身不執(zhí)行I/0,但代替特定的邏輯單元執(zhí)行。下圖顯示SCSI客戶機/服務(wù)器模型是如何工作的。浙江大學碩士學位論文第3章LinuxSCSI子系統(tǒng)與SCST中間層圖3.6SCSI客戶端/服務(wù)器模型SCST層采用數(shù)據(jù)結(jié)構(gòu)structscst_session對會話進行了抽象。結(jié)構(gòu)定義如下:intinit_phase;/*會話初始化狀態(tài)標志,0初始化過程中,1初始化完成,2失敗等*/structscst_tgt*tgt;/*會話對應的targetdevicestructsess_tgt_dev_list_hash[TGT_DEV_HASH_SIZE];/*targetdevice分配給initiator的磁盤哈希表*/atomic_trefcnt;/*引用計數(shù)器*/atomic_tsess_cmd_count;/*會話待處理的scsi命令structscstacg*acg;/*所屬的會話訪問安全控制組structlisthinitiator*/同一targetdevice的所有會話鏈表*/始化過程中接收到的SCSI命令*/unsignedlongshutphase;/*會話結(jié)束過程標志0已當targetdevice接收到新的initiator客戶端連接(TCP連接或光纖接入)時,便會調(diào)用scstregistersession函數(shù)創(chuàng)初始化過程,但target驅(qū)動已經(jīng)能夠通過scstrxcmd()函數(shù)的SCSI指令并在resultfn中調(diào)用scstunregistersession()函數(shù)注銷會話。對于保存在initdeferredcmdlist浙江大學碩士學位論文第3章LinuxSCSI子系統(tǒng)與SCST中間層圖3.7會話注冊過程當atomic參數(shù)為真時,會話注冊過程如下所示,注冊函數(shù)將會話加入到全局初始化會話鏈表scstsessinitlist,該鏈表由SCST的任務(wù)管理線程scstmgmtthread維護。延遲處理接收到的命令初始化成功則返回所有延遲話注冊過程session初始化線程圖3.8采用下半部機制的會話注冊過程顧名思義,安全組主要對所有連接到存儲服務(wù)器的SCSI啟浙江大學碩士學位論文第3章LinuxSCSI子系統(tǒng)與SCST中間層動器(客戶端)進行安全訪問控制,避免不同客戶端錯誤訪問服務(wù)器不同LUN所造成的數(shù)據(jù)丟失,同時,基于安全組,也可以實現(xiàn)共享存儲高級應用。屬于同一安全組的客戶端共享相同的存儲空間。每個session初始化時如果未分配安全組,會話則會被加進一個默認的安全組(Default)中。程序中我們也使用結(jié)構(gòu)體抽象一個ACG,每個ACG對象由屬于該安全組的存儲設(shè)備(acg_dev)以及會話對象(acg_sess)z組成,定義如下:structlist_headacg_sess_list;/*acg_sess鏈表*/structlist_headacn_list;/*ACN鏈表*/structlist_headscst_acg_list_entry;/*安全組鏈表constchar*acg_name;/*安全組名*/系統(tǒng)目錄指針*/SCSI啟動器客戶端與安全組關(guān)系如圖3.9所示,圖中,SCSI啟動器(客戶端主機)client1,client2通過IP-SAN或FC-SAN連接到OSN存儲服務(wù)器,并被分配到同一安全組ACG1,這兩客戶端共享磁盤Disk1,Disk2,在客戶端來看,只是看到本地磁盤掃3.5.4存儲設(shè)備管理模塊Target端存儲設(shè)備(lun)均由一個scstdevice數(shù)據(jù)結(jié)構(gòu)來表示,該結(jié)構(gòu)實際是SCSI子系統(tǒng)中sstructscstdevtype*handler;/*設(shè)備驅(qū)動例程*/unsignedshorttype;/*SCSI設(shè)備類型diskcdrometc.structscsi_device*scsi_dev;/*實際物理設(shè)備,虛擬磁指針*/structscst_cmd_listscmd_lists;/*線程處理時的scsi/*Howmanywriteatomic_twrite_cmd_count;/*寫命令計數(shù)*/intblock_count;/*阻塞SCSI命令計數(shù)*/intvirt_id;/*虛擬設(shè)備內(nèi)部ID號*/structlist_headdev_list_entry;/*全局設(shè)備鏈表*/一個設(shè)備可以同時分配給多個客戶端*/設(shè)備可以分屬不同的安全組*/另外,從客戶端來看,屬于該客戶端(session)的所有磁盤listhash鏈表維護,該鏈表的節(jié)點成員即客戶端看到的磁盤在SCST子系統(tǒng)中實際上是由scsttgtdev結(jié)構(gòu)表示。從安全組來看,屬于該安全組的所有磁盤由acgdevlist鏈表維護,該鏈表的節(jié)點成員即磁盤由scstacgdev結(jié)構(gòu)表示。scsttgtdev,scstacgdev結(jié)構(gòu)實際上都是scstdevice的繼3.6本章小結(jié)本章主要對Linux平臺下SCSI子系統(tǒng)及SCST中間層做了詳細剖析。通過本章的學習,作者對Linux平臺SCSI驅(qū)動編程框本論文Target驅(qū)動程序基于QlogicQLE2460光纖卡設(shè)計實現(xiàn)。QLE2460光纖卡支持4/2/1Gbps(4.2480/2.1240/1.0625Gbps)自調(diào)節(jié)數(shù)據(jù)傳輸速率光纖通道全雙工數(shù)據(jù)傳輸,支持底層驅(qū)動:該層驅(qū)動主要完成初始化ISP2432芯片、處理與Firmware通信,包括響應各種中斷、在queue上取出IOCB和發(fā)虛擬磁盤模塊:處理SCSI啟動器的I/0請求,讀寫數(shù)據(jù)4.1底層驅(qū)動設(shè)計一般的光纖卡驅(qū)動大都工作在Initiator模式,光纖卡供應商也沒有提供相應的光纖卡target工作模式的驅(qū)動代碼,因此請求隊列(requestqueue)和反饋隊列(responsequeue).請求隊initiator端loopID,固件的loopID,邏輯target上層驅(qū)動連接所需要的必要信息以及狀態(tài)或指向傳輸數(shù)據(jù)的指針。Target驅(qū)動與firmware之間的通信是通(requestqueue)和反饋隊列(responsequeue)完成的.如下圖所Command反饋隊列queue)4.1.1初始化ISP2432為2部分:1硬件初始化;2Firmware初始化對于硬件初始化,主要的工作是配置相應的PCI配置寄存而對于Firmware的初始化,需要如下主要步驟:是否加載成功(通過Checksummailbox命令)block,設(shè)置隊列指針)5.檢查Firmware狀態(tài),確定Firmware是否就緒4.1.2中斷處理qla2x00intrhandler,該函數(shù)首先查詢ISPSemaphore寄存器0位以判斷中斷類型,如果該位為1,則表示為mailbox中斷,轉(zhuǎn)為mailbox命令完成處理,如果該位為0則表示response隊浙江大學碩士學位論文第4章Target驅(qū)動程序設(shè)計實現(xiàn)圖4.2中斷處理例程4.1.3Response隊列處理函數(shù)#ifdefCONFIGSCSIQLA2XXXTARGETcaseNOTIFY_ACKcaseENABLE_LUN_TYPE:caseMODIFY_LUN_TYPE:void(*tg回調(diào)函數(shù)tgtresponsepkt為處理response隊列ATIO等類型IOCB的響應處理函數(shù),該函數(shù)根據(jù)I/0控制塊類型不同,處理收到的SCSI指令。當接收到ATIOType2類型的I/0控制塊時,該函數(shù)構(gòu)建atio數(shù)據(jù)結(jié)構(gòu)并將起傳遞給SCST子系統(tǒng)層,進tgtctiocompletion回調(diào)函數(shù)主要完成CTI0類型I/0控制塊的命令處理tgtasyncevent函數(shù)為異步事件處理函數(shù),該函數(shù)根據(jù)接收到的mailbox異步事件做響應的處理。tgthostaction函數(shù)提供了開啟,關(guān)閉光纖卡target模式通過sysfs調(diào)用該函數(shù)啟動光纖卡target工作模式.如果開啟動,進行初始化設(shè)置,然后調(diào)用enablelun()函數(shù)使能光纖卡該結(jié)構(gòu)定義了處于target工作模式的SCSI指令處理函數(shù)接response循環(huán)隊列消息標記到firmware塊4.2上層target驅(qū)動設(shè)計scst_register_target_template主要完成以下工作:1、檢查必須的回調(diào)函數(shù)是否存在,如detect,release,xmit_response函數(shù),并且創(chuàng)建proc文件系統(tǒng)目錄結(jié)構(gòu)2、將驅(qū)動模板實例tgt_template添加到全局驅(qū)動模板鏈表態(tài)應用程序通過sysfs文件系統(tǒng)調(diào)用enablelun函數(shù)開啟光纖4.2.2命令處理流程當?shù)讓域?qū)動收到firmware的中斷信號調(diào)用response隊列處中間層處理。整個命令處理過程實際上是從q2tsendcmdscst調(diào)用scstrxcmd()開始的,該函數(shù)從IOCB式的數(shù)據(jù)結(jié)構(gòu)scstcmd,q2tsendcmdscst函數(shù)繼續(xù)給函數(shù)通知SCST中間層命令初始化完畢,可以開始命令處理流程。備驅(qū)動,決定命令的數(shù)據(jù)流方向(讀操作還是寫操作),并且調(diào)用本地存儲設(shè)備驅(qū)動parse()函數(shù)分配

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論