На чем написан linux
Перейти к содержимому

На чем написан linux

  • автор:

Ядро Linux

Ядро является главной частью любой операционной системы. Существует точка зрения, которая понятие операционной системы приравнивает к ядру. Есть точка зрения, когда в понятие операционной системы включают как ее ядро, так и системные программы, позволяющие пользователю обращаться через ядро к аппаратным ресурсам.

Так что же такое ядро ОС и каковы его функции? Как известно, компьютер – не только система аппаратного обеспечения (железа), но и набор работающего на нем программного обеспечения. Чтобы второе могло эффективно работать на первом, нужна более низкоуровневая программа, скрывающая сложности работы с железом и предоставляющая обычным программам и пользователям удобный для них интерфейс.

Железо говорит на языке сигналов, регистров, секторов, переводов головок. Программам все это не надо. Они говорят на языке «записать, прочитать, сложить, вычесть . «. Специальной программой, обеспечивающей остальным простой и понятный интерфейс для работы на имеющемся оборудовании, является ядро операционной системы. Однако создание виртуальной машины – не единственная функция ядра.

Представим себе, что ядра нет, а каждая запущенная программа сама обращается к железу и обрабатывает сигналы от него. Вроде бы ничего страшного, кроме дублирования кода в каждой такой программе. Но на компьютере одновременно работает множество программ. Как они будут «договариваться» между собой о совместном использовании общего аппаратного обеспечения?

Конечно, они могут встать в очередь, и сначала одна программа выполнится полностью, затем другая. Однако одни программы должны работать постоянно в фоновом режиме, другие – могут долго ожидать ввода или вывода, третьи – должны получать данные из другой работающей программы. Поэтому функция оптимального распределения аппаратных ресурсов возлагается на ядро. Оно организует как бы параллельную работу множества программ, играет роль менеджера.

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

Программы могут использовать ресурсы аппаратного обеспечения компьютера благодаря ядру ОС

В коде ядра особо выделяют драйверы устройств. Драйвер – это программный код, функция которого заключается в предоставлении возможности использовать определенное железо (например, видеокарту). Причем конкретный драйвер не всегда загружается в память вместе с остальной частью ядра. Он туда грузится, лишь когда возникает потребность в ресурсах устройства. Так экономится память, но в ущерб скорости.

Выделяют операционные системы на монолитном ядре и микроядре, а также разные промежуточные варианты. Монолитное ядро проще и быстрее работает, так как в памяти всегда находится почти весь код. Микроядро меньше, сложнее, работает медленнее, однако нередко считается более передовым из-за легкости подключения новых частей кода и устойчивости к сбоям оборудования. Микроядро, находясь в памяти, организует взаимодействие между другими частями кода операционной системы, которые являются самостоятельными программами (см. пример выше про загрузку драйверов).

Ядра Unix-подобных систем

Ядро Unix являлось первой практической реализацией новых идей и открытий 60-70-х годов XX века в области создания операционных систем.

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

В 80-х годах Unix-системы начали множиться и видоизменяться. Некоторые умы вовремя спохватились и создали специальные стандарты, обеспечивающие совместимость систем. Это значит, что программа, написанная для одной Unix-подобной системы, должна работать в другой. Стандарты назвали POSIX.

Особенности ядра Linux

Обычные пользователи имеют дело не с чистым Linux, а с дистрибутивами, которые незначительно отличаются между собой, в том числе по компонентам ядра (например, наличию/отсутствию определенных драйверов). Однако основополагающим компонентом все-равно остается ядро Linux, исходники которого предоставляет проект https://kernel.org. Это совместный проект, к нему может присоединится каждый программист. Основным руководителем остается Линус Торвальдс.

С технической точки зрения, Linux – это ядро, а не операционная система. Linux + программы из проекта GNU рождают операционную систему GNU/Linux. Однако ее тоже не существует в чистом виде. Разработчики дистрибутивов дорабатывают на свой лад GNU/Linux, после чего получаются различные операционные системы-дистрибутивы. У каждого дистрибутива есть собственное имя (Ubuntu, Fedora и т. п.). Однако, так как в основе всех этих систем лежит ядро Linux, все они принадлежат одному семейству Linux-систем.

Ядро Linux начал разрабатывать в 1991 году Линус Торвальдс. В дальнейшем оно развивалось и совершенствовалось многими людьми. Ядро Linux выпускается под лицензией GNU GPL v2 (второй версии).

Ядро Linux Unix-подобно, так как заимствовало идеи, заложенные в Unix, соответствует стандартам POSIX, а также по большей части написано на языке С.

Библиотеки GNU С (glibc) выполняет роль оболочки системных вызовов ядра Linux

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

Ядро выпускается в виде стабильных и разрабатываемых версий. В стабильных обычно исправлены ошибки, добавлены новые драйверы устройств. Ранее четное второе число в названии ядра, говорило, что оно стабильно. Нечетное число обозначало разрабатываемую нестабильную версию. В 2011 году от такого подхода к нумерации версий отказались.

