Что делает дистрибутив GNU и существуют ли дистрибутивы Linux, которые не являются GNU?

Что делает дистрибутив GNU и существуют ли дистрибутивы Linux, которые не являются GNU?

Итак, GNU/Linux — это операционная система, состоящая как минимум из нескольких программ: Linux kenel, gcc, gnu-binutils, рабочий стол Gnome и т. д.

  • Что делает дистрибутив Linux GNU? Инструменты, с помощью которых было скомпилировано ядро? Инструменты, с помощью которых дистрибутив поставляется?

  • Существуют ли полнофункциональные операционные системы для настольных компьютеров, основанные на Linux, но не GNU?

решение1

TheФонд свободного программного обеспечения утверждаетчто большинство дистрибутивов Linux на самом деле являются системами GNU, которые используют ядро ​​Linux. Они основывают это утверждение на том факте, что GNU был давним проектом по разработке свободной операционной системы до появления Linux, и чтоядро было лишь последней недостающей частью. Они правы в том, что практически все дистрибутивы Linux для настольных ПК и серверов используют по крайней мере некоторые компоненты GNU, возможно, самое главное —Библиотека GNU C(глибк),Основные утилиты GNU(coreutils) иБашshell. Более того, разработка ядра Linux по своей сути связана с GCC, из-заиспользование расширений GCC.

Некоторые встроенные системы, возможно, наиболее заметным является Android от Google, не используют никаких компонентов или библиотек GNU. Например, в Android библиотека GNU C заменена собственной библиотекой Bionic C от Google на основе BSD. FSF соглашается, что не следует называть такую ​​систему«Системы GNU» или «GNU/Linux», но с другой стороны, они не хотели бы, чтобы их называли просто системами "Linux". По крайней мере, мы можем сделать вывод, что, похоже, существует консенсус относительно того, что использование инструментов GNU для сборки ядра, делаетнетсделать систему «системой GNU».

решение2

История терминологии GNU/Linux восходит к началу 1990-х годов.

В 1991 году Линус Торвальдс начал проект ядра Linux в своей спальне в Хельсинки. Вскоре после этого ядро ​​Linux начало приобретать значительную популярность, чему способствовало развитие Интернета.

Проект GNU Ричарда Столлмана в то время все еще планировал использовать микроядро HURD в качестве ядра запланированной операционной системы GNU. Однако, когда дистрибутивы Linux (свободные Unix-подобные операционные системы на основе ядра Linux) начали формироваться вокруг нового проекта ядра Linux, Столлман заинтересовался. Когда в 1993 году начался проект Debian под руководством Яна Мердока, FSF оказал некоторую финансовую поддержку молодому проекту. Однако разработчики Debian быстро расстались со Столлманом и FSF, отчасти по техническим вопросам. Например, одной из проблем было то, что Столлман хотел сохранить отладочные символы в программе, в то время как Debian хотел убрать их.

После того, как пути Debian и FSF разошлись, Столлман попросил, чтобы Debian называл себя GNU/Linux. Запрос был направлен Брюсу Перенсу, поскольку Мердок передал ему руководство. Поскольку эти организации расстались в хороших отношениях и разделяли (и разделяют) общие цели, разработчики Debian сделали так, как он просил. Конечно, верно, что Столлман продвигал такие названия независимо, но сотрудничество реальной операционной системы на базе Linux в упоминании себя таковым имело важное значение для продвижения использования такого названия.

Обоснование, данное Столлманом, включало в себя следующее: (a) ядро ​​системы, помимо ядра Linux, в значительной степени состояло из инструментов GNU, (b) ядро ​​Linux было в некотором смысле кульминацией/завершением проекта GNU, который пытался получить работающее ядро ​​в течение некоторого времени, поэтому оно должно использовать это название как способ признания и напоминания людям об идеалах проекта GNU. Причина (a) имеет тенденцию упоминаться гораздо чаще, хотя это было не совсем верно тогда, и еще менее верно сейчас, хотя явно важные части операционной системы на основе Linux зависят от инструментов GNU, например, bash, gcc, binutils, gdb, libc и т. д., в некоторых случаях их можно заменить другими инструментами. Таким образом, такие аргументы, по крайней мере, спорны и, действительно, были предметом многочисленных споров.

Насколько мне известно, только Debian и (некоторые) его производные (следуя примеру своего родителя) называют себя GNU/Linux. Однако другие так называемые дистрибутивы Linux, такие как Fedora, Gentoo и т. д., по сути ничем не отличаются от Debian — это в основном одно и то же программное обеспечение. Так что есть веские причины называть их GNU/Linux.

Не так много систем используют ядро ​​Linux без пользовательского пространства GNU, поскольку эти две системы в значительной степени разрабатывались вместе и переплетены различными способами. (Например, ядро ​​Linux написано на расширенном (GNU) C gcc и не собирается с помощью стандартного компилятора C.) Как сказал Томас, очевидным примером является Android, но поскольку он был так сильно разветвлен Google, возникает вопрос, правильно ли теперь называть ядро ​​Android Linux, хотя и ведутся разговоры о слиянии/примирении в будущем.

Кстати, к сожалению, Столлман и FSF, по-видимому, довольно жестко продвигают терминологию GNU/Linux. Например, Джонатан Корбетнаписал в комментарии LWNчто FSF отказывается разговаривать с ним, если он не использует термин GNU/Linux. Джон, помимо того, что он является основателем LWN, также является старшим и уважаемым разработчиком ядра. В целом комментарий гласит:

