понедельник, 14 февраля 2011 г.

Особенности использования VirtualBox в Ubuntu 10.10

Мое отношение к VirtualBox в Ubuntu двоякое. Наличие несвободных компонент и факт, что это теперь собственность Oracle, а они, в последнее время, хорошо подтрудлись над своей репутацией конченых копирастов, заставляет меня сомневаться в светлом будущем данного продукта. С другой стороны, альтернатива в виде Qemu, прямо скажем, сильно отстает: интеграция с десктопом отсутствует, как класс, а выпиленый в версии 0.12 kqemu, делает её непригодной для использования на старых машинах, где не работает KVM.

Получается, как в анекдоте: "ежики плакали, кололись, но продолжали жрать кактус...". Дальше я постараюсь описать свой опыт того, как это делать сподручнее. Может кому пригодится.

Установка linux-headers

В Ubuntu можно получить ситуацию, когда установленная версия linux-headers не совпадает с установленной версией linux-image. В результате, VirtualBox перестает работать и ругается на отсутствие модуля vboxdrv.

В принципе, вы можете и не столкнуться с этой проблемой, лично я, нарвался на нее по собственной "зауми". Не помню начиная с какой версии (в 10.04 эта "фича" уже была), Ubuntu настойчиво предлагает задействовать возможности обеспечения безопасности заложенные в процессор. В первую очередь, это касается возможности запрещать выполнение кода в некоторых областях памяти (Non-Executable Memory). Для этого предлагается заменить ядро linux-image-*-generic используемое по умолчанию, на linux-image-*-generic-pae.

