天天看點

CentOS6、7 LVM邏輯卷分區自動擴容Shell腳本程式設計思路與執行個體

應用場景和已知存在的問題:

适用于centos6或centos7(可能适用于centos4或5等早些版本)

根檔案系統(被擴充的檔案系統)采用lvm進行管理,例如mount指令輸出“/dev/mapper/vg_$hostname-lv_root on / type ext4 (rw)”中含有“mapper”關鍵詞

自動擴容根檔案系統,如果想擴充其他檔案系統,例如有的業務應用資料目錄不在根分區中,則需要修改shell腳本代碼中的vg_path_to_extend變量(約78行)。

僅支援ext2、ext3、ext4、xfs等分區格式的檔案系統

可能不支援某些過多自定義的centos系統,但核心步驟相似

腳本中僅添加了scsi磁盤支援,如需要管理其他磁盤,則需要自己擴充腳本

為了簡化腳本,避免執行多次(本程式沒有寫執行鎖),先前已經存在的磁盤名已經設定為sda,見shell腳本代碼中第45行的online_scsi_disk_present變量

考慮點:

由于centos6和centos7在預設根檔案系統的檔案系統格式存在差異,需要判斷是否為xfs,如果是xfs則應該使用xfs_growfs而不是一味的使用resize2fs。

使用resize2fs擴充ext2、ext3、ext4格式的檔案系統,使用xfs_growfs擴充xfs格式的檔案系統

同一腳本在同一系統多次被執行可能引發的錯誤,可以考慮使用檔案鎖來解決這個問題

程式設計思路:

(之前應該準備或檢查shell腳本運作環境)擷取目前使用中的塊裝置檔案名

擷取新添加scsi磁盤的檔案名

擷取lvm卷組名(vg)、将被擴充的卷組名的檔案路徑

将新添加磁盤使用fdisk建立分區并格式化為lvm格式

建立實體卷,pvcreate

擴充卷組,vgextend

調節邏輯卷大小,lvresize

判斷是否是xfs檔案系統

同步檔案系統,使得擴容生效

傳回系統磁盤使用情況

shell代碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

<code>#!/bin/bash</code>

<code># usage: automatic expand lv with lvm managed disk</code>

<code>#  setp 1: add hard disk or storage to computing unit</code>

<code>#   setp 2: execute this script with root privilege</code>

<code>#   setp 3: mind info of this script execution result</code>

<code># open the refrigerator door, get the shell script execution environment ready</code>

<code># put the elephant into the refrigerator, how the shell scripts works</code>

<code># close the refrigerator door, check out the result of execution</code>

<code># simetimes, we have to pull new elephant or elephant dung out here, unset variables of shell script</code>

<code>function</code> <code>check_execution_result(){</code>

<code>        </code><code>if</code> <code>[[ ! -z $retval ]]; </code><code>then</code>

<code>                </code><code>unset</code> <code>retval</code>

<code>        </code><code>fi</code>

<code>        </code><code>retval=$?</code>

<code>        </code><code>if</code> <code>[[ $retval -</code><code>ne</code> <code>0 ]]; </code><code>then</code>

<code>                </code><code>echo</code> <code>execution failed! </code>

<code>                </code><code>exit</code> <code>$retval</code>

<code>        </code><code>else</code>

<code>                </code><code>echo</code> <code>execution successfully! </code>

<code>        </code><code>unset</code> <code>retval</code>

<code>}</code>

<code># lsblk --scsi</code>

<code># lsblk --all</code>

<code># name            maj:min rm  size ro type mountpoint</code>

<code># fd0               2:0    1    4k  0 disk </code>

<code># sda               8:0    0   40g  0 disk </code>

<code># ├─sda1            8:1    0  500m  0 part /boot</code>

<code># └─sda2            8:2    0 39.5g  0 part </code>

<code>#   ├─centos-swap 253:0    0  3.9g  0 lvm  [swap]</code>

<code>#   └─centos-root 253:1    0 35.6g  0 lvm  /</code>

<code># sdb               8:16   0   16g  0 disk </code>

<code># sr0              11:0    1  6.6g  0 rom  </code>

<code># show present scsi disk online</code>

<code># q: why use "xargs" here?</code>

<code># a: convert the text from multi-line single-column into single-line multi-column, for sed operation</code>

<code>online_scsi_disk_present=$(lsblk --all | </code><code>grep</code> <code>disk | </code><code>grep</code> <code>-</code><code>v</code> <code>fd | </code><code>awk</code> <code>'{print $1}'</code> <code>| </code><code>xargs</code><code>)</code>

<code># todo</code>

<code># for execution this script beyond twice</code>

<code>online_scsi_disk_present=sda</code>

<code># find new scsi disk online</code>

<code># todo figure it out why there is host0? </code>

<code>echo</code> <code>"- - -"</code> <code>&gt;</code><code>/sys/class/scsi_host/host0/scan</code>

<code>echo</code> <code>"- - -"</code> <code>&gt;</code><code>/sys/class/scsi_host/host1/scan</code>

<code>echo</code> <code>"- - -"</code> <code>&gt;</code><code>/sys/class/scsi_host/host2/scan</code>

<code># show new added scsi disk online</code>

