1. 程式人生 > 其它 >儲存管理

儲存管理

一 磁碟在系統同的命名

分割槽主要分為三類:主分割槽<---擴充套件分割槽<---邏輯分割槽

#1、邏輯分割槽屬於擴充套件分割槽,擴充套件分割槽屬於主分割槽
#2、主分割槽又叫做引導分割槽,是可以安裝系統的分割槽

目前常見的磁碟分割槽格式有兩種,MBR 分割槽和 GPT 分割槽:

MBR 分割槽,MBR 的意思是 "主引導記錄"。MBR 最大支援 2TB 容量,在容量方面存在著極大的瓶頸。
GPT 分割槽,GPT 意為 GUID 分割槽表,它支援的磁碟容量比 MBR 大得多。這是一個正逐漸取代 MBR 的新標準,它是由 UEFI 輔住而形成的,將來 UEFI 用於取代老舊的 BIOS,而 GPT 則取代老舊的 MBR。

磁碟分割槽工具

fdisk 工具用於 MBR 格式
gdisk 工具用於 GPT 格式

二 MBR分割槽
檢視裝置詳情,以及分割槽的情況

[root@egon ~]# lsblk /dev/sda
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   10G  0 disk 
├─sda1   8:1    0  500M  0 part /boot
├─sda2   8:2    0    1G  0 part [SWAP]
└─sda3   8:3    0  8.5G  0 part /
[root@egon ~]# 
[root@egon ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  20G  0 disk 
[root@egon ~]# lsblk /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc    8:32   0  20G  0 disk 

fdisk工具:
適用於磁碟小於2TB的磁碟,分割槽型別MBR,主分割槽4或主分割槽3+擴充套件分割槽(邏輯分割槽+…),分割槽後需要儲存後才能生效

[root@egon ~]# fdisk /dev/sdb
Command (m for help): m #輸入m列出常用的命令
a toggle a bootable flag     #切換分割槽啟動標記
​b edit bsd disklabel     #編輯sdb磁碟標籤
​c toggle the dos compatibility flag     #切換dos相容模式
​d delete a partition     #刪除分割槽
​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     #建立新的Sun磁碟標籤
​t change a partitions system id         #修改分割槽ID,可以通過l檢視id
u change display/entry units     #修改容量單位,磁柱或扇區
​v verify the partition table     #檢驗分割槽表
​w write table to disk and exit     #儲存退出
​x extra functionality (experts only)     #拓展功能

優先掌握

n  #建立一個分割槽
p  # 檢視分割槽列表
d  # 刪除一個已有的分割槽,儲存退出後需要執行partprobe命令重新整理一下分割槽表
w  # 刪除一個分割槽

fdisk建立分割槽

MBR分割槽
	1、MBR分割槽工具主要針對於 2TB以下的硬碟
	2、最多有4個分割槽
	3、分割槽內命令
		n : 建立一個分割槽
		p : 檢視分割槽列表
		w : 寫入分割槽資訊到硬碟
		d : 刪除一個分割槽
[root@egon ~]# fdisk /dev/sdb 
歡迎使用 fdisk (util-linux 2.23.2)。
​
更改將停留在記憶體中,直到您決定將更改寫入磁碟。
使用寫入命令前請三思。
​
Device does not contain a recognized partition table
使用磁碟識別符號 0x12c57921 建立新的 DOS 磁碟標籤。
​
命令(輸入 m 獲取幫助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分割槽號 (1-4,預設 1):
起始 扇區 (2048-41943039,預設為 2048):
將使用預設值 2048
Last 扇區, +扇區 or +size{K,M,G} (2048-41943039,預設為 41943039):+1G
分割槽 1 已設定為 Linux 型別,大小設為 1 GiB
​
命令(輸入 m 獲取幫助):p
​
磁碟 /dev/sdb:21.5 GB, 21474836480 位元組,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組
磁碟標籤型別:dos
磁碟識別符號:0x12c57921
​
   裝置 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
​
命令(輸入 m 獲取幫助):

重複上述步驟,建立四個1G的主分割槽

命令(輸入 m 獲取幫助):p
​
磁碟 /dev/sdb:21.5 GB, 21474836480 位元組,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組
磁碟標籤型別:dos
磁碟識別符號:0x12c57921
​
   裝置 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux
/dev/sdb4         6293504     8390655     1048576   83  Linux

此時雖然空間夠用,但已經無法繼續建立新的了

命令(輸入 m 獲取幫助):
命令(輸入 m 獲取幫助):n
If you want to create more than four partitions, you must replace a
primary partition with an extended partition first.
​命令(輸入 m 獲取幫助):

刪除主分割槽4,然後新建一個擴充套件分割槽,剩餘空間都給他

命令(輸入 m 獲取幫助):d  # 刪除主分割槽4
分割槽號 (1-4,預設 4):4
分割槽 4 已刪除
​
命令(輸入 m 獲取幫助):p  # 檢視
​
磁碟 /dev/sdb:21.5 GB, 21474836480 位元組,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組
磁碟標籤型別:dos
磁碟識別符號:0x12c57921
​
   裝置 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux
​
命令(輸入 m 獲取幫助):n  # 新建擴充套件分割槽
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e  # 選擇建立擴充套件分割槽
已選擇分割槽 4
起始 扇區 (6293504-41943039,預設為 6293504):
將使用預設值 6293504
Last 扇區, +扇區 or +size{K,M,G} (6293504-41943039,預設為 41943039): # 直接回車,剩餘空間都給它
將使用預設值 41943039
分割槽 4 已設定為 Extended 型別,大小設為 17 GiB
​
命令(輸入 m 獲取幫助):p # 檢視
​
磁碟 /dev/sdb:21.5 GB, 21474836480 位元組,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組
磁碟標籤型別:dos
磁碟識別符號:0x12c57921
​
   裝置 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux
/dev/sdb4         6293504    41943039    17824768    5  Extended
​
命令(輸入 m 獲取幫助): w  # 儲存

可以檢視一下

[root@egon ~]# lsblk /dev/sdb

三 GPT分割槽
新增一塊2500G的盤,然後用GPT的方式格式化

# 需要安裝命令
[root@egon ~]# yum install gdisk -y
​
[root@egon ~]# gdisk /dev/sdc
......
Command (? for help): m
b    back up GPT data to a file                            #將GPT資料備份到檔案中
​
c    change a partition's name                            #更改分割槽的名稱
​
d    delete a partition                                    #刪除分割槽
​
i    show detailed information on a partition            #顯示分割槽的詳細資訊
​
l    list known partition types                            #列出已知的分割槽型別
​
n    add a new partition                                    #新增一個新的分割槽
​
o    create a new empty GUID partition table (GPT)        #建立一個新的空GUID分割槽表(GPT)
p    print the partition table                            #列印分割槽表
​
q    quit without saving changes                            #沒有儲存更改就退出
​
r    recovery and transformation options (experts only)    #恢復和轉換選項(僅限專家使用)
s    sort partitions                                        #年代分類分割槽
​
t    change a partition's type code                        #不要更改分割槽的型別程式碼
​
v    verify disk                                            #驗證磁碟
​
w    write table to disk and exit                        #將表寫入磁碟並退出
​
x    extra functionality (experts only)                    #額外功能(僅限專家使用)
?    print this menu                                        #列印選單
​

優先掌握

GPT分割槽
	1、GPT分割槽工具主要針對於 2TB以上的硬碟
	2、支援128個分割槽
	3、分割槽命令
		? : 幫助
		n : 建立一個分割槽
		p : 檢視分割槽列表
		w : 寫入分割槽資訊到硬碟
		d : 刪除一個分割槽

gdisk建立分割槽

Command (? for help): n  # 新建
Partition number (1-128, default 1):  # 直接回車,預設分割槽號為1
First sector (34-5242879966, default = 2048) or {+-}size{KMGTP}: #直接回車,使用預設的起始位置
Last sector (2048-5242879966, default = 5242879966) or {+-}size{KMGTP}: +1G # 設定1G的空間
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): L  # 列出所有檔案系統
......會看到一系列檔案系統資訊,預設的8300編號代表Linux filesystem,用它就好
Hex code or GUID (L to show codes, Enter = 8300):  # 直接回車用預設8300就好
Changed type of partition to 'Linux filesystem'
​
Command (? for help): p  # 列印檢視
......
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  8300  Linux filesystem
​
Command (? for help): w  # 儲存
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
​
Do you want to proceed? (Y/N): y  # 輸入y儲存
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.

四 格式化製作檔案系統與掛載
磁碟必須格式化製作檔案系統,然後掛載才能使用
針對一塊硬碟/dev/sdb
可以不分割槽,直接格式化製作檔案系統

[root@egon ~]# mkfs.xfs /dev/sdb # /dev/sdb整體就是一個分割槽

也可以基於mbr或者gpt分割槽方式分割槽完畢後,針對某一個分割槽比如/dev/sdb1製作檔案系統

[root@egon ~]# mkfs.xfs /dev/sdb1

ps

centos7選擇xfs格式作為預設檔案系統,而且不再使用以前的ext,仍然支援ext4,xfs專為大資料產生,每個單個檔案系統最大可以支援8eb,單個檔案可以支援16tb,不僅資料量大,而且擴充套件性高。還可以通過xfsdump,xfsrestore來備份和恢復。

掛載與解除安裝:以/dev/sdb1為例演示

掛載
[root@egon ~]# mount /dev/sdb1 /opt/
​解除安裝
umount /dev/sdb1 # 或者umount /opt
​強制解除安裝
umount -l /dev/sdb1 # 或者umount -l /opt

開啟開機自動掛載

方式一:將掛載命令寫入檔案/etc/rc.local
注意:centos7下/etc/rc.local檔案裡配置的開機啟動項不執行的解決辦法
[root@egon ~]# ll /etc/rc.local 
lrwxrwxrwx. 1 root root 13 7月  13 21:08 /etc/rc.local -> rc.d/rc.local
[root@egon ~]# ll /etc/rc.d/rc.local  # 沒有執行許可權,需要加上
-rw-r--r--. 1 root root 523 11月  6 15:03 /etc/rc.d/rc.local
[root@egon ~]# chmod +x /etc/rc.d/rc.local 

方式二:編輯檔案/etc/fstab

[root@egon ~]# sed -i '$a /dev/sdb1 /opt xfs defaults 0 0' /etc/fstab 
[root@egon ~]# tail -1 /etc/fstab 
/dev/sdb1 /opt xfs defaults 0 0

補充:磁碟掛載mount

-t 指定檔案系統
-a 掛載/etc/fstab中配置的所有
​
[root@egon ~]# mount -t xfs /dev/sdb1 /db1
​
可以檢視到檔案系統的uuid並掛載
[root@egon ~]# blkid | grep sdb1
/dev/sdb1: UUID="10a939a8-d17c-4a0f-9a89-8066ac013855" TYPE="xfs" 
[root@egon ~]# mount UUID="10a939a8-d17c-4a0f-9a89-8066ac013855" /opt
​
建議配置檔案/etc/fstab用uuid
[root@egon ~]# tail -1 /etc/fstab  # 編輯檔案,新增一行
UUID="10a939a8-d17c-4a0f-9a89-8066ac013855" /opt xfs defaults 0 0
[root@egon ~]# mount -a  
[root@egon ~]# df  # 檢視掛載情況

補充:/etc/fstab配置檔案編寫格式
| 要掛載的設入口) | 檔案系統型別 | 掛載引數 | 是否備份 | 是否檢查 |
第一列:device:這裡用來指定你要掛載的檔案系統的裝置名稱或塊資訊,除了指定裝置檔案外,也可以使用UUID、LABEL來指定分割槽。
第二列:dir:指定掛載點的路徑;
第三列:type:指定檔案系統的型別,如ext3,ext4,xfs等;

