linux入門系列13--磁碟管理之RAID、LVM技術

来源:https://www.cnblogs.com/heimatengyun/archive/2020/02/24/12357153.html
-Advertisement-
Play Games

前一篇文章學習了磁碟分區、格式化、掛載等相關知識,本文將講解RAID和LVM技術。 磁碟管理操作主要是運維人員用的較多,如果只是單純的開發人員,可以先略過本文。但是在很多小公司里往往都是一人多用,運維、開發通常都是同一個人,因此對個人的技能要求更高。即便不是如此,多瞭解下相關概念也是有利而無害的。 ...


前一篇文章學習了磁碟分區、格式化、掛載等相關知識,本文將講解RAID和LVM技術。

磁碟管理操作主要是運維人員用的較多,如果只是單純的開發人員,可以先略過本文。但是在很多小公司里往往都是一人多用,運維、開發通常都是同一個人,因此對個人的技能要求更高。即便不是如此,多瞭解下相關概念也是有利而無害的。

本文將先講解RAID技術方案相關理論知識並通過案例演示RAID操作,然後演示LVM技術以解決存儲資源動態調整問題。

一、獨立冗餘磁碟陣列(RAID)

RAID(Redundant Array of Independent Disk)技術把多個硬碟設備組合成一個容量更大、安全性更好的磁碟陣列,並把數據切割成多個區段後分別存放在各個不同的物理硬碟設備上,利用分散讀寫技術提升磁碟陣列整體的性能,同時把多個重要數據的副本同步到不同的物理硬碟設備上,從而起到了非常好的數據冗餘備份效果。

簡單說就是通過RAID技術可以提升磁碟讀寫性能,同時可以冗餘備份數據保證數據可靠性。但是性能和可靠性不可能同時滿足的非常好,因此在二者之間作出權衡就產生了不同的RAID方案。

1.1 RAID方案及特點

據說目前RAID磁碟陣列的方案至少有十幾種,然而萬變不離其宗,都是在讀寫性能和可靠性之間權衡,因此只介紹幾種比較有代表性的方案。

方案 特點
RAID0 磁碟讀寫性能高,但數據可靠性低
RAID1 磁碟設備利用率低,但數據可靠性高
RAID5 兼顧成本、讀寫性能和數據安全的折中方案
RAID10 相對於成本,更看重數據安全可靠
1.1.1 RAID0

把多塊物理硬碟設備通過硬體或軟體的方式串聯在一起,組成一個大的捲組,並將數據依次寫入到各個物理硬碟中。

最理想情況下,磁碟讀寫性能將提高數倍,但如果其中任意一塊磁碟損壞將導致整個系統數據被破壞。也就是說雖然RAID0有效提高磁碟數據的吞吐速度,但是不具備數據備份和錯誤修複能力。

其示意圖如下:

file

1.1.2 RAID1

如上所述,雖然RAID0提升了磁碟讀寫速度,但是由於它將數據依次寫入各個磁碟中,把數據分開存儲,如果其中一塊磁碟發生故障將會導致整個系統數據損壞。因此如果對數據要求性要求較高,但對磁碟讀寫速度沒有要求的話,這種方案就不合適,需要用到RAID1方案。

RAID1示意圖如下:

file

RAID1是把多塊硬碟綁定,數據同時寫入多塊磁碟,這樣就會有多份數據副本,當其中某一塊硬碟發生故障後,立即自動以熱交換的方式來恢複數據的正常使用。

雖然通過副本的形式保證了數據的安全性,但是磁碟設備利用率不高,從示意圖可以看出,如果是2塊磁碟則利用率只有50%,因此增加了成本開銷。

1.1.3 RAID5

前面兩種方案分別偏向於磁碟速度和數據安全,而RAID5則是在讀寫性能、數據安全和成本之間的一個相互妥協方案。

示意圖如下:

file

RAID5技術是把硬碟設備的數據奇偶校驗信息保存到其他硬碟設備中。這樣的好處是其中任何一設備損壞後不至於出現致命缺陷,圖中的parity部分存放的就是數據的奇偶校驗信息。

簡單說就是RAID5方案實際上沒有備份硬碟中的真實數據信息(數據只有一份),而是當硬碟設備出現問題後通過奇偶校驗信息來嘗試重建損壞的數據。

這種方案兼顧了了硬碟設備的讀寫速度、數據安全性與存儲成本問題。

