Ранее, будучи пользователем VirtualBox, я недавно перешел на KVM (QEMU / libvirt или как там он называется). Я знаю, что в VirtualBox, когда вы добавляете новое устройство хранения к виртуальной машине, появляется флажок с надписью Твердотельный накопитель, если этот флажок установлен, гостевая система будет видеть виртуальный диск как твердотельное устройство. Это очень полезно, так как может сообщить гостевой системе (например, Windows) об отключении дефрагментации. Интересно, возможно ли это в KVM, потому что я не мог найти ничего похожего в Интернете?
Сегодня в QEMU нет механизма, позволяющего пометить SCSI, ATA или VirtioBlk диск как поддерживаемый невращающимся хранилищем. Таким образом, гостевая ОС не может делать оптимальные настройки из коробки. В качестве обходного пути для Linux вы можете отменить это, сняв флаг вращения для блочного устройства в sysfs для любых дисков, поддерживаемых SSD. Я разговариваю с людьми, чтобы узнать, можно ли добавить эту функцию в QEMU, чтобы она «просто работала» в будущих выпусках.
Вам не нужно заботиться о дефрагментации в windows, потому что если верить некоторым источники дефрагментация в Windows на SSD дисках не отключается полностью:
Если вы полностью отключите дефрагментацию, вы рискуете, что метаданные вашей файловой системы могут достичь максимальной фрагментации и потенциально могут вызвать проблемы.
Что действительно может быть важно, так это включение поддержки TRIM внутри виртуальной машины. Вы можете добиться этого с помощью virtio-scsi
которые поддерживают команду TRIM.
Измените конфигурацию виртуальной машины, чтобы настроить модель контроллера на virtio-scsi
:
<controller type='scsi' index='0' model='virtio-scsi'>
И замените каждый диск, чтобы включить unmap
вариант:
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' discard='unmap'/>
С текущими версиями qemu вам вообще ничего не нужно делать. Если виртуальный диск является образом QCOW2 или находится на носителе с тонкой подготовкой, таком как хранилище SAN, или на разреженном томе LVM или ZFS, то он будет соответствующим образом представлен в Windows как том с тонкой подготовкой.
Этот диск находится в образе диска QCOW2 на локальном SSD-накопителе.
Это заставит Windows только выполнять команды TRIM и не пытаться дефрагментировать диск.
Нажатие кнопки "Оптимизировать" приводит к:
Чтобы добавить эмулированный 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-файле, описывающем вашу виртуальную машину (virsh edit):
domain type='kvm'
к
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
5) Перезагрузите домен и после загрузки виртуальной машины проверьте устройство, используя следующие команды:
# 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>