Можно ли установить ядро ​​Linux в одиночку?


45

Мне просто любопытно, можно ли установить ядро ​​Linux отдельно или вам нужно использовать один из вариантов. Если бы это было возможно, как бы вы это сделали? Мне не нужен подробный учебник. Я просто хочу знать, как это будет сделано концептуально. Я не очень хорошо разбираюсь в низкоуровневых вещах и хочу знать, как вы получаете ОС на компьютер. Я полагаю, это как-то связано с MBR.

Да, и я заметил, что многие ответы предполагают определенное распространение какого-то минимального Linux. Я должен был, вероятно, заявить, что я не собираюсь устанавливать минимальный или простой Linux. Этот вопрос чисто теоретический. Тем не менее, я действительно ценю все ответы и сразу же на них ссылаюсь, если когда-нибудь захочу установить по-настоящему персонализированный Linux.


3
Что вы имеете в виду под «одни» и «вкусы»? Linux - это не ОС, это ядро, для чего будет полезно ядро ​​без ОС? Вы пытаетесь выяснить последовательность загрузчика?
Калеб

3
Если вы хотите понять, как ядро ​​/ ОС попадают в компьютер, вот с чего начать. Только постарайтесь не задавать вопросы «новичкам», они вас укусят, задайте их на ТАК .
Филомат

3
Под одним я имею в виду только ядро, за исключением пользовательского интерфейса и включенных программ, таких как OpenOffice. Под «вкусами» я подразумеваю различные дистрибутивы linux, такие как ubuntu, redhat, debian и mandriva. Я почти не понимаю, о чем говорю. Я представлял, что ядро ​​Linux имеет некоторые базовые возможности bash, такие как DOS. Я думаю, что мои идеи о ядрах и операционных системах могут быть перепутаны.
Цезарь

4
Да, вы ДЕЙСТВИТЕЛЬНО запутались :) Bash - это просто пользовательская программа, которая запускается как процесс, управляемый ядром. Ядро само по себе не дает вам ничего, кроме платформы для запуска других вещей. Предложение LFS (Linux From Scratch) в ответе Шадура точно в цель. Вы бы много узнали о том, что представляют собой разные части и что делает дистрибутив дистрибутивом, и где заканчивается ядро ​​и начинается пользовательский процесс, создавая «чистую» систему.
Калеб

2
На самом деле, DOS kernelтакже не имел никаких базовых bashвозможностей. Стандартный пользовательский интерфейс был предоставлен программой оболочки COMMAND.COM. Самое близкое к тому, что можно было сделать с пустым ядром, делающим что-нибудь полезное, - это загрузить с помощью параметра ядра init=/bin/bash(при условии, что на диске есть минимальный Linux) Как ответили, если у вас есть только загрузчик и ядро, он очень быстро остановится, когда не найдет init.
StarNamer

Ответы:


51

Технически вы можете установить только загрузчик и только ядро, но как только ядро ​​загрузится, оно будет жаловаться на невозможность запустить «init», тогда оно просто будет сидеть, и вы ничего не сможете с ним сделать.

Кстати, это часть загрузчика, который находится в MBR. Ядро находится где-то на обычной области диска. Загрузчик настроен на то, чтобы знать, где это находится, поэтому он может загрузить ядро ​​и выполнить его.


Как бы вы положили его в MBR?
Цезарь

Каждый загрузчик поставляется с инструментом для установки себя в MBR. Есть также более дружественные инструменты, такие как Boot-Repair ( help.ubuntu.com/community/Boot-Repair ).
Шон Дж. Гофф

Ну, вы могли бы создать initramfs и встроить его в образ ядра, а затем у вас была бы полностью работающая система из файла образа ядра :-)
Патрик

@ ShawnJ.Goff Почему ядро ​​будет жаловаться на невозможность запустить init, если мы предоставим initramfs?
Пратик Сингхал

