TODO: Сделать со статьёй:

  1. Отформатировать всё по заголовкам
  2. Публикуем.
  3. Поправить раздел установки debian

Задача (абстрактно)

Установить виртуальную машину в рамках которой будет собираться ядро Linux

Задача (частно)

Установить Debian 7 в виртуальную машину, в рамках которого будет собираться модуль ядра Linux xt_reductor и запаковываться в deb-пакет с дополнительным userspace, все исходники кроме оригинального ядра Linux будут использовать git и обновляться на последнюю версию автоматически, плюс поддержка ведения нескольких веток разработки и соответственно их сборки.

Дано

SSH на рабочий комп через 3G через VPNСкука в транспортеНетбукРешение

Качаем ISO debian

wget http://cdimage.debian.org/debian-cd/7.1.0/amd64/iso-cd/debian-7.1.0-amd64-CD-1.iso -O /storage/iso/debian-7.1.0-amd64.isoЧтобы не держать терминал со скачиванием - форкаем его и отключаемся от консоли:> setsid bash -c “wget http://cdimage.debian.org/debian-cd/7.1.0/amd64/iso-cd/debian-7.1.0-amd64-CD-1.iso -O /storage/iso/debian-7.1.0-amd64.iso” & disown -aУстановка виртуалкиДелается с помощью команды virt-install. Для дальнейшей настройки потребуется установленный virt-viewer. Команда для virt-install:sudo virt-install -n reductor_buildsystem_debian_7.1 -c /storage/iso/debian-7.1.0-amd64.iso -r 1024 –vcpus=2 –os-type=linux –os-variant=generic26 –network bridge=br0,model=e1000 –disk path=/qemu/img/debian7.img,size=25,format=qcow2,cache=writeback Что означают параметры:-n <имя виртуалки="">-c <путь к="" iso-образу="" для="" установки="">-r <объём оперативки="">--vcpus=<количество ядер="">--os-type=<тип ос,="" у="" нас="" linux="">--os-variant=<вариант ос,="" я="" выбираю="" обычное="" ядро="" 2.6="">--network bridge=<мост в="" который="" добавить="" сетёвку="">,model=<что эмулировать="">--disk path=<путь до="" диска,="" если="" его="" нет="" -="" создастся="" новый="">size=<объём диска="" в="" гб="">format=<формат, рекомендую="" qcow2="">cache=<тип кэширования,="" ускоряет="" работу="" с="" диском="">25 гигабайт не так уж много, хоть всё и влезет на 8гб, я считаю хорошим тоном перестраховаться чтобы потом не тратить время на ручное увеличение размера диска или создание, добавление и монтирование нового, тем более что сразу все 25гб выделяться не будут.Установка debian внутри виртуалкиПока дописал эту часть статьи debian как раз докачался. За разбивку диска можно не заморачиваться, втыкать всё в один раздел, разве что оставив места под swap (около 512 мегабайт), всё остальное практически далее-далее-готово.Страх и ненависть начинаются в момент, когда для установки debian требуется гуёвое окошко virt-viewer, вообще надо бы раскурить как по правильному цепляться по vnc к виртуалкам и без всяких надстроек, но как всегда нет времени поэтому будем извращаться и запускать virt-viewer с пробросом X'ов через SSH. Цепляемся к рабочему компу по ssh с ключом -X:ssh -X oleg@1.2.3.4 virt-viewer reductor_buildsystem_debian_7.1Наблюдаем за меееедленнооо появляющимся окошком и стараемся сохранять спокойствие - всё работает очень медленно. Осознаём неловкий момент - VNC графика автоматически настраивается virt-install'ом только в случае если в момент подключения в окружении определены переменные для доступа с помощью X'ов. Убиваем, удаляем и пересоздаём виртуалку.virsh destroy reductor_buildsystem_debian_7.1virsh undefine reductor_buildsystem_debian_7.1Через пару минут огорчаемся от того, что прикольную фоновую заставку 6й версии опять заменили какой-то абстракцией. Выбираем пункт install, жмём enter.Вообще не хватает прикольной фичи которую мы в Carbon Soft запилили в свою платформу - ssh в initrd, пока не проникнешься возможностью установки дистрибутива по SSH прямо внутри него - не поймёшь зачем раздувать и без того немаленькие нынче initrd'шки.Собственно почему написал об этом - хотел проверить - а мало ли, debian'щики тоже прониклись и поставили ssh в initrd, только надо его вручную запускать, жмахнул exec shell и так и не дождался запуска ash.А не, просто на нетбуковский экран приглашение не влезло - втоой минус зато нашёл - нет драйверов сетёвок в установщике, так что от ssh толку бы не было.Жалко, жалко. (на самом две .ko'шки в drivers/net были, только хз зачем.Ладно, видим значит мы менюшку и идём в первый пункт, выбираем Russian язык, чтобы доллго не листать можно нажать shift=R.Рассказываем где мы живём, какая у нас клавиатура.Выбираем как будем переключаться между раскладками.Дальше происходит магия, подгружается модуль usb-storage, ищется CDROM, запускается продолжение установки.Дальше он таки настраивает сеть, это нам нафиг не надо.Придумываем пароль для рута, юзера, и ему пароль тоже.С разбивкой не заморачиваемся, ставим всё в автоматическом режиме на один диск в один раздел.Дальше нас спрашивают о том, не хотим ли мы воткнуть второй диск для установки с него дополнительных пакетов, нам это не нужно, зеркало из сети заюзать можно, если не лень ждать пока всё будет вытягиваться и обновляться.Дальше всё пойдёт автоматически, до момента пока базовая система не будет установлена, там нас спросят о том, что нам собственно от системы нужно и что установить. Оставляем только SSH-Server и стандартные системные утилиты, больше из предложенного нам ничего не понадобится. Дальше будут вопросы про grub из серии далее далее готово.Отлично - система установлена и можно развлекаться.Делаемvirsh start reductor_buildsystem_debian_7.1virt-viewer reductor_buildsystem_debian_7.1Настройка сетиПроникнувшись духом rhel сложно вернуться к debian и многое кажется нелогичным. К примеру настройка сетевых интерфейсов в одном файле. В общем идём в /etc/network/interfaces, открываем его c помощью vi или чего там ещё в debian есть и прописываем что-то в духе:auto lo eth0iface lo inet loopbackiface eth0 inet static        address 10.0.0.165        netmask 255.255.0.0        gateway 10.0.0.1Небольшая ремарка - наконец-то они добавили новый ipset, который давно уже используется в RHEL, а то я шизанулся переписывать команды типаipset create https iphashна ipset --create https iphashПоставить необходимые для сборки инструментыКак минимум это gcc, но для выполнения make menuconfig нам понадобится ещё пачка всего, поэтому вот один большой список пакетов, который мы кормим apt-get'у:apt-get install vim git openssh-serverДобыть исходники ядра apt-get install linux-source-3.2Вспоминаем что debian это вам не rhel, поэтому всё нужно делать ручками и нельзя просто так взять и yum install kernel-sourcerpmbuild -ba kernel.specРазбираемся в том, что нам дал этот пакет:root@debian7:/opt# dpkg -L linux-source-3.2/./usr/usr/src/usr/src/linux-source-3.2.tar.bz2/usr/src/linux-patch-3.2-rt.patch.bz2/usr/share/usr/share/doc/usr/share/doc/linux-source-3.2/usr/share/doc/linux-source-3.2/copyright/usr/share/doc/linux-source-3.2/README.Debian/usr/share/doc/linux-source-3.2/changelog.Debian.gzПоэтому распаковываем:root@debian7:/usr/src# tar xfj linux-source-3.2.tar.bz2 realtime нам не нужен, удаляем патчик.root@debian7:/usr/src# rm -f linux-patch-3.2-rt.patch.bz2 Муваем папку в более привычное место:mv /usr/src/linux-source-3.2 /usr/src/linuxЗаходим туда и пробуем сделать menuconfig, обламываемся наmake[1]: *** [scripts/kconfig/dochecklxdialog] Ошибка 1Видим предложение *** Install ncurses (ncurses-devel) and try again.и ставим ихapt-get install libncurses-devОтлично, менюшка появилась. Самым первым делом, если вы собираете что-то для production, то выключите в Kernel Hacking:Compile the kernel with debug infoСохраните конфиг и готовимся к сборке. Зачем отключать дебаг? Чтобы после сборки получить:root@debian7:/usr/src/linux# du -sh .1,5G .вместоroot@debian7:/usr/src/linux# du -sh .8,7G .Пока не начали сборку - делаем git-репу внутри. Радуемся что в Debian уже есть преднастроенный .gitignore, но во многих проекта .config ядра - одна из важнейших частей, поэтому исключаем его из игнора - после:.*пишем:!.configвыполняемmake cleangit initgit add .git commit -m "initial commit"Отлично, дальше все изменения не будут потеряны. Настройка ccacheПо идее настраиваем ccache, потому что он здоровски экономит время повторных сборок ядра. Об этом есть неплохая статейка у одного парня:http://linuxdeveloper.blogspot.ru/2012/05/using-ccache-to-speed-up-kernel.htmlЯ приведу её краткий перевод:apt-get install ccacheя билдю ядро из под рута, так что:vim ~/bashrcи дописываем туда:export CCACHE_DIR="/root/.ccache"export CC="ccache gcc"export CXX="ccache g++"export PATH="/usr/lib/ccache:$PATHВыполняемsource ~/.bashrcccache -M 4GДумаю отличным вариантом будет оформить сборку в виде скрипта который запустить, а самому лечь спать:#!/bin/bashmake allmake allЗапускаем его так:setsid bash -c "./make.sh" & disown -aИ отключаемся от сервера до утра. Теперь немножко фантастики, если ничего не изменилось сборка просто моментальна:root@debian7:/usr/src/linux# time make -j 3 modules SUBDIRS=net/netfilter  Building modules, stage 2.  MODPOST 107 modulesreal 0m1.195suser 0m0.936ssys 0m0.088sroot@debian7:/usr/src/linux# time make -j 3 modules real 0m43.422suser 0m37.546ssys 0m8.569sРазвёртывание системы сборки ReductorEto takaya fantastika! Следующее действие для меня - развернуть систему сборки Carbon Reductor на этой виртуалке поверх /usr/src/linux/ и проверить - мало ли, netfilter никто не трогал и модуль от 2.6.32 идеально собирается и в 3.2.0?Скоро систему сборки я унифицирую до конца и выложу на github, так что сразу и начну писать примеры её использования :)Копирую с CentOS 6.4 тупо весь каталог:[root@reductorbuilder linux]# tar cfz generator.tar.gz generator[root@reductorbuilder linux]# scp generator.tar.gz root@1.2.3.4:/usr/src/linux/root@debian7:/usr/src/linux# tar xfz generator.tar.gz root@debian7:/usr/src/linux# cd generator/root@debian7:/usr/src/linux/generator# make allИ обламываемся на отсутствии SSH-ключей, когда нас отлупливает gitolite в момент попытки обновить исходники.root@debian7:/usr/src/linux/generator# ssh-keygenroot@debian7:/usr/src/linux/generator# cat /root/.ssh/id_rsa.pubи добавляем их в  гитлаб.Добавление нового модуля в ядро LinuxДобавление записи в /usr/src/linux/.configCONFIG_NETFILTER_XT_MATCH_REDUCTOR=mПравим Makefile и Kconfig в каталоге расположения модуляВ /usr/src/linux/net/netfilter/Kconfig в нехитром формате описывается данный модуль:config NETFILTER_XT_MATCH_REDUCTOR        tristate '"reductor" match support'        depends on NETFILTER_ADVANCED        ---help---        Super effective url-filter, powered by super-signatures.в /usr/src/linux/net/netfilter/Makefile дописывается описание процесса сборки.obj-$(CONFIG_NETFILTER_XT_MATCH_REDUCTOR) += xt_reductor.oЗатем идём в /usr/src/linux и делаем make menuconfig, чтобы проверить появление нужного пункта, что означает, что мы всё сделали правильно.   "reductor" match supportОтлично, нужный пункт есть. Пробуем собрать, экономя своё время (указывая SUBDIRS):make -j 3 modules SUBDIRS=net/netfilter/Кстати, мне повезло и я получил всего 9 warning, которые очень быстро залечу :)Ничего серьёзного в netfilter не поменялось, и это меня радует.Настройка цвета в консоли и vim</тип></формат,></путь></вариант></тип>По умолчанию в debian почему-то отключены цвета в консольке и vim. Нелогично, но излечимо: Собственно берём и раскомментируем пару строчек в bashrc.vim /root/.bashrc# You may uncomment the following lines if you want ls' to be colorized:export LS_OPTIONS='--color=auto'eval "dircolors`“alias ls=’ls $LS_OPTIONS’alias ll=’ls $LS_OPTIONS -l’alias l=’ls $LS_OPTIONS -lA’С vim почти то же самое.vim /etc/vim/vimrcснимаем комментарий с syntax on:” Vim5 and later versions support syntax highlighting. Uncommenting the next” line enables syntax highlighting by default.syntax onзаодно включаем autoindent:” Uncomment the following to have Vim load indentation rules and plugins” according to the detected filetype.if has(“autocmd”)  filetype plugin indent onendifДело вкуса, конечно, но дефолтная цветовая схема vim неахти. В конец дописываем:color ronи радуемся (если, конечно у нас тема терминала светлый текст на тёмном фоне).