Внутреннее устройство Linux - Уорд Брайан. Страница 101

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

14.5. Шина D-Bus

Одной из самых важных разработок, которая возникла из рабочего стола Linux, является шина рабочего стола (D-Bus, Desktop Bus) — система передачи сообщений. Шина D-Bus важна, поскольку она служит механизмом межпроцессного взаимодействия, который позволяет приложениям рабочего стола «общаться» друг с другом. Она важна еще и потому, что большинство систем Linux применяет ее для уведомления процессов о системных событиях, таких как вставка USB-накопителя.

Эта шина состоит из библиотеки, которая стандартизирует межпроцессное взаимодействие с помощью протокола и функций поддержки, позволяющих любым двум процессам взаимодействовать друг с другом. Сама по себе эта библиотека представляет не что иное, как специальную версию обычных функций IPC, таких как сокеты домена Unix. Шину D-Bus делает полезной наличие центрального «концентратора», который называется dbus-daemon. Процессы, которым необходимо реагировать на события, могут подключаться к этому демону и регистрироваться для получения различных типов событий. Процессы могут также создавать события. Например, процесс udisks-daemon прослушивает службу ubus на наличие дисковых событий, а затем отправляет их демону dbus-daemon, который передает их приложениям, заинтересованным в дисковых событиях.

14.5.1. Системный и сеансовый экземпляры

Шина D-Bus стала неотъемлемой частью Linux, и сейчас она выходит за рамки рабочего стола. Например, в системах systemd и Upstart есть каналы коммуникации шины D-Bus. Тем не менее добавление в ядро системы зависимостей от инструментов рабочего стола идет вразрез с основным замыслом Linux.

Чтобы решить эту проблему, есть два типа экземпляров (процессов) dbus-daemon, которые можно запустить. Первый является системным экземпляром, запуска­емым системой init во время загрузки системы с помощью параметра —system. Си­стемный экземпляр обычно работает как пользователь D-Bus, и его файлом конфигурации является /etc/dbus-1/system.conf (хотя, возможно, вам не придется его менять). Процессы могут подключаться к системному экземпляру через сокет домена Unix /var/run/dbus/system_bus_socket.

Независимо от системного экземпляра шины D-Bus существует необязательный сеансовый экземпляр, который работает только тогда, когда вы запускаете сеанс рабочего стола. Приложения рабочего стола подключаются к этому экземпляру.

14.5.2. Отслеживание сообщений шины D-Bus

Одним из лучших способов увидеть различия между системным и сеансовым экземплярами демона dbus-daemon является отслеживание событий, которые проходят по шине. Попробуйте применить утилиту dbus-monitor в системном режиме следующим образом:

$ dbus-monitor —system

signal sender=org.freedesktop.DBus -> dest=:1.952 serial=2 path=/org/

freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired

   string ":1.952"

Стартовое сообщение говорит о том, что монитор подключен и получил имя. При подобном запуске вы не должны увидеть большую активность, поскольку системный экземпляр обычно не очень занят. Чтобы увидеть какие-либо события, попробуйте подключить USB-накопитель.

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

$ dbus-monitor —session

Теперь проведите указателем мыши над разными окнами; если ваш рабочий стол знает о шине D-Bus, вы должны получить шквал сообщений об активизированных окнах.

14.6. Печать

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

1. Программа, выполняющая печать, обычно конвертирует документ в формат PostScript. Этот шаг необязателен.

2. Программа отправляет документ на сервер печати.

3. Сервер печати получает документ и помещает его в очередь печати.

4. Когда доходит очередь до этого документа, сервер печати отправляет документ в фильтр печати.

5. Если документ не в формате PostScript, фильтр печати может выполнить его конвертацию.

6. Если целевой принтер не понимает язык PostScript, драйвер принтера конвертирует документ в формат, пригодный для принтера.

7. Драйвер принтера добавляет к документу дополнительные инструкции, такие как параметры лотка бумаги и двухсторонней печати.

8. Сервер печати использует прикладную часть, чтобы отправить документ на принтер.

Больше всего в этом процессе смущает постоянное обращение к формату PostScript. В действительности это язык программирования, поэтому, когда вы печатаете файл с его использованием, вы отправляете на принтер программу. Формат PostScript играет роль стандарта при печати в системах вроде Unix, подобно тому как формат .tar выступает в качестве стандарта при архивировании. Некоторые приложения теперь используют стандарт вывода PDF, но его сравнительно легко конвертировать.

Чуть позже мы поговорим о формате печати больше, но сначала посмотрим на систему работы с очередью печати.

14.6.1. Система CUPS

Стандартной системой печати в Linux является CUPS (http://www.cups.org/). Эта же система использована в Mac OS X. Демон сервера CUPS называется cupsd, и можно применять в качестве простого клиента команду lpr для отправки файлов этому демону.

Одной важной чертой системы CUPS является реализация протокола IPP (Internet Print Protocol, протокол печати через Интернет). Это система, которая позволяет трансакции, подобные трансакциям по протоколу HTTP, между клиентами и серверами через TCP-порт 631. На самом деле, если в вашей системе работает система CUPS, вы, вероятно, сможете подключиться к порту http://localhost:631/, чтобы увидеть текущую конфигурацию и проверить задания принтера. Большинство сетевых принтеров и серверов печати поддерживает протокол IPP. Его поддерживает и Windows, с помощью которой довольно просто настроить удаленные принтеры.

Вероятно, вы не сможете администрировать эту систему с помощью веб-интерфейса, поскольку его настройка по умолчанию не слишком защищена. Вместо этого в вашей версии ОС наверняка есть графический интерфейс настройки, позволяющий добавлять и изменять принтеры. Эти инструменты работают с файлами конфигурации, которые обычно находятся в каталоге /etc/cups. Как правило, лучше всего позволить этим инструментам выполнить работу за вас, поскольку конфигурация может оказаться сложной. Даже если вы встретитесь с проблемами и вам понадобится ручная настройка, лучше создать принтер с помощью графических инструментов, чтобы вам было с чего начать.

14.6.2. Преобразование формата и фильтры печати

Многие принтеры, в число которых входят почти все недорогие модели, не понимают язык PostScript или формат PDF. Чтобы система Linux могла поддерживать такие принтеры, следует конвертировать документы в формат, пригодный для принтера. Система CUPS отправляет документ в процессор RIP (Raster Image Processor, процессор растровых изображений), чтобы создать растровое изображение. Процессор RIP почти всегда использует команду Ghostscript (gs) для выполнения большей части работы, но это довольно сложно, поскольку растровое изображение должно соответствовать формату принтера. Тогда драйверы принтера, которые использует система CUPS, «консультируются» с файлом PPD (PostScript Printer Definition, описание принтера на языке PostScript), чтобы узнать такие параметры, как разрешение печати и размер бумаги.