можно ли установить ядро linux в одиночку?

<p>мне просто любопытно, можно ли установить ядро linux отдельно или вам нужно использовать один из вариантов. если бы это было возможно, как бы вы это сделали? мне не нужен подробный учебник. я просто хочу знать, как это будет сделано концептуально. я не очень хорошо разбираюсь в низкоуровневых вещах и хочу знать, как вы получаете ос на компьютер. я предполагаю, что это как-то связано с mbr.</p><p>да, и я заметил, что многие ответы предполагают определенный дистрибутив минимального linux. я должен был, вероятно, заявить, что я не собираюсь устанавливать минимальный или простой linux. этот вопрос чисто теоретический. тем не менее, я действительно ценю все ответы и сразу же на них ссылаюсь, если когда-нибудь захочу установить по-настоящему персонализированный linux.</p>

<p>технически вы можете установить только загрузчик и только ядро, но как только ядро загрузится, оно будет жаловаться на невозможность запустить "init", тогда оно просто будет сидеть, и вы ничего не сможете с ним сделать.</p><p>кстати, это часть загрузчика, который находится в mbr. ядро находится где-то на обычной области диска. загрузчик настроен так, чтобы знать, где он находится, поэтому он может загрузить ядро и выполнить его.</p>

<p>я не думаю, что вы точно понимаете, о чем вы спрашиваете, но вы, возможно, захотите взглянуть на проект <a href="http://www.linuxfromscratch.org/">linux from scratch</a> .</p>

<p>если вы спрашиваете, можете ли вы просто установить или обновить ядро "поверх" существующей системы, не устанавливая кучу других программ?</p><p>ядро linux - это двоичный файл, обычно называемый <code>vmlinuz-x.x.x-x-name</code> в каталоге <code>boot</code> (который обычно представляет собой отдельный небольшой раздел в начале жесткого диска), где x - это номер версии. "name" - это просто выбранное имя для ядра, которое может быть установлено во время компиляции, вы можете использовать его для определения типа машины или архитектуры, для которой ядро, или по любой другой причине.</p><p>он загружается во время загрузки загрузчиком, обычно <code>grub</code>, который вызывается загрузочным кодом в mbr, который вызывается пзу bios. после загрузки он не "держится открытым" и не защищен специально. таким образом, вы можете заменить этот файл другим рабочим ядром. но у <code>grub</code> есть классная функция, которая позволяет вам выбрать несколько ядер для загрузки. поэтому довольно разумно добавить ваше дополнительное ядро в этот список, но сохранить оригинальное известное рабочее ядро на случай, если что-то пойдет не так.</p><p>я полагаю, что почти все дистрибутивы создают "модульное" ядро, в котором драйверы устройств находятся в отдельных файлах. таким образом, большинству ядер нужна файловая система, содержащая драйверы, доступные для нее во время загрузки, и именно для этого нужны "initrd" (initial ram диск) или "initramfs". <code>grub</code> будет загрузите ядро в определенном месте в памяти, а initrd - в другом месте и перейдите к ядру, сообщив ему, где находится initrd, начиная linux.</p><p>драйверы также могут быть "встроены" в ядро и поэтому автоматически загружаются и становятся доступными, когда загрузчик загружает образ <code>vmlinuz</code>. ядра, которые предназначены для работы в различных системах (например, в большинстве дистрибутивов), обычно сводят к минимуму то, что встроено в ядро, потому что доступное оборудование будет сканироваться позже в процессе загрузки, и будут загружены только модули, представляющие существующее оборудование.</p><p>есть инструменты для изменения и создания initrds. у debian есть инструменты nice, и я думаю, что и другие дистрибутивы тоже.</p><p>таким образом, если вы загружаете более новое ядро с сайта kernel.org и компилируете его для создания нового двоичного образа ядра, вам необходимо создать или обновить initrd с помощью драйверов, которые работают с этим ядром. старый initrd не будет работать, потому что драйверы должны совпадать с версией ядра, которое работает.</p><p>файл initrd называется <code>initrd.img-x.x.x.x-name</code> аналогично ядру, и может быть заменено после загрузки точно так же, как и ядро, и лучшая практика будет указывать, что вы не удаляете известный рабочий initrd, пока не узнаете, что можете успешно загрузить новое ядро + initrd.</p><p>я надеюсь, что это обеспечивает некоторый контекст.</p><p>если вы ищете "чистую" установку linux, в которой не было установлено никаких дополнительных программ, то моим любимым выбором всегда была установка образа debian <code>netinst</code>. практически у вас есть только самые основные инструменты, необходимые для запуска текстовой консоли командной строки и <code>nano</code> в качестве текстового редактора.</p>

<p><strong> один исполняемый файл rootfs </strong></p><p>система абсолютного минимума запускает один <code>/init</code> программа, как я объяснил в <a href="https://superuser.com/a/991733/128124">single application linux | super user</a> </p><p><img src="https://i.stack.imgur.com/rkgun.png" alt=""></p><p><strong> минимальный linux live </strong></p><p> <a href="https://github.com/ivandavidov/minimal">https://github.com/ivandavidov/minimal</a> </p><p>для более интересной интерактивной системы это небольшой (в основном образовательный) скрипт, который:</p><ul> <li>скачивает исходники для ядра и busybox</li> <li>компилирует их</li> <li>генерирует с ними загрузочный 8mb iso</li> </ul><p>затем iso оставляет вас в минимальной оболочке с busybox.</p><p>с qemu вы можете легко загрузиться в систему.</p><p>я изменил его, чтобы он мог запускаться из исходного каталога ядра: <a href="https://github.com/cirosantilli/runlinux">https://github.com/cirosantilli/runlinux</a> </p><p>применение:</p><pre><code>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 </code></pre><p>и вы останетесь внутри окна qemu с вашей новой минимальной системой. потрясающие.</p><p>поскольку он небольшой, это хороший вариант, чтобы прочитать исходный код и понять, что происходит.</p><p>проверено на ubuntu 16.04.</p><p><strong> buildroot </strong></p><p> <a href="https://buildroot.org/">https://buildroot.org/</a> </p><p>большой набор скриптов makefile, которые управляют:</p><ul> <li>gcc кросс-компиляция</li> <li>сборка ядра</li> <li>компилятор загрузчика</li> <li>генерация rootfs</li> <li>имеет множество рецептов загрузки/сборки пакетов в дереве исходников, включая сложные вещи, такие как gtk. есть система зависимости.</li> </ul><p>минимальный пример:</p><pre><code>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. </code></pre><p>у него даже есть рецепты для сборки x11 с нуля: <a href="https://unix.stackexchange.com/questions/70931/install-x11-on-my-own-linux-system/306116#306116">как установить x11 в моей собственной системе linux buildroot?</a> </p><p>профессиональные вещи.</p><p><strong> alpine linux </strong></p><p> <a href="https://github.com/gliderlabs/docker-alpine">https://github.com/gliderlabs/docker-alpine</a> </p><p>встроенный дистрибутив с менеджером пакетов, который предлагает предварительно скомпилированные двоичные файлы с веб-сайта.</p><p><strong> смотрите также </strong></p><ul> <li> <a href="https://superuser.com/questions/307087/linux-distro-with-just-busybox-and-bash">дистрибутив linux только с busybox и bash</a> </li> <li> <a href="https://unix.stackexchange.com/questions/47619/load-linux-bzimage-in-qemu">загрузить linux bzimage в qemu?</a> </li> <li> <a href="https://unix.stackexchange.com/questions/136278/what-are-the-minimum-root-filesystem-applications-that-are-required-to-fully-boo">какие минимальные приложения корневой файловой системы требуются для полной загрузки linux?</a> </li> </ul>

<p>можно установить ядро linux без обычных инструментов пользовательского пространства. обычно это делается во встроенных системах, таких как маршрутизаторы. обычно ядро загружается из rom или флэш-памяти) и настраивается для данного устройства (обычно с необходимыми драйверами, скомпилированными в ядро, а не загруженными в виде модулей).</p><p>по крайней мере, одна программа в пространстве пользователя должна существовать, чтобы стать процессом 'init' (необязательно называемым <code>init</code>, но запускаемым ядром как процесс 1 и автоматическим родителем любых потерянных процессов) - если только ядро было изменено (а не просто настроено), чтобы не требовать этого.</p><p>конечно, не обязательно иметь shell, чтобы иметь работающее устройство на базе linux, хотя это может сделать разработку намного проще!</p>

<p>я хотел бы поддержать <a href="https://unix.stackexchange.com/questions/17122/is-it-possible-to-install-the-linux-kernel-alone/17123#17123">предложение шадура</a> о том, что вы должны испачкать руки linux с нуля.<br> также, что-то похожее, попробуйте <a href="http://tldp.org/ldp/pocket-linux-guide/html/index.html">pocket linux</a> .</p><blockquote> <p>руководство по pocket linux демонстрирует, как создать небольшую консольную систему gnu/linux, используя только исходный код и пару дискет. он предназначен для пользователей linux, которые хотели бы получить более глубокое понимание того, как их система работает под покровом специфических функций и инструментов распространения.</p> </blockquote>

<p>многие дистрибутивы предоставляют "основные" установки. это то, что вы хотите. смотрите ubuntu-minimal, debian net-install, archlinux (по умолчанию это просто ядро).</p><p>другие ответы полезны, если вы хотите учиться, но это не так = p</p>