Как добавить виртуальное хранилище в качестве SSD в KVM

Вопрос или проблема

Будучи ранее пользователем VirtualBox, я недавно перешел на KVM (QEMU/libvirt или как это называется). Я знаю, что в VirtualBox, когда вы добавляете новое устройство хранения в виртуальную машину, есть флажок с надписью Твердотельный накопитель, если он установлен, гостевая система увидит виртуальный диск как твердотельное устройство. Это очень полезно, так как это может сообщить гостевой системе (т.е. Windows) отключить дефрагментацию. Мне интересно, возможно ли это в KVM или нет, потому что я не смог найти ничего подобного в интернете?

В QEMU на сегодняшний день нет механизма, позволяющего пометить диск SCSI, ATA или VirtioBlk как поддерживающий не вращающиеся средства хранения. Поэтому гостевая ОС не будет автоматически выполнять оптимальные настройки. В качестве обходного решения для Linux вы можете переопределить это, сбросив флаг ‘rotational’ для блочного устройства в sysfs для любых дисков, поддерживаемых SSD. Я общаюсь с людьми, чтобы узнать, возможно ли добавить эту функцию в QEMU, чтобы она работала ‘из коробки’ в будущих релизах.

Вам не нужно делать ничего с текущими версиями qemu. Если виртуальный диск является изображением QCOW2 или находится на ресурсах с тонким предоставлением, таких как SAN-накопители или разреженные объемы LVM или ZFS, то он будет правильно представлен как объем с тонким предоставлением для Windows.

Этот диск находится на изображении QCOW2 на локальной SSD-памяти.

Тонко предоставленный объем

Это приведет к тому, что Windows будет только выдавать команды TRIM и не будет пытаться дефрагментировать диск.

Нажатие “Оптимизировать” приводит к:

Оптимизация обрезает диск

Вам не нужно беспокоиться о дефрагментации в Windows, потому что, если верить некоторым источникам, дефрагментация в Windows не выключается полностью для SSD:

Если вы полностью отключите дефрагментацию, вы рискуете тем, что метаданные вашей файловой системы могут достичь максимальной фрагментации и вызвать проблемы.

Что действительно может быть важным, так это включение поддержки TRIM внутри VM. Вы можете добиться этого с помощью virtio-scsi, который поддерживает команду TRIM.

Измените конфигурацию вашей VM, чтобы установить модель контроллера на virtio-scsi:

<controller type="scsi" index='0' model="virtio-scsi">

И измените каждый диск, чтобы включить опцию unmap:

<disk type="file" device="disk">
 <driver name="qemu" type="qcow2" discard='unmap'/>

Чтобы добавить эмулированный SSD-диск в KVM/libvirt, выполните следующие шаги:

1) Просто добавьте диск в ваш гостевой объект так, как вы обычно это делаете, на шине, которую хотите использовать (например, SCSI или SATA). В моем тестовом случае я создал SATA-диск.

т.е.: После добавления диска файл xml будет выглядеть так:

<disk type="file" device="disk">
  <driver name="qemu" type="qcow2"/>
  <source file="/home/VM-images/nvme-ssd1.qcow2"/>
  <target dev='sdb' bus="scsi"/>
  <address type="drive" controller="0" bus="0" target="0" unit="1"/>
</disk>

2) Затем запустите машину/домен и определите точное имя вашего диска, запросив гостя с помощью команды virsh qemu-monitor-command:

# virsh qemu-monitor-command <domain> --hmp "info qtree" | grep sata
          dev: ide-hd, id "sata0-0-1"  <<===
            drive = "drive-sata0-0-1"
          dev: ide-cd, id "sata0-0-0"
            drive = "drive-sata0-0-0"

3) Затем добавьте команду set для установки скорости вращения, чтобы сделать его SSD (обратите внимание, что вы установили его на 1 в qemu, что устанавливает его на 0 в Linux).

# virsh edit <domain>

[...]

<qemu:commandline>
    <qemu:arg value="-set"/>
    <qemu:arg value="device.sata0-0-1.rotation_rate=1"/>
  </qemu:commandline>
</domain>

4) Замените заголовок/строку ниже в XML-файле, описывающем вашу VM (virsh edit):

domain type="kvm"

на

<domain type="kvm" xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

5) Перезапустите домен, и как только VM загрузится, проверьте устройство, используя следующие команды:

# lsblk -d -o name,rota
# smartctl -i /dev/sdXX

Последние версии QEMU (я пытался с 2.12.0) поддерживают параметр rotation_rate. Если вы установите его на 1, гость должен трактовать диск как SSD. В настоящее время libvirt не поддерживает этот параметр напрямую в своем XML-формате, поэтому вам необходимо передать его как параметр qemu:commandline.

Вот соответствующие фрагменты конфигурации libvirt, которые я использую для гостя OSX:

