Linux存儲管理

本文主要介紹了Linux存儲管理相關內容,包括磁盤接口、結構等基礎內容,以及磁盤分區、文件系統,LVM,RAID等

一、磁盤管理

1. 磁盤接口類型

Linux的一個重要思想之一就是一切皆文件,而磁盤作爲存儲數據的重要設備,在系統中也有與之對應的設備文件。根據不同接口類型的設備,其設備文件的命名方式亦不同。

IDE

IDE硬盤
IDE(Integrated Drive Electronics),集成磁盤電子接口,事實上IDE爲磁盤的形式,這種硬盤一般使用PATA(Parallel Advanced Technology Attachment)接口,我們通常所謂的IDE硬盤即接口爲PATA的硬盤,該接口爲並行接口,其理論傳輸速度爲133MB/s。

在Linux發行版中,這類硬盤的設備文件一般爲sd開頭(以RHEL系列發行版爲例),在RHEL6以前以hd開頭。通常在PC的主板上有2個IDE口,每一個接口可接2塊硬盤,分爲主、從盤,如/dev/hda

而分區後,每一個分區會再次創建一個設備文件,以DEVICE#命名,如,主分區一般爲dev/hda[1-4],邏輯分區爲/dev/hda[5+]

即使用字母a、b、c……來區別不同設備,使用1、2、3……來區分同一設備的不同分區,下同

SATA

SATA
SATA(Serial Advanced Technology Attachment),即串行ATA,SATA有多種規格,SATA2的理論速度爲3Gbps,SATA3的理論速度爲6Gbps,該接口排線與SCSI兼容,SATA硬盤也可接上SAS接口。設備文件以sd開頭

SCSI

SCSI接口
SCSI(Small Computer System Interface)小型計算機系統接口,是一種用於計算機及其周邊設備之間(硬盤、軟驅、光驅、打印機、掃描儀等)系統級接口的獨立處理器標準。

SCSI控制器接上總線,窄總線可以可接7個Target,寬總線可接15個Target,而後還可接若干硬盤,理論速度640MB/s,設備文件通常以sd開頭

SAS

2.5英寸及3.5英寸的SAS硬盤與一粒好時Kiss薄荷糖的大小比較
SAS(Serial Attached SCSI)串行SCSI,是新一代的SCSI技術,SAS並支持與序列式ATA(SATA)設備兼容,且兩者可以使用相類似的電纜,理論速度6Gbps,設備文件通常以sd開頭

USB

USB
目前日漸普及的USB Type-C:
USB-C
USB(Universal Serial Bus)通用串行總線,是連接計算機系統與外部設備的一種串口總線標準,也是一種輸入輸出接口的技術規範,被廣泛地應用於個人計算機和移動設備等信息通訊產品,並擴展至攝影器材、數字電視(機頂盒)、遊戲機等其它相關領域,相信大家不會陌生

目前最新一代的USB是USB 3.2,傳輸速度爲20Gbit/s,設備文件通常以sd開頭

2. 機械磁盤結構

硬盤(Hard Disk Drive,HDD)是計算機上使用堅硬的旋轉盤片爲基礎的非易失性存儲器,它在平整的磁性表面存儲和檢索數字數據,數據通過離磁性表面很近的磁頭由電磁流來改變極性的方式被寫入到磁盤上,數據可以通過被讀取,原理是磁頭經過盤片的上方時盤片本身的磁場導致讀取線圈中電氣信號改變。

機械硬盤

機械硬盤(HDD)主要由:盤片,磁頭,盤片轉軸及控制電機,磁頭控制器,數據轉換器,接口,緩存等幾個部分組成,上圖爲機械硬盤的實拍,下圖爲各部分名稱

HDD
磁頭(Heads)可沿盤片的半徑方向運動,加上盤片每分鐘幾千轉的高速旋轉,磁頭就可以定位在盤片的指定位置上進行數據的讀寫操作(類似於留聲機)。信息通過離磁性表面很近的磁頭,由電磁流來改變極性方式被電磁流寫到磁盤上,信息可以通過相反的方式讀取。硬盤作爲精密設備,塵埃是其大敵,所以進入硬盤的空氣必須過濾

盤片(Platters)爲數據的主要存儲介質,往往有多片,每個碟片都有兩面,因此也會相對應每碟片有2個磁頭,工作時,所有盤片由一個點擊帶動同時旋轉
在這裏插入圖片描述
對於盤片,還有一些邏輯上的結構:
磁盤結構

磁道(Track),盤片上的同心圓,由廠商完成劃分,其容量由盤片的密度決定。在最外圈,離主軸最遠的地方是“0”磁道,硬盤數據的存放就是從最外圈開始的

扇區(Sector),由於硬盤的設計機構,工作時磁道的角速度相同。由於徑向長度不同,所以,線速度也不同,外圈的線速度較內圈的線速度大,即同樣的轉速下,外圈在同樣時間段裏,劃過的圓弧長度要比內圈劃過的圓弧長度大。每段圓弧叫做一個扇區,扇區從“1”開始編號,每個扇區中的數據作爲一個單元同時讀出或寫入。

(Data cluster),有時被稱爲分配單元(allocation unit),是操作系統中磁盤文件存儲管理的單位,可爲一個或多個物理扇區組成

柱面(Cylinder),硬盤通常由重疊的一組盤片構成,每個盤面都被劃分爲數目相等的磁道,並從外緣的“0”開始編號,具有相同編號的磁道形成一個圓柱,稱之爲磁盤的柱面,劃分分區是按照柱面劃分的
柱面
此外,對於機械硬盤而言,還有幾個重要的參數:

轉速,轉速是硬盤內電機主軸的旋轉速度,也就是硬盤盤片在一分鐘內所能完成的最大轉數,即RPM(Rotations Per Minute),個人設備常見的有5400RPM,7200RPM

平均尋道時間(Average Seek Time),是指硬盤的磁頭移動到盤面指定磁道所需的時間,單位爲毫秒。這個時間當然越小越好,目前主流硬盤的平均尋道時間通常在8ms到12ms之間。

3. 設備文件

之前有介紹,設備文件有塊(block)設備與字符(char)設備之分,塊設備存取單位爲“塊”,可隨機訪問,本文介紹的硬盤就是塊設備;而字符設備存取單位爲“字符”,是順序方位設備

Linux內核在探測到硬件設備後,會爲其創建設備文件(此特性可以在內核編譯時指定是否開啓,絕大部分發行版會啓用此特性後續將介紹)至/dev目錄中,此設備文件將關聯只設備的驅動程序,訪問此文件即可訪問到文件所關聯到的設備

每個設備分別有主次設備號

  • 主設備號(major number),用於標識設備類型,進而確定要加載的驅動程序
  • 次設備號(minor number),用於標識同一類型中的不同的設備

創建設備文件

用戶可以手動創建設備文件,使用mknod命令,其用法爲

mknod [OPTION]... NAME TYPE [MAJOR MINOR]
	TYPE
		b				create a block (buffered) special file
		c				create a character (unbuffered) special file
	OPTIONS
		-m MODE			set file permission bits to MODE

4. 磁盤分區

硬盤分區實質上是對硬盤的一種格式化,然後才能使用硬盤保存各種信息。創建分區時,就已經設置好了硬盤的各項物理參數。 其實完全可以只創建一個分區使用全部或部分的硬盤空間。

分區表類型

分區(Partition):在磁盤上建立起來的邏輯邊界,創建文件系統,按柱面劃分,而一個磁盤的分區信息,自然保存在當前磁盤中,其格式目前有兩種:MBR與GPT

MBR

MBR(Master Boot Record),主引導記錄,位於0盤面0磁道1扇區,512byte,不屬於任何分區,亦不屬於操作系統。主要由三部分組成:

  • Boot Loader
    引導加載器,主引導記錄最開頭的446字節。其中的硬盤引導程序的主要作用是檢查分區表是否正確並且在系統硬件完成自檢以後將控制權交給硬盤上的引導程序(如GNU GRUB)。它不依賴任何操作系統,而且啓動代碼也是可以改變的,從而能夠實現多系統引導。

  • FAT
    File Allocation Table,文件分區表,共64字節,每16個字節可標識一個分區,共可標識4個分區

  • Magic Number
    2字節,通常別填充爲55AA,用於標識MBR是否有效

詳見下表1

地址 描述 長度
Hex Oct Dec
0000 0000 0 代碼區 440
(最大446)
01B8 0670 440 選用磁盤標誌 4
01BC 0674 444 一般爲空值; 0x0000 2
01BE 0676 446 標準MBR分區表規劃
(四個16 byte的主分區表入口)
64
01FE 0776 510 55h MBR有效標誌:
0x55AA
2
01FF 0777 511 AAh
MBR,總大小:446 + 64 + 2 = 512
擴展分區與邏輯分區

由於MBR的設計,一塊物理硬盤最多只能有4個分區,如今,這在多數情況下是不能滿需求的。因此就有了擴展分區(Extended Partition)的概念

MBR中FAT標記的4個分區被稱爲主分區,若需要更多的分區,使用其中的一個主分區,用於指定磁盤上某一位置,存放了額外的分區信息,該分區即擴展分區,擴展分區不能格式化,其指定的分區爲邏輯分區(Logical Partition),擴展分區在一個硬件設備中只能有一個

這裏引用鳥哥的Linux私房菜中的例子:

擴展分區

如圖,我們使用了分區表中的2個分區,P1爲主分區,P2爲擴展分區,擴展分區的目的是指定使用額外的空間來記錄分區信息,擴展分區本身是很小的,不能被格式化。我們可以使用擴展分區所指向的區域作爲分區的記錄區。

圖中的擴展分區指定了5個額外的分區,即邏輯分區L1至L5,另外,由於邏輯分區是由擴展分區指定的,故其分區的範圍就是擴展分區設定的範圍,即圖中的101~400

另外,上文亦有提及,擴展分區的名稱是以5開始的,故圖中的分區在系統的設備文件爲(假設磁盤爲/dev/sda):

  • P1: /dev/sda1
  • P2: /dev/sda2
  • L1: /dev/sda5
  • L2: /dev/sda6
  • L3: /dev/sda7
  • L4: /dev/sda8
  • L5: /dev/sda9

GPT

GPT( GUID(Globally Unique IDentifier) Partition Table),全局唯一標識分區表,是EFI(可擴展固件接口標準)的一部分,用來替代BIOS中的主引導記錄分區表。

GPT的分區信息是在分區中,而不象MBR一樣在主引導扇區,爲保護GPT不受MBR類磁盤管理軟件的危害,GPT在主引導扇區建立了一個保護分區(Protective MBR)的MBR分區表(此分區並不必要),其類型被標識爲0xEE。

GPT
跟現代的MBR一樣,GPT也使用LBA(Logical Block Address,邏輯區塊地址)取代了早期的CHS尋址方式。傳統MBR信息僅存儲於LBA 0,而GPT使用了34個LBA,GPT頭存儲於LBA 1,接下來纔是分區表本身。

另外,在最後的33個LBA中,也存儲了分區信息用於備份

上述圖示的解釋說明如下2

  • LBA0 (MBR兼容部分)
    與MBR模式相似的,這個兼容區塊也分爲兩個部份,一個就是跟之前446 bytes相似的區塊,儲存了第一階段的開機管理程序!而在原本的分區表的紀錄區內,這個兼容模式僅放入一個特殊標誌的分區,用來表示此磁盤爲GPT格式之意。而不懂GPT分割表的磁盤管理程序,就不會認識這塊磁盤,除非用戶有特別要求要處理之,否則該管理軟件不能修改此分區信息,進一步保護了此磁盤!
  • LBA1 (GPT 表頭紀錄)
    這個部份紀錄了分區表本身的位置與大小,同時紀錄了備份用的GPT 分區(就是前面談到的在最後34 個LBA 區塊) 放置的位置, 同時放置了分區表的檢驗機制碼(CRC32 ),操作系統可以根據這個檢驗碼來判斷GPT 是否正確。若有錯誤,還可以通過這個紀錄區來取得備份的GPT(磁盤最後的那個備份區塊) 來恢復GPT 的正常運作!
  • LBA2-33 (實際紀錄分區信息處)
    從LBA2區塊開始,每個LBA都可以紀錄4條分區紀錄,所以在默認的情況下,總共可以有4*32 = 128條分區紀錄!因爲每個LBA有512bytes,因此每條紀錄用到128 bytes的空間,除了每條紀錄所需要的識別碼與相關的紀錄之外,GPT在每條紀錄中分別提供了64bits來記錄開始/結束的扇區(Sector)號碼,因此,GPT分區表對於單一分區來說,他的最大容量限制就會在264512bytes=2631Kbytes=233TB=8ZB2^{64}*512bytes=2^{63}*1Kbytes=2^{33}TB=8ZB,而1ZB = 230 TB!

    GPT的每一個分區都可以獨立存在,沒有所謂的擴展、邏輯分區的概念,即所有分區都是主分區

BIOS與UEFI

爲了說明問題,此處介紹一點系統啓動流程,後續將詳細介紹。

我們如今計算機之所以看起來聰明,能自動完成一些工作,都依賴於所執行的代碼,CPU只有加載到這些代碼後纔可運行。計算機在開機後,會由硬件邏輯實現將主板ROM中存儲的一段代碼讀入到CPU中,CPU執行這段代碼,該過程即POST(Power On and Self-Testing,開機自檢),用於探測物理設備,檢查啓動條件,指定硬件工作時的物理電氣特性等。

POST過程無誤後,程序將根據CMOS中設定的引導順序探測指定設備,以使用該設備引導系統啓動。

而實現以上操作的程序,目前有兩種:BIOSUEFI3

  • BIOS(Basic Input/Output System)基本輸入輸出系統,存儲在EEPROM(電可擦除可編程只讀存儲器)中

  • UEFI(Unified Extensible Firmware Interface)統一可擴展固件接口,其早期爲Intel開發,即EFI,後來作爲工業標準,更名爲UEFI

下表爲關於二者的對比2

