Показаны сообщения с ярлыком kvm/qemu. Показать все сообщения
Показаны сообщения с ярлыком kvm/qemu. Показать все сообщения

суббота, 1 марта 2014 г.

Подготовка образа дискеты с virtio драйвером для установки Windows Server 2003

Использование Windows Server 2003 на выделенном сервере сегодня имеет крайне мало смысла. Но старый солдат еще послужит, если перенести систему в виртуальную машину. В качестве системы виртуализации используется гипервизор KVM, что позволяет использовать virtio драйвера (storage, network, balloon) для оптимальной производительности.

Сначала создаю файл образа дискеты

$ truncate -s 1440k ./virtio-floppy_0.1-49.ima
$ sudo mkfs -t vfat -n VIRTIO ./virtio-floppy_0.1-49.ima
$ sudo mkdir /mnt/floppy
$ sudo mount -o loop,rw ./virtio-floppy_0.1-49.ima /mnt/floppy

Скачиваю образ с virtio драйверами. По этому совету я выбрал версию 0.1-49.

$ wget http://alt.fedoraproject.org/pub/alt/virtio-win/archives/virtio-win-0.1-49/virtio-win-0.1-49.iso

Создаю структуру установочного диска

$ sudo mkdir /mnt/iso
$ sudo mount -o ro,loop ./virtio-win-0.1-49.iso /mnt/iso
$ sudo mkdir -p /mnt/floppy/{i386,amd64}/Win2003
$ sudo touch /mnt/floppy/disk1
$ sudo cp /mnt/iso/WNET/X86/VIOSTOR.* /mnt/floppy/i386/
$ sudo cp /mnt/iso/WNET/AMD64/VIOSTOR.* /mnt/floppy/amd64/
$ cat<<_EOF_ | sudo tee /mnt/floppy/txtsetup.oem
[Disks]
d1 = "OEM DISK (SCSI) Win2003/32-bit",\disk1,\i386\Win2003
d2 = "OEM DISK (SCSI) Win2003/64-bit",\disk1,\amd64\Win2003

[Defaults]
SCSI = WNET32

[scsi]
WNET32 = "Red Hat VirtIO SCSI Disk Device Win2003/32-bit"
WNET64 = "Red Hat VirtIO SCSI Disk Device Win2003/64-bit"

[Files.scsi.WNET32]
driver = d1, viostor.sys, viostor
inf    = d1, viostor.inf
catalog= d1, viostor.cat

[Files.scsi.WNET64]
driver = d2, viostor.sys, viostor
inf    = d2, viostor.inf
catalog= d2, viostor.cat

[HardwareIds.scsi.WNET32]
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00000000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00020000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4", "viostor"

[HardwareIds.scsi.WNET64]
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00000000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00020000", "viostor"
id = "PCI\VEN_1AF4&DEV_1001&SUBSYS_00021AF4", "viostor"

[Config.WNET32]
value = Parameters\PnpInterface,5,REG_DWORD,1

[Config.WNET64]
value = Parameters\PnpInterface,5,REG_DWORD,1
_EOF_

Осталось подчистить хвосты

$ sudo umount /mnt/{iso,floppy}
$ sudo rmdir /mnt/{iso,floppy}

В результате в файле ./virtio-floppy_0.1-49.ima находится образ дискеты для установки Windows Server 2003 на диск, доступный через virtio контроллер.

Модификация Seabios для гипервизора KVM

Для модификации BIOS потребуется установить пару зависимостей

$ sudo aptitude install build-essential iasl

Внедрение секции ACPI_SLIC (используется SLIC той машины, где выполняется модификация) в BIOS для гипервизора KVM

$ git clone https://github.com/ghuntley/seaslic.git seaslic
$ cd seaslic
$ git clone git://git.seabios.org/seabios.git seabios.submodule
$ cd seabios.submodule
$ git checkout rel-1.7.3.2
$ cd ..
$ ./patch.sh

После завершения компиляции нужно установить модифицированную версию Seabios в систему (я не заменяю дистрибутивный BIOS, вместо этого устанавливается отдельная версия)

$ sudo mkdir /opt/seaslic
$ sudo cp seabios.submodule/out/bios.bin /opt/seaslic

Далее нужно отредактировать конфигурацию виртуальной машины

$ export LIBVIRT_DEFAULT_URI=qemu:///system
$ virsh edit vmname

В открывшемся редакторе нужно привести XML файл виртуальной машины к подобному виду

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
...
  <qemu:commandline>
    <qemu:arg value='-bios'/>
    <qemu:arg value='/opt/seaslic/bios.bin'/>
  </qemu:commandline>
</domain>

После сохранения файла и перезапуска виртуальной машины в BIOS будет доступна дополнительная секция.

четверг, 27 декабря 2012 г.

could not configure /dev/net/tun: Operation not permitted

Давненько для виртуализации я пользовался KVM (в основном VirtualBox), но сегодня потребовался именно KVM. Если запускать без сети, то все работает как и полагается, а если создать host-only сеть, то выдает ошибку could not configure /dev/net/tun: Operation not permitted.

Host-only сеть создана через tunctl (входит в пакет uml-utilities). Соответсвующая секция /etc/network/interfaces:

auto tap0
iface tap0 inet static
    address 10.168.90.100
    netmask 255.255.255.0
    tunctl_user uml-net

Пользователь, под которым запускается kvm, входит в группу uml-net, но при запуске выдается ошибка

$ kvm -m 1024 -drive file=inet.it.img,if=virtio,boot=on,media=disk,aio=native -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no -vga std
could not configure /dev/net/tun: Operation not permitted

Проверяю права на /dev/net/tun

$ ls -l /dev/net/tun
crw-rw---- 1 root uml-net 10, 200 Дек 27 15:22 /dev/net/tun

Выходит, что для группы uml-net, в которую входит пользователь запускающий KVM, доступ есть. Если же запустить KVM через трассировку, то видно чего ему не хватает

...
timer_create(CLOCK_REALTIME, {(nil), SIGALRM, SIGEV_SIGNAL, {...}}, {(nil)}) = 0
open("/dev/net/tun", O_RDWR|O_LARGEFILE) = 7
ioctl(7, TUNGETFEATURES, 0xbfe1633c)    = 0
ioctl(7, TUNSETIFF, 0xbfe1631c)         = -1 EPERM (Operation not permitted)
write(2, "could not configure /dev/net/tun"..., 58could not configure /dev/net/tun: Operation not permitted
) = 58
close(7)                                = 0
exit_group(1)
...

Как подсказал google не хватает привилегии CAP_NET_ADMIN. Чтобы ее выдать нужно установить пакет libcap2-bin и выполнить команду

$ sudo setcap CAP_NET_ADMIN=ep /usr/bin/kvm

После этого KVM запускается и работает без ошибок.