Как вынести каталог на отдельный LVM-том

от автора

Бывает задача: «каталог лежит в корне, надо чтобы он был отдельно, гигов на пять». Вот как это делается .

Зачем вообще

В типовой разметке корень у нас 2 ГБ. Если каталог живёт внутри него и растёт — он отъедает место у системы, и в один прекрасный день / забивается под ноль. Отдельный том эту связь разрывает: каталог пухнет сколько хочет в своих границах, корню всё равно. Плюс размер потом меняется одной командой.

Процедура универсальная — в примере /srv, но с тем же успехом это /var/lib, /opt или что угодно ещё.

Понадобится: root на хосте, доступ к vSphere, минут 20 вместе с перезагрузкой.

Сначала посмотреть, что там вообще

bash

findmnt -T /srv     # покажет, на каком томе каталог сейчасdu -sh /srv         # сколько данных переноситьlsblkvgs                 # есть ли свободное место в группе

Если findmnt показал lv_root — да, каталог в корне, работаем. Признак тот же в lsblk: точки /srv в списке смонтированного просто нет.

Смотрим VFree в vgs. Если места хватает — сразу к созданию тома. Обычно не хватает, тогда расширяем диск.

Расширяем диск

Добавляем в vSphere нужный объём к sda (мы добавляли 5 ГБ), потом говорим системе перечитать размер:

bash

echo 1 > /sys/block/sda/device/rescanlsblk /dev/sda

Стал 65G вместо 60G — отлично. Не стал — значит либо в vSphere изменения не применились, либо рескан не прошёл, и дальше идти смысла нет.

Нарезаем новый раздел

Тянуть существующий sda2 под живой системой не хочется, поэтому просто делаем новый раздел в свободном хвосте:

bash

fdisk /dev/sda

Внутри по порядку: np3 → Enter → Enter → t38ep (глянуть, что получилось) → w.

Код 8e — это Linux LVM для таблицы dos. Если в шапке fdisk написано gpt, код будет 31.

Красное предупреждение про «repartitioning is probably a bad idea» пугает только первый раз — оно вылезает всегда, когда на диске есть смонтированные ФС. Существующие разделы мы не трогаем, всё нормально.

Дальше подцепляем:

bash

partx -a --nr 3 /dev/sdalsblk /dev/sda          # sda3 должен появитьсяpvcreate /dev/sda3vgextend vg_sys /dev/sda3vgs                     # VFree подрос

Создаём том

ФС берём такую же, как на остальных томах — проверить можно через findmnt -no FSTYPE /. У меня везде ext4.

bash

lvcreate -L 5G -n lv_srv vg_sysmkfs.ext4 -L srv /dev/vg_sys/lv_srv

Переносим данные

Сначала убедиться, что в каталог никто не пишет прямо сейчас. Если там данные работающего сервиса — остановить его, иначе копия получится неконсистентной.

bash

ls -la /srvlsof +D /srv 2>/dev/nullmkdir -p /mnt/srv_newmount /dev/vg_sys/lv_srv /mnt/srv_newrsync -aAXH --numeric-ids /srv/ /mnt/srv_new/du -sh /srv /mnt/srv_new/    # цифры должны совпастьumount /mnt/srv_new

Флаги не для красоты: -A тянет ACL, -X — расширенные атрибуты вместе с метками SELinux, -H — жёсткие ссылки, --numeric-ids не даёт перепутать UID при разных базах пользователей.

Подменяем каталог

bash

mv /srv /srv.oldmkdir /srvecho '/dev/mapper/vg_sys-lv_srv  /srv  ext4  defaults  0 2' >> /etc/fstabsystemctl daemon-reloadmount -afindmnt -T /srv    # теперь должен быть vg_sys-lv_srvdf -h /srv

Если на хосте SELinux в enforcing — добавьте restorecon -Rv /srv.

Обязательно перезагрузиться

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

bash

reboot# после стартаfindmnt -T /srv

Показывает lv_srv — всё, задача закрыта.

Убираем за собой

Старый каталог — это наш откат, поэтому удаляем его только когда всё точно работает и сервисы проверены:

bash

ls -la /srv /srv.old    # сверить, что содержимое совпадаетrm -rf /srv.olddf -h /                 # корень разгрузился

Если что-то пошло не так

Пока /srv.old на месте, откат занимает полминуты:

bash

umount /srvrmdir /srvmv /srv.old /srvsed -i '/vg_sys-lv_srv/d' /etc/fstab

ссылка на оригинал статьи https://habr.com/ru/articles/1067494/