1.1.4 RAID10

雖然RAID5看起來在成本問題、磁碟讀寫以及數據安全性有了一個相互妥協的方案,但實際上很多企業,尤其是金融企業數據本身的價值遠比磁碟價格高,因此成本並不是第一考慮要素,在這種場景下,一般是採用RAID10技術。

RAID10方案實際就是把RAID0和RAID1兩種方案進行組合而來,示意圖如下:

file

如圖所示,需要至少4塊硬碟來組建RAID10,先兩兩組合製作為RAID1確保數據有副本來保證安全性,然後在將組合後的兩個RAID1採用RAID0進行組合,進一步提高設備的讀寫速度。

從理論上講,只要同一組中的硬碟不全壞掉,那麼最多可以損壞50%的硬碟設備而不丟失數據。

由於RAID10方案繼承了RAID0的高讀寫速度和RAID1的數據安全性,在不考慮成本的情況下RAID10的性能都超過了RAID5,因此當前成 為廣泛使用的一種存儲技術。

說明:由於篇幅所限,其他的方案就不一一列出,需要說明的是應該按照實際需求去考慮成本、磁碟性能、數據安全性等因素,按需選擇最合適需求場景的方案。

1.2 mdadm命令

通過上一篇文章“linux入門系列12--磁碟管理之分區、格式化與掛載”的講解,已經學會了磁碟設備管理之後,再來部署RAID就會非常簡單,因此如果還沒掌握的話,建議先返回去看上一篇文章。

在正式操作RAID之前,我們先看一下在linux中RAID磁碟陣列的管理命令mdadm。

語法格式:

​ mdadm [模式參數] RAID名稱 [選項] [成員磁碟列表]

參數選項:

參數 作用
-a 檢查設備名稱
-n 指定設備數量
-l level,指定 RAID 級別
-C 創建RAID
-v 顯示詳細過程
-f 模擬設備損壞
-r remove,移除設備
-D 查看詳細信息

1.3 實例1-RAID10部署

1.3.1 環境準備

我們直接在虛擬機中模擬添加多塊磁碟來演示RAID的操作,生產環境中採用的命令和步驟都是一致的。

為了避免實驗之間的干擾,我們先克隆一臺新的Centos虛擬機進行演示

file

點擊“克隆”後,彈出虛擬機嚮導

file

點擊“下一步”

file

保存預設選擇“虛擬機中的當前狀態”,點擊“下一步”

file

選擇“創建完整的克隆”,點擊“下一步”

file

按需修改虛擬機名稱已經存放的位置,點擊“完成”按鈕

file

等待克隆完成(根據不同機器的性能,克隆時間不同)

file

這樣新的虛擬機就準備好了。

1.3.2 創建RAID10

如前所述,RAID10至少需要4塊磁碟,因此我們先添加4塊磁碟。

(1)添加磁碟

選擇剛纔克隆的虛擬機,點擊“編輯虛擬機設置”

file

在彈出的“虛擬機設置”視窗中,點擊“添加”

file

在彈出的“添加硬體嚮導”中選擇“硬碟”,然後點擊“下一步”

file

磁碟類型保存預設“SCSI”,點擊“下一步”

file

磁碟類型保持預設的“創建新虛擬機磁碟”,點擊“下一步”

file

根據需要設置磁碟大小,此處設置為1G,點擊“下一步”

file

選擇磁碟文件存放路徑,點擊“完成”按鈕

file

即可看到剛纔添加的一塊磁碟已經成功。

file

在上邊界面中點擊“添加”按鈕,用相同的方法再添加3塊磁碟,總共新添加4塊磁碟。

file

(2)創建RAID10磁碟陣列

啟動剛纔添加磁碟的虛擬機,並用之前講解的lsblk或fdisk查看磁碟設備

