Kexec

Материал из virt2real wiki
Перейти к: навигация, поиск

kexec --- это механизм ядра Linux, который позволяет запустить новое ядро linux (хотя и не только ядро linux) из-под текущего работающего ядра. kexec загружает в ОЗУ новое ядро, командную строку и необходимые образы initrd, затем передаёт новому ядру управление.

К сожалению имеющийся для virt2real загрузчик U-Boot не поддерживает работ с интерфейсом Ethernet платы, поэтому отладка ядра linux для virt2real осложнена неудобным процессом запихивания нового ядра на NAND/microSD-накопитель.

Использование kexec позволяет, запустив на virt2real linux и используя возможности linux по работе с Ethernet/usb-gadget, оперативно загрузить новое ядро в плату и передать ему управление. Преимуществом использования kexec является то, что отпадает надобность производить запись на накопители платы для пробы нового ядра. Кроме того, используя имеющиеся в GNU/Linux средства написания скриптов, возможно значительно упростить и ускорить процедуры опробования нового ядра.

Для проверки работы kexec на virt2real нам понадобится:

  • плата virt2real 1.1 c установленной microSD-картой, с которой virt2real успешно стартует linux;
  • инструментальная ЭВМ, работающая под управлением ОС GNU/Linux;
  • подключение инструментальной ЭВМ к последовательному порту UART0 (консоль virt2real); такое подключение возможно организовать по крайней мере двумя способами:
  • подключение инструментальной ЭВМ к virt2real по более производительному интерфейсу, нежели UART, например, Ethernet --- в этом случае придётся воспользоваться либо макетной платой второго этажа, либо платой подключения разъёма RJ45. Также возможно использовать ethernet-gadget или даже грузить данные в плату через UART, но такие возможности ниже рассмотрены не будут.


Содержание

0. Настройка инструментальной ЭВМ

Также для работы нам понадобится по крайней мере следующее ПО на инструментальной ЭВМ:

  • GNU make;
  • git;
  • autotools & friends.

Как проще установить это ПО описано в первом пункте раздела Процесс установки на странице Установка Virt2real SDK.

Примечание: ниже рассматриваются действия по настройке инструментальной ЭВМ для сборки ядра linux и kexec без использования SDK для virt2real. Если вы уже установили SDK для virt2real и попробовали пересобрать образ ПО для virt2real, то разумно передать в переменную CROSS_COMPILE путь к toolchain в каталоге SDK (что-то вроде install-sdk/codesourcery/arm-2013.05).

Добываем toolchain arm-codesourcery и устанавливаем его на инструментальную ЭВМ. Данный toolchain поставляется в виде tar-архива (то есть нет привязки к отдельным пакетным менеджерам, хотя кто-то будет рассматривать это как недостаток), а компоненты его можно разместить в любом разумном место файловой системы, но в соответствии с рекомендациями FHS (см. [1]) лучше произвести установку toolchain в каталог /opt:

# wget http://sourcery.mentor.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2013.05-24-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
# mkdir /opt/
# tar -C /opt -xz -f arm-2013.05-24-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

Ниже считается, что toolchain установле в каталог <install-path>.

Запомним путь к нему в переменной CROSS_COMPILE:

$ export CROSS_COMPILE=<install-path>/arm-2013.05/bin/arm-none-linux-gnueabi-


1. Сборка kexec

$ git clone git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git
$ cd kexec-tools
$ ./bootstrap
$ ./configure --host arm --prefix=/usr CC=${CROSS_COMPILE}gcc STRIP=${CROSS_COMPILE}strip
$ make

получили файл build/sbin/kexec.


2. Сборка ядра linux

Собираем ядро с поддержкой kexec и /proc/device-tree:

$ git clone -b virt2real-kexec.20140317 https://github.com/frantony/linux-davinci
$ cd linux-davinci
$ export ARCH=arm
$ make virt2real-kexec_defconfig
$ make uImage

получили файл arch/arm/boot/uImage.


3. Запись на microSD-карту

Кладём файл ядра uImage на первый раздел microSD-карты под именем uImage-3.9-kexec; туда же положим и kexec.


3.0 Запускаем linux на virt2real

3.1 Монтируем раздел microSD-карты

Монтируем раздел microSD-карты, откуда U-Boot загружает ядро:

[root@virt2real ~]# mkdir /tmp/boot
[root@virt2real ~]# mount /dev/mmcblk0p1 /tmp/boot/


3.2 Загружаем файлы на microSD-карту

Предположим, что virt2real подключена к локальной сети Ethernet. К этой же сети подключена ЭВМ с IP-адресом 192.168.1.1 (далее сервер); на указанной ЭВМ должен работать ssh-сервер.

Для определённости файлы kexec и uImage-3.9-kexec находятся на сервере в каталоге /tftpboot/.

Тогда для загрузки файлов на microSD-карту настраиваем eth0 и, копируем данный с сервера:

[root@virt2real ~]# ifconfig eth0 192.168.1.2
[root@virt2real ~]# scp 192.168.1.1:/tftpboot/uImage-3.9-kexec /tmp/boot
[root@virt2real ~]# scp 192.168.1.1:/tftpboot/kexec /tmp/boot
[root@virt2real ~]# umount /tmp/boot


3.3 Загрузка ядра вручную

Перезагружаем virt2real и прерываем загрузку, чтобы перейти в консоль U-Boot. Грузим новое ядро вручную:

virt2real ># set bootargs "lan0=on console=ttyS0,115200n8 root=/dev/mmcblk0p2 rw rootwait ip=off"
virt2real ># fatload mmc 0 ${loadaddr} uImage-3.9-kexec
virt2real ># bootm


3.4 Проверка kexec

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

[root@virt2real ~]# mkdir /tmp/boot
[root@virt2real ~]# mount /dev/mmcblk0p1 /tmp/boot/ -o ro
[root@virt2real ~]# /tmp/boot/kexec --atags --command-line="console=ttyS0,115200n8 root=/dev/mmcblk0p2 rw rootwait ip=off" -l /tmp/boot/uImage
[root@virt2real ~]# /tmp/boot/kexec -e