4
@ ps06756 Если у вас есть initramfs, это не одно ядро, как заданный вопрос. Если у initramfs есть init, ядро ​​не будет жаловаться.
Шон Дж. Гофф

18

Я не думаю, что вы точно понимаете, о чем вы спрашиваете, но вы, возможно, захотите взглянуть на проект Linux From Scratch .


LFS будет хорошей идеей, чтобы выяснить, как построить минимальную систему. Или вы можете посмотреть на MINIX (и прочитать книгу ). Или, для другого введения (меньше работы, но менее информативно), посмотрите на пакеты, помеченные как «essential» ( aptitude search '?essential') в Debian или Ubuntu, и поймите, что делает каждый (это чуть больше, чем минимум).
Жиль "ТАК - перестань быть злым"

12

Если вы спрашиваете, можете ли вы просто установить или обновить ядро ​​«поверх» существующей системы, не устанавливая кучу других программ?

Ядро Linux - это двоичный файл, обычно именуемый vmlinuz-x.x.x-x-nameв bootкаталоге (который обычно представляет собой отдельный небольшой раздел в начале жесткого диска), где x - это номер версии. «name» - это просто выбранное имя для ядра, которое может быть установлено во время компиляции, вы можете использовать его для определения типа машины или архитектуры, для которой ядро, или по любой другой причине.

Он загружается во время загрузки с помощью загрузчика, GRUBкоторый обычно вызывается загрузочным кодом в MBR, который вызывается ПЗУ BIOS. После загрузки он не «держится открытым» и не защищен специально. Таким образом, вы можете заменить этот файл другим рабочим ядром. Но, GRUBесть классная функция, которая позволяет вам выбрать несколько ядер для загрузки. Поэтому довольно разумно добавить ваше дополнительное ядро ​​в этот список, но сохранить оригинальное известное рабочее ядро ​​на случай, если что-то пойдет не так.

Я полагаю, что почти все дистрибутивы составляют «модульное» ядро, в котором драйверы устройств находятся в отдельных файлах. Поэтому большинству ядер нужна файловая система, содержащая драйверы, доступные для нее во время загрузки, и именно для этого нужны «initrd» (исходный RAM-диск) или «initramfs». GRUBзагрузит ядро ​​в определенном месте в памяти, а initrd - в другом месте и перейдет к ядру, сообщив ему, где находится initrd, начиная Linux.

Драйверы также могут быть «встроены» в ядро ​​и поэтому автоматически загружаются и становятся доступными, когда загрузчик загружает vmlinuzобраз. Ядра, которые предназначены для работы в различных системах (например, в большинстве дистрибутивов), обычно сводят к минимуму то, что встроено в ядро, потому что доступное оборудование будет сканироваться позже в процессе загрузки, и будут загружены только модули, представляющие существующее оборудование.

Есть инструменты для изменения и создания initrds. У Debian есть хорошие инструменты, и я думаю, что и другие дистрибутивы тоже.

Таким образом, если вы загружаете более новое ядро ​​с сайта kernel.org и компилируете его для создания нового двоичного образа ядра, вам необходимо создать или обновить initrd с драйверами, которые работают с этим ядром. Старый initrd не будет работать, потому что драйверы должны совпадать с версией ядра, которое работает.

Файл initrd назван так initrd.img-x.x.x.x-nameже, как и ядро, и может быть заменен после загрузки точно так же, как и ядро, и лучшая практика будет указывать, что вы не удаляете известный рабочий initrd, пока не узнаете, что можете успешно загрузиться в новое ядро ​​+ initrd.

Я надеюсь, что это обеспечивает некоторый контекст.

Если вы ищете «чистую» установку Linux, в которой практически не установлено никаких дополнительных программ, моим любимым выбором всегда была установка netinstобраза Debian . Практически у вас есть только самые основные инструменты, необходимые для запуска текстовой консоли из командной строки и nanoв качестве текстового редактора.


5

Один исполняемый файл rootfs