[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0    1G  0 disk 
sdc               8:32   0    1G  0 disk 
sdd               8:48   0    1G  0 disk 
sde               8:64   0    1G  0 disk 
sr0              11:0    1  3.9G  0 rom  /run/media/root/CentOS 7 x86_64
[root@origin ~]# fdisk -l
Disk /dev/sde: 1073 MB, 1073741824 bytes, 2097152 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 /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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 /dev/sdd: 1073 MB, 1073741824 bytes, 2097152 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 /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 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
...省略部分內容
[root@origin ~]# 

可以看到剛纔添加的磁碟:sdb、sdc、sdd、sde,設備名稱名稱分別為:/dev/sdb,/dev/sdc,/dev/sdd,/dev/sde

接下來用mdadm命令創建RAID10

[root@origin ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 1047552K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@origin ~]# 

C參數代表創建一個RAID陣列卡;-v參數顯示創建的過程,同時在後面追加一個設備名稱/dev/md0,這樣/dev/md0就是創建後的RAID 磁碟陣列的名稱;-a yes 參數代表自動創建設備文件;-n 4參數代表使用4塊硬碟來部署這個RAID磁碟陣列;而-l 10參數則代表RAID10方案。

創建磁碟陣列成功之後,下一步就是格式化

1.3.3 格式化RAID

用mkfs命令格式化RAID磁碟陣列

[root@origin ~]# 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
131072 inodes, 523776 blocks
26188 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 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 (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]# 
1.3.4 掛載磁碟陣列

創建目錄並掛載磁碟陣列

[root@origin ~]# mkdir /raid
[root@origin ~]# mount /dev/md0 /raid
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# 

咦,細心的朋友可能就有疑問了,甚至開始懷疑是不是自己操作錯了,前面明明添加了4塊磁碟,每個磁碟為1G,總量應該為4G,但此處卻看到/dev/md0大小為2G?

是的,你沒看錯,根據前面講解的RAID10方案,容量會減少。此處可以看到4塊磁碟的情況下,可用容量會減少一半。

我們還需要把掛載信息寫入到配置文件中,使其永久生效

[root@origin ~]# echo "/dev/md0 /raid ext4 defaults 0 0">>/etc/fstab
[root@origin ~]# cat /etc/fstab 
...省略部分內容
/dev/md0 /raid ext4 defaults 0 0
[root@origin ~]# 

這樣就把磁碟陣列掛載到了raid目錄。

1.3.5 查看磁碟陣列信息

查看磁碟陣列信息

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
[root@origin ~]#

可以看到4塊磁碟陣列中的4塊磁碟均已正常工作。

至此,RAID10方案部署完成。由此可見,整個操作流程給添加硬碟一致,都是需要創建、格式化、掛載等步驟,非常簡單。

1.4 實例2-修複RAID10中壞掉的磁碟

此實驗模擬剛纔的磁碟陣列中某塊硬碟壞掉後的替換操作,因此在前邊的環境中繼續執行以下操作。

1.4.1 模擬設備損壞

使用mdadm命令的-f參數模擬設備損壞

[root@origin ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
       0       8       16        -      faulty   /dev/sdb
[root@origin ~]#

在確認有一塊物理硬碟設備出現損壞而不能繼續正常使用後,使用mdadm命令將其移除,然後查看RAID磁碟陣列的狀態,發現/dev/sdb磁碟的狀態已經改變。

在RAID10級別的磁碟陣列中,當RAID1磁碟陣列中存在一個故障盤時並不影響RAID10 磁碟陣列的使用。當購買了新的硬碟設備後再使用 mdadm 命令來予以替換即可,在此期間我們可以在/RAID目錄中正常地創建或刪除文件。

由於我們是在虛擬機中模擬的,為了更真實,先重啟系統,之後再繼續後邊的操作。

重啟之後發現損壞的盤已經不再磁碟陣列中了

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINT
sda               8:0    0   20G  0 disk   
├─sda1            8:1    0  500M  0 part   /boot
└─sda2            8:2    0 19.5G  0 part   
  ├─centos-swap 253:0    0    2G  0 lvm    [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm    /
sdb               8:16   0    1G  0 disk   
sdc               8:32   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sdd               8:48   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sde               8:64   0    1G  0 disk   
└─md0             9:0    0    2G  0 raid10 /raid
sr0              11:0    1  3.9G  0 rom  
1.4.2 取消磁碟陣列目錄掛載
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
/dev/sda1                497M  134M  363M  27% /boot
[root@origin ~]# umount /raid/
[root@origin ~]# df -h        
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  134M  363M  27% /boot
[root@origin ~]# 

添加磁碟,需要先取消掛載

1.4.3 添加磁碟並加入磁碟陣列

取消掛載之後,我們再用mdadm命令的-a參數添加磁碟

[root@origin ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       4       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
[root@origin ~]# 

可以看到/dev/sdb設備加入磁碟陣列成功

1.4.4 重新掛載磁碟陣列
[root@origin ~]# mount -a
[root@origin ~]# df -h   
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/md0                 2.0G  6.0M  1.9G   1% /raid

可以看到磁碟陣列/dev/md0又成功掛載到/raid目錄了。

由於之前/etc/fstab文件以及添加了記錄,因此此處就無須再添加了。

至此就模擬出設備壞掉之後,重新用新磁碟修複的過程。

1.5 實例3-RAID5+備份盤方案

按上邊的RAID10部署方案,最多允許 50%的硬碟設備發生故障。同一組中的磁碟只要不全壞都可以正常工作,但是在極端情況下如果同一個RAID1中的磁碟設備全部損壞,也會導致數據丟失。這種情況我們採用採用多加一塊備份盤來解決,這塊硬碟平時處於閑置狀態,一旦RAID磁碟陣列中有硬碟出現故障後則會馬上自動頂替上去。

同樣為了避免干擾,重新克隆一個虛擬機,並採用RAID5方案來進行演示。

採用RAID5並沒有什麼特別之處,目的只是為了演示下RAID5的用法,因為前面示例1和2都是用的RAID10。

由於RAID5至少需要3塊磁碟,另外此方案還需要一塊備份盤,因此在虛擬機中克隆新機器後,添加4塊硬碟。

1.5.1 創建RAID5

採用mdadm命令創建RAID5

[root@origin ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 1047552K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@origin ~]# 

參數-n 3代表創建這個RAID5磁碟陣列所需的硬碟數,參數-l 5代表RAID的級別,而參數-x 1則代表有一塊備份盤。

[root@origin ~]# mdadm -D /dev/md0 
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
       3       8       64        -      spare   /dev/sde

查看/dev/md0磁碟陣列看到有一塊備份盤在等待中了(spare)。

1.5.2 格式RAID5磁碟陣列

用mkfs命令將磁碟陣列格式化為ext4文件格式

[root@origin ~]# 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
131072 inodes, 523776 blocks
26188 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 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 (8192 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]# 
1.5.3 掛載磁碟陣列到目錄
[root@origin ~]# echo "/dev/md0 /raid ext4 defaults 0 0" >> /etc/fstab
[root@origin ~]# mkdir /raid
[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部分內容
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# 
1.5.4 模擬磁碟損壞

我們再次模擬把硬碟設備/dev/sdb 移出磁碟陣列

[root@origin ~]# mdadm /dev/md0 -f /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
[root@origin ~]# mdadm -D /dev/md0 
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
       0       8       16        -      faulty   /dev/sdb
[root@origin ~]# 

迅速查看/dev/md0 磁碟陣列的狀態,發現備份盤/dev/sde已經被自動頂替上去並開始了數據同步。

1.5.5 恢復損壞的磁碟

真實場景下,我們要保證隨時有一塊空閑的備份盤以防不測,因此需要替換或修複剛纔壞掉的盤/dev/sdb,恢復後它又自動變為空閑的備份盤,一旦有設備壞掉又會自動頂上去,從而保證數據的安全性。

由於我們上邊一個步驟是模擬的/dev/sdb設備壞點,雖然壞了但是還是在占用中,因此重啟虛擬機(重啟後發現/dev/sdb就沒有了,不重啟會提示/dev/sdd設備繁忙無法成功執行以下步驟),然後執行以下操作:

[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd
[root@origin ~]# umount /raid/
[root@origin ~]# mdadm /dev/md0 -a /dev/sdb
mdadm: added /dev/sdb
[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  134M  363M  27% /boot
/dev/md0                 2.0G  6.0M  1.9G   1% /raid
[root@origin ~]# mdadm -D /dev/md0
/dev/md0:
...省略部分內容
    Number   Major   Minor   RaidDevice State
       3       8       64        0      active sync   /dev/sde
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       5       8       16        -      spare   /dev/sdb
[root@origin ~]# 

可以看到,添加後/dev/sdb設備又自動變為備份盤了。這樣就保證了數據的安全。

二、邏輯捲管理器(LVM)

前面講解的用RAID磁碟陣列技術來管理磁碟設備,雖然能有效提供磁碟設備的讀寫性能以及數據的安全性,但是硬碟設備分區或部署RAID磁碟陣列後,硬碟分區大小就難以調整,而LVM(邏輯捲管理器)技術可以允許用戶對硬碟資源進行動態調整。

2.1 LVM概述

LVM(Logical Volume Manager)是Linux系統用於對硬碟分區進行管理的一種機制,創建初衷是為瞭解決硬碟設備在創建分區後不易修改分區大小的缺陷。

儘管對傳統的硬碟分區進 行強制擴容或縮容從理論上來講是可行的,但是卻可能造成數據的丟失。

LVM架構圖如下:

LVM技術是在硬碟分區和文件系統之間添加了一個邏輯層,它提供了一個抽象的捲組,可以把多塊硬碟進行捲組合併。這樣一來,用戶不必關心物理硬碟設備的底層架構和佈局,就可以實現對硬碟分區的動態調整。

物理捲處於LVM中的最底層,可以理解為物理硬碟、硬碟分區或者RAID磁碟陣列。捲組建立在物理捲之上,一個捲組可以包含多個物理捲,而且在捲組創建之後也可以繼續向其中添加新的物理捲。邏輯捲是用捲組中空閑的資源建立的,並且邏輯捲在建立後可以動態地擴展或縮小空間。

在生產環境中無法精確地評估每個硬碟分區在日後的使用情況,因此會導致 原先分配的硬碟分區不夠用。隨著業務的增加磁碟不夠用了需要擴容,或者業務縮減我們需要對磁碟分區進行精簡縮容等等,這些都可以通過LVM來解決。

部署LVM時,需要逐個配置物理捲、捲組和邏輯捲。常用命令如下:

功能 物理捲管理 捲組管理 邏輯捲管理
掃描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
顯示 pvdisplay vgdisplay lvdisplay
刪除 pvremove vgremove lvremove
擴展 vgextend lvextend
縮小 vgreduce lvreduce

2.2 案例實操

為了避免干擾,重新克隆一個虛擬機,並添加2塊磁碟(添加2塊的目的是為了演示將磁碟添加到LVM的捲組中,實際情況可能會有更多的磁碟)。

大概步驟為:先對這兩塊新硬碟進行創建物理捲的操作,然後對這兩塊硬碟進行捲組合併,接下來根據需求把合併後的捲組切割出一個約為 150MB 的邏輯捲設備,最後把這個邏輯捲設備格式化成 EXT4 文件系統後掛載使用。

2.2.1 部署LVM

(1)讓磁碟設備支持LVM

[root@origin ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0    1G  0 disk 
sdc               8:32   0    1G  0 disk 
sr0              11:0    1  3.9G  0 rom  /run/media/root/CentOS 7 x86_64
[root@origin ~]# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created
[root@origin ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [19.51 GiB / 0    free]
  PV /dev/sdc                       lvm2 [1.00 GiB]
  PV /dev/sdb                       lvm2 [1.00 GiB]
  Total: 3 [21.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 2 [2.00 GiB]
[root@origin ~]#

查看剛纔新家的2塊設備為:sdb、sdc。將其創建物理捲,並通過pvscan命令查看以創建物理捲。

(2)磁碟設備加入捲組

[root@origin ~]# vgcreate storage /dev/sdb /dev/sdc
  Volume group "storage" successfully created
[root@origin ~]# vgdisplay 
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       0 / 0   
  Free  PE / Size       510 / 1.99 GiB
  VG UUID               EKcctk-C1nM-Y2W8-s7pS-1bq8-W9ie-UTJM8Z
...省略部分內容
[root@origin ~]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "storage" using metadata type lvm2
  Found volume group "centos" using metadata type lvm2
[root@origin ~]# 

用vgcreate創建名稱為storage的捲組,並通過vgdisplay或vgscan可以查看。

(3)創建邏輯捲

切割出一個約為 150MB 的邏輯捲設備。這裡需要註意切割單位的問題,在對邏輯捲進行切割時有兩種計量單位。第一種是以容 量為單位,所使用的參數為-L。例如,使用-L 150M生成一個大小為 150MB 的邏輯捲。另外一種是以基本單元的個數為單位,所使用的參數為-l。每個基本單元的大小預設為 4MB。例如,使用-l 37 可以生成一個大小為 37×4MB=148MB 的邏輯捲。

[root@origin ~]# lvcreate -n vo -l 37 storage
  Logical volume "vo" created
[root@origin ~]# lvscan 
  ACTIVE            '/dev/storage/vo' [148.00 MiB] inherit
  ACTIVE            '/dev/centos/root' [17.51 GiB] inherit
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV Status              available
  '#' open                 0
  LV Size                148.00 MiB
  Current LE             37
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
...省略部分內容
[root@origin ~]# 

通過lvcreate創建名稱為vo的邏輯捲後,通過lvdisplay可以查看/dev/storage/vo大小為剛設置的148M(LV Size 148.00 MiB)。

(4)格式化邏輯捲並掛載

[root@origin ~]# mkfs.ext4 /dev/storage/vo
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
38000 inodes, 151552 blocks
7577 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33816576
19 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks: 
        8193, 24577, 40961, 57345, 73729
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@origin ~]# mkdir /lvm
[root@origin ~]# mount /dev/storage/vo /lvm
[root@origin ~]# echo "/dev/storage/vo /lvm ext4 defaults 0 0" >> /etc/fstab
[root@origin ~]#

格式化邏輯捲後掛載到lvm目錄,並把掛載信息寫入fstab文件使其開機自動生效。

(5)查看掛載狀態

[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo   140M  1.6M  128M   2% /lvm
[root@origin ~]# echo "test">/lvm/test.txt
[root@origin ~]# ls /lvm/
lost+found  test.txt
[root@origin ~]# 

通過df命令就可以查看掛載成功,並可以成功寫入文件到lvm目錄下。

2.2.2 LVM擴容

上一步創建的容量為148M,下麵將演示將其擴展到300M

(1)卸載設備與掛載點的關聯

[root@origin ~]# umount /lvm
[root@origin ~]#

(2)擴展邏輯捲

把上一個實驗中的邏輯捲 vo 擴展至 300MB

[root@origin ~]# lvextend -L 300M /dev/storage/vo
  Extending logical volume vo to 300.00 MiB
  Logical volume vo successfully resized
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV Status              available
  '#' open                 0
  LV Size                300.00 MiB
 ...省略部分內容

可以看到擴展後/dev/storage/vo邏輯捲大小為300M。

(3)檢查硬碟完整性並重置硬碟容量

[root@origin ~]# e2fsck -f /dev/storage/vo
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/storage/vo: 12/38000 files (0.0% non-contiguous), 10455/151552 blocks
[root@origin ~]# resize2fs /dev/storage/vo
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 307200 (1k) blocks.
The filesystem on /dev/storage/vo is now 307200 blocks long.
[root@origin ~]# 

(4)重新掛載設備

[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo   287M  2.1M  266M   1% /lvm
[root@origin ~]# 

可以看到擴容後,lvm目錄的大小為300M(上圖實際顯示為287M)。

這樣就完成了邏輯捲的擴容。

2.2.3 LVM縮小容

相較於擴容邏輯捲,在對邏輯捲進行縮容操作時,其丟失數據的風險更大,所以在生產環境中一定要提前備份數據。

為了保證數據安全性,Linux系統規定,在對LVM邏輯捲進行縮容操作之前,要先檢查文件系統的完整性。

上一步擴容後lvm容量為300M,本次演示將其縮容到100M,步驟如下:

(1)卸載文件系統

[root@origin ~]# umount /lvm
[root@origin ~]# 

(2)檢查文件系統完整性

[root@origin ~]#  e2fsck -f /dev/storage/vo
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/storage/vo: 12/76000 files (0.0% non-contiguous), 15761/307200 blocks
[root@origin ~]# 

(3)縮容邏輯捲

把邏輯捲 vo 的容量減小到 100MB

[root@origin ~]# resize2fs /dev/storage/vo 100M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo to 102400 (1k) blocks.
The filesystem on /dev/storage/vo is now 102400 blocks long.
[root@origin ~]# lvreduce -L 100M /dev/storage/vo
  WARNING: Reducing active logical volume to 100.00 MiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vo? [y/n]: y  
  Reducing logical volume vo to 100.00 MiB
  Logical volume vo successfully resized
[root@origin ~]# 

(4)重新掛載文件系統

[root@origin ~]# mount -a
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  4.5G   14G  26% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M  140K  914M   1% /dev/shm
tmpfs                    914M  9.0M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sr0                 3.9G  3.9G     0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/storage-vo    93M  1.6M   85M   2% /lvm
[root@origin ~]# 

可以看到lvm目錄已經縮小到93M,這樣就完成了邏輯捲的縮容操作。

2.2.4 LVM快照功能

邏輯捲快照功能就類似於還原操作系統,可以將邏輯捲狀態還原到指定時間點。

LVM快照功能有2個特點:快照捲只能使用一次,一旦執行還原操作後立即自動刪除;快照捲的容量必須等同於邏輯捲的容量防止數據丟失。

(1)查看當前捲組信息

[root@origin ~]# vgdisplay 
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.99 GiB
  PE Size               4.00 MiB
  Total PE              510
  Alloc PE / Size       25 / 100.00 MiB
  Free  PE / Size       485 / 1.89 GiB
  ...省略部分內容

可以看到捲組中已經使用了100M,空閑容量還有1.89G。(Alloc PE / Size 25 / 100.00 MiB, Free PE / Size 485 / 1.89 GiB)

(2)生成快照捲

[root@origin ~]# lvcreate -L 100M -s -n SNAP /dev/storage/vo
  Logical volume "SNAP" created
[root@origin ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo
  LV Name                vo
  VG Name                storage
  LV UUID                qziHT9-1qTT-1CRa-TIoq-cosz-Hhn0-jX5CVm
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:14:18 +0800
  LV snapshot status     source of
                         SNAP [active]
  LV Status              available
  '#' open                 1
  LV Size                100.00 MiB
  Current LE             25
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
   
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                TVfDRL-LnYd-z76K-fOuS-AD3C-Sw49-7jPgPo
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:40:10 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  '#' open                 0
  LV Size                100.00 MiB
  Current LE             25
  COW-table size         100.00 MiB
  COW-table LE           25
  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:3
 ...省略部分內容

通過lvcreate命令生成一個名為SNAP的快照邏輯捲。此時邏輯捲的存儲空間占用量為0.01%。(Allocated to snapshot 0.01%)

(3)邏輯捲中添加文件,查看快照捲空間使用量

[root@origin ~]# dd if=/dev/zero of=/lvm/files count=1 bs=50M
1+0 records in
1+0 records out
52428800 bytes (52 MB) copied, 0.289668 s, 181 MB/s
[root@origin ~]# ls /lvm/
files  lost+found  test.txt
[root@origin ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部分內容
/dev/mapper/storage-vo    93M   52M   35M  61% /lvm
[root@origin ~]# lvdisplay 
...省略部分內容
  --- Logical volume ---
  LV Path                /dev/storage/SNAP
  LV Name                SNAP
  VG Name                storage
  LV UUID                TVfDRL-LnYd-z76K-fOuS-AD3C-Sw49-7jPgPo
  LV Write Access        read/write
  LV Creation host, time origin, 2020-01-01 22:40:10 +0800
  LV snapshot status     active destination for vo
  LV Status              available
  '#' open                 0
  LV Size                100.00 MiB
  Current LE             25
  COW-table size         100.00 MiB
  COW-table LE           25
  Allocated to snapshot  50.29%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
...省略部分內容

在邏輯捲所掛載的目錄中創建一個50MB 的垃圾文件,然後再查看快照捲/dev/storage/SNAP和邏輯捲/dev/storage/vo的狀態。可以發現存儲空間的占用量都上升了,快照捲占用量為:Allocated to snapshot 50.29%。

(4)通過快照捲還原邏輯捲

通過剛纔創建的/dev/storage/SNAP快照捲,還原邏輯捲/dev/storage/vo的狀態。

還原之前先取消目錄掛載

[root@origin ~]# umount /lvm/
[root@origin ~]# lvconvert --merge /dev/storage/SNAP 
  Merging of volume SNAP started.
  vo: Merged: 72.9%
  vo: Merged: 100.0%
  Merge of snapshot into logical volume vo has finished.
  Logical volume "SNAP" successfully removed
[root@origin ~]# 

可以看到還原邏輯捲後,快照捲自動刪除了,通過lvdisplay命令查看也不會再有/dev/storage/SNAP 。

(5)重新掛載邏輯捲並查看文件

[root@origin ~]# mount -a
[root@origin ~]# ls /lvm/
lost+found  test.txt
[root@origin ~]# 

可以看到,還原之後剛纔創建files文件不見了,這樣就把邏輯捲還原到了創建快照時的狀態。

2.2.5 刪除邏輯捲

當生產環境中想要重新部署LVM或者不再需要使用 LVM 時,可以刪除LVM。

需要提前備份好重要的數據信息,然後依次刪除邏輯捲、捲組、物理捲設備,順序不可顛倒。

(1)取消掛載

[root@origin ~]# umount /lvm/

取消邏輯捲與目錄的掛載關聯,刪除配置文件中永久生效的設備參數,找到之前添加在/etc/fstab文件中的一行“/dev/storage/vo /lvm ext4 defaults 0 0”並刪除。

(2)刪除邏輯捲

[root@origin ~]# lvremove /dev/storage/vo
Do you really want to remove active logical volume vo? [y/n]: y
  Logical volume "vo" successfully removed
[root@origin ~]#

(3)刪除捲組

[root@origin ~]# vgremove storage
  Volume group "storage" successfully removed
[root@origin ~]# 

只寫捲組名稱即可,不需要設備的絕對路徑。

(4)刪除物理捲

[root@origin ~]# pvremove /dev/sdb /dev/sdc
  Labels on physical volume "/dev/sdb" successfully wiped
  Labels on physical volume "/dev/sdc" successfully wiped
[root@origin ~]# 

在上述操作執行完畢之後,再執行 lvdisplay、vgdisplay、pvdisplay 命令來查看 LVM 的信 息時就不會再看到信息了,說明刪除成功。

通過上文和本文的演示,基本掌握了centos7下磁碟管理相關操作,如果非運維人員不一定要掌握的非常深刻,理解即可。

本文講了很多磁碟相關的命令,需要多敲幾篇自然就熟悉了。下一篇文章再補充講解下SSH服務相關的知識,然後就開始講解應用服務的部署和使用了(如apache、郵件系統、mysql、動態網站部署等)。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Entity Framework框架提供了幾種開發模式,比如Database First,Model First,Code First。Database First是最老也是應用得最廣泛的一種設計方式。Database First這種方式的設計高度依賴於資料庫中表的結構,根據表及表間的關係來創建模型 ...
  • 首先看 ServiceCollection 的定義 //定義 public class ServiceCollection : IServiceCollection { private readonly List<ServiceDescriptor> _descriptors = new List< ...
  • mssql是.NET的標配,一般使用.NET的人基本都用mssql。 以前mssql只能支持windows平臺,從微軟打出 擁抱開源 的口號開始,mssql的2017 版本,開始支持linux系統。 一開始,我是直接在centos中安裝mssql的,總的來說,比windows快很多。但是現在都使用容 ...
  • 記錄LINQ學習過程。 概要 LINQ是一種“語言集成”的查詢表達式,使用LINQ可以智能提示和進行類型檢查。C#里可以編寫的LINQ查詢有SQL資料庫、XML文檔、ADO.NET數據集、支持IEnumerable和IEnumerable的對象。使用LINQ,可以簡單對數據源進行分組、排序、篩選。有 ...
  • SDK版本v4.0.2目前,RT-Thread Studio還不能夠自定義添加can設備。下麵介紹手動添加過程:使用RT-Thread Studio創建一個簡單工程使用RT-Thread env工具添加CAN設備保存以後,rtconfig.h配置文件會隨之修改拷貝sdk中can樣例到工程中修改stm... ...
  • 802.11幀主要有三種類型: 數據幀(data frame) 數據幀好比802.11中的馱馬,負責在工作站之間搬運數據 控制幀(control frame) 控制幀通常與數據幀搭配使用,負責區域的清空、通道的取得以及載波監聽的維護,並於收到數據時予以肯定確認,藉此提高工作站之間數據傳送的可靠性 管 ...
  • Centos 7.5 搭建FTP配置虛擬用戶 1.安裝vsftpd #vsftpd下載地址 http://mirror.centos.org/centos/7/os/x86_64/Packages/vsftpd-3.0.2-25.el7.x86_64.rpm #安裝vsftpd rpm -ivh v ...
  • 在今天的UNIX是商業化的,UNIX系統大多是與硬體配套的,也就是說,大多數UNIX系統如AIX、HP-UX等是無法安裝在 x86 伺服器和個人電腦上的,UNIX系統是一個分時系統,而UNIX是至關重要的,在它最早被開發後的時間里,FreeBSD,Linux等操作系統都或多或少有來自UNIX 的啟 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...