Пользователь
0,0
рейтинг
16 августа 2011 в 15:57

Администрирование → Создание операционной системы на базе ядра linux. С нуля из песочницы

Рано или поздно каждый пользователь Линукса задумывается над созданием собственного дистрибутива. Некоторые аргументируют это тем, что можно «все настроить под себя». Другие сетуют на то, что среди уже представленных дистрибутивов в Ветке нет идеального. А у них, якобы, есть суперконцептуальные идеи для собственной системы. Зачем я всю эту психологию затеял? Для того, чтобы сразу перекрыть кислород играющимся с Линуксом новичкам, которым делать нечего. Если уж задумались над созданием ОС, думайте до конца. Итак,

Я хочу создать ОС на базе Linux.
Сразу предупреждаю: был бы XVIII век, всех тех, кто для основы своей будущей системы выбирает другой развитый дистрибутив (и, не дай Бог, популярный...) ждала бы виселица. Пост именно про создание системы с нуля, а значит, всякие Slax и Linux Mint мы трогать не будем.

Шаг 1. Выбор носителя
Вариантов немного: либо ваша ОС запускается с LiveCD, либо с жесткого диска, либо с флеш-устройства. Сразу оговорюсь: не скажу в посте ни слова про жесткий диск, потому что гораздо удобнее создавать гибкий дистрибутив из серии «все свое ношу с собой», либо залоченный дистрибутив на оптическом диске. Если вы научитесь создавать LiveCD или LiveUSB систему, с установкой на жесткий диск проблем не будет.

На всякий случай, приготовьте чистую флешку, CD-диск, и установите, наконец, Virtualbox.

Шаг 2. Компиляция ядра
По поводу выхода третьего ядра Linux, этот шаг воодушевляет на дальнейшие разработки… Итак, нам нужны исходники ядра. Каждый пользователь знает, что их можно достать на сайте kernel.org. Ни в коем случае, слышите?, никогда не прикручивайте к своей системе постороннее ядро, скомпилированное не вами!

image

Поскольку лень моя зашкаливала, я создал папку /linuxkernel и распаковал туда архив с исходниками. Залогинившись под рутом, я сделал следующее:

cd /linuxkernel
make menuconfig


В принципе, ядро можно конфигурировать тремя способами: make config (диалоговая конфигурация), make menuconfig (псевдографическая конфигурация через ncurses), а также make xconfig (графическая конфигурация). Суть в том, что make config испортит вам настроение надолго, т.к. он задаст все возможные вопросы по всем аспектам всех тем. Проблема с make xconfig встречается не у всех, но вот у меня встречалась и встречается. Если приспичило сделать через X, разбирайтесь сами. Оптимальный вариант — make menuconfig. Эта штука откроет вам псевдографический интерфейс, через который вы сможете настроить ядро на свой лад. Штука требует библиотеки ncurses, которая легко устанавливается.

image

В принципе, если ваш мозг хоть сколько понимает Линукс, вы разберетесь с конфигурированием. Процесс это интересный, вариантов действительно много, а справка, хоть и на английском языке, но все же радует своей доступностью и простотой.

Однако, направить вас все же придется. Перейдите по адресу File Systems ---> и поставьте необходимые звездочки. Буква M означает, что поддержка того или иного драйвера осуществляется с помощью подключения к ядру внешнего модуля (ненавижу их!). Нам понадобится также поддержка isofs, для чтения дисков. File Systems ---> CD-ROM/DVD Filesystems ---> ISO 9660 CDROM file system support. Можно еще поддержать древнедосовские системы.

image

Чмошные разработчики Mandriva забыли разрешить File systems ---> DOS/FAT/NT Filesystems ---> NTFS write support, и на одном из их дистрибутивов я мучился с доступом к древневиндовскому разделу.

Посмотрите Processor type and features ---> Processor family, мне порекомендовали выбрать Pentium-MMX.

Еще поройтесь в Device Drivers, полезно. Можете шутки ради понавыбирать там все и скомпилировать ядро весом > 50 Мб.

Далее. Ядро после загрузки себя должно загружать, собственно, систему. Либо из скомпилированных в себе файлов (используются во встраиваемых системах), либо из CPIO архива, сжатого чем-нибудь, либо из Initrd. Здесь вам не DOS, здесь не получится сразу сослаться на какой-нибудь init'овый файл в корневом каталоге диска или флешки. На самом деле получится, не слушайте дядю Анникса! Неправильно это, хоть в Интернете по этому поводу уже нехилая полемика ведется. В своей системе мы будем использовать initrd, т.к. это удобно, и не вызовет нецензурных выражений от сторонних разработчиков, в отличие от CPIO архива.