Система абсолютного минимума запускает одну /initпрограмму, как я объяснил в Single Application Linux | Супер пользователь

Минимальный Linux Live

https://github.com/ivandavidov/minimal

Для более интересной интерактивной системы это небольшой (в основном образовательный) скрипт, который:

  • скачивает исходники для ядра и busybox
  • компилирует их
  • генерирует загрузочный 8Mb ISO с ними

Затем ISO оставляет вас в минимальной оболочке с busybox.

С QEMU вы можете легко загрузиться в систему.

Я изменил его, чтобы он мог запускаться из исходного каталога ядра: https://github.com/cirosantilli/runlinux

Использование:

git clone https://github.com/ivandavidov/minimal
cd minimal/src
./build_minimal_linux_live.sh
# Wait.
# Install QEMU.
# minimal_linux_live.iso was generated
./qemu64.sh

и вы останетесь внутри окна QEMU с вашей новой минимальной системой. Потрясающие.

Поскольку он небольшой, это хороший вариант, чтобы прочитать исходный код и понять, что происходит.

Проверено на Ubuntu 16.04.

Buildroot

https://buildroot.org/

Большой набор скриптов Makefile, которые управляют:

  • GCC кросс-компиляция
  • сборка ядра
  • компилятор загрузчика
  • генерация rootfs
  • имеет множество рецептов загрузки / сборки пакетов в дереве исходников, включая сложные вещи, такие как GTK. Есть система зависимости.

Минимальный пример:

git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout 2016.05
make qemu_x86_defconfig
# Can't use -jN, use `BR2_JLEVEL=2` instead.
BR2_JLEVEL=2 make
# Wait.
# cat board/qemu/x86_64/readme.txt
qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user
# You are now in a shell with BusyBox utilities.

У него даже есть рецепты для сборки X11 с нуля: как установить X11 на мою собственную систему Linux Buildroot?

Профессиональные вещи.

Alpine Linux

https://github.com/gliderlabs/docker-alpine

Встроенный дистрибутив с менеджером пакетов, который предлагает предварительно скомпилированные двоичные файлы с веб-сайта.

Смотрите также


3

Я хотел бы поддержать предложение Шадура, что вы должны испачкать руки Linux с нуля.
Также, что-то похожее, попробуйте Pocket Linux .

Руководство по Pocket Linux демонстрирует, как собрать небольшую консольную систему GNU / Linux, используя только исходный код и пару дискет. Он предназначен для пользователей Linux, которые хотели бы получить более глубокое понимание того, как их система работает под покровом специфических функций и инструментов распространения.


2
Хотя обратите внимание, что никто в здравом уме не рекомендует / либо / LFS, либо PocketLinux для какой-либо важной производственной задачи - они хороши для изучения того, как все работает, но есть причина, по которой большинство дистрибутивов поставляются с полным набором инструментов и интерфейсов. для большинства вещей.
Шадур

3

Можно установить ядро ​​Linux без обычных инструментов пользовательского пространства. Обычно это делается во встроенных системах, таких как маршрутизаторы. Как правило, ядро ​​загружается из ПЗУ или флэш-памяти и настраивается для данного устройства (обычно с необходимыми драйверами, скомпилированными в ядро, а не загруженными в виде модулей).

По крайней мере, одна программа в пространстве пользователя должна существовать, чтобы стать процессом 'init' (необязательно вызываться init, но запускается ядром как процесс 1, и автоматическим родителем всех потерянных процессов) - если только ядро ​​не было модифицировано (скорее чем просто настроить), чтобы не требовать этого.

Конечно, нет необходимости иметь доступную оболочку, чтобы иметь работающее устройство на базе Linux, хотя это может значительно облегчить разработку!


2

Многие дистрибутивы предоставляют «основные» установки. Это то, что вы хотите. Смотрите ubuntu-minimal, debian net-install, archlinux (по умолчанию это просто ядро).

Другие ответы полезны, если вы хотите учиться, но это не так = p

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.