Что такое Linux
Что такое операционная система
🕛 01.12.2010, 23:03
На вопрос из заглавия существует несколько вариантов трафаретных ответов, суть которых сводится к тому, что Linux - это Unix-подобная (или POSIX-совместимая) операционная система, многопользовательская и многозадачная, распространяемая открыто и свободно.Обсуждение вопросов распространения Linux составит предмет заключительного раздела этой главы. Два предыдущих утверждения, оставаясь истинными, потеряли свою уникальность: все современные ОС, включая Windows 2000/XP и MacOS X (в отличие от DOS/Windows 95/98/ME и MacOS 9 и ранее) являются истинно многозадачными и теоретически могут быть задействованы более чем одним пользователем. То есть в них применяется так называемая вытесняющая многозадачность, не допускающая "узурпации" ресурсов машины некорректно написанной (или созначтельно "злоумышленной") программой. Что же до "многопользовательности" - любая машина, даже индивидуальный десктоп, будучи подключенной к какой-либо сети (в том числе и глоабальной сети Интернет), автоматически становится, по крайней мере теоретически, доступной не только своему хозяину. И вопрос разграничения прав доступа для нее оказывается актуальным.
Предшествующие же им слова скорее способны вызвать новую серию вопросов, нежели представить ответ. И потому подчеркну, что Unix-подобие - это способность операционной системы воспроизводить функциональность некоей ОС Unix, каковая, будучи в первую очередь торговой маркой, в виде реального воплощения давно уже не существует. Что же до POSIX-совместимости, то это - следование определенному набору стандартов, Portable Operation System Interface based on uniX, обеспечивающее переносимость операционных систем на любые архитектуры и, главное, - написанных для них приложений с одной POSIX-совместимой системы на другую.
Остается ответить на главный вопрос - что же такое операционная система? По сему поводу существует три точки зрения - минималистская, максималистская и, так сказать, промежуточная, подробно рассмотренные в книге Доступный UNIX. Так что ограничусь кратким итогом, отражающим мое субъективное мнение:
с минималистской точки зрения, операционная система - это программа, именуемая ядром ОС (что такое ядро - поясню чуть ниже);
согласно максималистской точке зрения, операционная система - это не столько ядро, сколько надстраивающая его инфраструктура, включающая самодостаточный комплекс системных утилит и пользовательских приложений, а также средства управления оными;
промежуточная точка зрения сводится к тому, что операционная система образована ядром и комплексом средств, обеспечивающих его функциональность.
Я не буду здесь вдаваться в обсуждение того, какая из трех точек зрения правильна - этому достаточно места уделено в том же Доступном UNIX'е. Тем более, что готов согласиться с тем, что понятие операционной системы может меняться в зависимости от того, о какой именно ОС идет речь ("смотря по тому, какая бабель" - ведь так ответил Семен Михайлович Буденный на вопрос о его отношении к писателю Бабелю).
Так, Windows любого рода, из которой, практически, невозможно вычленить собственно ядро без вреда для ее здоровья, - безусловно, скорее именно инфраструктурный комплекс, то есть подпадает под второе определение операционной системы. FreeBSD (и другие представители BSD-семейства) являет собой неразрывное единство ядра и средств его поддержки - системных утилит и некоторых пользовательских приложений, выступающих в этом контексте также в качестве системных. То есть соответствует третьему определению. Ну а Linux традиционно рассматривается как "голое" ядро, надстраиваемое независимыми (от ядра) системными и пользовательскими программами сторонних разработчиков.
Ниже я постараюсь показать, что такая точка зрения на Linux не совсем верна, и суть его представляет собой четвертый вариант определения операционной системы. Но пока же обратимся к ядру Linux - тем более, что это - главная программа любой ОС, определяющая ее своеобразие, и говорить о нем все равно придется. Но сначала - пара слов о том, что такое ядро ОС вообще.
О ядрах вообще
Никакого мистического смысла понятие ядра в себе не заключает. Это - (почти) обычная программа, запускающаяся, как и любая другая, из исполняемого бинарного файла, так называемого образа ядра, расположенного на диске компьютера и входящего в состав файловой системы. Однако на эту программу возложены не совсем обычные функции: если прочие программы выполняют какие-либо системные или пользовательские задачи, то ядро только что и обеспечивает из взаимодействие с аппаратурой компьютера. Из чего, однако, следует, что без загруженного ядра ни одна другая программа функционировать не может.
В понятие взаимодействия с аппаратурой входят:
распределение процессорного времени между различными, одновременно работающими задачами (вспомним о многозадачности в определении Linux);
работа с памятью, как физической, то есть установленной в машине, так и ее образом на жестком диске - так называемым пространством своппинга (swapping), которые в сумме составляют единую виртуальную память;
обращение к устройствам, в первую очередь - различного рода носителям информации, таким, как жесткие диски, CD/DVD, USB-накопители, и так далее;
управление всеми прочими - видеоподсистемой компьютера, звуковыми картами, принтерами и сканерами... да мало ли их имеется на сегодняшний день;
доступ к данным, обычно организованным в виде различных файловых систем на дисках и дисковых разделах; поддержка сетевых устройств и сетевых протоколов;
управление вводом и выводом данных - то есть обмен информацией между всеми устройствами машины.
Отсюда вытекают две важные особенности ядра, отличающие их от всех прочих программ. Во-первых, оно всегда должно находиться в оперативной памяти, чтобы быть готовой выполнить требуемую в данный момент функцию. Причем - в памяти физической, то есть не может свопироваться. Что понятно - ведь если часть ядра, управляющая виртуальной памятью, окажется выгруженной в раздел подкачки, система окажется без средства извлечения ее обратно.
Во-вторых, ядро функционирует в отдельной области памяти, которая так и называется пространством ядра (в BSD-системах за ней закреплено звучное имя kernelland). И в которую пользовательские процессы доступа не имеют - обращаться, скажем, к дисковым (или любым другим) устройствам они должны посредством специальных процедур - так называемых системных вызовов, взаимодействующих с соответствующими подсистемами ядра. Все прочие же программы располагаются в так называемом пользовательском пространстве памяти (userland, в терминологии BSD), которое могут разделять между собой. И это понятно не менее - иначе неправильно написанная программа использующая, скажем, видеокарту, могла бы обрушить всю систему в целом. Чего в Linux, как правило, не бывает...
Выше были перечислены общие функции любой ОС (по крайней мере - из числа Unix-подобных), в том числе и Linux. В толстых книгах по Unix они обычно группируются в несколько подсистем управления - процессами, памятью, устройствами, сетевую подсистему и подсистему ввода/вывода. Это важно для системных программистов - разработчиков ОС, но не принципиально с точки зрения пользователя. Для которого более существенна функциональность ОС - то есть способность данной операционки работать с наличной звуковой и видеокартой, обращаться к винчестеру конкретного типа и понимать несомую им файловую систему, и так далее.
О ядре Linux в частности
Так вот, функциональность конкретной ОС определяется в первую очередь изначально заложенными в нее возможностями, во вторую же - конфигурированием ядра, предшествующим сборке его образа. И вот тут мы переходим к индивидуальным особенностям ядра Linux. Правда, большинство их не уникально для этой ОС, а являются общими чертами всего POSIX-семейства, но в каждой реализовано несколько по разному. А кое-какие функции, например, использование множества файловых систем в качестве "родных" (native), имеются только в ядре Linux.
Ядро Linux в полной мере поддерживает перечисленные выше группы функций. Его подсистема управления процессами способна осуществлять истинную (или принудительную) многозадачность. То есть каждому запущенному процессу (условно говоря - программе пользовательского пространства, что не нужно путать с пользовательскими прикладными программами) выделяется квант процессорного времени, в течении которого программа безраздельно владеет процессором, после чего передает его по эстафете (очереди процессов) следующей программе. Ныне это кажется общим местом. Однако широко распространенные до недавнего времени (и все еще применяемые ныне) операционки, как Windows 95/98/ME и MacOS версий, предшествовавших 10-й, на такое не были способны: в них реализован был механизм так называемой кооперативной многозадачности, при котором пользовательская программа могла сама решать, сколько процессорного времени ей использовать. Что вполне способно было привести (и, как помнят те, кто застал те счастливые времена, нередко и приводило) к полному параличу системы.
Далее, подсистема управления памятью ядра Linux поддерживает астрономические ее объемы (разные в зависимости от версии ядра и аппаратной платформы, но более чем достаточные на практике), обеспечивает эффективное взаимодействие между физической памятью и областью своппинга, предстающими перед пользовательскими программами (и, тем более, перед пользователем) как единое пространство виртуальной памяти. Предусмотрен и механизм защиты памяти, когда каждый пользовательский процесс занимает участок памяти, изолированный от вмешательства других процессов, и методы обмена данными между участками памяти различных процессов.
Не приходится жаловаться и на поддержку устройств, критически важных для работы машины. Каковыми являются, с одной стороны, накопители, в первую очередь дисковые, с другой - видеокарты. В отношении дисковых накопителей, а также CD/DVD достаточно сказать, что обладатель современных SCSI, IDE или SATA дисков, имеет очень мало шансов столкнуться с неприятностями, за исключением случаев отменно нового оборудования. Имеется поддержка RAID-массивов - объединения двух или более дисков, обеспечивающие рост быстродействия или (а иногда - и) повышение надежности, и управляемые аппаратными RAID-контроллерами разных производителей. Может ядро Linux обращаться и с так называемыми мультидисковыми устройствами, к числу которых относятся массивы softRAID (аналоги RAID аппаратных, но управляемые чисто программными средствами) и так называемые менеджеры логических томов (Logical Volume Manager) - нечто подобное softRAID, но с иными задачами и возможностями.
О поддержке видеокарт следует сказать чуть подробнее, потому что это до сих пор один из устойчивых предрассудков. Так вот, ядро Linux поддерживает все видеокарты, соответствующие стандарту VESA - а это практически все карты, выпущенные на памяти нынешнего поколения. Более того, ядром предусмотрена поддержка графического режима таких карт - через так называемый линейный кадровый буфер (Frame Buffer). То есть в Linux возможен вывод графики в консоли, только средствами ядра - без всякого дополнительного программного обеспечения. Другое дело, что прикладных программ, эту возможность использующих, - можно пересчитать по пальцам, но это совсем другая история.
Так почему же продолжает бытовать устойчивая легенда о типах видеокарт, не поддерживаемых Linux? Дело в том, что в большинстве случаев в этой ОС (и, добавлю, во всех остальных Unix-подобных) для работы с графикой используется не режим Frame Buffer, а специальная надстройка - оконная система X (X Window System, или, в просторечии, Иксы). А вот у нее представления о поддержке видеокарт несколько другие - но ныне и тут проблем не предвидится.
Однако вернемся к носителям. Ядром Linux (да и пользователем) они используются не сами по себе, а как как вместилище данных, организованных в виде файловых систем различных типов. Под данными в данном контексте понимается не только (и даже не столько) пользовательская информация, сколько все файлы, необходимые для функционирования системы. Каковые, соответственно, должны лежать на файловой системе того типа, которое понимается ядром. А ядро Linux - понятливо в этом отношении.
В качестве "родных" файловых систем (native - то есть тех, на которых Linux может быть установлен и функционировать) ядро Linux поддерживает:
ext2fs - исторически почти первая (и самая "родная") файловая система, разработанная самим Линусом;
ext3fs - усовершенствованный вариант предыдущей, поддерживающий так называемое журналирование (то есть некий механизм, повышающий надежность, о чем подробно речь пойдет в свое время);
ReiserFS - журналируемая файловая система, разработанная специально для Linux Хансом Райзером;
XFS и JFS - также журналируемые файловые системы, разработанные независимо (и первоначально - совсем не для Linux) фирмами SGI и IBM, соответственно.
Кроме того, в качестве рудиментов предыдущих эпох, сохраняется поддержка файловых систем Minix и extfs (предшественниц ext2fs), FAT16/VFAT/FAT32. С другой стороны, со дня на день ожидается включение в официальное ядро поддержки Reiser4 - новой разработки Ханса сотоварищи, значение которой далеко выходит за рамки просто еще одной файловой системы (в настоящее время Reiser4 поддерживается с помощью неофициальных дополнений).
На уровне обмена данными, то есть чтения (и, иногда, записи) ядро Linux поддерживает файловые системы NTFS и HPFS для ОС Windows NT/2000/XP и OS/2, соответственно (официально пока - только чтение), файловые системы FreeBSD - UFS и UFS2 (чтение и, в экспериментальном режиме, запись), файловые системы многих проприетарных Unix.
О поддержке сетевых протоколов и сетевых устройств особо распространяться не буду за некомпетентностью в этом вопросе. Но, насколько мне известны, сетевые протоколы поддерживаются все, а из сетевых карт - все распространенные. Ну а факультативные устройства, то есть не обязательные для работы машины (но часто весьма важные для пользователя - звуковые карты, телетюнеры, принтеры и так далее) - это тема отдельного разговора.
Выше я бегло и весьма неравномерно очертил то, что ядро может Linux в принципе - то есть то, что предусмотрено в нем разработчиками. Практически очевидно, что эта функциональность, особенно в отношении поддержки устройств, более чем избыточна: мало кто имеет в одной машине более одной же звуковой карты или SCSI-контроллера. И тут время вспомнить о индивидуальном конфигурировании ядра перед сборкой загружаемого его образа. Кем и каким образом это делается - вопрос особый. Пока же важно, как включается поддержка той или иной функции ядра.
А включена она может быть двояко: код нужной функции или жестко встраивается в код будущего образа ядра и собирается вместе с ним как единый исполняемый бинарник, или собирается в виде отдельного модуля - своего для каждой нужной функции. Модули эти связываются с образом ядра в памяти в момент их загрузки с помощью специального механизма - линковки (linking). В отличие от ядра, модуль не обязан находиться в памяти постоянно - его можно загрузить (а иногда и выгрузить) при необходимости. Правда, модули также будут располагаться в пространстве памяти ядра, но зато в принципе не запрещается их свопирование на диск.
Таким образом, ядро Linux классифицируется как монолитно-модульное (теоретически существуют еще чисто монолитные ядра и так называемые микроядра, но к Linux они отношения почти не имеют). Как лучше реализовать функцию - встроить в ядро или собрать модулем, - вопрос неоднозначный. При решении его следует учитывать следующее.
Модульная поддержка возможна не для всех функций в принципе, и не для всех она практически оправданна. С другой стороны, некоторые функции могут быть реализованы только в виде модулей, а иные только как модули и работают нормально. Кроме того, существует такое понятие, как зависимости модулей. Наконец, некоторые редко используемые (а то и неиспользуемые вообще, но могущие быть востребованными) функции просто нет смысла включать в монолит образа ядра - место им среди загружаемых модулей. Так что практически всегда ядро Linux собирается с теми или иным количеством модулей.
Но обо всем этом у нас еще будет случай поговорить - в разделе о сборке собственного ядра. А пока важно уяснить, что функция, не включенная в образ ядра, и не собранная в качестве загружаемого модуля, для данной Linux-системы как бы не существует - пусть само ядро Linux и поддерживает ее хоть четыре раза...
Чего не хватает ядру?
Итак, мы выяснили, что ядро Linux само по себе многое знает и много чего умеет. Но достаточно ли этого, чтобы обратить эти знания и умения на пользу обществу (точнее, сообществу Linux-пользователей)?
Для того, чтобы ядро Linux приступило к выполнению своих прямых обязанностей, его необходимо предварительно загрузить (впрочем, это касается и любой другой операционки). Может ли оно сделать это само по себе?
В принципе, может. Образ ядра содержит в себе загрузочную запись, способную принять управление непосредственно от BIOS компьютера или из главной загрузочной записи (MBR - Master Boot Record) винчестера. Такой процесс самозагрузки ядра называют иногда bootstrapping - поднятие себя за шнурки от собственных ботинок.
Однако на практике это оказывается почти столь же неудобным, как и процедура подъема вышеуказанным способом. Потому что образ ядра, предназначенный для непосредственной загрузки, должен быть размещен на специальном дисковом разделе, причем - без файловой системы: ведь для того, чтобы распознать образ как файл, а не последовательность нулей и единиц, нужно иметь загруженное ядро с поддержкой данной файловой системы, а ядро-то у нас еще не загружено. Выделять же специальный первичный раздел только под образ ядра представляется слишком жирным - ведь на диске таких разделов может быть всего четыре. Кроме того, такой способ лишает возможности использовать Linux в паре с какой-либо другой ОС.
Так что на практике прямая загрузка образа ядра используется, насколько мне известно, только при изготовлении загрузочных дискет, и с отмиранием их забудется окончательно. А штатным средством загрузки ядра Linux (и, следовательно, необходимым компонентом его функционирования) оказывается одна из программ, так и называемых - загрузчиками, обычно с эпитетами - начальный, системный или мультисистемный.
В процессе загрузки ядра происходит множество сложных процессов, включая опознание оборудования и загрузку модулей - ведь мы только что говорили, что те или иные функции неизбежно реализованы в виде модулей, а без их загрузки они как бы и не существуют. Кроме того, загрузка и выгрузка модулей могут потребоваться и в дальнейшем. Но может ли ядро само по себе загружать модули при старте или в процессе работы? Нет, средств для этого в нем не предусмотрено. Из чего вытекает необходимость в инструментах управления модулями - загрузки, выгрузки, построения зависимостей, средств просмотра состояния. И наличие их - второй непременный компонент успешного функционирования ядра.
Завершение загрузки ядра знаменуется стартом процесса инициализации. В ходе ее происходит монтирование файловых систем, включение разделов своппинга, активизация виртуальных терминалов и тому подобные действия, завершающиеся приглашением пользователя к авторизации. И все эти действия также выполняются не средствами ядра, а специальными инструментами. Следовательно, их набор необходим нам еще на стадии входя в систему, и являет собой третий непременный компонент, обеспечивающий функциональность ядра.
Но вот образ ядра загружен и инициализация системы выполнена. И ядро готово к выполнению своих функций - работать с файловыми системами, сетевыми устройствами и прочими атрибутами, сопровождающими современную персоналку. Однако как? Ведь для этого нужны средства реализации функций ядра. Какие? Проще пояснить на примере.
Выше было сказано, что Linux поддерживает массу файловых систем. Однако это означает лишь принципиальную возможность работы с ними. Ведь ни одна из поддерживаемых файловых систем не возникает сама собой - ее нужно создать, подключить к системе (как говорится, смонтировать), в дальнейшем, возможно, осуществлять проверку ее состояния, и так далее. И все это требует комплекса соответствующих программ - своего для каждой из поддерживаемых файловых систем, иначе пользователю будет мало радости от их изобилия.
Аналогично и с сетевыми протоколами и устройствами, виртуальными терминалами, принтерами и сканерами: кроме поддержки ядром, все это требует еще и внешнего инструментария для управления, иначе соответствующая функция оказывается "мертвой". И весь этот инструментарий можно объединить в комплекс средств обеспечения базовой функциональности ядра - четвертый обязательный компонент системы.
Однако каким образом пользователь получит доступ ко всем этим базовым функциям? Для этого ему требуются соответствующие средства. Например, для доступа к "рабочей" (то есть известной и смонтированной) файловой системе нужны средства просмотра ее содержимого, средства управления файлами (копирования, перемещения, переименования, удаления), средства просмотра содержимого отдельных файлов и, при необходимости, их модификации (то есть средства управления контентом файлов). Причем кое-какие из этих средств оказываются необходимыми уже на стадии инициализации, поскольку используются в так называемых сценариях ее (стартовых скриптах), где они запускаются автоматически.
Пользователю же требуемые утилиты доступа к файловой системе (и средства доступа к другим функциям) приходится запускать вручную. Для чего ему требуется какой-то интерфейс, позволяющий это делать. Поскольку необходимые пользовательские утилиты запускаются соответствующими командами, в качестве такого интерфейса в Unix-подобных системах традиционно используется программа, называемая командной оболочкой, командным интерпретатором или, по простому, шеллом (shell - оболочка). Она выступает в качестве интегратора вышеуказанных пользовательских утилит и, вместе с ними, может быть объединена в комплекс, так сказать, боевого обеспечения пользователя - пятый компонент, необходимый для функционирования ядра на его, пользователя, благо.
Вот, казалось бы, и все. Но нет, в тени, за кадром, осталась еще одна вещь, без которой все перечисленное выше просто не будет работать. Это, невидимое пользователю, средство, так сказать, его тылового обеспечения, - общесистемная библиотека. Чтобы пояснить, что это такое, придется сделать довольно пространное отступление.
Практически все программы время от времени выполняют один и тот же набор действий - например, открывают файл, записывают в него, закрывают, и так далее, на самом деле таких универсальных и часто повторяющихся действий великое множество. Так что же, при написании новой программы каждый раз изобретать велосипед и сочинять соответствующий код заново? Можно, но это потребует недюжинного трудолюбия. Программисты же, как известно, вообще народ ленивый, а для POSIX'ивистов смертный грех лености - просто один из критериев профпригодности. И потому испокон веков коды для выполнения часто повторяющихся действий выделялись из тела программы в отдельные функции, которые, в свою очередь, объединялись в специальные библиотеки, зависимые от конкретного языка программирования.
Большая часть ядра Linux и все из перечисленных выше программ написаны на языке Си. Поэтому для своей сборки и работы они требуют библиотеку функций языка Си, называемую также главной общесистемной библиотекой (libc). Требуемые функции извлекаются из нее каждой программой в момент необходимости с помощью механизма, подобного подключению модулей к загруженному образу ядра, а не дублируются многократно. Это приводи к огромному выигрышу во всех отношениях (экономия дискового пространства и памяти, надежность, и прочее), но имеет результатом то, что ни одна программа, включая само ядро, не будет работать в отсутствии общесистемной библиотеки. Которая, таким образом, оказывается шестым, и последним, компонентом обеспечения функционирования ядра.
Строго говоря, существует также способ статического связывания (линковки) программ с библиотечными функциями, после чего опирающиеся на нее программы становятся способными к автономной работе. Но при этом теряется множество преимуществ самого факта использования общесистемной библиотеки, поэтому на практике такой способ применяется очень редко - только в сугубо специальных целях. И не отменяет обязательности наличия библиотеки функций Си в системах общего назначения.
Все перечисленные компоненты обеспечивают функционирование системы в текстовом режиме. Хотя, как уже было отмечено, ядро Linux в состоянии поддерживать и графический режим, но пользовательских приложений, использующих его, крайне мало. И подавляющее большинство программ графического режима требуют для своей работы дополнительного средства - так называемой оконной системы X (X Window System, именуемой в народе просто Иксами). Иксы не являются частью Linux или какой-либо другой ОС, а представляют собой кросс-платформенную систему, функционирующую поверх любой операционки POSIX-семейства. Однако, поскольку роль приложений графического режима в Linux все возрастает, Иксы оказываются фактически незаменимой его частью.
Сама по себе оконная система Икс, обеспечивая базовые функции графического режима, к выполнению каких-либо пользовательских задач не способна: для практического применения она должна дополняться программой, управляющей графическими элементами - окнами, их перемещением, масштабированием и так далее. Программы такие так и называются - менеджеры окон. Некоторые из таких надстроек над Иксами обеспечивают не только урпвление окнами, но и включают в себя наборы пользовательских приложений. Они носят имя интегрированных графических сред или, по простому, десктопов. Так вот, минимум одна из таких программ - менеджер окон или декстоп, - также оказывается необходимой для использования графического режима.
Об открытости и свободе
Подробному рассмотрению компонентов Linux будет посвящена следующая глава. А здесь же пора поговорить об условиях ее распространения - о той самой октрытости и свободе, которые суть неотъемлемые части ее формального определения. Прояснить эти понятия тем более важно, что они часто служат источником недоразумений, основанных на незнании существа вопроса и его истории, буквализме перевода соответствующих английских терминов, а то и откровенной подтасовке.
Понятие открытого распространения программ, в том числе ядра и остальных компонентов Linux (Open Source Software) включает в себя два аспекта: технологический, которого я коснусь сейчас и, если так можно выразиться, идеологический - к нему мы обратимся несколько позже.
Технологический аспект Open Source подразумевает доступность их исходных текстов, того кода, который после компиляции преобразовывается в работоспособные исполняемые модули. И противопоставляется оно понятию программ закрытых - тех, что их разработчики распространяют только в виде откомпилированных бинарников, сохраняя исходные тексты в качестве материалов "для служебного пользования".
В понятии Open Source Software важны два момента: принципиальной доступности исходников - с публичных ли сетевых серверов, или с дистрибутивных носителей, и общедоступности - то есть доступности их для всех, без ограничений, а не, скажем, для коммерческих партнеров или правительственных организаций, для коих не так давно были "открыты" исходные тексты Windows.
Понятие же свободного программного обеспечения (Free Software - его не следует путать с бесплатными программами Freeware) базируется на знаменитых принципах Ричарда Столлмена: свободе использования, свободе изучения и модификации, свободе распространения.
Свобода использования подразумевает, что копия (конкретный экземпляр) любой программы из категории Free Software, приобретенная пользователем, становится, подобно любому другому товару, полной его собственностью. И может быть использована им по собственному усмотрению - установлена на один компьютер, или на неопределенное их количество, на локальную машину или на сетевой сервер, продана, подарена и так далее.
Свобода изучения и модификации подразумевает следующий шаг - пользователь вправе изучать устройство программы, выявлять и исправлять в ней ошибки, вносить любые изменения, адаптируя под свои задачи, и так далее.
Наконец, свобода распространения относится уже к условиям тиражирования программ. То есть пользователь имеет право копировать программу Free Software и распространять ее любым угодным ему способом (в том числе и за огромные деньги), подвергаясь при этом лишь двум запретам: приписывать себе авторство данной программы и каким бы то ни было образом ограничивать права на распространение ее другими.
Понятие открытости софта и свободны его распространения не вполне идентичны. Но на практике оказывается, что они столь тесно споряжены друг с другом, что Open Source и Free Software часто выступают как синонимы. С одной стороны, очевидно, что реализовать принципы свободного софта без доступа к исходникам невозможно. Однако и сама по себе открытость исходников без возможности их модификации и дальнейшего распространения имеет немного смысла. Не случайно все программные продукты, исходные тексты которых открывались на каких-либо ограничивающих услвоиях, со временем либо становились свободными в полном смысле этого слова, либо - очень скоро переставали быть открытыми.
Родство этих двух явлений нашло свое воплощение в движении Open Source уже не как технологии разработки, а как общественном явлении. Фактическим его основателем был лично Линус Торвальдс, а свое идеологическое оформление оно обрело трудами Эрика Реймонда. И здесь в понятие открытости вкладывается еще один смысл: Open Source - проекты, открытые для участия всех, кто хочет и может способствовать их развитию.
Открытое и свободное распространение программ вовсе не означает их "бесхозности". Нет, все они имеют конкретных авторов - разработчиков, и, подобно научным работам или литературным произведениям, защищаются авторским правом. Что подчеркивается лицензиями, под которыми распространяются продукты Open Source.
Существует несколько так называемых свободных лицензий. Наиболее известна и популярна в сообществе так назваемая GPL (General Public License, позвольте не изощряться в переводе этого вполне прозрачного термина), созданная Ричардом Столлменом. Она повторяет его принципы свободы, с одним важным дополнением: любое программное обеспечение, разработанное на базе GPL-софта, может распространяться только в сопровождении открытых исходных текстов и под той же лицензией. Именно GPL избрал Линус Торвальдс для юридической защиты своего ядра, и ею же защищаются большинство прочих компонентов ОС Linux.
GPL - не единственная свободная лицензия, хотя перечислять (и тем более описывать) прочие полагаю излишним. Однако нельзя не упомянуть лицензию BSD, под которой распространяются одноименные операционные системы (да и некоторые компоненты Linux тоже). Она столь же строго следует принципам свободного софта, как и GPL, но имеет важное отличие: не обязывает к непременному свободному распространению продуктов, разработанных на основе подпадающих под нее программ. Разумеется, в качестве закрытых могут распространяться только компоненты собственной разработки - закрыть код свободных программ, защищаемых BSD-лицензией, не вправе никто.
В сообществе Open Source и Free Software время от времени ведутся жаркие дискуссии о том, какая из свободных лицензий (GPL или BSD - все прочие свободные лицензии колеблются между этими полюсами) более отвечает идеалам свободы. Но мы в них вдаваться не будем - для нас достаточно того, что ни та, ни другая не накладывают никаких ограничений на личное использование Linux.
Тем не менее, не следует думать, что понятие Free Software непременно предполагает бесплатное распространение софта. Отнюдь, сам Ричард Столлмен специально подчеркивал, что, говоря Free Software, мы имеем ввиду свободное слово, а не бесплатное пиво (free is like freedom, not free beer). Тем не менее, на практике все свободные программы (включая дистрибутивы Linux) распространяются по цене носителя, доставки и накладных расходов производителя. Сам принцип свободного распространения препятствует оплате так называемой "интеллектуальной собственности", составляющей главную долю цены проприетарных программ. Оплате подлежит только сам программный продукт в виде дистрибутивного носителя, сопровождающей его печатной документации (если она есть) и, возможно, поддержки и сопровождения (последние составляющие - основной источник дохода коммерческих фирм, избравших своим бизнесом распространение открытого софта, таких, как Red Hat и Novell).
В то же время, действительно, абсолютно любую софтину, защищаемую свободными лицензиями (в том числе большинство дистрибутивов Linux), можно получить и совершенно бесплатно - скачав ее с сайта разработчика или многочисленных публичных серверов, занятых распространением Open Source. Правда, в этом случае придется заплатить за трафик или время на линии - и пользователю вольно решать, кому он предпочитает отдать свои деньги, разработчику, майнтайнеру, хозяину онлайнового магазина или провайдеру Интернета, что ему выйдет дешевле и покажется комфортнее.