<code>online_scsi_disk_newadd=$(lsblk --all | </code><code>grep</code> <code>disk | </code><code>grep</code> <code>-</code><code>v</code> <code>fd | </code><code>awk</code> <code>'{print $1}'</code> <code>| </code><code>xargs</code> <code>echo</code> <code>| </code><code>sed</code> <code>"s/$online_scsi_disk_present//g"</code><code>)</code>

<code># construct disk file with full path</code>

<code>echo</code> <code>new added scsi disk: $online_scsi_disk_newadd</code>

<code># get vg name</code>

<code>vg_name=$(vgdisplay | </code><code>grep</code> <code>'vg name'</code> <code>| </code><code>awk</code> <code>'{print $nf}'</code><code>)</code>

<code>vg_path_to_extend=$(lvdisplay | </code><code>grep</code> <code>'lv path'</code> <code>| </code><code>awk</code> <code>'{print $nf}'</code> <code>| </code><code>grep</code> <code>root)</code>

<code>for</code> <code>block </code><code>in</code> <code>$online_scsi_disk_newadd; </code><code>do</code>

<code>    </code><code>online_scsi_disk_newadd_filename=</code><code>"/dev/"</code><code>$block</code>

<code>    </code><code># end-of-file contents and eof mark must start row1</code>

<code>    </code><code>fdisk</code> <code>$online_scsi_disk_newadd_filename &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1&lt;&lt;eof</code>

<code>n</code>

<code>p</code>

<code>1</code>

<code>t</code>

<code>8e</code>

<code>w</code>

<code>eof</code>

<code>    </code><code>check_execution_result</code>

<code>    </code><code>lvm_operation_disk_filename=$online_scsi_disk_newadd_filename</code><code>"1"</code>

<code>    </code><code>pvcreate $lvm_operation_disk_filename &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>    </code><code>vgextend $vg_name $lvm_operation_disk_filename &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>    </code><code>lvresize -l +100%free $vg_path_to_extend &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code># resize2fs - ext2/ext3/ext4 file system resizer</code>

<code># xfs_growfs, xfs_info - expand an xfs filesystem</code>

<code>#[root@hlc7172009 ~]# resize2fs /dev/mapper/centos-root</code>

<code>#resize2fs 1.42.9 (28-dec-2013)</code>

<code>#resize2fs: bad magic number in super-block while trying to open /dev/mapper/centos-root</code>

<code>#couldn't find valid filesystem superblock.</code>

<code>#[root@hlc7172009 ~]#</code>

<code>#[root@hlc7172009 ~]# xfs_growfs $vg_path_to_extend</code>

<code>#meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=2334208 blks</code>

<code>#         =                       sectsz=512   attr=2, projid32bit=1</code>

<code>#         =                       crc=0</code>

<code>#data     =                       bsize=4096   blocks=9336832, imaxpct=25</code>

<code>#         =                       sunit=0      swidth=0 blks</code>

<code>#naming   =version 2              bsize=4096   ascii-ci=0 ftype=0</code>

<code>#log      =internal               bsize=4096   blocks=4559, version=2</code>

<code>#         =                       sectsz=512   sunit=0 blks, lazy-count=1</code>

<code>#realtime =none                   extsz=4096   blocks=0, rtextents=0</code>

<code>#data blocks changed from 9336832 to 13530112</code>

<code>    </code><code># check xfs_info if is installed </code>

<code>    </code><code>which</code> <code>xfs_info &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>    </code><code>if</code> <code>[[ $? -</code><code>ne</code> <code>0 ]]; </code><code>then</code>

<code>        </code><code>yum </code><code>install</code> <code>xfsprogs -y &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>    </code><code>fi</code>

<code>    </code><code># end check xfs_info if is installed</code>

<code>    </code><code># check vg_path_to_extend if is xfs filesystem</code>

<code>    </code><code>xfs_info $vg_path_to_extend &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>        </code><code># is not xfs</code>

<code>        </code><code>vg_path_to_extend_is_not_xfs=0</code>

<code>    </code><code>else</code> 

<code>        </code><code># is xfs</code>

<code>        </code><code>vg_path_to_extend_is_not_xfs=1</code>

<code>    </code><code># end check vg_path_to_extend if is xfs filesystem</code>

<code>    </code><code># todo centos7 default filesystem is xfs, so we can check it out by os if is centos7</code>

<code>    </code><code>if</code> <code>[[ $vg_path_to_extend_is_not_xfs ]]; </code><code>then</code>

<code>        </code><code>xfs_growfs $vg_path_to_extend &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>    </code><code>else</code>

<code>        </code><code>resize2fs $vg_path_to_extend &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>    </code><code>df</code> <code>-h</code>

<code>    </code><code>lsblk --all</code>

<code>done</code>

測試結果:

(1)添加磁盤前:

CentOS6、7 LVM邏輯卷分區自動擴容Shell腳本程式設計思路與執行個體

(2)添加磁盤并執行腳本後:

CentOS6、7 LVM邏輯卷分區自動擴容Shell腳本程式設計思路與執行個體

由此可見根分區已經由原先的36gb變為52gb,表示lvm擴容成功。

--end--

繼續閱讀