Pull to refresh

минилинукс

Reading time3 min
Views8.2K
Лирическая часть

Кто из нас в детстве не разбирал игрушки, чтоб посмотреть, что же там такое внутри. Я не был исключением. Прошло всего несколько лет, и одной из игрушек стал линукс. Из абстрактного желания «сломать и посмотреть» оно формализовалось в несколько вполне конкретных задач, одной из которых стала найти некую отправную точку — минимальное нечто, которое бы грузилось и давало шелл. Пару раз я начинал собирать lfs, но до конца так и не дошел. Прочел несколько статей про разработку embedded, но там все было чересчур серьезно и по-взрослому: после предложений сооружать окружение для кросс-компиляции под различные архитектуры и удаленной отладки в панике отключал интернет. Пересмотрел несколько mini-livecd, но все они или мегадревние (ядро 2.4 и ниже) или обязательно с графикой и DE, что никак не вписывалось в мое представление об идеальном минидистре для опытов.
И вот не так давно я случайно узнал, что то, что я ищу, называется initramfs и лежит у меня под носом.

HOWTO-часть

Зададимся задачей получить маленький, уютненький и, желательно, чем-нибудь полезный дистрибутив, не прилагая особых усилий. По большому счету нам понадобится загрузчик, ядро и образ initramfs. Самый простой способ получить их — вытащить из уже готового дистрибутива. Для того, чтоб сделать его хоть сколь-нибудь полезным вставим туда busybox и настроим несколько сетевых сервисов. Покажу как это проделать с CentOS, но в принципе подойдет любой. Итак, приступим:

Распакуем куда-нибудь initrd:
mkdir /root/myimage
cd /root/myimage
gzip -d < /boot/initrd-2.6.18-128.el5 | cpio --extract --verbose --make-directories --no-absolute-filenames


Устанавливаем и копируем busybox в наш минилинукс (busybox ни с чем не линкуется, так что копируем смело)
yum install busybox
cp -a /sbin/busybox /root/myimage/bin


Оставляем в init только самый необходимый минимум: создаем procfs и sysfs, основные файлы устройств, загружаем нужные драйвера (для моей сетевой мне понадобилось скопировать их из /lib основного дистрибутива) и запускаем пару сервисов. Вот:

/init

#!/bin/nash

mount -t proc /proc /proc
mount -t sysfs /sys /sys
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/rtc c 10 135
mknod /dev/tty0 c 4 0
mkblkdevs
insmod /lib/libphy.ko
insmod /lib/tg3.ko
mkblkdevs
echo WELCOME!!!
/bin/busybox ln -s /bin/busybox /bin/ash
/bin/busybox ln -s /bin/busybox /bin/telnetd
/bin/busybox ifconfig eth0 192.168.1.1 netmask 255.255.255.0
/bin/busybox httpd
/bin/busybox inetd /etc/inetd.conf
/bin/ash


/etc/passwd
root:x:0:0:root:/:/bin/ash

/etc/inetd.conf
23 stream tcp nowait root /bin/telnetd telnetd -l /bin/ash

Собираем initramfs и возвращаем на место:
find . | cpio -H newc --create --verbose | gzip -9 > /boot/initrd-2.6.18-128.el5

Вуаля. Наш минилинукс готов. Можно сносить все, кроме директории /boot и перегружаться. Но для пущей надежности перенесем его на флешку:
Допустим флешка определена ядром как /dev/sdb. На ней — всего один fat-раздел. При помощи fdisk сделаем ее загрузочной
fdisk /dev/sdb

Проверяем, стоит ли в колонке boot звездочка. Если нет, жмем a, и затем w.
Монтируем флешку куда-нибудь и копируем на нее /boot
mount /dev/sdb1 /mnt
cp -a /boot /mnt
umount /dev/sdb1


При помощи grub перезаписываем загрузочный сектор флешки
grub
>find (hd1,0)/boot/grub/stage2
>root (hd1,0)
>setup (hd0)
>quit


тут я сделал предположение, что grub «увидел» флешку, как диск 2. Если это не так, find выдаст ошибку (не найдет /boot). Посмотрите результат find (hd2,0)… find (hd3,0)… и т.д., пока не найдете флешку.

Итого

Ну вот и все. Перегружаемся, включаем в биосе загрузку со сменных носителей и получаем приглашение командной строки нашего минилинукса. Так же пробуем подсоединиться к 192.168.1.1 telnet-клиентом и открыть в браузере 192.168.1.1/init Если кто проникся темой создания своего маленького дистрибутивчика, вот несколько направлений для дальнейших исследований:
— Посмотрите утилиты busybox. Там много полезных сетевых сервисов: http,dhcp,tftp,smtp,tod,inetd. Из tar+gzip+ftpput получается отличный «unattended backup». Так же есть масса утилиток для работы с ФС, что позволят Вам создать свой rescue cd.
— Определите больше устройств. Как вы, наверное, заметили, я выбросил из init-скрипта все драйверы дисковых устройств и фс. О!!! И, кстати, hotplug и USB-драйвера тоже отключены, так что если у вас usb-клавиатура, сперва-наперво верните их на место.
Надеюсь, эта статья будет кому-то полезна.
Tags:
Hubs:
Total votes 93: ↑92 and ↓1+91
Comments47

Articles