Ах, да, скомпилируйте ядро командой

make bzImage

Если у вас x86, найдете его по адресу /linuxkernel/arch/x86/boot/bzImage.

Для суровых челябинских программистов можно использовать Кросс-компайлинг…

Создание Ramdisk.

Теперь нам нужен initrd с установленной там простейшей оболочкой. Мы будем использовать busybox, потому что эта няша может все. Способ мы украдем у Роберто де Лео, создателя Movix (я бы даже уважать его начал, если бы не запредельная любовь к Perl):

dd if=/dev/zero of=/dev/ram0 bs=1k count=5000 - Создаем Ramdisk в оперативной памяти нашего компьютера.
mke2fs -m0 /dev/ram0 5000 - Форматируем Ramdisk в системе Ext2
mkdir /distro - Создаем папку
mount /dev/ram0 /distro - Монтируем в папку /distro


Все, теперь у нас есть Ramdisk, емкостью в 5 Мб. Можно и больше, только не нужно. В отличие от Томаса Матеджисека, я не собираюсь пичкать initrd модулями в Squashfs, сжатыми LZMA. Все, что необходимо, будет скомпилировано вместе с ядром. Да, это не очень логично и правильно, но мороки в сто раз меньше. А специально для тех, кто осуждает такой подход, можно разрешить опцию модульности в ядре: Enable loadable module support.

В нашем Ramdisk'е, смонтированном в /distro, есть такая папка, lost+found. Это потому, что мы отформатировали его в ext2. Ни в коем случае нельзя ее удалять, хоть она здесь вряд ли поможет, образ-то фиксированный. Нам бы busybox сначала поставить…

Установка Busybox
Вот почему у таких классных проектов такие отстойные сайты? Хотя… это уже не суть важно, если исходники скачаны и успешно распакованы в папку /busybox.

image

Сконфигурировать busybox можно так же:

cd /busybox
make menuconfig


image

Если вы еще не поняли, что это, объясню. Busybox заменяет тонны UNIX приложений, хранящихся в папках /bin, /sbin, /usr/bin, /usr/sbin. Вместо этого, создается только одно приложение: /bin/busybox, а на него создается куча ссылок в указанных выше папках. Установим busybox следующей командой:

make CONFIG_PREFIX=/distro install

Еще Busybox создаст файлы /sbin/init и зачем-то /linuxrc, чтобы ваша система корректно запустилась. Но не все необходимые папки были созданы. Так что завершаем все руками и создаем:

/distro/etc
/distro/lib
/distro/dev
/distro/mnt
distro/proc
/distro/root
/distro/tmp
/distro/root


Если что забыл — вспомните, т.к. директории эти забыть сложно.

Все бы хорошо, вот только busybox для работы требует библиотеки, которые нужно скопировать в наш дистрибутив. Очень легко узнать, какие:

ldd /distro/bin/busybox

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

При копировании библиотек можно отсекать отладочную информацию (так Роберто советует):

objcopy --strip-debug откуда куда

Делаем из Линукса Линукс

Надо создать несколько системных текстовых файлов:

Нам нужен /etc/inittab. Удивлю вас: в начале жизни система даже не знает, что такое Root. У нас даже пользователь безымянный, но вот файл общесистемных низкоуровневых фич (ОНФ) должен присутствовать. Пилотное содержание файла следующее:

::sysinit:/etc/rc.d/rc.S

# Запустить оболочку в консоли.
::respawn:-/bin/sh

# Перезагрузка по нажатии на Ctrl+Alt+Del.
::ctrlaltdel:/sbin/reboot

# Команды, выполняемые перед выключением и перезагрузкой.
::shutdown:/sbin/swapoff -a >/dev/null 2>&1
::shutdown:/bin/umount -a -r >/dev/null 2>&1


Следующий файл — /etc/fstab. Это таблица, в которой описано, что и куда монтировать при загрузке. Вещь бесполезная! Нам нужно обязательно смонтировать proc, иначе вообще ничего работать не будет, так что в файле пишем:

none /proc proc defaults 0 0

Для mount нужен также файл /etc/mtab. Создайте его и оставьте пустым.

Но mount сделает все необходимое только тогда, когда мы явно его об этом попросим. А просить мы будем в том самом первозагрузочном файле /etc/rc.d/rc.S (rc.d — папка). Вежливо попросим:

#!/bin/ash