比較項目 BIOS UEFI
開發語言 彙編語言 C語言
硬件資源控制 使用中斷(IRQ)管理
不可變的內存存取
不可變的輸入/輸出存取
使用驅動程序與協議
處理器運作環境 16 位 CPU 保護模式
擴充方式 通過IRQ 連結 直接載入驅動程序
第三方廠商支持 較差 較佳且可支持多平臺
圖形化能力 較差 較佳
內置簡化操作系統前環境 不支持 支持

5. 相關命令

分區管理

分區管理相關命令實質上就是編輯分區表,Linux系統最流行的工具爲fdisk,不過該工具不能識別GPT分區,欲編輯GPT分區,可使用gdisk,其用法與fdisk類型,此處以fdisk爲例說明

fdisk命令提供一個交互式接口來管理分區,有諸多子命令,分別用於不同的管理功能,此外,需要注意的是,所有的操作在保存前都存儲在內存中,若直接退出,則修改將撤銷

關於其選項,有一個需要介紹:
查看系統當前識別的硬盤:
fdisk -l [/DEV/TO/SOME_DEVICE_FILE],如

[root@localhost ~]# fdisk -l /dev/sda

Disk /dev/sda: 128.8 GB, 128849018880 bytes, 251658240 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000aff46

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048   251658239   125316096   8e  Linux LVM

需要說明的是,關於輸出內容中的StartEnd的意義,CentOS 6與CentOS 7有所不同:

  • CentOS 6:起始於結束柱面
  • CentOS 7:起始於結束扇區

若需要編輯某磁盤的分區表,直接使用fdisk DEV/TO/SOME_DEVICE_FILE,即可進入到交互界面:

[root@localhost ~]# fdisk /dev/sda
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help):

常用的子命令有:

子命令 說明
p 顯示當前硬盤的分區,包括沒保存的改動
n 增加一個新分區
d 刪除一個分區
w 將修改寫入磁盤並退出
m 顯示菜單
q 不保存退出
t 修改分區id(即分區類型)
l 顯示支持的所有類型

另外,關於n命令,輸入後fdisk會詢問創建的分區類型,指定爲p則新建一個主分區,e則新建一個擴展分區,而若已經創建了4個分區,其中一個分區爲擴展分區,此時創建的分區只能是邏輯分區,如

Command (m for help): p

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xa89f73e5

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048     2099199     1048576   83  Linux

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (2-4, default 2):
First sector (2099200-41943039, default 2099200):
Using default value 2099200
Last sector, +sectors or +size{K,M,G} (2099200-41943039, default 41943039): +1G
Partition 2 of type Linux and of size 1 GiB is set

Command (m for help): p

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xa89f73e5

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048     2099199     1048576   83  Linux
/dev/sdc2         2099200     4196351     1048576   83  Linux
Command (m for help): p

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x55cfaa21

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048     2099199     1048576   83  Linux
/dev/sdc2         2099200     4196351     1048576   83  Linux
/dev/sdc3         4196352     6293503     1048576   83  Linux

Command (m for help): n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e
Selected partition 4
First sector (6293504-41943039, default 6293504):
Using default value 6293504
Last sector, +sectors or +size{K,M,G} (6293504-41943039, default 41943039):
Using default value 41943039
Partition 4 of type Extended and of size 17 GiB is set

Command (m for help): p

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x55cfaa21

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048     2099199     1048576   83  Linux
/dev/sdc2         2099200     4196351     1048576   83  Linux
/dev/sdc3         4196352     6293503     1048576   83  Linux
/dev/sdc4         6293504    41943039    17824768    5  Extended

Command (m for help): n
All primary partitions are in use
Adding logical partition 5
First sector (6295552-41943039, default 6295552):
Using default value 6295552
Last sector, +sectors or +size{K,M,G} (6295552-41943039, default 41943039): +1G
Partition 5 of type Linux and of size 1 GiB is set

Command (m for help): p

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x55cfaa21

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048     2099199     1048576   83  Linux
/dev/sdc2         2099200     4196351     1048576   83  Linux
/dev/sdc3         4196352     6293503     1048576   83  Linux
/dev/sdc4         6293504    41943039    17824768    5  Extended
/dev/sdc5         6295552     8392703     1048576   83  Linux

需要注意的是,創建的邏輯分區應該指定爲所有可用空間,否則未被指定的空間將無法使用

另外, 在已經分區並且已經掛載其中某個分區的磁盤設備上創建新分區,內核可能再創建完成後無法直接識別(在/proc/partitions文件中顯示了當前內核識別了哪些分區,可通過cat查看)

此時需要通知內核重讀分區表,默認系統會試圖重讀系統上鍊接的所有磁盤

  • 紅帽5
    artprobe [/dev/device]
  • 紅帽6
    • partx -a /dev/DEVICE,添加指定的分區或讀取磁盤並添加所有分區
      -n M:N 指定範圍
    • kpartx -a /dev/DEVICE
      -f,force,強制

dd

這裏再介紹一個更爲底層的複製命令dd,與cp命令不同,cp複製時,是以文件爲單位,而dd命令是以數據流爲單位進行復制,會繞過文件系統,在塊級別讀寫

該命令通過operand來指定執行特性,常用的operand有

if=數據來源
of=數據存儲目標
bs=複製單元大小(一次讀/寫多少數據量),單位是字節
count=複製多少個bs
seek=#: 創建數據文件時,跳過的空間大小
oflag=FLAGS

常用形式爲

dd if=input_file of=out_putfile
dd if=input_file of=out_putfile bs=#[BN|K|M|G] count=#

  • 磁盤拷貝
    dd if=/dev/sda of=/dev/sdb
    
  • 備份MBR
    dd if=/dev/sda of=/mnt/usb/mbr.backup bs=512 count=1
    
  • 恢復MBR
    dd if=/mnt/usb/mbr.backup of=/dev/sda bs=512 count=1
    
  • 破壞bootloader
    dd if=/dev/zero of=/dev/sda bs=446 count=1
    
    bs小於446也可,但是大於446,會破壞分區表
  • 製作ISO鏡像
    dd if=/dev/cdrom of=/tmp/myiso.iso
    
  • 此外,通過cat命令,使用重定向也可以製作ISO鏡像文件
    cat /dev/cdrom > /tmp/myiso.iso
    

二、文件系統

計算機的文件系統(File System)是一種存儲和組織計算機數據的方法,它使得對其訪問和查找變得容易,文件系統使用文件和樹形目錄的抽象邏輯概念代替了硬盤和光盤等物理設備使用數據塊的概念,用戶使用文件系統來保存數據不必關心數據實際保存在硬盤(或者光盤)的地址爲多少的數據塊上,只需要記住這個文件的所屬目錄和文件名。在寫入新數據之前,用戶不必關心硬盤上的那個塊地址沒有被使用,硬盤上的存儲空間管理(分配和釋放)功能由文件系統自動完成,用戶只需要記住數據被寫入到了哪個文件中。

1. VFS

文件系統是一種計算機數據的組織管理方式,而其具體實現是多樣的,如

  • Windows:FAT32(Linux中叫做vfat),NTFS
  • Unix:FFS(Fast File System),UFS(Unix File System),JFS2
  • 光盤:ISO9600
  • 公共文件系統:Windows:CIFS(Common Interface File System)
  • 基本文件系統
    • Extended:ext2ext3ext4
    • xfs:支持絕對大的單個文件
    • ReiserFS:對於海量的小文件管理性能優越
    • JFS,日誌文件系統,IBM研發
    • FAT32NTFS
    • BtrFS
  • 交換分區:swap
  • 集羣文件系統
    • OCFS2(Oracle Cluster File System 2)
    • CIFS
    • GFS2,全局文件系統
  • 網絡文件系統:NFSSMBFS
  • 內核級分佈式文件系統:ceph
  • ……

而每一種文件系統的特性以及對於數據的讀寫方式都不同,Linux作爲一個開放的系統,支持衆多文件系統,可查看/lib/modules/KERNEL_VERSION/kernel/fs目錄獲取該信息,如

[root@localhost ~]# ls -l /lib/modules/$(uname -r)/kernel/fs
total 48
-rw-r--r--. 1 root root 21845 Mar  6  2015 binfmt_misc.ko
drwxr-xr-x. 2 root root    21 Dec 20 04:15 btrfs
drwxr-xr-x. 2 root root    26 Dec 20 04:15 cachefiles
drwxr-xr-x. 2 root root    20 Dec 20 04:15 ceph
drwxr-xr-x. 2 root root    20 Dec 20 04:15 cifs
drwxr-xr-x. 2 root root    22 Dec 20 04:15 cramfs
drwxr-xr-x. 2 root root    19 Dec 20 04:15 dlm
drwxr-xr-x. 2 root root    22 Dec 20 04:15 exofs
drwxr-xr-x. 2 root root    20 Dec 20 04:15 ext4
drwxr-xr-x. 2 root root    48 Dec 20 04:15 fat
drwxr-xr-x. 2 root root    23 Dec 20 04:15 fscache
drwxr-xr-x. 2 root root    34 Dec 20 04:15 fuse
drwxr-xr-x. 2 root root    20 Dec 20 04:15 gfs2
drwxr-xr-x. 2 root root    21 Dec 20 04:15 isofs
drwxr-xr-x. 2 root root    20 Dec 20 04:15 jbd2
drwxr-xr-x. 2 root root    21 Dec 20 04:15 lockd
-rw-r--r--. 1 root root 19589 Mar  6  2015 mbcache.ko
drwxr-xr-x. 5 root root   100 Dec 20 04:15 nfs
drwxr-xr-x. 2 root root    23 Dec 20 04:15 nfs_common
drwxr-xr-x. 2 root root    20 Dec 20 04:15 nfsd
drwxr-xr-x. 2 root root  4096 Dec 20 04:15 nls
drwxr-xr-x. 2 root root    23 Dec 20 04:15 overlayfs
drwxr-xr-x. 2 root root    23 Dec 20 04:15 pstore
drwxr-xr-x. 2 root root    24 Dec 20 04:15 squashfs
drwxr-xr-x. 2 root root    19 Dec 20 04:15 udf
drwxr-xr-x. 2 root root    19 Dec 20 04:15 xfs

通過裝載這些模塊,系統即可支持相應文件系統,而查看proc/filesystems文件即可獲知當前已經裝載支持的文件系統,如

[root@localhost ~]# cat /proc/filesystems
nodev	sysfs
nodev	rootfs
nodev	bdev
nodev	proc
nodev	cgroup
nodev	cpuset
nodev	tmpfs
nodev	devtmpfs
nodev	debugfs
nodev	securityfs
nodev	sockfs
nodev	pipefs
nodev	anon_inodefs
nodev	configfs
nodev	devpts
nodev	ramfs
nodev	hugetlbfs
nodev	autofs
nodev	pstore
nodev	mqueue
nodev	selinuxfs
	xfs
	btrfs

Linux通過添加了一個邏輯中間層的方式,使得在對衆多文件系統的支持方面效果良好,該層即VFS(Virtual Filesystem Switch),虛擬文件系統,亦稱虛擬文件切換系統。是操作系統的文件系統虛擬層,在其下是實體的文件系統。虛擬文件系統的主要功用,在於讓上層的軟件,能夠用單一的方式,來跟底層不同的文件系統溝通。在操作系統與之下的各種文件系統之間,虛擬文件系統提供了標準的操作接口,讓操作系統能夠很快的支持新的文件系統。下圖爲Linux存儲棧邏輯圖(點擊查看大圖)4
VFS

VFS在系統啓動時建立,在系統關閉時消亡

2. EXT FS

ext應該說一個文件系統家族,目前常用的有ext2ext3ext4,是目前很多Linux發行版主要使用該文件系統。此處先以ext2文件系統爲例進行說明,而後介紹ext3ext4的新特性

相關概念

ext2大體上將磁盤分爲兩部分,數據區元數據區,數據區存儲文件內容,元數據區則存儲文件的元數據信息,如權限、時間戳信息等(這裏不包括文件名)

Block

此處也可稱爲Data block,用於存儲數據內容,存儲數據時,Block是存儲空間分配的最小單位,通常爲2x個扇區,常見的塊大小(Block Size)有1024字節,2048字節,4096字節等,在格式化時指定

Inode

Inode即index node,索引節點。一個文件除了數據需要存儲之外,一些描述信息也需要存儲,例如文件類型,權限,文件大小,時間戳,還有文件所在的磁盤塊等信息,inode號,(但是沒有文件名)這些信息存在inode中而不是數據塊中。

Inode數量也是在格式化時確定,每一個Inode爲128字節(ext4爲256字節)每個文件都有一個inode,一個塊組中的所有inode組成了inode表

此外,inode有時也不直接指向data block,而是指向其地址,甚至有時會有多級地址:
inode

Bitmap Index

位圖索引,Inode與Block都可以有位圖索引,即Inode Bitmap與Block Bitmap。用於標記某位置是否已經使用,可加快查找空閒磁盤塊的速度

Block Group

塊組,當分區建立完成後,會先將整個磁盤分區在劃分成多個邏輯組(類似於分區下的子分區,對用戶不可見),稱爲塊組,塊組可以跨分區引用(即一個文件可以保存在多個塊組中,一個塊組的inode可以指向其他塊組中的塊)

Super Block

Super Block即超級塊。塊組的數目不是固定的,就需要一個全局信息來描述,即超級塊,每個塊組中有獨立的inode和block,每個塊組中有塊位圖、inode位圖等,超級塊默認在0塊組的0數據塊,一般會有備份

GDT

塊組描述符表(Group Description Table),保存有當前文件系統有多少塊組、塊組名、各個塊組的始末位置等信息,一般會有備份

下圖可大致描述各概念邏輯關係:
EXT2

ext2、ext2、ext4的差異

ext2中存儲文件時,先存儲inode到元數據區,然後在數據區中存儲數據。
當系統非法關機時,未存儲完成的文件數據區不完整,導致無法訪問,該文件沒有意義,下次啓動時,會有修復文件系統的操作,即刪除這些文件,方法是逐個查找文件的inode,試圖打開文件,這使得在大的存儲器中,速度很慢

