<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

Linux SCSI 子系統剖析

——
作者:M. Tim Jones 時(shí)間:2008-01-15 來(lái)源:IBM DW中國 收藏

 

   Small Computer Systems Interface () 是一組標準集,它定義了與大量設備(主要是與存儲相關(guān)的設備)通信所需的接口和協(xié)議。 ® 提供了一種  ,用于與這些設備通信。 是分層架構的一個(gè)很好的例子,它將高層的驅動(dòng)器(比如磁盤(pán)驅動(dòng)器或光驅?zhuān)┻B接到物理接口,比如 Fibre Channel 或 Serial Attached (SAS)。本文向您介紹了  SCSI ,并且討論了這些將來(lái)的發(fā)展方向。 
  GNU/Linux 和 SCSI 是很好的一個(gè)組合,因為二者在各自的環(huán)境中具有類(lèi)似的特征。GNU/Linux 是一種安全可靠的操作系統,可以不間斷地運行。SCSI 適合于可靠和高性能存儲。二者都是開(kāi)源的。您可以下載和查閱 International Committee on Information Technology Standards (INCITS) T10 Technical Committee 的各種 SCSI 規范。同樣地,您也可以下載 GNU/Linux 源代碼以理解其實(shí)現。它們在各自的行業(yè)都具有主導性,所以相對其他操作系統而言,GNU/Linux 能更好地支持 SCSI,這一點(diǎn)就不足為奇了。  

    SCSI 的演化 

  SCSI 是一種很有趣的接口,它是早期的接口之一,如今還在不斷演化。第一種 SCSI 標準稱(chēng)為 SCSI-1,是由 Shugart Associates 在 1979 年前后創(chuàng )建的。SCSI-1 定義了一種具有 5MHz 數據時(shí)鐘的 8-bit 并行接口,能提供最高 5 兆字節每秒(5 MB/s)的數據傳輸速率。 

  SCSI-2 標準出現于 1985 年,它的出現使數據速率更快(10MHz),總線(xiàn)也更寬(16 位)。被稱(chēng)為 Fast/Wide 的 SCSI-2 允許的數據傳輸速率高達 20 MB/s,并具有與 SCSI-1 的向后兼容性,但是速率也會(huì )限制到 SCSI-1 的數據速率。 

  SCSI-3 的開(kāi)發(fā)開(kāi)始于 1993 年,現已成為了一組標準集,可以定義協(xié)議、命令集和信令方法。在 SCSI-3 中,包含一組命名為 Ultra 的并行 SCSI 標準和基于串行 SCSI 的協(xié)議,比如 IEEE 1394 (FireWire)、Fibre Channel, 、Internet SCSI (iSCSI) 和新興的 SAS。這些標準通過(guò)引入存儲網(wǎng)絡(luò )技術(shù)(比如 FC-AL 或 iSCSI)改變了傳統的存儲理念,將數據速率擴展到了 1 Gbit/s,將最大的可尋址設備數增加到了 100 以上,并將最大的電纜長(cháng)度擴展到了 25 米。圖 1 展示了從 1986 至 2007 年 SCSI 的數據速率的變化 



                                  圖1 SCSI 數據速率的演化 

         SCSI 工作原理 

  SCSI 實(shí)現了一種客戶(hù)機/服務(wù)器風(fēng)格的通信架構。發(fā)起者向目標設備發(fā)送命令請求。該目標處理此請求并向發(fā)起者返回響應。發(fā)起者可以是托管計算機中的一個(gè) SCSI 設備,而 SCSI 目標則可以是一個(gè)磁盤(pán)、光盤(pán)和磁帶設備或特殊設備(比如箱體設備)。 

         SCSI 命令 

  SCSI 傳輸所采用的協(xié)議已經(jīng)時(shí)過(guò)境遷,SCSI 命令卻保持了最初的元素。SCSI 命令是在 Command Descriptor Block (CDB) 中定義的。CDB 包含了用來(lái)定義要執行的特定操作的操作代碼,以及大量特定于操作的參數。 

  SCSI 命令支持讀寫(xiě)數據(各有四個(gè)變量)以及很多非數據命令,比如 test-unit-ready(設備是否已就緒)、inquiry(檢索有關(guān)目標設備的基本信息)、read-capacity(檢索目標設備的存儲容量)等等。目標設備支持何種命令取決于設備的類(lèi)型。發(fā)起者通過(guò) inquiry 命令識別設備類(lèi)型。表 1 列出了最常用的 SCSI 命令。 

    表 1. 常見(jiàn) SCSI 命令 
  命令             用途 
  Test unit ready    查詢(xún)設備是否已經(jīng)準備好進(jìn)行傳輸 
  Inquiry        請求設備基本信息 
  Request sense      請求之前命令的錯誤信息 
  Read capacity      請求存儲容量信息 
  Read           從設備讀取數據 
  Write          向設備寫(xiě)入數據 
  Mode sense        請求模式頁(yè)面(設備參數) 
  Mode select       在模式頁(yè)面配置設備參數 

        借助大約 60 種可用命令,SCSI 可適用于許多設備(包括隨機存取設備,比如磁盤(pán)和像磁帶這樣的順序存儲設備)。SCSI 也提供了專(zhuān)門(mén)的命令以訪(fǎng)問(wèn)箱體服務(wù)(比如存儲箱體內部當前的傳感和溫度)。更多信息,請參見(jiàn) 參考資料 部分。 

        Linux 內核中的 SCSI 架構 

  圖2 顯示了 SCSI 子系統在 Linux 內核中的位置。內核的頂部是系統調用接口,處理用戶(hù)空間調用到內核中合適的目的地的路由(例如 open、read 或 write)。而虛擬文件系統(VFS) 是內核中支持的大多數文件系統的抽象層。它負責將請求路由到合適的文件系統。大多數文件系統都通過(guò)緩沖區緩存來(lái)相互通信,這種緩存通過(guò)緩存最近使用的數據來(lái)優(yōu)化對物理設備的訪(fǎng)問(wèn)。接下來(lái)是塊設備驅動(dòng)器層,它包括針對底層設備的各種塊驅動(dòng)器。SCSI 子系統是這種塊設備驅動(dòng)器之一。 
            
        
         圖 2. SCSI 子系統在 Linux 內核中的位置 

      與 Linux 內核中的其他主流子系統不同,SCSI 子系統是一種分層的架構,共分為三層。頂部的那層叫做較高層,代表的是內核針對 SCSI 和主要設備類(lèi)型的驅動(dòng)器的最高接口。接下來(lái)的是中間層,也稱(chēng)為公共層或統一層。在這一層包含 SCSI 堆棧的較高層和較低層的一些公共服務(wù)。最后是較低層,代表的是適用于 SCSI 的物理接口的實(shí)際驅動(dòng)器(參見(jiàn)圖 3)。 
  
   
  

                     圖 3. Linux SCSI 子系統的分層架構 

       在 ./linux/drivers/scsi 可以找到 SCSI 子系統(SCSI 較高層、中間層和各種驅動(dòng)器)的源代碼。SCSI 數據結構則位于 SCSI 源目錄,在 ./linux/include/scsi 也可以找到。 

       SCSI 較高層 

  SCSI 子系統的較高層代表的是內核(設備級)最高級別的接口。它由一組驅動(dòng)器組成,比如塊設備(SCSI 磁盤(pán)和 SCSI CD-ROM)和字符設備(SCSI 磁帶和 SCSI generic)。較高層接受來(lái)自上層(比如 VFS)的請求并將其轉換成 SCSI 請求。較高層負責完成 SCSI 命令并將狀態(tài)信息通知上層。 

  SCSI 磁盤(pán)驅動(dòng)器在 ./linux/drivers/scsi/sd.c 內實(shí)現。SCSI 磁盤(pán)驅動(dòng)器通過(guò)調用 register_blkdev(作為塊驅動(dòng)器)進(jìn)行自初始化并通過(guò) scsi_register_driver 提供一組函數以表示所有 SCSI 設備。其中 sd_probe 和 sd_init_command 這兩個(gè)函數很重要。只要有新的 SCSI 設備附加到系統, SCSI 中間層就會(huì )調用 sd_probe 函數。sd_probe 函數可決定此設備是否由 SCSI 磁盤(pán)驅動(dòng)器管理,如果是,就創(chuàng )建新的 scsi_disk 結構來(lái)表示它。sd_init_command 函數將來(lái)自文件系統層的請求轉變成 SCSI 讀或寫(xiě)命令(為完成這個(gè) I/O 請求,sd_rw_intr 會(huì )被調用)。 

  SCSI 磁帶驅動(dòng)器在 ./linux/drivers/scsi/st.c 內實(shí)現。磁帶驅動(dòng)器是順序存取設備,會(huì )通過(guò) register_chrdev_region 將自身注冊為字符設備。SCSI 磁帶驅動(dòng)器還提供了一個(gè) probe 函數,稱(chēng)為 st_probe。該函數會(huì )創(chuàng )建一種新磁帶設備并將其添加到稱(chēng)為 scsi_tapes 的向量。SCSI 磁帶驅動(dòng)器的獨特之處在于,如果可能,它可以直接從用戶(hù)空間執行 I/O 傳輸。否則,數據會(huì )通過(guò)驅動(dòng)器緩沖被分段。 

  SCSI CD-ROM 驅動(dòng)器在 ./linux/drivers/scsi/sr.c 內實(shí)現。CD-ROM 驅動(dòng)器是另一種塊設備并為 SCSI 磁盤(pán)驅動(dòng)器提供類(lèi)似的函數集。sr_probe 函數可用來(lái)創(chuàng )建 scsi_sd 結構以表示 CD-ROM 設備,并用 register_cdrom 注冊此 CD-ROM。SCSI 磁帶驅動(dòng)器還會(huì )導出 sr_init_command,以將請求轉換成 SCSI CD-ROM 讀或寫(xiě)請求。 

  SCSI generic 驅動(dòng)器在 ./linux/drivers/scsi/sg.c 內實(shí)現。該驅動(dòng)器允許用戶(hù)應用程序向設備發(fā)送 SCSI 命令(比如格式化、模式感知或診斷命令)。通過(guò) sg3utils 包還可以從用戶(hù)空間利用 SCSI generic 驅動(dòng)器。這個(gè)用戶(hù)空間包包括多種實(shí)用工具,可用來(lái)發(fā)送 SCSI 命令和解析這些命令的響應。 

  SCSI 中間層 

  SCSI 中間層是 SCSI 較高層和較低層的公共服務(wù)層(可以在 ./linux/drivers/scsi/scsi.c 內部分地實(shí)現)。它提供了很多可供較高層和較低層驅動(dòng)器使用的函數,因而可以充當這兩層間的連接層。中間層很重要,原因是它抽象化了較低層驅動(dòng)器(LLD)的實(shí)現,可以在 ./linux/drivers/scsi/hosts.c 中部分地實(shí)現。這意味著(zhù)可以以同樣的方式使用帶不同接口的 Fibre Channel 主機總線(xiàn)適配器(HBA)。 

  低層驅動(dòng)器注冊和錯誤處理都由 SCSI 中間層提供。中間層還提供了較高層和較低層間的 SCSI 命令排隊。SCSI 中間層的一個(gè)重要功能是將來(lái)自較高層的命令請求轉換成 SCSI 請求。它也負責管理特定于 SCSI 的錯誤恢復。 

  中間層可以連接 SCSI 子系統的較高層和較低層。它接受對 SCSI 事務(wù)的請求并對這些請求進(jìn)行排隊以便處理 (如 ./linux/drivers/scsi/scsi_lib.c 中所示)。當這些命令完成后,它接受來(lái)自 LLD 的 SCSI 響應并通知較較高層此請求已經(jīng)完成。 

  中間層最重要的職責之一是錯誤和超時(shí)處理。如果 SCSI 命令沒(méi)有在合理的時(shí)間內完成或者 SCSI 請求返回錯誤,中間層就會(huì )管理錯誤或重新發(fā)送此請求。中間層還可管理較高層恢復,比如請求 HBA (LLD) 或 SCSI 設備重置。SCSI 錯誤和超時(shí)處理程序在 ./linux/drivers/scsi/scsi_error.c 內實(shí)現。 

  SCSI 較低層 

  在最低層的是一組驅動(dòng)器,稱(chēng)為 SCSI 低層驅動(dòng)器。它們是一些可與物理設備(比如 HBA)鏈接的特定驅動(dòng)器。LLD 提供了自公共中間層到特定于設備的 HBA 的一種抽象。每個(gè) LLD 都提供了到特定底層硬件的接口,但所使用的到中間層的接口卻是一組標準接口。 

  較低層包含大量代碼,原因是它要負責處理各種不同的 SCSI 適配器類(lèi)型。例如,Fibre Channel 協(xié)議包含了針對 Emulex 和 QLogic 的各種適配器的 LLD。面向 Adaptec 和 LSI 的 SAS 適配器的 LLD 也包括在內。 

  Linux 和 SCSI 的未來(lái)展望 

  毫無(wú)疑問(wèn),SCSI 的發(fā)展前景很好,并且它會(huì )與 Linux 緊密相關(guān)。隨著(zhù) SCSI 的演化,Linux 將會(huì )一如既往地為不斷發(fā)展的技術(shù)提供支持。Linux 借助面向 HBA 的驅動(dòng)器為新的 SAS 協(xié)議提供支持。隨著(zhù)協(xié)議向更快的速度發(fā)展(比如 6 Gb SAS 或 8 Gb FC),Linux 必將處在發(fā)展和部署的前沿。 

  您還會(huì )發(fā)現 Linux 恰恰就是新 SCSI 協(xié)議的先進(jìn)之處。FCoE(Fibre Channel over Ethernet)頗值得一提。FCoE 是全雙工 Ethernet 網(wǎng)絡(luò )(通常是 1Gb 或 10Gb Ethernet)上的一種 Fibre Channel 框架的映射。FCoE 之所以重要,是因為它將主流的網(wǎng)絡(luò )媒介與主流的企業(yè)存儲協(xié)議連接起來(lái)。這種新技術(shù)必然受人矚目,而且 Linux 也將不會(huì )例外。 

  針對 SCSI 的端到端數據保護也在開(kāi)發(fā)中,它源于 T10 的新數據完整性標準。這個(gè)標準為每扇區都增加了一個(gè)數據完整性字段(DIF)以保護介質(zhì)上的數據。這個(gè)新的 8 字節 DIF 字段包括一個(gè)循環(huán)冗余代碼(CRC)用以保護數據,一個(gè)參考標簽用以保護數據免遭誤導寫(xiě)入,以及一個(gè)應用程序標簽。應用程序標簽特定于應用程序,并且可以定義數據的用途,例如,一個(gè) PDF 文件的一部分。請參見(jiàn) 參考資料 部分以獲取更多信息。 

       結束語(yǔ) 

  Linux 內核是抽象的分層結構的另一個(gè)典型示例。它將各種文件系統連接到不同的物理存儲介質(zhì)。若這些存儲介質(zhì)與 SCSI 相關(guān),SCSI 子系統會(huì )將公共 Linux 塊請求轉化為針對特定底層設備的 SCSI 請求。SCSI 子系統本身在過(guò)去若干年中經(jīng)歷了很多變化,而且這些變化還在繼續。諸如端到端數據保護這樣的新技術(shù),與 FCoE 這樣的新協(xié)議一樣,都在想方設法尋找與 Linux 建立關(guān)系的途徑。  
 

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>