Опытные пользователи дистрибутивов Linux нередко сами скачивают и устанавливают себе новое ядро. Для этого они сначала распаковывают исходные коды, затем выполняют конфигурацию, потом компилируют, размещают в загрузочном каталоге и изменяют настройки загрузчика.

Конфигурируют ядро с целью включения, отключения или компиляции в виде модуля какого-либо драйвера или функции. Другими словами, «ядро под себя» не будет содержать лишних драйверов для оборудования, которого нет.

Курс с ответами к заданиям и дополнительными уроками в PDF

X Скрыть Наверх

Введение в Linux и Bash. Курс

Что нового в ядре Linux

image

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

Linux работает практически на всем: все 500 из 500 самых быстрых суперкомпьютеров мира; большинство общедоступных облаков, даже Microsoft Azure; и 74 процента смартфонов. Действительно, благодаря Android, Linux является самой популярной операционной системой для конечных пользователей, чуть обойдя Windows на 4 процента (39% против 35%).

Итак, что же будет дальше с Linux? После освещения Linux на протяжении всех 29 лет его истории и зная практически любого, кто хоть как-то связан с разработкой Linux, включая Линуса Торвальдса, я думаю, что у меня есть ответ на этот вопрос.

Недавние улучшения ядра Linux

Самое большое недавнее улучшение – и ничто другое даже близко не стоит – это то, что Linux теперь станет платформой для виртуальных частных сетей (VPN). Хотя Linux, во многом благодаря OpenVPN, долгое время был важным игроком в сфере VPN, добавление WireGuard, революционного подхода к VPN, меняет всё.

Торвальдсу очень, очень нравится WireGuard, вот что он писал: «Могу ли я еще раз заявить о своей любви к нему и надеяться на то, что в скором времени он будет объединен с ядром?». Чего хочет Линус, то он и получает. WireGuard был объединен с ядром Linux 5.6 в марте 2020 года.

Почему он так важен? WireGuard обладает редким качеством в надежности программы: его код чист и прост. Кроме того, он поддерживает передовые технологии криптографии: Noise Protocol Framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24 и HKDF.

Что еще более важно для пользователей, так это то, что он намного быстрее своих конкурентов. Эталонные тесты показали, что WireGuard быстрее OpenVPN более чем в два раза. Кроме того, он кроссплатформенный, так что вы можете запустить его на Linux сервере, а ваши клиенты могут быть на Windows, macOS, BSD, iOS, Android, и конечно же на Linux.

Ядро Linux 5.6 также может похвастаться и другими значительными улучшениями. Особо выделим то, что для 32-х разрядных систем, Linux решил свою проблему «конца времени». Видите ли, во вторник 19 января 2038 года в 03:14:08 по Гринвичу (GMT, также известное как Всемирное координированное время) наступит конец света.

Случится то, что значение времени в 32-х разрядных операционных системах на основе UNIX, таких, как Linux и старых версий macOS, исчерпает 32-х битные числа. После этого, отсчёт времени пойдет в обратную сторону с отрицательными числами. А Вы думали, что ошибка 2000 года была страшной!

Всё началось с того, что UNIX, отец Linux, датирует начало времени в секундах от 1 января 1970 года 00:00:00 GMT. Проблема была в том, что UNIX начиналась как 32-х разрядная операционная система, которая хранила время в виде одного 32-х разрядного целого числа со знаком. Это много секунд, но этого недостаточно. Исправление позволяет даже 32-х разрядному Linux использовать 64-х разрядные числа. Конечно это только задерживает проблему до воскресенья 4 декабря 29227702659 года 5:30:08 GMT, но меня это вполне устраивает.

Android и Linux синхронизируются

Все кто обращают внимание на операционные системы знают, что Android это специализированный дистрибутив Linux для мобильных устройств. Но возможно мало кто знает, что на протяжении многих лет, Android был форком Linux. Даже сейчас, спустя 10 лет после того, как разработчики Android и ядра Linux cнова начали работать вместе и хорошо взаимодействовать друг с другом, они не совсем идут «нога в ногу». Но это меняется.

Джонатан Корбет, разработчик ядра Linux и писатель, сказал в своем ежегодном отчете по ядру Linux следующее: «последнее стабильное ядро находится на пути к тому, чтобы стать частью общего образа системы Android, а затем они будут отслеживать стабильные обновления. Это будет означать, что они будут гораздо ближе к современному уровню техники».