第四列:options:指定掛載的引數,預設為defaults;
第五列:dump:表示該掛載後的檔案系統能否被dump備份命令作用;
第六列:pass:這裡用來指定如何使用fsck來檢查硬碟。

五 製作swap分割槽
檢視

[root@localhost ~]# free  -m
              total        used        free      shared  buff/cache   available
Mem:           1980         186        1571           9         222        1600
Swap:          1023           0        1023

製作swap分割槽

[root@localhost ~]# fdisk /dev/sdb  # 分出一個1G的硬碟空間
[root@localhost ~]# mkswap /dev/sdb1  # 格式化為swap

啟用swap分割槽

[root@localhost ~]# free  -m
              total        used        free      shared  buff/cache   available
Mem:           1980         185        1568           9         225        1601
Swap:          1023           0        1023
[root@localhost ~]# swapon /dev/sdb1  # 啟用 
[root@localhost ~]# free  -m
              total        used        free      shared  buff/cache   available
Mem:           1980         186        1567           9         225        1600
Swap:          2047           0        2047
[root@localhost ~]# 

關閉swap分割槽

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         186        1567           9         225        1600
Swap:          2047           0        2047
[root@localhost ~]# swapon -s
檔名             型別      大小  已用  許可權
/dev/sda2                               partition   1048572 0   -2
/dev/sdb1                               partition   1048572 0   -3
[root@localhost ~]# swapoff -a  # 關閉具體某一個用swapon /dev/sdb1 
[root@localhost ~]# swapon -s
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         185        1570           9         224        1601
Swap:             0           0           0

