當前位置:首頁 » 服務存儲 » 內存文件存儲系統
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

內存文件存儲系統

發布時間: 2023-03-13 07:57:52

A. 文件管理和內部存儲哪個才是真正的內存顯示

一 內存,內部存儲和外部存儲文件管理
1. 可對Android手機存儲空間做如下劃分:整個存儲空間分為內部存儲和外部存儲兩部分,內部存儲中又包含RAM和ROM等部分。

2. 具體概念區分
內部存儲,即InternalStorage,也常說內置存儲卡,這是手機內置的存儲空間,出廠時就被確定,是手機的一個硬體指標。類比電腦的內存。

外部存儲,即ExternalStorage,也常說外置存儲卡,手機出廠時並不存在,是由用戶自由擴展的存儲空間,常見的就是SD卡。類比電腦的外接移動硬碟
RAM,即常說的運行時內存,是手機運行時存儲數據和指令的地方,注意是運行時內存。類比電腦的內存條。

ROM,用來存放一些系統文件,應用配置和其他數據的地方,是內部存儲中主要存儲區域。類比於Windows電腦的C盤。

3. 以小米的紅米手機系列為例,打開設置中的關於手機一項,可以看到下圖:上圖中運行內存即RAM,共2G,機身存儲即內部存儲,共8G。

打開手機的文件管理,再點擊手機一項,可以看到下圖:上圖中箭頭所指的地方,可以進行內部存儲與外部存儲的切換,當前頁為內部存儲下的展示,這只是android系統存儲數據的一部分而已,大部分數據都對用戶隱藏。至於紅框部分下面繼續講。

B. 程序員必備知識(操作系統5-文件系統)

本篇與之前的第三篇的內存管理知識點有相似的地方

對於運行的進程來說,內存就像一個紙箱子, 僅僅是一個暫存數據的地方, 而且空間有限。如果我們想要進程結束之後,數據依然能夠保存下來,就不能只保存在內存里,而是應該保存在 外部存儲 中。就像圖書館這種地方,不僅空間大,而且能夠永久保存。

我們最常用的外部存儲就是 硬碟 ,數據是以文件的形式保存在硬碟上的。為了管理這些文件,我們在規劃文件系統的時候,需要考慮到以下幾點。

第一點,文件系統要有嚴格的組織形式,使得文件能夠 以塊為單位進行存儲 。這就像圖書館里,我們會給設置一排排書架,然後再把書架分成一個個小格子,有的項目存放的資料非常多,一個格子放不下,就需要多個格子來進行存放。我們把這個區域稱為存放原始資料的 倉庫區 。

第二點,文件系統中也要有 索引區 ,用來方便查找一個文件分成的多個塊都存放在了什麼位置。這就好比,圖書館的書太多了,為了方便查找,我們需要專門設置一排書架,這裡面會寫清楚整個檔案庫有哪些資料,資料在哪個架子的哪個格子上。這樣找資料的時候就不用跑遍整個檔案庫,在這個書架上找到後,直奔目標書架就可以了。

第三點,如果文件系統中有的文件是熱點文件,近期經常被讀取和寫入,文件系統應該有 緩存層 。這就相當於圖書館裡面的熱門圖書區,這裡面的書都是暢銷書或者是常常被借還的圖書。因為借還的次數比較多,那就沒必要每次有人還了之後,還放回遙遠的貨架,我們可以專門開辟一個區域, 放置這些借還頻次高的圖書。這樣借還的效率就會提高。

第四點,文件應該用 文件夾 的形式組織起來,方便管理和查詢。這就像在圖書館裡面,你可以給這些資料分門別類,比如分成計算機類.文學類.歷史類等等。這樣你也容易管理,項目組借閱的時候只要在某個類別中去找就可以了。

在文件系統中,每個文件都有一個名字,這樣我們訪問一個文件,希望通過它的名字就可以找到。文件名就是一個普通的文本。 當然文件名會經常沖突,不同用戶取相同的名字的情況還是會經常出現的。

要想把很多的文件有序地組織起來,我們就需要把它們成為 目錄 或者文件夾。這樣,一個文件夾里可以包含文件夾,也可以包含文件,這樣就形成了一種 樹形結構 。而我們可以將不同的用戶放在不同的用戶目錄下,就可以一定程度上避免了命名的沖突問題。

第五點,Linux 內核要在自己的內存裡面維護一套數據結構,來保存哪些文件被哪些進程打開和使用 。這就好比,圖書館里會有個圖書管理系統,記錄哪些書被借閱了,被誰借閱了,借閱了多久,什麼時候歸還。

文件系統是操作系統中負責管理持久數據的子系統,說簡單點,就是負責把用戶的文件存到磁碟硬體中,因為即使計算機斷電了,磁碟里的數據並不會丟失,所以可以持久化的保存文件。

文件系統的基本數據單位是 文件 ,它的目的是對磁碟上的文件進行組織管理,那組織的方式不同,就會形成不同的文件系統。

Linux最經典的一句話是:「一切皆文件」,不僅普通的文件和目錄,就連塊設備、管道、socket 等,也都是統一交給文件系統管理的。

Linux文件系統會為每個文件分配兩個數據結構: 索引節點(index node) 和 目錄項(directory entry) ,它們主要用來記錄文件的元信息和目錄層次結構。

●索引節點,也就是inode, 用來記錄文件的元信息,比如inode編號、文件大小訪問許可權、創建時間、修改時間、 數據在磁碟的位置 等等。 索引節點是文件的唯一標識 ,它們之間一一對應, 也同樣都會被 存儲在硬碟 中,所以索引節點同樣佔用磁碟空間。

●目錄項,也就是dentry, 用來記錄文件的名字、索引節點指針以及與其他目錄項的層級關聯關系。多個目錄項關聯起來,就會形成 目錄結構 ,但它與索引節點不同的是,目錄項是由內核維護的一個數據結構,不存放於磁碟,而是 緩存在內存 。

由於索引節點唯一標識一個文件,而目錄項記錄著文件的名,所以目錄項和索引節點的關系是多對一,也就是說,一個文件可以有多個別字。比如,硬鏈接的實現就是多個目錄項中的索引節點指向同一個文件。

