Советы по работе над курсовым по сиспрогу на основе ядра Linux

Литература

Организация рабочего места

В соответствии с текущими воззрениями Крищенко В.А. Сделана попытка максимально упростить работу студента.

Для работы вам потребуется:

  • какой-нибудь установленный GNU/Linux (виртуальный или реальный --- неважно);
  • эмулятор терминала (вы найдёте его в меню системы);
  • примерно 3Gb свободного места на диске;

Эмулятор Qemu

  • Эмулятор Qemu удобен тем, что может грузить ядро Linux без установки его в виртуальную машину.
  • В ряде дистрибутивов к сожалению, с ним постоянно проблемы. Инструкция по их исправлению самосбором из исходников, рекомендуется в любом случае. В настоящий момент обязательно для Ubuntu (Kubutnu), Debian и Fedora. Возможно, проблема в чём-то ином, но после пересбора всё работает.

Устанавливаем нужное ПО

В случае Ubuntu или Debian выполняем следующую команду:

apt-get install build-essential libncurses-dev git-core

Образ системы и исходники ядра

  •  Образ системы Debian, архитектура i386.
  • Предлагаемые  исходники ядра, включают сокращённую конфигурацию специально для Qemu.

Развёртывание системы

Разворачиваем скаченные архивы.

tar xf linux-2.6.31.4-qemu.tar.bz2
tar xf DebianLenny-x86-QEmu.tar.bz2
mkdir modules
cd linux-2.6.31.4-qemu

В итоге у вас будут такие директории (в modules вы будете создавать свои модули ядра):

linux-2.6.31.4-qemu
DebianLenny-x86-QEmu
modules

Можете удалить сами скаченные архивы, если ощущаете недостаток места (это примерно 600Мб).

Рабочий процесс

Сборка ядра

Сама эмулируемая система у нас 32-х битная, а вот ваша базовая система может быть как 32-х, там и 64-х битной. В случае базовой 64-х битной системы следует отключить x86-64, выполним следующую команду.

make menuconfig ARCH=x86

В открывшемся после выполнения команды убеждаемся, что 64-х битная архитектура отключена (64-bit kernel , первый пункт). Если не отключена --- отключаем, затем выходим из меню.

Сама сборка ядра производится следующими командами.

make ARCH=x86 # повторять при изменениях в исходниках ядра
make modules_install ARCH=x86 # это для выданной конфигурации достаточно выполнить однократно

Запуск эмулятора

Предполагается, что вы находитесь в директории с ядром.

qemu -kernel arch/x86/boot/bzImage -append 'root=/dev/hda1 ro console=ttyS0,115200n8' \ 
     -hda ../DebianLenny-x86-QEmu/hda.img -serial stdio -redir tcp:10122::22

Теперь вы можете войти в эмулируемую систему по ssh. Пароль: 1.

ssh -p 10122 root@localhost

Изменение исходников ядра

При работе с исходниками настоятельно рекомендуется использовать локальную систему контроля версий git. Для этого достаточно после начальной сборки неизменённого ядра создать репозиторий в каталоге с исходниками ядра и зафиксировать их текущее состояние (предполагается, что вы будете менять только файлы на языке Си).

git init
git add *.c *.h 
git commit -am "initial sources"

Теперь команда git diff будет выдавать патч с вашими изменениями.

git diff > ../mypatch

Настоятельно рекомендуется делать фиксацию после внесения работающих изменений. Более подробно о дальнейшем использовании Git написано в пособии и здесь.

Создание новых модулей ядра

Создание и сборка модуля

Возьмите пример модуля и сохраните его в каталог modules, который был создан на первом этапе.

Если вы используете другую версию ядра, измените значение KERNELVERSION в сценарии сборки в файле Makefile. Обратите внимание, что переменная KERNELDIR в этом же сценарии зависит от расположения ваших исходников (если вы следуете нашим рекомендациям --- ничего менять не надо).

Общая культура программирования, конечно же, говорит вам, что следует использовать систему контроля версий и при работе с модулем.

Для сборки модуля ядра войдите в каталог modules и выполните команду make

Установка модуля

Копирование модуля module.ko в запущенную эмулируемую систему и его установка:

scp -P 10122 module.ko root@localhost: # копирование, ":"  в конце--- обязателен
ssh -p 10122 root@localhost "insmod module.ko" # установка

Ключевой здесь является команда insmod. Команда scp используется для копирования файлов по сети поверх ssh.

Примечание: если при попытке установить соединение по ssh вам выдется ошибка о несоответствии ключей, удалите файл known_hosts из подкаталога .ssh своего домашнего каталога.

Удаление модуля

Зайдём теперь по ssh в виртуальную машину и удалим установленный модуль.

ssh -p 10122 root@localhost # пока что она спрашивает здесь пароль
rmmod module.ko # удаляем модуль

После установки и удаления модуля команда

dmesg | tail -n2

покажет примерно следующее

[  104.792007] [TEST] Module loaded
[  122.972007] [TEST] Module unloaded

Ура! Теперь вам осталось всего лишь выполнить ваше задание.

Прочие советы

Вход по SSH без пароля

Чтобы не вводить постоянно пароль эмулируемой машины, можно перейти на сертификацию по ключу. Запустите эмулятор и выполните следующие команды в вашей основной машине. Вас попросят ввести пароль после второй и третей команды.

# Однократная генерация публичного ключа.
test -e ~/.ssh/id_dsa || ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ''
# Создание директории /root/.ssh на виртуальной машине.
ssh -p 10122 root@localhost "mkdir .ssh"
# Копирование на виртуальную машину публичного ключа.
cat ~/.ssh/id_dsa.pub | ssh -p 10122 root@localhost "cat >> .ssh/authorized_keys"

Готово! Если хотите, вы можете использовать и RSA ключ, конечно же (замените dsa на rsa в трёх местах).

Attachments

  • Makefile Download (1.0 KB) - added by krishchenko_va_mstu 7 years ago. Сценарий сборки модуля
  • module.c Download (219 bytes) - added by krishchenko_va_mstu 7 years ago. Пример модуля