Глава 13. Гибкое управление хранилищем при помощи LVM

При помощи Logical Volume Manager (LVM, Диспетчера логических томов) управление локальным хранилищем может быть выполнено более гибким образом, нежели в Главе 12, Управление локальным хранилищем и файловыми системами. LVM позволяет вам назначать более одного диска одному и тому же тому (который эквивалентен в LVM разделу), обладать реплицируемыми по различным дискам данными и выполнять моментальные снимки некого тома.

В данной главе мы выполним обзор основ применения LVM и самых основных объектов, которые используются для управления хранилищем. Мы изучим как готовить диски под применение с помощью LVM, а затем собирать их в некий пул, тем самым не только увеличивая имеющиеся доступным пространство, но также позволяя применять его согласованно. Также мы изучим как распределять такое агрегированное дисковое пространство в подобные разделам фрагменты, которые запросто можно расширять по мере необходимости. Для этого мы пройдёмся по следующим вопросам:

  • Основы LVM

  • Создание, перемещение и удаление физических томов

  • Комбинирование физических томов в группы томов

  • Создание и расширение логических томов

  • Добавление новых дисков в некую группу томов и расширение логического тома

  • Удаление логических томов, групп томоы и физических томов

  • Обзор команд LVM

Технические требования

Для этой главы мы добавим в свою машину, с которой мы работаем, два дополнительных диска, чтобы иметь возможность следовать упоминаемым в данной главе примерам. Вот ваши варианты:

  • Когда вы пользуетесь физической машиной, вы можете добавить пару накопителей USB

  • Когда вы пользуетесь локальной виртуальной машиной, вам потребуется добавить два новых виртуальных накопителя

  • Если вы применяете экземпляр облачного решения, вы можете добавить в него два новых блочных устройства

В качестве примера, давайте рассмотрим как эти диски добавляются в нашу виртуальную машину в Linux. Прежде всего, мы выключаем свою виртуальную машину, которую мы установили в Главе 1, Установка RHEL8. Затем мы открываем соответствующую страницу характеристик этой виртуальной машины. Там мы обнаруживаем кнопку Add Hardware:

 

Рисунок 13-1


Изменение свойств виртуальной машины

[Совет]Совет

В зависимости от применяемой вами платформы виртуализации, существуют различные пути для достижения характеристик вашей виртуальной машины. Тем не менее, наиболее распространено, когда имеется некий вариант непосредственного доступа из самого меню виртуальной машины.

Кликнув по Add Hardware вы откроете необходимый диалог из показанного ниже снимка экрана. В нём мы выберем вариант Storage и определим значение размера своего подлежащего созданию виртуального диска и подключим его к своей виртуальной машине, в данном случае 1 GiB, а затем кликнем по Finish:

 

Рисунок 13-2


Добавление диска к виртуальной машине

Для добавления двух дисков мы повторим этот процесс дважды. Конечный результат будет выглядеть как- то так:

 

Рисунок 13-3


Два добавленных к виртуальной машине новых диска, составляющих итого три

Теперь мы включим свою виртуальную машину и зарегистрируемся в ней чтобы убедиться в доступности новых устройств:


[root@rhel8 ~]# lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda           252:0    0  10G  0 disk
├─vda1        252:1    0   1G  0 part /boot
└─vda2        252:2    0   9G  0 part
  ├─rhel-root 253:0    0   8G  0 lvm  /
  └─rhel-swap 253:1    0   1G  0 lvm  [SWAP]
vdb           252:16   0   1G  0 disk
vdc           252:32   0   1G  0 disk
		

Мы можем видеть, что наши новые диски по 1 GiB, vdb и vdc, доступны. Теперь, когда у нас имеется системный диск, в котором мы установили операционную систему RHEL 8 и два дополнительных диска для работы с ними, мы готовы к продолжению этой главы.

[Совет]Совет

Именование имеющихся в Linux дисковых устройств зависит от применяемого ими драйвера. Подключаемые к SATA или SCSI устройства показываются как sd с буквой, например, sda иkb sdb. Подключаемые к шинам IDE устройства применяют hd и букву, например, hda или hdb. Подобные приводимом в данном примере устройства используют паравиртуализированный драйвер VirtIO и применяют vd с буквой, к примеру, vda или vdb.

Основы LVM

LVM для управления в нашей системе устройствами хранения пользуется тремя уровнями. Эти уровни таковы:

  • Physical Volumes (PV, Физические тома): Самый первый уровень LVM. Назначается непосредственно блочным устройствам. Физический том может быть либо неким разделом на диске, или целиком самим сырым диском.

  • Volume Groups (VG, Группы томов): Второй уровень LVM. Он группирует имеющиеся физические тома в некое собирательное пространство. Это некий промежуточный уровень и он не очень заметен, но его роль очень важна.

  • Logical Volumes (LV, Логические тома): Это третий уровень LVM. Он распределяет имеющееся пространство, которое собирают Группы томов.