注意,目錄也是文件,也是用索引節點唯一標識,和普通文件不同的是,普通文件在磁碟裡面保存的是文件數據,而目錄文件在磁碟裡面保存子目錄或文件。

(PS:目錄項和目錄不是一個東西!你也不是一個東西(^_=), 雖然名字很相近,但目錄是個文件。持久化存儲在磁碟,而目錄項是內核一個數據結構,緩存在內存。

如果查詢目錄頻繁從磁碟讀,效率會很低,所以內核會把已經讀過的目錄用目錄項這個數據結構緩存在內存,下次再次讀到相同的目錄時,只需從內存讀就可以,大大提高了 文件系統的效率。

目錄項這個數據結構不只是表示目錄,也是可以表示文件的。)

磁碟讀寫的最小單位是 扇區 ,扇區的大小隻有512B大小,很明顯,如果每次讀寫都以這么小為單位,那這讀寫的效率會非常低。

所以,文件系統把多個扇區組成了一個 邏輯塊 ,每次讀寫的最小單位就是邏輯塊(數據塊) , Linux中的邏輯塊大小為4KB,也就是一次性讀寫 8個扇區,這將大大提高了磁碟的讀寫的效率。

以上就是索引節點、目錄項以及文件數據的關系,下面這個圖就很好的展示了它們之間的關系:

索引節點是存儲在硬碟上的數據,那麼為了加速文件的訪問,通常會把索引節點載入到內存中。

另外,磁碟進行格式化的時候,會被分成三個存儲區域,分別是超級塊、索引節點區和數據塊區。

●超級塊,用來存儲文件系統的詳細信息,比如塊個數、塊大小、空閑塊等等。

●索引節點區,用來存儲索引節點;

●數據塊區,用來存儲文件或目錄數據;

我們不可能把超級塊和索引節點區全部載入到內存,這樣內存肯定撐不住,所以只有當需要使用的時候,才將其載入進內存,它們載入進內存的時機是不同的.

●超級塊:當文件系統掛載時進入內存;

●索引節點區:當文件被訪問時進入內存;

文件系統的種類眾多,而操作系統希望 對用戶提供一個統一的介面 ,於是在用戶層與文件系統層引入了中間層,這個中間層就稱為 虛擬文件系統(Virtual File System, VFS) 。

VFS定義了一組所有文件系統都支持的數據結構和標准介面,這樣程序員不需要了解文件系統的工作原理,只需要了解VFS提供的統一介面即可。

在Linux文件系統中,用戶空間、系統調用、虛擬機文件系統、緩存、文件系統以及存儲之間的關系如下圖:

Linux支持的文件系統也不少,根據存儲位置的不同,可以把文件系統分為三類:

●磁碟的文件系統,它是直接把數據存儲在磁碟中,比如Ext 2/3/4. XFS 等都是這類文件系統。

●內存的文件系統,這類文件系統的數據不是存儲在硬碟的,而是佔用內存空間,我們經常用到的/proc 和/sys文件系統都屬於這一類,讀寫這類文件,實際上是讀寫內核中相關的數據。

●網路的文件系統,用來訪問其他計算機主機數據的文件系統,比如NFS. SMB等等。

文件系統首先要先掛載到某個目錄才可以正常使用,比如Linux系統在啟動時,會把文件系統掛載到根目錄。

在操作系統的輔助之下,磁碟中的數據在計算機中都會呈現為易讀的形式,並且我們不需要關心數據到底是如何存放在磁碟中,存放在磁碟的哪個地方等等問題,這些全部都是由操作系統完成的。

那麼,文件數據在磁碟中究竟是怎麼樣的呢?我們來一探究竟!

磁碟中的存儲單元會被劃分為一個個的「 塊 」,也被稱為 扇區 ,扇區的大小一般都為512byte.這說明即使一塊數據不足512byte,那麼它也要佔用512byte的磁碟空間。

而幾乎所有的文件系統都會把文件分割成固定大小的塊來存儲,通常一個塊的大小為4K。如果磁碟中的扇區為512byte,而文件系統的塊大小為4K,那麼文件系統的存儲單元就為8個扇區。這也是前面提到的一個問題,文件大小和佔用空間之間有什麼區別?文件大小是文件實際的大小,而佔用空間則是因為即使它的實際大小沒有達到那麼大,但是這部分空間實際也被佔用,其他文件數據無法使用這部分的空間。所以我們 寫入1byte的數據到文本中,但是它佔用的空間也會是4K。

這里要注意在Windows下的NTFS文件系統中,如果一開始文件數據小於 1K,那麼則不會分配磁碟塊來存儲,而是存在一個文件表中。但是一旦文件數據大於1K,那麼不管以後文件的大小,都會分配以4K為單位的磁碟空間來存儲。

與內存管理一樣,為了方便對磁碟的管理,文件的邏輯地址也被分為一個個的文件塊。於是文件的邏輯地址就是(邏輯塊號,塊內地址)。用戶通過邏輯地址來操作文件,操作系統負責完成邏輯地址與物理地址的映射。

不同的文件系統為文件分配磁碟空間會有不同的方式,這些方式各自都有優缺點。

連續分配要求每個文件在磁碟上有一組連續的塊,該分配方式較為簡單。

通過上圖可以看到,文件的邏輯塊號的順序是與物理塊號相同的,這樣就可以實現隨機存取了,只要知道了第一個邏輯塊的物理地址, 那麼就可以快速訪問到其他邏輯塊的物理地址。那麼操作系統如何完成邏輯塊與物理塊之間的映射呢?實際上,文件都是存放在目錄下的,而目錄是一種有結構文件, 所以在文件目錄的記錄中會存放目錄下所有文件的信息,每一個文件或者目錄都是一個記錄。 而這些信息就包括文件的起始塊號和佔有塊號的數量。

那麼操作系統如何完成邏輯塊與物理塊之間的映射呢? (邏輯塊號, 塊內地址) -> (物理塊號, 塊內地址),只需要知道邏輯塊號對應的物理塊號即可,塊內地址不變。

