ZFS и KVM. @home


Символика эта и так на слуху, потому нет смысла подробно объяснять, что это за зверь.


Здесь не будет сравнения с LVM, ибо сравнивать muscle-car с jet-truck'ом хоть и можно, но бессмысленно.
Графиков и комиксов так же не завезли.
Это, скажем так, незавершенная история успеха, потому что апгрейд, которым она была вызвана, можно лишь прекратить, но не завершить.


Предпосылки


Практически в каждой айтишной семье присутствует несколько ПК и/или ноутбуков, наверняка имеется перероутер-HTPC, а то и вовсе какой-нибудь NAS. Вот и у нас было два ПК, потом добавился большой настенный монитор, а при таком раскладе рождение HTPC — вопрос времени. Когда он появился на свет, тут же был наречен гордым именем — Сервер. Позже выяснилось, что чаcть любимых игр умеет в Linux — и Сервер тут же обзавелся аккаунтом Steam.

Так прошло несколько лет, в течение которых Сервер получил 16ГБ памяти, на нем появились виртуалки с gitlab и проектами...


А потом пришло понимание, что назревает апгрейд, и апгрейдить сразу 3 ПК слишком накладно; в то же время, уже был успешный опыт с PCIE-passthrough и игровой виртуалкой.


Подходящим решением стала поэтапная миграция игровых машин в виртуалки. Пока смигрирована только одна, в дальнейшем под гостем я буду подразумевать именно её.
Из трех процессоров (i3-3220, i5-3470, i5- 3470K) VT-d поддерживал только второй, он и ушел в Сервер вместо i3. Была куплена низкопрофильная 1050Ti на замену 7970, а старое железо продано по частям.


Сервер получил последнюю UEFI-прошивку, Ubuntu 16.04 и самый большой из имевшихся SSD — Crucial M4, на 256 ГБ, под корневой пул. Установка проводилась по этому манулу, из которого был накопипащен в live-системе установочный скрипт. Потом, уже после успешной загрузки, были доустановлены virt-manager, libvirt-bin, ovmf и xubuntu-desktop. Разумеется, были включены VT-x и VT-d.

Кстати, отделение бинарной части системы от логов, кешей и прочих хомяков не раз помогало в процессе вивисекции системы экспериментов, позволяя вернуть рабочее состояние простым zfs rollback, доступным даже из initrd (но есть особенность: если вы используете отдельный датасет для /root — используйте параметр ядра init=/bin/sh для аварийной загрузки; sh, в отличие от bash, не будет создавать мусор в точке монтирования /root).
Чтобы в случае проблем с загрузкой не гадать, что же случилось, в /etc/default/grub закомментируйте все, что касается HIDDEN_TIMEOUT, установите явно таймаут отличный от 0 (у меня 10), раскомментируйте/добавьте GRUB_TERMINAL=console и обязательно уберите quiet splash из GRUB_CMDLINE.


Error-43 и все-все-все



Использование ZFS



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


Что это было?
 Ну, системный диск отформатирован с размером кластера 64КБ, и Windows внушено, что на диске уже есть ее инсталляция, поэтому форматировать его с настройками по умолчанию - не нужно. Грязный хак? Ну да, так в этом же суть построения Windows-систем: заставить ее делать то, что нужно, а не то, что ей хочется.

Дедуплицировать Steam, или с чего все и начиналось


Самый простой способ был завести smb или nfs шары и создать на них библиотеки Steam. Обычные файлы легко и естественно дедуплицируются, включая как экспортированные библиотеки, так и библиотеку Linux-клиента, без лишних телодвижений. Как и всегда, самое очевидное решение оказалось в принципе рабочим, но неправильным. SMB в таком режиме шевелится со скоростью ноутбучного жесткого диска, несмотря на то, что файлы лежат на SSD. NFS (а Windows 8.1 поддерживает NFS v3, не 4) шевелился чуть шустрее, по ощущениям как какой-нибудь "зеленый" десктопный диск, но этого все равно было слишком мало для комфортной игры. К тому же, все ОС от M$ обожают терять сетевые диски, автоматически подключаемые при логоне, и каждый раз указывать Steam на местоположение библиотеки быстро надоест.

Подходящим решением стало iSCSI. На Сервер был установлен targetcli, настроен по этому манулу с поправкой на использование blockio и путем вида /dev/zvols/<zfs path>. Для правильной работы unmap нужно использовать Windows 8+ (начиная с 8 реализована поддержка unmap для iSCSI-инициатора), а для каждого блочного устройства прописать set attributes emulate_3pc=1,emulate_tpu=1,emulate_caw=1,emulate_tpws=1,emulate_tas=1. Если все сделано правильно, то и удаление файлов и форматирование должно освобождать место и сокращать размер zvol.

Теперь одинаковые файлы в экспортируемых под библиотеки томах занимают место лишь однажды, однако библиотека Steam для Linux все равно занимает отдельное место. Создадим отдельный датасет под эту библиотеку с опциями -o dedup=on -o recordsize=64K. Если разделы в zvol выровнены по границе 1МБ, и размер кластера установлен в 64КБ, то логично, что делить файлы на хосте надо с той же гранулярностью, чтобы дедупликация могла найти одинаковые блоки.


Последствия



Вместо заключения


Что ж, мой маленький эксперимент завершился несомненным успехом, хотя на пути возникли трудности. Далее хотелось бы апгрейд на Zen2, 32-64ГБ памяти, NVME SSD, перенос второго ПК на Сервер… но это уже будет совсем иное колдунство.

@khajiit
05.10.2017 21:49 UTC
Первоисточник