Для Вас это может показаться неважным, но это важно, и вот почему. Сегодня прежде чем Linux окажется на этом новом, стильном Android-телефоне, который у Вас в руках, он проходит три отдельных, трудоемких этапа. Сначала Google берет ядро Linux с долгосрочной поддержкой (LTS) и добавляет в него специфичный для Android код, для того что бы сделать общее ядро Android. Затем Google отправляет его производителю систем на кристалле (SoC), например, Qualcomm. OEM-производитель адаптирует ядро под конкретную SoC и чипсет. Наконец адаптированное общее ядро Android (SoC ядро), передается производителю смартфона. Производитель уже добавляет свои доморощенные, проприетарные драйверы для дисплея, камеры и Wi-Fi/сотового модема. В результате получается ядро устройства – это то, что у Вас на телефоне.

Попутно каждый телефон вбирает в себя, буквально, миллионы строк кода ядра, не являющиеся частью стандартного дистрибутива. Во многом это драйверы устройств, потому что, каждый смартфон или планшет на Android поставляется со своим набором драйверов. Вот почему так сложно сделать по-настоящему универсальный дистрибутив для Android-смартфона, такой как операционная система /e/. Каков результат? В этом стильном, новом телефоне, который у Вас в кармане, установлено ядро Linux, которому уже 2 года. Благодаря этим древним ядрам, LTS-ядра Linux теперь поставляются с шестилетней поддержкой.

Google и поставщики не больше стремятся, чем Вы бы хотели, перенести исправления безопасности на пыльные, старые ядра. Поэтому Google, совместно с сообществом разработчиков, пытается привести поставляемые версии Android, в соответствие с основными текущими ядрами Linux.

Конечно это займет некоторое время, но пара вечных проблем Android – отказ разработчиков Linux поддерживать стабильный двоичный интерфейс приложения (ABI) и столь же твердый отказ производителей оборудования открыть исходные коды своих драйверов – остаются с нами и по сей день. ABI определяет как программа взаимодействует с оборудованием, когда Вы не знаете как работать с ним на уровне кода приложения. Разработчики открытого исходного кода хотят работать на уровне API, в то время как производители оборудования довольно часто хотят оставить свои устройства в виде таинственного черного ящика, доступ к которому возможен только через ABI. Несмотря на это мы наконец-то приблизились к ускорению интеграции Linux в производственный конвейер Android, а это означает, что Android будет более безопасным из коробки.

eBPF: Межсетевой экран, который стал отладчиком Linux

Корбет также рассказал о росте интереса к расширенному фильтру пакетов Беркли (eBPF), используемого как мощный инструмент отладки ядра Linux. Вы спросите, как такое могло произойти? Смотрите.

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

Вы можете запустить eBPF в ответ на действия в tracepoints, kprobes и perf-событиях. Это позволяет Вам отлаживать проблемы ядра и выполнять анализ производительности. Более того, поскольку eBPF программы могут иметь доступ к структурам данных ядра, Вы можете писать, добавлять и тестировать новый отладочный код без перекомпиляции ядра. Для занятых разработчиков это большая экономия времени. Теперь системные администраторы и программисты, не входящие в круг тех, кто работает непосредственно с ядром Linux, начинают использовать возможности eBPF.

Rust становится вторым языком программирования Linux

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

На виртуальной конференции «2020 Linux Plumbers Conference», где ведущие разработчики ядра Linux обсуждают будущее Linux, говорилось о введении Rust в качестве второго языка ядра. Rust – это системный язык программирования высокого уровня, спонсируемый Mozilla, являющейся материнской компанией Firefox. Верите Вы или нет, но эта идея получает широкую поддержку. Хотя сам Торвальдс уверен в том, что Linux не будет написан на Rust. Однако ведь цель не в этом. Никто не собирается переписывать на Rust, 25 миллионов строк ядра, написанных на Си.

Использование Rust, языка системного уровня, внутри ядра, было предложено Джошем Триплеттом, ведущим специалистом по языку Rust, и Ником Десолнерсом, инженером Google. Почему Rust? Потому что он гораздо безопаснее, чем Си, особенно когда дело доходит до работы с памятью.

Как пояснил Райан Левик, главный защитник облачных разработчиков Microsoft, «Rust полностью безопасен для памяти». Если принять во внимание, что примерно две трети проблем безопасности могут быть вызваны плохой работой с памятью, то это довольно серьезное улучшение. Кроме того, Райан Левик говорит, что «Rust предотвращает эти проблемы, как правило, без добавления каких-либо накладных расходов во время выполнения».

Торвальдс видит в этом свои преимущества. Хотя он поощряет медленный, но неуклонный подход к внедрению Rust в Linux, он также сказал, что использование интерфейсов Rust для драйверов и других программ, не связанных с ядром, имеет смысл: «Я убежден что это произойдет. Это может быть и не Rust, но может случиться так, что у нас будут разные модели для написания подобных вещей, и Си не будет единственной».

Пока разработчики ядра медленно двигаются вперед, другие разработчики дистрибутивов Linux, не теряя времени, приняли Rust. Amazon Web Services (AWS) объявила, что ее только что выпущенный Bottlerocket Linux для контейнеров в основном написан на Rust.

