1. 程式人生 > >2018-2-27Linux系統管理(7)LVM2

2018-2-27Linux系統管理(7)LVM2

Linux 系統管理

在這一章當中我們開始講述LVM2的基礎使用,在前一章當中我們描述了RAID磁盤的基礎概念,主要實現的是軟RAID,介紹其RAID級別,以及如何創建RAID、管理RAID、刪除RAID等操作。

一、LVM2

LVM是Logical Volume Manager,叫做邏輯卷管理器,很顯然,它是管理邏輯卷的一個工具,版本號為2,和上一章的軟RAID的一樣,LVM也是通過以軟件的形式來組成,將多個磁盤設備抽象成為一個邏輯設備。前者RAID引用的內核模塊為md,而在這裏引用的是dm,稱之為設備映射器,該組件的作用為是將一個或多個底層模塊設備組織成一個邏輯設備的模塊。
那麽邏輯卷就是無非將多個邏輯設備組成為一個單一設備來管理的一個組件,從這個角度來說,所謂邏輯卷就是假設有一塊磁盤或者為分區,或者是RAID,基於任何一個塊設備來進行,我們可以在邏輯架構中將該磁盤創建成為一個PV,我們稱之為物理卷。這也是最底層的邏輯設備,在該設備之上我們也可以劃分出一個VG,稱之為卷組。卷組其實可以包含多個物理卷,卷組的空間大小是由物理卷來提供的,也就是說,可以增加或減少其磁盤空間,不過在VG當中是不能使用該設備的,需要在該基礎之上劃分為一個LV的邏輯卷,這是真正意義上的邏輯卷。每一個LV都是一個文件系統,可以格式化並使用。

LV是根據VG的容量大小可以來進行劃分,也可以動態增加該分區容量的邊界。我們將多個塊設備組成VG的話,VG將在邏輯層次上將每一個塊設備所提供的空間劃分成為固定大小的塊,我們稱之為PE,PV的大小取決於VG的定義,因此PE是在PV加入到某個VG當中所決定的。LV也可以根據PE的大小來進行劃分容量,也可動態擴展與收縮,在這個過程中並不損壞其數據。所以這對企業存儲未知的數據來說,是一個非常好的選擇。
LVM的缺點是一旦數據丟失就很修復回來,畢竟是由軟件來進行實現,並不能在硬件中真正實現,而是靠軟件來進行組織的。還需要註意的是,如果拆除一個PV的話會遇到很多問題。必須先將該PV下的數據移動到其它分區才能進行拆除。所以說縮減是很危險的,但擴展來說一般問題不大。
一旦PE被分配給某個LV使用的話,那麽PE就屬於該LV分區,這時候PE就稱之為LE。
對於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