Давайте рассмотрим тот пример, который мы желаем реализовать при помощи двух вновь добавленных дисков:

 

Рисунок 13-4


Пример использования LVM двух дисков

Давайте поясним этот пример схемы чтобы разобраться с нашими тремя уровнями:

  • У нас имеются два диска, которые на диаграмме обозначены как Disk1 и Disk2

  • Disk1 разбит на два раздела, Part1 и Part2.

  • Disk2 не подвергался разбиению на разделы.

  • Имеются три физических тома. Основное их предназначение состоит в подготовке имеющегося дискового пространства для применения в LVM. Вот наши физические тома:

    • PV1, созданный в разделе Part1 на Disk1

    • PV2, созданный в разделе Part2 на Disk1

    • PV3, созданный непосредственно на Disk2

  • Одна единственная Группа томов, VG1, агрегирует все три физических тома, PV1, PV2 и PV3. Теперь всё это дисковое пространство консолидировано и запросто может распределяться.

  • Для распределения имеющегося пространства существует четыре логических тома - LV1, LV2, LV3 и LV4. Обратите, пожалуйста, внимание на то, что эти логические тома не используют весь диск целиком. Таким образом, если потребуется расширить некий том или создать моментальный снимок, это будет возможным.

Именно это выступает основой описания того как распределяются имеющиеся уровни, причём не погружаясь в сложные варианты, такие как зеркалирование, динамичное выделение или моментальный снимок.

В качестве отлитого в граните правила нам требуется понимать, что PV (Физические тома) проектируются для подготовки устройств к их применению LVM, VG (Группы томов) для агрегации PV, а LV (Логические тома) для распределения агрегированного пространства.

Интересно отметить тот факт, что если мы создали Группу томов (VG), мы можем добавить в неё некий дополнительный диск, тем самым увеличивая её размер, причём без необходимости останова или перезапуска самой машины. Точно так же мы способны распределять добавленное пространство по имеющимся Логическим томам (LV), которым оно необходимо, причём без необходимости останова или перезапуска их машины. Именно это одна из основных причин почему LVM настолько мощен и рекомендуется для всех серверов, всего лишь с несколькими исключениями.

Теперь, кода мы знакомы с теми уровнями, на которые подразделяется LVM, давайте приступим к их применению чтобы начать разбираться с тем как они работают.

Создание, перемещение и удаление физических томов

Получив сою машину готовой с двумя новыми дисками, vdb и vdc, как это пояснялось в в нашем разделе Технические требования, мы можем приступить в своей машине к реализации того примера схемы, который показан на Рисунке 13-4.

Самый первый шаг напрямую не относится к LVM, однако он всё ещё важен для продолжения этого примера. Этот первый шаг вовлекает в себя разбиение на разделы нашего диска vdb. Давайте рассмотрим это при помощи инструмента для управления разделов, parted:


[root@rhel8 ~]# parted /dev/vdb print
Error: /dev/vdb: unrecognised disk label
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
		
[Предостережение]Предостережение

Ваше дисковое устройство, когда вы пользуетесь физической машиной или иным драйвером диска, может быть другим. Например, если бы мы мы пользовались дисками SATA, оно было бы /dev/sdb вместо /dev/vdb.

Этот диск совсем не разбит на разделы, что мы можем обнаружить по сообщению unrecognised disk label. Как пояснялось в Главе 12, Управление локальным хранилищем и файловыми системами, существует два типа меток дисков, которые мы можем применять; msdos (также носящих название MBR), старого типа, который могут применять для запуска машины с Basic Input Output System (BIOS) и gpt, нового типа, который могут использовать для запуска машины с Unifed Extensible Firmware Interface (UEFI). В случае сомнений, пользуйтесь gpt, чего мы придерживаемся в данном примере. Для создания при помощи parted новой метки применяется вариант mklabel:


[root@rhel8 ~]# parted /dev/vdb mklabel gpt
Information: You may need to update /etc/fstab.

[root@rhel8 ~]# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start  End  Size  File system  Name  Flags
		
[Совет]Совет

Для создания метки msdos, соответствующей командой была бы parted /dev/vdb mklabel msdos.

Теперь у нас имеется диск с меткой gpt, однако без разделов. Давайте создадим некий раздел, воспользовавшись параметром mkpart в интерактивном режиме:


[root@rhel8 ~]# parted /dev/vdb mkpart
		

Теперь мы можем ввести название этого раздела, mypart0:


Partition name?   []? mypart0
		