Подобно Microsoft и Firefox, если назвать еще две компании, включающие Rust в свои планы разработки, AWS нравится Rust за его функции защиты памяти. Самарта Чандрашекар, менеджер по продукту AWS, сказала, что это «помогает обеспечить безопасность потоков и предотвратить ошибки, связанные с памятью, например, переполнение буфера, которое может привести к уязвимостям в безопасности».

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

Ядро Linux 6.0 и выше

К концу этого года появится Linux 6.0. Но не стоит сильно обращать внимание на это число. В свое время, Торвальдс сказал о выпуске 5.0 следующее: «Я хотел бы отметить (ещё раз), что мы не делаем функциональные релизы, и что 5.0 не означает ничего большего, чем то, что числа 4.х стали такими большими, что у меня не хватает пальцев на руках и ногах, чтобы сосчитать их».

Забегая вперед можно сказать, что Linux версии 6.0, как и большинство предыдущих релизов, будет состоять из новых и улучшенных драйверов оборудования. Однако все заметят одно перспективное изменение: Linux наконец-то будет поддерживать набор инструкций AMD и Intel FSGSBASE. Хорошо, если вы и вправду не заядлый разработчик, то я только что Вас потерял. В общем, если коротко, то Ваша машина будет работать гораздо быстрее под управлением Linux, поддерживающим этот набор команд.

Вы можете резонно спросить меня, насколько быстрее? Я отвечу, ранние тесты производительности, проводимые на бета-версии ядра Linux 5.9, показали значительное улучшение ввода/вывода. С Redis, хранилищем структур данных в памяти, которое часто используется как база данных, прирост производительности составил более 50 процентов. Что не так уж и плохо!

Итак, все сводится к тому, что Linux продолжает улучшать свою скорость и безопасность. И как это ни удивительно, Linux продолжает расширять свои рынки благодаря недавно интегрированной WireGuard VPN.

Кто знает, возможно, 2021 год станет годом рабочего стола Linux? В конце концов, 2020 год был годом Linux на рабочем столе Windows.

Анатомия GNU/Linux

Какое-то время назад на Хабре была небольшая волна постов на тему «Почему я [не] выбрал Linux». Как порядочный фанатик я стриггерился, однако решил, что продуктивнее что-нибудь рассказать о своей любимой системе, чем ломать копии в комментариях.

У меня сложилось впечатление, что многие пользователи GNU/Linux слабо представляют, из чего сделана эта операционная система, поэтому утверждают, что она сляпана из попавшихся под руку кусков. В то же время, архитектура большинства дистрибутивов является устоявшейся и регламентируется рядом стандартов, включая стандарт графического окружения freedesktop.org и Linux Standard Base, расширяющий стандарты Unix. Мне при знакомстве с GNU/Linux несколько лет назад для погружения не хватало простой анатомической карты типичного дистрибутива, поэтому я попробую рассказать об этом сам.

Загрузчик

Сеанс операционной системы начинается с загрузчика, как театр с вешалки. Дефолтным загрузчиком сегодня является GNU GRUB, известный так же как GRUB 2. По-прежнему доступна первая ветка, называемая теперь «GRUB Legacy». Другой загрузчик с давней историей — Syslinux.

Задача загрузчика — инициализировать ядро Linux. Для этого, в общем случае, нужно знать, где ядро лежит, и уметь прочитать это место (раздел Ext4, скажем). Ядру в помощь загрузчик обычно так же подтягивает начальный образ загрузки, о котором скажем позже. GRUB умеет много прочего, типа построения весьма сложных меню и чейнлоадинга других загрузчиков (Windows Boot Manager например). GRUB имеет конфигурационный синтаксис, отдалённо напоминающий шелл, и расширяется модулями.

GRUB велик и могуч, порой даже слишком, и встраиваемые системы часто используют компактный Das U-Boot.

Ядро

Могучий Linux («не оставляй нас, монолит!»). Ядро операционной системы, созданное, чтобы работать с POSIX-совместимыми окружениями. Обычно лежит в /boot/ и содержит в названии слово vmlinuz , где «vm» напоминает нам о поддержке виртуальной памяти, а «z» указывает, что файл сжат.

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

  • mainline («основное»);
  • LTS (с расширенной поддержкой);
  • rt (патченное для поддержки исполнения в режиме реального времени);
  • с различными патчами для повышения производительности или защищённости (zen, hardened etc);
  • libre (почищенное от проприетарных блобов ядро, ожидаемо поддерживающее мало оборудования).
  • совсем экзотичные варианты с не-Linux ядром типа Debian GNU/Hurd (с ядром GNU Hurd) и Debian GNU/kFreeBSD (с ядром FreeBSD соответственно). Это уже, конечно, не GNU/Linux.

Начальный образ загрузки

Начальный образ загрузки известен так же как initrd и initramfs. Представляет собой архив с образом файловой системы, развёртываемой в оперативную память в начале процесса загрузки. Несёт в себе различные драйверы и скрипты, позволяющие инициализировать оборудование и смонтировать файловые системы.

