溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux操作系統(tǒng)存儲(chǔ)子系統(tǒng)核心技術(shù)中的硬盤(pán)與RAID是什么意思

發(fā)布時(shí)間:2021-11-02 10:16:58 來(lái)源:億速云 閱讀:186 作者:柒染 欄目:系統(tǒng)運(yùn)維

這篇文章將為大家詳細(xì)講解有關(guān)Linux操作系統(tǒng)存儲(chǔ)子系統(tǒng)核心技術(shù)中的硬盤(pán)與RAID是什么意思,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

Linux操作系統(tǒng)的存儲(chǔ)子系統(tǒng)應(yīng)該是Linux中最為復(fù)雜的子系統(tǒng)了。其實(shí)很多子系統(tǒng)都認(rèn)為自己是最復(fù)雜的子系統(tǒng),比如內(nèi)存子系統(tǒng)和網(wǎng)絡(luò)子系統(tǒng)也這么說(shuō)。無(wú)論如何,存儲(chǔ)子系統(tǒng)在Linux中是比較復(fù)雜的。今天我們就介紹一下Linux的存儲(chǔ)子系統(tǒng)中的硬盤(pán)與RAID的相關(guān)內(nèi)容,后面再寫(xiě)一篇關(guān)于LVM與文件系統(tǒng)的內(nèi)容。

硬盤(pán)

在Linux的存儲(chǔ)子系統(tǒng)中,最底層的就是硬盤(pán)了。這里的硬盤(pán)并不是指我們看到的硬盤(pán)硬件,而是指在Linux內(nèi)部看到的硬盤(pán)設(shè)備,或者說(shuō)是塊設(shè)備。如果我們?cè)?dev目錄執(zhí)行以下ls命令,就可以看到很多設(shè)備。在這些設(shè)備中以sd開(kāi)頭的就是基于SCSI協(xié)議的硬盤(pán)。

Linux操作系統(tǒng)存儲(chǔ)子系統(tǒng)核心技術(shù)中的硬盤(pán)與RAID是什么意思

圖1 Linux中的塊設(shè)備

無(wú)論是基于SAS、iSCSI還是FC的磁盤(pán)設(shè)備,大概都是這個(gè)樣子。形似dm-X的是Device  Map塊設(shè)備,也就是通過(guò)LVM進(jìn)行管理的設(shè)備,這種設(shè)備是一種邏輯設(shè)備。

在Linux操作系統(tǒng)中塊設(shè)備的種類(lèi)很多,有本地磁盤(pán)設(shè)備、有SAN設(shè)備還有基于網(wǎng)絡(luò)的塊設(shè)備。在虛擬機(jī)中塊設(shè)備又呈現(xiàn)為另外一種文件名,比如在Xen虛擬機(jī)中為xvdX。

雖然名稱差異很大,但是在Linux操作系統(tǒng)內(nèi)核中的實(shí)現(xiàn)卻非常簡(jiǎn)單。在內(nèi)核中任何磁盤(pán)塊設(shè)備都是通過(guò)調(diào)用add_disk函數(shù)完成的。在《Linux設(shè)備驅(qū)動(dòng)程序》這本書(shū)對(duì)塊設(shè)備進(jìn)行了詳細(xì)的介紹,并且可以通過(guò)非常簡(jiǎn)單的代碼實(shí)現(xiàn)一個(gè)自己的塊設(shè)備。

Linux操作系統(tǒng)存儲(chǔ)子系統(tǒng)核心技術(shù)中的硬盤(pán)與RAID是什么意思

圖2 最簡(jiǎn)單的塊設(shè)備驅(qū)動(dòng)

這里面有2個(gè)函數(shù),也就是alloc_disk和add_disk。前一個(gè)函數(shù)是分配一個(gè)通用塊的結(jié)構(gòu)體,后者則是將該塊設(shè)備添加到內(nèi)核,也就是在/dev目錄下生成一個(gè)“文件”。以上述代碼為例,執(zhí)行后會(huì)生成如下塊設(shè)備。

brw-rw---- 1 root disk 251, 0 Jun 16 09:13 /dev/sbulla