如果磁碟沒有過多的分割槽可用,也可以通過檔案增加SWAP空間,本質上還是磁碟

[root@localhost ~]# dd if=/dev/zero of=/swap_file bs=1M count=200
[root@localhost ~]# chmod 0600 /swap_file 
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1980         185        1364           9         430        1598
Swap:             0           0           0
[root@localhost ~]# mkswap -f /swap_file 
[root@localhost ~]# swapon /swap_file
[root@localhost ~]# free  -m
              total        used        free      shared  buff/cache   available
Mem:           1980         222        1300           9         458        1550
Swap:           199           0         199
[root@localhost ~]# 

開機自動掛載新增的swap分割槽

[root@localhost ~]# blkid | grep /dev/sdb1
/dev/sdb1: UUID="91d30c2d-2b43-40b1-b2b5-6f828c585f97" TYPE="swap" PARTUUID="d3b7649d-54aa-45eb-8bef-dccfe6915413" 
[root@localhost ~]# vim /etc/fstab 
[root@localhost ~]# tail -1 /etc/fstab 
UUID="91d30c2d-2b43-40b1-b2b5-6f828c585f97" swap                  swap    defaults        0 0

六 Dell R740伺服器配置RAID5+1

https://www.cnblogs.com/linhaifeng/articles/13921161.html