用戶訪問一個文件的內容,操作系統通過文件的標識符找到目錄項FCB, 物理塊號=起始塊號+邏輯塊號。 當然,還需要檢查邏輯塊號是否合法,是否超過長度等。因為可以根據邏輯塊號直接算出物理塊號,所以連續分配支持 順序訪問和隨機訪問 。

因為讀/寫文件是需要移動磁頭的,如果訪問兩個相隔很遠的磁碟塊,移動磁頭的時間就會變長。使用連續分配來作為文件的分配方式,會使文件的磁碟塊相鄰,所以文件的讀/寫速度最快。

連續空間存放的方式雖然讀寫效率高,但是有 磁碟空間碎片 和 文件長度不易擴展 的缺陷。

如下圖,如果文件B被刪除,磁碟上就留下一塊空缺,這時,如果新來的文件小於其中的一個空缺,我們就可以將其放在相應空缺里。但如果該文件的大小大於所

有的空缺,但卻小於空缺大小之和,則雖然磁碟上有足夠的空缺,但該文件還是不能存放。當然了,我們可以通過將現有文件進行挪動來騰出空間以容納新的文件,但是這個在磁碟挪動文件是非常耗時,所以這種方式不太現實。

另外一個缺陷是文件長度擴展不方便,例如上圖中的文件A要想擴大一下,需要更多的磁碟空間,唯一的辦法就只能是挪動的方式,前面也說了,這種方式效率是非常低的。

那麼有沒有更好的方式來解決上面的問題呢?答案當然有,既然連續空間存放的方式不太行,那麼我們就改變存放的方式,使用非連續空間存放方式來解決這些缺陷。

非連續空間存放方式分為 鏈表方式 和 索引方式 。

鏈式分配採取離散分配的方式,可以為文件分配離散的磁碟塊。它有兩種分配方式:顯示鏈接和隱式鏈接。

隱式鏈接是只目錄項中只會記錄文件所佔磁碟塊中的第一塊的地址和最後一塊磁碟塊的地址, 然後通過在每一個磁碟塊中存放一個指向下一 磁碟塊的指針, 從而可以根據指針找到下一塊磁碟塊。如果需要分配新的磁碟塊,則使用最後一塊磁碟塊中的指針指向新的磁碟塊,然後修改新的磁碟塊為最後的磁碟塊。

我們來思考一個問題, 採用隱式鏈接如何將實現邏輯塊號轉換為物理塊號呢?

用戶給出需要訪問的邏輯塊號i,操作系統需要找到所需訪問文件的目錄項FCB.從目錄項中可以知道文件的起始塊號,然後將邏輯塊號0的數據讀入內存,由此知道1號邏輯塊的物理塊號,然後再讀入1號邏輯塊的數據進內存,此次類推,最終可以找到用戶所需訪問的邏輯塊號i。訪問邏輯塊號i,總共需要i+ 1次磁碟1/0操作。

得出結論: 隱式鏈接分配只能順序訪問,不支持隨機訪問,查找效率低 。

我們來思考另外一個問題,採用隱式鏈接是否方便文件拓展?

我們知道目錄項中存有結束塊號的物理地址,所以我們如果要拓展文件,只需要將新分配的磁碟塊掛載到結束塊號的後面即可,修改結束塊號的指針指向新分配的磁碟塊,然後修改目錄項。

得出結論: 隱式鏈接分配很方便文件拓展。所有空閑磁碟塊都可以被利用到,無碎片問題,存儲利用率高。

顯示鏈接是把用於鏈接各個物理塊的指針顯式地存放在一張表中,該表稱為文件分配表(FAT, File Allocation Table)。

由於查找記錄的過程是在內存中進行的,因而不僅顯著地 提高了檢索速度 ,而且 大大減少了訪問磁碟的次數 。但也正是整個表都存放在內存中的關系,它的主要的缺點是 不適 用於大磁碟 。

比如,對於200GB的磁碟和1KB大小的塊,這張表需要有2億項,每一項對應於這2億個磁碟塊中的一個塊,每項如果需要4個位元組,那這張表要佔用800MB內存,很顯然FAT方案對於大磁碟而言不太合適。

一直都在,加油!(*゜Д゜)σ凸←自爆按鈕

鏈表的方式解決了連續分配的磁碟碎片和文件動態打展的問題,但是不能有效支持直接訪問(FAT除外) ,索引的方式可以解決這個問題。

索引的實現是為每個文件創建一個 索引數據塊 ,裡面存放的 是指向文件數據塊的指針列表 ,說白了就像書的目錄一樣,要找哪個章節的內容,看目錄查就可以。

另外, 文件頭需要包含指向索引數據塊的指針 ,這樣就可以通過文件頭知道索引數據塊的位置,再通過索弓|數據塊里的索引信息找到對應的數據塊。

創建文件時,索引塊的所有指針都設為空。當首次寫入第i塊時,先從空閑空間中取得一個塊, 再將其地址寫到索引塊的第i個條目。

索引的方式優點在於:

●文件的創建、增大、縮小很方便;

●不會有碎片的問題;

●支持順序讀寫和隨機讀寫;

由於索引數據也是存放在磁碟塊的,如果文件很小,明明只需一塊就可以存放的下,但還是需要額外分配一塊來存放索引數據,所以缺陷之一就是存儲索引帶來的開銷。

如果文件很大,大到一個索引數據塊放不下索引信息,這時又要如何處理大文件的存放呢?我們可以通過組合的方式,來處理大文件的存儲。

先來看看 鏈表+索引 的組合,這種組合稱為 鏈式索引塊 ,它的實現方式是在 索引數據塊留出一個存放下一個索引數據塊的指針 ,於是當一個索引數據塊的索引信息用完了,就可以通過指針的方式,找到下一個索引數據塊的信息。那這種方式也會出現前面提到的鏈表方式的問題,萬一某個指針損壞了,後面的數據也就會無法讀取了。

還有另外一種組合方式是 索引+索引 的方式,這種組合稱為多級索引塊,實現方式是通過一個索引塊來存放多個索引數據塊,一層套一層索引, 像極了俄羅斯套娃是吧๑乛◡乛๑ 

前面說到的文件的存儲是針對已經被佔用的數據塊組織和管理,接下來的問題是,如果我要保存一個數據塊, 我應該放在硬碟上的哪個位置呢?難道需要將所有的塊掃描一遍,找個空的地方隨便放嗎?