/bin/mount -av -t nonfs


Еще нам необходим файл профиля (b)(a)sh, тут вообще раздолье для фантазии. Создаем файл /etc/profile и заполняем следующим:

PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:"
LESS=-MM
TERM=linux
HOME=/root
PS1='> '
PS2='> '
ignoreeof=10
export PATH DISPLAY LESS TERM PS1 PS2 HOME ignoreeof


Понадобится также файл /etc/shell, в котором указано, что есть оболочка:

/bin/sh
/bin/ash
/bin/bash


Вот собственно и все. Можно записывать наш Ramdisk в файл.

mkdir /os - папка для "готового".
umount /dev/ram0 - размонтируем кусочек оперативной памяти.
dd if=/dev/ram0 of=/os/initrd bs=1k count=5000 - создаем файл.
gzip /os/initrd - сжимаем файл initrd


Создание загрузочной флешки

«Финишная прямая» нашей маленькой разработки. Берем флешку, вставляем, форматируем в vfat (можно и в ext, но не забывайте, что еще не все пользователи Windows застрелились).

На флешке создаем папку boot, в ней папки initrd и kernel.

Из папки /os копируем сжатый Ramdisk в папку boot/initrd на флешке, называем «main.gz». Из папки с исходниками ядра копируем bzImage в папку boot/kernel на флешке, называем «main.lk». Достаем файлы загрузчика Syslinux (в Интернете, либо из другого дистрибутива: тут не принципиально), а именно syslinux.bin, syslinux.boot, syslinux.cfg. Копируем их в корневой каталог нашей флешки. В файле syslinux.cfg пишем что-то подобное:

default mm
prompt 1
timeout 100
label mm
kernel /boot/kernel/main.lk
append initrd=/boot/initrd/main.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label mc
kernel /boot/kernel/main.lk
append initrd=/boot/initrd/custom.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label cm
kernel /boot/kernel/custom.lk
append initrd=/boot/initrd/main.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label cc
kernel /boot/kernel/custom.lk
append initrd=/boot/initrd/custom.gz load_ramdisk=1 ramdisk_size=5000 rw root=/dev/ram0
label hd
localboot 0x80


Тем самым мы поддержали кастомные initrd и ядро, которые, эксперимента ради, можно подключить к нашему дистрибутиву.

Узнаем, каким девайсом в системе является наша флешка (можно запустить mount без параметров и посмотреть). Это либо /dev/sdb1, либо /dev/sdc1, либо /dev/sdd1. Стоит отмонтировать флешку перед началом установки.

Устанавливаем syslinux (если пакета в системе нет, apt-get install syslinux):

syslinux -d путь_к_устройству

В корневом каталоге флешки должен появиться файл ldlinux.sys. Если он есть, значит syslinux.bin, syslinux.boot больше не нужны.

image

Как настроить BIOS на загрузку из флешки, я вам рассказывать не буду — это легко. Скажу только, что очень удобно создать папку /boot/initrd/init, в которую можно будет смонтировать /boot/initrd/main, для последующей работы с ним. Только не забудьте разжимать и сжимать его gzip'ом.

Ну вот и все.

Как-бы я только что рассказал вам, как создать с нуля систему на Linux. Легко, не правда ли? Далее вы можете редактировать скрипт /sbin/init, ведь у вас еще много работы! Вы должны будете написать скрипт для монтирования флешки, который делает chroot в корневой каталог. В противном случае, вы вынуждены будете работать с ReadOnly разделом, величиной в 5 Мб. Но это уже совсем другая история.

Unnx Davis T, B.

Для непросвещенных:

Томас Матеджисек — создатель Slax и Linux Live Scripts.
Роберто де Лео — создатель Movix.
Анникс Дэвис @unnx
карма
1,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (61)

  • НЛО прилетело и опубликовало эту надпись здесь
    • +6
      слегка?
      • НЛО прилетело и опубликовало эту надпись здесь
        • +1
          да, у меня тоже.
  • +28
    > make menuconfig
    make nconfig

    > initrd
    initramfs

    Вывод: статья из прошлого.
    • 0
      Не совсем понял аргумент «make nconfig», в чем его современность?
      • 0
        В том, что он основан напрямую на ncurses, а не на lxdialog.
        • +1
          Ясно, а то внешне оно какое-то не такое удобное, хотя теоретически, догадываюсь что цветовую схему можно поменять…
  • +1
    gentoo же?!
    • +24
      Linux from scratch.
    • НЛО прилетело и опубликовало эту надпись здесь
  • +21
    а чем автору LFS не угодил?
    • +12
      Первое, что сделал ctrl+f LFS. Нашел только в комментарии выше. И поддерживаю его.
      • +3
        Плюсую, тоже не понял чем LFS не айс.

        Стоило бы хотяб ссылку на www.linuxfromscratch.org/ дать, раз уж статья для ленивых.
    • 0
      LFS можно собрать с помощью копипаста.
      • +1
        Это смотря какую цель ставить. Если просто похвастаться фактом сборки, то да, метод копипаста вполне сойдет (хотя голову в любом случае включать придется). Если же хочется чему то научиться, то человек не будет просто бездумно перебивать команды, а постарается разобраться что к чему. Каждому свое, одним словом.
  • +6
    Автор, имхо на хабре мало настолько непосвященных, заголовок явно чересчур амбициозен =)
  • +4
    Так с нуля или с ядра? :)
    • 0
      Так на основе Linux же.
  • +55
    > Рано или поздно каждый пользователь Линукса задумывается над созданием собственного дистрибутива.

    Ахахахахаха! Аааахахахахахаха. Оооохохохохо. Ффух. Спасибо.
    • +6
      Надеюсь, не скоро задумаюсь об этом.
      • +3
        Надеюсь, никогда не задумаюсь об этом.
    • 0
      после прочтения статьи в первый раз задумался. хитрый план!
    • –2
      Это не смешно, это печально! ;)
    • 0
      А то мне уже стыдно стало, что я об этом не задумываюсь.
  • +9
    Чмошные разработчики Mandriva забыли разрешить File systems ---> DOS/FAT/NT Filesystems ---> NTFS write support, и на одном из их дистрибутивов я мучился с доступом к древневиндовскому разделу.

    Автор соответствует правилам Хабра?
    • +1
      FUSE не спасает?
    • +1
      по правилам хабра он должен заминусовать разработчиков.
  • +25
    Дениска, ты?
    • 0
      image
      таки BolgenOS =)))
      *не, он там над убунтой кажется издевался
      • 0
        Ну он там, помнится, и LFS мучал.
        • +5
          Он там кажись вообще сначала собирался сделать свой GNU с копирайтами и обоями, а потом и своё ядро.
      • +9
        Прочитав заголовок сразу начал искать коммент про BolgenOS…
        • НЛО прилетело и опубликовало эту надпись здесь
    • +2
      Дэвис — почти как Денис ;)
      И всего одна активность на Хабре ;)
  • –3
    Еще одна попытка протолкнуть подобие BolgenOS? ;)
  • 0
    А вообще для автоматизации сборки ядра, бутлоадера, rootfs со всеми плюшками уже несколько лет используют buildroot и openembedded
    Процесс сборки упрощается до немогу
    • +1
      Ну есть еще Debian Live. Там вообще процесс сборки системы тоже сильно упрощается. Любой набор пакетов из дебиана, хочешь cd-образ, хочешь usb-flash :)
      • 0
        В нём нет кросс-компиляции под ARM, насколько я помню.
  • 0
    Прочитал
    Я хочу создать ОС на базе Linux.
    и посмотрел в теги, нет ли нигде упоминания о bolgenOS…
  • +18
    Жесть, просто жесть. Школьники на хабре, кто пропускает такое из песочницы? «Чмошные разработчики», «ты меня уважаешь?», «ещё не все пользователи винды застрелились».
    • +1
      Лучше бы они про уроки думали и о списке литературы на лето. Тут до 1 сентября всего ничего осталось!
  • +3
    Ээ а к чему все это? Есть LFS c куда как более подробным руководством :-) Да и если есть желание построить «свой линукс» вовсе нет надобности изобретать велосипед с квадратными колесами, берется любой дистр и строится «с нуля»
  • +18
    Я сначала хотел написать язвительный коментарий о «чмошных разработчиках мандривы» (как, впрочем, и большинства других дистрибутивов), которые не включают сломанную поддержку ntfs write в ядре а используют ntfs-3g, но подумал и в чем-то автор прав. Да, мы эту поддержку не включали в мандриве специально, и насколько я знаю ее включать в никаком обозримом будущем не планируется — но автор ведь не просто сказал «какие они плохие» — нет, наоборот, он решил создать свой собственный дистрибутив с этой фичей по умолчанию!

    Браво! Дерзайте, весь смысл разнообразия Линукс дистрибутивов в том, что если что-то в нем не устраивает, то можно поменять под себя — или даже сделать свой, с нуля. Не используя LFS, не используя никаких чужих наработок или документации — полностью с нуля!

    Будет особо интересно почитать о том, что еще автор сумеет сделать. Загружаемый образ с busybox и собственным ядром — это уже начало, но это ведь не дистрибутив, а просто образ. Буду ждать рассказа о том, как будет происходить установка, как будет написан свой менеджер пакетов, система настройки железа, сети, обновлений, интеграции glibc, util-linux, ld.so,… — и всего прочего — того, из чего собственно состоит каждый дистрибутив…
    • +1
      Тонко, да. :)
  • –3
    Не хочу показаться занудой, но неужели так не лучше?
  • +2
    На троечку. С минусом.
  • 0
    Есть еще make qconfig
    • 0
      это о конфигурации ядра
      • 0
        По статье — печально…
  • +2
    друзья, вы бы лучше написали простенькую кластерную (или как нынче модно говорить облачную) ОС, которая по началу умеет лишь одно:

    запускать лишь одну многопоточную программу, но так, чтобы исполнение начиналось в незагруженном узле и чтобы её дочерние потоки, в случае нагрузки, мигрировали на незагруженные узлы.

    Если вам удастся это, то вы легко сможете нарастить и весь «джентельменский набор» ОС уже поверх всего этого — возможно вы начнёте новую эру, в которой про Линуса будут вспоминать лишь наиболее прилежные студенты.
  • +1
    Эмм. Я так и не понял, что делают в этом посте. LFS для чайников по устаревшим мануалам?
    Ну и:
    1. Собирается live-дистрибутив, который в теории должен работать на разном железе. При этом не используются модули. Почему, если это — очевидный их use-case?
    2. File systems ---> DOS/FAT/NT Filesystems ---> NTFS write support даст запись в файлы при условии, что их размер не изменится. Это полезно для того, чтобы работать с образами ФС, расположенными на NTFS. Но в нормальных условиях нужен ntfs-3g через fuse (либо сторонний ядерный модуль, если он настолько нужен), который к ядерному NTFS не имеет никакого отношения.
    3. make bzImage — относительно странно. Сейчас же в моде lzma. Да и можно сделать тупо make && make modules && make modules_install.
    4. Зачем initrd, если нет модулей? initrd вообще нужен только для того, чтобы:
    — Загрузить модули, необходимые для доступа к корневой ФС (если не хочется вкомпивать поддержку тонны железа)
    — Инициализировать LVM (это нельзя сделать без LVM)
    — Открыть доступ к зашифрованной корневой ФС
    — В нестандартных ситуациях — прочая подготовка к монтированию корневой ФС (если она сетевая (хоть cifs для любителей извращений), например)
    Ничего этого в статье не наблюдаю. Если init в initrd просто передаёт управление основному init'у, то initrd тупо не нужен. А судя по
    скрипт для монтирования флешки, который делает chroot в корневой каталог.

    другой работы для него и не предвидится.
    4.1. Зачем собирать busybox динамически? Или планируется использовать его и в основной системе?
    Будет облом, тонна утилит хотят GNU-специфичные ключи у coreutils, местами башизмы. Хотя general-purpose дистрибутивы с busybox встречаются, тот же alpine-linux, это — явно не уровень таких статей.
    • 0
      >(это нельзя сделать без LVM)
      initrd, очевидно.
  • 0
    Если откинуть ужасающий язык и местами устаревшую информацию, то статья ничего — этакий LFS для тех то не осилил нормальную версию.
    Но эти обороты речи… Ооо…
  • +2
    Напиши вольное изложение хендбука LFS — попади на хабру!
    • +5
      Пересказ мана в переводе Гоблина…
  • +1
    Я не заметил руководства по сборке toolchain для этого дистрибутива.
  • 0
    > Вот почему у таких классных проектов такие отстойные сайты?

    Критик, блин. У BusyBox сайт крутой. Потому что там есть все, что надо, и это все быстро находится.
    • 0
      Он видимо имел дизайн.

      Так вот отвечу: такие классные проекты делаются в основном программистами just for fun, которым не хочется тратить лишние деньги на дизайнера (а дизайн тут и не нужен — это ж не коммерческий проект, клиента завлекать не надо)
  • +1
    Главное позаботиться об обоях, иначе провал
  • 0
    Ничего не вижу о выборе железа, для которого предназначена система. Как-то пытался собрать систему под TI Omap850, но споткнулся на выборе типа процессора. Вот об этом хотелось бы почитать, а того, о чем вы пишете, и так в интернете навалом.

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