七 修復伺服器檔案系統
在Linux系統中,為了增加系統性能,通常系統會將一些資料寫先放在記憶體中,並不會直接將資料寫入硬碟,這是因為記憶體速度要比硬碟快若干倍。但是有個問題,萬一公司伺服器突然斷電或者其他未知原因,再次啟動後,會造成檔案系統錯誤:“emergency mode”

welcome to emergency mode!after logging in ,type “journalctl -xb” to view system logs,“systemctl reboot” to reboot ,“systemctl default” to try again to boot into default mode。
give root password for maintenance

或者類似

執行任何命令都會有以下(或相似)錯誤

Error getting authority: Error initializing authority: Could not connect: No such file or directory (g-io-error-quark, 1)

檢視執行日誌,可以提示出損壞的檔案系統

journalctl -xb

修復方式:

# 0、如果進入不了作業系統,可以進入單使用者模式下操作
​
# 1、首先嚐試mount和umount檔案系統,以便重放日誌,修復檔案系統,如果不行,再進行如下操作。
​
# 2、執行xfs_repair -n,只檢查不修復:檢查檔案系統是否損壞,如何損壞會列出將要執行的操作
[root@localhost ~]# xfs_repair -n /dev/sdb2
如果是日誌和資料不一致了,xfs 預設會在掛載的時候修復這種不一致,作業系統給出的建議是以讀寫的方式掛載並自動修復,可以嘗試以只讀不修複方式掛載檔案系統。
[root@localhost ~]# mount -o ro,norecovery /dev/sdb2 /opt
​
# 3、如果上述掛載不成功,可以執行xfs_repair修復檔案系統
[root@localhost ~]# xfs_repair /dev/sdb2 
​
# 4、如果還不行,那最後方法只能採用"損失部分資料的修復方法"
根據列印訊息,修復失敗時:
先執行xfs_repair -L /dev/sdb2(清空日誌,會丟失檔案)
再執行xfs_repair /dev/sdb2
​
說明:-L是修復xfs檔案系統的最後手段,慎重選擇,它會清空日誌,會丟失使用者資料和檔案。
備註:在執行xfs_repair操作前,最好使用xfs_metadump工具儲存元資料,一旦修復失敗,最起碼可以恢復到修復之前的狀態。
​
# 5、修復完成以後,嘗試能不能正常掛載 ,如能,取消掛載,再啟動就正常了

示例

# 1、準備一個1G的檔案系統與資料
[root@localhost ~]# mount /dev/sdb1 /opt/
[root@localhost ~]# echo big_egon > /opt/1.txt
​
# 2、模擬檔案系統損壞
[root@localhost ~]# dd if=/dev/zero of=/dev/sdb bs=500M count=1  # 直接幹/dev/sdb而不是sdb1
記錄了1+0 的讀入
記錄了1+0 的寫出
524288000位元組(524 MB)已複製,1.09433 秒,479 MB/秒
[root@localhost ~]# # 此時看似一切都正常
[root@localhost ~]# cat /opt/1.txt 
big_egon
[root@localhost ~]# echo egon_nb > /opt/2.txt
[root@localhost ~]# cat /opt/2.txt 
egon_nb
[root@localhost ~]# # 但是重新掛載就會失效,即斷電後系統重啟,重新掛載不成功
​
[root@localhost ~]# umount /opt 
[root@localhost ~]# mount /dev/sdb1 /opt
mount: /dev/sdb1 防寫,將以只讀方式掛載
mount: 未知的檔案系統型別“(null)”
​
# 3、修復
[root@localhost ~]# xfs_repair /dev/sdb1
Phase 1 - find and verify superblock...
bad primary superblock - bad magic number !!!
。。。。。。
修復失敗,無法掛載
[root@localhost ~]# mount /dev/sdb1 /opt/
mount: 將 /dev/sdb1 掛載到 /opt 失敗: 結構需要清理
​
[root@localhost ~]# xfs_repair -L /dev/sdb1  # 強制修復
[root@localhost ~]# mount /dev/sdb1 /opt/
[root@localhost ~]# ls /opt/  # 資料丟失,所以此時修復的意義在於可用,至於資料,你需要自己有備份意識
[root@localhost ~]# 

ps:如果是ext檔案系統,修復需要用fsck命令

fsck -f -y /dev/sda1 
​
-y 對所有問題都回答 "yes"
-f 即使檔案系統標記為 clean 也強制進行檢查

八 xfs檔案系統備份與恢復
命令與軟體包

[root@localhost ~]# rpm -qf `which xfsdump`
xfsdump-3.1.7-1.el7.x86_64
[root@localhost ~]# rpm -qf `which xfsrestore`
xfsdump-3.1.7-1.el7.x86_64

xfsdump的備份級別有以下兩種,預設為0(即完全備份)