В качестве своего следующего шага определим свою файловую систему, мы воспользуемся ext2:


File system type?   [ext2]? ext2
		

Теперь самое время установить значение начальной точки. Мы воспользуемся самым первым доступным сектором, а именно 2048s:


Start? 2048s
		
[Совет]Совет

Самый первый сектор в современных дисках это, по определению, 2048s. Это значение не предоставляется данным инструментом. Мы можем, в случае сомнений, просмотреть иные имеющиеся диски, выполнив parted /dev/vda unit s print.

И затем мы приступаем к своему заключительному шагу, установке значения конечной точки, которую мы можем описать через значение размера того раздела, который мы хотели бы создать:


End? 200MB
		

Данная команда завершается со следующим предупреждением:


Information: You may need to update /etc/fstab.
		

Чтобы гарантировать что имеющаяся таблица разделов обновлена в вашей системе и для того чтобы позволить вашим устройствам вырабатываться под /dev, мы можем исполнить такую команду:


[root@rhel8 ~]# udevadm settle
		
[Совет]Совет

Вся команда целиком для запуска не в интерактивном режиме это parted /dev/vdb mkpart mypart0 xfs 2048s 200MB.

Мы можем наблюдать доступным свой новый раздел:


[root@rhel8 ~]# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number  Start   End    Size   File system  Name     Flags
1      1049kB  200MB  199MB               mypart0
		

Чтобы сделать этот раздел доступным для размещения Физических томов LVM, нам требуется изменить её. Команда parted для изменения значения типа раздела пользуется параметром set. Нам требуется определить значение числа своих разделов, то есть 1, а затем тип lvm и on для активации:


root@rhel8 ~]# parted /dev/vdb set 1 lvm on
Information: You may need to update /etc/fstab.

[root@rhel8 ~]# udevadm settle
[root@rhel8 ~]# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size   File system  Name     Flags
1      1049kB  200MB  199MB               mypart0  lvm
		

Теперь мы видим, что значение флага для нашего раздела установлено равным lvm.

Давайте добавим второй раздел, mypart1:


[root@rhel8 ~]# parted /dev/vdb mkpart mypart1 xfs \
200MB 100%
Information: You may need to update /etc/fstab.

[root@rhel8 ~]# parted /dev/vdb set 2 lvm on
Information: You may need to update /etc/fstab.

[root@rhel8 ~]# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size   File system  Name     Flags
1      1049kB  200MB   199MB               mypart0  lvm
2      200MB   1073MB  872MB               mypart1  lvm
		

Теперь, когда мы создали два раздела, /dev/vdb1 (с именем mypart0) и /dev/vdb2 (с именем mypart1), вот как выглядит наше хранилище:

 

Рисунок 13-5


Созданные в наших двух новых дисках разделы

[Совет]Совет

Имеется и другой инструмент, который поставляется по умолчанию в RHEL 8 для управления разделами, которым является fdisk. Вы можете пожелать испробовать его чтобы убедиться не будет ли проще пользоваться им.

Теперь настало время создавать постоянные тома. Мы будем делать их только во вновь созданных разделах. Прежде всего, мы проверим имеющиеся доступными постоянные тома при помощи команды pvs:


[root@rhel8 ~]# pvs
  PV         VG   Fmt  Attr PSize  PFree
  /dev/vda2  rhel lvm2 a--  <9,00g    0
		

Теперь мы продолжим создавать необходимые постоянные тома при помощи pvcreate:


[root@rhel8 ~]# pvcreate /dev/vdb1
  Physical volume "/dev/vdb1" successfully created.
[root@rhel8 ~]# pvcreate /dev/vdb2
  Physical volume "/dev/vdb2" successfully created.
		

И мы снова проверим при помощи pvs что они были созданы верно:


[root@rhel8 ~]# pvs
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/vda2  rhel lvm2 a--   <9,00g      0
  /dev/vdb1       lvm2 ---  190,00m 190,00m
  /dev/vdb2       lvm2 ---  832,00m 832,00m
		

Обратите внимание на то, что постоянные тома не обладают своими собственными именами, а вместо этого лишь именем того раздела (или устройства) , в котором они созданы. Мы можем ссылаться на их как на PV1 и PV2 для отображения на своей схеме.

Вот как выглядит их состояние:

 

Рисунок 13-6


Созданные в наших двух новых разделах постоянные тома

Мы также можем создать некий постоянный том непосредственно в самом дисковом устройстве, vdc. Давайте сделаем это:


[root@rhel8 ~]# pvcreate /dev/vdc
  Physical volume "/dev/vdc" successfully created.
[root@rhel8 ~]# pvs
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/vda2  rhel lvm2 a--   <9,00g      0
  /dev/vdb1       lvm2 ---  190,00m 190,00m
  /dev/vdb2       lvm2 ---  832,00m 832,00m
  /dev/vdc        lvm2 ---    1,00g   1,00g
		

