天天看點

aix /dev目錄下hdisk 和 rhdisk的差別(asm必須使用字元裝置)

aix /dev目錄下hdisk 和 rhdisk的差別(asm必須使用字元裝置)

簡單的解釋:hdisk是塊裝置,而rhdisk是字元裝置。

系統中能夠随機(不需要按順序)通路固定大小資料片(chunks)的裝置被稱作塊裝置,這些資料片就稱作塊。最常見的塊裝置是硬碟,除此以外,還有軟碟驅動器、CD-ROM驅動器和閃存等等許多其他塊裝置。注意,它們都是以安裝檔案系統的方式使用的——這也是塊裝置的一般通路方式。

 另一種基本的裝置類型是字元裝置。字元裝置按照字元流的方式被有序通路,像序列槽和鍵盤就都屬于字元裝置。如果一個硬體裝置是以字元流的方式被通路的話,那就應該将它歸于字元裝置;反過來,如果一個裝置是随機(無序的)通路的,那麼它就屬于塊裝置。

 這兩種類型的裝置的根本差別在于它們是否可以被随機通路——換句話說就是,能否在通路裝置時随意地從一個位置跳轉到另一個位置。舉個例子,鍵盤這種裝置提供的就是一個資料流,當你敲入“fox” 這個字元串時,鍵盤驅動程式會按照和輸入完全相同的順序傳回這個由三個字元組成的資料流。如果讓鍵盤驅動程式打亂順序來讀字元串,或讀取其他字元,都是沒有意義的。是以鍵盤就是一種典型的字元裝置,它提供的就是使用者從鍵盤輸入的字元流。對鍵盤進行讀操作會得到一個字元流,首先是“f”,然後是“o”,最後是“x”,最終是檔案的結束(EOF)。當沒人敲鍵盤時,字元流就是空的。硬碟裝置的情況就不大一樣了。硬碟裝置的驅動可能要求讀取磁盤上任意塊的内容,然後又轉去讀取别的塊的内容,而被讀取的塊在磁盤上位置不一定要連續,是以說硬碟可以被随機通路,而不是以流的方式被通路,顯然它是一個塊裝置。

 核心管理塊裝置要比管理字元裝置細緻得多,需要考慮的問題和完成的工作相比字元裝置來說要複雜許多。這是因為字元裝置僅僅需要控制一個位置—目前位置—而塊裝置通路的位置必須能夠在媒體的不同區間前後移動。是以事實上核心不必提供一個專門的子系統來管理字元裝置,但是對塊裝置的管理卻必須要有一個專門的提供服務的子系統。不僅僅是因為塊裝置的複雜性遠遠高于字元裝置,更重要的原因是塊裝置對執行性能的要求很高;對硬碟每多一分利用都會對整個系統的性能帶來提升,其效果要遠遠比鍵盤吞吐速度成倍的提高大得多。另外,我們将會看到,塊裝置的複雜性會為這種優化留下很大的施展空間。

 簡單來講,塊裝置可以随機存取,而字元裝置不能随機存取,那裸裝置又該如何解釋呢?

 難道裸裝置,如磁盤裸裝置也不能随機讀取嗎?那在資料庫中用裸裝置建一個2g的資料檔案,為了存取最後一個資料塊,難道Oracle還要把前面的所有資料塊都讀一遍,顯然不符合事實,如果這樣解釋呢,作業系統不能随機讀取,并不意味着資料庫也不能随機讀取。

 塊裝置通過系統緩存進行讀取,不是直接和實體磁盤讀取。字元裝置可以直接實體磁盤讀取。不經過系統緩存。(如鍵盤,直接相應中斷)

ASM必須使用字元裝置作為ASM磁盤,而不能使用塊裝置(如果使用塊裝置,則必須使用ASMLib的支援)

通常意義上我們認為塊裝置是可以随機讀取的,但字元裝置不能随機讀取。那難道oracle在使用裸裝置的時候必須對裸裝置整個順序讀取一次,這絕對不可能。

 "ASMLib是ASM的可選附件,它的目标是為ASM支援的核心提供發現和通路塊裝置的備選接口"。在大多數Unix系統上,字元裝置顯示為/dev/rdsk,而在Linux上則顯示為/dev/raw/raw,唯一的例外情況是在ASM使用NAS檔案系統檔案作為磁盤時。

字元裝置和塊裝置是對同一個實體裝置的兩種不同的存儲方式的抽象。

字元裝置支援不定長的資料傳輸 (data transfers of arbitrary sizes),最小一個位元組,LVM和儲存設備的單次最大I/O隻受 LTG (logical track group) 大小的限制,預設為128KB,可修改。

塊裝置隻能做定長的資料傳輸,資料必須經過 'kernel buffer cache'。

對 于 LVM 來講,這個限制是由于 LVM 在底層統一采用了 Block I/O 的讀寫方式。換句話說,不管你是通過字元裝置還是塊裝置通路 LVM,最終都會以 Block I/O 的方式傳遞資料,而這種方式的确要求I/O到達LVM 時它的大小為 block size (512位元組) 的整數倍。

但通過字元裝置和塊裝置通路 LVM的本質差別在于:

1. 塊裝置雖然表面上可以接受‘不定長’的‘邏輯’請求(例如 dd bs=1),但它必須經過塊緩存(block buffer)子產品才能達到LVM I/O 子產品,而塊緩存I/O必然是以“一個” 512位元組塊進行的(不能大,也不能小)。是以,在LVM這一層發生的還是512位元組的讀寫。當你寫1位元組的時候,塊緩存子產品必須先把目前的512位元組從 LV裡讀出來,更新一個位元組以後再把整個512位元組寫回去。如果你讀寫1KB,塊緩存必須把它分成兩個512位元組的請求發個LVM。是以在LVM層實際發 生了兩個512位元組的讀寫。

2. 字元裝置從定義上支援不定長存取。但由于 LVM 底層實作采用了block I/O 的方式,I/O 必須以 512位元組 的整數倍進行,并且單個I/O 大小不能大于 LTG (預設128KB)。由于不經過緩存子產品的‘打包’,1位元組的請求不能在到達LVM底層時變成512位元組,是以LVM傳回 EINVAL 的錯。但4KB, 8KB 直到 128KB 的請求都會直接處理,不會被分拆成 512位元組,這是和塊裝置的存取方式的本質差別。

>> 反而塊裝置是利用了系統緩存,可以支援變長I/O的,這正是使用額外緩存帶來的靈活度。

如上說述,這個的“靈活度”可以說是一種假象。實際上字元裝置才更靈活。

這和ORACLE使用裸裝置做資料檔案沒有本質差別, ORACLE是可以對 裸裝置/字元裝置做随機存取的