0                       完全備份
​
1    <=   level <= 9    增量備份:
​
# ps:增量備份是和第一次的備份(level 0)進行比較,僅備份有差異的檔案(level 1)

xfsdump常用引數

-L:xfsdump會記錄每次備份的session Label,這裡可以填寫針對此檔案系統的簡易說明;
-M:xfsdump可以記錄儲存Media Label,這裡可以填寫此媒體的簡易說明。
-l:是L的小寫,就是指定level,有0~9共10個等級,預設為0,即完整備份。
-f:後面接產生的檔案和destination file 。例如/dev/st0裝置檔名或其他一般檔案檔名
-I:大寫的“i”,從/var/lib/xfsdump/inventory 列出目前備份的資訊狀態。

xfsdump使用限制

1.必須用root許可權
2.只能備份已掛載的檔案系統
3.只能備份XFS檔案系統
4.只能用xfsrestore解釋
5.透過檔案系統的UUID來分辨備份檔,因此不能備份相同UUID的檔案系統

xfsdump備份與xfsrestore恢復

# 1、資料備份
# 1.1 先做全量備份,切記“備份的源路徑”末尾不要加左斜槓/
xfsdump -l 0 -L sdb3_bak -M sdb3_bak -f 全量備份的成果路徑1 備份的源路徑 
​
# 1.2 再做增量備份
xfsdump -l 1 -L sdb3_bak -M sdb3_bak -f 增量備份的成果路徑2 備份的源路徑 
xfsdump -l 1 -L sdb3_bak -M sdb3_bak -f 增量備份的成果路徑3 備份的源路徑 
xfsdump -l 1 -L sdb3_bak -M sdb3_bak -f 增量備份的成果路徑4 備份的源路徑 
​
# 2、資料恢復
# 2.1、先恢復全量備份
xfsrestore -f 全量備份的成果路徑1 資料恢復的路徑
# 2.2、再依次恢復增量
xfsrestore -f 增量備份的成果路徑2 資料恢復的路徑
xfsrestore -f 增量備份的成果路徑2 資料恢復的路徑
xfsrestore -f 增量備份的成果路徑2 資料恢復的路徑

示例:

資料備份

# 1、準備一個分割槽並製作好xfs檔案系統,掛載好後給它加一點初始資料
[root@localhost ~]# df
檔案系統         1K-塊    已用    可用 已用% 掛載點
。。。。。。
/dev/sdb3      1038336   76836  961500    8% /opt
[root@localhost ~]# cp -r /etc/ /opt/
[root@localhost ~]# echo 111 > /opt/1.txt
[root@localhost ~]# ls /opt/
1.txt  etc
[root@localhost ~]# 
​
# 2、先做全量備份
[root@localhost ~]# xfsdump -l 0 -L sdb3_bak -M sdb3_bak -f /all.bak /opt
​
# 3、往/opt下新增檔案2.txt,然後作增量備份
[root@localhost ~]# echo 222 > /opt/2.txt
[root@localhost ~]# xfsdump -l 1 -L sdb3_bak -M sdb3_bak -f /add.bak1 /opt
​
​
# 4、往/opt下新增檔案3.txt,然後作增量備份
[root@localhost ~]# echo 333 > /opt/3.txt
[root@localhost ~]# xfsdump -l 1 -L sdb3_bak -M sdb3_bak -f /add.bak2 /opt
​
# 5、檢視一下備份檔案大小
[root@localhost ~]# du -sh /opt/
41M /opt/
​
[root@localhost ~]# ll -h /all.bak   # 全量備份大小
-rw-r--r--. 1 root root 37M 11月  4 18:44 /all.bak
[root@localhost ~]# ll -h /add.bak1  # 增量備份大小
-rw-r--r--. 1 root root 22K 11月  4 18:45 /add.bak1
[root@localhost ~]# ll -h /add.bak2  # 增量備份大小
-rw-r--r--. 1 root root 23K 11月  4 18:46 /add.bak2

資料恢復:

[root@localhost ~]# rm -rf /opt/*
[root@localhost ~]# xfsrestore -f /all.bak /opt/  # 先恢復全量
......
[root@localhost ~]# ls /opt/
1.txt  etc
[root@localhost ~]# xfsrestore -f /add.bak1 /opt/  # 再恢復增量1
[root@localhost ~]# ls /opt/
1.txt  2.txt  etc
[root@localhost ~]# xfsrestore -f /add.bak2 /opt/  # 再恢復增量2
[root@localhost ~]# ls /opt/
1.txt  2.txt  3.txt  etc

九 LVM
9.1 為何要用lvm
我們在對磁碟分割槽的大小進行規劃時,往往不能確定每個分割槽使用的空間大小,只能憑經驗分配一個大小,而我們通常使用的 fdisk、gdisk 等工具對磁碟分割槽後,每個分割槽的大小就固定死了,這麼做的問題是