Как и в нашем предыдущем примере, для созданного физического тома нет названия, причём мы будем ссылаться на него как на PV3. Вот как выглядит полученный результат:

 

Рисунок 13-7


Созданные в наших двух новых разделах и в нашем новом дисковом устройстве постоянные тома

Теперь, когда у нас имеются необходимые постоянные тома, давайте сгруппируем их в своём следующем разделе при помощи виртуальных групп.

Комбинирование физических томов в группы томов

Пришло время создать новую Группу томов (VG) с добавленными ранее нашими физическими томами. Прежде чем сделать это, мы можем проверить имеющиеся доступными Группы томов при помощи команды vgs:


[root@rhel8 ~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  rhel   1   2   0 wz--n- <9,00g    0
		

Мы можем наблюдать доступной лишь ту Группу томов, которая была создана при установке под нашу операционную систему. Давайте создадим свою Группу томов storage воспользовавшись разделами /dev/vdb1 и /dev/vdb2 при помощи команды vgcreate:


[root@rhel8 ~]# vgcreate storage /dev/vdb1 /dev/vdb2
  Volume group "storage" successfully created
[root@rhel8 ~]# vgs
  VG      #PV #LV #SN Attr   VSize    VFree   
  rhel      1   2   0 wz--n-   <9,00g       0
  storage   2   0   0 wz--n- 1016,00m 1016,00m
		

Как вы можете видеть, наша новая Группа томов storage была создана. Схема текущего состояния выглядела бы следующим образом:

 

Рисунок 13-8


Первая Группа томов, созданная с двумя физическими томами

[Предостережение]Предостережение

Группы томов (VG) это очень тонкий уровень в LVM, чья единственная цель состоит в агрегировании дисков или разделов в некий пул хранения. Всё продвинутое управление таким хранилищем, например, такое как наличие зеркалирования на двух различных дисках, выполняется при помощи логических томов.

Мы уже подготовили имеющиеся разделы и диски в качестве Физических томов и собрали их в Группы томов, поэтому у нас имеется некий пул дискового пространства. Давайте двинемся далее и в своём следующем разделе изучим как при помощи логических томов может быть выполнено необходимое распределение такого дискового пространства.

Создание и расширение логических томов

В настоящий момент у нас имеется несколько созданных физических томов и два из них сгруппированы в Группу томов. Давайте переместимся на следующие уровни и проверим эти логические тома при помощи команды lvs.


[root@rhel8 ~]# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rhel -wi-ao---- <8,00g
  swap rhel -wi-ao----  1,00g 
		

Мы видим тома root и swap в Группе томов rhel, которая размещает саму операционную систему.

Теперь мы можем создать простой логический том с названием data, с размером 200 МБ, в Группе томов storage:


[root@rhel8 ~]# lvcreate --name data --size 200MB storage
  Logical volume "data" created.
[root@rhel8 ~]# lvs
  LV   VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rhel    -wi-ao----  <8,00g                         
  swap rhel    -wi-ao----   1,00g                                  
  data storage -wi-a----- 200,00m
		

Наша конфигурация теперь выглядит так:

 

Рисунок 13-9


Первый Логический том, созданный с применением пространства из Группы томов

Этот созданный логический том является блочным устройством и ведёт себя аналогично дисковому разделу. Таким образом, чтобы его применять, нам потребуется отформатировать его некой файловой системой. Давайте выполним это отформатировав его в формате xfs:


[root@rhel8 ~]# mkfs.xfs /dev/storage/data
meta-data=/dev/storage/data      isize=512 agcount=4, agsize=12800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1 finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096 blocks=51200,imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096  blocks=1368, version=2
         =                       sectsz=512 sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.
		

Теперь он готов к монтированию. Мы можем создать каталог /srv/data и смонтировать его тут:


[root@rhel8 ~]# mkdir /srv/data
[root@rhel8 ~]# mount -t xfs /dev/storage/data /srv/data
[root@rhel8 ~]# df -h /srv/data/
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/storage-data  195M   12M  184M   6% /srv/data
		

Мы установили своё включаемое в LVM пространство доступным в своей операционной системе. Монтирование файловой системы вручную, как в нашем предыдущем примере, работает пока эта система не будет выключена или перезапущена. Чтобы превратить её в постоянную, нам потребуется добавить в /etc/fstab следующую строку:


/dev/storage/data   /srv/data    xfs    defaults        0 0
		

Для проверки того, что эта строка записана верно, мы можем выполнить следующие команды. Прежде всего выполним демонтирование этой файловой системы:


[root@rhel8 ~]# umount /srv/data
		

Проверим размер доступного пространства в этой точке монтирования:


[root@rhel8 ~]# df -h /srv/data/
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root  8,0G  2,8G  5,3G  35% /
		

Получаемый вывод этой команды df (disk free) показывает, что размер пространства в нашем каталоге /srv/data/ относится к разделу root, что подразумевает, что данная папка не обладает никакой связанной с ней файловой системой. Давайте теперь выполним команду mount при запуске своей системы:


[root@rhel8 ~]# mount –a
		

Все находящиеся в /etc/fstab, которые не смонтированы, будут смонтированы, или же будет отображена некая ошибка, если имеется некая проблема при их монтировании (например, опечатка в /etc/fstab). Давайте проверим что она смонтирована:


[root@rhel8 ~]# df -h /srv/data/
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/storage-data  195M   12M  184M   6% /srv/data
		
[Предостережение]Предостережение

Устройства /dev/storage/data и /dev/mapper/storage-data это синонимы (или символические ссылки, чтобы быть более точным) того же самого устройства, вырабатываемые компонентом с названием device mapper (устройством установки соответствия). Они совершенно равноценны.

Как мы можем видеть, наша файловая система смонтирована как положено. Теперь, когда нам понятно как создавать Логический том и назначать некую файловую систему и монтировать её в точке, мы можем перейти к более продвинутым задачам, таким как расширение дискового пространства в своих уровнях LVM и за его пределами.

Добавление новых дисков в группу томов и расширение логического тома

Одним из великолепных моментов в LVM, а более конкретно, Групп томов, это то, что мы можем добавлять в неё новый диск и начинать применять такое вновь расширенное пространство. Давайте попробуем это, добавляя имеющийся физический том из /dev/vdc в свою группу томов storage:


[root@rhel8 ~]# vgs
  VG      #PV #LV #SN Attr   VSize    VFree  
  rhel      1   2   0 wz--n-   <9,00g      0
  storage   2   1   0 wz--n- 1016,00m 816,00m
[root@rhel8 ~]# vgextend storage /dev/vdc 
Volume group "storage" successfully extended
[root@rhel8 ~]# vgs
  VG      #PV #LV #SN Attr   VSize  VFree
  rhel      1   2   0 wz--n- <9,00g    0
  storage   3   1   0 wz--n- <1,99g 1,79g
		

Теперь наше распределение дисков выглядит так:

 

Рисунок 13-10


Расширенная Группа томов с тремя Физическими томами

Теперь давайте расширим свой Логический том data, добавив в него 200 МБ:


[root@rhel8 ~]# lvs
  LV   VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rhel    -wi-ao----  <8,00g
  swap rhel    -wi-ao----   1,00g
  data storage -wi-ao---- 200,00m
[root@rhel8 ~]# lvextend --size +200MB /dev/storage/data
  Size of logical volume storage/data changed from 200,00 MiB (50 extents) to 400,00 MiB (100 extents).
  Logical volume storage/data successfully resized.
[root@rhel8 ~]# lvs
  LV   VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rhel    -wi-ao----  <8,00g
  swap rhel    -wi-ao----   1,00g
  data storage -wi-ao---- 400,00m
		

наш логический том был расширен. Однако имеющаяся поверх него файловая система не расширена:


[root@rhel8 ~]# df -h /srv/data/
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/storage-data  195M   12M  184M   6% /srv/data
		

Нам необходимо расширить свою файловую систему. Применяемый для этого инструмент зависит от типа файловой системы. В нашем случае это xfs, а инструмент для её расширения это xfs_growfs. Давайте сделаем это:


[root@rhel8 ~]# xfs_growfs /dev/storage/data
meta-data=/dev/mapper/storage-data isize=512    agcount=4, agsize=12800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1 finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096 blocks=51200 imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1368 version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 51200 to 102400
[root@rhel8 ~]# df -h /srv/data/
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/storage-data  395M   14M  382M   4% /srv/data
		

И вот, теперь, наша файловая система имеет доступным некоторое добавленной дополнительное пространство.

[Предостережение]Предостережение

При выполнении этой задачи наш Логический том может быть смонтирован и использоваться своей системой. LVM готова выполнять расширения томов в промышленных системах в рабочем состоянии.

Достаточно просто перераспределять имеющееся пространство и добавлять другой Логический том:


[root@rhel8 ~]# lvcreate --size 100MB --name img storage
  Logical volume "img" created.
[root@rhel8 ~]# lvs
  LV   VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root rhel    -wi-ao----  <8,00g                     
  swap rhel    -wi-ao----   1,00g                        
  data storage -wi-ao---- 400,00m                          
  img  storage -wi-a----- 100,00m                          
[root@rhel8 ~]# mkfs.xfs /dev/storage/img
meta-data=/dev/storage/img       isize=512    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1 finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096 blocks=25600 imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096  blocks=1368, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.
[root@rhel8 ~]# mkdir /srv/img
[root@rhel8 ~]# mount -t xfs /dev/storage/img /srv/img
[root@rhel8 ~]# df /srv/img/
Filesystem              1K-blocks  Used Available Use% Mounted on
/dev/mapper/storage-img     96928  6068     90860   7% /srv/img
[root@rhel8 ~]# df -h /srv/img/
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/storage-img   95M  6,0M   89M   7% /srv/img
		

Параметры --size и --extents для используемой команды lvcreate обладают некоторыми опциями, которые могут применяться для определения подлежащего потреблению размера пространства:

  • Human-readable: Мы можем определять значение размера в считываемых человеком блоках, таких как Гигабайты, применяя GB или мегабайты, при помощи MB (иными словами, --size 3GB).

  • Extents: Если мы просто предоставляем некое число после --extents, наша команда воспользуется своей внутренней мерой, extents, что аналогично размеру блока для дисковых разделов (то есть, --extents 125).

Параметры --size и --extents также применимы и к команде lvextend. В этом случае, мы можем применять для определения значения нового размера Логического тома те параметры, которые были показаны ранее для lvcreate. У нас также имеются и иные опции для определения приращений пространства для назначения им:

  • Добавление пространства: Если мы предоставим символ + перед соответствующим числом для lvextend, это увеличит значение размера в предоставляемом измерении (то есть, --size +1GB добавляет один дополнительный Гигабайт к текущему Логическому тому).

  • Процентное соотношение свободного пространства: Мы можем предоставлять значение процентного соотношения свободного пространства подлежащим созданию или расширению применяя --extents, и значение процентного соотношения свободного пространства для использования с последующим %FREE (то есть, --extents 10%FREE).

[Совет]Совет

Как мы это уже наблюдали в иных инструментах, мы можем применять имеющиеся страницы руководства чтобы напоминать себе все имеющиеся доступными параметры. Чтобы ознакомиться с соответствующими страницами, воспользуйтесь, пожалуйста, man lvcreate и man lvextend.

Мы собираемся создать некий Логический том для его применения в качестве swap (области подкачки), который является частью диска, которую ваша система применяет в качестве пространства парковки для оперативной памяти. Ваша система помещает туда процессы, которые потребляют память и которые не активны с тем, чтобы освобождать имеющуюся физическую память (которая намного быстрее чем диск). Она также применяется когда в вашей системе больше нет свободной физической оперативной памяти.

Давайте создадим в LVM устройство подкачки:


[root@rhel8 ~]# lvcreate --size 100MB --name swap storage
  Logical volume "swap" created.
[root@rhel8 ~]# mkswap /dev/storage/swap
Setting up swapspace version 1, size = 100 MiB (104853504 bytes)
no label, UUID=70d07e58-7e8d-4802-8d20-38d774ae6c22
		

При помощи команды free мы можем проверить размер памяти и состояние устройства подкачки:


[root@rhel8 ~]# free
              total        used        free      shared   buff/cache   available
Mem:        1346424      218816      811372        9140       316236      974844
Swap:       1048572           0     1048572
[root@rhel8 ~]# swapon /dev/storage/swap
[root@rhel8 ~]# free
              total        used        free      shared   buff/cache   available
Mem:        1346424      219056      811040        9140       316328      974572
Swap:       1150968           0     1150968
		
[Предостережение]Предостережение

Эти два новых изменения потребуют добавления некой строки для каждого из них в /etc/fstab чтобы сделать их применение постоянным при перезапусках.

Наше распределение дискового пространства будет теперь выглядеть так:

 

Рисунок 13-11


Расширенная Группа томов с тремя Физическими томами

Это распределение выглядит во многом как наш первоначальный пример, который мы применяли для описания уровней LVM. Теперь мы попрактиковались со всеми имеющимися уровнями для создания необходимых в каждом из них фрагментов. Мы знаем как создавать, а потому настало время разобраться в нашем следующем разделе как удалять их.

Удаление логических томов, групп томов и физических томов

Чтобы приступить к командам, применяемым для удаления, давайте проделаем простой этап удаления имеющегося Логического тома img. Прежде всего нам необходимо убедиться смонтирован ли он:


[root@rhel8 ~]# mount | grep img
/dev/mapper/storage-img on /srv/img type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
		

Поскольку он смонтирован, нам требуется демонтировать его:


[root@rhel8 ~]# umount /srv/img
[root@rhel8 ~]# mount | grep img
		

Самая последняя команда отображает пустой вывод, что означает что он не смонтирован. Давайте продолжим удалять его:


[root@rhel8 ~]# lvremove /dev/storage/img
Do you really want to remove active logical volume storage/img? [y/n]: y
  Logical volume "img" successfully removed
		

Теперь мы также можем удалить саму точку монтирования:


[root@rhel8 ~]# rmdir /srv/img
		

И наше удаление Логического тома выполнено. Это процесс не восстановим, поэтому осуществляйте его аккуратно. Наше распределение дисков выглядит следующим образом:

 

Рисунок 13-12


Группа томов с удалённым Логическим томом

Теперь пришло время для более сложной задачи, удаления Физического тома из Виртуальной группы. Основная причина для выполнения этого состоит в том, что порой вы хотите передать все хранящиеся на неком физическом диске данные на другой диск, а затем отсоединить его и удалить из системы. Это можно сделать, но сначала, давайте добавим некоторые файлы в свой Логический том data:


[root@rhel8 ~]# cp -ar /usr/share/scap-security-guide \
/srv/data/
[root@rhel8 ~]# ls /srv/data/
scap-security-guide
[root@rhel8 ~]# du -sh /srv/data/
30M  /srv/data/
		

Давайте теперь эвакуируем имеющиеся данные из /dev/vdb1 при помощи команды pvmove:


[root@rhel8 ~]# pvmove /dev/vdb1
  /dev/vdb1: Moved: 7,75%
  /dev/vdb1: Moved: 77,52%
  /dev/vdb1: Moved: 100,00%
		
[Предостережение]Предостережение

В зависимости от имеющегося выделения соответствующих экстентов вы можете получить сообщение, начинающееся с no data to move for storage. Это означает, что все сохранённые данные уже были выделены на прочих дисках. Вы можете воспользоваться pvmove для других устройств чтобы испытать это.

Теперь нет никаких хранимых в /dev/vdb1 данных и он может быть удалён из своей Группы томов. Мы можем осуществить это при помощи команды vgreduce:


[root@rhel8 ~]# vgreduce storage /dev/vdb1
  Removed "/dev/vdb1" from volume group "storage"
		

Мы можем обнаружить что теперь в Группе томов нашего хранилища меньше пространства:


root@rhel8 ~]# vgs
  VG      #PV #LV #SN Attr   VSize  VFree
  rhel      1   2   0 wz--n- <9,00g    0
  storage   2   2   0 wz--n-  1,80g 1,30g