Содержимое начального образа загрузки зависит от версии ядра и потребностей пользователя (кто-то использует ZFS, а у кого-то корень зашифрован LUKS). Поэтому образ не поставляется в дистрибутивах. В дистрибутивах поставляются фреймворки для создания начальных образов по мере необходимости. Так, обычно создание свежего образа инициируется при обновлении ядра. Вот несколько популярных фреймворков:

  • initramfs-tools — детище Debian.
  • Dracut (произносится созвучно с сушёной кошкой) — в RHEL и производных (CentOS, Scientific Linux etc.). Наиболее гибкий и современный инструмент из перечисленных, если спросите меня.
  • mkinitcpio поставляется в Archlinux, хотя мейнтейнеры подумывают о Dracut, который уже включён в репозиторий и установочные образы.
  • make-initrd — свой путь у замечательного отечественного дистрибутива Alt Linux.

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

Init

Система инициализации — это пастырь процессов. Она стартует раньше всех и имеет PID 1. Она определяет уровень запуска системы и жизненный цикл большинства служб. Независмо от того, что за система инициализации представлена, она предлагает исполняемые файлы /sbin/init (или /usr/bin/init , или в том же духе, ну вы поняли).

Холиварный элемент. Много лет с нами была Sysvinit, пришедшая из варианта ОС Unix System V. Sysvinit полагалась в огромной степени на скрипты инициализации. Служил этот инит, в общем, исправно, но постепенно некоторым инженерам стало мозолить глаза последовательное исполнение скриптов и собственно скрипты, известные в жарких спорах за свою распростёртость как «баш-портянки». В конце 00-ых-начале 10-ых как грибы после дождя расплодились альтернативные системы инициализации: OpenRC от Gentoo, Upstart от Canonical, Systemd от Red Hat за авторством Леннарта Поттеринга. В конце концов по причинам техническим и политическим всех сожрала Systemd. Её восхваляют и ненавидят. Восхваляют в основном за простой и лаконичный синтаксис служб. Так, скрипт запуска веб-сервера Apache для классического инита занимает 153 строки включая комментарии, а файл службы из пакета apache в Arch Linux — 15 строк. Недолюбливают в основном за то, что эта система инициализации подрабатывает ещё и резолвером, планировщиком, менеджером сети, менеджером монтирования и Бог весть ещё чем, попирая дзен Unix.

Командная оболочка

Командная оболочка, она же командный интерпретатор или просто шелл. Неискушённый пользователь скажет — «в гробу я этот шелл видал, можно в графическом режиме жить», и будет неправ, поскольку шелл прописан в стандарте POSIX и необходим для работоспособности системы. Есть понятие «оболочка входа» (login shell) — это первый процесс, запускамый при входе пользователя. Он подтягивает опции и переменные окружения из конфигурационных файлов, все последующие процессы запускаются в контексте этого шелла. Что будет запущено в качестве оболочки входа, определяется в /etc/passwd .

Наиболее распространены сегодня следующие оболочки:

  • Bourne shell (sh) — «тот самый шелл», сложно найти дистрибутив без него.
  • Bourne again shell (bash) — принят по умолчанию в качестве пользователькой оболочки в большинстве GNU/Linux дистрибутивов и предлагает ряд удобств по сравнению с sh.
  • Debian Almquist shell (dash) — компактная облочка, совместимая с sh. Традиционно используется в Debian, где /usr/bin/sh на неё ссылается.
  • Z shell (zsh) — похож на bash, но предлагает оригинальные фишечки для интерактивного ввода. Редко идёт из коробки, но обычно поставляется в репозитории.
  • BusyBox — утилита для встраиваемых систем, которая предоставляет целое пользовательское окружение, в том числе — POSIX-совместимый шелл (вызывается так: $ busybox sh ).

Графический сервер

Демон, отвечающий за отрисовку окошек. Золотой стандарт графического сервера — X Window System с нами аж с 1984 года. Это именно стандарт, архитектура и набор протоколов. Реализаций за прошедшие годы была уйма, в каждой собственнической Unix-системе была своя. В GNU/Linux (и BSD) долгое время применялся Xfree86. Теперь с нами X.Org Server, или просто Xorg, он отпочковался от XFree86.

X Window System — мощная и богатая система, так, одна из возможностей — сетевая прозрачность. Вы можете запустить на своём хосте графическое приложение с другой машины, даже когда на той машине графический сервер не запущен. При помощи SSH это можно сделать, например, так (может потребоваться небольшая донастройка sshd):

$ ssh -X hostname firefox

Надо сказать, терминология X Window System контринтуитивна: клиентом называется графическое приложение, а сервером — отрисовывающее. На этот счёт прошлись в классической монографии «The UNIX-HATERS Handbook».

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

В окружениях рабочих столов активно используется X keyboard extension, расширение, отображающее нажатие клавиш на различные раскладки.

«Иксам» пророчат скорую кончину. Именно обширность и сложность стандарта побудила разработчиков СПО начать работу над новым стандартом — протоколом Wayland. Wayland достиг определённой стадии зрелости и с переменным успехом внедряется дистрибутивами как графический сервер по умолчанию. Тем не менее, проект Wayland начат в 2008 году, а стандарт X ещё не спешит уходить с голубых экранов.

Оконный менеджер Weston

На скриншоте Weston — эталонная реализация композитного менеджера Wayland. Умеет крутить окошки. А ещё его можно запустить внутри другого рабочего стола, просто выполнив в терминале weston .

После старта графический сервер обслуживает иерархию окон. Существует понятие «корневое окно» (root window), оно, в свою очередь, «владеет» окнами панелей, приложений. Окна приложений «владеют» своими модальными окнами. Обычно обои рабочего стола отрисовываются в корневом окне.

Дисплейный менеджер

Не вполне интуитивно названные, дисплейные менеджеры (DM) рисуют для нас приветливое окошко входа в систему. Обычно, помимо ввода логина и пароля, они позволяют выбрать сессию (при наличии выбора в вашей системе) и задать язык сеанса. Дисплейные менеджеры делают плюс-минус одну и ту же нехитрую работу, их многообразие оправдано консистентностью с различными средами рабочего стола (что зависит, по большей части, от графического тулкита и утилит настройки). Можно жить без дисплейного сервера, как в старые добрые времена. Для этого потребуется настроить ваш ~/.xinitrc на запуск необходимого сеанса рабочего стола. Это позволит входить через ядерную консоль и запускать рабочий стол командой startx .

Жизнь без DMЖизнь c SDDM

Типичные представители дисплейных менеджеров:

  • GDM из набора GNOME;
  • SDDM из комплекта KDE;
  • LightDM — универсальный вариант;
  • FlyDM — из поставки Astra Linux.

Окружение рабочего стола

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

  • диспетчер окон;
  • файловый менеджер;
  • панель с треем и меню запуска приложений;
  • эмулятор терминала;
  • хранитель экрана, он же блокировщик экрана;
  • менеджер питания;
  • браузер, которым никто не пользуется;
  • почтовый клиент (у зажиточных окружений);
  • и проч., и проч.

Два могучих окружения, GNOME и KDE, сражаются за сердца простых пользователей, а остальные массовые десктопы им завидуют нередко пользуются их наработками. Некоторые хардкорные пользователи предпочитают собирать окружение рабочего стола самостоятельно на базе оконных менеджеров типа Awesome и i3.

Оконный менеджер Window Maker

На скриншоте оконный менеджер Window Maker из состава GNUstep. GNUstep воспроизводит окружение NeXTSTEP. Поставляется в репозиториях большинства дистрибутивов.

Графические тулкиты

Графический тулкит — библиотека или фреймворк, упрощающая рисование формочек и кнопочек, причём в едином стиле. То, чем занимается Windows Forms на ОС другого производителя, а так же занимался некогда полулярный Motif на старых юниксах (Open Motif доступен поныне).

Флагманами в этой категории долгое время были и остаются GTK и Qt. GTK родился как тулкит для свободного графического редактора GIMP и позже переполз под крыло GNOME. Написан на чистом C с классами, имеет официальные байндинги к Python и C++, а ещё породил целый язык общего назначения Vala. Qt — изначально коммерческий проприетарный тулкит, сейчас является свободным ПО (но по-прежнему коммерческим). Написан на C++ с размахом, заменяя стандартную библиотеку и кучу других библиотек и предлагая метаобъектный компилятор (кодогенератор). Имеет байндинги к куче языков. KDE гордо зиждется на этом великолепии.

Графическое API

Mesa — это каркас для видеовывода. Меза предоставляет API OpenGL и, с не столь давних пор, Vulkan (и несколько других API типа VDPAU и VAAPI). Можно сказать, что Mesa берёт на себя вопросы графики, которыми обычно занимается DirectX в ОС другого производителя.

Безопасность

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

PAM — Pluggable Authentication Modules — модульная система авторизации. Отвечает, как понятно из названия, за авторизацию пользователей в системе, причём разными способами. Через PAM авторизуются в том числе доменные пользователи, в таком случае PAM действует в связке с имплементацией Kerberos (обычно MIT’овский krb5), поскольку сам по себе PAM не работает с удалёнными клиентами. Модули представляют собой разделяемые библиотеки (исполняемые файлы с суффиксом so ) и позволяют делать интересные штуки при входе пользователя. Например, можно создавать домашнюю директорию при первом входе ( pam_mkhomedir.so ) или монтировать файловые системы ( pam_mount.so ).

Классическая утилита su и более молодая sudo предназначены для исполнения комманд от имени другого пользователя (по умолчанию root ). Наиболее значимая разница — su требует пароль пользователя, из-под которого вы хотите работать, а sudo — ваш пароль. sudo гибко настраивается, позволяя запускать только определённые команды определённым пользователям из-под других определённых пользователей, как-то так.

Менеджер авторизации Polkit позволяет непривилегированным процессам взаимодействовать с привилегированными. По сути он похож на sudo, но обладает превосходящей гибкостью и предназначен в первую очередь для приложений, в то время как sudo — утилита для пользователя. Правила пишутся, внезапно, на JavaScript’е.

Linux Security Modules (LSM) — фреймворк внутри ядра Linux, позволяющий накладывать на систему дополнительные моде́ли безопасности. Это достигается при помощи мо́дулей безопасности, не путать с модулями ядра. Наиболее популярные модули безопасности — SELinux и AppArmor. Первый явлен миру АНБ и развивается Red Hat, второй рождён в рамках ОС Immunix и сегодня развивается Canonical Ltd. Соответственно, SELinux поставляется в RHEL и производных, а AppArmor — в Ubuntu. Оба модуля имеют сходное назначение и привносят в систему мандатное управление доступом. Оба модуля повышают безопасность системы, не позволяя приложениям делать то, что от них не ожидается. Так, сконфигурированные модули безопасности не дадут веб-серверу шариться по диску вне нескольких ожидаемых директорий. Обратной стороной является необходимость конфигурировать систему безопасности для каждого мало-мальски нестандартно настроенного приложения. Не у многих на это хватает энтузиазма, так что обычно модуль безопасности просто переключается в разрешающий режим.

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

Подсистема печати

CUPS — «общая система печати UNIX», рождённая компанией Apple. Система модульная, поддерживает огромное количество устройств и, насколько мне известно, на сегодня не имеет альтернатив. А ещё CUPS имеет веб-интерфейс (по умолчанию на localhost:631).

Морда CUPS

CUPS работает только с печатающими устройствами, сканеры поддерживаются фреймворком SANE. К сожалению, спектр поддерживаемых устройств у SANE не очень широк. Некоторые вендорские драйверы для МФУ обеспечивают одновременно работоспособность сканера и работоспособность принтера через CUPS. Так, например, делает HPLIP от HP Inc. Благдаря HPLIP GNU/Linux может похвастаться отличной поддержкой печатающих устройств от HP. В то же время, HPLIP прикручен к CUPS немного сбоку, и часто проблематично настроить устройства HP только утилитами CUPS, как многие другие принтеры. Приходится использовать hp-setup .

Звуковая подсистема

Продолжительное время основной звуковой подсистемой ядра является ALSA. Некоторые пользователи ошибочно считают, что PulseAudio заменил ALSA. Это не так, PulseAudio — это звуковой сервер, являющийся лишь слоем абстракции, упрощающим управление аудиопотоками. Другим аудиосервером является JACK, который предназначен для профессиональной работы с аудио. Он не столь удобен для пользователя, но обеспечивает низкие задержки и предоставляет гибкую маршрутизацию MIDI-потоков.

Red Hat готовит нам PipeWire на замену PulseAudio и JACK. Следим за событиями.

Межпроцессное взаимодействие

Здесь речь не про низкоуровневые POSIX-штуки типа разделяемой памяти и сокеты. За свой век GNU/Linux повидал несколько подсистем, призванных упростить межпроцессное взаимодействие (IPC) десктоп-приложений. Сейчас правит бал шина сообщений D-Bus, а об остальных позабыли. Для чего это нужно? Например, некая служба посылает в шину сообщение об изменении своего состояния, а апплет панели слушает его и изменяет свой индикатор. Так обычно работают апплеты громкости и клавиатурной раскладки.

Сеть

Традиционно в различных дистрибутивах GNU/Linux сеть настраивалась скриптами (причём различными). NetworkManager — детище Red Hat, созданное, чтобы править всеми интерфейсами. В годы юности NM вызывал приступы фрустрации у пользователей, но потом всё стало неплохо. NetworkManager позволяет управлять проводными и беспроводными интерфейсами, всевозможными тунелями, виртуальными мостами, VLAN’ами и аггрегированными каналами, причём как при помощи графических фронтендов, так и псевдографического nmtui и текстового nmcli . Вещь удобная и универсальная, в дистрибутивах Red Hat, ожидаемо идёт по умолчанию, в Debian и производных идёт только с рабочим столом, а в «безголовом исполнении» NM опционален. Есть альтернативы попроще, например — Wicd.

Работоспособность WiFi-устройств, как правило, обеспечивает демон WPA supplicant, у которого есть конкурент iwd, написанный ни много ни мало, компанией Intel.

Тут же хочется упомянуть демон Bluez, обеспечивающий работу с Bluetooth-устройствами.

Межсетевой экран

