Заявка в АРК Технолоджис
(812)974.06.35
О компании archive.arctech.ru

Linux, libvirt: создаем "сырые" тома ZFS под kvm-виртуалки

Linux, libvirt: создаем "сырые" тома ZFS под kvm-виртуалки

У вас есть физический сервер под хост, где развернут ZFS пул. Вы решили использовать этот пул под хранение образов ВМ, помимо прочего. 

Решение задачи выше необходимо начать с создания пула libvirt. Сотворить libvirt пул, привязанный к ZFS  можно только из консоли (на данный момент: virt-manager version <=1.4.2). Положим, что имя ZFS пула: zfs. Cоздаем скрипт, с именем, например, virsh_zfs_pool.sh, и следующим содержимым:

#! /bin/sh

VMPOOL=kvm

ZPOOL=zfs 

virsh pool-define-as --name z_${VMPOOL} --source-name ${ZPOOL} --type zfs

virsh pool-start z_${VMPOOL}

virsh pool-autostart z_${VMPOOL}

Набираем 

sh virsh_zfs_pool.sh

и видим новоиспеченный пул libvirt, который называется z_kvm:

# virsh pool-list

 Name                 State      Autostart 

-------------------------------------------

 default              active     yes       

 z_kvm                active     yes    

Этот пул будет виден также и в virt-manager.

Создать том в этом пуле можно разными способами. В случае ZFS - опять только консольными.

С помощью virsh:

# virsh vol-create-as z_kvm vm-server 8G

Том будет виден в virt-manager, libvirt:

# virsh vol-list z_kvm

 Name                 Path                                    

------------------------------------------------------------------------------

 vm-server            /dev/zvol/zfs/vm-server      

и в zfs:

# zfs list | grep vm-server

zfs/vm-server                                                                                     8.25G  1.72T     8K  

Обратите внимание на размер блока при этом: 8к. Отличный размер для postgres-sql!
Однако Windows виртуалки на "сыром" томе ZFS при таком размере блока могут показывать далеко не лучшую производительность. В  Интернете есть множество свидетельств об этом.  
Задавшись вопросом - "как изменить размер блока у созданного тома ZFS" - вы получите четкий и однозначный ответ: никак!
Более того, далее вы обнаружите, что virsh не позволяет указать размер блока при создании тома в пуле libvirt на базе ZFS.
Выход, как вы понимаете, прост: создаем том средствами ZFS. 
zfs destroy zfs/vm-server
zfs create -o compression=lz4 -o volblocksize=64k -V 8G zfs/vm-server
Созданный том будет виден libvirt без каких-либо дополнительных усилий: вы же уже привязали ZFS-pool (=zfs) к пулу libvirt (=z_kvm).
# virsh vol-list z_kvm
 Name                 Path                                    
------------------------------------------------------------------------------
 vm-server            /dev/zvol/zfs/vm-server 
Обратите внимание: virsh вам заботливо показал - где именно в /dev искать новый том.
Если том создавался для виртуальной Windows, то, не отрываясь от консоли, форматируем его в NTFS. С размером кластера 64k (не отказывать же себе в пустяках ;)):
mkntfs -c 65536 -f -L 'ntfs64k' /dev/zvol/zfs/vm-server 
Чтобы залить информацию монтируем:
ntfs-3g /dev/zvol/zfs/vm-server /mnt
Однако, если том планируется использовать для Windows в качестве системного  (то бишь "C:") диска, то этот метод вам не подойдет :(.
За решением следуйте  сюда.

Вернуться в список статей