# 如果分割槽設定的過大,就白白浪費了磁碟空間;
# 如果分割槽設定的過小,就會導致空間不夠用的情況出現。
對於分割槽過小的問題,我們可以重新劃分磁碟的分割槽,或者通過軟連線的方式將此分割槽的目錄連結到另外一個分割槽。這樣做雖然能夠臨時解決問題,但是給管理帶來了麻煩。

上述問題可以通過 LVM 來解決

9.2 什麼是lvm

邏輯卷管理LVM是硬碟的一個系統工具。無論在Linux或者其他類似的系統,都是非常的好用。傳統分割槽使用固定大小分割槽,重新調整大小十分麻煩。但是,LVM可以建立和管理“邏輯”卷,而不是直接使用物理硬碟。可以讓管理員彈性的管理邏輯卷的擴大縮小,操作簡單,而不損壞已儲存的資料。可以隨意將新的硬碟新增到LVM,以直接擴充套件已經存在的邏輯卷。LVM並不需要重啟就可以讓核心知道分割槽的存在。

通過 LVM 技術,可以遮蔽掉磁碟分割槽的底層差異,在邏輯上給檔案系統提供了一個卷的概念,然後在這些捲上建立相應的檔案系統。下面是 LVM 中主要涉及的一些概念。

物理卷(PV):(physical volume),把常規的磁碟裝置通過pvcreate命令對其進行初始化,形成了物理卷。其實就是硬碟或分割槽。(麵粉)
​
​
卷組(VG):(volume group),把多個物理卷組成一個邏輯的整體,這樣卷組的大小就是多個硬碟之和。或者理解就是由一個或多個PV組成的整體。(麵糰)
​
​
邏輯卷(LV):(logical volume),從卷組中劃分需要的空間大小出來。使用者僅需對其格式化然後即可掛載使用。從VG中切割出的空間用於建立檔案系統。(切成饅頭)
​
​
基本單元(PE):(physical extend),分配的邏輯大小的最小單元,預設為4MB的基本塊。(假設分配100MB邏輯空間,則需要建立25個PE)

lvm優缺點總結

# 優點:
# 1、可以在系統執行的狀態下動態的擴充套件檔案系統的大小。
​
# 2、檔案系統可以跨多個磁碟,因此檔案系統大小不會受物理磁碟的限制。
# 3、可以增加新的磁碟到LVM的儲存池中。
# 4、可以以映象的方式冗餘重要的資料到多個物理磁碟。
# 5、可以方便的匯出整個卷組到另外一臺機器。
​
# 缺點:
# 1、因為加入了額外的操作,存取效能受到影響。
# 2、當卷組中的一個磁碟損壞時,整個卷組都會受到影響。
解釋:LVM如果有一個磁碟損壞,整個lvm都壞了,lvm只有動態擴充套件作用,
方案:底層用RAID + 上層LVM = 既有冗餘又有動態擴充套件
​
# 2、在從卷組中移除一個磁碟的時候必須使用reducevg命令(該命令要求root許可權,並且不允許在快照卷組中使用)
​

9.3 lvm的基本使用

0、下載安裝軟體包

yum install -y lvm2

1、製作pv:可以對分割槽做、也可以對整塊盤做

# 製作
[root@egon ~]# pvcreate /dev/sdb1  # 對分割槽做
[root@egon ~]# pvcreate /dev/sdb2  # 對分割槽做
[root@egon ~]# pvcreate /dev/sdb3  # 對分割槽做
[root@egon ~]# pvcreate /dev/sdc   # 對整塊盤做
​
# 檢視
[root@egon ~]# pvs
  PV         VG Fmt  Attr PSize  PFree 
  /dev/sdb1     lvm2 ---   1.00g  1.00g
  /dev/sdb2     lvm2 ---   1.00g  1.00g
  /dev/sdb3     lvm2 ---   1.00g  1.00g
  /dev/sdc      lvm2 ---  20.00g 20.00g
[root@egon ~]# pvscan 
  PV /dev/sdb1                      lvm2 [1.00 GiB]
  PV /dev/sdc                       lvm2 [20.00 GiB]
  PV /dev/sdb2                      lvm2 [1.00 GiB]
  PV /dev/sdb3                      lvm2 [1.00 GiB]
  Total: 4 [23.00 GiB] / in use: 0 [0   ] / in no VG: 4 [23.00 GiB]

2、製作vg:將pv劃入vg中

# 製作一個vg1:
[root@egon ~]# vgcreate vg1 /dev/sdb1 /dev/sdc  # 包含/dev/sdb1與/dev/sdc兩個pv
  Volume group "vg1" successfully created
[root@egon ~]# vgs
  VG  #PV #LV #SN Attr   VSize  VFree 
  vg1   2   0   0 wz--n- 20.99g 20.99g
​
# 也可以再製作一個vg2:
[root@egon ~]# vgcreate vg2 /dev/sdb2 /dev/sdb3  # 包含/dev/sdb2與/dev/sdb3兩個pv
  Volume group "vg2" successfully created
