Стандартную схему работы с дисками и файловыми системами мы разобрали – создаём раздел с помощью fdisk, создаём на разделе файловую систему с помощью mkfs и монтируем файловую систему куда нужно. Но представьте себе ситуацию, когда у вас на каком-то разделе перестало хватать места. И если этот раздел крайний и после него есть свободное место – то этот раздел можно увеличить. А что если раздел не крайний, если после него есть еще разделы? Стандартные таблицы разделов в этом плане ограничены, для раздела указывается только первый и последний сектор, то есть нельзя указать, чтобы раздел начался в одном месте, в другом он закончился, а потом в третьем продолжился. В некоторых случаях это не проблема – можно создать еще один раздел, на нём поднять новую файловую систему и примонтировать куда-то. Допустим, создать директорию /home2, примонтировать туда новую файловую систему и перенести домашние директории некоторых пользователей в эту директорию. Просто нельзя несколько файловых систем монтировать в одну директорию. Точнее можно, но обходными ненадёжными путями, чего стоит избегать.
Но иногда встречается софт, которому нужно хранить все свои файлы в одной директории, допустим базу данных. И вот настаёт день, когда на разделе, где лежат данные, перестаёт хватать места. Примонтировать новую файловую систему в эту директорию не получится. Можно купить диск большего объёма и перенести на него файлы, но если там терабайты данных этот перенос займёт много времени, а сервис при этом будет недоступен. И потом получится, что на первом диске место освободилось, но мы его не можем использовать. А завтра второй диск забьётся, опять купим новый диск большего объёма, опять перенесём на него файлы, и теперь у нас и первый и второй диск не будут использоваться.
Но мы монтируем файловую систему, так? И если таблицы разделов не позволяют, можно ли на уровне файловой системы сделать так, чтобы одна файловая система могла работать на нескольких разделах и дисках? Да, действительно есть такие файловые системы – допустим, btrfs. Но это относительно молодые файловые системы, малейшая проблема в файловой системе для компаний недопустима, так как от файловой системы зависят данные, поэтому переход на новые файловые системы довольно болезненный шаг для всех. Однако, вполне может быть, что через пару лет все файловые системы будут поддерживать возможность работы на нескольких разделах и дисках.
Хорошо, тогда есть ли что-нибудь проверенное годами, что-то выше таблицы разделов, но ниже файловой системы? Да, есть такое и оно называется LVM – менеджер логических томов. Он позволяет вам объединять несколько разделов и дисков чтобы создать общее пространство. На основе этого общего пространства вы можете создавать логические разделы, на которых вы создадите файловую систему, примонтируете и всё как обычно. Схема довольно простая – ваши разделы и диски становятся физическими томами – physical volume – pv. Общее пространство, которое формирует группа физических томов называется группой томов – volume group – vg. А разделы, которые создаются внутри этой группы – логическими томами – logical volume – lv. Физический том – группа томов – логический том. Несложно, просто нужно пару раз попрактиковаться. При этом LVM позволяет добавлять разделы и диски в группу томов и увеличивать логические тома с файловыми системами без необходимости останавливать работу. Логические тома еще можно уменьшать при необходимости, но для этого надо уменьшить файловую систему, а это не всегда просто. Это далеко не весь функционал LVM, но давайте пока немного попрактикуемся.
Для начала, я восстановил снапшот виртуалбокса, чтобы /home не был на диске sdc, так как нам понадобятся 2 диска для тестов (df -h). Начнём с простого – создадим таблицу разделов на диске sdb (sudo fdisk /dev/sdb; g) и создадим два раздела на 200 и 400 мегабайт (n, enter, enter, +200M; n, enter, enter, +400M; p, w). Хотя следующий шаг можно пропустить, я этого делать не буду, чтобы было понятнее. Вспоминаем последовательность – physical volume, volume group и logical volume. Все три нам нужно создать по порядку. И так, physical volume – это pv, создать – create - pvcreate и указываем раздел или диск, который будет использоваться – sudo pvcreate /dev/sdb1. Смотрим вывод – success – значит всё окей. У нас теперь есть физический том, посмотреть его мы можем с помощью sudo pvdisplay. Как видите, тут помимо sdb1 есть еще sda2 – это потому что при установке система сама создала LVM, но мы его трогать не будем.
Physical volume у нас есть, дальше нужно создать группу томов – volume group – vgcreate. Для этого нужно дать ей имя и указать physical volume, один или несколько – sudo vgcreate myvg /dev/sdb1. Опять видим success – всё окей. Как посмотреть? Правильно, sudo vgdisplay. Опять же, у нас тут есть volume group, который создался при установке – cl_centos8 и наша группа – myvg. Отсюда же можем посмотреть информацию о ней, допустим, сколько свободного места – почти 200 мегабайт. Тут еще есть PE – physical extents. Это блоки, которыми оперирует LVM. Как видите, они у нас по 4 мебибайта и их у нас в сумме 49.
Последний шаг – logical volume – lvcreate. Тут у нас опций чуть больше – нужно указать в каком volume group мы хотим создать наш логический том, указать имя для logical volume и указать размер – sudo lvcreate myvg -n (это name – имя) mylv -L (это размер) 200M (sudo lvcreate myvg -n mylv -L 200M). Как видите, у нас 200 не получается, потому что 1 блок ушел на метаданные для LVM. Мы можем указать 196, или поступить по другому – выдать свободное место по процентам. Допустим, выдать всё свободное место, либо 80 процентов - для этого ключ -l маленький ( sudo lvcreate myvg -n mylv -l 80%FREE). Кстати, важное замечание – если открыть man по любой из предыдущих команд lvm, допустим man lvcreate и спуститься в самый низ, то там есть примеры использования. И если вы вдруг забудете какой-то ключ, то эти примеры помогут вам вспомнить. А сейчас, давайте посмотрим, что у нас получилось – sudo lvdisplay.
И так, тут у нас появился путь - /dev/myvg/mylv. Именно сюда мы поставим файловую систему с помощью mkfs (sudo mkfs.ext4 /dev/myvg/mylv). Сам же этот файл (ll /dev/myvg/mylv) является символической ссылкой на /dev/dm-2 (ll /dev/dm-*), который, как и sda, генерируется при обнаружении устройств. А значит, если говорить про fstab, /dev/dm-2 там указывать нельзя. Можно указать UUID (sudo lsblk -f ) или /dev/myvg/mylv ( ll /dev/myvg/mylv). Но при определённых условиях, о которых вы можете почитать по ссылке в описании (https://xan.manning.io/2017/05/29/best-practice-for-mounting...), оба варианта могут создавать проблемы. Поэтому лучший способ – способ, который предлагает сам RedHat – уже указан в fstab (cat /etc/fstab) - /dev/mapper. Если посмотреть (ll /dev/mapper), можно увидеть, что как и /dev/myvg/mylv, тут символические ссылки. Но в целях совместимости рекомендую использовать вариант именно с /dev/mapper, потому что на старых системах с другими вариантами могут быть проблемы (sudo nano /etc/fstab, /dev/mapper/myvg-mylv /mydata ext4 noatime 0 0, sudo mkdir /mydata). Примонтируем и убедимся, что всё работает (sudo mount -a, df -h).
Предположим, у нас перестало хватать места и мы решили взять еще один диск – sdc. Так, у нас есть volume group, состоящий из одного physical volume – раздела sdb1. Но теперь я хочу полностью отдать весь диск sdc volume группе myvg. Первый шаг – создаю physical volume (sudo pvcreate /dev/sdc). Но вместо привычного success я тут вижу excluded by a filter. LVM заботливо отказывается использовать весь диск, так как там уже есть таблица разделов. Чтобы избавиться от неё, я использую утилиту wipefs с ключом а (sudo wipefs -a /dev/sdc). И теперь всё у меня создаётся как надо (sudo pvcreate /dev/sdc). Теперь мне нужно расширить volume группу и добавить в неё новый диск. Расширить это extend, а значит пишем sudo vgextend myvg /dev/sdc. Видим success и смотрим sudo vgdisplay. Теперь в myvg 2 physical volume, 304 блока и гигабайт свободного места. Но это пока что группа, нужно еще увеличить logical volume и файловую систему.