Сама замена ядра проходит гладко, но VirtualBox магическим образом перестает работать. Происходит это потому, что для VirtualBox требуется собрать свой модуль ядра vboxdrv. Этим занимается пакет dkms, которому необходима правильная версия linux-headers. Конкретно, сборка модулей для linux-image-*-generic-pae требует наличия linux-headers-*-generic-pae. К сожалению, зависимости между пакетами прописаны так, что автоматически нужные пакеты не устанавливаются (LP #673349).

Простейший способ исправить проблему (дальнейшие обновления будут ставиться автоматически):

sudo aptitude install linux-headers-server

Работа с физическими дисками

В главе Advanced storage configuration руководства пользователя описано, как в виртуальной машине VirtualBox можно работать с физическими дисками. Для меня эта возможность относится к разряду жизненно необходимых: эксперименты с загрузчиком и multi-boot виртуализация без нее практически невозможны.

К сожалению, вопрос предоставления виртуальной машине доступа к диску оставлен авторами документации, как впрочем и сопровождающими пакета в Ubuntu, в качестве домашнего задания. В Ubuntu прямой доступ к диску имеют root и члены групы disk. В принципе, раз уж виртуальная машина будет иметь прямой доступ к дискам, сильно возражать против запуска от root смысла нет, однако, я всеже предпочитаю обходиться минимально необходимыми привилегиями, и ограничился добавлением в sudoers следующей строчки:

myuser ALL=(:disk) /usr/bin/virtualbox,/usr/bin/vboxmanage

Команды добавление физического диска и запуск VirtualBox в результате выглядят так:

sudo -g disk \
vboxmanage internalcommands createrawvmdk \
 -filename ~/.VirtualBox/HardDisks/host-sda.vmdk \
 -rawdisk /dev/sda \
 -register

sudo -g disk virtualbox

Кстати, перед запуском VirtualBox невредно удостовериться в отсутсвии загруженных модулей KVM, иначе запустить виртуальную машину не получится.

lsmod | grep kvm

Снижение нагрузки на процессор

Если подумать, то проблема дурная. Симптомом является то, что VirtualBox на 100% загружает одно из ядер процессора, даже когда гостевая ОС показывает всего 1-2% загрузки. Я словил такую проблему в Ubuntu с Windows XP в качестве гостевой ОС.

Заскок известен с 2008 года (ссылка). Вроде, было открыто несколько багов, врочем безрезультатных, но, как минимум, до версии 3.2.8, входящей в Ubuntu 10.10, решение остается все тем же. Если запустить еще одну пустую виртуальную машину (ей даже диск не нужен, можно поставить на паузу, сразу при включении), загрузка процессора тут же падает до нуля.

В чем причина такого поведения, я так и не понял. Ходят слухи, что дело в постоянном переносе процесса VirtualBox с одного процессора на другой. Если так то, должны бы работать другие решения, типа привязки VM к определенному процессору/ядру с помощью taskset, но у меня они не сработали. Почему? Пока, не разбирался.

Настройка клавиатуры

Наконец, имеет смысл уделить внимание настройке горячих клавиш. В общем-то мелочь, но на удобстве сказывается заметно.

Первое, что следует сделать это заменить Host Key на что-то более вменяемое, чем правый Ctrl. Более дурацкое значение по умолчанию придумать сложно, конфликт с горячими плавишами внутри гостевой машины обеспечен.

Я обычно настраиваю Host Key = LWin. Сделать можно это в меню: Файл → Настройки → Ввод.

Хорошо бы еще настроить фильтр, какие комбинации клавиш пропускать в виртуальную машину, а какие нет. (Скажите, например, зачем передавать в гостевую OS команду блокировки консоли (Win+L)? Чтобы лишний раз ввести пароль?)

К сожалению, этой возможность в ближайшее время ждать, похоже, не приходится (ссылка).

11 комментариев:

  1. Насколько необходимо ставить предлагаемый linux-headers-server и где его надо устанавливать: в виртуальной машине (оси) или в хостовой ?

    ОтветитьУдалить
  2. Пакет необходим для сборки модуля ядра vboxdrv через dkms на хостовой машине. Без этого модуля гостевые машины не запустятся. Вообще-то нужны headers, соответствующие установленному ядру, но в данном случае Linux-headers-server вытащат нужный пакет по зависимостям.

    ОтветитьУдалить
  3. У меня в системе (убунту 10.10 ) -
    2.6.35.31.40linux-image-generic и linux-image-2.6.35-31-generic
    Хочу поставить виртуалбокс
    Я так понимаю, что linux-headers-server пока не нужно устанавливать ? А если ядро ядро linux-image-*-generic заменится на linux-image-*-generic-pae, то тогда при отказе витуалбокс(при прошедших обновлениях ядра) мне надо будет в ХОСТОВОЙ системе( не в гостевой системе ? ) поставить linux-headers-server . Так ? Если так, то надо будет при этом что-либо удалять или просто проинсталлировать в систему этот пакет ?
    Или при другом варианте- перед установкой виртуалбокс проинсталлить linux-headers-server,а потом устанавл.виртуалбокс и дополнения.. Так ?
    Еще вопрос - linux-headers-server как-то может повредить работе ядра хостовой системы ?

    ОтветитьУдалить
  4. И еще стоят linux-headers-2.6.35-31 и linux-headers-2.6.35-31-generic

    ОтветитьУдалить
  5. Каждой сборке ядре в Ubuntu соответствует своя версия версия headers. Например если у вас linux-image-2.6.35-31-generic то, для этого ядра нужны linux-headers-2.6.35-31-generic. Если у вас linux-image-2.6.35-31-generic-pae то, вам нужны linux-image-2.6.35-31-generic-pae. Совпадение хвоста после linux-{image|headers}- должно быть точным, так как от этого зависят пути, куда устанавливаются файлы. Все пакеты типа linux-headerы-server, linux-headers и прочее — это заглушки, которые вытаскивают нужную версию headers, если конечно повезёт.

    Наличие "лишних" headers пакетов, насколько я знаю, никак не отражается на работе системы, разве что место занимают. Однако, для сборки модуля через dkms, вам нужны headers соответствующие именно вашей версии ядра. Никакие другие для этого не подойдут, разве что вы возьмётесь собирать модуль руками, но тогда вам ещё и бубен понадобится.

    Если на момент установки virtualbox у вас не был установлен нужный вариант пакета linux-headers, вы это быстро заметите. Виртуальные машины не запустятся.

    Проверить, наличие модулей ядра можно командой:

    find /lib/modules/`uname -r` -name 'vbox*'

    Если команда не находит файлов, вам необходимо установить недостающий пакет linux-headers, после чего выполнить реконфигурацию пакета virtualbox-dkms.

    sudo dkpg-reconfigure virtualbox-dkms

    В ходе реконфигурации, нужные модули будут собраны и загружены в ядро. Предыдущая команда (find) должна после этого найти файлы модулей ядра на файловой системе.

    ОтветитьУдалить
  6. А разве все правильные headers c хвостами не должны вытягиваться по зависимостям устанавливаемым метапакетом ядра при установке системы?
    Как может получиться, что в системе будет несоответствие ?

    ОтветитьУдалить
  7. Теоретически должны, а практически нифига не работает.

    Вот вам пример из 11.10:

    virtualbox-dkms Depends: dkms (>= 2.1.0.0)

    dkms Recommends: linux-headers-686-pae | linux-headers-amd64 | linux-headers-generic | linux-headers

    linux-headers-3.0.0-14-generic-pae Provides: linux-headers

    Достаточно установить любой из пакетов linux-headers-* и dpkg будет считать, что зависимость удовлетворена. То что dkms при этом не собирает нужные модули, его абсолютно не волнует.

    Если мне память не изменяет, соотвествтующие баги заводились еще во времена 10.04, но поскольку проблема существует и в 11.10 исправлять их, видимо, некому.

    Нужно что-то типа условных зависимостей. Подозреваю сделать это можно, добавив по виртуальному пакету для каждого из вариантов ядра и прописав в зависимостях dkms, что-то типа: Recommends: (linux-image-pae linux-headers-pae) | (linux-image-amd64 linux-headers-amd64). Но все это предположения. Чтобы это проверить надо убить массу времени. Подтянуть разработчиков двух пакетов linux и dkms. Подзреваю, что придется долго-долго проедать им плешь, чтобы они обратили на проблему хоть какое-то внимание. Затем они скажут, что проблемы нет, или она не воспроизводится, или еще что-то придумают. Затем надо будет написать тестовый случай, который будет демонстрировать проблему на свежеустановленной системе. Ему вероятно не поверят. Поэтому вы решите написать патч хотябы для себя и вышлете его разработчикам. Патч осядет в очереди на слияние. Пару раз к вам возможно обратятся с просьбой переделать его для устранения каких-то недочетов, но потом выйдет новый релиз и про патч забудут. В конечном итоге исправленные версии пакетов осядут в вашем ppa, где вы и будете их поддерживать из релиза в релиз.

    На данный момент, война с ветряными мельницами в лице сообщества Ubuntu меня несколько утомила, так что я заниматься этим сейчас нехочу. Может быть чуть позже, когда отойду от праздников. ;)

    ОтветитьУдалить
  8. Вы предлагаете решать проблему установкой отдельного пакета,ну а если так:
    https://help.ubuntu.com/community/EnablingPAE
    sudo aptitude install linux-generic-pae linux-headers-generic-pae
    sudo aptitude remove linux-generic linux-image-generic linux-headers-generic
    Или я чего-то недопонимаю ?

    ОтветитьУдалить
  9. И так тоже будет работать и ещё десятком других способов. Причину глюков я вам назвал: dpkg или apt неправильно удовлетворяет зависимости между пакетами, или зависимости кривые, до конца не понятно. Как вылечить вручную тоже известно.

    Я видимо не понимаю цель ваших упражнений. Если вам требуется просто запустить виртуалку то, за время, что мы переписываемся, можно уже несколько раз переустановить все с нуля. В случае сбоя после обновления, ручное исправление занимает 5-10 минут.

    Если вы хотите сделать раз и навсегда то, это малость другой уровень. Вам надо с разработчиками общаться. Моё мнение, то, как реализованно сейчас, в приципе нормально работать не может, но чтобы исправить надо разбираться, исправлять, тестировать, проталкивать в дистрибутив на все это требуется затратить массу сил и времени. Если у вас желание этим заняться, можно связаться в личке или заводите баг на launchpad, я подключусь, в комментариях к блогу такие вещи не делаются, на мой взгляд.

    ОтветитьУдалить
  10. ".. Я видимо не понимаю цель ваших упражнений.."
    :-) Я новичок в линукс и притом весьма дотошный - просто хотел детальней разобраться в вопросе.

    ОтветитьУдалить
  11. Понятно. Желаю вам удачи. Вопросов на всех хватит :)

    ОтветитьУдалить