При написании данной статьи использовались следующие компоненты:
- Операционная система хоста: Ubuntu 10.10 (ядро - 2.6.35-25-generic)
- Гостевая операционная система: Ubuntu 10.10 (ядро - 2.6.38-rc5+)
- Версия qemu 0.12.5
С большой вероятностью, все должно работать и на других версиях ядра/ОС/эмулятора. Однако я этого не гарантирую.
Введение
Часто бывает, что после компиляции ядра Linux с собственными параметрами появляется сильное желание проверить, а как собственно оно работает и загрузится ли вообще. Сделать это можно тремя разными способами:
- Загрузить ядро на реальном железе
- Загрузить ядро, используя виртуальную машину
- Загрузить ядро, используя эмулятор
Имеет свои достоинства и недостатки. Из достоинств можно сказать, что сделать это будет проще, чем используя виртуальные машины. Однако огромным минусом является то, что каждый раз, в случае любой неполадки, вам будет необходимо перезапускать операционную систему, загружаться со стабильного ядра чтобы подправить исходники, компилировать рабочее ядро, потом снова загружаться с него. Это очень утомительно и занимает много времени и неплохо описано на просторах интернета. Поэтому данный способ я затрагивать не буду.
Загрузка ядра, используя виртуальную машину
Данный способ лучше тем, что вы можете параллельно запускать столько виртуальных машин с нужными вам параметрами, на сколько хватит вашего железа. Например, можно тестировать ядра на запущенных виртуальных машинах, переписывая параллельно какие-либо функции ядра и при этом вы можете компилировать исходные коды. Этот способ и будет рассмотрен в данной статье.
Загрузка ядра, используя эмулятор
Очень похожа на загрузку при помощи виртуальной машины. Не сильно от неё отличается, однако даёт некоторые преимущества. Например, тестирование ядра под arm-архитектуру на ноутбуке с x86-архитектурой. В данной статье не рассматривается.
Запуск нового ядра в qemu
Для запуска ядра необходимо сделать следующее:
- Скачать исходники ядра с сайта http://kernel.org/
- Cкомпилировать их, создав образ ядра и динамически подгружаемые модули ядра
- Создать виртуальный жесткий диск при помощи qemu-img
- Установить на него Ubuntu 10.10
- Перед новой загрузкой передать qemu параметры, подменяющие ядро, находящееся на виртуальном жестком диске, рабочим ядром.
Скачивание исходников ядра
Наилучший и рекомендуемый вариант сделать это: используя систему контроля версий git.
sudo apt-get install git git clone git://git kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git cd linux-2.6/
Теперь у нас есть исходники ядра, которые необходимо скомпилировать. Но перед этим нам надо сконфигурировать ядро. Сделать это можно, используя команду
make menuconfigи в меню выбрать требуемые параметры. Однако конфигурирование "с нуля" очень сложное занятие и требует как хорошего знания параметров ядра, так и хорошую память - в конфигурационном файле может находиться более 6000 параметров. Поэтому лучше всего взять за основу существующий конфиг и подправить его:
cp /boot/config-2.6.35-25-generic custom.configкопирует конфигурационный файл для Ubuntu 10.10, заменяя название файла на "стандартное", т.к. по умолчанию ядро работает только с файлом .config. Просто взять и скомпилировать ядро, используя этот файл, не получится, потому что с выходом новых версий ядра появляются новые конфигурационные параметры, старые могут переименовываться. Поэтому никто не гарантирует, что конфиг от старых версий будет работать с новыми версиями ядра. Т.к. у нас уже работает Ubuntu 10.10 на железе, логично взять её конфиг и установить все новые параметры в "no":
make KCONFIG_ALLCONFIG=custom.config make allnoconfigгенерирует файл .config, включая опции, которые установлены в файле custom.config.
Собираем ядро Linux:
make bzImage
Собираем все модули ядра:
make modulesУстанавливаем ядро в /boot:
make install
Устанавливаем модули ядра в /lib/modules/<версия_ядра>
make modules_install
Теперь у нас есть установленные ядро и модули ядра. Осталось создать образ виртуального диска initramfs, содержащий некоторые модули ядра, необходимые для загрузки ОС: например драйверы файловой системы, на которой установлена корневая файловая система. Данная команда создаст образ initramfs в формате initrd.img-<версия_ядра>. В нашем случае initrd.img-2.6.38-rc5+
sudo apt-get install initramfs-tools sudo update-initramfs -c -k <версия_ядра>
Версию ядра можно узнать, набрав
make kernelrelease
Создание виртуального жесткого диска и установка на него Ubuntu
Установка qemu, создание виртуального диска и установка на него Ubuntu 10.10 в этой статье не рассматривается, т.к. это простой процесс и имеется масса мануалов как это сделать на просторах интернета. Замечу только, что необходимо создавать диск достаточного размера для установки ОС (у меня 7Gb, формат диска - qcow2)
Передача qemu параметров, подменяющих ядро
Запускаем qemu c установленной Ubuntu (в хост-системе)
qemu -hda <пусть_к_вирт_диску>
Выполняем команду
uname -rчтобы посмотреть какая у нас сейчас версия ядра.
Далее открываем системный монитор:
gnome-system-monitor
Смотрим на каком разделе установлена корневая файловая система. В нашем
случае это /dev/sda2. Запускаем qemu (в хост-системе), указывая какое
ядро ему следует загрузить:
случае это /dev/sda2. Запускаем qemu (в хост-системе), указывая какое
ядро ему следует загрузить:
qemu -append root=<раздел_root> -initrd <путь_к_initramfs> -kernel <путь_к_ядру> -hda <путь_к_вирт_диску> -usbdevice mouse
<раздел_root> - раздел, на котором установлена корневая файловая система (у меня /dev/sda2)
<путь_к_initramfs> - путь к виртуальному диску initramfs (у меня /boot/initrd.img-2.6.38-rc5+, у вас /boot/initrd.img-<версия_ядра>)
<путь_к_ядру> - путь к ядру Linux (у меня /boot/vmlinuz-2.6.38-rc5+, у вас /boot/vmlinuz-<версия_ядра>)
<путь_к_вирт_диску> - путь к виртуальному диску, который вы создали
-usbdevice mouse - если не указать этот параметр, то мышь работать не будет
Все, у вас теперь виртуальная машина с Ubuntu 10.10 и самым новым ядром!
<путь_к_initramfs> - путь к виртуальному диску initramfs (у меня /boot/initrd.img-2.6.38-rc5+, у вас /boot/initrd.img-<версия_ядра>)
<путь_к_ядру> - путь к ядру Linux (у меня /boot/vmlinuz-2.6.38-rc5+, у вас /boot/vmlinuz-<версия_ядра>)
<путь_к_вирт_диску> - путь к виртуальному диску, который вы создали
-usbdevice mouse - если не указать этот параметр, то мышь работать не будет
Все, у вас теперь виртуальная машина с Ubuntu 10.10 и самым новым ядром!