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

Запуск рабочего ядра в qemu

При написании данной статьи использовались следующие компоненты:
  1. Операционная система хоста: Ubuntu 10.10 (ядро - 2.6.35-25-generic)
  2. Гостевая операционная система: Ubuntu 10.10 (ядро - 2.6.38-rc5+)
  3. Версия qemu 0.12.5
С большой вероятностью, все должно работать и на других версиях ядра/ОС/эмулятора. Однако я этого не гарантирую.

Введение
Часто бывает, что после компиляции ядра Linux с собственными параметрами появляется сильное желание проверить, а как собственно оно работает и загрузится ли вообще. Сделать это можно тремя разными способами:
  1. Загрузить ядро на реальном железе
  2. Загрузить ядро, используя виртуальную машину
  3. Загрузить ядро, используя эмулятор
Загрузка ядра на реальном железе
Имеет свои достоинства и недостатки. Из достоинств можно сказать, что сделать это будет проще, чем используя виртуальные машины. Однако огромным минусом является то, что каждый раз, в случае любой неполадки, вам будет необходимо перезапускать операционную систему, загружаться со стабильного ядра чтобы подправить исходники, компилировать рабочее ядро, потом снова загружаться с него. Это очень утомительно и занимает много времени и неплохо описано на просторах интернета. Поэтому данный способ я затрагивать не буду.

Загрузка ядра, используя виртуальную машину

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

Загрузка ядра, используя эмулятор

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

Запуск нового ядра в qemu
Для запуска ядра необходимо сделать следующее:
  1. Скачать исходники ядра с сайта http://kernel.org/
  2. Cкомпилировать их, создав образ ядра и динамически подгружаемые модули ядра
  3. Создать виртуальный жесткий диск при помощи qemu-img
  4. Установить на него Ubuntu 10.10
  5. Перед новой загрузкой передать 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 (в хост-системе), указывая какое
    ядро ему следует загрузить:
    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 и самым новым ядром!

    суббота, 18 апреля 2009 г.

    PHP+MySQL+Apache

    Сейчас я работаю в компании TimeZYX программистом на C#. Не могу сказать что считаю себя отличным специалистом, но что уровень в программировании значительно поднялся и я узнал много нового - это факт. Однако, к сожалению, я даже не знаю и 30% от того, чтобы хотелось.
    А хотелось бы следующего знать и несколько языков программирования (не просто знать - знаю я итак несколько, а быть профессионалом, уметь писать качественные и надежные программы) и хорошо разбираться в операционных системах, web-программировании, база данных.
    Думаю всему свое время. Но скил постепенно прокачиваю. Недавно начал изучать web-программирование в свободное от работы время - html, css, php. А сегодня убил весь день для настройки сервера Apache вкупе с PHP-интерпретатором и MySQL. Я мало что понял в настройках, однако очень рад тому что все заработало. Никогда бы не разобрался, если бы не эта статья.

    вторник, 30 декабря 2008 г.

    Доброго всем времени суток. Наконец-то я открыл свой блог, о котором так долго мечтал. В нём будут описываться разные технические аспекты информационных систем. Будут освещаться те области, в которых я разбираюсь или постепенно начинаю разбираться.
    К сожалению, уровень моих знаний не позволяет здесь пока что-то очень интересное писать. Однако я буду расти, и мой дневник тоже. Очень интересно будет посмотреть прогресс в этом направлении.