ext3:日誌文件系統(Journal File System),文件系統中除了數據區、元數據區,還有日誌區,在存儲數據時,先將inode寫入到日誌區,若出現意外,系統只需直接檢查日誌區即可,數據存儲(或修改)完成後,再將日誌區中的inode移動到元數據區即可。

ext3還是使用15個inode來查找數據塊,前12個爲直接數據塊,直接指向存儲數據的數據塊,接下來分別爲一級間接塊,二級間接塊,三級間接塊,如下圖:
Ext3

EXT3與EXT4的主要區別5

Linux kernel自2.6.28開始正式支持新的文件系統 Ext4。 Ext4是Ext3的改進版,修改了Ext3中部分重要的數據結構,而不僅僅像Ext3對Ext2那樣,只是增加了一個日誌功能而已。Ext4 可以提供更佳的性能和可靠性,還有更爲豐富的功能:

  1. 與Ext3兼容。執行若干條命令,就能從Ext3在線遷移到Ext4,而無須重新格式化磁盤或重新安裝系統。原有Ext3數據結構照樣保留,Ext4作用於新數據,當然,整個文件系統因此也就獲得了Ext4所支持的更大容量。

  2. 更大的文件系統和更大的文件。較之Ext3目前所支持的最大16TB文件系統和最大2TB文件,Ext4分別支持1EB(1,048,576TB,1EB=1024PB,1PB=1024TB)的文件系統,以及16TB 的文件。

  3. 無限數量的子目錄。Ext3目前只支持32,000個子目錄,而Ext4支持無限數量的子目錄。

  4. Extents。Ext3 採用間接塊映射,當操作大文件時,效率極其低下。比如一個 100MB 大小的文件,在Ext3中要建立25,600個數據塊(每個數據塊大小爲 4KB)的映射表。而Ext4引入了現代文件系統中流行的extents概念,每個 extent 爲一組連續的數據塊,上述文件則表示爲“該文件數據保存在接下來的25,600個數據塊中”,提高了不少效率。

  5. 多塊分配。當 寫入數據到 Ext3 文件系統中時,Ext3 的數據塊分配器每次只能分配一個 4KB 的塊,寫一個 100MB 文件就要調用 25,600 次數據塊分配器,而 Ext4 的多塊分配器“multiblock allocator”(mballoc) 支持一次調用分配多個數據塊。

  6. 延遲分配。Ext3的數據塊分配策略是儘快分配,而 Ext4 和其它現代文件操作系統的策略是儘可能地延遲分配,直到文件在 cache 中寫完纔開始分配數據塊並寫入磁盤,這樣就能優化整個文件的數據塊分配,與前兩種特性搭配起來可以顯著提升性能。

  7. 快速 fsck。以前執行 fsck 第一步就會很慢,因爲它要檢查所有的 inode,現在 Ext4 給每個組的 inode 表中都添加了一份未使用 inode 的列表,今後 fsck Ext4 文件系統就可以跳過它們而只去檢查那些在用的 inode 了。

  8. 日誌校驗。日誌是最常用的部分,也極易導致磁盤硬件故障,而從損壞的日誌中恢復數據會導致更多的數據損壞。Ext4的日誌校驗功能可以很方便地判斷日誌數據是否損壞,而且它將 Ext3 的兩階段日誌機制合併成一個階段,在增加安全性的同時提高了性能。

  9. “無日誌”(No Journaling)模式。日誌總歸有一些開銷,Ext4允許關閉日誌,以便某些有特殊需求的用戶可以藉此提升性能。

  10. 在線碎片整理。儘管延遲分配、多塊分配和extents能有效減少文件系統碎片,但碎片還是不可避免會產生。Ext4支持在線碎片整理,並將提供e4defrag工具進行個別文件或整個文件系統的碎片整理。

  11. inode 相關特性。Ext4 支持更大的inode,較之Ext3默認的inode大小128字節,Ext4爲了在 inode 中容納更多的擴展屬性(如納秒時間戳或inode版本),默認inode大小爲256字節。Ext4 還支持快速擴展屬性(fast extended attributes)和inode保留(inodes reservation)。

  12. 持久預分配(Persistent preallocation)。 P2P 軟件爲了保證下載文件有足夠的空間存放,常常會預先創建一個與所下載文件大小相同的空文件,以免未來的數小時或數天之內磁盤空間不足導致下載失敗。 Ext4在文件系統層面實現了持久預分配並提供相應的API(libc 中的 posix_fallocate()),比應用軟件自己實現更有效率。

  13. 默認啓用 barrier。磁 盤上配有內部緩存,以便重新調整批量數據的寫操作順序,優化寫入性能,因此文件系統必須在日誌數據寫入磁盤之後才能寫commit記錄,若commit 記錄寫入在先,而日誌有可能損壞,那麼就會影響數據完整性。Ext4默認啓用barrier,只有當barrier之前的數據全部寫入磁盤,才能寫 barrier之後的數據。(可通過“mount -o barrier=0″命令禁用該特性。)

文件與目錄的存儲

上文有提到,文件的文件名並沒有保存在inode中,而“目錄”(或許在Windows中被習慣稱爲“文件夾”)並沒有像在Windows窗口中展示的那樣是“包含”關係。事實上目錄(文件夾),即Directory僅作爲文件的訪問路徑,所謂“一個目錄下包含的文件或子目錄”,即可通過該目錄直接找到的文件(目錄也是文件)

故對於普通文件而言,其Data Block中存儲了文件內容,而對於目錄而言,其Data Block中存儲了所謂的目錄中的文件與一級子目錄的名稱與對應的inode

故也可以說文件名存儲在其父目錄的Data Block中

如,要獲取/root/myfile文件,其簡略查找過程爲(假設只有一個分區)

  1. 由於Linux根可自引用,內核獲取到/的inode,並查看對應的Data Block,比如
    – /root,對應10號inode
    – /home,對應11號inode
    – ……
  2. 獲取到10號inode後(即/root),查看其對應的Data Block內容,比如
    – .bashrc,對應100號inode
    – myfile,對應150inode
    – ……
  3. 而後獲取到150號inode(即/root/myfile),即可查看到該inode對應的Data Block中的內容

3. 鏈接文件

之前有提到,ls -l的輸出結果中有一項爲“文件被硬鏈接的次數”6,經過以上的介紹,此處應該可以說明該問題。

硬鏈接

所謂硬鏈接(Hard Link)也叫作實體鏈接,是指向同一個inode的多個文件路徑,需要說明的有以下幾點

  • 目錄不支持硬鏈接
  • 不能跨文件系統
  • 創建硬鏈接會增加inode引用計數

另外,目錄的硬鏈接次數一般爲2,因爲有.和當前目錄名

符號鏈接

既然有硬鏈接,自然也有軟鏈接,軟鏈接多數被稱爲符號鏈接(Symbolic Link),類似於Windows中的快捷方式。

符號鏈接爲指向一個文件路徑的另一個文件路徑,其文件內容爲所指向文件的路徑(字符串),該文件的大小即爲字符串的大小,如果目標路徑名較短則不爲其分配block,而直接保存在inode中以便更快地查找,如果目標路徑名較長則分配一個數據塊來保存

  • 符號鏈接與原文件是各自獨立的文件,各有自己的inode
  • 支持對目錄創建符號鏈接
  • 可以跨文件系統
  • 刪除符號鏈接文件不影響原文件,但刪除原文件,符號指定的路徑即不存在,此時會變爲無效鏈接
  • 符號鏈接一般不做權限限定,顯示爲777,權限取決於指向的文件

ln命令

ln命令可用戶創建鏈接文件,其使用方式如下

ln [-sv] SRC DEST
	-s	make symbolic links instead of hard links
	-v	print name of each linked file

如,創建/etc/fstab的符號鏈接

[root@localhost ~]# clear
[root@localhost ~]# ln -s /etc/fstab fstab.1
[root@localhost ~]# cat fstab.1

#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]# ll fstab.1
lrwxrwxrwx. 1 root root 10 Feb 20 16:08 fstab.1 -> /etc/fstab

4. swap分區

swap即交換分區,是將磁盤模擬爲內存的一種方式,用戶解決早期內存空間不足的問題7

Linux上的交換分區必須使用獨立的文件系統,且文件系統的system id要爲82,而後,使用mkswap命令創建swap,最後使用swapon啓用即可

mkswap命令用法如下

mkswap - set up a Linux swap area
mkswap [options] device [size]
	[options]
		-L 	指定LABEL
		-f	強制創建

swaponswapoff可啓用或關閉交換分區上的交換空間

swapon
	-a	啓用所有的定義在/etc/fstab文件中的所有交換分區
	-p PRIORITY	指定優先級

swapoff
	-a	關閉所有

5. BtrFS

即B-Tree文件系統,通常念成Butter FS,Better FS或B-tree FS,由Oracle與2007年研發,2014年8月發佈穩定版,目標是取代Linux當前的ext3文件系統,改善ext3的限制,特別是單個文件的大小,總文件系統大小或文件檢查和加入ext3未支持的功能,像是可寫快照(writable snapshots)、快照的快照(snapshots of snapshots)、內建磁盤陣列(RAID),以及子卷(subvolumes)。Btrfs也宣稱專注在“容錯、修復及易於管理”。

其和核心特性如下

  • 聯機碎片整理
  • 聯機卷生長和收縮
  • 聯機塊設備增加和刪除
  • 聯機負載均衡(塊設備間的對象移動以達到平衡)
  • 文件系統級的鏡像(類RAID-1)、條帶(類RAID-0)
  • 子卷(一個或多個單獨可掛載基於每個物流分區)
  • 透明壓縮(當前支持zlib、LZO和ZSTD (從 4.14 開始支持))
  • 快照(只讀和可寫,寫複製,子卷複製)
  • 文件克隆
  • CoW支持:複製、更新及替換指針,而非“就地”更新
  • 數據和元數據的校驗和(當前是CRC-32C)
  • 就地轉換(帶回滾)ext3/4
  • 文件系統種子
  • 用戶定義的事務
  • 塊丟棄支持

6. 文件系統管理相關命令

文件系統創建

Linux文件系統邏輯上由兩部分組成

  • 內核中的模塊,如ext4,xfs,vfat
  • 用戶空間的管理工具,如mkfs.ext4,mkfs.xfs,mkfs.vfat

此處將介紹這些管理工具,需要注意的是,創建文件系統會損壞原有文件

mkfs

mkfs即MaKe FileSystem之意,用戶創建文件系統,使用格式爲

mkfs -t FS_TYPE [-L LABEL] /dev/DEVICE

需要說明的是,使用mkfs -t FS_TYPE等效於mkfs.FS_TYPE命令,如

mkfs -t ext2 = mkfs.ext2
mkfs -t ext3 = mkfs.ext3

系統中有衆多以mkfs.開頭的命令:

[root@localhost ~]# mkfs.
mkfs.btrfs   mkfs.ext2    mkfs.ext4    mkfs.minix   mkfs.vfat
mkfs.cramfs  mkfs.ext3    mkfs.fat     mkfs.msdos   mkfs.xfs

/proc/filesystems文件中顯示當前內核所支持的文件系統

mke2fs

該命令專用戶創建ext家族的文件系統,其用法爲

mke2fs OPTIONS /dev/DEVICE
OPTIONS
	-t {ext2|ext3|ext4}	指定文件系統類型,默認爲ext2
	-j			即Journal,創建ext3類型文件系統,等於-t ext3

	-b {1024|2048|4096}	指定塊大小,默認爲4096
	-L LABEL		指定分區卷標
		e2lable /dev/DEVICE		查看設備的卷標
		e2lable /dev/DEVICE LABLE 	設置卷標
	-m #	指定預留給管理員的塊數百分比,默認爲5,指定時不用加%
	-i #		意爲bytes per inode
		用於指定爲多少個字節的空間創建一個inode,默認爲8192,這裏給出的數值應該爲塊大小的2^n倍
		在nke2fs的配置文件(/etc/mke2fs.conf)中爲創建不同大小的分區指定了相應的值(inode_ratio)
	-I #		指定inode大小
	-N #		指定要創建的inode個數
	-F			強制創建文件系統,默認當文件系統被掛載時,不能創建
	-E			用於指定額外的文件系統屬性
	-O FEATURE [, … ]		啓用指定分區特性
		-O ^FEATURE		關閉指定分區特性

故要創建ext系列文件系統,以下命令等效

ext3:mkfs -t ext3 = mkfs.ext3 = mke2fs -t ext3 =mke2fs -j
ext4:mkfs -t ext4 = mkfs.ext4 = mke2fs -t ext4

其他管理命令

blkid

blkid即block id,用於顯示或定位block設備的屬性,使用格式爲

blkid [OPTIONS] /dev/DEVICE
	-U UUID   根據UUID(統一全局標示符)查找設備
	-L LABEL  根據卷標查找設備

[root@localhost ~]# blkid /dev/sda
/dev/sda: PTTYPE="dos"
[root@localhost ~]# blkid /dev/sda1
/dev/sda1: UUID="a8cac4fb-841a-421d-ba11-ea7eee1c57bc" TYPE="xfs"

tune2fs

該命令用於查看或設定ext系列文件系統的可調整參數的值,用法如下

tune2fs OPTIONS DEVICE
	OPTIONS 
		-j		不損壞原有數據,將ext2升級爲ext3
			可以將ext3文件系統掛載爲etx2,不使用日誌區,但不能降級
		-L LABEL	設定或修改卷標
		-m #		調整給超級用戶預留的空間百分比
		-r #		指定預留塊數
		-o		設定文件系統的默認掛載選項
			# tune2fs -o MOUNT-OPTION 設備		指定默認掛載屬性
			# tune2fs -o ^MOUNT-OPTION 設備		取消默認掛載屬性
			acl		Enable Posix Access Control Lists
		-O		調整分區特性
			tune2fs -l結果中的Filesystem features字段即爲分區特性
			在特性前加^表示關閉該特性,不加表示打開,如
				tune2fs -O ^huge_file /dev/sda1		關閉huge_file特性
				tune2fs -O huge_file /dev/sda1		打開huge_file特性
			在設定或清除了某些特性,必須執行e2fsck命令,man tune2fs查看詳情
		-c #		指定掛載次數達到#次之後進行自檢,0或-1表示關閉此功能
		-U UUID	修改UUID
		-i #		指定沒掛載多少天后進行自檢,0或-1表關閉此功能
		-l	顯示指定文件系統超級塊中保存的信息,類似於dumpe2fs -h

