Debian 6.0.3 как гостевая OS в Hyper-V

Как создать внутри Hyper-V виртуальную машину и прочую ерунду я рассказывать небуду. Но вот про особенность установки стабильного Debian как гостевой OS я хотел бы сказать пару слов. Особенность эта заключается в том, что стабильный на данный момент Debian Squeeze с ядром 2.6.32-5 не поддерживает сеть со стандартным сетевым адаптером Hyper-V. Реально сетевой интерфейс в VM появляется только тогда когда в настройках VM добавить «Legacy Network Adapter». Но оставлять так настроенную сеть не есть хорошо, так как все равно сетевая карта в VM будет вести себя нестабильно. И вообще ядро 2.6.32 в принципе старовато и не имеет никаких упоминаний о работе в виде гостевой ОС под Hyper-V. Поддержка плюшек Hyper-V реализована (хоть и на стадии Experimental) в ядре 2.6.38, которое доступно из backports репозитариев Debian.
Итак, сначала я попробовал просто поставить из backports ядро 2.6.38. Делается это очень просто, но как выяснилось после установки, для решения моего вопроса этот шаг был бесполезен так как в стандартной сборке ядра нужных мне модулей небыло включено. Рекомендую сразу ставить сырцы ядра 2.6.38, для начала надо убедится что в гостевой системе подключен репозитарий backports:

root@deb:~# grep backports /etc/apt/sources.list
deb ftp://ftp.ua.debian.org/debian-backports/ squeeze-backports main contrib non-free
root@deb:~#

Если у вас ничего не выдает введение этой команды, добавте себе данный репозитарий в sources.list

root@deb:~# echo 'deb ftp://ftp.ua.debian.org/debian-backports/ squeeze-backports main contrib non-free' >> /etc/apt/sources.list

Теперь обязательно:

root@deb:~# aptitude update

Теперь можно ставить:

root@deb:~# apt-get install -t squeeze-backports linux-image-2.6.38-bpo.2-amd64

После перезагрузки я поднялся с новым ядром без проблем, но к сожелению, плюшки Hyper-V которые мне нужны были, в стандартной сборке отсутствовали. Ну не беда, ядро можно и самому пересобрать. Для этого сначала ставим исходные коды ядра

root@deb:~# aptitude install linux-source-2.6.38

Дальше ставим инструменты для сборки ядра:

root@deb:~# apt-get install -y build-essential
root@deb:~# apt-get install -y ncurses-dev kernel-package fakeroot

Также нам понадобятся linux-headers, тоже ставим

root@deb:~# apt-get install linux-headers-`uname -r`

Теперь топаем в директорию /usr/src, тут лежит архив с установленными только что исходниками ядра 2.6.38

root@deb:~# cd /usr/src

И розпаковываем архив с исходными кодами

root@deb:~# tar xjvf linux-source-2.6.38.tar.bz2

Переходим в розархивированную директорию

root@deb:~# cd linux-source-2.6.38

Чтобы упростить себе процесс конфигурирования ядра (ато там опций мульйон!) советую скопировать конфиг бэкпортового ядра 2.6.38 в файлик .config

root@deb:~# cp /boot/config-2.6.38-bpo.2-amd64 .config

И вперед конфигурить:

root@deb:~# make menuconfig

все что нам нужно включить находится в

Device Drivers -> Stagging Drivers –> Microsoft Hyper-V Client Drivers

ставим напротив этого пункта букву «M» чтобы собрать это драйвера модулями. Настраивать или не настраивать остальное — дело ваше. Я заодно отключил явно непотребные вещи на сервере, к примеру поддержку Bluetooth и WI-FI.
Для выхода из menuconfig достаточно понажимать Esc и когда спросит о сохранении, нажмите «Сохранить»
После того как вы вернетесь в рутовую консоль можно приступить к сборке:

root@deb:~# make-kpkg clean

Собираем deb пакеты с ядром и хедерсами командой:

root@deb:~# fakeroot make-kpkg --initrd --append-to-version=-hyperv kernel_image kernel_headers

После отработки данной команды у нас в папке /usr/src появятся deb пакеты с ядром и хедерсами, можете убедиться:

