Server 2008 R2 xenpci.sys BSOD

Based on customer feedback, we have come across an error that can occur when restoring your VM onto the new
platform. After completing steps 11-k in the ‘Migrate_Server2k8r2’ guide you are told to restore the server and you
should get to the login. Sometimes you will be presented with another BSOD instead stating ‘”xenpci.sys, the driver
unloaded without cancelling pending operations’. If you experience this, you will need to remove the xen drivers
manually.
1. Select ‘Launch Startup Repair (recommended)’.
a. Select the radio button ‘use recovery tools….’, and install the Virtio Storage drivers and make a note
of the drive letter assigned to the OS drive. In this case, I’ll refer to it as the ‘F:\’ drive but yours
might be different.
b. Wait for the ‘Startup Repair’ process to fail, or cancel it and click ‘Finish’.
c. From the ‘Choose a recovery tool’ window select ‘Command Prompt’.
d. Now type the following:
i. ‘rmdir /q /s “f:\Program Files (x86)\Xen PV Drivers”
ii. ‘del /q “f:\Windows\System32\drivers\xen*”
iii. ‘del /q f:\Windows\inf\oem1.inf
iv. ‘del /q f:\Windows\inf\oem2.inf
v. ‘del /q f:\Windows\inf\oem3.inf
vi. ‘del /q f:\Windows\inf\oem4.inf
vii. ‘del /q f:\Windows\inf\oem5.inf
viii. ‘del /q f:\Windows\inf\oem*.pnf
e. Now type ‘regedit’, then hit enter.
f. Select ‘HKLM’, go to ‘File\Load Hive
g. For this step, make sure you select the drive you are recovering and not the X: (boot) drive. Go to
C:\Windows\system32\config’ and open the ‘SYSTEM’ file.
h. Type any ‘Key Name’ you want, example ‘temp’.
i. Navigate to ‘HKLM\temp\ControlSet001\services’.
i. Delete Key Names ‘xennet’, ‘xenpci’, ‘xenvdb’.
j. Navigate to ‘HKLM\temp\ControlSet002\services’.
i. Delete Key Names ‘xennet’, ‘xenpci’, ‘xenvdb’.
k. Navigate back to ‘HKLM\temp’.
i. Press ‘Ctrl + f’ to find.
ii. Search for ‘upperfilters’ and keep pressing F3 to find any key with reference to ‘xenpci’ that
have the same class value as below and delete them.
1. ‘HKLM\***\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}
2. ‘HKLM\***\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}
3. ‘HKLM\***\Class\{4D36E97B-E325-11CE-BFC1-08002BE10318}
l. Check these values are still true:
i. intelide ‘3’
ii. msahci ‘0’
iii. pciide ‘0’
iv. LSI_SAS ‘3’
m. Navigate back to the ‘temp’ registry key and select ‘File\Unload Hive’, then press ‘Yes’.
n. Restart the server.
2. When your server has started, Login.

Сегодня мы будем решать проблему, с которой я столкнулся давеча. Итак, у нас есть виртуальная машина Windows Server 2008 R2 на борту с установленными паравиртуальными драйверами. Эта виртаулка крутится работает под XEN’ом. Необходимо ее перести на другой сервер под VirtualBox. Но не все так просто. Первое, что необходимо было сделать — это сконвертировать. Как это сделать, я уже писал в одной из своих заметок:
VBoxManage convertdd linux_file.img linux_file.vdi
После того как вы сконвертируйте IMG в VDI формат и подключие к этот диск к новой виртуальной машине под VirtualBox, скорее всего вы получите первый BSOD с кодом 0x0000007B. 0x0000007B указывает, что  во время запуска операционная система Microsoft Windows потеряла доступ к системному разделу. Чтобы пофиксить эту проблему необходимо в настройках виртуальной машины удалить SATA-контроллер и добавить IDE-контроллер:
VirtualBox-IDE
Далее после попытки запустить сервер вы скорее всего получите второй BSOD (0x0000000d4 xenpci.sys), причиной которого будут установленные паравиртуальные драйверы. Давайте удалим их. Запускаем Windows в режиме восстановления и открываем командную строку. Далее по списку выполняем:
rmdir /q /s “f:\Program Files (x86)\Xen PV Drivers”
del /q “f:\Windows\System32\drivers\xen*”
del /q f:\Windows\inf\oem1.inf
del /q f:\Windows\inf\oem2.inf
del /q f:\Windows\inf\oem3.inf
del /q f:\Windows\inf\oem4.inf
del /q f:\Windows\inf\oem5.inf
del /q f:\Windows\inf\oem*.pnf
После удаления файлов перейдем к правке реестра. Введите команду regedit, выберите раздел HKLM и загрузите куст (File\Load Hive) C:\Windows\system32\config\SYSTEM с именем temp. В разделе HKLM\temp\ControlSet001\services и HKLM\temp\ControlSet002\services удаляем ключи xennetxenpcixenvdb.
Переходим обратно в HKLM\temp, жмем CTRL+F и ищем по фразе upperfilters (F3 для продолжения поиска). Как только в значение появится xenpci необходимо удалить этот раздел. У меня нашлись разделы:
  • HKLM\***\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}
  • HKLM\***\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}
  • HKLM\***\Class\{4D36E97B-E325-11CE-BFC1-08002BE10318}
Теперь вернемся к разделу temp и выгрузим куст (File\Unload Hive). После чего перезагрузим сервер и радуемся рабочему серверу.

Перенос образа из VirtualBox в XEN