[root@egon ~]# vgs
  VG  #PV #LV #SN Attr   VSize  VFree 
  vg1   2   0   0 wz--n- 20.99g 20.99g
  vg2   2   0   0 wz--n-  1.99g  1.99g
[root@egon ~]# 

3、建立邏輯卷lvm

選項
    -L    #邏輯卷大小
    -n    #邏輯卷名字
    
# 從vg1中分出來邏輯卷lv1_from_vg1、lv2_from_vg1
[root@egon ~]# lvcreate -L 100M -n lv1_from_vg1 vg1
[root@egon ~]# lvcreate -L 200M -n lv2_from_vg1 vg1
​
# 從vg2中分出來一個建邏輯卷lv1_from_vg2、lv1_from_vg2
[root@egon ~]# lvcreate -L 300M -n lv1_from_vg2 vg2
[root@egon ~]# lvcreate -L 400M -n lv2_from_vg2 vg2
​
# 檢視
[root@egon ~]# lvs
  LV           VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv1_from_vg1 vg1 -wi-a----- 100.00m                                                    
  lv2_from_vg1 vg1 -wi-a----- 200.00m                                                    
  lv1_from_vg2 vg2 -wi-a----- 300.00m                                                    
  lv2_from_vg2 vg2 -wi-a----- 400.00m     

4、格式與掛載

[root@egon ~]# mkfs.xfs /dev/vg1/lv1_from_vg1 
[root@egon ~]# mkfs.xfs /dev/vg1/lv2_from_vg1 
​
[root@egon ~]# mkfs.xfs /dev/vg2/lv1_from_vg2 
[root@egon ~]# mkfs.xfs /dev/vg2/lv2_from_vg2 
​
​
[root@egon ~]# mount /dev/vg1/lv1_from_vg1 /test1/
[root@egon ~]# mount /dev/vg1/lv2_from_vg1 /test2/
[root@egon ~]# 
[root@egon ~]# mount /dev/vg2/lv1_from_vg2 /test3/
[root@egon ~]# mount /dev/vg2/lv2_from_vg2 /test4/
​
​
# 檢視
[root@egon ~]# df
檔案系統                       1K-塊    已用    可用 已用% 掛載點
...
/dev/mapper/vg1-lv1_from_vg1   98980    5344   93636    6% /test1
/dev/mapper/vg1-lv2_from_vg1  201380   10464  190916    6% /test2
/dev/mapper/vg2-lv1_from_vg2  303780   15584  288196    6% /test3
/dev/mapper/vg2-lv2_from_vg2  406180   20704  385476    6% /test4
[root@egon ~]# 

9.4 線上動態擴容
線上擴容的意思為:在不用解除安裝的情況下完成擴容.
命令如下:

lvextend -L  [+]MGT  /dev/VG_NAME/VL_NAME
# 注意:-L 100M 與 -L +100M不是一個意思,或者代表在原有的基礎上擴容

示例如下

# 1、新增一塊盤或者一個分割槽
fdisk /dev/sdb ......
partprobe
ls /dev/sdb4
​
# 2、新增一個pv
[root@egon ~]# pvcreate /dev/sdb4
​
# 3、把新增的pv擴到vg2裡
[root@egon ~]# vgextend vg2 /dev/sdb4
[root@egon ~]# vgs  # 可以看到vg2擴容了
​
# 4、接下來對lv1_from_vg2擴容
[root@egon ~]# lvextend -L +1000M /dev/vg2/lv1_from_vg2 
[root@egon ~]# xfs_growfs /dev/vg2/lv1_from_vg2  # 擴充套件邏輯卷後需要更新fs檔案系統

9.5 線上動態縮容與刪除
不要縮容!!!並且xfs乾脆不支援縮容

lvreduce -L [-]MGT /dev/VG_NAME/LV_NAME 縮減邏輯卷

刪除

# 刪除lv之前需要先解除安裝掛載點
[root@egon ~]# umount /test3
[root@egon ~]# lvremove /dev/vg2/lv1_from_vg2 
​
# 刪vg
[root@egon ~]# vgremove vg2
​
# 刪pv:只能刪掉那些不屬於任何vg的pv
[root@egon ~]# pvremove /dev/sdb2
[root@egon ~]# pvremove /dev/sdb3

9.6 快照

LVM 機制還提供了對 LV 做快照的功能,也就是說可以給檔案系統做一個備份,這也是設計 LVM 快照的主要目的。LVM 的快照功能採用寫時複製技術(Copy-On-Write,COW),這比傳統的備份技術的效率要高很多。建立快照時不用停止服務,就可以對資料進行備份。說明:LVM 還支援 thin 型別的快照,但是本文中的快照都是指 COW 型別的快照。

LVM 採用的寫時複製,是指當 LVM 快照建立的時候,僅建立到實際資料的 inode 的硬連結(hark-link)而已。只要實際的資料沒有改變,快照就只包含指向資料的 inode 的指標,而非資料本身。快照會跟蹤原始卷中塊的改變,一旦你更改了快照對應的檔案或目錄,這個時候原始捲上將要改變的資料會在改變之前拷貝到快照預留的空間。

