Нынешней весной вышел очередной LTS-релиз популярного дистрибутива Linux, а значит, пришла пора постепенной миграции на него всех наших убунтовых систем. Вот и у меня на прошлой неделе, наконец, дошли руки до апгрейда своей машины. В целом миграция прошла нормально: система работает вполне шустро и стабильно, каких-то заметных "подводных камней" заметить пока что не удалось. Но вот в процессе апгрейда VirtualBox мне неожиданно пришлось немного поплясать с бубном, чем я и решил позволить себе поделиться здесь.
Стартовый расклад
Я исторически не люблю встроенную в Ubuntu утилиту апгрейда, поэтому раз в два года тупо переставляю систему заново (домашний каталог живёт на отдельной партиции, поэтому при переустановке системы не страдает). Таким образом, мы имеем в качестве стартовой позиции свежеустановленную Ubuntu 24.04.1 LTS с дефолтными пакетами без каких-либо дополнительных подключенных репозиториев.
В принципе, VirtualBox есть в "родном" репозитории пакетов Ubuntu, посему простейший вариант его установки выглядит так:
$ sudo apt install virtualbox
Поставленная таким образом среда виртуализации будет вполне нормально работать, но вот только в репозитории пакетов лежит не самая свежая версия 7.0. А ведь мы только что обновили систему, и нам хочется всего самого нового и современного! Поэтому попробуем поставить актуальную версию, на момент написания заметки это 7.1.2.
Тут у нас тоже есть два пути -- "простой" и "правильный". "Простой" путь предполагает скачивание deb-пакета с официального сайта VirtualBox и установку его вручную. Это вполне рабочий вариант, но он мне не нравится, т.к. установленный таким образом пакет не будет обновляться, ну и в принципе идеологически такой вариант выглядит не очень красиво. Поэтому мы попробуем пойти "правильным" путём и подключить какой-нибудь дополнительный репозиторий пакетов. На наше счастье, думать тут долго не нужно, т.к. компания Oracle до сих пор поддерживает официальный ppa-репозиторий VirtualBox, куда оперативно выкладываются все обновления, в т.ч. и для современных версий Debian-based систем.
Подключаем репозиторий и устанавливаем VirtualBox
Первая часть "марлезонского балета" заключалась в подключении репозитория и установке нужных пакетов. На просторах интернета можно найти много инструкций по такой установке VirtualBox, я пользовался этой (естественно, с поправкой на то, что ставил более новую версию). Поэтому следующий раздел является вольным переводом заметки, доступной по ссылке выше. Итак, последовательность действий такова:
1. На всякий случай обновляем кэш пакетов ОС и устанавливаем пакеты необходимых утилит (или убеждаемся в том, что они уже установлены):
$ sudo apt update
$ sudo apt install curl wget gnupg2 lsb-release -y
2. Устанавливаем необходимые утилиты (если они ещё не установлены), импортируем ключи репозитория пакетов и добавляем сам репозиторий в список источников пакетов нашей системы:
$ curl -fsSL https://www.virtualbox.org/download/oracle_vbox_2016.asc|sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/vbox.gpg
$ curl -fsSL https://www.virtualbox.org/download/oracle_vbox.asc|sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/oracle_vbox.gpg
$ echo "deb [arch=amd64] http://download.virtualbox.org/virtualbox/debian $(lsb_release -sc) contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list
Теперь нужно снова обновить кэш пакетов, после чего можно будет приступить к установке среды виртуализации:
$ sudo apt update
Устанавливаем модули ядра и сам VirtualBox:
$ sudo apt install -y linux-headers-$(uname -r) dkms
$ sudo apt install virtualbox-7.1 -y
Дальнейшие действия опциональны, но обычно требуются для удобной работы с виртуальными машинами. Во-первых, добавим текущего пользователя системы в группу vboxusers, чтобы иметь возможность использовать VirtualBox с административными привилегиями:
$ sudo usermod -aG vboxusers $USER
$ newgrp vboxusers
Во-вторых, скачаем и установим расширение VirtualBox Extension Pack, чтобы иметь возможность использовать в наших виртуальных машинах USB и кучу других полезных "плюшек":
$ wget https://download.virtualbox.org/virtualbox/7.1.2/Oracle_VirtualBox_Extension_Pack-7.1.2.vbox-extpack
$ sudo vboxmanage extpack install Oracle_VirtualBox_Extension_Pack-7.1.2.vbox-extpack
Ура! По идее, на этом установка VirtualBox закончена. Но, к сожалению, радоваться ещё рано -- среда виртуализации установилась, но работать пока что не будет.
Шаманство с библиотеками
Запускаем панель управления, пробуем запустить какую-нибудь виртуальную машину (или создать новую) и видим в боковой панели ошибку следующего вида:
The virtual machine 'Machine Name' has terminated unexpectedly during startup because of signal 11.
Result Code:
NS_ERROR_FAILURE (0x80004005)
Component:
MachineWrap
Эта ошибка максимально неинформативна -- она может свидетельствовать практически о любой проблеме со средой виртуализации или vm. Поэтому попробуем заглянуть в логи, может быть увидим что-нибудь более полезное там:
$ cat .VirtualBox/VBoxSVC.log | grep rtldrNativeLoad
00:00:00.001672 main rtldrNativeLoad: dlopen('/usr/lib/virtualbox/libpthread.so', RTLD_NOW | RTLD_LOCAL) failed: /usr/lib/virtualbox/libpthread.so: cannot open shared object file: No such file or directory
00:00:00.001683 main rtldrNativeLoad: dlopen('/usr/lib/virtualbox/libdl.so', RTLD_NOW | RTLD_LOCAL) failed: /usr/lib/virtualbox/libdl.so: cannot open shared object file: No such file or directory
Вот это уже гораздо интереснее! Оказывается, vbox не смог "добраться" до библиотек libpthread и libdl. При этом в системе эти библиотеки есть, просто расположены по другому пути (в Ubuntu 24.04 -- в каталоге /lib/x86_64-linux-gnu/). Ну что же, попробуем подпереть проблему "костылями" -- через символические ссылки:
$ sudo ln -s /lib/x86_64-linux-gnu/libpthread.so.0 /usr/lib/virtualbox/libpthread.so
$ sudo ln -s /lib/x86_64-linux-gnu/libdl.so.2 /usr/lib/virtualbox/libdl.so
Пытаемся запустить какую-нибудь виртуальную машину, и (чудо!) всё начинает работать!
Ура! Мы молодцы, можно идти пить кофе :)