Ну так вот, встала такая необходимость - до понедельника собрать загружаемый Livecd с Линуксом и некоторым набором своего софта.
Давно на примете было статейка: http://mydebianblog.blogspot.com/2007/09/1-livecd.html , по которой мы и будем собирать наш LiveCd, только я буду поподробнее описывать сам процесс установки линукс-системы в эмулятор qemu.
Собирать дистрибутив мы будем на основе OpenSUSE Linux 2007.0, а не на основе Дебияна, что объяснить довольно просто - Сусю я знаю немного получше (т.к. это моя рабочая ОС). Собираться все это будет под 32 разрядной SuSe Linux 10.3 (в итоге первая часть была собрана на 32 разрядной машине под 10.3, а сам дистрибутив уже под 64 разрядной 10.2, вот так вота), но лайвсиди будет 32 разрядный %)
Для начала небольшой ликбез по qemu: http://phpsuxx.blogspot.com/2007/09/opensu...c-qemu-kvm.html и http://phpsuxx.blogspot.com/2007/09/opensu...emu-kvm_04.html.
При сборке дистрибутива будем придерживаться т.н. Linux-way, то есть не будем изобретать велосипед и соберём все на основе уже готовых и достаточно хорошо отлаженных компонентов.
Для начала сольём весь необходимый софт:
- http://www.linuxdevcenter.com/linux/2007/07/05/examples/hello_printk.tar.gz - пример модуля ядра.
- ftp://ftp.slax.org/source/slax/kernel/2.6.21.5/src-core/config - конфиг для Лайв ядра.
- ftp://ftp.slax.org/Linux-Live/linux-live-6.1.5.tar.gz Linux Live scripts, т.е. скрипты для создания Live дистрибутива
сайт: http://www.linux-live.org
- Качаем Linux Live Scripts и Linux Kernel c сайта: http://www.linux-live.org
- Весь софт (а он весьма увесистый) немного позже выложу на наш локальный ФТП (справедливо только для абонентов провайдера ЭрТелеком в г. Самара).
Набор софта:- Не будет графической оболочки в принципе, т.к. задача написать свой аналог Кноппикса и прочих не стоит.
- GCC
- VIM
- MC (Файловый менеджер)
- Консольные браузеры
- Исходники патченного ядра, т.к. будет необходима сборка модулей
- Perl, не, а Вы что хотели лишить меня любимого языка программирования ? И не стыдно, а ?
- Пакеты поддержки PPPoE, дабы сборку можно было использовать как Rescue CD.
- Ну это... я ещу думаю
- Не будет графической оболочки в принципе, т.к. задача написать свой аналог Кноппикса и прочих не стоит.
- Создаём виртуальный диск:
#qemu-img create vdisk.img 5G
- Запускаем инсталляцию
modprobe kqemu # грузим модули поддержки
qemu -hda vdisk.img -cdrom путь_к_исо_образу_суси.iso -boot d -m 128
либо непосредственно с DVD диска, вставленного в привод хостовой машины:
qemu -hda vdisk.img -cdrom /dev/sr0 -boot d -m 128, где /dev/sr0 - имя вашего DVD привода.
При использовании OpenSuSe 10.2 грузим модули kvm вот в данном случаеж
Запускаем установку от имени рута:
qemu-kvm -hda vdisk.img -cdrom install-x86-minimal-2007.0-r1.iso -boot d -m 128
Если в ответ получаем следующее:
QUOTE
open /dev/kvm: No such file or directory
Could not initialize KVM, will disable KVM support
То делаем modprobe kvm и modprobe kvm_amd (или kvm_intel в зависимости от процессора) и повторяем операцию, все должно заработать и Вы увидите окошко запуска инсталляции.
Чтобы загружать модули kvm автоматически при старте openSUSE отредактируйте /etc/sysconfig/kernel и добавьте модули kvm в строку MODULES_LOADED_ON_BOOT=”…” . Или настройке их загрузку с помощью yast2 sysconfig.
А также в данном случае везде используейте qemu-kvm, вместо qemu.
- Ставим Сусе, убирая все лишее.В моём случае список необходимых пакетов имеет примерной такой вид
- tar
- bzip2
- mkisofs
- GCC
- nano
- kernel-sources (хотя можно их и не ставить)
- mc
- G++
- Perl
- vim
- tar
- Ждём окончания установки системы...
- Загружаем установленную систему: qemu -hda vdisk.img -cdrom /dev/sr0 -boot c -m 128
- Кофигурируем параметры системы, задаём пользователю root пароль SSAU, а пользователю student пароль 1.
- Ставим имя узла energy-live.
- Настройку сети пропускаем.
- Потом, после окончания всех установочных процедур отключаем сусе командой shutdown -h now
- Создаём папку cdrom и монтируем к ней наш образ:
# mount vdisk.img cdrom/ -t ext3 -o loop,offset=32256
cp linux-live-6.1.5.tar.gz linux-2.6.21.5.tar.bz2 linux-2.6.21.5-i486-1.tgz hello_printk.tar.gz config cdrom/
umount cdrom
Тем самым мы скопировали требуемые файлы в наш виртуальный образ.
- Грузим систему: # qemu -hda vdisk.img -cdrom /dev/sr0 -boot c -m 128
- Открываем файл /etc/fstab любым текстовым редактором и там видим в первой строчке запись вида вида: "/dev/disk/by-id/....part1", так вот меняем это безобразие на /dev/hda1.
- Так, насчет этого пункта у меня большие сомнения, лучше этого не делайте.
Открываем файл /boot/grub/menu.lst ищем там подобную штуку и меняем её везде на /dev/sda1.
- Перезагружаемся командой reboot (о ура, новый qemu научился-такие подхватывать рестарты системы и адекватно их обрабатывать), чтобы проверить работоспособность системы.
- Распаковываем наше бинарное ядро в систему (находясь в корневой папке /) tar -xvzf linux-2.6.21.5-i486-1.tgz
- Ядро будет распаковано в папку /boot под именем vmlinuz, переименуем его до адекватного имени: mv vmlinuz vmlinuz-2.6.21.5
- Открываем /boot/grub/menu.lst и добавляем внизу следующее:
title Energy Live!
root(hd0,0)
kernel /boot/vmlinuz-2.6.21.5 root=/dev/hda1 #именно hda1 %)
А в верху default 0 исправляем на default 2 и перезагружаемся с новым ядром.
- Вылезет пачка ошибок по поводу модулей и куча ругани на modules.dep , это решаем командой #depmod и последующей перезагрузкой для проверки.
- Проверка сборки модулей. берём файл hello_printk.tar.gz и переносим его в папку /root, распаковываем командой tar -xzf hello_printk.tar.gz, переходим в его папку и выполняем make, но получаем ошибку, т.к. исходников данного ядра у нас нету!
- Берем файл linux-2.6.21.5.tar.bz и переносим в папку /usr/src/, потом распаковываем его там командой tar -xjvvf linux-2.6.21.5.tar.bz
- переносим файл config в папку /usr/src/linux-2.6.21.5 под именем .config (#mv /config /usr/src/linux-2.6.21.5/.config)
- Переходим в папку с ядром: /usr/src/linux-2.6.21.5 и выполняем команды make oldconfig && make prepare && make modules_prepare Эти команды генерирую платформозависимые участки кода ядра, которые и будут использоваться при сборку модулей.
- Возвращаемся в нашу папку с модулем и повторяем процедуру сборки, посредством вызова команды make
- Модуль должен собраться успешно, после этого подгружаем его в ядро вызовом команды: insmod hello_printk.ko
- Если в самом низу вывода команды dmesg появилис строки Hello, World! то можно очень сильно радоваться , т.к. модули функционируют успешно !
- Переносим скрипты для лайвсиди в папку /tmp уомандой mv /linux-live-6.1.5.tar.gz и распаковываем их там. После этого переходим во вновь созданную папку и открываем файл .config , ищем в нём пункт "KERNEL=$(uname -r)" и заменяем его на "KERNEL=2.6.21.5"
- Запускаем скрипт сборки ./build сначала вводим "Energy Live!", потом /boot/vmlinuz-2.6.21.5, а потом ждем сжатия основных папок, что довольно не быстро... каково же ваше "двольно небыстро?" я хз, но у меня на настольнике (П4-1600\1Гиг оперы это потребовало бы около 5 часов, почему "бы", а потому, что я прерывал на 4м часу). А на ноуте с процессором Турион (у которого виртуализация на железном уровне) управился за где-то полтора часа.
- Следуя информационным надписям, можете либо создать загрузочную флешку, либо iso образ.
- Потом монтируем виртуальную ФС к хостовой машине и вытаскиываем оттуда образ исо, а также радуемся ;)
Классная статья, очень подробная. Только про модуль insmod hello_printk.ko
ReplyDeleteя что-то не понял, зачем оно.
Но вообще класс! Снимаю шляпу :-)
Спасибо за положительный отзыв :)
ReplyDeleteА insmod это вот для чего - изначально ЛайвСД задумывался для сборки и демонстрации работы модулей ядра, поэтому функция динамической загрузки модулей тестировалась в первую очередь, ну а когда редактировал черновик просто решил не удалять, вдруг кому пригодится для аналогичных целей.