vbxenelastixДля того, чтобы перенести ваш образ, созданный в VirtualBox в XEN необходимо сконвертировать VDI-диск в IMG формат. Для этого воспользуемся утилитой VBoxManage, поставляемой вместе с VirtualBox. Поскольку переношу я на MacOS, я воспользуюсь Terminal (поскольку программа консольная).

Итак, перейдите в каталог, где располагается ваш VDI-диск и выполните команду:

VBoxManage internalcommands converttoraw machine-name.vdi newmachine-name.img

После этого в консоли вы увидите сообщение:

Converting image "machine-name.vdi" with size 8908701696 bytes (8496MB) to raw...

Учтите, что процесс может занять длительное время, все зависит от размера вашего VDI-диска. После успешного конвертирования любым удобным способом заливаем newmachine-name.img на сервер с установленным гипервизором XEN.

Далее необходимо будет создать конфигурационный файл. (далее…)

Паравиртуализация XEN или решаем проблемы с производительностью

Паравиртуальные драйверы Xen — специальный вид драйверов устройств, которые используются в гостевой системе в домене Xen (в общем случае паравиртуальным драйвером может называться и та часть паравиртуального интерфейса ввода/вывода, которая находится в домене 0) и осуществляют операции ввода/вывода не через эмулируемые устройства, как это делают обычные драйверы, а при помощи специального интерфейса, предоставляемого системой виртуализации и хост-системой. Одна из главных причин разработки и использования паравиртуальных драйверов — возможность существенного повышения производительности работы гостевых систем, работающих в режиме полной виртуализации.

Недавно я столкнулся с проблемой гостевой ОС Windows Server 2008. Проблема заключалась в том, что производительность жестких дисков была очень медленной. Скорость копирования с раздела на раздел не превышала 5 МБ/с. Решением проблемы было установка паравиртуальных драйверов на гостевой ОС.

Драйвера можно скачать по ссылке. В моем случае это были драйвера gplpv_Vista2008x64_0.11.0.372.msi. На всякий случай сделайте резервную копию сервера. После чего, установите драйвера и перезагрузите систему.

После установки драйверов — производительность Windows Server 2008 поднялась до 100 МБ/c

Увеличение размера жесткого диска Windows для XEN

В этой заметке я расскажу как очень просто увеличить размер жесткого диска Windows, если виртуальная машина гостевая. На самом деле процесс не такой сложный, как может показаться на первый взгляд.

Для начала выключите гостевую машину с Windows. После этого сделаем копию img образа, с которым будете работать. Даже если объем диска большой — копию все равно необходимо сделать. Т.к. всегда есть риск потери данных.

После этого в конец оригинального img-образа добавим необходимый объем командой dd. В моем примере я добавляю 80 Гигабайт.

dd if=/dev/zero bs=1024 count=80000000 >> ./disk.img

Далее вам необходимо любой live ISO образ которым мы будем расширять размер раздела. Я использовал gparted.

Следующим шагом мы подключим к нашей виртуальной машине этот ISO образ и загрузимся с него. Для этого вам, возможно, придется изменить порядок загрузки в конфигурационном файле. Ниже я приведу пример своей виртуальной машины.

import os, re
arch = os.uname()[4]
if re.search('64', arch):
    arch_libdir = 'lib64'
else:
    arch_libdir = 'lib'

kernel = "/usr/lib/xen/boot/hvmloader"
builder='hvm'
memory = 4086
shadow_memory = 8
name = "win"
vif = [ 'ip=192.168.1.100' ]
acpi = 1
apic = 1
pae = 1
disk = [ 'file:/mnt/xen/win/disk.img,hda,w','file:/mnt/bigboy2/gparted.iso,hdc:cdrom,r' ]
device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
vcpus=8
boot="dc"
sdl=0
vnc=1
vncdisplay=10
vncpasswd='vncpasswd'
vnclisten='192.168.1.1'

Обратите внимание на параметры boot,vnc, vncdisplay, vncpassword и vnclisten. Они определяют порядок загрузки, возможность подключиться по VNC, дисплей VNC(это порт,в моем примере подключение по VNC будет происходить по порту 5910) пароль на VNC и IP-адрес на котором будет висеть VPN соответственно.

После успешного запуска можно подключиться по VNC по порту 5910 и увидеть работу gparted. В нем выбираем раздел, расширяем его и применяем изменения.

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

xm create windows.cfg

Xen configuration example for Windows

В данном топике я приведу пример конфигурации XEN для Windows Server, который я использую. Отличительной особенностью является то, что в гостевую машину проброшен Aladdin Hasp Key для 1C. А также подключен VNC для подключения с определенным портом

import os, re
arch = os.uname()[4]
if re.search('64', arch):
    arch_libdir = 'lib64'
else:
    arch_libdir = 'lib'

kernel = "/usr/lib/xen/boot/hvmloader"
builder='hvm'
memory = 4096

# Should be at least 2KB per MB of domain memory, plus a few MB per vcpu.
shadow_memory = 8
name = "win2008"
vif = [ 'ip=192.168.1.5' ]
acpi = 1
apic = 1
pae = 1
disk = [ 'file:/home/xen/domains/win2008/disk1.img,hda,w' , 'file:/home/xen/domains/win2008/disk2.img,hdb,w', 'file:/home/xen/domains/win2008/disk3.img,hdc,w','file:/home/xen/domains/win2008/disk4.img,hdd,w']

device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
vcpus=4
boot="dc"
sdl=0
vnc=1
vncdisplay=1
vncpasswd='assembler'
vnclisten='192.168.1.4'
usb=1
usbdevice='host:0529:0001'