【以下内容皆是本人分享計算機知識,一切用于違法犯罪與本人無關!】
文章目錄
★本文的目标讀者★LVM 概述★LVM 的三個基本概念★常見的用法★不那麼常見的用法★【可移動存儲】的注意事項★簡述 LVM 的原理★RAID 簡介★(高級教程)LVM 自帶的 RAID 功能★為啥需要“磁盤加密”?★(高級教程)LVM 與 LUKS 組合★(高級教程)LVM 與 TC 組合★(高級教程)LVM【同時組合】TC 與 LUKS
★本文的目标讀者◇預備知識為了講解 LVM,俺假定你已經掌握了如下知識:
Linux 基本的命令行技能(命令行菜鳥請看“這篇掃盲”)Linux 磁盤分區的基本知識(比如:創建分區、删除分區 ......)Linux 文件系統的基本知識(比如:格式化文件系統,挂載文件系統 ......)磁盤加密工具 dm-crypt(LUKS)的基本知識(掃盲教程參見“這裡”)磁盤加密工具 TrueCrypt/VeraCrypt 的基本知識(掃盲教程參見“這裡”和“這裡”)
◇新手須知如果你之前沒有玩過 LVM,強烈建議如下:1. 先在【虛拟機】中嘗鮮 LVM。【不要】一開始就拿自己的真實環境做試驗,以免把你的數據搞壞(注:俺寫了虛拟機的掃盲教程,在“這裡”)2. 當你要在真實環境中玩 LVM,一定要先做好【數據備份】
◇老手須知如果你之前已經玩過 LVM,并且比較熟悉,可以隻看本文中标注了 (高級教程)的那個幾個章節。
★LVM 概述◇LVM 是啥?LVM 是洋文“Logical Volume Manager”的縮寫。理論上,這個玩意兒可以用在不同的操作系統平台(Linux or UNIX)。 但本文隻讨論 Linux 上的使用。
◇LVM 有啥用?為了說明 LVM 的好處,說幾個例子: 舉例1 很多人在裝系統的時候,經常會為【分區】而糾結——如果你把所有數據都放到一個分區,萬一這個分區的文件系統壞了,所有數據都丢了。如果你劃分了多個區,用來放不同的數據;每個分區設多大,會比較傷腦筋——分區太大浪費了,分區太小又怕将來不夠用。 有了 LVM 之後,你可以依靠 LVM 來創建邏輯分區。萬一某個邏輯分區不夠用,可以對該邏輯分區【動态擴容】(原有數據不受影響)。 舉例2 假設你的電腦上有2塊 500GB 的硬盤,然後你想要搞一個 1TB 的分區。就可以用 LVM 來實現。 舉例3 假設你的電腦上有2塊 500GB 的硬盤,然後你想要搞3個分區,每個都是 300GB。 如果用傳統的分區方式,就很難搞;而用 LVM 就可以輕松搞定。 其它優勢 上述幾個例子,體現的都是“空間利用率”方面的優勢。LVM 【至少】還有如下幾個優勢:
與 RAID 工具的無縫整合與磁盤加密工具的無縫整合邏輯分區的【緩存】(cache)功能邏輯分區的【快照】(snapshot)功能......
◇LVM 與 Linux 的關系作為一個軟件,LVM 包括兩部分:内核模塊 & 命令行工具。 内核模塊 Linux 内核在很早以前(kernel 2.4 版本)就已經整合了 LVM 的功能。也就是說,如今市面上的發行版,其内核都已經支持 LVM 了。 命令行工具 光内核支持還不夠,你還需要通過一些命令行工具才能進行相關的操作。 如今的主流發行版,在其【官方軟件倉庫】中都已經包含了 LVM 的軟件包。你隻需要從官方軟件倉庫就可以安裝它。一般來說,它的軟件包名稱叫做 lvm2
◇LVM 的版本——LVM1 與 LVM2 的區别剛才俺提到——大部分主流發行版,LVM 在軟件倉庫中的名稱叫 lvm2。顯然,應該還有一個叫 lvm1 的東東。 這就涉及到 LVM 的版本。 早期整合到 Linux 内核 2.4 版本的 LVM 叫做 LVM1。當内核發展到 2.6 版本時,LVM 進行了一次重大升級,改叫 LVM2。如今所說的 LVM 都是指 LVM2(LVM1 基本上已經淘汰)。 這兩者在“存儲格式”方面向前兼容(也就是說,用 LVM1 創建的卷,也可以用 LVM2 打開),并且兩者的“命令行用法”差不多(LVM2 保留了原有的命令,增加了一些新的命令) 本文後續部分所說的 LVM,如果沒有特别說明,都是指 LVM2。
★LVM 的三個基本概念◇物理卷——PV(Physical Volume)在 LVM 的術語中,“物理卷”(PV)用來對應【底層】的“物理硬盤 or 物理分區”。 你可以用 LVM 的命令行工具,把某個“物理硬盤”或“物理分區”創建成 PV。這個 PV 的容量也就是“物理硬盤 or 物理分區”的容量。
◇卷組——VG(Volume Group)通過 LVM 的命令行工具,還可以把多個 PV 納入到一個 VG(卷組)中。 你不妨把 VG 想象成一個【存儲池】,這個池子的容量也就是加入其中的所有 PV 的容量總和。
◇邏輯卷——LV(Logical Volume)在 LVM 的術語中,“邏輯卷”(LV)用來對應【上層】的“邏輯分區”。 你可以從 VG 中創建多個 LV。每次創建 LV 都如同從這個存儲池中分配空間,直到所有存儲空間都被分配完。 創建好 LV 之後,你可以對這個 LV 進行格式化,就得到一個可用的邏輯分區。
◇示意圖為了方便大夥兒理解,俺花了點力氣,畫了這張色彩斑斓的示意圖(如下)
這張圖很重要哦——後續聊“LVM 組合磁盤加密工具”,俺還會在這張圖上進行演繹。
★常見的用法 ◇創建 PV使用 pvcreate 命令創建 PV。你可以針對【硬盤分區】上創建 PV,也可以針對【整個硬盤】創建 PV,命令分别如下 針對【硬盤分區】創建 PV(俺拿 /dev/sdb1 這個設備名舉例,你要根據具體情況修改)
pvcreate /dev/sdb1
針對【整個硬盤】創建 PV(俺拿 /dev/sdc 這個設備名舉例,你要根據具體情況修改)
pvcreate /dev/sdc
為了驗證上述命令确實創建了一個 PV,你可以執行 pvs 命令,它會列出系統中所有 PV 的名稱。 (注:執行 pvcreate 命令之後,它會在對應設備的頭部寫入一個 LVM 的标志,表示這個設備已經被 LVM 用作“物理卷”)
◇創建 VG有了某個 PV之後,你就可以基于這個 PV 創建 VG。假設你之前已經在 /dev/sdb1 這個設備(物理分區)上創建了 PV,就可以用如下命令創建一個新的 VG,VG 的名稱是 VG_XXX(這個名稱純粹是為了舉例,你也可以用其它字母組合作為 VG 的名稱):
vgcreate VG_XXX /dev/sdb1
為了驗證上述命令确實創建了一個 VG,你可以執行 vgs 命令,它會列出系統中所有 VG 的名稱。
◇VG 擴容(添加新的 PV)用上述方式創建的 VG 隻包含一個 PV。為了讓這個 VG 管理多個 PV,可以用 vgextend 命令加入其它 PV。舉例如下:
pvcreate /dev/sdc1 vgextend VG_XXX /dev/sdc1
(注:前一個命令創建了新的 PV,後一個命令把這個 PV 加入到剛才那個 VG 裡面) 添加了 PV 之後,你可以用如下命令查看該 VG,就可以看到它包含的 PV 數。
◇創建 LV
vgdisplay VG_XXX
創建 LV 包括如下幾個步驟: 步驟1 用如下命令,在 VG_XXX 中創建一個新的 LV,名叫 lv_xxxx(這個名字純屬舉例,你可以用别的字母組合)。
lvcreate -L 100G -n lv_xxxx VG_XXX
請注意:上述命令中的 -L 和 100G 都是大寫;其中的 G,表示 GB 為單位。你也可以用大寫 M 後綴表示多少兆字節(MB)。 為了驗證上述命令确實創建了一個 LV,你可以執行 lvs 命令,它會列出系統中所有 LV 的名稱,以及每個 LV 所屬的 VG。 如果你想要創建一個 LV,把 VG 的剩餘空間都用掉,可以用如下命令:
lvcreate --extents 100%FREE VG_XXX -n lv_xxxx
步驟2 “步驟1”隻是創建了一個“邏輯設備”,你還需要在該設備上創建文件系統。不同的文件系統,創建的命令也不同。下面以 ext4 為例,在剛才那個 lv_xxxx 之上創建 ext4 文件系統。
mkfs.ext4 /dev/VG_XXX/lv_xxxx
步驟3 最後,你用 mount 命令挂載新創建的文件系統。 友情提示 Linux 有個很有用的命令 lsblk,他以【樹狀風格】展示系統中所有“塊設備”(block device)的層次關系;如果該設備有挂載點,也會一并标注。 當你創建了 LV 之後,可以運行該命令體驗一下。
◇自動挂載 LV你可以編輯系統目錄下的 /etc/fstab 文件,把需要自動挂載的“LV 路徑”以及“挂載點路徑”添加到該文件中。
◇LV 擴容以剛才創建的 LV 舉例。如果你想把它的空間再增加 50GB,通過如下步驟: 步驟1 先執行如下命令:
lvresize -L 50G VG_XXX/lv_xxxx
(注:上述命令中,VG_XXX 是“VG 名稱”;lv_xxxx 是“LV 名稱”;兩者之間用【半角斜杠】相連接) 為了避免你搞錯,再看如下命令:
lvresize -L 50G VG_XXX/lv_xxxx
上述兩個命令,就差了一個【加号】。-L 50G 表示空間【再增加 50GB】;-L 50G 表示空間【增加到 50GB】。 步驟2 上述擴容命令僅僅是增加了“LV 的空間”,“文件系統”的空間【還沒】變化;為了讓“文件系統”也跟着 LV 而變大,需要再用一個“文件系統擴容命令”。 “文件系統擴容命令”與具體的“文件系統【類型】”相關,對于 EXT 家族(ext2、ext3、ext4),該命令是 resize2fs,用法如下:
resize2fs /dev/VG_XXX/lv_xxxx
ext 家族的好處是——支持【在線擴容】,你不需要卸載文件系統,就可以直接擴大其容量。 文件系統的差異 并【不是】所有的文件系統都支持“擴容”的功能。另外,有些文件系統雖然支持“擴容”,但不支持“在線擴容”——也就是說,你要先卸載文件系統,然後再執行“擴容命令”。
★不那麼常見的用法 ◇VG 改名如果你覺得 VG 的名稱不太滿意,可以用 vgrename 命令改名。舉例如下:
vgrename 舊名稱 新名稱
對 VG 改名之後,可以用 vgs 命令進行驗證。
◇LV 改名如果你覺得 LV 的名稱不太滿意,也可以改名,命令如下:
lvrename VG名稱 LV舊名稱 LV新名稱
對 LV 改名之後,可以用 lvs 命令進行驗證。
◇VG 縮容(移除 PV)假設你的某個 VG 中包含3個 PV,分别是:sda1,sdb2,sdc3;然後你想要把 sda1 移出該 VG。可以用如下步驟完成: 步驟1 你先要确保 sdb2 與 sdc3 有足夠的剩餘空間來轉儲 sda1 上已經存儲的數據。你可以先用 pvdisplay 命令分别看一下這3個 PV,評估空間的使用情況。 步驟2 假如你評估之後,另2個 PV 的剩餘空間足夠,就可以考慮用如下方式遷移。
pvmove /dev/sda1
(注:上述命令會智能地判斷 sda1 屬于哪個 VG,并把它的數據轉移到【同一個 VG】的其它 PV) 如果你想手動幹預。比如說:你想要指定 sda1 的數據全都轉移到 sdb2,可以用如下命令:
pvmove /dev/sda1 /dev/sdb2
(注:上述命令的前提是:sdb2 有足夠的剩餘空間來容納 sda1 已存儲的數據) 步驟3 完成上述步驟之後,再執行如下命令,那麼這個 VG 就【不再】包含 sda1 了。
vgreduce VG_XXX /dev/sda1
步驟4 完成上述命令之後,sda1 也不再屬于任何 VG 了。但 sda1 還是會被 Linux 内核當成 PV 來看待。前面聊 pvcreate 的時候,俺說過:pvcreate 命令會往設備頭部寫入一個 LVM 的标志。 如果你要把這個 sda1 設備拿去作其它用途,不希望它繼續被内核當作 PV,可以用如下命令清除該設備頭部的 LVM 标志。
pvremove /dev/sda1
反之,如果你要把這個 PV 拿去給别的 VG 使用,就【不】需要執行上述 pvremove 命令。
◇LV 縮容對 LV 縮容一定要小心。操作不當可能會導緻 LV 關聯的文件系統損壞。 LV 關聯的文件系統,如果【類型】不同,“縮容”的操作步驟也會有差異。 下面以 ext4 文件系統為例,假定 VG 名稱是 VG_XXX,LV 的名稱是 lv_xxxx 步驟1 為了保險起見,在做這個操作之前,先備份 LV 相關的數據。 步驟2 用 umount 命令卸載 LV 對應的文件系統。 步驟3 用如下命令先檢查一下文件系統,以防萬一。
e2fsck -f /dev/VG_XXX/lv_xxxx
步驟4 用如下命令收縮文件系統的存儲空間。在以下例子中,把存儲空間降低到 25GB。
resize2fs /dev/VG_XXX/lv_xxxx 25G
(再次提醒:resize2fs 命令僅用于 ext 家族的文件系統) 步驟5 用如下命令把 LV 的存儲空間也收縮到 25GB。
◇删除 LV
lvreduce -L 25G /dev/VG_XXX/lv_xxxx
假設你不想要某個 LV(包括它存儲的數據),通過如下步驟把它幹掉: 步驟1 先用 umount 命令卸載 LV 之上的文件系統(挂載點) 步驟2 假設該 LV 名叫 lv_xxxx,VG 名叫 VG_XXX,先用如下命令使之處于【不激活】狀态。
lvchange -an /dev/VG_XXX/lv_xxxx
步驟3 最後用如下命令徹底删除該 LV。
lvremove /dev/VG_XXX/lv_xxxx
最後再拔出該設備。
★簡述 LVM 的原理(如果你不關心底層的原理,可以跳過本章節)
◇PE(Physical Extent)當你用 pvcreate 命令創建 PV 時,該命令會(在邏輯上)把物理存儲介質劃分為了 N 個大小相同的塊,洋文稱之為“physical extent”,簡稱 PE。 你可以用 pvdisplay 命令查看某個 PV 的詳細信息,就能看到如下信息:
PE 的尺寸該 PV 中的 PE 總數已分配的 PE 總數未分配的 PE 總數......
◇LE(Logical Extent)LV 與 PV 有點類似——底層也是劃分為若幹個大小相同的塊,洋文稱之為“logical extent”,簡稱 LE。 一般情況下,LE 與 PE 是【一一對應】滴;特殊情況下(比如後面要聊的 RAID1),一個 LE 會同時對應多個 PE。
◇示意圖◇PE 的尺寸
LVM2 默認的 PE 尺寸是 4MiB。對于新手而言,用【默認的】PE 尺寸就可以啦。 某些老手可能想要自己控制 PE 尺寸——可以在創建 VG 時指定 PE 尺寸,命令如下:
vgcreate -s 64M VG_XXX /dev/sdb1
(注:上述命令指定新創建的 VG 使用 64MiB 作為 PE 尺寸;對于 LVM2,PE 最小值是 1KiB) 早期的 LVM1,對 LV 有一個硬性上限——每個 LV 最多隻能有 65534 個 LE(仔細看剛才那張圖的右上角,有 LVM1 的各項指标)。因為這個限制,早期的 LVM1 用戶,如果想要創建一個【超大】的 LV,需要在創建 VG 時就指定一個足夠大的“PE 尺寸”。 到了如今的 LVM2,每個 LV 包含的 LE 數量已經【沒有】那個上限了。所以“PE 尺寸”就不像以前那麼重要了。
◇VG 的元數據每個 VG 都有自己的一些元數據。比如剛才所說的“PE 尺寸”就是它的元數據之一;另外,“VG 名稱”與“VG 的 UUID”也算是它的元數據。
那“VG 的元數據”存儲在哪裡捏?它們保存在 PV 的頭部——當你創建 VG 時,至少要指定一個或多個 PV;新創建的 VG,其元數據就保存在這些 PV 頭部。如果這個 VG 後來又加入其它 PV,其元數據也會保存在這些新的 PV 中。元數據保存多份,也是為了達到某種冗餘。 你可以用命令vgcfgbackup把某個 VG 的元數據導出到單個文件中;需要的話,還可以再用命令vgcfgrestore導入。 某些愛思考的讀者會問:為啥要要把 VG 的元數據保存在 PV 頭部,為啥不存儲到某個系統目錄? 俺認為:其關鍵在于【數據自包含】。因為 PV 隸屬于 VG,VG 的元數據存儲在 PV 就達到【自包含】。當你在某個【外置存儲】中創建了 PV,然後又把這個“外置存儲”挂到另一台 Linux 電腦,另一個 Linux 内核依然能獲取該 PV 對應的“VG 元數據”。
★RAID 簡介 ◇啥是 RAID?RAID 是洋文“Redundant Array of Inexpensive Disks”的縮寫,中文稱之為“磁盤冗餘陣列”。 搞這個玩意兒的好處包括兩方面:其一,通過增加數據的【冗餘度】來提升其【可靠性】(RAID 有好幾種類型;除了 RAID0,其它各種類型都可以不同程度地提高可靠性)其二,提升“讀性能”或“寫性能”或“讀寫性能”(取決于你具體使用哪種 RAID 類型)
◇Linux 的 RAID 工具在 Linux 上,你既可以用mdadm也可以用 LVM 來實現 RAID。 因為本文是 LVM 教程,當然隻聊 LVM 如何實現 RAID。
◇RAID 的類型RAID 有很多種類型,詳細解釋參見維基百科的“這個鍊接”。LVM 已經支持如下幾種 RAID 類型:
RAID 0RAID 1RAID 4RAID 5RAID 6RAID 10
考慮到篇幅,俺挑幾種常用的 RAID 類型,在下一個章節介紹。介紹的時候,會順便說說該 RAID 類型的【原理】。
◇“軟 RAID”與“硬 RAID”硬 RAID “硬 RAID”需要在電腦主闆上插一個“RAID 硬件”(RAID 控制器)。然後由這個“RAID 硬件”來控制多塊磁盤——RAID 功能全靠該“RAID 硬件”來完成。 操作系統通過該“RAID 硬件”的驅動來與之打交道。在這種模式下,操作系統【看不到】具體的每一個磁盤。因此,這種這種模式的 RAID 對操作系統來說是【透明】滴。 軟 RAID 在這種模式下,每個磁盤都直接連到主闆上,操作系統可以看到每個磁盤,RAID 功能由操作系統層面(軟件層面)實現。故稱之為“軟 RAID”。 本文讨論的就是這種。
◇哪些同學需要考慮 RAID?使用 RAID 的【前提】是——你的電腦上同時裝了【多個】物理磁盤。如果沒有這個前提,搞 RAID 是沒意義滴。
★(高級教程)LVM 自帶的 RAID 功能 ◇RAID 0 的玩法原理 RAID0 有時候也稱作“帶區集 or 條紋集”。通俗地說就是:把 N 個設備湊成一個大的邏輯設備。每次要寫入數據時,先拆分為 N 等份,平均寫入每個設備。
空間利用率 完全不浪費(利用率接近 100%)。在所有 RAID 類型中,這種的空間利用率最高。 可靠性 雖然利用率最高,但可靠性最差(無冗餘)——任何一個設備壞掉,全完蛋。 操作步驟 先創建 N 個大小一樣的 PV(此處假設 N = 2),并加入到同一個 VG 裡面(假設 VG 名稱叫做 vg_raid)。具體如何做,前面已經聊過。 用如下命令可以創建一個名叫 lv_xxxx 的邏輯卷,并設定以 RAID0 方式存儲數據。
lvcreate --type raid0 --stripes 2 --extents 100%FREE -n lv_xxxx vg_raid
上述命令的參數說明:
參數
說明
--type raid0
采用 RAID 0 的方式存儲數據
--stripes 2
用來創建“帶區集”的設備數,在本示例中是 2對于 RAID0,該參數的最大值為 64
--extents 100%FREE
前面已經聊過,不再重複
最後,在這個新創建的 LV 之上創建文件系統(具體命令,前面已經聊過)。
◇RAID 1 的玩法原理 RAID1 有時候也稱作“鏡像”。也就是說,用 N 塊【大小一樣】的存儲空間,存儲相同的數據,以達到冗餘的目的。
空間利用率 在常見的 RAID 類型中,RAID1 的【空間利用率】最低(隻有 1/N)。 可靠性 可靠性最高(哪怕 N-1 個設備【同時】壞掉,數據都還在)。 操作步驟 先創建 N 個大小一樣的 PV(此處假設 N = 2),并加入到同一個 VG 裡面(假設 VG 名稱叫做 vg_raid)。具體如何做,前面已經聊過。 用如下命令可以創建一個名叫 lv_xxxx 的邏輯卷,并設定以 RAID1 方式存儲數據。
lvcreate --type raid1 --mirrors 1 --nosync --extents 100%FREE -n lv_xxxx vg_raid
上述命令的參數說明:
參數
說明
--type raid1
采用 RAID 1 的方式存儲數據
--mirrors 1
鏡像設備的數量。在本示例中用了兩個存儲設備,其中一個用作鏡像;如果是3個設備搞 RAID1,該參數就是 2(以此類推)(對于 RAID1,該參數的最大值為 9)
--nosync
創建 LV 的過程中【不】在幾個 PV 之間同步數據,可縮短該命令的執行時間。
最後,在這個新創建的 LV 之上創建文件系統(具體命令,前面已經聊過)。
◇RAID 5 的玩法原理 RAID5 是針對 RAID4 的改良。這2款的存儲風格與前面所說的 RAID0 類似(都用了 stripes 方式拆分數據);為了做到“可靠性”,RAID4 & RAID5 引入了校驗碼。它至少需要 N 個設備(N ≥ 3),數據寫入前,先拆分為 N-1 份,寫入其中 N-1 個設備,多出來的那個設備用來保存【校驗碼】。 俺用下面這張示意圖表示 RAID4 & RAID5 的存儲差異。RAID4 把校驗值全部放到同一個磁盤,會大大增加該磁盤的寫操作——每次有數據塊被修改,都要更新校驗值,都得寫這塊磁盤。這塊磁盤就會成為“寫操作”的瓶頸。 (由于 RAID4 明顯不如 RAID5,如今用的很少,所以俺就不聊 RAID4 了)
空間利用率 空間利用率 (N-1)/N,明顯高于 RAID1(1/N),但低于 RAID0(100%)。 可靠性 可靠性也不差,N 塊設備随便壞一塊,都可以恢複。同時壞兩塊,數據會完蛋(但同時壞兩塊的概率很低)。 操作步驟 先創建 N 個大小一樣的 PV(此處假設 N = 3),并加入到同一個 VG 裡面(假設 VG 名稱叫做 vg_raid)。具體如何做,前面已經聊過。 用如下命令可以創建一個名叫 lv_xxxx 的邏輯卷,并設定以 RAID5 方式存儲數據。
lvcreate --type raid5 --stripes 2 --nosync --extents 100%FREE -n lv_xxxx vg_raid
上述命令的參數說明:
參數
說明
--type raid5
采用 RAID 5 的方式存儲數據
--stripes 2
表示數據拆分為幾份。對于 RAID5 模式的 N 個設備,該數字是【N-1】(參見上述示意圖)(對于 RAID5,該參數的最大值為 63)
--nosync
前面已經聊過,不再重複
最後,在這個新創建的 LV 之上創建文件系統(具體命令,前面已經聊過)。
◇LVM 使用 RAID 存儲的注意事項一旦你在某個 VG 上創建了 RAID 方式的 LV,之後你就【無法】再從該 VG 中移除 PV 了(這是由 RAID 本身的特點決定的)。這種情況下,如果你非要移除該 VG 中的 PV,除非你先把該 VG 上涉及 RAID 存儲的那些 LV 先全部删除,然後才能移除 PV。 一般來說,如果你要采用 RAID 的方式,應該為此單獨創建一個新的 VG,該 VG 中的 PV 隻用于 RAID 方式。
★為啥需要“磁盤加密”?如果你是本博客的長期讀者,對“磁盤加密”應該已經耳熟能詳;反之,你是新來的讀者,可以先看如下這篇,稍微了解相關概念。《文件加密的掃盲介紹》 對于國内的金融大鳄,公司管理層亦或者是某些不可言喻的人士,“磁盤加密”尤其重要。如果你屬于這類人士,強烈建議你:通過如下博文了解【磁盤加密】的各種招數。《如何用“磁盤加密”對抗不法分子的物理盜取,或者木馬調取,兼談數據删除技巧》 在本文的後續章節,俺會介紹:LVM 與兩種磁盤加密格式(LUKS & TC)的搭配方式。
★(高級教程)LVM 與 LUKS 組合 ◇概述本文後續部分提及的 LUKS 是指 Linux 社區通行的【磁盤加密格式】;要使用該格式,需要用到 dm-crypt 這款軟件(該軟件已經集成到 Linux 内核中)。 請注意:(在本文的後續章節)當俺提及 LUKS,指的是“磁盤加密【格式】”;當俺提及 dm-crypt,指的是“磁盤加密【軟件】”。 由于本章節讨論 LVM 與 LUKS 的整合,顯然你需要懂得 dm-crypt 的使用。不太懂的同學可以看如下教程:《掃盲 dm-crypt——多功能 Linux 磁盤加密工具(兼容 TrueCrypt 和 VeraCrypt)》 LVM 與 LUKS 組合有幾種不同的玩法,俺在如下幾個小節分别說明。 由于 LVM 與 LUKS 組合之後,系統内的“塊設備”關系會變得複雜(層次變多),你要記得用前面介紹的 lsblk 命令,有助于理清思路。
◇LVM on LUKS先看如下示意圖:
如何加密“原始存儲介質”(物理分區 or 物理盤),俺在《掃盲 dm-crypt》一文中已經聊過,不再重複唠叨。 加密完某個設備後,你可以用 cryptsetup 命令的打開該加密設備,并指定一個名稱(映射名)。比如要打開的設備是 /dev/sdb2,使用的“映射名”是 sdb2_crypt(這個映射名隻是舉例,你也可以改成别的字母組合),那麼命令如下:
cryptsetup open --type luks /dev/sdb2 sdb2_crypt
打開加密設備之後,就會在系統目錄 /dev/mapper/ 之下建立一個映射。參見上圖中那3坨紫紅色的,每一坨裡面标注的路徑,就是打開加密設備之後的映射路徑。 接下來就簡單啦——你隻需要用前面章節的方法(pvcreate)在每個映射路徑上創建 PV。再往後的操作,前面章節都聊過了。
◇LUKS on LVM同樣先上圖:
你需要先完成 PV、VG、LV 的創建工作。如果你想在某個 LV 上創建 LUKS 加密,這個 LV 先【不】格式化。 以上圖中的 lv_data 為例,假設 VG 名叫 VG_XXX,你用 cryptsetup 命令對設備 /dev/VG_XXX/lv_data 進行加密,就得到圖中紫紅色的那一坨。 完成加密之後,再用 cryptsetup 打開該加密設備,建立映射(紫紅色那坨标注的,就是映射後的路徑)。 再然後,你就可以對它(映射後的設備)進行格式化,創建文件系統。
◇上述兩種,哪種更好?基于【管理成本】的考慮
對于“LVM on LUKS”,你需要在 PV 層面進行加密;對于“LUKS on LVM”,則是在 LV 層面進行加密。
多數情況下,“LV 的數量”總是遠遠大于“PV 的數量”,所以“LUKS on LVM”需要管理更多的加密盤,也就需要搞更多的“password 或 key file”。這會增加你的管理負擔。 基于【可見性】的考慮
假設别人可以拿到你的硬盤(比如“失竊”或“丢失”),這兩種方式體現了不同的【可見性】(保密性)。“LVM on LUKS”模式
對方首先看到的【加密的】LUKS 磁盤,看不到“LVM 的布局”,更加看不到每個 LV 的數據。“LUKS on LVM”模式
由于 VG & PV 的頭部是明文滴,對方可以看到你的“LVM 的布局”(包括你劃分了多少個 LV),但看不到“加密 LV”的内部數據。
由于該模式在 LV 層面加密,如果你隻加密了某些東西 LV,還有某些 LV【未加密】。那麼,這些【未加密】的 LV 的數據也會被對方看到。 小結 基于上述讨論,俺傾向于用“LVM on LUKS”。 但“LUKS on LVM”依然有其價值,因為某些特殊情況下,可能會采取“LUKS on LVM on LUKS”(3層嵌套)的磁盤布局,就需要同時用到上述兩種技能。
◇更複雜的方式當然,你還可以玩更複雜的花樣,比如“TC on LVM on LUKS”或者“LUKS on LVM on TC” ...... 由于這種更複雜的組合方式同時涉及【多種】磁盤加密格式,俺在本文末尾專門用一個單獨的章節來讨論。
★(高級教程)LVM 與 TC 組合 ◇概述本文後續部分提及的 TC 側重指 TrueCrypt 對應的【磁盤加密格式】。 雖然 TrueCrypt 已經死亡,但是它的替代品(VeraCrypt)【完全兼容】TrueCrypt 原有的功能。另外,LUKS(dm-crypt)也可以打開 TC 加密盤。所以,你在 Linux 上依然可以繼續擁抱“TC 加密格式”。 由于本章節讨論 LVM 與 TC 的整合,顯然你需要懂相關的工具。不太懂的同學可以看如下教程:《TrueCrypt 使用經驗》(系列)《掃盲 VeraCrypt——跨平台的 TrueCrypt 替代品》 LVM 與 TC 組合有幾種不同的玩法,俺在如下幾個小節分别說明:
◇LVM on TC先看如下示意圖:
你先用“TrueCrypt 或 VeraCrypt”加密“原始存儲介質”(物理分區 or 物理盤)。之後的操作,就【不】需要再用到“TrueCrypt 或 VeraCrypt”了(後續的操作都通過 LUKS 相關工具來完成)。 加密完某個設備後,你可以用 cryptsetup 命令的打開該加密設備,并指定一個名稱(映射名)。比如要打開的設備是 /dev/sdb2,使用的“映射名”是 sdb2_crypt(這個映射名隻是舉例,你也可以改成别的字母組合),那麼命令如下:
cryptsetup open --type luks /dev/sdb2 sdb2_crypt
打開加密設備之後,就會在系統目錄 /dev/mapper/ 之下建立一個映射。參見上圖中那3坨紫紅色的,每一坨裡面标注的路徑,就是打開加密設備之後的映射路徑。 接下來就簡單啦——你隻需要用前面章節的方法(pvcreate)在每個映射路徑上創建 PV。再往後的操作,前面章節都聊過了。
◇TC on LVM同樣先上圖:
你需要先完成 PV、VG、LV 的創建工作。如果你想在某個 LV 上創建 LUKS 加密,這個 LV 先【不】格式化。 以上圖中的 lv_data 為例,假設 VG 名叫 VG_XXX,你用 TrueCrypt 或 VeraCrypt 的相關命令對設備 /dev/VG_XXX/lv_data 進行加密,就得到圖中紫紅色的那一坨。之後的操作,就【不】需要再用到“TrueCrypt 或 VeraCrypt”了(後續的操作都通過 LUKS 相關工具來完成)。 完成加密之後,再用 cryptsetup 打開該加密設備,建立映射(紫紅色那坨标注的,就是映射後的路徑)。 再然後,你就可以對它(映射後的設備)進行格式化,創建文件系統。
◇上述兩種,哪種更好?在前面讨論“LVM 與 LUKS 組合”的時候,俺已經對比了“LUKS on LVM”與“LVM on LUKS”的優劣。 “TC on LVM”與“LVM on TC”的對比,道理完全類似,俺就不重複唠叨啦。
◇更複雜的方式當然,你還可以玩更複雜的花樣,比如“TC on LVM on LUKS”或者“LUKS on LVM on TC” ...... 由于這種更複雜的組合方式同時涉及【多種】磁盤加密格式,俺在下一個章節專門讨論。
★(高級教程)LVM【同時組合】TC 與 LUKS“磁盤加密”隻是其中一個細分領域,所以上期沒細聊。今天借“掃盲 LVM”的機會,細聊一下。
◇兩種“磁盤加密格式”的功能特性對比當年俺寫(這些後續都會呈現在頭條)《掃盲 dm-crypt——多功能 Linux 磁盤加密工具(兼容 TrueCrypt 和 VeraCrypt)》的時候,整理過一個表格。這次正好直接拿過來用,并略作補充。
LUKS 加密盤格式
TC 加密盤格式
功能特性
dm-crypt 的 LUKS 模式
dm-crypt 的 TCRYPT 模式
TrueCrypt
VeraCrypt
支持的操作系統
Linux
Linux
WindowsLinuxMac OS
WindowsLinuxMac OS
支持的加密算法類型
(内核 Crypto API)
AESTwofishSerpent
AESTwofishSerpent
AESTwofishSerpentCamelliaKuznyechik
支持多重加密算法(多算法級聯)
NO
AES–TwofishSerpent–AESTwofish–SerpentAES–Twofish–SerpentSerpent–Twofish–AES
AES–TwofishSerpent–AESTwofish–SerpentAES–Twofish–SerpentSerpent–Twofish–AES
AES–TwofishAES–Twofish–SerpentCamellia–KuznyechikCamellia–SerpentKuznyechik–AESKuznyechik–Serpent–CamelliaKuznyechik–TwofishSerpent–AESSerpent–Twofish–AESTwofish–Serpent
支持的哈希算法
RIPEMD-160SHA1SHA256SHA512
RIPEMD-160SHA-512Whirlpool
RIPEMD-160SHA-512Whirlpool
RIPEMD-160SHA-256SHA-512WhirlpoolStreebog
【創建】加密的物理分區
YES
NO
YES
YES
【挂載】加密的物理分區
YES
YES
YES
YES
【創建】虛拟加密盤(virtual volume)
YES
NO
YES
YES
【挂載】虛拟加密盤(virtual volume)
YES
YES
YES
YES
加密系統分區(引導時自解密)
YES(僅 Linux 系統分區)
NO
YES(僅 Windows 系統分區)
YES(僅 Windows 系統分區)
支持“密碼”的認證方式
YES
YES
YES
YES
支持“Keyfiles”的認證方式
YES
YES
YES
YES
加密系統分區支持 Keyfiles
YES(僅 Linux 系統分區)
NO
NO
NO
修改密碼或 Keyfiles
YES
NO
YES
YES
【創建】隐藏卷(hidden volume)
NO
NO
YES
YES
【挂載】隐藏卷(hidden volume)
NO
YES
YES
YES
操作外層卷時,對隐藏卷寫保護
NO
NO
YES
YES
自定義“生成密鑰的叠代次數”
YES
YES(cryptsetup ≥ 2.0.0)
NO
YES(PIM 功能,版本 ≥ 1.12)
加密格式的模糊性
NO
YES
YES
YES
(上述表格的最後一項)關于【加密格式的模糊性】,恐怕很多讀者(包括技術老手)不一定明白俺在說啥。稍微解釋一下:
TC 這種存儲格式有個顯著的優點是——【沒有】明顯的頭部信息。當你把某個分區加密成 TC 格式,這個分區的數據看起來就像是【全随機】的數據,沒有任何明顯的标志。
作為對比,用 LUKS 格式加密的分區,在分區頭部有 LUKS 的标志。不光是 LUKS,大部分磁盤加密工具都會保存“頭部标志信息”。 為啥大部分磁盤加密【格式】都有頭部标志,而 TC 這種格式卻沒有?一個很重要的原因在于——大部分磁盤加密工具都隻是為了做到“數據保密”。而當初開發 TrueCrypt 的時候,其開發團隊不光為了達到“數據保密”,還考慮到要“對付不法分子”。 如果你用普通的磁盤加密工具,加密分區有标志。不法分子如果拿到你的硬盤,雖然無法打開加密分區,但不法分子可以看出“這個分區被加密了”,于是不法分子可以通過各種方法來迫使你交出加密分區的密碼。 作為對比,采用 TC 格式的加密分區,【沒有】任何頭部标志。也就是說,不法分子拿到你的硬盤,他們【無法判斷】這個分區到底是“加密分區”,還是一個“未格式化的分區”。
◇為啥要組合兩種【格式】?功能的差異
剛才那個表格已經列出了兩種加密格式的對比。兩者各有少數優點是對方【無法替代】滴。 顯然,組合兩者很有必要。 隐蔽性的考慮
這方面的考慮,主要針對不法分子。
為了說明“隐蔽性”這個概念,俺先拿“網絡加密代理”來進行類比。 這裡不太好細說,玩過tor的新手老手都懂。 為了避免上述風險,你必須做到——既用 TC 加密格式,又不能讓别人看出你在用 TC 加密格式。
◇如何隐蔽 TC 加密盤?為了不讓别人看出你在使用 TC 格式,有幾個注意事項: 注意事項1——空間占比太大的物理分區,【不要】用 TC 格式
對于容量較大的硬盤,其【大部分空間】應該用 LUKS 加密格式,【不要】用 TC 格式。
為了讓你明白其中的原因,拿個栗子來說事兒: 假設你電腦硬盤 500GB。一般來說,“引導分區”很小,忽略不計;假設 LUKS 加密的根分區占了 30GB;然後你把其它空間都在第三個分區。也就是說,第三個分區大約 470GB。并且你把這個分區用 TC 格式加密。前面俺提到:TC 格式具有【模糊性】,其效果看起來類似“未格式化的空間”。
注意事項2——空間占比太大的 LV(邏輯卷),【不要】用 TC 格式
這個注意事項,其道理類似于前一條,俺就不再重複唠叨啦。 注意事項3——物理系統【不要】裝 TC 相關的軟件
前面提到:“加密根分區”隻能用 LUKS,所以,你的系統肯定已經有 LUKS 相關的軟件模塊。如果你已經有了 LUKS,卻又額外安裝了 TureCrypt / VeraCrypt(或諸如此類的軟件)。這就容易引起别人的懷疑。
為了盡量降低不必要的風險,你要确保系統中【沒有】TC/VC 或諸如此類的軟件。 某些技術小白可能會問:沒有這些軟件,如何操作 TC 加密盤捏?
很簡單,因為 dm-crypt 軟件包已經提供了 cryptsetup 命令,它既可以挂載 LUKS 格式,還可以挂載 TC 格式。 遺憾的是,雖然 cryptsetup 命令可以用來【挂載】TC 加密盤,但如果要【創建】TC 加密盤,還是需要 TrueCrypt 或 VeraCrypt 軟件(注:cryptsetup 命令對 TC 格式的支持不夠全,詳情參見剛才那張很複雜的對照表) 咋辦捏? 辦法之一是:你在某個“虛拟機”(Guest OS)中安裝 TrueCrypt 或 VeraCrypt,然後把“物理系統”(Host OS)中需要加密的分區挂載到 VM(Guest OS),在虛拟機中完成“創建加密盤”的操作。完事兒之後,把虛拟機【回退快照】就可以徹底抹掉你剛才創建加密盤的操作痕迹。之後對 TC 加密盤的操作(挂載加密盤),全靠 cryptsetup 命令來搞定。 (注:如何在 Guest OS 中挂載 Host OS 的分區,有一些技巧。有空的話,另寫篇博文來聊)
◇如何組合 LUKS & TC?在本小節的讨論中,俺以【單硬盤】電腦來舉例(至于【多】硬盤的情況,大夥兒請依樣畫葫蘆)。 另外,為了叙述方便,俺把如下幾種分區都統稱為“引導分區”。
MBR 分區方式
GPT 分區方式
BIOS 引導
傳統的 /boot 分區
BIOS boot partition
UEFI 引導
EFI system partition(ESP)
内置硬盤——方案1
GRUBkernel
系統文件
用來存放【不太】敏感的數據
存放【高度敏感】的數據
TC 加密格式(如安全性要求很高,啟用【隐藏卷】)
多個 LV(邏輯卷)
單個 LV,先不格式化(空間占比【不應】太大,僞裝成未用空間)
LVM
LUKS 加密格式
LUKS 加密格式
引導分區
系統分區
數據分區(可以有多個)
物理硬盤
内置硬盤——方案2
GRUBkernel
系統文件
用來存放【不太】敏感的數據
存放【高度敏感】的數據
多個 LV(邏輯卷)
多個 LV(邏輯卷)
LVM
LVM(創建【單獨的】VG,【不】與左邊那個共用)
LUKS 加密格式
LUKS 加密格式
TC 加密格式(如安全性要求很高,啟用【隐藏卷】)
引導分區
系統分區
數據分區(可以有多個)
單個數據分區,先不格式化(空間占比【不應】太大,僞裝成未用空間)
物理硬盤
外置硬盤的方案 對于外置硬盤,你也可以參考上述幾個方案。隻需去掉“引導分區 & 系統分區”,其它部分差不多。 其它方案 上述幾種方案隻是幫你啟發思路。實際操作過程中,你可以進一步發揮。
【以上内容皆是本人分享計算機知識,一切用于違法犯罪與本人無關!】
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!