scsi 實現了一種客戶機/伺服器風格的通訊架構。發起者向目標裝置傳送命令請求。該目標處理此請求並向發起者返回響應。發起者可以是託管計算機中的乙個 scsi 裝置,而 scsi 目標則可以是乙個磁碟、光碟和磁帶裝置或特殊裝置(比如箱體裝置)。
回頁首scsi 傳輸所採用的協議已經時過境遷,scsi 命令卻保持了最初的元素。scsi 命令是在 command descriptor block (cdb) 中定義的。cdb 包含了用來定義要執行的特定操作的操作**,以及大量特定於操作的引數。
scsi 命令支援讀寫資料(各有四個變數)以及很多非資料命令,比如 test-unit-ready(裝置是否已就緒)、inquiry(檢索有關目標裝置的基本資訊)、read-capacity(檢索目標裝置的儲存容量)等等。目標裝置支援何種命令取決於裝置的型別。發起者通過 inquiry 命令識別裝置型別。表 1 列出了最常用的 scsi 命令。
表 1. 常見 scsi 命令
命令用途
test unit ready
查詢裝置是否已經準備好進行傳輸
inquiry
請求裝置基本資訊
request sense
請求之前命令的錯誤資訊
read capacity
請求儲存容量資訊
read
從裝置讀取資料
write
向裝置寫入資料
mode sense
請求模式頁面(裝置引數)
mode select
在模式頁面配置裝置引數
借助大約 60 種可用命令,scsi 可適用於許多裝置(包括隨機訪問裝置,比如磁碟和像磁帶這樣的順序儲存裝置)。scsi 也提供了專門的命令以訪問箱體服務(比如儲存箱體內部當前的感測和溫度)。更多資訊,請參見 參考資料 部分。
回頁首圖 2 顯示了 scsi 子系統在 linux 核心中的位置。核心的頂部是系統呼叫介面,處理使用者空間呼叫到核心中合適的目的地的路由(例如 open、read 或 write)。而虛擬檔案系統(vfs) 是核心中支援的大多數檔案系統的抽象層。它負責將請求路由到合適的檔案系統。大多數檔案系統都通過緩衝區快取來相互通訊,這種快取通過快取最近使用的資料來優化對物理裝置的訪問。接下來是塊裝置驅動器層,它包括針對底層裝置的各種塊驅動器。scsi 子系統是這種塊裝置驅動器之一。
圖 2. scsi 子系統在 linux 核心中的位置
圖 3. linux scsi 子系統的分層架構
回頁首scsi 子系統的較高層代表的是核心(裝置級)最高端別的介面。它由一組驅動器組成,比如塊裝置(scsi 磁碟和 scsi cd-rom)和字元裝置(scsi 磁帶和 scsi generic)。較高層接受來自上層(比如 vfs)的請求並將其轉換成 scsi 請求。較高層負責完成 scsi 命令並將狀態資訊通知上層。
scsi 磁碟驅動器在 ./linux/drivers/scsi/sd.c 內實現。scsi 磁碟驅動器通過呼叫register_blkdev
(作為塊驅動器)進行自初始化並通過scsi_register_driver
提供一組函式以表示所有 scsi 裝置。其中sd_probe
和sd_init_command
這兩個函式很重要。只要有新的 scsi 裝置附加到系統, scsi 中間層就會呼叫sd_probe
函式。sd_probe
函式可決定此裝置是否由 scsi 磁碟驅動器管理,如果是,就建立新的scsi_disk
結構來表示它。sd_init_command
函式將來自檔案系統層的請求轉變成 scsi 讀或寫命令(為完成這個 i/o 請求,sd_rw_intr
會被呼叫)。
scsi 磁帶驅動器在 ./linux/drivers/scsi/st.c 內實現。磁帶驅動器是順序訪問裝置,會通過register_chrdev_region
將自身註冊為字元裝置。scsi 磁帶驅動器還提供了乙個 probe 函式,稱為st_probe
。該函式會建立一種新磁帶裝置並將其新增到稱為scsi_tapes
的向量。scsi 磁帶驅動器的獨特之處在於,如果可能,它可以直接從使用者空間執行 i/o 傳輸。否則,資料會通過驅動器緩衝被分段。
scsi cd-rom 驅動器在 ./linux/drivers/scsi/sr.c 內實現。cd-rom 驅動器是另一種塊裝置並為 scsi 磁碟驅動器提供類似的函式集。sr_probe
函式可用來建立scsi_sd
結構以表示 cd-rom 裝置,並用register_cdrom
註冊此 cd-rom。scsi 磁帶驅動器還會匯出sr_init_command
,以將請求轉換成 scsi cd-rom 讀或寫請求。
scsi generic 驅動器在 ./linux/drivers/scsi/sg.c 內實現。該驅動器允許使用者應用程式向裝置傳送 scsi 命令(比如格式化、模式感知或診斷命令)。通過 sg3utils 包還可以從使用者空間利用 scsi generic 驅動器。這個使用者空間包包括多種實用工具,可用來傳送 scsi 命令和解析這些命令的響應。
回頁首scsi 中間層是 scsi 較高層和較低層的公共服務層(可以在 ./linux/drivers/scsi/scsi.c 內部分地實現)。它提供了很多可供較高層和較低層驅動器使用的函式,因而可以充當這兩層間的連線層。中間層很重要,原因是它抽象化了較低層驅動器(lld)的實現,可以在 ./linux/drivers/scsi/hosts.c 中部分地實現。這意味著可以以同樣的方式使用帶不同介面的 fibre channel 主機匯流排介面卡(hba)。
低層驅動器註冊和錯誤處理都由 scsi 中間層提供。中間層還提供了較高層和較低層間的 scsi 命令排隊。scsi 中間層的乙個重要功能是將來自較高層的命令請求轉換成 scsi 請求。它也負責管理特定於 scsi 的錯誤恢復。
中間層可以連線 scsi 子系統的較高層和較低層。它接受對 scsi 事務的請求並對這些請求進行排隊以便處理 (如 ./linux/drivers/scsi/scsi_lib.c 中所示)。當這些命令完成後,它接受來自 lld 的 scsi 響應並通知較較高層此請求已經完成。
中間層最重要的職責之一是錯誤和超時處理。如果 scsi 命令沒有在合理的時間內完成或者 scsi 請求返回錯誤,中間層就會管理錯誤或重新傳送此請求。中間層還可管理較高層恢復,比如請求 hba (lld) 或 scsi 裝置重置。scsi 錯誤和超時處理程式在 ./linux/drivers/scsi/scsi_error.c 內實現。
回頁首在最低層的是一組驅動器,稱為 scsi 低層驅動器。它們是一些可與物理裝置(比如 hba)鏈結的特定驅動器。lld 提供了自公共中間層到特定於裝置的 hba 的一種抽象。每個 lld 都提供了到特定底層硬體的介面,但所使用的到中間層的介面卻是一組標準介面。
較低層包含大量**,原因是它要負責處理各種不同的 scsi 介面卡型別。例如,fibre channel 協議包含了針對 emulex 和 qlogic 的各種介面卡的 lld。面向 adaptec 和 lsi 的 sas 介面卡的 lld 也包括在內。
回頁首毫無疑問,scsi 的發展前景很好,並且它會與 linux 緊密相關。隨著 scsi 的演化,linux 將會一如既往地為不斷發展的技術提供支援。linux 借助面向 hba 的驅動器為新的 sas 協議提供支援。隨著協議向更快的速度發展(比如 6 gb sas 或 8 gb fc),linux 必將處在發展和部署的前沿。
您還會發現 linux 恰恰就是新 scsi 協議的先進之處。fcoe(fibre channel over ethernet)頗值得一提。fcoe 是全雙工 ethernet 網路(通常是 1gb 或 10gb ethernet)上的一種 fibre channel 框架的對映。fcoe 之所以重要,是因為它將主流的網路媒介與主流的企業儲存協議連線起來。這種新技術必然受人矚目,而且 linux 也將不會例外。
針對 scsi 的端到端資料保護也在開發中,它源於 t10 的新資料完整性標準。這個標準為每扇區都增加了乙個資料完整性字段(dif)以保護介質上的資料。這個新的 8 位元組 dif 字段包括乙個迴圈冗餘**(crc)用以保護資料,乙個參考標籤用以保護資料免遭誤導寫入,以及乙個應用程式標籤。應用程式標籤特定於應用程式,並且可以定義資料的用途,例如,乙個 pdf 檔案的一部分。
SCSI硬碟的優勢
1 速度快 伺服器使用的 硬碟轉速快,可以達到每分鐘7200或10000轉,甚至更高 它還配置了較大 一般為2mb或4mb 的回寫式 快取 平均訪問時間比較短 外部傳輸率和內部傳輸率更高,採用ultra wide scsi ultra2 wide scsi ultra160 scsi ultra32...
Linux 相關scsi命令
linux相關scsi命令 由於前段時間儲存擴容,對儲存操作較多,下面記錄了常用的操作 lsscsi命令 顯示scsi裝置資訊 lsscsi 0 0 0 2 disk ibm 1726 4xx fastt 0617 dev sdb 0 0 0 3 disk ibm 1726 4xx fastt 06...
簡述hdfs工作原理 HDFS的工作原理
hdfs 的工作原理 hadoop 分布式檔案系統 hdfs 是一種被設計成適合執行在通用硬體上的分布式檔案系統。hdfs 是乙個高度容錯性的系統,適合部署在廉價的 機器上。它能提供高吞吐量的資料訪問,非常適合大規模資料集上的應用。要理解 hdfs 的內部工作原理,首先要理解什麼是分布式 檔案系統。...