<domain type="kvm" xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  …
  <devices>
    <disk type="block" device="disk">
      <driver name="qemu" type="raw" cache="none" io='native' discard='unmap'/>
      <source dev='/dev/vg1/osx'/>
      <target dev='sda' bus="sata"/>
      <boot order="2"/>
      <address type="drive" controller="0" bus="0" target="0" unit="0"/>
    </disk>
    …
  </devices>
  <qemu:commandline>
    …
    <qemu:arg value="-set"/>
    <qemu:arg value="device.sata0-0-0.rotation_rate=1"/>
  </qemu:commandline>
</domain>

В дополнение к ответу saraedum, новые версии libvirt позволяют указывать скорость вращения в свойстве rotation_rate элемента target. Согласно документации, “Дополнительный атрибут rotation_rate устанавливает скорость вращения хранения для дисков на шине SCSI, IDE или SATA. Значения в диапазоне от 1025 до 65534 используются для обозначения скорости вращающихся носителей в оборотах в минуту. Значение один используется для обозначения твердотельного или иного не вращающегося хранения.” Чтобы это работало как хранение для моей гостевой VM (Windows 10), мне нужно было демонтировать устройство на хосте, затем удалить разделы в госте, затем добавить новый раздел и нажать “OK”, когда будет предложено разрешить Windows создавать специальные системные разделы.

<domain type="kvm" xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  …
  <devices>
    <disk type="block" device="disk">
      <driver name="qemu" type="raw" cache="none" io='native' discard='unmap'/>
      <source dev='/dev/vg1/osx'/>
      <target dev='sda' bus="sata" rotation_rate="1"/>
      <boot order="2"/>
      <address type="drive" controller="0" bus="0" target="0" unit="0"/>
    </disk>
  </devices>
</domain>

Ответ или решение

Как добавить виртуальное хранилище в KVM как SSD

Если вы недавно переключились с VirtualBox на KVM (QEMU/libvirt) и хотите настроить виртуальный диск таким образом, чтобы гостевая система распознавала его как твердотельный накопитель (SSD), следующий процесс поможет вам правильно выполнить эту задачу. Подход, описанный ниже, будет соответствовать требованиям для оптимизации работы системы, включая отключение или минимизацию дефрагментации в Windows.

1. Создание виртуального диска

Первое, что необходимо сделать — это создать виртуальный диск в формате QCOW2 (или другом формате, который поддерживает TRIM) на хосте, желательно на SSD:

qemu-img create -f qcow2 /path/to/your/disk.qcow2 20G

2. Подключение диска к виртуальной машине

Добавьте диск к вашей виртуальной машине через конфигурацию XML. Вы можете сделать это с помощью команды virsh edit <название_домена>, где <название_домена> — это имя вашей виртуальной машины. Пример секции для добавления диска в формате XML будет выглядеть так:

<disk type="file" device="disk">
  <driver name="qemu" type="qcow2" discard='unmap'/>
  <source file="/path/to/your/disk.qcow2"/>
  <target dev='vda' bus="virtio"/>
  <address type="drive" controller="0" bus="0" target="0" unit="0"/>
</disk>

3. Установка виртуального контроллера

Для того чтобы обеспечить поддержку TRIM, нужно использовать контроллер virtio-scsi. Вот как это можно сделать:

<controller type="scsi" index='0' model="virtio-scsi"/>

4. Включение TRIM (UNMAP) в настройках

Чтобы обеспечить поддержку TRIM в виртуальной машине Windows, убедитесь, что в конфигурации XML для диска указана опция discard='unmap', как показано выше. Это необходимо для корректного управления памятью SSD.

5. Установка параметра rotation_rate

С версии QEMU 2.12.0 у вас есть возможность установить параметр rotation_rate, который указывает, как диск воспринимается системой. Для SSD этот параметр должен быть равен 1. К сожалению, на данный момент libvirt не поддерживает это напрямую в своем XML формате, поэтому вам потребуется добавить команду в секцию <qemu:commandline>:

<qemu:commandline>
  <qemu:arg value="-set"/>
  <qemu:arg value="device.vda.rotation_rate=1"/>
</qemu:commandline>

6. Обновление конфигурации виртуальной машины

После того как вы внесли все изменения, вам нужно перезапустить вашу виртуальную машину. Это можно сделать через команды:

virsh shutdown <название_домена>
virsh start <название_домена>

7. Проверка результатов

После загрузки виртуальной машины получите информацию о дисках с помощью команд:

lsblk -d -o name,rota
smartctl -i /dev/vdX

Где /dev/vdX — это ваше устройство. Результаты должны подтвердить, что диск распознается как SSD (значение 0 для rota).

Заключение

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

При этом стоит отметить, что для достижения лучшей производительности важно также настраивать сам хост, поддерживать актуальные версии QEMU и libvirt, а также оптимально распределять ресурсы между виртуальными машинами.

Оцените материал
Добавить комментарий

Капча загружается...