那這種方式效率就太低了,所以針對磁碟的空閑空間也是要引入管理的機制,接下來介紹幾種常見的方法:

●空閑表法

●空閑鏈表法

●點陣圖法

空閑表法

空閑表法就是為所有空閑空間建立一張表,表內容包括空閑區的第一個塊號和該空閑區的塊個數,注意,這個方式是連續分配的。如下圖:

當請求分配磁碟空間時,系統依次掃描空閑表裡的內容,直到找到一個合適的空閑區域為止。當用戶撤銷一個文件時,系統回收文件空間。這時,也需順序掃描空閑表,尋找一個空閑表條目並將釋放空間的第一個物理塊號及它佔用的塊數填到這個條目中。

這種方法僅當有少量的空閑區時才有較好的效果。因為,如果存儲空間中有著大量的小的空閑區,則空閑表變得很大,這樣查詢效率會很低。另外,這種分配技術適用於建立連續文件。

空閑鏈表法

我們也可以使用鏈表的方式來管理空閑空間,每一個空閑塊里有一個指針指向下一個空閑塊,這樣也能很方便的找到空閑塊並管理起來。如下圖:

當創建文件需要一塊或幾塊時,就從鏈頭上依次取下一塊或幾塊。反之,當回收空間時,把這些空閑塊依次接到鏈頭上。

這種技術只要在主存中保存一個指針, 令它指向第一個空閑塊。其特點是簡單,但不能隨機訪問,工作效率低,因為每當在鏈上增加或移動空閑塊時需要做很多1/0操作,同時數據塊的指針消耗了一定的存儲空間。

空閑表法和空閑鏈表法都不適合用於大型文件系統,因為這會使空閑表或空閑鏈表太大。

點陣圖法

點陣圖是利用二進制的一位來表示磁碟中一個盤塊的使用情況,磁碟上所有的盤塊都有一個二進制位與之對應。

當值為0時,表示對應的盤塊空閑,值為1時,表示對應的盤塊已分配。它形式如下:

在Linux文件系統就採用了點陣圖的方式來管理空閑空間,不僅用於數據空閑塊的管理,還用於inode空閑塊的管理,因為inode也是存儲在磁碟的,自然也要有對其管理。

前面提到Linux是用點陣圖的方式管理空閑空間,用戶在創建一個新文件時, Linux 內核會通過inode的點陣圖找到空閑可用的inode,並進行分配。要存儲數據時,會通過塊的點陣圖找到空閑的塊,並分配,但仔細計算一下還是有問題的。

數據塊的點陣圖是放在磁碟塊里的,假設是放在一個塊里,一個塊4K,每位表示一個數據塊,共可以表示4 * 1024 * 8 = 2^15個空閑塊,由於1個數據塊是4K大小,那麼最大可以表示的空間為2^15 * 4 * 1024 = 2^27個byte,也就是128M。

也就是說按照上面的結構,如果採用(一個塊的點陣圖+ 一系列的塊),外加一(個塊的inode的點陣圖+一系列的inode)的結構能表示的最大空間也就128M,

這太少了,現在很多文件都比這個大。

在Linux文件系統,把這個結構稱為一個 塊組 ,那麼有N多的塊組,就能夠表示N大的文件。

最終,整個文件系統格式就是下面這個樣子。

最前面的第一個塊是引導塊,在系統啟動時用於啟用引導,接著後面就是一個一個連續的塊組了,塊組的內容如下:

● 超級塊 ,包含的是文件系統的重要信息,比如inode總個數、塊總個數、每個塊組的inode個數、每個塊組的塊個數等等。

● 塊組描述符 ,包含文件系統中各個塊組的狀態,比如塊組中空閑塊和inode的數目等,每個塊組都包含了文件系統中「所有塊組的組描述符信息」。

● 數據點陣圖和inode點陣圖 ,用於表示對應的數據塊或inode是空閑的,還是被使用中。

● inode 列表 ,包含了塊組中所有的inode, inode 用於保存文件系統中與各個文件和目錄相關的所有元數據。

● 數據塊 ,包含文件的有用數據。

你可以會發現每個塊組里有很多重復的信息,比如 超級塊和塊組描述符表,這兩個都是全局信息,而且非常的重要 ,這么做是有兩個原因:

●如果系統崩潰破壞了超級塊或塊組描述符,有關文件系統結構和內容的所有信息都會丟失。如果有冗餘的副本,該信息是可能恢復的。

●通過使文件和管理數據盡可能接近,減少了磁頭尋道和旋轉,這可以提高文件系統的性能。

不過,Ext2 的後續版本採用了稀疏技術。該做法是,超級塊和塊組描述符表不再存儲到文件系統的每個塊組中,而是只寫入到塊組0、塊組1和其他ID可以表示為3、5、7的冪的塊組中。

在前面,我們知道了一個普通文件是如何存儲的,但還有一個特殊的文件,經常用到的目錄,它是如何保存的呢?

基於Linux 一切切皆文件的設計思想,目錄其實也是個文件,你甚至可以通過vim打開它,它也有inode, inode 裡面也是指向一些塊。

和普通文件不同的是, 普通文件的塊裡面保存的是文件數據,而目錄文件的塊裡面保存的是目錄裡面一項一項的文件信息 。

在目錄文件的塊中,最簡單的保存格式就是 列表 ,就是一項一項地將目錄下的文件信息(如文件名、文件inode.文件類型等)列在表裡。

列表中每一項就代表該目錄下的文件的文件名和對應的inode,通過這個inode,就可以找到真正的文件。

通常,第一項是「則」,表示當前目錄,第二項是.,表示上一級目錄, 接下來就是一項一項的文件名和inode。

如果一個目錄有超級多的文件,我們要想在這個目錄下找文件,按照列表一項一項的找,效率就不高了。

於是,保存目錄的格式改成 哈希表 ,對文件名進行哈希計算,把哈希值保存起來,如果我們要查找一個目錄下面的文件名,可以通過名稱取哈希。如果哈希能夠匹配上,就說明這個文件的信息在相應的塊裡面。