Просто для ясности: мы перестали спрашивать FSF о комментариях много лет назад, потому что FSF отказались разговаривать с нами без предварительных обещаний с нашей стороны о том, что мы скажем и какие термины будем использовать. Мы не хотим давать такие обещания. Если политика FSF в таких вопросах изменилась, мы были бы рады узнать об этом.

Это, несомненно, относится, помимо прочего, к настойчивому использованию терминологии GNU/Linux.

Вышеуказанная история подробно описана в Главе 6 («Загрузка, затем корень») книги «Код мятежника» Глина Муди.

решение3

Операционная система представляет собой комбинацию ядра и пользовательского пространства. По сути, ядро ​​управляет оборудованием, а пользовательское пространство предоставляет пользователям комплексный интерфейс.

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

Однако у них не было ядра. Хотя у них былоХёрдЯдро, оно слишком долго готовилось. А потомпришел ЛинуксБлагодаря большому энтузиазму вокруг него он развивался быстрее, чем Hurd.

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

У вас есть другие пользовательские пространства, такие как BSD utils илиBusyBox. Однако они более или менее полны по сравнению с утилитами GNU, и некоторое программное обеспечение будет работать только с пользовательским пространством GNU. Например, большинство операционных систем BSD используют GCC в качестве компилятора, в то время какLLVMскоро изменит эту ситуацию.

И как универсальная операционная система, вы можете запуститьDebian с ядром FreeBSD и пользовательским пространством GNU.

решение4

Что делает дистрибутив Linux GNU? Инструменты, с помощью которых было скомпилировано ядро? Инструменты, с помощью которых дистрибутив поставляется?

Да и да. Ядро — это один монолитный автономный исполняемый файл.Всееще находится в "пользовательское пространство". Обычно пользовательские приложения используют как минимум одну системную библиотеку — стандартную библиотеку C. 1 В дополнение к различным служебным функциям, именно она обеспечивает доступ к системным вызовам — запросам к системе, т. е. ядру, сделать что-либо — что необходимо даже для самых простых задач, таких как работа с файлами. Реализация библиотеки C, используемая с Linux, — это glibc — библиотека GNU C.

Само ядро ​​Linux написано на языке C, и для его работы также требуется библиотека C, за исключением того, что в этом случае необходимые части компилируются внутри, а не снаружи. Обычно для этого используется компилятор GCC — «GNU Compiler Collection», а библиотека C — glibc.

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

Чтобы проиллюстрировать это, вы можете использовать lddна различных исполняемых файлах, включая библиотеки (которые являются исполняемыми, но не сами по себе). Как говорится в man-странице, "ldd печатает общие библиотеки, требуемые каждой программой или общей библиотекой, указанной в командной строке". Например:

> ldd /bin/bash
    linux-vdso.so.1 =>  (0x00007fff7348e000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fdbdae7f000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fdbdac7b000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fdbda8c3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fdbdb0c8000)

Обратите внимание на "libc.so.6" -- это glibc (не путайте с glib, другим продуктом GNU, фундаментальным для Linux, но не таким фундаментальным, как glibc). Если вы посмотрите на все остальные упомянутые вещи (кроме первой, описанной ниже), вы заметите, что все они ссылаются на саму libc. Давайте посмотрим на саму libc.so.6:

> ldd /lib64/libc.so.6
    /lib64/ld-linux-x86-64.so.2 (0x00007f9cefa04000)
    linux-vdso.so.1 =>  (0x00007fffb21ff000)

"ld-linux-x86-64.so.2" — это компоновщик, упомянутый выше (обычно, ldи у него есть страница руководства). Вы не можете запустить ldd на нем, но fileговорит, что он динамически связан, я полагаю, с libc (это может показаться цикличным, но это не так) и linux-vdso. Последний довольно интересен, потому что вы заметите только адрес после =>. Это потому, что он на самом деле является частью ядра.

Библиотека C, насколько мне известно, являетсятолькообщий объект в системе, который не связан с библиотекой C — он находится вцентрвсего этого бардака. Даже базовая библиотека других компилируемых языков использует libc, например:

> ldd libstdc++.so.6.0.17 
    linux-gate.so.1 =>  (0xf77b8000)
    libm.so.6 => /lib/libm.so.6 (0xf7684000)
    libc.so.6 => /lib/libc.so.6 (0xf74d2000)
    /lib/ld-linux.so.2 (0xf77b9000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf74b5000)

Обратите внимание, что библиотеки и компоновщик имеют различные псевдонимы, реализованные с помощью символических ссылок (например, /lib64/ld-linux-x86-64.so.2 на самом деле является /lib64/ld-2.15.so).

Также обратите внимание gcc, что «родной» компилятор (поскольку он компилирует ядро ​​и библиотеку C) не обязательно должен присутствовать в системе, но libc и ld должны, иначе ничего не будет работать.


Это не единственный набор вещей, который предоставляет GNU. Они также отвечают за bashоболочку и другие основные инструменты и утилиты, которые делают систему *nix-подобной и (в основном) POSIX-совместимой. И GNOME, один из первых Linux DE и один из наиболее широко используемых. И вышеупомянутый glib, который предоставляет множество высокоуровневых функций для поддержки таких вещей, как GNOME и другие DE. GNOME построен на GTK, который изначально был разработан для GIMP. GTK также является основополагающим для различных других DE; GTK и GIMP также являются продуктами GNU. Они сделали много всего.


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

Связанный контент