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

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

1、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

2、管理工具

  咱們如今介紹一下建立邏輯卷的管理工具,要想使用建立並使用邏輯卷,建立該邏輯卷是由從下往上來依次執行,先建立物理卷,而後在建立卷組,在卷組之上建立邏輯卷。
  要想建立邏輯分區並管理,咱們須要添加磁盤或者直接劃分分區也能夠。
app

# 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建立和管理工具。ide

   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.

  建立完成以後,咱們能夠詳細查看這兩個物理卷的信息。spa

# 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命令來查看。orm

# 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加入到該組當中。ip

# 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命令進行擴展,咱們現將不曾建立物理卷的磁盤給予建立。
ci

# 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/

3、擴展邏輯卷

  擴展邏輯卷的話,咱們使用的是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

4、縮減邏輯卷

  縮減邏輯卷的話,須要事先縮減文件系統大小,然後才能將你的物理或者說是邏輯空間縮減至指定大小。

   縮減邏輯卷:
     # 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

5、快照

  快照其實對咱們並不陌生,在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/

  說明它只是複製變化前的,而你複製的新文件是不會複製到快照卷當中的,複製都是快照那一刻的文件而已,假如備份完成以後,則能夠進行刪除該邏輯卷。

6、刪除操做

  那麼如今全部的東西都不要,刪除的話操做以下。
  首先,先卸載。

# 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、文件系統掛載與使用

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:吐零機;
相關文章
相關標籤/搜索