這里我們自定義了一個(gè)設(shè)備名稱sbulla。其實(shí)我們看到的SCSI設(shè)備也是這樣定義的,只不過(guò)其定義名稱的時(shí)候是通過(guò)sd字符。

以上述代碼為例,在塊設(shè)備中比較重要的地方是初始化了一個(gè)隊(duì)列處理函數(shù)(sbull_full_request)。所有從上層訪問(wèn)該塊設(shè)備的請(qǐng)求都會(huì)轉(zhuǎn)發(fā)到該處理函數(shù)進(jìn)行處理。

所有塊設(shè)備都要初始化這個(gè)隊(duì)列,并且提供一個(gè)請(qǐng)求處理函數(shù)。不同的塊設(shè)備的請(qǐng)求處理函數(shù)略有不同。比如常見(jiàn)的SCSI塊設(shè)備,其處理函數(shù)初始化過(guò)程如下:

q = __scsi_alloc_queue(sdev->host, scsi_request_fn);

而nbd(網(wǎng)絡(luò)塊設(shè)備,通過(guò)網(wǎng)絡(luò)的方式將服務(wù)端的文件映射為客戶端的塊設(shè)備)設(shè)備的初始化隊(duì)列的代碼如下所示:

disk->queue = blk_init_queue(do_nbd_request, &nbd_lock);

類(lèi)似的例子還很多,本文不再一一介紹。這里我們需要理解一點(diǎn),核心問(wèn)題在于注冊(cè)處理請(qǐng)求的回調(diào)函數(shù),以及通過(guò)add_disk就可以在/dev目錄下面創(chuàng)建一個(gè)塊設(shè)備。

另外一點(diǎn),對(duì)于任何類(lèi)型的塊設(shè)備,無(wú)論是本地硬盤(pán),還是經(jīng)過(guò)網(wǎng)絡(luò)的NBD和iSCSI,還是FC設(shè)備,最后都是/dev目錄下的一個(gè)文件,而這個(gè)文件其實(shí)就是塊設(shè)備。我們可以通過(guò)對(duì)該文件的讀寫(xiě)實(shí)現(xiàn)對(duì)塊設(shè)備的訪問(wèn)。

RAID

作為普通用戶使用單個(gè)硬盤(pán)是沒(méi)有任何問(wèn)題的,但是作為企業(yè)應(yīng)用使用單個(gè)硬盤(pán)存在很大的風(fēng)險(xiǎn)。這時(shí)因?yàn)橛脖P(pán)隨時(shí)有可能損壞,因此我們需要一種機(jī)制來(lái)保證即使出現(xiàn)硬盤(pán)故障的情況下,數(shù)據(jù)不會(huì)丟失,且業(yè)務(wù)仍然可以正常工作。

RAID正是解決上述問(wèn)題的技術(shù)。RAID的全稱為廉價(jià)冗余磁盤(pán)陣列(Redundant Array of Inexpensive  Disks),從字面可以看出其基本原理就是通過(guò)廉價(jià)的磁盤(pán)組成一組磁盤(pán)。RAID不僅僅可以通過(guò)冗余的方式解決數(shù)據(jù)可靠性的問(wèn)題,還可以提高性能。其主要原理就是將請(qǐng)求拆分到多個(gè)物理硬盤(pán)來(lái)執(zhí)行,性能自然比一個(gè)硬盤(pán)快了。

在Linux操作系統(tǒng)層面,其實(shí)就是將物理磁盤(pán)通過(guò)軟件抽象為邏輯磁盤(pán)。以RAID1(兩塊磁盤(pán)存儲(chǔ)相同的數(shù)據(jù),在出現(xiàn)一塊磁盤(pán)故障的情況下,數(shù)據(jù)不丟失)為例,通過(guò)Linux內(nèi)核中的軟件創(chuàng)建一個(gè)虛擬的塊設(shè)備,而該塊設(shè)備中記錄了底層對(duì)應(yīng)的物理設(shè)備及相關(guān)參數(shù)。

Linux操作系統(tǒng)存儲(chǔ)子系統(tǒng)核心技術(shù)中的硬盤(pán)與RAID是什么意思

圖3 RAID1 示意圖