再次強調,在設定或清除了某些特性,必須執行e2fsck命令進行檢查

lsblk

即list block,用於查看系統上的磁盤列表,如

[root@localhost ~]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0   120G  0 disk
├─sda1            8:1    0   500M  0 part /boot
└─sda2            8:2    0 119.5G  0 part
  ├─centos-root 253:0    0    50G  0 lvm  /
  ├─centos-swap 253:1    0     2G  0 lvm  [SWAP]
  └─centos-home 253:2    0  67.5G  0 lvm  /home
sdb               8:16   0   100G  0 disk
sdc               8:32   0    20G  0 disk
sdd               8:48   0    20G  0 disk
└─sdd1            8:49   0     5G  0 part
sr0              11:0    1  1024M  0 rom

dumpe2fs

該命令用於查看ext系列文件系統信息,可使用-h選項查看超級塊中的信息如

[root@localhost ~]# dumpe2fs -h /dev/sdd1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          /mnt
Filesystem UUID:          7b7a81d1-d456-4acc-8a68-ebdef42d126b
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              327680
Block count:              1310720
Reserved block count:     65536
Free blocks:              1252257
Free inodes:              327668
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Reserved GDT blocks:      639
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Wed Jan  9 00:49:52 2019
Last mount time:          Wed Jan  9 00:50:18 2019
Last write time:          Wed Jan  9 00:52:27 2019
Mount count:              1
Maximum mount count:      -1
Last checked:             Wed Jan  9 00:49:52 2019
Check interval:           0 (<none>)
Lifetime writes:          213 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:	          256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      e67934ba-be08-4b9d-a0e7-e22212798ebe
Journal backup:           inode blocks
Journal features:         journal_64bit
Journal size:             128M
Journal length:           32768
Journal sequence:         0x00000006
Journal start:            0

e2label

該命令用於管理ext系列文件系統的LABEL,實施上以上的其他命令有的選項也可指定LABEL,該命令用法交文件單,使用格式爲e2label DEVICE NEW_LABEL

fsck

即File System ChecK,用於檢測及修復文件系統,其使用格式爲

fsck [OPTIONS] DEVICE
	OPTIONS
		-t FSTYPE		指定文件系統類型
		-f				強行檢測(默認若沒有問題,則略過檢測)
		-a				自動修復錯誤
		-r				交互式修復錯誤

需要說明的是,在指定文件系統類型時,一定要與分區上已有的文件系統類型相同,並且與mkfs類似,該命令也有fsck.FS_TYPE的類型

同時,還有一個專用於ext系列文件系統檢查的工具e2fsck,使用時會自動判定文件系統:

e2fsck [OPTIONS] DEVICE
	OPTIONS
		-t	顯示e2fsck執行的時間統計
		-f			強制修復
		-p			自動修復
		-y			自動回答爲yes

此外,建議文件系統離線檢測

BtrFS管理命令

