2018-2-27Linux系統管理(7)LVM2
一、LVM2
LVM是Logical Volume Manager,叫做邏輯卷管理器,很顯然,它是管理邏輯卷的一個工具,版本號為2,和上一章的軟RAID的一樣,LVM也是通過以軟件的形式來組成,將多個磁盤設備抽象成為一個邏輯設備。前者RAID引用的內核模塊為md,而在這裏引用的是dm,稱之為設備映射器,該組件的作用為是將一個或多個底層模塊設備組織成一個邏輯設備的模塊。
那麽邏輯卷就是無非將多個邏輯設備組成為一個單一設備來管理的一個組件,從這個角度來說,所謂邏輯卷就是假設有一塊磁盤或者為分區,或者是RAID,基於任何一個塊設備來進行,我們可以在邏輯架構中將該磁盤創建成為一個PV,我們稱之為物理卷。這也是最底層的邏輯設備,在該設備之上我們也可以劃分出一個VG,稱之為卷組。卷組其實可以包含多個物理卷,卷組的空間大小是由物理卷來提供的,也就是說,可以增加或減少其磁盤空間,不過在VG當中是不能使用該設備的,需要在該基礎之上劃分為一個LV的邏輯卷,這是真正意義上的邏輯卷。每一個LV都是一個文件系統,可以格式化並使用。
LVM的缺點是一旦數據丟失就很修復回來,畢竟是由軟件來進行實現,並不能在硬件中真正實現,而是靠軟件來進行組織的。還需要註意的是,如果拆除一個PV的話會遇到很多問題。必須先將該PV下的數據移動到其它分區才能進行拆除。所以說縮減是很危險的,但擴展來說一般問題不大。
對於VG或對於LV來講,該設備文件是在/dev的一個獨特的目錄下,叫做mapper。
LVM:Logical Volume Manager, Verion 2 dm:device mapper,將一個或多個底層模塊設備組織成一個邏輯設備的模塊; /dev/mapper/VG_NAME-LV_NAME /dev/mapper/vol0-root (在vol0卷組上有一個root的邏輯卷) /dev/VG_NAME/LV_NAME /dev/vol0/root
二、管理工具
我們現在介紹一下創建邏輯卷的管理工具,要想使用創建並使用邏輯卷,創建該邏輯卷是由從下往上來依次執行,先創建物理卷,然後在創建卷組,在卷組之上創建邏輯卷。
# fdisk -l Disk /dev/sdb: 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 /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 /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
我在虛擬機中添加了三塊磁盤,我們先用這其中兩塊磁盤來創建物理卷,要想創建該物理卷的話,我們使用pv創建和管理工具。
pv管理工具: pvs:簡要pv信息顯示; pvdisplay:顯示pv的詳細信息; # pvcreate /dev/DEVICE 創建pv # pvremove /dev/DEVICE 刪除pv
我們先將/dev/sdb和/dev/sdc創建出來。
# pvcreate /dev/sdb /dev/sdc Physical volume "/dev/sdb" successfully created. Physical volume "/dev/sdc" successfully created.
創建完成之後,我們可以詳細查看這兩個物理卷的信息。
# pvdisplay /dev/sdb /dev/sdc "/dev/sdb" is a new physical volume of "20.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb VG Name PV Size 20.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID ryttO9-gZAc-n8LF-KHz5-BoT2-xnF9-gvoS8l "/dev/sdc" is a new physical volume of "20.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc VG Name PV Size 20.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 39FLas-V3BY-S1Qd-XvnO-UH5P-kaC0-fiiVWs
或者使用pvs命令來查看。
# pvs PV VG Fmt Attr PSize PFree /dev/sdb lvm2 --- 20.00g 20.00g /dev/sdc lvm2 --- 20.00g 20.00g
我們在上述的詳細信息格式中看的出來,Allocatable為NO,則說明並沒有加入那個VG當中。同時,也是沒有PE大小等數據。
接下來創建VG,同樣,我們也要先介紹vg的管理工具,相比之下,比pv還要多很多。
vg管理工具: vgs vgdisplay vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...] vgcreate VG_GROUPNAME /dev/PV_DEVICE vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...] vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDeviceParh...] 縮減 先做pvmore vgremove VolumeGroupName
創建vg時,我們先必須創建vg的名字,然後指明其設備路徑。現在,創建一個卷組叫做vg0,將/dev/sdb和/dev/sdc加入到該組當中。
# vgcreate vg0 /dev/sdb /dev/sdc Volume group "vg0" successfully created # vgdisplay vg0 --- Volume group --- VG Name vg0 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 39.99 GiB PE Size 4.00 MiB Total PE 10238 Alloc PE / Size 0 / 0 Free PE / Size 10238 / 39.99 GiB VG UUID xdF5Fu-nWKM-Sm6V-MRou-LAgl-PCUb-JIEqgE
# vgs VG #PV #LV #SN Attr VSize VFree vg0 2 0 0 wz--n- 39.99g 39.99g
我們可以使用-s來指定大小,前提是未曾創建邏輯卷。
如果擴展卷組的話,可以使用vgextend命令進行擴展,我們現將未曾創建物理卷的磁盤給予創建。
# pvcreate /dev/sdd Physical volume "/dev/sdd" successfully created. # vgextend vg0 /dev/sdd Volume group "vg0" successfully extended
我們查看一下vg0卷組是否擴展。
# vgdisplay vg0 --- Volume group --- VG Name vg0 System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 3 Act PV 3 VG Size <59.99 GiB PE Size 4.00 MiB Total PE 15357 Alloc PE / Size 0 / 0 Free PE / Size 15357 / <59.99 GiB VG UUID xdF5Fu-nWKM-Sm6V-MRou-LAgl-PCUb-JIEqgE
以上這就是vg的擴展,如果想在vg中將某個pv刪除的話,先將某個pv刪除,如果有大量數據存在的話,會等待很長時間,之後從vg當中進行移除該設備。
# pvmove /dev/sdb No data to move for vg0 # vgreduce vg0 /dev/sdb Removed "/dev/sdb" from volume group "vg0" # vgdisplay vg0 --- Volume group --- VG Name vg0 System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 5 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 39.99 GiB PE Size 4.00 MiB Total PE 10238 Alloc PE / Size 0 / 0 Free PE / Size 10238 / 39.99 GiB VG UUID xdF5Fu-nWKM-Sm6V-MRou-LAgl-PCUb-JIEqgE
那麽接下來說的就是關於邏輯卷的創建及管理工具。需要註意的是,創建容易,但改變大小是很有局限性的,擴展是沒問題的。而且我們創建的邏輯卷大小,也要符合卷組邊緣內的磁盤容量才行。
那麽如何創建及管理邏輯卷,命令工具介紹如下:
lv管理工具: lvs lvdisplay lvcreate -L #[mMgGtT] -n name VolumeGroup lvremove /dev/VG_NAME/LV_NAME
那麽我們現在創建一個叫做vg_lv邏輯卷,指定大小為20G,在vg0邏輯卷組中創建。
# lvcreate -L 20G -n vg_lv vg0 Logical volume "vg_lv" created.
由於只創建了單個磁盤,所以我們直接使用lvdisplay命令來顯示信息該邏輯卷的信息。
# lvdisplay --- Logical volume --- LV Path /dev/vg0/vg_lv LV Name vg_lv VG Name vg0 LV UUID yshZmA-OgJz-45EB-jOM8-rqDb-goKq-BRkNK9 LV Write Access read/write LV Creation host, time node1.china.org, 2018-02-27 19:55:21 +0800 LV Status available # open 0 LV Size 20.00 GiB Current LE 5120 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:0
我們查看一下/dev/mapper,就會發現有卷組名-邏輯名命名的邏輯卷。
# ls /dev/mapper/ control vg0-vg_lv
接下來格式化,之後進行掛載。
# mkfs.xfs /dev/vg0/vg_lv # mkdir /mnt/lv_disk # mount /dev/vg0/vg_lv /mnt/lv_disk/
三、擴展邏輯卷
擴展邏輯卷的話,我們使用的是lvextend命令,其命令格式為:
擴展邏輯卷: # lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME # resize2fs /dev/VG_NAME/LV_NAME
需要註意的是,+代表著從原來的基礎上在加一些磁盤容量,而不加就是直接擴展至磁盤容量的大小。
現在將磁盤增加至25G。
# lvextend -L 25G /dev/vg0/vg_lv Size of logical volume vg0/vg_lv changed from 20.00 GiB (5120 extents) to 25.00 GiB (6400 extents). Logical volume vg0/vg_lv successfully resized.
擴展完成之後,重新掛載之後就會發現,還是原來的20G,這是因為邏輯卷的邊緣拉大,但是文件系統的邊緣並沒有拉大,所以還是20G。所以我們將文件系統的邊緣也要隨之拉大。無須重新掛載,我們使用resize2fs,不過這只能用在ext4文件系統上。我們使用xfs_growfs命令。
# xfs_growfs /dev/vg0/vg_lv meta-data=/dev/mapper/vg0-vg_lv isize=512 agcount=4, agsize=1310720 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=5242880, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 5242880 to 6553600
四、縮減邏輯卷
縮減邏輯卷的話,需要事先縮減文件系統大小,而後才能將你的物理或者說是邏輯空間縮減至指定大小。
縮減邏輯卷: # umount /dev/VG_NAME/LV_NAME # e2fsck -f /dev/VG_NAME/LV_NAME # resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT] # lvreduce -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME # mount
那麽第一步,需要先卸載該邏輯卷,縮減必須先得卸載。縮減是不允許聯機進行,因為它出錯的風險是非常大的。
# umount /dev/mapper/vg0-vg_lv
第二步,嘗試修復。
# xfs_repair /dev/mapper/vg0-vg_lv
第三步,縮減邏輯卷。
# lvreduce -L 20G /dev/vg0/vg_lv WARNING: Reducing active logical volume to 20.00 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce vg0/vg_lv? [y/n]: y Size of logical volume vg0/vg_lv changed from 25.00 GiB (6400 extents) to 20.00 GiB (5120 extents). Logical volume vg0/vg_lv successfully resized.
由於xfs文件系統只能支持增加,好像不能支持縮減,所以這裏的實驗,只能強制重新格式化才能掛載並使用,所以縮減邏輯卷並不推薦使用。
# mkfs.xfs -f /dev/vg0/vg_lv
五、快照
快照其實對我們並不陌生,在VMWare中就有快照功能,有個快照就有個時間機器,就像哆啦A夢的時光機一樣,回到過去某一時刻當中,對於文件或文件系統做快照,就相當於將過去的某一時刻,瞬間掃描一遍,如果不能瞬間完成,則數據隨時改變該快照就沒有任何意義。這個在備份時特別有用,因為快照很快,但是備份很慢,將文件抽成絲狀,稱之為序列化的過程復制到另一個磁盤設備中。那麽快照卷其實就是指向原卷的另一個路徑而已,看起來時一個獨立的卷,但實際沒有存儲任何文件而已,但是掛載之後會發現數據都在,這其實就是指向了其原卷的數據而已,但快照容量很小,所以存儲的是對方發生變化的文件,沒有變化的仍然可以找原卷。
那麽創建快照卷的命令格式為:
快照:snapshot lvcreate -L #[mMgGtT] -p -r -s -n snapshot_lv_name original_lv_name
那麽現在我們創建一個624M的快照卷,名字為vg_lv-snap,只擁有只讀權限,邏輯卷位於/dev/vg0/vg_lv。
# lvcreate -s -L 624M -n vg_lv-snap -p r /dev/vg0/vg_lv Using default stripesize 64.00 KiB. Logical volume "vg_lv-snap" created.
我們掛載至vg_lv-snap目錄中。
# mkdir /mnt/vg_lv-snap # mount /dev/mapper/vg0-vg_lv-snap /mnt/vg_lv-snap/
之後我們進入到/mnt/lv_disk目錄中,前提是你的邏輯卷掛載好,將/etc/issue文件復制該目錄中。
# cp /etc/issue ./
復制完成之後,進入到vg_lv-snap目錄中。
# cd /mnt/vg_lv-snap/
說明它只是復制變化前的,而你復制的新文件是不會復制到快照卷當中的,復制都是快照那一刻的文件而已,假如備份完成之後,則可以進行刪除該邏輯卷。
六、刪除操作
那麽現在所有的東西都不要,刪除的話操作如下。
首先,先卸載。
# umount /dev/vg0/vg_lv
使用lvremove移除邏輯卷,如果有快照的話,就會提問你,沒有什麽意外的話,直接點擊y就可以了。
# lvremove /dev/vg0/vg_lv Do you really want to remove active origin logical volume vg0/vg_lv with 1 snapshot(s)? [y/n]: y Logical volume "vg_lv-snap" successfully removed Logical volume "vg_lv" successfully removed
之後刪除卷組vg0。
# vgremove vg0 Volume group "vg0" successfully removed
之後刪除pv。
# pvremove /dev/sdb /dev/sdd Labels on physical volume "/dev/sdb" successfully wiped. Labels on physical volume "/dev/sdd" successfully wiped.
七、文件系統掛載與使用
7.1 掛載光盤設備
首先,光盤設備的路徑在/dev下,取決於什麽樣的接口,如果為串口,則為sr0以及sr1等,為了便於識別,在/dev目錄下有符號鏈接來指向sr0,不過需要註意的是,並不是所有的發行版都有符號鏈接。所以沒有符號鏈接,則直接使用sr0就可以。
掛載光盤設備: 光盤設備文件: IDE:/dev/hdc SATA:/dev/sr0 符號鏈接文件: /dev/cdrom /dev/cdrw /dev/dvd /dev/dvdrw mount -r /dev/cdrom /media/cdrom umount /dev/cdrom
7.2 dd命令
dd命令是一個實現底層復制的工具,好處是可以連字節都可以復制,並且指定復制指定的數量,由於復制的很底層,所以比cp命令的效率還要高。其命令用法為:
用法: dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=#:block size,復制單元大小; count=#:復制多少個bs。 磁盤拷貝: dd if=/dev/sda of=/dev/sdb 備份MBR dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1 破壞MBR中的bootloader: dd if=/dev/zero of=/dev/sda bs=256 count=1 兩個特殊設備: /dev/null:數據黑洞; /dev/zero:吐零機;
2018-2-27Linux系統管理(7)LVM2