Linux系統的ext文件系統就是採用了哈希表,來保存目錄的內容,這種方法的優點是查找非常迅速,插入和刪除也較簡單,不過需要一些預備措施來避免哈希沖突。

目錄查詢是通過在磁碟上反復搜索完成,需要不斷地進行/0操作,開銷較大。所以,為了減少/0操作,把當前使用的文件目錄緩存在內存,以後要使用該文件時只要在內存中操作,從而降低了磁碟操作次數,提高了文件系統的訪問速度。

感謝您的閱讀,希望您能攝取到知識!加油!沖沖沖!(發現光,追隨光,成為光,散發光!)我是程序員耶耶!有緣再見。<-biubiu-⊂(`ω´∩)

C. 內存卡內存是屬於內部存儲還是系統內存或外存儲卡另外兩種分別屬於什麽

是外部存儲,系統內存指的是存儲系統app和文件的,這部分存儲必須root後才可以自己存儲文件,內部存儲就是你可以隨意下載app,存儲各種資料的部分,內存卡是擴展的外部存儲。

D. 簡述計算機存儲系統的三級存儲體系概念

高速緩存:位於計算機內部或某些設備內部,速度比較快; 內部存儲器:位於計算機內部,就是通常所說的內存; 外部存儲器:就是光碟,U盤,磁帶等等。 通常計算機內還有寄存器的,這個速度是最快的,不過容量太小。

E. 雲計算時代操作系統Kubernetes之存儲(中)

我們在POD中定義數據卷的時候,必須指定數據卷的類型。由於存儲技術的發展遠遠早於Kubernetes平台的誕生,並且隨著Kubernetes的日益流行,新的存儲技術和方案也在日新月異,因此數據卷可以說理所當然的有很多很多類型,有些是通用的類型,而有些需要底層特定存儲技術的支持,下邊是Kubernetes支持的數據卷類型不完全清單:

- emptyDir類型,emptyDir類型的數據卷允許POD將數據保存到指定的文件夾中,並且數據在POD的整個生命周期中可見。保存數據的文件夾在POD啟動前被創建,並且剛開始文件夾為空,這也是叫empty的緣由。

- hostPath類型,從宿主機的文件系統掛載文件到POD中。

- nfs類型,NFS類型的存儲卷掛載到POD中。

- cephfs,cinder,fc等,用來支持不同類型的網路存儲。

- configMap,secret,downwardAPI,以及projected類型,四種卷類型,用來將POD和Kubernetes的相關信息通過文件暴露給外部,這些卷類型主要用來配置應用程序。這幾種類型筆者會在後續的文章中詳細介紹。

- persistentVolumeClaim類型(PVC),一種輕量級的集成外部存儲能力的方案。在這種類型的數據卷類型中,PersistentVolumeClaim類型的存儲對象指向PersistentVolume類型的存儲對象,真實的外部存儲系統由PersistentVolume這個對象來引用。由於這是Kuberntes強烈建議大家使用的存儲類型,因此筆者會在後續的文章中,單獨來詳細介紹。

- csi類型,一種通過CSI來擴展存儲的方式。這種方式允許所有實現了CSI(Container Storage Interface)介面的存儲實現能夠被POD引用,在POD初始化的過程中,CSI驅動會將存儲卷attach到POD上。

上邊羅列的只是數量巨大存儲卷類型中很小一部分,每種類型都有對應的使用場景。筆者在本篇以及後續的文章中,著重介紹最具代表性的幾個類型,來幫助大家理解Kubernetes存儲體系。首先我們從最簡單的emptyDir類型開始,這種類型的數據卷用來在容器重啟場景中保持狀態。

還記得我們在前邊文章中介紹如何在同一個POD中部署兩個容器實例的例子嗎?當時的做法是通過post-start hook來執行fortune命令產生一個名言警句寫入文件中,運行在另外一個容器中的Nginx伺服器由於掛載了相同的volume,因此會直接將這個信息返回給客戶端請求。這個保存fortune產生的名言警句的文件在容器的文件系統中,這就意味著當容器由於liveness probe三次失敗重啟後,你會看到不同的名言警句,雖然說看起來問題不大,但是從原理上講,數據由於容器重啟丟失。

我們來驗證一下上邊的推理是否符合事實,請在自己的本地環境中部署yunpan-fs.yaml,然後執行kubectl port-forward yunpan-fs 1080:80來創建客戶端代理,訪問服務返回名言警句。然後通過命令讓Nginx重新啟動,重新訪問服務,你可以看到兩次返回的數據不一致,這就證明了保存在容器文件系統的數據,在容器重啟的場景下,不會保持。在筆者的本地環境輸出如下圖:

如上圖所示,重啟容器後會產生新的名言警句,這就意味著容器重啟後保存在文件系統中的數據丟失了。如果我們要在這種重啟的場景中保持數據狀態,那麼就必須確保數據被保存在數據卷中,而emptyDir是解決這個問題的完美方案。當emptyDir類型的數據卷被掛載到容器中,應用寫到掛載目錄的數據文件,在容器重啟後,能夠繼續保持。

emptyDir類型的數據卷可以讓容器即便是重啟後,可以讓寫到文件中的數據狀態保持;或者容器的文件系統為只讀,但是應用在運行的過程中,需要寫狀態到文件中等場景,我們也可以使用emptyDir類型的數據卷來在同一個POD的多個容器之前,進行數據共享。

廢話不多說了,咱直接修改fortune pod來把post-start hook執行fortune命令返回的名言警句寫到emptyDir類型的數據卷中,這樣當容器重啟後,就不會出現數據丟失了。我們其實要修改的地方不多,主要包括:1,給POD增加emptyDir類型的數據卷定義;2,在容器中將這個數據卷掛載到指定的目錄。

另外我們對命令的執行進行了一點點優化,post-start hook會在每次容器啟動後都會執行,因此我們需要防止重啟後對fortune命令輸出對已經存在文件的覆蓋,因此我們對post-start命令腳本也做了優化,如下圖所示:

註:post-start hook腳本被更新成"ls /usr/share/nginx/html/quote || (apk add fortune && fortune > /usr/share/nginx/html/quote)",如果讀者對Linux shell腳本不是很熟悉,這句肯定看的雲里霧里,我們來稍微解釋一下。首先ls命令先執行,我們這里用ls來檢查quote文件是否存在,你有所不值得是,當ls後邊給的文件存在的時候,命令返回0,而如果不存在,就返回非0。由於我們使用||將兩個表達式進行了組合,因此當左邊的ls quote執行成功,那麼右邊的語句就壓根不會執行。通過這種方式,如果quote文件存在,那麼咱就直接跳過了。而當文件不存在,才需要執行右邊的一串命令,安裝fortune和執行fortune來產生名言警句。這句腳本確保名言警句只被生成並寫入一次,也就是只在容器第一次啟動的時候。

如上圖所示,我們定義了emptyDir類型的數據卷content,並掛載到nginx容器指定目錄/usr/share/nginx/html(這個是Nginx伺服器默認用來掃描靜態資源的目錄)。在POD中配置volume需要提供配置參數,接下來我們詳細聊聊如何配置emptyDir類型的數據卷。

對於emptyDir類型的存儲卷,Kubernetes要求配置如下兩個屬性:

- medium,文件夾的存儲介質,如果留空不配置,那麼默認就是宿主機的(工作節點)磁碟。除了磁碟之外,我們還可以配置Memory,這會導致數據卷使用tmpfs文件系統,這是一個在內存文件系統。

- sizeLimit,文件夾需要的磁碟空間大小,比如我們如果需要限制這個文件夾中文件的大小為10M,那麼就可以設置為10Mi。

註:我們上邊的例子中,emptyDir類型的數據卷content未顯示的定義任何欄位,取默認值,大括弧非常明確的表達了這一點,但是並不是必須的。

在POD中定義完數據卷只完成了工作的一半,工作的另一半就是將數據卷掛載到容器實例中,這通過在容器spec.containers域通過volumeMounts來引用。volumeMounts除了要制定name之外,還需要包含mountPath欄位,來指定數據卷被具體掛載到容器文件系統的文件目錄樹的那個路徑。筆者上邊提供的例子中,emptyDir類型的數據卷被掛載到了/usr/share/ngxin/html目錄,因為這也是post-start hook將名言警句寫到文件的路徑。

由於使用了emptyDir類型的數據卷之後,名言警句被寫入到了宿主機的文件系統,因此數據在POD的整個生命周期都會保持,因此我們無論重啟nginx容器多少次,返回的數據(名言警句)都不應該有任何變化。

接下來,我們將這個新版本基於fortune命令的名言警句網站部署到Kubernetes集群,並人為的讓nginx容器重啟,你會發現無論我們重啟多少次,quote介面返回的內容都一樣。背後的原理是,因為我們只在容器第一次啟動的時候,才創建quote文件,並且當容器重啟重新掛載數據卷後,這個quote文件仍然存在。你可能會問,這個文件到底在宿主機的啥地方啊,可以運行kubectl exec yunpan-emptydir -- mount --list | grep nginx/html來發現,如下圖所示:

如上圖所示,通過使用emptyDir類型的數據局content,我們成功讓容器重啟之後,保持數據狀態。接下來,我們繼續看另外一個例子,如何通過數據卷在兩個容器時間共享數據。

如筆者前邊多次提到,我們也可以使用emptyDir類型的數據卷來在同一個POD中的兩個容器之間共享數據,這里需要注意的是,我們無法通過emptyDir類型的數據卷在不同PDO中不同的容器間共享數據,請繼續閱讀。

我們基於fortune的名言警句網站目前略顯無趣,因為每次都返回相同的諺語,我們希望這個行為能夠增強,比如每30分鍾更換一次。為了實現這個功能,我們需要將post-start hook替換成容器,並且在容器中,fortune命令每30秒運行一次。為了使大家學習更加容易,筆者已經構建好了需要的容器,並上傳到Docker Hub,大家可以自行通過命令 docker pull qigaopan/yunpan-fortune:v1.0拉取。

好了,我們已經把需要的容器鏡像都准備好了,接下來我們來編寫POD的YAML文件,如下圖所示:

如上圖所示,emptyDir類型的數據卷被兩個容器共享(共同掛載),容器fortune將數據寫到content數據卷,在nginx容器中,相同的數據卷被以read-only的模式被掛載到nginx的默認目錄。

註:我們在前邊文章中反復強調過一個事實,同一個POD中的多個容器幾乎是同時啟動的,因此可能存在微小的一段時間,ngxin伺服器已經成功運行起來,但是quote文件尚未生成。聰明的你可能想到了,要避免這種場景,我們可以使用初始化容器。

接著,我們將fortune POD部署到Kubernetes集群中,兩個容器幾乎同時開始運行。fortune容器每30秒更新一次諺語(名言警句),nginx容器基於相同的數據文件服務客戶端請求,當POD中的兩個容器都Ready後,可以驗證一下輸出,是否每30秒後,quote請求對應的諺語的返回會更新。

由於在fortune例子中emptyDir類型的數據卷會在宿主機的磁碟上創建共享目錄,因此數據讀寫的性能,完全取決於工作節點上硬體的類型。如果我們的應用需要高性能的IO操作,那麼磁碟可能不是最合適的存儲介質。

Kubernetes允許我們使用tmpfs文件系統來創建數據卷,而tmpfs將數據保存在內存中,我們只需要在POD的YAML文件中,把emptyDir的欄位meim設置為Memory。

其實Memory類型的數據卷除了提供較高的IO之外,數據安全性也比磁碟高。由於數據並沒有落盤,因此數據不容易被惡意攻擊者竊取,因此建議大家可以在自己的項目上考慮這種數據卷類型。另外我們也可以通過參數sizeLimit來約束數據卷的size,特別對於Memory類型的數據卷來說,請務必設置sizeLimit,以防內存被耗盡。

在前邊的內容中,我們將目光主要集中在如何在POD中定義數據卷,而沒有詳細介紹volume是如何掛載到容器中的,接下來我們來看看在容器中掛載數據卷具體需要設置哪些參數。如下圖所示,是我們在新版本的fortune POD定義中關於content數據卷掛載的配置:

從上圖可以看出,掛載數據卷到容器中,我們需要至少配置兩個欄位:name和mountPath,其中name欄位是我們在POD定義的數據卷的名字,而mountPath欄位指定了數據卷應該掛載到容器文件系統的文件數的那個目錄。

除了這兩個必須提供的參數之外,我們還有一些可選的參數可以配置,詳細的可配置參數清單如下:

- name欄位,如筆者上邊的介紹,name欄位就是我們在POD中掛載的數據卷的name

- mountPath欄位,前文應介紹,不累述

- readOnly欄位,是否以只讀的模式掛載數據卷,默認是false,也就是以讀寫的方式掛載數據卷。

- mountPropagation欄位,設置如果在數據卷內部掛載額外的文件系統會發生什麼。有幾個選項,默認是none,指如果宿主機在數據卷中掛在了額外的文件系統,容器不會收到任何通知,反之亦然;還有兩個選項HostToContainer和Bidirectional,具體含義如命名,如果要了解詳情,可以參考官方文檔。

- subPath欄位,默認為「」,意味著整個數據卷都被掛載到mountPath指定的目錄,當設置為非空的字元串後,只有subPath指定的文件路徑被掛載到容器中

- subPathExpr欄位,使用類似於shell提供的$(ENV_VAR_NAME)語句,只能使用環境變數。

在大部分場景下,我們只需要設置name和mountPath就可以了,頂多額外多配置參數readOnly。mountPropagation參數只有在一些復雜配置的場景下才會用到,當我們用一個數據卷來提供不同的文件夾給不同的容器的時候,subPath和subPathExpr非常有用。另外這兩個參數也可以用作多個PDO共享一個數據卷的場景。

好了,這篇文章的內容就這么多了,下篇文章我們繼續介紹存儲,看看如何訪問宿主機文件系統中的數據文件,敬請期待!

F. 計算機系統中的存儲器系統是指ram存儲器

1 . 計算機的RAM(Random Access Memory)的別名為隨機存取記憶體,它相當於計算機上的移動存儲,用來存儲和保存數據的。它在任何時候都可以讀寫,RAM通常是作為操作系統或其他正在運行程序的臨時存儲介質(可稱作系統內存)。


G. 分布式文件存儲系統通過什麼方式提高可用性和安全性

分布式存儲的六大優點


1. 高性能

一個具有高性能的分布式存戶通常能夠高效地管理讀緩存和寫緩存,並且支持自動的分級存儲。分布式存儲通過將熱點區域內數據映射到高速存儲中,來提高系統響應速度;一旦這些區域不再是熱點,那麼存儲系統會將它們移出高速存儲。而寫緩存技術則可使配合高速存儲來明顯改變整體存儲的性能,按照一定的策略,先將數據寫入高速存儲,再在適當的時間進行同步落盤。

2. 支持分級存儲

由於通過網路進行松耦合鏈接,分布式存儲允許高速存儲和低速存儲分開部署,或者任意比例混布。在不可預測的業務環境或者敏捷應用情況下,分層存儲的優勢可以發揮到最佳。解決了目前緩存分層存儲最大的問題是當性能池讀不命中後,從冷池提取數據的粒度太大,導致延遲高,從而給造成整體的性能的抖動的問題。

3. 多副本的一致性

與傳統的存儲架構使用RAID模式來保證數據的可靠性不同,分布式存儲採用了多副本備份機制。在存儲數據之前,分布式存儲對數據進行了分片,分片後的數據按照一定的規則保存在集群節點上。為了保證多個數據副本之間的一致性,分布式存儲通常採用的是一個副本寫入,多個副本讀取的強一致性技術,使用鏡像、條帶、分布式校驗等方式滿足租戶對於可靠性不同的需求。在讀取數據失敗的時候,系統可以通過從其他副本讀取數據,重新寫入該副本進行恢復,從而保證副本的總數固定;當數據長時間處於不一致狀態時,系統會自動數據重建恢復,同時租戶可設定數據恢復的帶寬規則,最小化對業務的影響。

4. 容災與備份

在分布式存儲的容災中,一個重要的手段就是多時間點快照技術,使得用戶生產系統能夠實現一定時間間隔下的各版本數據的保存。特別值得一提的是,多時間點快照技術支持同時提取多個時間點樣本同時恢復,這對於很多邏輯錯誤的災難定位十分有用,如果用戶有多台伺服器或虛擬機可以用作系統恢復,通過比照和分析,可以快速找到哪個時間點才是需要回復的時間點,降低了故障定位的難度,縮短了定位時間。這個功能還非常有利於進行故障重現,從而進行分析和研究,避免災難在未來再次發生。多副本技術,數據條帶化放置,多時間點快照和周期增量復制等技術為分布式存儲的高可靠性提供了保障。

5. 彈性擴展

得益於合理的分布式架構,分布式存儲可預估並且彈性擴展計算、存儲容量和性能。分布式存儲的水平擴展有以下幾個特性:

1) 節點擴展後,舊數據會自動遷移到新節點,實現負載均衡,避免單點過熱的情況出現;

2) 水平擴展只需要將新節點和原有集群連接到同一網路,整個過程不會對業務造成影響;

3) 當節點被添加到集群,集群系統的整體容量和性能也隨之線性擴展,此後新節點的資源就會被管理平台接管,被用於分配或者回收。

6. 存儲系統標准化

隨著分布式存儲的發展,存儲行業的標准化進程也不斷推進,分布式存儲優先採用行業標准介面(SMI-S或OpenStack Cinder)進行存儲接入。在平台層面,通過將異構存儲資源進行抽象化,將傳統的存儲設備級的操作封裝成面向存儲資源的操作,從而簡化異構存儲基礎架構的操作,以實現存儲資源的集中管理,並能夠自動執行創建、變更、回收等整個存儲生命周期流程。基於異構存儲整合的功能,用戶可以實現跨不同品牌、介質地實現容災,如用中低端陣列為高端陣列容災,用不同磁碟陣列為快閃記憶體陣列容災等等,從側面降低了存儲采購和管理成本。

H. 塊儲存,對象存儲,文件存儲的區別和聯系

通常來講,磁碟陣列都是基於Block塊的存儲,而所有的NAS產品都是文件級存儲。
1. 塊存儲:DAS SAN
a) DAS(Direct Attach Storage): 是直接連接於主機伺服器的一種存儲方式,每台伺服器有獨立的存儲設備,每台主機伺服器的存儲設備無法互通,需要跨主機存取資料室,必須經過相對復雜的設定,若主機分屬不同的操作系統,則更復雜。
應用:單一網路環境下且數據交換量不大,性能要求不高的環境,技術實現較早。
b) SAN(Storage Area Network): 是一種高速(光纖)網路聯接專業主機伺服器的一種存儲方式,此系統會位於主機群的後端,它使用高速I/O聯接方式,如:SCSI,ESCON及Fibre-Channels.特點是,代價高、性能好。但是由於SAN系統的價格較高,且可擴展性較差,已不能滿足成千上萬個CPU規模的系統。
應用:對網速要求高、對數據可靠性和安全性要求高、對數據共享的性能要求高的應用環境中。

2. 文件存儲
通常NAS產品都是文件級存儲。
NAS(Network Attached Storage):是一套網路存儲設備,通常直接連在網路上並提供資料存取服務,一套NAS儲存設備就如同一個提供數據文件服務的系統,特點是性價比高。
它採用NFS或CIFS命令集訪問數據,以文件為傳輸協議,可擴展性好、價格便宜、用戶易管理。目前在集群計算中應用較多的NFS文件系統,但由於NAS的協議開銷高、帶寬低、延遲大,不利於在高性能集群中應用。

3. 對象存儲:
總體上講,對象存儲同時兼具SAN高級直接訪問磁碟特點及NAS的分布式共享特點。
核心是將數據通路(數據讀或寫)和控制通路(元數據)分離,並且基於對象存儲設備(OSD),構建存儲系統,每個對象存儲設備具備一定的職能,能夠自動管理其上的數據分布。
對象儲存結構組成部分(對象、對象存儲設備、元數據伺服器、對象存儲系統的客戶端)
3.1 對象
一個對象實際就是文件的數據和一組屬性信息的組合。
3.2 對象存儲設備(OSD)
OSD具有一定的智能,它有自己的CPU、內存、網路和磁碟系統。
OSD提供三個主要功能:包括數據存儲和安全訪問
(1)數據存儲 (2)智能分布 (3)每個對象元數據的管理
3.3 元數據伺服器(Metadata Server , MDS)
MDS控制Client與OSD對象的交互,主要提供以下幾個功能:
(1) 對象存儲訪問
允許Client直接訪問對象,OSD接收到請求時先驗證該能力,再訪問。
(2) 文件和目錄訪問管理
MDS在存儲系統上構建一個文件結構,限額控制、包括目錄、文件的創建、訪問控制等
(3) Client Cache 一致性
為提高性能,在對象存儲系統設計時通常支持Client的Cache。因此帶來了Cache一致性的問題,當Cache文件發生改變時,將通知Client刷新Cache,以防Cache不一致引發的問題。
對象存儲:
一個文件包含了屬性(術語叫matadata元數據,例如該文件的大小、修改時間、存儲路徑等)以及內容(簡稱數據)。
以往的文件系統,存儲過程將文件按文件系統的最小塊來打散,再寫進硬碟,過程中沒有區分元數據(metadata)和數據。而在每個塊最後才會告知下一個塊的地址,因此只能一個一個讀,速度慢。
而對象存儲則將元數據獨立出來,控制節點叫元數據伺服器(伺服器+對象存儲管理軟體),裡面主要存儲對象的屬性(主要是對象的數據被打散存放到了那幾台分布式伺服器中的信息),而其他負責存儲數據的分布式伺服器叫做OSD,主要負責存儲文件的數據部分。當用戶訪問對象時,會先訪問元數據伺服器,元數據伺服器只負責反饋對象存儲在那些OSD。假設反饋文件A存儲在B,C,D三台OSD,那麼用戶就會再次訪問三台OSD伺服器去讀取數據。
這時三台OSD同時對外傳輸數據,因此傳輸的速度就加快了。OSD伺服器數量越多,這種讀寫速度的提升就越大。
另一方面,對象存儲軟體有專門的文件系統,所以OSD對外又相當於文件伺服器,那麼就不存在文件共享方面的困難了,也解決了文件共享方面的問題。
因此對象存儲的出現,很好的結合了塊存儲與文件存儲的優點。

為什麼還要使用塊存儲和文件存儲:
1.有一類應用是需要存儲直接裸盤映射的,比如資料庫。因為資料庫需要存儲裸盤映射給自己後,再根據自己的資料庫文件系統來對了裸盤進行格式化,因此不能採用其他已經被格式化為某種文件系統的存儲。此類更適合塊存儲。
2.對象存儲的成本比普通的文件存儲還是較高,需要購買專門的對象存儲軟體以及大容量硬碟。如果對數據量要求不是海量,只是為了作文件共享的時候,直接用文件存儲的形式就好了,性價比高。

I. 誰給我解釋下內部存儲,系統存儲,系統緩存,內

1、內部存儲:內置在設備內的存儲器,區別於外置存儲,外置存儲是在外部通過數據線、卡槽、網線等其他方式連接至設備的存儲器。內部存儲是硬體,是實體存儲設備。
2、系統存儲:用於存放系統文件的存儲空間。只得是實體存儲設備內存放系統的那部分空間。
3、系統緩存:用於存放系統運行時需要使用或產生的臨時文件的存放空間,為了提高系統調取文件的速度,每次都會將該文件相鄰的文件的一塊調取到系統緩存,以便系統下次調取到該相鄰文件時可以加快調取速度。這個存放相鄰調取文件的地方叫做緩存。顧名思義,臨時文件在該處做個緩沖存儲。存放緩存的存儲器是實體存儲器,是硬體,但是緩存本身是一個空間概念,只是個大小。
4、內存,由於普通存儲器的存取速度不足以滿足CPU的處理速度,我們需要一個速度非常高的存儲設備來連接CPU和普通存儲器。緩存是一種方式,但是還不夠,所以需要在中間在放置個內存。它的空間比緩存大,比外部存儲器小,速度比緩存慢但是比外部存儲器快。是實體存儲器,是硬體。