因此,從用戶層面來(lái)看就是一塊普通的磁盤(pán)設(shè)備,而在底層卻是2個(gè)獨(dú)立的物理硬盤(pán)。當(dāng)用戶向邏輯磁盤(pán)寫(xiě)數(shù)據(jù)的時(shí)候,其中的軟件會(huì)通過(guò)參數(shù)進(jìn)行計(jì)算,并將數(shù)據(jù)重新定向到底層的物理設(shè)備。通過(guò)這種方法可以保證即使出現(xiàn)某個(gè)物理磁盤(pán)損壞,用戶的數(shù)據(jù)仍然完好無(wú)損。

除了上面說(shuō)的RAID1外,還有很多RAID類(lèi)型。不同的RAID類(lèi)型實(shí)現(xiàn)不同的功能。比如RAID0實(shí)現(xiàn)條帶化,主要是提升性能;RAID1則是實(shí)現(xiàn)數(shù)據(jù)的冗余,防止磁盤(pán)故障導(dǎo)致的數(shù)據(jù)丟失;由于上述RAID只能解決一方面的問(wèn)題,因此有人講兩者結(jié)合,出現(xiàn)了RAID10和RAID01,這樣既能保證數(shù)據(jù)的可靠性,又能提升性能。

由于RAID1是一份數(shù)據(jù)寫(xiě)到兩個(gè)設(shè)備,因此只有50%的有效數(shù)據(jù)。為了提高有效數(shù)據(jù)率,于是發(fā)明了RAID5和RAID6等類(lèi)型。其中RAID5通過(guò)增加一個(gè)校驗(yàn)數(shù)據(jù)來(lái)保證數(shù)據(jù)的可靠性,以5塊盤(pán)的RAID5為例,其中有效數(shù)占4塊盤(pán)的空間,有效數(shù)據(jù)80%。但是RAID5有個(gè)問(wèn)題,就是一組磁盤(pán)中只能壞一塊,如果損壞的磁盤(pán)超過(guò)1塊就會(huì)導(dǎo)致數(shù)據(jù)丟失。RAID6的算法與RAID5類(lèi)似,它的特點(diǎn)是可以容忍2塊磁盤(pán)故障。

在實(shí)現(xiàn)層面,Linux的RAID實(shí)現(xiàn)在用戶態(tài)和內(nèi)核態(tài)都有涉及。其中用戶態(tài)主要進(jìn)行RAID的管理,而內(nèi)核態(tài)一方面配合用戶態(tài)進(jìn)行RAID管理,另外一方面則實(shí)現(xiàn)對(duì)IO的處理,這部分才是RAID最為核心的內(nèi)容。

Linux操作系統(tǒng)存儲(chǔ)子系統(tǒng)核心技術(shù)中的硬盤(pán)與RAID是什么意思

圖4 軟件架構(gòu)

對(duì)于基于SCSI物理磁盤(pán)的RAID來(lái)說(shuō),Linux環(huán)境下整個(gè)軟件架構(gòu)如圖4所示。其中虛線以上的為用戶態(tài)的軟件模塊,虛線以下的為內(nèi)核態(tài)的軟件模塊。這里比較核心的是RAID公共層,在這里主要?jiǎng)?chuàng)建md設(shè)備,該設(shè)備是一個(gè)邏輯設(shè)備,也是用戶可以看到的RAID設(shè)備。其下則是具體的RAID模塊,用于實(shí)現(xiàn)不同的RAID級(jí)別(算法)。

再往下就是通用SCSI驅(qū)動(dòng)層了,也就是圖中的SCSI磁盤(pán)驅(qū)動(dòng)這一層的內(nèi)容。該層其實(shí)是SCSI系統(tǒng)的上層驅(qū)動(dòng)(SCSI子系統(tǒng)分為上中下三層)。RAID模塊通過(guò)調(diào)用該層的數(shù)據(jù)訪問(wèn)接口就可以實(shí)現(xiàn)物理磁盤(pán)數(shù)據(jù)讀寫(xiě)了。

關(guān)于Linux操作系統(tǒng)存儲(chǔ)子系統(tǒng)核心技術(shù)中的硬盤(pán)與RAID是什么意思就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI