Почему операционная система и ядро ​​обрабатываются отдельно в Linux? [закрыто]

9

Когда дело доходит до любой операционной системы Linux, включая Ubuntu, люди склонны различать термины ядро и операционная система . Это верно для Windows и семейства OS X, но почему это так широко распространено среди Linux-сообщества? Есть ли способ обновить ядро ​​ОС, не обновляя саму ОС? Или наоборот? Если так, как это может быть полезно?

Ветер снов
источник
3
Просто: свобода. Свобода создавать свою собственную версию того, что вам нужно. Ядро? Ракушка? Desktop. Действуй.
Rinzwind
6
Потому что они являются отдельными? По той же причине, по которой оконный менеджер обрабатывается отдельно от X-сервера (потому что они отдельные) и почему оболочка обрабатывается отдельно от эмулятора терминала (потому что они тоже отдельные). Теперь, если бы вы спросили, почему они были разработаны таким образом ...
user253751
Ubuntu теперь также работает поверх ядра Windows 10, что показывает, что это настоящее разделение. Конечно, Windows не поставляется с X-сервером, который немного усложняет ситуацию, но этого следует ожидать, когда части отсутствуют.
MSalters
@MSalters Оконный менеджер в Windows немного хитрый, да; однако, если кто-то действительно хочет запустить X в Windows, существует множество способов справиться с этим. Самым простым для постороннего, вероятно, будет серверный «эмулятор» поверх существующего оконного менеджера, хотя я понятия не имею, насколько хорошо это можно отобразить (в последний раз, когда я видел внутренности X, я не очень надеялся). Я бы не задерживал дыхание - мне кажется, что многие люди не хотят, чтобы X работал на Windows.
Луаан

Ответы:

12

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

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

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

sudo apt install linux-image-<version>

Пока APT позволяет это делать, вы должны иметь возможность перезагрузить и использовать выбранную версию ядра, будь то универсальная, низкая загрузка и т. Д. Или вы сами создаете версию ядра, например, Real-Time Linux , и используете ее с вашей текущей системой. ,

Melebius
источник
Большое спасибо, но будет ли это соответствовать? Скажем, Ubuntu 14.04 LTS имеет версию ядра 3.19.0, и в случае обновления ядра это больше не 14.04 LTS, верно? Так что, если я попытаюсь обновить всю систему позже, или встроенный механизм обновления (Software Updater) принесет мне новую версию, узнает ли она об обновленной версии ядра? Может ли модуль проверять модули отдельно и вносить только необходимые изменения, не затрагивая уже обновленные модули?
Ветер снов
1
См. Packages.ubuntu.com/search?keywords=linux-image для длинного списка версий ядра, которые поддерживает каждая версия Ubuntu. Версия Ubuntu определяется разными вещами из версии ядра, но я не совсем знаю, какие из них ... Если вам это интересно, вы можете задать другой вопрос.
Мелебиус
1
@AleksandrMedvedev Намного позже я нашел это! Версия Ubuntu указана в файле, /etc/issueкоторый предоставляется base-filesпакетом. Как я уже писал, это не связано с версией ядра.
Мелебиус
5

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

Операционная система состоит из двух частей, пространства ядра и пространства пользователя.

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

А по поводу обновления инструментов пользовательского пространства, это еще одно да.

Когда вы бежите:

sudo apt-get upgrade

Если для ядра было доступно обновление, вы получите:

The following packages have been kept back:
  linux-generic linux-headers-generic linux-image-generic

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

sudo apt-get dist-upgrade

Вы обновляете все, включая ядро.

Чтобы обновить только ваше ядро ​​до более новой версии, используйте что-то вроде:

$ apt-cache search "linux-image-[0-9]+.*-generic" | awk '{print $1}' | head -4
linux-image-4.4.0-21-generic
linux-image-4.10.0-14-generic
linux-image-4.10.0-19-generic
linux-image-4.10.0-20-generic

чтобы найти список более новых ядер, затем установите его как новый пакет, например:

sudo apt install linux-image-4.10.0-14-generic
Ravexina
источник
Это определенно не правда.
mook765
Поправь меня;) чтобы я узнал что-то новое :)
Ravexina
3
sudo apt upgradeобновит ядро, если появятся новые версии. sudo apt full-upgradeудалит задницу хорошо, что asudo apt upgradeне сделаю.
Сорен А
Поскольку я сейчас перехожу на новое ядро, это своего рода установка, и при использовании upgradeподкоманды он не устанавливает никаких новых пакетов, а также не удаляет какие-либо пакеты, поэтому мы используем его dist-upgrade. по крайней мере, так apt-getработает;) поэтому я обновил свои команды, чтобы избежать путаницы.
Равексина
1
У меня больше опыта работы с apt-командой, после небольшого исследования выясняется, что ваш ответ теперь правильный, aptи apt-getчто-то не так, см. Hiroom2.com/2016/05/20/ubuntu-16-04-debian-8-apt -command / ... . Итак, некоторые знания для нас обоих ...
mook765
3

Сначала несколько пояснений, потому что я чувствую, что вы не понимаете, как появились системы GNU / Linux. Потерпи меня, если для тебя в этом нет ничего нового:

«Ядро» - это не просто еще одна программа, которая запускается, а часть операционной системы, предоставляющая базовые функции: если вы хотите запустить программу (скажем, вы набираете «ls» в командной строке), бинарный файл должен быть загружен с диска (который включает в себя некоторые операции с файловой системой для его обнаружения и некоторую обработку файла для его чтения), затем создается «среда процесса»: выделяется память, выдается номер процесса и т. д. и т. д. Все предыдущие действия (FS, чтение из файла, ...) обрабатываются системными библиотеками, но последние являются функциями ядра. В каком-то смысле ядро ​​«это ОС», а все остальное - просто украшение вокруг него.

«Linux» на самом деле (только!) Ядро без других частей ОС. Линус Торвальдс начал писать его, взяв ядро ​​операционной системы шаблона MINIX Эндрю Таненбаумса и завершив его, чтобы оно было полноценным и реально работоспособным ядром. По сей день есть Линус (и многие другие, которые внесли / внесли свой вклад), которые развивают это ядро. Это ядро ​​все еще очень похоже на UNIX, но НЕ ядро ​​UNIX.

«GNU» начал как инициативу, чтобы «улучшить» многие общие команды UNIX. Я не буду обсуждать, преуспели они или нет, но они определенно написали много программного обеспечения и в какой-то момент имели набор служебных программ. Они даже начали разрабатывать собственное ядро ​​ОС (HURD), которое было основано главным образом на UNIX, но определенно отличалось. Но по сей день HURD находится на ранней стадии разработки и вряд ли является рабочим решением. "GNU" между прочим сокращение от «GNU (is) Not UNIX» - они пытались преодолеть некоторые (предполагаемые или реальные) ограничения UNIX с целью создания преемника UNIX (опять же: я не хочу вступать в дискуссию, если они преуспели или нет - мне все равно, "лучше" или "хуже", но это определенно другое!).

Итак, с набором инструментов, в которых отсутствует ядро, и в ядре, в котором отсутствует набор инструментов, было естественным решением объединить эти два компонента: был создан GNU / Linux.

Тем не менее, чтобы иметь работающую (и работоспособную) ОС, вам нужно больше, чем просто ядро ​​и набор инструментов: вам нужна система управления пакетами, вам нужны процедуры установки, вам нужны конфигурации шаблонов, вам нужно ....

Несколько разных людей (или их группы) пришли к такому выводу и использовали комбинацию GNU / Linux для создания системы GNU / Linux по своему вкусу, добавив в точности то, о чем я говорил выше: они создали менеджер пакетов, систему упаковки , процедуры установки и что еще. Эти разные группы (соответственно, результаты их усилий) являются тем, чем являются различные распределения. Сегодня существует три разных менеджера пакетов (подходящих для Debian и производных систем, таких как * ubuntu, rpm для RedHat и производных систем, таких как Fedora, CentOS и другие, pacman для ArchLinux), но все они просто управляют пакетами программного обеспечения, которое (по сути) то же самое: что вызывается, когда вы вводите "ls" или "df" и т. д.,

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

Но, и это действительно большое НО: потому что есть не только ядро ​​и некоторое дополнительное программное обеспечение, но и много других вещей, о которых нужно помнить, таких как инструменты конфигурации системы (systemd, который используют некоторые дистрибутивы, а некоторые нет), сеть инструменты управления, такие как NetworkManager, который, в свою очередь, зависит от некоторых версий библиотеки GNOME и т. д. и т. д. - «дистрибутив» - это довольно сложная вещь, и есть вероятность, что если вы попытаетесь обновить ядро, вы в итоге обновите много другие вещи из-за многих взаимозависимостей.

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

Надеюсь, это ответит на ваш вопрос.

Бакунин
источник
GNU начиналась не с того, чтобы «улучшить» многие распространенные команды UNIX. GNU была операционной системой с самого начала, с целью свободного программного обеспечения в ответ на ограниченную собственность UNIX. Вы можете прочитать больше на их сайте . Они решили перенести все свое программное обеспечение на Linux, потому что к моменту создания Linux у GNU еще не было работающего ядра.
Ян Эмнас,
3

Самый простой ответ не имеет ничего общего с Ubuntu; это связано со способом построения GNU / Linux. Если вы попытаетесь взглянуть на него как на разработчика системы, вы увидите два мира, каждый из которых разделен четкой границей (ABI).

Мир ядра, где работают низкоуровневые разработчики, - это система сама по себе. В нем есть все, что вы обычно найдете в обычном приложении. Разница лишь в том, что пользователь - это не тот человек, который пользуется машиной, а мир пользователя. Ядро «приложение» - это посредник, сервер, который использует машину - призрак в оболочке.

Теперь пространство пользователя - это нормальный мир, в который играют обычные пользователи и разработчики. Он имеет жесткие API, правила, файлы и, самое главное, абстрактный детский образ машины, на которой он работает. Поскольку пользователь видит только эту часть, а это составляет 99% от размера дистрибутива, легко назвать ее «Операционная система». Правильная номенклатура - называть это дистрибутивом программного обеспечения, созданным какой-либо сущностью (Canonical, Fedora и т. Д.), С использованием ядра (Linux, HURD, BSD и т. Д.) И построенным с использованием набора инструментов (обычно предоставляемых GNU). ).

Чтобы ответить на ваш вопрос, в GNU / Linux (точно так же, как в Windows и OSX, поверьте мне), вы можете изменить ядро, не только версию, но и всю архитектуру (ядро Linux, против ядра HURD) и до тех пор, пока ABI не затрагивается, никогда не вносите ни одного изменения в пользовательский мир ... В те времена, когда настоящему человеку приходилось собирать ядро ​​из исходных текстов, вы могли бы выполнить несколько таких изменений, чтобы получить паршивую веб-камеру USB. чтобы работать ... Теперь, с модульным ядром, вам просто нужно установить модуль, и вы получите совершенно новый мир ядра, с ABI (иногда) расширенными новыми функциями ...

Опять же, то же самое для пользовательского пространства. Когда вы устанавливаете новое приложение, скажем, из репозитория Ubuntu, в 99% случаев вашей главной заботой является совместимость других компонентов пользовательского пространства, а не реального ядра. Есть случаи, когда версия ядра диктует (через ABI) диапазон вещей, которые можно установить в пользовательском пространстве, но цель (по крайней мере, для разработчиков) состоит в том, чтобы сделать это ...

Еще одна вещь для размышления: вы можете (и это довольно легко) создать свой собственный, уникальный в своем роде дистрибутив GNU / Linux. Получить ядро, несколько простых скриптов, несколько приложений, и все готово. Это так просто (взгляните на дистрибутивы OpenWRT GNU / Linux, для сетевого оборудования весь дистрибутив умещается примерно в 16 Мб или около того).

rftghost
источник
«Острая граница (АБИ)». Я думаю, что вы имеете в виду API. Из-за отсутствия лучшего термина ABI представляет собой интерфейс кода к оборудованию. API, с другой стороны, представляет собой интерфейс код-код.
Сэм
1

Я думаю, что они хранятся отдельно, потому что ядро ​​является важной частью. Ядро с регрессией или просто неудачное обновление может нанести довольно большой ущерб. Возможно, вы захотите обновить его реже; или только после некоторого ожидания, чтобы никто не сообщил о проблемах.

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

Франческо Донди
источник