Pull to refresh

Comments 29

Смотрю, работа над форком ядра, которое тут недавно предлагали, продвигается успешно!)))

(хе-хе, готовим почву! но тс-с-с, а то Торвальдс заявится, буянить начнёт. строжайшая тайна)

Спасибо, думаю материал будет полезен некоторой категории. Попробуйте такое же проделать с каким нибудь seL4 мicrokernel(ссылку не кидаю на проект так как минуса накидали за рекламу) и в идеале на risc-v, было бы интересно почитать. Конечно при условии что у вас найдется время.

Спасибо за наводку. Тут так получается - пока с одной статьёй сам разобрался, новых вопросов и новых мыслей народилось - и правда вроде для следующей статьи :)

А что про RISC-V имеется в виду? портирование ядер для них или там какую-то отдельную ОС уже мутят? :) вряд ли. Вообще про порты тоже оказывается любопытно, как они интерфейс системных вызовов перелопачивают, уф. Посмотрим, разберемся.

Думаю достаточно собрать (risc-v опционно, можно под любую платформу) и запустить с сетевым драйвером (остальное не надо - в том числе видеодрайвер) и user space процесс. Базовая функция user process: запрос сетевой в виде /world и получить ответ в виде например "hello world". Да задача не простая, но с практической стороны намного будет полезно читателям.

Спасибо за статью.

Linux и FreeBSD под RISC-V давно и прочно существуют. Системные вызовы те же и от платформы не зависят. Визуально они ни чем не отличаются.

По теме статьи. Интересным является то, как продвинуться чуть дальше запуска статически слинкованного /sbin/init. А именно - как организуется динамическая линковка, организация библиотек и что такое GLIBC. Именно с этого момента начинается настоящая операционная система, а до этого - только загрузка ядра как обычной программы. :)

В качестве продолжения, было бы интересно посмотреть как запустить Xorg + Firefox (в режиме киоска например) на минималках. Firefox интересен тем, что имеет минимум зависимостей, только системные библиотеки:

rz@butterfly:~ % ldd /usr/local/bin/firefox
/usr/local/bin/firefox:
	libc++.so.1 => /usr/lib/libc++.so.1 (0x151a43e38000)
	libcxxrt.so.1 => /lib/libcxxrt.so.1 (0x151a452a3000)
	libm.so.5 => /lib/libm.so.5 (0x151a442a1000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x151a46377000)
	libthr.so.3 => /lib/libthr.so.3 (0x151a4597e000)
	libc.so.7 => /lib/libc.so.7 (0x151a46fe6000)
	[vdso] (0x7ffffffff650)

Еще интересным моментом является ответ на вопрос "а что же на самом деле делает загрузчик ?". Процесс загрузки ядра Linux в память и его запуск - не тривиален.

Спасибо за вопросы-подсказки :) как нетрудно догадаться я сам не слишком глубоко в теме - так что конечно они вероятно дадут толчок к дополнительным размышлениям :)

К сожалению, в современном мире "Ай-Ти" мало кто понимает как работают операционные системы и этот пробел в образовании надо устранять. Пожелаю Вам удачи в освоении этой очень интересной темы и её популяризации.

Если вы про Linux From Scratch проект - на это не претендую :) скорее мне для логической связки материала из других статей понадобилось этот момент описать, да и самому чуть-чуть устаканить некоторые нюансы

 По-хорошему нужно взять исходники и вдумчиво скомпилировать ядро нужной версии и с требуемыми настройками

как то немного думалось что это будет в статье, хотя для понимания процесса это большой шаг в сторону, а в настройках там заблудиться можно, так что для данной статьи готовое ядро - правильный выбор

так то есть такие штуки как buildroot которые позволят и ядро собрать и initrd и файловую систему в образе, ну еще openwrt недалеко ушла, но понятия того как все грузится такая сборка не особо разовьет

Например можно утащить initrd файл с Убунты (он весит около 50мб) - и попробовать подключить его. Вы получите уже более менее рабочую систему - однако убедитесь что надо создать на диске кое-какие папки (вроде /dev) да и подмонтировать его как рутовую систему.

Можно просто взять busybox - его вполне достаточно для многих вещей (пример сборки rootfs из одного busybox https://github.com/maquefel/kernel-bisect-template/blob/master/Makefile) получится меньше двух мегабайт (может даже сильно меньше - не помню).

Можно, так же, объединить с ядром - CONFIG_INITRAMFS_SOURCE, причём мы можем не использовать его добавил параметр:

noinitrd [RAM] Tells the kernel not to load any configured initial RAM disk.

или загрузить другой невстроенный.

Можно просто взять busybox

собственно он и используется в упомянутом initrd c убунты :) действительно популярная штуковина

