2013-12-20 46 views
1

this article打開文件時,一個普通的文件系統上寫比較:如何通過塊設備

fd = open("/media/mount1/file", O_SYNC); 

到寫一個塊設備上:

fd = open("/dev/sda", O_SYNC) 

它如何可以打開通過塊設備在HDD內同樣file

+1

你是指「同一個文件」? – Arkadiy

+0

我認爲這是因爲這篇文章談論的是數據完整性和吞吐量,看起來像讀/寫正常數據(因此是文件)的比較。實際上,當將HDD作爲塊設備打開時,我們無法做任何有用的事情。 – dragon135

回答

0

Linux中的塊設備可讓您訪問設備上的原始字節,而無需進行文件系統轉換。

要訪問塊設備的字節流內的文件,即使部分地實現了程序中文件系統本身的邏輯,也必須實現該文件。

因此,排序的回答是,如果你要問這個,這是不可能:-)

即使有些文件系統有一個簡單的邏輯(FAT認爲32),你將不會獲得任何模仿用戶空間上的FS邏輯。

特殊情況是,如果您的應用程序將在塊設備本身中組織數據,並使用自定義數據結構而不是依賴任何文件系統(某些RDBMS的高性能配置場景會執行此類操作)。但這並不是你的情況。

2

本文沒有比較通過文件系統寫入文件vs通過對塊設備的原始訪問寫入同一文件,但比較了一些因素,例如在執行write操作時的數據完整性和速度使用文件系統的常規文件,而對塊設備執行write。它不會使用這兩種方法打開相同的文件。實際上,寫入常規文件與寫入塊設備的方式不同。這正是Linux暴露設備的方式,它允許相同的系統調用被用於相同的語義,但被用於不同的設備。 fprintf()與打印到控制檯,打印機,串口或文件的方式大致相同:同樣的功能,相同的語義,只有一個參數指定目的地。

正如文章所示,通過文件系統操作的write通常對用戶來說更快,因爲系統調用在實際寫入磁盤之前返回。這意味着計劃寫入的內容尚未寫入(通常很少),因此電力短缺可能導致數據丟失。另一方面,對塊設備的寫入可確保數據完整性,因此,在數據實際寫入磁盤(或該磁盤的高速緩存)後,系統調用將返回。

+0

因此,實際上沒有關於打開HDD作爲塊設備的用處,將它作爲原始I/O打開HDD沒有任何意義。如果您將硬盤寫入塊設備,我認爲硬盤文件系統會被破壞。關於本文中數據完整性和吞吐量的說法看起來就像我們可以正常向HDD寫數據一樣: 「4.通過塊設備的HDD上的O_SYNC直接保證數據完整性,但提供低吞吐量。」 「6.通過塊設備禁用HDD數據屏障和原始DIRECT-I/O可爲HDD提供最大吞吐量。」 – dragon135

+0

思考完之後,如果我通過帶有O_SYNC和O_DIRECT的塊設備打開硬盤,然後調用fsync,是否意味着在調用fsync時,光盤自己的緩存/緩衝區中的所有數據都將寫入光盤盤?例如:我通過文件系統打開hdd文件,向它寫入數據和fsync文件(這並不意味着光盤的緩存寫入光盤盤),然後我再次打開通過塊設備的硬盤並調用fsync,它會刷新磁盤緩存從前一個寫入命令到碟盤? – dragon135

0

帶有用戶空間文件系統。這是GNU Hurd(永遠未完成)和QNX使用的操作系統微內核方法的基礎。它也可用作Linux的保險絲,例如保險絲NTFS。

0

直接回答你的問題是「你不能直接通過塊設備接口打開相同的文件。」

聲稱「文件的O_SYNC不能保證數據對存儲設備的非易失性存儲介質的承諾」沒有任何限制,這是不確定的。存儲設備可以採用或者可以被配置爲採用直寫式高速緩存,並且僅當實際提交給物理介質時才指示寫入的完成。另外,OS(取決於文件系統)可以通過顯式調用存儲驅動器的cache-flush命令來實現O_SYNC選項。

確實存在存儲設備,尤其是那些由NAND閃存支持的存儲設備,例如人們通常稱之爲「USB密鑰」或SD卡的存儲設備,它抵制任何實現交易的嘗試(即他們聲稱支持緩存flush命令,但在數據實際提交之前返回),但應該可以配置磁盤備份系統,以便文件上的O_SYNC(與塊設備相比)保證對物理介質的承諾。