Нежелательные вложенные lvm-маппинги
Столкнулись тут с такой проблемой, что lvm на хост-машине подцепляет volume groups с LV-шек, на которых лежат виртуальные машины kvm.
Наша конфигурация такова, что есть железные сервера, и на них крутятся виртуальные машины kvm под гипервизором proxmox. По iSCSI подключен SAN, настроен multipath. Поверх iSCSI block device настроен lvm. Под каждую виртуальную машину proxmox нарезает logical volume на этом lvm.
Суть проблемы
Когда внутри виртуалок не используется lvm, всё хорошо. Но если он там есть, то lvm с хост-машины начинает находить "вложенные" PVs. Выглядит примерно так:
# pvs
PV VG Fmt Attr PSize PFree
/dev/mapper/mpatha vg-fast lvm2 a-- 14.80t 2.21t
/dev/mapper/mpathb vg-slow lvm2 a-- 14.00t 1.15t
/dev/sda3 pve lvm2 a-- 3.27t 199.99g
/dev/vg-fast/vm-221-disk-2 docker lvm2 a-- 128.00g 2.57g
/dev/vg-fast/vm-247-disk-2 docker lvm2 a-- 64.00g 1.29
Вот эти две нижние PV на хост-машине совершенно не нужны, это внутренняя кухня VM.
Причём, если в нескольких VM-ках есть VG с одинаковым названием, на хост-машине начинается накопление тысяч файлов в /etc/lvm/archive/
вида:
# l /etc/lvm/archive/
total 6920
drwx------ 2 root root 6684672 Oct 2 16:06 ./
-rw------- 1 root root 3072 Oct 2 16:06 docker_00095-1747040817.vg
-rw------- 1 root root 3092 Oct 2 16:06 docker_00094-2112026967.vg
-rw------- 1 root root 3092 Oct 2 16:06 docker_00093-139939991.vg
-rw------- 1 root root 3072 Oct 2 16:06 docker_00092-1873650965.vg
-rw------- 1 root root 3072 Oct 2 16:05 docker_00091-358773432.vg
-rw------- 1 root root 3092 Oct 2 16:05 docker_00090-754533553.vg
-rw------- 1 root root 3092 Oct 2 16:05 docker_00089-68775250.vg
...
Из-за этого даже могут кончиться inodes на хост-машине.
В общем, эта ситуация очень нежелательна.
Решение
В данной ситуации нам надо настроить фильтрацию нежелательных девайсов в /etc/lvm/lvm.conf, чтобы lvm не пытался сканировать LV-шки.
Для этой цели есть директива filter
, но она в данном случае не работает, потому что lvm дёргается по событию от udev и там этот фильтр переопределён в командной строке.
Нам нужна директива global_filter
, - она работает во всех случаях.
Итак, прописываем в lvm.conf нечто вроде:
global_filter = [ "r|vg-.*|", "r|dm-.*|", "a/.*/" ]
Здесь r
работает как "remove", а a
как "append". Т.е. мы фильтруем имена девайсов, которые начинаются с "vg-" и "dm-". Вам надо будет поправить "vg-" под свои названия, а "dm-" надо оставить, т.к. это все device-mapper девайсы вида /dev/dm-*
.
Смотрим pvs
:
~# pvs
PV VG Fmt Attr PSize PFree
/dev/mapper/mpatha vg-fast lvm2 a-- 14.80t 2.21t
/dev/mapper/mpathb vg-slow lvm2 a-- 14.00t 1.15t
/dev/sda3 pve lvm2 a-- 3.27t 199.99g
Всё стало хорошо, никаких вложенных lvm PVs не обнаруживается.
Нашлась в некоторой степени похожая проблема, но там несколько иная ситуация: https://serverfault.com/questions/678642/linux-device-mapper-maps-lvm-pv-nested-inside-lv-when-taking-snapshot
P.S.
Статья "на всякий случай", вдруг кто-то столкнётся и нагуглит. В 50/50 не участвует, т.к.на Голосе такой ЦА пока что практически нет.