noinitrd 

у меня сложилось впечатление что не работает (на ядрах из примера), но я, каюсь, не разобрался - то ли надо вдумчиво остальные параметры задать, то ли ядро без поддержки этого параметра %)

собственно он и используется в упомянутом initrd c убунты :) действительно популярная штуковина

Его можно использовать ВМЕСТО initrd c убунты, как бы 50 vs 2 это большая разница (уже не говоря о скорости systemd vs упрощенная версия sysvinit в busybox).

у меня сложилось впечатление что не работает (на ядрах из примера),

Тут ничего сказать не могу, кроме того, что обычно оно работает.

А вот rdinit= vs init=, надо было бы упомянуть.

А вот rdinit= vs init=, надо было бы упомянуть.

да, честно сказать был именно такой план но немного выпал из головы из-за того что ядро само init-файл пытается отыскать и прямо пишет несколько путей где его ищет

initrd — это Initialization RAM Disk. А не “init root directory”.

Вообще, более современный вариант будет — собрать ядро с включенным efi stub, положить его в /efi/bootx64.efi внутри fat32/gpt раздела. И тогда загрузчик не нужен вообще. Можно вкомпилировать аргументы запуска в ядро. Можно запустить ядро из uefi shell. Ну и морочиться с копированием файлов в виртуалку не нужно. Просто собираем образ диска в хост-системе и подключаем его к виртуалке в качестве usb устройства или sata диска.

Просто собираем образ диска в хост-системе

ну дак это у кого какая хост-система :) линуксоводам (как и мне) и виртуалка не нужна

и как сказано в статье - я колебался между желанием добавить этап сборки ядра и тягой к тому чтобы keep it simple. пока решил за второй вариант хотя безусловно он не очень правильный

Замечания по статье и комментариям:

  1. initramfs -- по сути вполне себе userspace, а не "ядро-одиночка", "ядро само по себе" и т.д.

  2. Чтоб запустить в виртуалке ядро с initramfs, не нужно никаких образов дисков, форматирований, загрузчиков и проч. Для qemu есть опции запуска конкретного ядра и initramfs, взятых файлами из хостовой ОС. Как там в гуеподелке и виртуальной коробке -- не в курсе.

Была мысль попробовать собрать ядро как EFI-приложение, и в него вкомпилить busybox с тем же докером. Подписать это дело. И у нас получится система в одном файле... Зачем? Ну, как минимум, такая штука имеет мало векторов для атаки и создает сложность закрепления в ней.

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

Статья очень актуальна для меня.

  • При работе с fdisk второй пункт - "создать новый раздел (первичный) нажмите "p" и выделите под него весь диск" - там нужно нажимать не "р", а "n".

  • Выполнить "extlinux --install /mnt/boot" не удалось... на этом месте я застрял.

спасибо, букву поправил :)

если где-то чего-то не удалось, имеет смысл писать конкретно "я делал то-то, у меня такая-то ошибка". это не только данной статьи касается. иначе довольно трудно понять что за проблема

А почему с sata и vda дисками не работает такое шаманство?

вопрос не очень понятен, простите. sata это про кабель же, не? для vda я думаю работает только часть шаманства т.к. самого низкого уровня у них по-моему нет, но не факт что я правильно помню

повторяю действия не в VirtualBox, а в kvm. Диск создал SATA с драйвером virtio. В гостевой системе диск определяется как vda. Загрузка зависает на надписи booting. Если создать диск как IDE то все действия в статье воспроизводятся. В связи с чем и возник вопрос.

а, я думаю вам вместо MBR нужно какие-то пассы магические проделать касающиеся загрузки с vda - навскидку мне вот страницу предлагают:

https://www.linux-kvm.org/page/Boot_from_virtio_block_device

боюсь что руками проверить сейчас я этот путь не готов :)

Никаких пассов, чтобы загрузить qemu через MBR c virtio, не нужно. В самом деле, биос для кему в курсе о virtio, далее естественно бутлоадер должен быть в курсе (иметь драйвер), grub вполне имеет. Ну и наконец, само ядро, оно тоже в курсе (если нужный драйвер вкомпилирован или в виде модуля подпихнут из initramfs).

Нельзя создать диск "sata" c интерфейсом "virtio". sata или virtio в qemu -- это какую "виртуальную", то есть эмулируемую железку покажут виртуализированным ОС/бутлоадеру/биосу. А сам диск -- это просто посекторный образ из файла. Ну или не просто посекторный, если например qcow2.

 и сразу напоминает что для списка команд можно нажать m (почему-то).

Потомучто на скриншоте ниже написано: "m print this menu"

Sign up to leave a comment.

Articles