root@deb:~# ls -l /usr/src/
total 105708
drwxr-xr-x  4 root root     4096 Nov 21 03:21 linux-headers-2.6.38-bpo.2-amd64
drwxr-xr-x  4 root root     4096 Nov 21 03:21 linux-headers-2.6.38-bpo.2-common
-rw-r--r--  1 root root  7175142 Nov 21 06:21 linux-headers-2.6.38-hyperv_2.6.38-hyperv-10.00.Custom_amd64.deb
-rw-r--r--  1 root root 27047394 Nov 21 06:15 linux-image-2.6.38-hyperv_2.6.38-hyperv-10.00.Custom_amd64.deb
lrwxrwxrwx  1 root root       26 Nov 21 03:21 linux-kbuild-2.6.38 -> ../lib/linux-kbuild-2.6.38
drwxr-xr-x 24 root root     4096 Nov 21 06:16 linux-source-2.6.38
-rw-r--r--  1 root root 73881042 Jun  6 12:47 linux-source-2.6.38.tar.bz2
root@deb:~#

Установим сначала новое ядро:

root@deb:~# dpkg -i /usr/src/linux-image-2.6.38-hyperv_2.6.38-hyperv-10.00.Custom_amd64.deb
Selecting previously deselected package linux-image-2.6.38-hyperv.
(Reading database ... 34205 files and directories currently installed.)
Unpacking linux-image-2.6.38-hyperv (from .../linux-image-2.6.38-hyperv_2.6.38-hyperv-10.00.Custom_amd64.deb) ...
Done.
Setting up linux-image-2.6.38-hyperv (2.6.38-hyperv-10.00.Custom) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.38-hyperv /boot/vmlinuz-2.6.38-hyperv
update-initramfs: Generating /boot/initrd.img-2.6.38-hyperv
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 2.6.38-hyperv /boot/vmlinuz-2.6.38-hyperv
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.38-bpo.2-amd64
Found initrd image: /boot/initrd.img-2.6.38-bpo.2-amd64
Found linux image: /boot/vmlinuz-2.6.38-hyperv
Found initrd image: /boot/initrd.img-2.6.38-hyperv
Found linux image: /boot/vmlinuz-2.6.32-5-amd64
Found initrd image: /boot/initrd.img-2.6.32-5-amd64
done                      
root@deb:~#

А потом хедерсы:

root@deb:~# dpkg -i /usr/src/linux-headers-2.6.38-hyperv_2.6.38-hyperv-10.00.Custom_amd64.deb
Selecting previously deselected package linux-headers-2.6.38-hyperv.
(Reading database ... 37161 files and directories currently installed.)
Unpacking linux-headers-2.6.38-hyperv (from .../linux-headers-2.6.38-hyperv_2.6.38-hyperv-10.00.Custom_amd64.deb) ...
Setting up linux-headers-2.6.38-hyperv (2.6.38-hyperv-10.00.Custom) ...
Examining /etc/kernel/header_postinst.d.
root@deb:~#

После этого нужно пересобрать initrd образ в котором будут нужные нам модули hyper-v. Для этого конфиг /etc/initramfs-tools/modules приведем к следующему виду:

root@deb:~# cat /etc/initramfs-tools/modules
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax:  module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
hv_vmbus
hv_storvsc
hv_blkvsc
hv_netvsc
root@deb:~#

Соберем initrd-image командой

root@deb:~# update-initramfs -uk all

После этого перезагрузка. После перезагрузки убедимся что мы поднялись с только что собранным ядром

root@deb:~# uname -a
Linux deb 2.6.38-hyperv #1 SMP Mon Nov 21 03:58:25 EST 2011 x86_64 GNU/Linux
root@deb:~#

И нужные нам модули подгрузились и работают:

root@deb:~# lsmod |grep hv
hv_utils               12589  0
hv_timesource          12351  0 [permanent]
hv_blkvsc              25932  3
hv_storvsc             21491  0
hv_netvsc              30579  0
scsi_mod              157361  6 hv_blkvsc,hv_storvsc,sg,sr_mod,sd_mod,libata
hv_vmbus               40605  4 hv_utils,hv_blkvsc,hv_storvsc,hv_netvsc
root@deb:~#

Если по каким либо причинам ядро в загрузчике grub автоматически выбрано неверно, порядковый номер нужного нам ядра можно настроить в /etc/default/grub опция GRUB_DEFAULT (только помните что в grub нумерация пунктов начинается из 0 а не с 1!)
После того как мы убедились что ядро поднялось то что нам нужно и модули доступны и работают можно в настройках гостевой машины удалять legacy network adapter и ставить обычный. Карточка нормально увидится и будет прекрасно конфигуриться как на лету командой ifconfig так и с помощью конфига /etc/network/interfaces
Ну вот и все 🙂 Всем удачно завиртуализироваться 😉

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?