17. Строим на фундаменте
В главах этой книги были рассмотрены фундаментальные компоненты системы Linux, начиная с низкоуровневой организации ядра и процессов, устройства сети и заканчивая некоторыми инструментами, предназначенными для сборки программного обеспечения. В итоге вы умеете делать довольно многое. Поскольку Linux поддерживает почти любой тип общедоступной среды программирования, приложения доступны в изобилии. Рассмотрим некоторые прикладные области, в которых преуспевает Linux, и поймем, как к ним относится то, что вы узнали из этой книги.
17.1. Веб-серверы и приложения
Linux является популярной системой для веб-серверов, а правящим монархом среди серверов приложений Linux является Apache HTTP Server (который обычно называют просто Apache). Другим веб-сервером, о котором вы часто будете слышать, является Tomcat (это также проект разработчиков Apache); он обеспечивает поддержку Java-приложений.
Сами по себе веб-серверы выполняют немногое: они могут хранить файлы, и на этом все. Конечной целью большинства веб-серверов, таких как Apache, является предоставление платформы для использования веб-приложений. Например, проект Wikipedia построен на пакете MediaWiki, который вы можете использовать, чтобы организовать собственный wiki-проект. Системы управления контентом вроде Wordpress и Drupal позволяют вам создавать собственные блоги и мультимедийные сайты. Все эти приложения основаны на языках программирования, которые особенно хорошо проявляют себя в Linux. Так, например, системы MediaWiki, Wordpress и Drupal написаны на языке PHP.
Строительные блоки, из которых составлены веб-приложения, являются в большой степени модульными, поэтому легко добавлять собственные расширения и создавать приложения с помощью таких фреймворков, как Django, Flask и Rails, которые предоставляют средства для распространенных веб-инфрастуктур и функций, например, использование шаблонов, управление многими пользователями и поддержка баз данных.
Нормально функционирующий веб-сервер зависит от прочного основания в виде операционной системы. В частности, чрезвычайно важным является материал, изложенный в главах 8–10.
Конфигурация вашей сети должна быть безупречной, и вы, что, пожалуй, более важно, должны уметь управлять ресурсами. Разумно распределенное дисковое пространство и память имеют решающее значение, особенно если вы планируете использовать базу данных в своем приложении.
17.2. Базы данных
Базы данных — это специальные службы для хранения и извлечения данных, и в Linux можно запускать многие различные серверы и системы баз данных. Две основные особенности делают базы данных привлекательными: они обеспечивают простой и унифицированный подход к управлению индивидуальными фрагментами и группами данных, а также превосходную скорость доступа.
Базы данных облегчают приложениям проверку и изменение данных, в особенности если сравнить их с анализом и изменением текстовых файлов. К примеру, могут возникнуть сложности при управлении файлами /etc/passwd и /etc/shadow в Linux в сети компьютеров. Вместо них можно настроить базу данных, которая предоставляет протокол LDAP (Lightweight Directory Access Protocol, облегченный протокол доступа к (сетевым) каталогам), чтобы снабдить необходимой информацией систему аутентификации Linux. Конфигурация на стороне клиента Linux простая; все, что потребуется сделать, — это отредактировать файл /etc/nsswitch.conf и добавить дополнительную конфигурацию.
Основная причина, по которой базы данных обычно обеспечивают превосходное быстродействие при извлечении данных, заключается в том, что они выполняют индексирование, чтобы отслеживать размещение данных. Допустим, у вас есть набор данных, которые представляют справочник, содержащий имена, фамилии и телефонные номера. Можно использовать базу данных, чтобы поместить индекс на любом из этих атрибутов, например на фамилии. Тогда при поиске кого-либо по фамилии база данных просто сверяется с индексом фамилий, а не просматривает весь справочник полностью.
Типы баз данных. Базы данных бывают двух основных типов: реляционные и нереляционные. Реляционные базы данных (также называемые реляционными системами управления базами данных, РСУБД; Relational Database Management Systems, RDBMS), такие как MySQL, PostgreSQL, Oracle и MariaDB, являются базами данных общего назначения, которые отличаются способностью объединять различные наборы данных. Допустим, у вас есть два набора данных: один с почтовыми индексами и именами, а другой — с почтовыми индексами и соответствующими населенными пунктами. Реляционная база данных позволила бы вам очень быстро извлечь список имен людей, проживающих в одном населенном пункте. Обычно с реляционными базами данных «разговаривают» с помощью языка программирования SQL (Structured Query Language, язык структурированных запросов).
Нереляционные базы данных, иногда называемые базами данных NoSQL, призваны решать частные задачи, с которыми нелегко справляются реляционные базы данных. Например, базы данных для хранения документов, такие как MongoDB, стремятся облегчить хранение и индексацию документа в целом. Базы данных «ключ — значение», например redis, делают акцент на производительности. Для доступа к базам данных NoSQL нет общего языка запросов, подобного SQL. Вместо этого с ними работают с помощью различных интерфейсов и команд.
Вопросы, связанные с производительностью дисков и памяти, рассмотренные в главе 8, чрезвычайно важны для большинства реализаций баз данных, поскольку существует компромисс между тем, сколько вы можете позволить хранить в оперативной памяти (это быстрее) и сколько — на диске. Более мощные системы баз данных задействуют также работу с сетью, так как они распределены по нескольким серверам. Самый распространенный вариант такого способа работы с сетью называется репликацией: одна база данных, по существу, копируется на несколько серверов базы данных, чтобы увеличить количество клиентов, которые могут подключиться к серверам.
17.3. Виртуализация
В большинстве крупных организаций неэффективно выделять аппаратное обеспечение для специальных серверных задач, поскольку установка операционной системы, привязанной к одной задаче на одном сервере, означает, что вы ограничены лишь этой задачей, пока не переустановите систему. Технология виртуальной машины позволяет одновременно установить одну или несколько операционных систем (часто называемых гостевыми ОС) на одном аппаратном средстве, а затем по мере надобности активизировать и деактивизировать эти системы. Можно даже перемещать и копировать виртуальные машины на другие компьютеры.
Для Linux есть много систем виртуализации, например KVM (виртуальная машина ядра) и Xen. Виртуальные машины особенно удобны для веб-серверов и серверов баз данных. Хотя возможно настроить единственный сервер Apache для обслуживания нескольких сайтов, за это придется поплатиться гибкостью и управляемостью. Если такие сайты поддерживаются различными пользователями, то вам придется управлять как серверами, так и пользователями сразу. Вместо этого обычно предпочтительнее настроить виртуальные машины на одном физическом сервере, каждую из которых поддерживает свой пользователь, чтобы они не препятствовали друг другу, а вы могли бы изменять и перемещать их по желанию.
Программа, которая работает с виртуальными машинами, называется гипервизором. Гипервизор взаимодействует с множеством частей системы Linux на низших уровнях, которые вы видели в этой книге, и в результате при установке гостевой Linux в виртуальной машине она должна вести себя точно так же, как и любая другая установленная система Linux.
17.4. Распределенные вычисления и вычисления по запросу
Чтобы облегчить управление локальными ресурсами, можно поместить замысловатые инструменты управления поверх технологии виртуальной машины. Термин «облачные вычисления» настолько всеобъемлющ, что часто используется для обозначения этой сферы. Более точно, инфраструктурой в качестве службы (IaaS, Infrastructure as a Service), называют системы, которые позволяют вам обеспечивать и контролировать основные вычислительные ресурсы, такие как процессор, память, хранилище данных и сеть, на удаленном сервере. Проект OpenStack является одним из таких интерфейсов прикладного программирования и платформой, которая содержит систему IaaS.
Переместившись за «сырую» инфраструктуру, можно также выполнить обеспечение платформы ресурсами, такими как операционная система, серверы баз данных и веб-серверы. Систему, которая предоставляет ресурсы на таком уровне, часто называют платформой в качестве службы (PaaS, Platform as a Service).
Linux является центральной для многих из таких вычислительных служб, поскольку она часто лежит в их основе. Практически все элементы, которые вы видели в этой книге, начиная с ядра, находят отражение в этих системах.
17.5. Встроенные системы
Встроенная система — это что-либо, разработанное с определенной целью, например музыкальный проигрыватель, видеостример или термостат. Сравните это с персональной или серверной системой, которая может выполнять множество различных задач (но не может делать очень хорошо какую-либо конкретную).
Можно представлять встроенные системы как почти полную противоположность распределенным вычислениям: вместо расширения масштаба операционной системы встроенная система обычно (но не всегда) сужает его, часто до небольшого устройства. Система Android является сегодня, наверное, самой распространенной встроенной версией Linux.
Встроенные системы часто сочетают специализированные аппаратные средства и программное обеспечение. Например, можно настроить ПК на выполнение всего того, что делает беспроводной маршрутизатор, добавив достаточное количество аппаратных средств и корректно выполнив конфигурирование системы Linux. Однако обычно предпочтительнее купить специализированное устройство, состоящее из необходимых аппаратных средств и не содержащее ничего лишнего. Например, маршрутизатору необходимо большее количество сетевых портов по сравнению с ПК, но не нужна видеокарта или звуковая система. Поскольку аппаратные средства особые, необходимо подогнать под них и программное обеспечение, такое как внутреннее наполнение системы и пользовательский интерфейс. Система OpenWRT, о которой упоминалось в главе 9, является одной из таких специальных версий Linux.
Интерес к встроенным системам возрастает по мере того, как появляются более вместительные небольшие аппаратные средства, в частности однокристальные системы (SoC, System-on-a-chip), которые могут уместить на небольшом пространстве процессор, память и периферийные интерфейсы. Например, одноплатные компьютеры Raspberry Pi и BeagleBone основаны на такой схеме, и для них в качестве операционной системы можно выбрать один из вариантов Linux. Такие устройства обладают легкодоступным выводом и сенсорным вводом, который подключается к языковым интерфейсам вроде Python, делая их популярными для макетирования и небольших гаджетов.
Встроенные версии Linux различаются тем, как осуществляются многие функции из серверной/настольной версии. В небольших, очень ограниченных устройствах следует урезать все, кроме необходимого минимума, вследствие недостатка свободного пространства. Это часто означает, что даже утилиты оболочки и ядра существуют в виде единственного исполняемого файла BusyBox. Такие системы обычно демонстрируют наибольшее отличие от полнофункциональной версии Linux, и вы часто встретите в них более старые программы, вроде System V init.
Как правило, разработка ПО для встроенных систем ведется на обычном компьютере. Более мощные устройства, такие как Raspberry Pi, обладают роскошью в виде более объемного хранилища данных и вычислительной мощностью для запуска нового и более полного ПО, поэтому на них можно напрямую запускать многие инструменты для разработки.
Однако, несмотря на различия, встроенные системы все так же наследуют «гены» Linux, о которых рассказано в этой книге: вы обнаружите ядро, ряд устройств, сетевые интерфейсы и систему init, а также несколько пользовательских процессов. Встроенные ядра, как правило, близки (или идентичны) обычным, просто в них отключены многие функции. Но когда вы доберетесь до пространства пользователя, различия станут выражены более ярко.
17.6. Заключительные замечания
Каковы бы ни были ваши цели при достижении лучшего понимания систем Linux, я надеюсь, что эта книга оказалась полезной. Моя цель — привить вам уверенность, чтобы вы смогли изучить свою систему для выполнения изменений или чего-то нового. Теперь у вас должно появиться ощущение полного контроля над системой. Можете подступиться к ней вплотную и получать удовольствие.