Выбрать главу

  Physical volume "/dev/sdc3" successfully created

  Physical volume "/dev/sdd" successfully created

  Physical volume "/dev/sdf1" successfully created

  Physical volume "/dev/sdf2" successfully created

pvdisplay -C

  PV         VG   Fmt  Attr PSize PFree

  /dev/sdb2       lvm2 a-   4.00g 4.00g

  /dev/sdc3       lvm2 a-   3.09g 3.09g

  /dev/sdd        lvm2 a-   4.00g 4.00g

  /dev/sdf1       lvm2 a-   4.10g 4.10g

  /dev/sdf2       lvm2 a-   5.22g 5.22g

So far, so good; note that a PV can be set up on a full disk as well as on individual partitions of it. As shown above, the pvdisplay command lists the existing PVs, with two possible output formats.

Now let's assemble these physical elements into VGs using vgcreate. We'll gather only PVs from the fast disks into a vg_critical VG; the other VG, vg_normal, will also include slower elements.

vgdisplay

vgcreate vg_critical /dev/sdb2 /dev/sdf1

  Volume group "vg_critical" successfully created

vgdisplay

  --- Volume group ---

  VG Name               vg_critical

  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               8.14 GB

  PE Size               4.00 MB

  Total PE              2084

  Alloc PE / Size       0 / 0

  Free  PE / Size       2084 / 8.14 GB

  VG UUID               6eG6BW-MmJE-KB0J-dsB2-52iL-N6eD-1paeo8

vgcreate vg_normal /dev/sdc3 /dev/sdd /dev/sdf2

  Volume group "vg_normal" successfully created

vgdisplay -C

  VG          #PV #LV #SN Attr   VSize  VFree

  vg_critical   2   0   0 wz--n-  8.14g  8.14g

  vg_normal     3   0   0 wz--n- 12.30g 12.30g

Here again, commands are rather straightforward (and vgdisplay proposes two output formats). Note that it's quite possible to use two partitions of the same physical disk into two different VGs. Note also that we used a vg_ prefix to name our VGs, but it's nothing more than a convention.

We now have two “virtual disks”, sized about 8 GB and 12 GB, respectively. Let's now carve them up into “virtual partitions” (LVs). This involves the lvcreate command, and a slightly more complex syntax:

lvdisplay

lvcreate -n lv_files -L 5G vg_critical

  Logical volume "lv_files" created

lvdisplay

  --- Logical volume ---

  LV Name                /dev/vg_critical/lv_files

  VG Name                vg_critical

  LV UUID                4QLhl3-2cON-jRgQ-X4eT-93J4-6Ox9-GyRx3M

  LV Write Access        read/write

  LV Status              available

  # open                 0

  LV Size                5.00 GB

  Current LE             1280

  Segments               2

  Allocation             inherit

  Read ahead sectors     auto

  - currently set to     256

  Block device           253:0

lvcreate -n lv_base -L 1G vg_critical

  Logical volume "lv_base" created

lvcreate -n lv_backups -L 12G vg_normal

  Logical volume "lv_backups" created

lvdisplay -C

  LV         VG          Attr   LSize  Origin Snap%  Move Log Copy%  Convert

  lv_base    vg_critical -wi-a-  1.00G

  lv_files   vg_critical -wi-a-  5.00G

  lv_backups vg_normal   -wi-a- 12.00G

Two parameters are required when creating logical volumes; they must be passed to the lvcreate as options. The name of the LV to be created is specified with the -n option, and its size is generally given using the -L option. We also need to tell the command what VG to operate on, of course, hence the last parameter on the command line.

GOING FURTHER lvcreate options

The lvcreate command has several options to allow tweaking how the LV is created.

Let's first describe the -l option, with which the LV's size can be given as a number of blocks (as opposed to the “human” units we used above). These blocks (called PEs, physical extents, in LVM terms) are contiguous units of storage space in PVs, and they can't be split across LVs. When one wants to define storage space for an LV with some precision, for instance to use the full available space, the -l option will probably be preferred over -L.

It's also possible to hint at the physical location of an LV, so that its extents are stored on a particular PV (while staying within the ones assigned to the VG, of course). Since we know that sdb is faster than sdf, we may want to store the lv_base there if we want to give an advantage to the database server compared to the file server. The command line becomes: lvcreate -n lv_base -L 1G vg_critical /dev/sdb2. Note that this command can fail if the PV doesn't have enough free extents. In our example, we would probably have to create lv_base before lv_files to avoid this situation – or free up some space on sdb2 with the pvmove command.

Logical volumes, once created, end up as block device files in /dev/mapper/:

ls -l /dev/mapper

total 0

crw-rw---- 1 root root  10, 59  5 oct.  17:40 control

lrwxrwxrwx 1 root root       7  5 oct.  18:14 vg_critical-lv_base -> ../dm-1

lrwxrwxrwx 1 root root       7  5 oct.  18:14 vg_critical-lv_files -> ../dm-0

lrwxrwxrwx 1 root root       7  5 oct.  18:14 vg_normal-lv_backups -> ../dm-2

ls -l /dev/dm-*

brw-rw---- 1 root disk 253,  0  5 oct.  18:14 /dev/dm-0

brw-rw---- 1 root disk 253,  1  5 oct.  18:14 /dev/dm-1