lvm快照的原理:

建立快照實際上也是建立了一個邏輯卷,只不過該卷的屬性與普通邏輯卷的屬性有些不一樣。我們可以通過上圖來理解快照資料卷(圖中的實線框表示快照區域,虛線框表示檔案系統):
# 左圖為最初建立的快照資料卷狀況,LVM 會預留一個區域 (比如左圖的左側三個 PE 區塊) 作為資料存放處。 此時快照資料卷內並沒有任何資料,而快照資料卷與源資料卷共享所有的 PE 資料, 因此你會看到快照資料卷的內容與源資料卷中的內容是一模一樣的。 等到系統執行一陣子後,假設 A 區域的資料被更新了(上面右圖所示),則更新前系統會將該區域的資料移動到快照資料卷中, 所以在右圖的快照資料卷中被佔用了一塊 PE 成為 A,而其他 B 到 I 的區塊則還是與源資料卷共享!

強調:

由於快照區與原本的 LV 共享很多 PE 區塊,因此快照區與被快照的 LV 必須要在同一個 VG 上頭,下面兩點非常重要:
# 1、VG中需要預留存放快照本身的空間,不能全部被佔滿。
# 2、快照所在的 VG 必須與被備份的 LV 相同,否則建立快照會失敗。

總結:

快照的本質就是一個特殊的lv,建立快照後,如果源資料卷中的檔案被更新了,會將老資料賦給快照的空間,這就要求快照的空間也是夠用的

示例1:利用快照恢復單個檔案

# 1、準備好初始資料
[root@egon ~]# df
檔案系統                       1K-塊    已用    可用 已用% 掛載點
。。。。。。
/dev/mapper/vg1-lv1_from_vg1   98980    5348   93632    6% /test1
[root@egon ~]#  echo "hello egon" > /test1/1.txt
​
# 2、檢視vg1容量是否充足
lv1_from_vg1 屬於卷組vg1,而vg1有足夠的容量來分配給快照卷
[root@egon ~]# vgs
  VG  #PV #LV #SN Attr   VSize  VFree  
  vg1   2   2   0 wz--n- 20.99g <20.70g
[root@egon ~]# 
​
# 3、在vg1卷組裡建立一個lv1_from_vg1的邏輯卷
[root@egon ~]# lvcreate -L 1G -s -n lv1_from_vg1_snap /dev/vg1/lv1_from_vg1
​
# 4、檢視
[root@egon ~]# lvs
  LV                VG  Attr       LSize   Pool Origin       Data%  Meta%  Move Log Cpy%Sync Convert
  lv1_from_vg1      vg1 owi-aos--- 100.00m                                                          
  lv1_from_vg1_snap vg1 swi-a-s--- 104.00m      lv1_from_vg1 0.01                                   
  。。。。。。                                                        
​
# 5、修改檔案/test/1.txt
[root@egon ~]# echo "egon say ladygaga" >> /test1/1.txt 
[root@egon ~]# cat /test1/1.txt 
hello egon
egon say ladygaga
​
# 6、恢復資料
掛載快照,注意:快照在掛載的時候由於和原來的lvm是同一個UUID,而XFS是不允許相同UUID的檔案系統掛載,所以需要加選項 -o nouuid
[root@egon ~]# mount -o nouuid /dev/vg1/lv1_from_vg1_snap /opt/
[root@egon ~]# cat /opt/1.txt 
hello egon
[root@egon ~]# cp /opt/1.txt /test1/1.txt 
cp:是否覆蓋"/test1/1.txt"? y
[root@egon ~]# cat /test1/1.txt 
hello egon
[root@egon ~]# 

示例2:如果要恢復的檔案個數過多,可以直接合並

mount /dev/vg1/lv1_from_vg1 /test1/
echo hello egon > /test1/1.txt 
lvcreate -L 1G -s -n lv1_from_vg1_snap /dev/vg1/lv1_from_vg1
echo aaaa >> /test1/1.txtecho aaaa >> /test1/1.txt 
echo aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
mount -o nouuid /dev/vg1/lv1_from_vg1_snap /opt/
​
[root@egon ~]# cat /opt/1.txt 
hello egon
[root@egon ~]# cat /test1/1.txt 
hello egon
aaaa
aaaa
aaaa
aaaa
aaaa
​
先解除安裝資料來源與快照,再進行合併,快照會自動刪除,一次性的
​
[root@egon ~]# umount /test1
[root@egon ~]# umount /opt
[root@egon ~]# lvconvert --mergesnapshot /dev/vg1/lv1_from_vg1_snap 
[root@egon ~]# mount /dev/vg1/lv1_from_vg1 /test1/
[root@egon ~]# cat /test1/1.txt  # 資料還原回來了
hello egon