[root@rhel8 ~]# vgdisplay storage
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  20
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1,80 GiB
  PE Size               4,00 MiB
  Total PE              462
  Alloc PE / Size       129 / 516,00 MiB
  Free  PE / Size       333 / 1,30 GiB
  VG UUID               1B6Nil-rvcM-emsU-mBLu-wdjL-mDlw-66dCQU
		

Мы также можем обнаружить, что наш Физический том, /dev/vdb1, не подключён ни к какой Группе томов:


[root@rhel8 ~]# pvs
  PV         VG      Fmt  Attr PSize    PFree   
  /dev/vda2  rhel    lvm2 a--    <9,00g       0
  /dev/vdb1          lvm2 ---   190,00m  190,00m
  /dev/vdb2  storage lvm2 a--   828,00m  312,00m
  /dev/vdc   storage lvm2 a--  1020,00m 1020,00m
[root@rhel8 ~]# pvdisplay /dev/vdb1
  "/dev/vdb1" is a new physical volume of "190,00 MiB"
  --- NEW Physical volume ---
  PV Name               /dev/vdb1
  VG Name               
  PV Size               190,00 MiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               veOsec-WV0n-JP9D-WMz8-UYeZ-Zjs6-sJSJst
		
[Совет]Совет

Команды vgdisplay, pvdisplay и lvdisplay отображают подробные сведения в каждой из частей LVM.

Самый важный момент состоит в том, что мы можем осуществлять эти действия пока наша система уверенно выполняет промышленные рабочие нагрузки. Распределение наших дисков теперь выглядит так:

 

Рисунок 13-13


Группа томов с удалёнными Физическими томами

Теперь настало время удалить саму Группу томов, однако нам прежде нужно удалить имеющиеся Логические тома, точно так же как мы это сделали ранее (не смущайтесь выполнять lvs и vgs до и после каждой команды для проверки хода действий):


[root@rhel8 ~]# swapoff /dev/storage/swap
[root@rhel8 ~]# lvremove /dev/storage/swap
Do you really want to remove active logical volume storage/swap? [y/n]: y
  Logical volume "swap" successfully removed
		

При помощи этого мы удалили /dev/storage/swap. Давайте теперь удалим /dev/storage/data, воспользовавшись параметром --yes с тем, чтобы не получали запрос на подтверждение (особенно важно при применении этой команды в неком сценарии)


[root@rhel8 ~]# umount /dev/storage/data
[root@rhel8 ~]# lvremove --yes /dev/storage/data
  Logical volume "data" successfully removed
		

Теперь пришла пора удалить Группу томов storage:


[root@rhel8 ~]# vgremove storage
		

Группа томов storage была успешно удалена.

И, наконец, очищаем свои физические тома:


[root@rhel8 ~]# pvremove /dev/vdb1 /dev/vdb2
  Labels on physical volume "/dev/vdb1" successfully wiped.
  Labels on physical volume "/dev/vdb2" successfully wiped.
		

И, выполнив это, мы знаем как работать с каждой из частей LVM в наших системах RHEL8. Давайте сделаем в своём следующем разделе обзор всех применяемых команд.

Просмотр команд LVM

В качестве итоговой таблицы команд, применяемых для управления Физическими томами давайте взглянем на приводимую ниже таблицу:

Таблица 13-1. Команды управления Физическими томами
Команда Применение

pvcreate

Создаёт Физический том в разделе или диске (также именуемым блочным устройством)

pvs

Показывает базовые сведения о Физических томах в вашей системе

pvdisplay

Отображает расширенные сведения о Физических томах в вашей системе

pvmove

Эвакуирует данные с Физического тома, перемещая их на прочие доступные физические тома

pvremove

Удаляет Физические тома

Теперь давайте рассмотрим команды, применяемые для управления Группами томов:

Таблица 13-2. Команды управления Группами томов
Команда Применение

vgcreate

Создаёт Группу томов, сочетающую различные Физические тома

vgs

Показывает базовые сведения о Группах томов в вашей системе

vgdisplay

Отображает расширенные сведения о Группах томов в вашей системе

vgextend

Расширяет некую имеющуюся Группу томов, добавляя в неё новые Физические тома

vgreduce

Удаляет эвакуированные Физические тома из Группы томов

vgremove

Удаляет Группу томов

И наконец, давайте рассмотрим те команды, которые применяются для управления Логическими томами

Таблица 13-2. Команды управления Логическими томами
Команда Применение

lvcreate

Создаёт Логический том в Группе томов, подготавливая его к форматированию файловой системой

lvs

Показывает базовые сведения о Логических томах в вашей системе

lvdisplay

Отображает расширенные сведения о Логических томах в вашей системе

lvextend

Расширяет некий имеющийся Логический том, добавляя в него дополнительное пространство из Группы томов

lvremove

Удаляет Логический том

Помните, что для получения дополнительных сведений по параметрам, которые вы бы хотели применять и узнать о новых, вы всегда можете воспользоваться страницами руководств, доступными для каждой из команд просто исполнив man <command>.

[Предостережение]Предостережение

Веб интерфейс администрирования Cockpit имеет некое расширение для управления командами хранилища. Он может быть установлен от имени root (или sudo) при помощи следующей команды, dnf install cockpit-storaged. Хороши упражнением будет повтор всего выполненного в этой главе при помощи интерфейса хранения в Cockpit. {Прим. пер.: подробнее о Cockpit в нашем переводе Главы 7, Обзор веб интерфейса Cockpit CentOS 8 из книги Всего сущего CentOS 8 Нэйла Смита.}

Заключение

LVM чрезвычайно полезная часть Red Hat Enterprise Linux и он предоставляет мощные возможности для управления, повторного выделения, распространения и назначения дискового пространства без необходимости останавливать что бы то ни было в вашей системе. Проверенный годами в сражениях, он выступает ключевым компонентом для системных администраторов, а также в качестве средства облегчения включения прочих расширенных возможностей в ваши системы (удобный способ для предоставления хранилищ под совместное применение через iSCSI).

Практика LVM с тестовыми машинами чрезвычайно важна, поскольку мы сможем быть уверенными что соответствующая команды сработает в промышленной системе не будет означать что соответствующая служба подлежит останову или что данные будут утрачены.

В этой главе мы рассмотрели самые простые, но важные, задачи, которые могут выполняться LVM. Мы изучили как работают различные уровни LVM: Физические тома, Группы томов и Логические тома. Кроме того, мы видели как они взаимодействуют друг с другом и как ими можно управлять. Мы попрактиковались с созданием, расширением и удалением Логических томов, Групп томов и Физических томов. Будет важным практиковаться с ними чтобы закрепить полученные навыки и уметь применять их в производственных системах. Однако основа для этого уже имеется.

Теперь давайте перейдём к своей следующей главе чтобы открыть для себя новую функциональную возможность в RHEL8 для последующего улучшения имеющегося уровня хранения за счёт добавления к нему возможностей дедупликации - Virtual Data Optimizer (VDO, Оптимизатора виртуальных данных).