BtrFS相關命令均以“btrfs”開頭,有衆多子命令,此處從文件系統創建開始進行說明

  • 文件系統創建:mkfs.btrfs

    -L 'LABEL'		指定卷標
    
    -d <type>		數據存儲類型
    	raid0|raid1|raid5|raid10|raid6|single
    -m <profile>	元數據存儲類型
    	raid0|raid1|raid5|raid10|raid6|single|dup
    	
    -O <feature>	啓用的特性
    -O list-all		列出支持的所有特性
    

    關於RAID,下文將做介紹

  • 屬性查看

    btrfs filesystem show DEVICE
    	DEVICE可以是欲查看BTRFS下的任意設備,如使用/dev/sdb,/dev/sdc創建了一個BTRFS,則此處指定爲二者之一均可
    

    可查看btrfs-filesystem(8)獲取詳細信息

  • 啓用透明壓縮機制

    mount -o compress={lzo|zlib} DEVICE MOUNT_POINT
    
  • 在線修改文件系統大小

    btrfs filesystem resize ([+|-]#[KMGT…])|max /DEVICE
    	指定爲max可直接調整爲最大
    
  • 爲btrfs增加設備

    btrfs device add DEVICE MOUNTPOINT
    
    如:btrfs device /dev/sdd /mydata(/mydata是btrfs設備的掛載點)
    
  • 文件系統平衡

    btrfs balance start MOUNTPOINT
    
  • 拆除設備

btrfs device delete DEVICE MOUNTPOINT
  • 修改數據或元數據存儲方式

    btrfs balance start -[d|m]convert=[raid0|raid1|raid10|raid5|raid6|dup|single] MOUNT_POINT
    	-d:數據存儲方式
    	-m:元數據存儲方式
    	-d或m與comvert之間沒有空格
    
    	注意不同raid級別對於設備個數的要求
    

    可查看btrfs-device(8)獲取詳細信息

  • 創建子卷

    btrfs subvolume create /PARENT_VOLUME_MOUNT_POINT/SUB_VOLUME_NAME
    
    如:# btrfs subvolume create /mydata/logs
    

    創建子卷後,子卷可單獨掛載(下文將做詳細介紹)

    mount -o subvol=SUB_VOLUME_NAME DEVICE SUB_VOLUME_MOUNT_POINT
    

    mount -o subvolid=SUB_VOLUME_ID DEVICE SUB_VOLUME_MOUNT_POINT
    

    可查看btrfs-subvolume(8)獲取詳細信息

    子卷可單獨掛載,而掛載父卷後,子卷將被自動掛載

    可對子卷再次創建子卷

  • 查看子卷信息

    btrfs subvolume list /PARENT_VOLUME_MOUNT_POINT
    	ID爲子卷ID
    
  • 刪除子卷

    btrfs subvolum delete SUB_VOLUME
    
  • 爲子卷創建快照卷
    快照原理同LVM(下文將做介紹),創建的快照卷需與子卷屬於同一個父卷

    btrfs subvolume snapshot SUB_VOLUME SNAPSHOT_VOLUME
    
        SNAPSHOT_VOLUME爲待新建的快照卷,如
      		btrfs subvolume snapshot /mydata/logs/ /mydata/logs_snapshot
      		
      查看信息:
      	# btrfs subvolume list /mydata/
      	ID 264 gen 74 top level 5 path cache
      	ID 265 gen 78 top level 5 path logs
      	ID 266 gen 78 top level 5 path logs_snapshot
    

    刪除快照卷的方式同刪除子卷

  • 爲單個文件做快照
    基於BTRFS的CoW特性實現,即在修改文件時將原文件複製,修改複製出的新文件,修改完成後將文件指針指向新文件

    cp --reflink ORIGIN_FILE SNAP_FILE
    	ORIGIN_FILE應與SNAP_FILE位於同一卷中
    
  • 將ext系列文件系無損統轉換爲BTRFS

    btrfs-convert DEVICE
    

    轉換完成後,會生成ext2_saved文件,保存有原ext文件系統相關元數據信息

  • 還原回ext文件系統

    btrfs-convert -r DEVICE
    

7. 掛載

什麼是掛載

將一塊磁盤分區並格式化爲特性文件系統之後,就可以使用了,而我們顯然不能只是通過其設備文件進行讀寫操作。

在Windows系統中,我們可以爲每一個分區指定一個盤符,以此來訪問該分區,如C:\Windows\notepad.exe,需要說明的是,Windows使用反斜線\作爲路徑分隔符的

而在Linux系統中,一切資源的訪問都是由/開始,因此我們不能通過綁定盤符的方式直接訪問。我可可以將分區綁定到某一目錄,該目錄即爲此分區的訪問入口,這就是掛載(Mount),該目錄一般被稱爲掛載點(Mount Point)

如,若將上面的C盤掛載到Linux系統的/mnt/windows_file目錄,則該記事本程序的訪問路徑爲/mnt/windows_file/Windows/notepad.exe

此外,需要注意的是,掛載點下可以有其他文件,但是掛載分區後,該目錄下的文件將被隱藏,因爲此時訪問該目錄實質上訪問的是掛載的分區中的文件,卸載分區後,掛載點目錄中原有文件就可重新訪問

相關命令

mount

顧名思義,該命令用於文件系統掛載,其用法爲

mount [options] [-t FSTYPE] [-o options] DEVICE MOUNT_POINT
	options
		-a		自動掛載/etc/fstable文件中定義的所有支持自動掛載的設備
		-n		不更新/etc/mtab
			默認情況下,每掛載(或卸載)一個設備,都會把掛載的設備信息保存至/etc/mtab文件中(使用不帶任何參數的mount命令顯示的就是該文件的內容)
	
			應用-n選項意味着掛載設備時,不把信息寫入此文件
	
			/proc/mounts中可查看內核追蹤到的已掛載的所有設備
			
		-t FSTYPE
			指定正在掛載設備上的文件系統的類型,不使用此選項時,mount會調用blkid命令獲取對應文系統的類型
		-r			只讀掛載,掛載光盤時常用此選項,等於-o ro
		-w			讀寫掛載
		-L LABEL		以卷標指定掛載設備,LABEL="卷標"也可以
		-U UUID		以UUID指定掛載設備,UUID="UUID"也可以
		-B, --bind  		綁定目錄到另一個目錄上
			可以實現將兩個目錄綁定
			-bind DIR1 DIR2		將DIR1綁定到DIR2上
	
		-o		指定額外的掛載選項,也即指定文件系統啓用的屬性
			可同時使用多個,使用逗號分隔

關於DEVICE,即爲要掛載的設備,可以指定爲:

  • 設備文件:如/dev/sda5
  • 卷標:LABEL="卷標",或 -L "卷標"
  • UUID: UUID="UUID",或 -U 'UUID'
  • 僞文件系統名稱:procsysfsdevtmpfsconfigfs

關於掛載選項,有以下常用選項

選項 說明
async 啓用異步I/O,默認啓用
sync 啓用同步I/O
atime 每次訪問都更新訪問時間,包括目錄和文件,
noatime可關閉該特性
diratime 每次訪問都更新訪問時間,只有目錄,
nodiratime可關閉該特性
auto 可以使用-a選項自動掛載,
noauto可關閉該特性
dev 允許啓用設備上的設備文件(如果有),
nodev可關閉該特性
exec 允許執行二進制文件,
noexec可關閉該特性
group 允許普通用戶掛載,要求用戶的在設備的屬組中
_netdev 若掛載的文件系統不在本地,而且無法連接到時,就不再繼續掛載(默認會一直嘗試掛載)
remount 重新掛載當前文件系統
如: mount -o remount,rw /dev/sda1 掛載爲讀寫,掛載點不變
suid 是否SUID與SGID權限位生效,
nosuid可關閉該特性
acl 啓用此文件系統上的FACL,
可以使用tune2fs -o acl使其默認啓用,前面加^關閉
ro 掛載爲只讀
rw 讀寫掛載
user/nouser 是否允許普通用戶掛載此設備
defaults 默認掛載選項,相當於
rw, suid, dev, exec, auto, nouser, and async
CentOS7之前爲: rw, suid, dev, exec, auto, nouser, and async

使用不帶任何參數的mount命令可查看系統當前已掛載的設備

另外,可通過以下命令查看當前系統所有已掛載的設備

  • mount
  • cat /etc/mtab
  • cat /proc/mounts

關於掛載,還有一個小話題:掛載特殊設備

  • 掛載光盤設備
    光盤設備文件
    • IDE: /dev/dhc
    • SATA: /dev/sr0
    而其有衆多的符號鏈接文件,如
    • /dev/cdrom
    • /dev/cdrw
    • /dev/dvd
    • /dev/dvdrw
    光盤設備問文件系統類型爲iso9600,不過在掛載光盤時可以不指定文件系統類型,系統可自動識別
    故掛載光盤的一般方式爲:mount -r /dev/cdrom MOUNT_POINT
  • 掛載ISO鏡像(本地迴環設備)
    可以將ISO鏡像文件像光盤一樣掛載
    掛載時指定-o loop選項即可,如
    mount -o loop /root/rhci-5.8-1.iso /media/

umount

該命令用於卸載設備,命令後跟設備或掛載點均可,即

mount DEVICE|MOUNT_POINT

注意:掛載的設備應該沒有被進程使用

若設備不空閒,可使用lsoffuser查看

fuser
	identify processes using filesorsockets
	-v		Verbose  mode
		例:fuser -v /media/cdrom
	-k		Kill processes accessing the file
	-m		specifies a file on a mounted file system or a block device that is mounted

查看佔用掛載點的進程:fuser -v MOUNT_POINT
殺死佔用掛載點的進程:fuser -km MOUNT_POINT

df

該命令可查看文件系統的空間使用情況,用法問

df [OPTION]... [FILE]…
	OPTION
		-l		limit listing to local file systems
		-h		human readable format
		-i		list inode information instead of block usage
		-P		use the POSIX output format
			POSIX: Protable Operating System Interface

[root@localhost ~]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos-root  52403200 4923984  47479216  10% /
devtmpfs                   924592       0    924592   0% /dev
tmpfs                      935256       0    935256   0% /dev/shm
tmpfs                      935256    9232    926024   1% /run
tmpfs                      935256       0    935256   0% /sys/fs/cgroup
/dev/sda1                  508588  128308    380280  26% /boot
/dev/mapper/centos-home  70687004   33204  70653800   1% /home
tmpfs                      187052       0    187052   0% /run/user/0

du

我們在使用ls -l查看目錄大小時,顯示的是目錄本身的大小而非是目錄內文件的大小。而du命令可用於評估文件佔用磁盤的空間情況,使用格式爲

du [OPTIONS] [FILES]
	OPTIONS
		-s		summarize,顯示目錄大小,默認會遞歸顯示
		-h		human readable

hdparm

該命令可擴區STAT/IDE設備的相關參數,使用格式爲

hdparm [OPTIONS] [DEVICE]
	OPTIONS
		-i		顯示內核識別的信息
		-I		直接從硬盤上讀取信息
		-g		Display the drive geometry,顯示佈局信息
		-t		評估硬盤的讀取效率
		-T		評估硬盤快取的讀取效率

/etc/fstab文件

系統在初始化時,會讀取該文件,將該文件中指定的設備掛載,故該文件可被稱爲文件掛載的配置文件

其內容如下

[root@localhost ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

#開頭的爲註釋,該文件每行定義一個要掛載的文件系統,共有6個字段,中間使用空白字符(一般爲空格括橫向製表符)分隔,格式爲

fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno
	fs_spec:要掛載的設備文件或僞文件系統,可指定爲:
		設備文件
		LABEL=
		UUID=
		僞文件系統名(proc,sysfs,…)

	fs_file:掛載點
		swap沒有掛載點,使用swap時,應指定爲swap

	fs_vfstype:文件系統類型

	fs_mntops:掛載選項
		多個選項間使用逗號(,)分隔
				
	fs_freq :轉儲頻率,即備份頻率
		0:從不備份,1:每日備份,2:每2日備份
		
	fs_passno:自檢次序
		0:不自檢
		1:首先自檢,通常只能被rootfs使用
		…
		9
		
		自檢的次序可以相同

編輯完成後,會在下次系統啓動時掛載,欲立即掛載,使用mount -a

8. 例

  1. 創建一個2G的分區,文件系統爲ext2,卷標爲DATA,塊大小爲1024,預留管理空間爲磁盤分區的8%,掛載至/backup目錄,要求使用卷標進行掛載,且在掛載時啓動此文件系統上的acl功能
# mke2fs -L DATA -b 1024 -m 8  /dev/sda7
# mount -o acl LABEL=DATA /backup
# tune2fs -o acl /dev/sda7
# mount LABEL=DATA /backup
  1. 將此文件系統的超級塊中的信息中包含了block和inode的行保存至/tmp/partition.txt中
tune2fs -l | egrep -i	 "block|inode" >> /tmp/partition.txt
  1. 複製/etc目錄中的所有文件至此文件系統,而後調整此文件系統類型爲ext3,要求不能損壞已經複製而來的文件
# cp -r /etc/*	/backup
# tune2	-j /dev/sda7
  1. 調整其預留百分比爲3%
# tune2fs -m 3 -L DATA /dev/sda7
  1. 以重新掛載的方式掛載此文件系統爲不更新訪問時間戳,並驗正其效果
# stat /backup/inittab
# cat /backup/inittab
# stat

# mount -o remount,noatime /backup
# cat 
# stat
  1. 對此文件系統強行做一次檢測
# e2fsck -f /dev/sda7
  1. 刪除複製而來的所有文件,並將此文件系統重新掛載爲同步(sync),後再次複製/etc目錄中的所有文件至此掛載點,體驗其性能變化
# rm -rf /backup/*
# mount -o remount,sync /backup
# cp -r /etc/* /backup

三、RAID

1. RAID是什麼

RAID(Redundant Array of Independent Disks)獨立硬盤冗餘陣列,舊稱廉價磁盤冗餘陣列(Redundant Array of Inexpensive Disks),簡稱磁盤陣列。

其基本思想就是把多個相對便宜的硬盤組合起來,成爲一個硬盤陣列組,使性能達到甚至超過一個價格昂貴、容量巨大的硬盤。

1987年,加州大學伯克利分校的Patterson,Gibson和Katz發表了一篇題爲“A Case for Redundant Array of Inexpensive Disks(RAID)”的論文,講述了RAID8。是時,數據主要存儲在昂貴的大型磁盤驅動程序(稱爲SLED,Single Large Expensive Disk)上。而後來,RAID也越來越貴了,就將Inexpensive(廉價)改成了Independent(獨立)😂

2. RAID的實現方式

  • 外接式磁盤陣列:通過擴展卡提供適配能力
  • 內接式RAID:主板集成RAID控制器
  • Software RAID:軟件模擬實現的RAID

3. 常用的RAID級別介紹

根據選擇的RAID版本(級別)不同,RAID比單顆硬盤有以下一個或多個方面的好處:增強數據集成度,增強容錯功能,增加處理量或容量。另外,磁盤陣列對於計算機來說,看起來就像一個單獨的硬盤或邏輯存儲單元。常用的有RAID-0,RAID-1,RAID-5,RAID-6,RAID-01,RAID-10,RAID-50,RAID-60。

需要說明到的是,RAID各級別之間沒有直接的孰優孰劣之分,RAID級別僅表示其底層數據不同的組織管理方式

RAID 0

RAID0
RAID 0亦稱爲帶區集(strip)。它將兩個以上的磁盤並聯起來,成爲一個大容量的磁盤。在存放數據時,分段後分散存儲在這些磁盤中,因爲讀寫時都可以並行處理,所以在所有的級別中,RAID 0的速度是最快的。但是RAID 0既沒有冗餘功能,也不具備容錯能力,如果一個磁盤(物理)損壞,所有數據都會丟失,危險程度與JBOD相當。

RAID 1

RAID1
兩組以上的N個磁盤相互作鏡像,在一些多線程操作系統中能有很好的讀取速度,理論上讀取速度等於硬盤數量的倍數,與RAID 0相同。另外寫入速度有微小的降低。只要一個磁盤正常即可維持運作,可靠性最高。其原理爲在主硬盤上存放數據的同時也在鏡像硬盤上寫一樣的數據。當主硬盤(物理)損壞時,鏡像硬盤則代替主硬盤的工作。因爲有鏡像硬盤做數據備份,所以RAID 1的數據安全性在所有的RAID級別上來說是最好的。但無論用多少磁盤做RAID 1,僅算一個磁盤的容量,是所有RAID中磁盤利用率最低的一個級別。

可用空間爲
Size=min(S1,S2,S3,...)Size=min(S_1,S_2,S_3,...)
如果用兩個不同大小的磁盤建RAID 1,可用空間爲較小的那個磁盤,較大的磁盤多出來的空間也可以分割成一個區來使用,不會造成浪費

RAID 4

RAID4
RAID4使用一塊盤作爲其他盤上數據的校驗碼(異或)盤,(塊交織技術,Block interleaving)允許其中一個盤壞掉

由於訪問任何一塊盤都可能使用到校驗盤,遂校驗盤會成爲瓶頸

RAID 5

RAID5
RAID5使用的是Disk Striping(硬盤分割)技術,各盤輪流作爲校驗盤。RAID 5至少需要三個硬盤,RAID 5不是對存儲的數據進行備份,而是把數據和相對應的奇偶校驗信息存儲到組成RAID5的各個磁盤上,並且奇偶校驗信息和相對應的數據分別存儲於不同的磁盤上。

當RAID5的一個磁盤數據發生損壞後,可以利用剩下的數據和相應的奇偶校驗信息去恢復被損壞的數據。RAID 5可以理解爲是RAID 0和RAID 1的折衷方案。RAID 5可以爲系統提供數據安全保障,但保障程度要比鏡像低而磁盤空間利用率要比鏡像高。

RAID 5具有和RAID 0相近似的數據讀取速度,只是因爲多了一個奇偶校驗信息,寫入數據的速度相對單獨寫入一塊硬盤的速度略慢,若使用“回寫緩存”可以讓性能改善不少。同時由於多個數據對應一個奇偶校驗信息,RAID 5的磁盤空間利用率要比RAID 1高,存儲成本相對較便宜。

可用容量爲
Size=(N1)min(S1,S2,S3,...Sn)Size=(N-1) * min(S_1,S_2,S_3,...S_n)

RAID 6

RAID6
與RAID 5相比,RAID 6增加第二個獨立的奇偶校驗信息塊。兩個獨立的奇偶系統使用不同的算法,數據的可靠性非常高,任意兩塊磁盤同時失效時不會影響數據完整性。RAID 6需要分配給奇偶校驗信息更大的磁盤空間和額外的校驗計算,相對於RAID 5有更大的IO操作量和計算量,其“寫性能”強烈取決於具體的實現方案,因此RAID 6通常不會通過軟件方式來實現,而更可能通過硬件方式實現。

同一數組中最多容許兩個磁盤損壞。更換新磁盤後,數據將會重新算出並寫入新的磁盤中。

依照設計理論,RAID 6必須具備四個以上的磁盤才能生效。可使用的容量爲硬盤總數減去2的差,乘以最小容量,公式爲:

Size=(N2)min(S1,S2,S3,...Sn)Size=(N-2) * min(S_1,S_2,S_3,...S_n)

同理,數據保護區域容量則爲最小容量乘以2。

RAID 6在硬件磁盤陣列卡的功能中,也是最常見的磁盤陣列檔次。

以下表格對比了各RAID特性9

項目 RAID0 RAID1 RAID10 RAID5 RAID6
最少硬盤數 2 2 4 3 4
最大容錯磁盤數 n-1 n/2 1 2
資料安全性 完全沒有 最佳 最佳 比RAID5 好
理論寫入性能 n 1 n/2 <n-1 <n-2
理論讀出性能 n n n <n-1 <n-2
可用容量 n 1 n/2 n-1 n-2
一般應用 強調效能但資料不重要的環境 資料與備份 服務器、雲系統常用 資料與備份 資料與備份

組合方案

可以將多種RAID進行組合,從而實現更可靠的存儲方案,常用的組合方案有

  • RAID 10
  • RAID 01
  • RAID 50
  • RAID 60

組合RAID級別的數字,左邊的即爲實際RAID的下層,如RAID 10即將多組RADI1組合成RAID0,01即將多組RADI0組合成RAID1,如下圖所示

RAID 10

RAID_10
RAID 10是先鏡射再分割數據,再將所有硬盤分爲兩組,視爲是RAID 0的最低組合,然後將這兩組各自視爲RAID 1運作

當RAID 10有一個硬盤受損,其餘硬盤會繼續運作

RAID 01

RAID_01
RAID 01則是跟RAID 10的程序相反,是先分割再將數據鏡射到兩組硬盤。它將所有的硬盤分爲兩組,變成RAID 1的最低組合,而將兩組硬盤各自視爲RAID 0運作

RAID 01只要有一個硬盤受損,同組RAID 0的所有硬盤都會停止運作,只剩下其他組的硬盤運作,可靠性較低

RAID 50

RAID_50
RAID 5與RAID 0的組合,先作RAID 5,再作RAID 0,也就是對多組RAID 5彼此構成Stripe訪問。

由於RAID 50是以RAID 5爲基礎,而RAID 5至少需要3顆硬盤,因此要以多組RAID 5構成RAID 50,至少需要6顆硬盤。以RAID 50最小的6顆硬盤配置爲例,先把6顆硬盤分爲2組,每組3顆構成RAID 5,如此就得到兩組RAID 5,然後再把兩組RAID 5構成RAID 0。

RAID 50在底層的任一組或多組RAID 5中出現1顆硬盤損壞時,仍能維持運作,不過如果任一組RAID 5中出現2顆或2顆以上硬盤損毀,整組RAID 50就會失效。

RAID 50由於在上層把多組RAID 5構成Stripe,性能比起單純的RAID 5高,容量利用率比RAID5要低。

RAID 60

RAID_60

RAID 6與RAID 0的組合:先作RAID 6,再作RAID 0。換句話說,就是對兩組以上的RAID 6作Stripe訪問。RAID 6至少需具備4顆硬盤,所以RAID 60的最小需求是8顆硬盤。

由於底層是以RAID 6組成,所以RAID 60可以容許任一組RAID 6中損毀最多2顆硬盤,而系統仍能維持運作;不過只要底層任一組RAID 6中損毀3顆硬盤,整組RAID 60就會失效,當然這種情況的機率相當低。

比起單純的RAID 6,RAID 60的上層透過結合多組RAID 6構成Stripe訪問,因此性能較高。不過使用門檻高,而且容量利用率低是較大的問題。

4. JBOD

JBOD
JBOD( Just a Bunch Of Disks),磁盤簇,在分類上,JBOD並不是RAID。只是將多個硬盤空間合併成一個大的邏輯硬盤,沒有錯誤備援機制

5. 模擬RAID實現

大體來講RAID可以有軟件RAID(software RAID)與硬件RAID(hardware RAID),硬件RAID是通過磁盤陣列卡來達成陣列的目的,磁碟陣列卡上面有一塊專門的處理器在處理RAID的任務

在實現時,硬件的磁盤陣列使用較爲簡單,加之由於設備的不同操作亦可能不同,此處主要說明使用軟件來模擬RAID的實現方式,Linux中主要通過mdadm命令實現

MD模塊

mdadm命令結合內核中的md(multi devices)模塊工作,事實上應該說,Linux中可以通過md模塊來實現軟RAID,在用戶空間用mdadm來管理軟RAID設備

我們可以在機器啓動後通過cat /proc/mdstat看內核是否已經加載MD驅動或者cat /proc/devices是否有md塊設備

[root@localhost ~]# cat /proc/mdstat
Personalities :
unused devices: <none>
[root@localhost ~]# cat /proc/devices | grep md
  9 md
254 mdp

md模塊可以將多塊硬盤,通過軟件的方式,組合起來,形成RAID,要是用的話,需要通過這個模塊來訪問,若直接通過/dev/sd*訪問,則還是獨立的磁盤

在Linux中,使用軟RAID,先模擬一個RAID,設備文件爲/dev/md,系統在使用時,內核在內部將數據化成對應的格式,proc/mdstat文件會顯示當前系統上所有已經啓用的RAID設備

mdadm

mdadm即md admin,通過該命令,可以將任何塊設備做成RAID,該命令是模式化命令,注意,adadm只是管理工具,與RAID實際工作無關,支持的RAID級別:LINEAR,RAID0,RAID1,RAID4,RAID5,RAID6,RAID10,配置文件爲/etc/mdadm.conf

有以下常用模式

模式 說明
Create 創建模式,使用空閒的設備創建一個新的陣列,每個設備具有元數據塊
Assemble 裝配模式,將原來屬於一個陣列的每個塊設備組裝爲陣列
Manage 管理已經存儲陣列中的設備,比如增加熱備磁盤或者設置某個磁盤失效,然後從陣列中刪除這個磁盤
Grow 增長模式,改變陣列中每個設備被使用的容量或陣列中的設備的數目
Follow or Monitor 監控模式,監控一個或多個陣列,上報指定的事件
Manage 管理模式,停止、拆散RAID,默認處於管理模式

該命令使用格式爲

mdadm [mode] <raiddevice> [options] <component-devices>
	<raiddevice>:/dev/md#
	<component-devices>:可以是任意塊設備
	mode:模式
		-A:裝配模式
		
		-C:創建模式
			一般-C後要跟設備文件(md#)
			可以查看/proc/mdstat獲取已經啓用的RAID信息
			專用選項
			-l #		指定RAID級別
			-n #		用於創建RAID設備的設備個數
			-a yes|no	是否自動爲創建的RAID設備創建設備文件
			-c #		指定chunk(數據塊)大小,2^n,默認是512K
				系統在實現軟RAID時,每生成一個chunk,都會計算相當於多少個磁盤塊
				爲提升RAID性能,創建好RAID後,在格式化時,在使用mke2fs命令中使用-b指定block後可加-E stride來指定條帶(即chunk除以block的商),這樣就避免了每次計算
			-x #		指定熱備盤個數
				x的個數+n的個數應該與命令後給出的盤的個數一致
				
		-F:監控模式
		
		-G:增長模式
		
		默認爲管理模式
			-f|--fail		模擬設備損壞,如:
				mdadm /dev/md# --fail /dev/sda7	模擬md#陣列中的sda7損壞
			-r|--remove	移除磁盤
			-a|--add		加入新磁盤
			-S			停止陣列
	
		-D|--detail			顯示陣列的詳細信息
			-D --scan	查看當前系統上的RAID設備詳細信息
			將當前RAID信息保存至配置文件,以便以後進行裝配:
				mdamd -D --scan > /etc/mdadm.conf

此處將創建一個RAID5,並進行相關管理操作。需要說明的是,RAID用於提升續寫性能或可用性,故將同一磁盤上的不同分區模擬爲RAID沒有現實意義,此處僅作實例進行說明

  1. 創建分區
[root@localhost ~]# fdisk /dev/sdd
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
Partition 1 of type Linux and of size 2 GiB is set

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (2-4, default 2):
First sector (4196352-41943039, default 4196352):
Using default value 4196352
Last sector, +sectors or +size{K,M,G} (4196352-41943039, default 41943039): +2G
Partition 2 of type Linux and of size 2 GiB is set

Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p
Partition number (3,4, default 3):
First sector (8390656-41943039, default 8390656):
Using default value 8390656
Last sector, +sectors or +size{K,M,G} (8390656-41943039, default 41943039): +2G
Partition 3 of type Linux and of size 2 GiB is set

Command (m for help): t
Partition number (1-3, default 3): 1
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'

Command (m for help): t
Partition number (1-3, default 3): 2
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'

Command (m for help): t
Partition number (1-3, default 3): 3
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'

Command (m for help): n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e
Selected partition 4
First sector (12584960-41943039, default 12584960):
Using default value 12584960
Last sector, +sectors or +size{K,M,G} (12584960-41943039, default 41943039):
Using default value 41943039
Partition 4 of type Extended and of size 14 GiB is set

Command (m for help): n
All primary partitions are in use
Adding logical partition 5
First sector (12587008-41943039, default 12587008):
Using default value 12587008
Last sector, +sectors or +size{K,M,G} (12587008-41943039, default 41943039): +2G
Partition 5 of type Linux and of size 2 GiB is set


Command (m for help): t
Partition number (1-5, default 5):
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'

Command (m for help): p

Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x91df3cad

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1            2048     4196351     2097152   fd  Linux raid autodetect
/dev/sdd2         4196352     8390655     2097152   fd  Linux raid autodetect
/dev/sdd3         8390656    12584959     2097152   fd  Linux raid autodetect
/dev/sdd4        12584960    41943039    14679040    5  Extended
/dev/sdd5        12587008    16781311     2097152   fd  Linux raid autodetect

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# cat /proc/partitions
major minor  #blocks  name

   8       48   20971520 sdd
   8       49    2097152 sdd1
   8       50    2097152 sdd2
   8       51    2097152 sdd3
   8       52          1 sdd4
   8       53    2097152 sdd5
   8       32   20971520 sdc
   8       16  104857600 sdb
   8        0  125829120 sda
   8        1     512000 sda1
   8        2  125316096 sda2
  11        0    1048575 sr0
 253        0   52428800 dm-0
 253        1    2097152 dm-1
 253        2   70721536 dm-2
  1. 創建RAID
[root@localhost ~]# mdadm -C /dev/md0 -l5 -n3 /dev/sdd[1-3] -x1 /dev/sdd5
mdadm: /dev/sdd1 appears to contain an ext2fs file system
       size=5242880K  mtime=Fri Feb 22 10:09:39 2019
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

此時,可查看/proc/mdstat文件查看當前RAID狀態:

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd3[4] sdd5[3](S) sdd2[1] sdd1[0]
      4190208 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [====>................]  recovery = 22.0% (461452/2095104) finish=0.1min speed=230726K/sec

unused devices: <none>

可通過watch命令進行動態顯示,watch命令用法爲:

		watch:execute a program periodically, showing output fullscreen
			週期性地執行一個程序,並以全屏方式顯示
			
			-n #		指定週期長度,單位爲s,默認爲2
			
		一般格式爲
			watch -n # 'COMMAND'		#和n之間可以沒有空格

如:watch 'cat /proc/mdstat':重複執行命令,默認每隔2s刷新一次

  1. 掛載使用
    MD設備可以像普通塊設備那樣直接讀寫,也可以做文件系統格式化
[root@localhost ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
262144 inodes, 1047552 blocks
52377 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1073741824
32 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

[root@localhost ~]# mount /dev/md0 /mnt/
[root@localhost ~]# cp /etc/fstab /mnt/
[root@localhost ~]# cat /mnt/
fstab       lost+found/
[root@localhost ~]# cat /mnt/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
  1. 查看RAID信息
    4.1 /proc/mdstat
    如上介紹,可通過查看/proc/mdstat文件查看所有運行的RAID陣列的狀態:

    [root@localhost ~]# cat /proc/mdstat
    Personalities : [raid6] [raid5] [raid4]
    md0 : active raid5 sdd3[4] sdd5[3](S) sdd2[1] sdd1[0]
          4190208 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
    
    unused devices: <none>
    

    在第一行中首先是MD的設備名,active和inactive選項表示陣列是否能讀寫,接着是陣列的RAID級別,後面是屬於陣列的塊設備,方括號[]裏的數字表示設備在陣列中的序號,(S)表示其是熱備盤,(F)表示這個磁盤是faulty狀態。在第二行中首先是陣列的大小,單位是KB,接着是chunk-size的大小,然後是layout類型,不同RAID級別的layout類型不同,[3/3]和[UUU]表示陣列有3個磁盤並且3個磁盤都是正常運行的,若爲[5/6]和[_UUUUU] 表示陣列有6個磁盤中5個都是正常運行的,下劃線對應的那個位置的磁盤是faulty狀態的

    4.2 /sys/block/MD_DEVICE
    此處可通過查看sys/block/md0查看相關信息

    [root@localhost ~]# ll /sys/block/md0/
    total 0
    -r--r--r--. 1 root root 4096 Feb 22 11:09 alignment_offset
    lrwxrwxrwx. 1 root root    0 Feb 22 11:09 bdi -> ../../bdi/9:0
    -r--r--r--. 1 root root 4096 Feb 22 11:09 capability
    -r--r--r--. 1 root root 4096 Feb 22 11:09 dev
    -r--r--r--. 1 root root 4096 Feb 22 11:09 discard_alignment
    -r--r--r--. 1 root root 4096 Feb 22 11:09 ext_range
    drwxr-xr-x. 2 root root    0 Feb 22 11:07 holders
    -r--r--r--. 1 root root 4096 Feb 22 11:09 inflight
    drwxr-xr-x. 7 root root    0 Feb 22 11:01 md
    drwxr-xr-x. 2 root root    0 Feb 22 11:07 power
    drwxr-xr-x. 2 root root    0 Feb 22 11:01 queue
    -r--r--r--. 1 root root 4096 Feb 22 11:09 range
    -r--r--r--. 1 root root 4096 Feb 22 11:01 removable
    -r--r--r--. 1 root root 4096 Feb 22 11:09 ro
    -r--r--r--. 1 root root 4096 Feb 22 11:09 size
    drwxr-xr-x. 2 root root    0 Feb 22 11:07 slaves
    -r--r--r--. 1 root root 4096 Feb 22 11:09 stat
    lrwxrwxrwx. 1 root root    0 Feb 22 11:07 subsystem -> ../../../../class/block
    drwxr-xr-x. 2 root root    0 Feb 22 11:07 trace
    -rw-r--r--. 1 root root 4096 Feb 22 11:07 uevent
    [root@localhost ~]# ll /sys/block/md0/md/
    total 0
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 array_size
    -rw-r--r--. 1 root root 4096 Feb 22 11:01 array_state
    drwxr-xr-x. 2 root root    0 Feb 22 11:07 bitmap
    --w-------. 1 root root 4096 Feb 22 11:20 bitmap_set_bits
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 chunk_size
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 component_size
    -r--r--r--. 1 root root 4096 Feb 22 11:20 degraded
    drwxr-xr-x. 2 root root    0 Feb 22 11:01 dev-sdd1
    drwxr-xr-x. 2 root root    0 Feb 22 11:01 dev-sdd2
    drwxr-xr-x. 2 root root    0 Feb 22 11:01 dev-sdd3
    drwxr-xr-x. 2 root root    0 Feb 22 11:01 dev-sdd5
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 group_thread_cnt
    -r--r--r--. 1 root root 4096 Feb 22 11:20 last_sync_action
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 layout
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 level
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 max_read_errors
    -rw-r--r--. 1 root root 4096 Feb 22 11:01 metadata_version
    -r--r--r--. 1 root root 4096 Feb 22 11:20 mismatch_cnt
    --w-------. 1 root root 4096 Feb 22 11:20 new_dev
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 preread_bypass_threshold
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 raid_disks
    lrwxrwxrwx. 1 root root    0 Feb 22 11:20 rd0 -> dev-sdd1
    lrwxrwxrwx. 1 root root    0 Feb 22 11:20 rd1 -> dev-sdd2
    lrwxrwxrwx. 1 root root    0 Feb 22 11:20 rd2 -> dev-sdd3
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 reshape_direction
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 reshape_position
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 resync_start
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 safe_mode_delay
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 skip_copy
    -r--r--r--. 1 root root 4096 Feb 22 11:20 stripe_cache_active
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 stripe_cache_size
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 suspend_hi
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 suspend_lo
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 sync_action
    -r--r--r--. 1 root root 4096 Feb 22 11:20 sync_completed
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 sync_force_parallel
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 sync_max
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 sync_min
    -r--r--r--. 1 root root 4096 Feb 22 11:20 sync_speed
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 sync_speed_max
    -rw-r--r--. 1 root root 4096 Feb 22 11:20 sync_speed_min
    

    4.3 mdadm命令
    也可以通過mdadm命令查看指定陣列的簡要信息(使用–query或者其縮寫-Q)和詳細信息(使用–detail或者其縮寫-D) 詳細信息包括RAID的版本、創建的時間、RAID級別、陣列容量、可用空間、設備數量、超級塊狀態、更新時間、UUID信息、各個設備的狀態、RAID算法級別類型和佈局方式以及塊大小等信息。設備狀態信息分爲active, sync, spare, faulty, rebuilding, removing等

    [root@localhost ~]# mdadm -Q /dev/md0
    /dev/md0: 4.00GiB raid5 3 devices, 1 spare. Use mdadm --detail for more detail.
    [root@localhost ~]# mdadm --detail /dev/md0
    /dev/md0:
            Version : 1.2
      Creation Time : Fri Feb 22 11:01:13 2019
         Raid Level : raid5
         Array Size : 4190208 (4.00 GiB 4.29 GB)
      Used Dev Size : 2095104 (2046.34 MiB 2145.39 MB)
       Raid Devices : 3
      Total Devices : 4
        Persistence : Superblock is persistent
    
        Update Time : Fri Feb 22 11:08:53 2019
              State : clean
     Active Devices : 3
    Working Devices : 4
     Failed Devices : 0
      Spare Devices : 1
    
             Layout : left-symmetric
         Chunk Size : 512K
    
               Name : localhost:0  (local to host localhost)
               UUID : 92736062:d9e0b2a0:bcc31a9c:028fa55c
             Events : 18
    
        Number   Major   Minor   RaidDevice State
           0       8       49        0      active sync   /dev/sdd1
           1       8       50        1      active sync   /dev/sdd2
           4       8       51        2      active sync   /dev/sdd3
    
           3       8       53        -      spare   /dev/sdd5
    
  2. 模擬設備故障

    [root@localhost ~]# mdadm /dev/md0 --fail /dev/sdd1
    mdadm: set /dev/sdd1 faulty in /dev/md0
    

    此時,查看md自動將損壞磁盤上的數據重構到新的spare磁盤上:

    [root@localhost ~]# cat /proc/mdstat
    Personalities : [raid6] [raid5] [raid4]
    md0 : active raid5 sdd3[4] sdd5[3] sdd2[1] sdd1[0](F)
          4190208 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]
          [===>.................]  recovery = 18.9% (396940/2095104) finish=0.2min speed=99235K/sec
    
    unused devices: <none>
    

    查看當前狀態

    [root@localhost ~]# mdadm -D /dev/md0
    /dev/md0:
            Version : 1.2
      Creation Time : Fri Feb 22 11:01:13 2019
         Raid Level : raid5
         Array Size : 4190208 (4.00 GiB 4.29 GB)
      Used Dev Size : 2095104 (2046.34 MiB 2145.39 MB)
       Raid Devices : 3
      Total Devices : 4
        Persistence : Superblock is persistent
    
        Update Time : Fri Feb 22 11:33:56 2019
              State : clean, degraded, recovering
     Active Devices : 2
    Working Devices : 3
     Failed Devices : 1
      Spare Devices : 1
    
             Layout : left-symmetric
         Chunk Size : 512K
    
     Rebuild Status : 13% complete
    
               Name : localhost:0  (local to host localhost)
               UUID : 92736062:d9e0b2a0:bcc31a9c:028fa55c
             Events : 22
    
        Number   Major   Minor   RaidDevice State
           3       8       53        0      spare rebuilding   /dev/sdd5
           1       8       50        1      active sync   /dev/sdd2
           4       8       51        2      active sync   /dev/sdd3
    
           0       8       49        -      faulty   /dev/sdd1
    

    完成後:

    [root@localhost ~]# cat /proc/mdstat
    Personalities : [raid6] [raid5] [raid4]
    md0 : active raid5 sdd3[4] sdd5[3] sdd2[1] sdd1[0](F)
          4190208 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
    
    unused devices: <none>
    [root@localhost ~]# mdadm -D /dev/md0
    /dev/md0:
            Version : 1.2
      Creation Time : Fri Feb 22 11:01:13 2019
         Raid Level : raid5
         Array Size : 4190208 (4.00 GiB 4.29 GB)
      Used Dev Size : 2095104 (2046.34 MiB 2145.39 MB)
       Raid Devices : 3
      Total Devices : 4
        Persistence : Superblock is persistent
    
        Update Time : Fri Feb 22 11:34:14 2019
              State : clean
     Active Devices : 3
    Working Devices : 3
     Failed Devices : 1
      Spare Devices : 0
    
             Layout : left-symmetric
         Chunk Size : 512K
    
               Name : localhost:0  (local to host localhost)
               UUID : 92736062:d9e0b2a0:bcc31a9c:028fa55c
             Events : 37
    
        Number   Major   Minor   RaidDevice State
           3       8       53        0      active sync   /dev/sdd5
           1       8       50        1      active sync   /dev/sdd2
           4       8       51        2      active sync   /dev/sdd3
    
           0       8       49        -      faulty   /dev/sdd1
    

    其中的文件依然可用:

    [root@localhost ~]# cat /mnt/fstab
    
    #
    # /etc/fstab
    # Created by anaconda on Wed Dec 19 20:12:26 2018
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot                   xfs     defaults        0 0
    /dev/mapper/centos-home /home                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    
  3. 停用RAID

    當陣列沒有文件系統或者其他存儲應用以及高級設備使用的話,可以使用–stop(或者其縮寫-S)停止陣列;如果命令返回設備或者資源忙類型的錯誤,說明/dev/md0正在被上層應用使用,暫時不能停止,必須要首先停止上層的應用

    [root@localhost ~]# mdadm -S /dev/md0
    mdadm: fail to stop array /dev/md0: Device or resource busy
    [root@localhost ~]# umount /mnt
    [root@localhost ~]# mdadm -S /dev/md0
    mdadm: stopped /dev/md0
    

四、LVM

1. 什麼是LVM

想像一個情況,你在當初規劃主機的時候將/home只給他 50G ,等到使用者衆多之後導致這個 filesystem不夠大, 此時你能怎麼作?多數的朋友都是這樣:再加一塊新硬盤,然後重新分區、格式化,將/home的數據完整的複製過來, 然後將原本的 partition 卸載重新掛載新的 partition 。啊!好忙碌啊!若是第二次分區卻給的容量太多!導致很多盤容量被浪費了! 你想要將這個 partition 縮小時,又該如何作?將上述的流程再搞一遍!唉~煩死了,尤其複製很花時間,有沒有更簡單的方法呢? 有的!那就是我們這個小節要介紹的 LVM 這玩意兒!

LVM(Logical Volume Manager)邏輯卷管理器。其 的重點在於可以彈性的調整 filesystem 的容量!而並非在於性能與數據安全上面。 需要文件的讀寫效能或者是數據的可靠性,請參考前面的 RAID 小節。 LVM 可以整合多個實體 partition 在一起, 讓這些 partitions 看起來就像是一個磁盤一樣!而且,還可以在未來新增或移除其他的實體 partition 到這個 LVM 管理的磁盤當中。 如此一來,整個磁盤空間的使用上,實在是相當的具有彈性啊! 既然 LVM 這麼好用,那就讓我們來瞧瞧這玩意吧!

dm

LVM利用Linux內核的dm(device-mapper)來實現存儲系統的虛擬化(系統分區獨立於底層硬件),與md類似,dm將一個或多個底層塊設備組織成一個邏輯設備的模塊,在內核中它通過一個一個模塊化的 target driver 插件實現對 IO 請求的過濾或者重新定向等工作。

DM

LVM基本組成

LVM的基本組成塊(building blocks)如下:

  • Physical Volume (PV):物理卷,可以在上面建立卷組的媒介,可以是硬盤分區,也可以是硬盤本身或者回環文件(loopback file)。物理捲包括一個特殊的header,其餘部分被切割爲一塊塊PE

  • Volume Group (VG):卷組,將一組物理卷收集爲一個管理單元。PV組合起來的大小即VG的大小,可以隨着PV而改變

  • Logical Volume (LV):邏輯卷,虛擬分區,由PE組成。邏輯卷可以被格式化使用,一個卷組內可以創建多個邏輯卷

  • Physical Extent (PE):物理區域,硬盤可供指派給邏輯卷的最小單位(通常爲4MB)。PE是邏輯存儲單位,在創建卷組時指定,只有加入VG的物理卷纔有PE

  • Logical Extend(LE):邏輯盤區,PE一旦被劃分給某個邏輯卷後,稱爲LE,同PE,只是站在邏輯卷的角度,叫做LE(在物理卷的角度叫PE)

邏輯結構如下圖10

LVM

2. 設備路徑

在介紹相關命令之前,先來說明一下這類設備的設備文件,在創建邏輯設備後,會有相應的設備文件產生:
/dev/VG_NAME/LV_NAME/dev/mapper/VG_NAME-LV_NAME,二者均指向/dev/dm-#

3. 相關命令

Linux大部分發行版如今使用LVM2進行邏輯卷管理,可通過下圖對LVM相關使用流程有一個大致認識11

LVM

在不同的邏輯層,其管理命令各不相同,但都以固定字符開頭,以下分別介紹

物理卷管理命令:pv*

pvcreate	創建
	-f		強制創建
	-v		顯示詳細信息
pvremove	移除
pvscan		掃描
pvs		簡要顯示
內容字段:
	物理卷 所屬卷組 卷格式 屬性 卷大小 空閒空間
		卷格式:lvm,lvm2
pvdisplay	顯示詳細信息
pvmove		移出物理捲上的數據

卷組管理命令:vg*

vgcreate	創建
	[-s #[kKmMgGtTpPeE]] VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]
	-s		指定物理盤區(PE)大小,默認是4M
vgremove	刪除
vgextend	擴展
vgreduce	縮減
	執行命令之前應使用pvmove將要去掉的盤上的數據移動到其他盤
vgs			顯示
	內容字段:
		卷組 物理卷個數 邏輯卷個數 屬性 卷組大小 空閒空間
vgdisplay	顯示詳細信息
vgscan		掃描
vgrename	重命名

邏輯卷管理命令:lv*

lvcreate	創建
	lvcreate -n LV_NAME -L #[mMgGtT] VG_NAME
		-n			指定邏輯卷名
		-l			指定物理盤區盤區個數
		-L			指定大小(直接指定空間大小)
		-p			設定訪問權限

lvremove	刪除
lvextend	擴展
	-L [+]# 
lvreduce	縮減
lvs			顯示
lvdisplay	顯示詳細信息

將上述命令彙總爲下列表格供大家參考12

任務 PV階段 VG階段 LV階段
搜尋(scan) pvscan vgscan lvscan
創建(create) pvcreate vgcreate lvcreate
列出(display) pvdisplay vgdisplay lvdisplay
添加(extend) vgextend lvextend (lvresize)
減少(reduce) vgreduce lvreduce (lvresize)
刪除(remove) pvremove vgremove lvremove
改變容量(resize) lvresize
改變屬性(attribute) pvchange vgchange lvchange

再次說明, 格式化、掛載完成後,引用設備的路徑爲/dev/mapper/VGNAME-LVNAME/dev/VGNAME/LVNAME,二者均會指向/dev/mapper/VGNAME-LVNAME

另外,也可以使用dmsetup命令(dmsetup - low level logical volume management)

4. 例

創建分區

首先創建4個分區,將其類型調整爲Linux LVM,具體方式見上文,這裏創建的結果爲

[root@localhost ~]# fdisk -l /dev/sdc

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x03af0ab0

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048     4196351     2097152   8e  Linux LVM
/dev/sdc2         4196352     8390655     2097152   8e  Linux LVM
/dev/sdc3         8390656    12584959     2097152   8e  Linux LVM
/dev/sdc4        12584960    41943039    14679040    5  Extended
/dev/sdc5        12587008    16781311     2097152   8e  Linux LVM

PV階段

[root@localhost ~]# pvcreate /dev/sdc{1,2,3,5}
  Physical volume "/dev/sdc1" successfully created.
  Physical volume "/dev/sdc2" successfully created.
  Physical volume "/dev/sdc3" successfully created.
  Physical volume "/dev/sdc5" successfully created.
[root@localhost ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [<119.51 GiB / 64.00 MiB free]
  PV /dev/sdc2                      lvm2 [2.00 GiB]
  PV /dev/sdc3                      lvm2 [2.00 GiB]
  PV /dev/sdc1                      lvm2 [2.00 GiB]
  PV /dev/sdc5                      lvm2 [2.00 GiB]
  Total: 5 [<127.51 GiB] / in use: 1 [<119.51 GiB] / in no VG: 4 [8.00 GiB]

VG階段

[root@localhost ~]# vgcreate -s 16M myvg /dev/sdc{1,2,3}
  Volume group "myvg" successfully created
[root@localhost ~]# vgscan
  Reading volume groups from cache.
  Found volume group "centos" using metadata type lvm2
  Found volume group "myvg" using metadata type lvm2

如此,就創建了一個名爲“myvg”的vg,並將三個pv加入其中,要爲vg增加容量,可使用vgextend VG_NAME DEVICE,後文將做介紹

LV階段

[root@localhost ~]# lvcreate -L 3G -n mylv myvg
  Logical volume "mylv" created.
[root@localhost ~]# ll /dev/myvg/mylv
lrwxrwxrwx. 1 root root 7 Feb 22 15:14 /dev/myvg/mylv -> ../dm-3
[root@localhost ~]# ll /dev/mapper/myvg-mylv
lrwxrwxrwx. 1 root root 7 Feb 22 15:14 /dev/mapper/myvg-mylv -> ../dm-3

FS階段

此部分即格式化爲特定文件系統,掛載並使用即可

[root@localhost ~]# mkfs.ext3 /dev/myvg/mylv
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
196608 inodes, 786432 blocks
39321 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=805306368
24 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

[root@localhost ~]# mount /dev/myvg/mylv /mnt
[root@localhost ~]# cp /etc/fstab /mnt/
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G  4.7G   46G  10% /
devtmpfs                 903M     0  903M   0% /dev
tmpfs                    914M     0  914M   0% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  126M  372M  26% /boot
/dev/mapper/centos-home   68G   33M   68G   1% /home
tmpfs                    183M     0  183M   0% /run/user/0
/dev/mapper/myvg-mylv    2.9G  4.6M  2.8G   1% /mnt
[root@localhost ~]# ls -a /mnt/
.  ..  fstab  lost+found

擴大LV容量

由於文件系統邊界依附於物理邊界,擴展時應先擴展物理邊界,再擴展文件系統邊界,該操作大致步驟是

  1. 準備物理卷
  2. 擴展卷組
  3. 添加物理卷至卷組中
  4. 調整邏輯卷大小
  5. 調整文件系統大小
[root@localhost ~]# vgextend myvg /dev/sdc5
  Volume group "myvg" successfully extended
[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               myvg
  System ID
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               <7.94 GiB
  PE Size               16.00 MiB
  Total PE              508
  Alloc PE / Size       192 / 3.00 GiB
  Free  PE / Size       316 / <4.94 GiB
  VG UUID               xZH3IX-ITkJ-DON9-3SWl-pF1J-FCma-zXdAB7
[root@localhost ~]# lvextend -L +1.5G /dev/myvg/mylv
  Size of logical volume myvg/mylv changed from 3.00 GiB (192 extents) to 4.50 GiB (288 extents).
  Logical volume myvg/mylv successfully resized.
[root@localhost ~]# lvscan
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
  ACTIVE            '/dev/centos/home' [<67.45 GiB] inherit
  ACTIVE            '/dev/centos/root' [50.00 GiB] inherit
  ACTIVE            '/dev/myvg/mylv' [4.50 GiB] inherit
[root@localhost ~]# df -h /mnt/
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/myvg-mylv  2.9G  4.6M  2.8G   1% /mnt
[root@localhost ~]# dumpe2fs -h /dev/myvg/mylv
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          /mnt
Filesystem UUID:          e118f701-4e99-45c2-a9cc-97953c4a1f02
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              196608
Block count:              786432
Reserved block count:     39321
Free blocks:              756531
Free inodes:              196597
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      191
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Fri Feb 22 15:18:02 2019
Last mount time:          Fri Feb 22 15:18:16 2019
Last write time:          Fri Feb 22 15:18:16 2019
Mount count:              1
Maximum mount count:      -1
Last checked:             Fri Feb 22 15:18:02 2019
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:	          256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      bd2c68a9-906e-436c-a450-fbc5edf78c66
Journal backup:           inode blocks
Journal features:         (none)
Journal size:             64M
Journal length:           16384
Journal sequence:         0x00000002
Journal start:            1

可以看到以上dumpe2fs的結果中

這個filesystem的 block 總數:
	Block count:              786432
	
多少個 block 配置成爲一個 block group:
	Blocks per group:         32768

調整文件系統邊界,可進行在線調整

[root@localhost ~]# resize2fs /dev/myvg/mylv
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/myvg/mylv is mounted on /mnt; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/myvg/mylv is now 1179648 blocks long.

[root@localhost ~]# df -h /mnt/
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/myvg-mylv  4.4G  6.1M  4.2G   1% /mnt

若不指定大小,可以自動擴展至於物理邊界一樣的大小

若文件系統爲xfs,使用xfs_growfs命令進行調整

縮小LV容量

相信很好理解:縮減時應先縮減文件系統邊界,再縮減物理邊界

縮減有風險,操作需謹慎,注意

  • 不能在線縮減,應先卸載
  • 確保縮減後的空間大小依然能存儲原有的所有數據
  • 在縮減之前應先強行檢查文件,以確保文件系統處於一致性狀態
縮減邏輯卷大致步驟:
  1. 卸載卷,並執行強制檢測
    umount /PATH/TO/LV_DEVICE
    e2fsck -f /PATH/TO/LV_DEVICE
  1. 縮減邏輯邊界
    resize2fs /PATH/TO/LV_DEVICE SIZE
  1. 縮減物理邊界
    lvreduce -L [-]SIZE /PATH/TO/LV_DEVICE
[root@localhost ~]# df -h /mnt/
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/myvg-mylv  4.4G  6.1M  4.2G   1% /mnt
[root@localhost ~]# umount /mnt/
[root@localhost ~]# e2fsck -f /dev/myvg/mylv
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/myvg/mylv: 12/294912 files (0.0% non-contiguous), 36456/1179648 blocks
[root@localhost ~]# resize2fs /dev/myvg/mylv 2G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/myvg/mylv to 524288 (4k) blocks.
The filesystem on /dev/myvg/mylv is now 524288 blocks long.

[root@localhost ~]# mount /dev/myvg/mylv /mnt/
[root@localhost ~]# df -h /mnt/
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/myvg-mylv  2.0G  4.6M  1.9G   1% /mnt

文件系統邊界已經縮減,接下來縮減物理邊界

[root@localhost ~]# lvresize -L 2.1G /dev/myvg/mylv
  Rounding size to boundary between physical extents: <2.11 GiB.
  WARNING: Reducing active logical volume to <2.11 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/mylv? [y/n]: y
  Size of logical volume myvg/mylv changed from 4.50 GiB (288 extents) to <2.11 GiB (135 extents).
  Logical volume myvg/mylv successfully resized.
[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/myvg/mylv
  LV Name                mylv
  VG Name                myvg
  LV UUID                HrQwt2-zhA6-n11F-u1Xe-Tvpa-9XMN-SGtOs8
  LV Write Access        read/write
  LV Creation host, time localhost, 2019-02-22 15:14:42 +0800
  LV Status              available
  # open                 0
  LV Size                <2.11 GiB
  Current LE             135
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3

[root@localhost ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [<119.51 GiB / 64.00 MiB free]
  PV /dev/sdc1   VG myvg            lvm2 [1.98 GiB / 0    free]
  PV /dev/sdc2   VG myvg            lvm2 [1.98 GiB / <1.86 GiB free]
  PV /dev/sdc3   VG myvg            lvm2 [1.98 GiB / 1.98 GiB free]
  PV /dev/sdc5   VG myvg            lvm2 [1.98 GiB / 1.98 GiB free]
  Total: 5 [<127.45 GiB] / in use: 5 [<127.45 GiB] / in no VG: 0 [0   ]

此時,可以將/dev/sdc1移除,移除之前將其中內容移出

[root@localhost ~]# pvmove /dev/sdc1
  /dev/sdc1: Moved: 0.79%
  /dev/sdc1: Moved: 100.00%
[root@localhost ~]# vgreduce myvg /dev/sdc1
  Removed "/dev/sdc1" from volume group "myvg"
[root@localhost ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [<119.51 GiB / 64.00 MiB free]
  PV /dev/sdc2   VG myvg            lvm2 [1.98 GiB / <1.86 GiB free]
  PV /dev/sdc3   VG myvg            lvm2 [1.98 GiB / 0    free]
  PV /dev/sdc5   VG myvg            lvm2 [1.98 GiB / 1.98 GiB free]
  PV /dev/sdc1                      lvm2 [2.00 GiB]
  Total: 5 [127.46 GiB] / in use: 4 [125.46 GiB] / in no VG: 1 [2.00 GiB]
[root@localhost ~]# pvremove /dev/sdc1
  Labels on physical volume "/dev/sdc1" successfully wiped.

此後,/dev/sdc1就可用作別處

將該邏輯卷掛載後,原有數據依然可用

[root@localhost ~]# mount /dev/myvg/mylv /mnt/
[root@localhost ~]# cat /mnt/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

5. 快照卷

快照

快照(Snapshot),快照就是將當時的系統資訊記錄下來,就好像照相記錄一般! 未來若有任何數據更動了,則原始數據會被搬移到快照區,沒有被更動的區域則由快照區與文件系統共享,常用作數據備份與恢復

LVM的快照使用RoW(Redirect-on-Write,寫時重定向)實現,大致過程如下圖13

Snapshot_RoW

快照卷

而LVM的快照技術是通過快照卷(Snapshot Volume)實現的,如上圖,我們對源邏輯卷創建快照卷後,即可通過該快照卷訪問數據,當數據發成變化時,變化的數據將被寫入快照卷,如此,源卷的數據將保持創建快照那一刻的狀態

需要注意

  1. 生命週期爲整個數據時長,在這段時長內,數據的增長量不能超出快照卷大小
  2. 快照卷應該是隻讀的
  3. 跟原卷在同一卷組內,所以創建時不必指定爲哪個卷組創建,但應指定爲哪個邏輯卷創建
  4. 快照卷可以作爲原卷的訪問入口,訪問的是修改之前的數據,修改之後的可通過源路徑訪問

創建快照卷

創建快照卷依然使用lvcreate,使用如下格式

lvcreate -s -L SIZE -n SLV_NAME -p r /PATH/TO/ORIGINAL_LV_DEVICE
	-s			創建快照卷
	-p r|w		指定權限,應指定爲只讀(r)
	-L			指定大小
	-n			指定快照卷名稱

測試

首先新建一個PV並加入VG

[root@localhost ~]# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created.
[root@localhost ~]# vgextend myvg /dev/sdc1
  Volume group "myvg" successfully extended

創建快照卷

[root@localhost ~]# lvcreate -L 1G -s -n myvg_sh /dev/myvg/mylv
  Logical volume "myvg_sh" created.
[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/myvg/mylv
  LV Name                mylv
  VG Name                myvg
  LV UUID                HrQwt2-zhA6-n11F-u1Xe-Tvpa-9XMN-SGtOs8
  LV Write Access        read/write
  LV Creation host, time localhost, 2019-02-22 15:14:42 +0800
  LV snapshot status     source of
                         myvg_sh [active]
  LV Status              available
  # open                 1
  LV Size                <2.11 GiB
  Current LE             135
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3

  --- Logical volume ---
  LV Path                /dev/myvg/myvg_sh
  LV Name                myvg_sh
  VG Name                myvg
  LV UUID                09MnZC-4xIY-jWyT-r3c9-2K5G-eUGW-K4ghj4
  LV Write Access        read/write
  LV Creation host, time localhost, 2019-02-22 17:03:10 +0800
  LV snapshot status     active destination for mylv
  LV Status              available
  # open                 0
  LV Size                <2.11 GiB
  Current LE             135
  COW-table size         1.00 GiB
  COW-table LE           64
  Allocated to snapshot  0.01%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:6

通過快照卷訪問數據

[root@localhost ~]# mount /dev/myvg/myvg_sh /tmp
[root@localhost ~]# df -h
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/centos-root    50G  4.7G   46G  10% /
devtmpfs                  903M     0  903M   0% /dev
tmpfs                     914M     0  914M   0% /dev/shm
tmpfs                     914M  9.1M  905M   1% /run
tmpfs                     914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                 497M  126M  372M  26% /boot
/dev/mapper/centos-home    68G   33M   68G   1% /home
tmpfs                     183M     0  183M   0% /run/user/0
/dev/mapper/myvg-mylv     2.0G  4.6M  1.9G   1% /mnt
/dev/mapper/myvg-myvg_sh  2.0G  4.6M  1.9G   1% /tmp
[root@localhost ~]# cat /tmp/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

修改數據

[root@localhost ~]# echo "New Line." >> /tmp/fstab
[root@localhost ~]# cat /tmp/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
New Line.

此時再通過原卷訪問,則數據還是修改之前的

[root@localhost ~]# cat /mnt/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec 19 20:12:26 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=a8cac4fb-841a-421d-ba11-ea7eee1c57bc /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

五、例

1、創建一個10G的分區,並格式化爲ext4文件系。要求:
(1)block大小爲2048,預留空間20%,卷標爲MYDATA,
(2) 掛載至/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳。
(3)可開機自動掛載。

創建分區

[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x87950fb6.

Command (m for help): p

Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x87950fb6

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-209715199, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199): +10G
Partition 1 of type Linux and of size 10 GiB is set

Command (m for help): p

Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x87950fb6

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# cat /proc/partitions
major minor  #blocks  name

   8        0  125829120 sda
   8        1     512000 sda1
   8        2  125316096 sda2
   8       16  104857600 sdb
   8       17   10485760 sdb1

格式化

[root@localhost ~]# mkfs.ext4 -b 2048 -m 20 -L MYDATA /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=MYDATA
OS type: Linux
Block size=2048 (log=1)
Fragment size=2048 (log=1)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 5242880 blocks
1048576 blocks (20.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=273678336
320 block groups
16384 blocks per group, 16384 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
	16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816, 1327104,
	2048000, 3981312

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

[root@localhost ~]# blkid /dev/sdb1
/dev/sdb1: LABEL="MYDATA" UUID="9edaaa78-7cad-4cb5-8e46-3556cad9e964" TYPE="ext4"

掛載

[root@localhost ~]# mkdir /mydata
[root@localhost ~]# mount -o noatime,noexec /dev/sdb1 /mydata/

開機自動掛載,編輯/etc/fstab文件,在添加一行內容:

/dev/sdb1   /mydata ext4    noatime,noexec  0   0

2、創建一個大小爲1G的swap分區,並啓用。
創建分區,並調整爲swap類型

[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (2-4, default 2):
First sector (20973568-209715199, default 20973568):
Using default value 20973568
Last sector, +sectors or +size{K,M,G} (20973568-209715199, default 209715199): +1G
Partition 2 of type Linux and of size 1 GiB is set

Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 82
Changed type of partition 'Linux' to 'Linux swap / Solaris'

Command (m for help): p

Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x87950fb6

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    20973567    10485760   83  Linux
/dev/sdb2        20973568    23070719     1048576   82  Linux swap / Solaris

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

執行partx -a

[root@localhost ~]# partx -a /dev/sdb
partx: /dev/sdb: error adding partition 1
[root@localhost ~]# partx -a /dev/sdb
partx: /dev/sdb: error adding partitions 1-2

創建swap並啓用

[root@localhost ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=0e7bcbe9-d3d1-4cd2-8127-3f8692bf7760
[root@localhost ~]# swapon /dev/sdb2
[root@localhost ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1870512      191128     1450184        9324      229200     1491852
Swap:       3145720           0     3145720
[root@localhost ~]# swapon -s
Filename				Type		Size	Used	Priority
/dev/dm-1                              	partition	2097148	0	-1
/dev/sdb2                              	partition	1048572	0	-2

3、編寫腳本計算/etc/passwd文件中第10個用戶和第20個用戶id號之和。

關於腳本相關介紹參考Bash編程 https://blog.csdn.net/xiyangyang410/article/details/86695841

#!/bin/bash

uid1=`head -10 /etc/passwd | tail -1 | cut -d: -f3`
uid2=`head -20 /etc/passwd | tail -1 | cut -d: -f3`
echo $[ $uid1+$uid2]

4、編寫腳本,通過命令行參數傳入一個用戶名,判斷id號是偶數還是奇數。

#!/bin/bash

if id $1 &> /dev/null; then
	user_id=`id -u $1`

		if [ $[$user_id%2] -eq 0 ]; then
			echo "Even."
		else
			echo "Odd."
		fi

else
	echo "No such user."
fi


  1. 表格引用自 https://zh.wikipedia.org/wiki/主引導記錄 ↩︎

  2. 內容引用自 http://linux.vbird.org/linux_basic/0130designlinux.php#partition_table ,由於習慣不同,修改了部分名詞 ↩︎ ↩︎

  3. 可參看鳥哥的Linux私房菜: http://linux.vbird.org/linux_basic/0130designlinux.php#partition_bios_uefi ↩︎

  4. 圖片引用自 https://en.wikipedia.org/wiki/Virtual_file_system ↩︎

  5. 引用自 http://os.51cto.com/art/201205/334497_all.htm ↩︎

  6. 詳見 https://blog.csdn.net/xiyangyang410/article/details/86651541#ls_60 ↩︎

  7. 關於swap,詳見進程管理內容 ↩︎

  8. 該論文電子版筆者已上傳至SCDN:https://download.csdn.net/download/xiyangyang410/10968807 ↩︎

  9. 表格引用自 http://linux.vbird.org/linux_basic/0420quota.php#spare ↩︎

  10. 圖片引用自 https://linux.cn/article-3218-1.html ↩︎

  11. 圖片引用自 http://linux.vbird.org/linux_basic/0420quota.php#lvm_whatis ↩︎

  12. 表格引用自 http://cn.linux.vbird.org/linux_basic/0420quota_3.php#lvm_hint ↩︎

  13. 圖片來源 https://cloud.tencent.com/developer/article/1158686 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章