在这一章当中我们开始讲述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:吐零机;