Слава iptables гремит далеко за узким кругом бородатых админов. Это не фильтр сам по себе, а лишь набор утилит в пространстве пользователя, работающий с подсистемой Linux Netfilter. Недавно (в историческом масштабе) добавилась подсистема ядра nftables и соответствующая пользовательская утилита nft. Это было сделано, в первую очередь, для унификации интерфейсов таблиц маршрутизации IPv4, IPv6, ARP и софтовых L2-коммутаторов. В современных дистрибутивах команды iptables являются лишь обёрткой для nftables и не рекомендуются к использованию. В целом, конфиг nft выглядит опрятнее дампа iptables.

Существует пачка высокоуровневых фаерволлов-обёрток над nftables (в том числе графических), так в RHEL и производых из коробки идёт firewalld, а в Ubuntu — UFW.

Пакетный менеджер

Пакетный менеджер — это сердце дистрибутива. Наиболее именитые и с длинной историей — это RPM из мира Red Hat и dpkg из семества Debian. Пример более современного — pacman из Arch Linux. Старожилы RPM и dpkg работают только с локальными пакетами: они их распаковывают, устанавливают и проверяют, что все зависимости удовлетворены. Работой с репозиториями занимаются другие утилиты, являющиеся как бы фронтендом к самому пакетному менеджеру. В RHEL ранее поставлялась утилита yum, на замену которой пришла dnf, в Debian раньше были apt-get и apt-cache, затем их увязали в одну команду apt. Более молодой pacman не имеет видимого пользователю разделения на несколько утилит и предлагает очень простой формат пакетов, которые можно собирать буквально на коленке. Есть и множество других, со своими особенностями. Например nix, который позволяет иметь в системе несколько версий одного пакета.

Новое в исторических масштабах явление — кросс-дистрибутивные системы поставки приложений. Появились в попытке преодолеть ад зависимостей, облегчить труд разработчиков и мейнтейнеров (избавив их от необходимости создавать десятки пакетов под разные версии и ветки GNU/Linux). Наиболее популярные проекты: Flatpack от Gnome, Snap от Canonical и AppImage сам по себе. Они несколько отличаются подходами, но в общем случае обеспечивают установку приложений со всем рантаймом и некоторой степенью изоляции от системы. Штуки удобные, однако подход несколько напоминает традиции тащить все зависимости с устанавливаемой программой в популярной ОС другого производителя. Простоты и порядка в систему не добавляют.

Для перечисленного добра есть красивые обёртки в виде магазинов приложений, два самых ходовых — GNOME Software и KDE Discover.

KDE DiscoverGNOME Software с фирменной кнопочкой в заголовке окна

Заключение

Краткая результирующая диаграмма:

Современный GNU/Linux в представлении художника

Если присмотреться к перечисленным составляющим GNU/Linux, можно заметить, что львиная доля технологий привносится несколькими крупными организациями. К ним относятся:

  • проект GNU под эгидой Free Software Foundation;
  • Red Hat, производитель коммерческого дистрибутива, недавно вошедший в состав IBM;
  • сообщество kernel.org при поддержке Linux Foundation.

В интернете ради флейма часто вкидывают, мол, поглядите — эти ваши линуксы делают клятые корпорации, где ваше хвалёное сообщество? Я думаю, не стоит противопоставлять отдельных энтузиастов и организации: все они вращают колесо open source. В конце концов, в больших организациях трудятся обычные люди. В итоге мы имеем очень динамичную систему, в которой не без причины компоненты сменяются один за другим, всё это куда-то движется, и, в общем-то, год от года хорошеет. Я надеюсь, в этом очерке удалось дать представление об анатомии GNU/Linux, а может быть и заинтересовать кого-нибудь закопаться поглубже.

Большое спасибо @ajijiadduh, который отловил огромное количество опечаток сразу после публикации, и всем прочим пользователям, указавшим на ошибки.

Правки и предложения вы можете присылать по адресу https://gitlab.com/bergentroll/gnu-linux-anatomy.

Copyright © 2020 Антон «bergentroll» Карманов.

На каком языке написан Linux?

Как пишется сейчас не знаю, но изначально вроде было так: ядро писалось на ассемблере (что, в принципе, естественно), может ещё какие-то части писались на нём же (скорее всего системные), остальное — на с++. Ты учти, что линукс это не винда, тут нельзя так говорить, что и как пишется. Линукс — сборная салянка от разных программистов, так что если ты возьмёшь Линукс от Мандрейка например и Линукс от Ред Хат, то это не будет означать, что это один и тот же Линукс, даже если там будут стоять одинаковые версии ядер. Советую прочитать просто историю о создании Линукс, тогда ты лучше поймёшь концепцию и будешь лучше разбираться. Её можно найти по яндексу, секретов из этого никто не делает.

Остальные ответы

Что касается ядра — бОльшая часть — на С, некоторые низкоуровневые модули на АСМе. Все остальное пишется на том, на чем удобно, но все же в основном на С++ и С

Похожие вопросы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *