Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023) — различия между версиями
Материал из 0x1.tv
StasFomin (обсуждение | вклад) (Новая страница: «;{{SpeakerInfo}}: {{Speaker|Александр Певзнер}} <blockquote> </blockquote> {{VideoSection}} {{vimeoembed||800|450}} {{youtubelink|}} {{SlidesSe…») |
StasFomin (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии этого же участника) | |||
;{{SpeakerInfo}}: {{Speaker|Александр Певзнер}} <blockquote> Описываются пакеты sane-airscan и ipp-usb. Sane-airscan — это драйвер SANE, реализующий поддержку «бездрайверного» сканирования. Драйвер поддерживает два наиболее популярных протокола: eSCL (часть Apple Airprint) и Microsoft WDS. Ipp-usb — это системный демон, обеспечивающий поддержку «бездрайверного» сканирования и печати для USB устройств без сетевого подключения. Даётся обзор технологии «бездрайверного» сканирования и печати, которая существенно упрощает администрирование и настройку принтеров и сканеров, делая её доступной даже неквалифицированным пользователям. * https://github.com/alexpevzner/sane-airscan * https://github.com/OpenPrinting/ipp-usb </blockquote> {{VideoSection}} {{vimeoembed|901722600|800|450}} {{youtubelink|}} |sC5f2ZYQ_yY}} {{SlidesSection}} [[File:Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023).pdf|left|page=-|300px]] {{----}} == Thesis == === Что такое бездрайверное сканирование и печать? === Традиционно любое внешнее устройство нуждается в своём специфическом драйвере. Поиск, установка и настройка драйверов — не всегда простая задача. Особенно если речь идёт не о Windows. В то же время, мы привыкли, что любая флешка в любом компьютере под управлением любой ОС «просто работает» и в настройке не нуждается. Это стало возможным потому, что все флешки поддерживают единый, стандартный протокол. На этом примере мы видим смену парадигмы: теперь не операционная система подстраивается (с помощью драйвера) под аппаратуру, а аппаратура и ОС подстраиваются под стандартный, не зависящий от производителей, протокол. Аналогичная технология в отношении принтеров и сканеров называется «бездрайверной» печатью и сканированием — в том смысле, что общий, единый для всех устройств драйвер становится частью ОС, а не поставляется вместе с аппаратурой. === Стандарты и протоколы === Существует два набора стандартов для «бездрайверного» сканирования и печати. Первый набор активно продвигается (и частично разработан) компанией Apple. Он основан на таких открытых стандартах IETF, как DNS-SD<ref> S. Cheshire, M. Krochmal, DNS-Based Service Discovery, RFC-6763, 2013</ref> для поиска устройств в сети и IPP<ref>M. Sweet, Internet Printing Protocol/1.1: Encoding and Transport, RFC-8010, 2017</ref>, <ref>M. Sweet, Internet Printing Protocol/1.1: Model and Semantics, RFC-8011, 2017</ref> для печати. Спецификация eSCL (протокол для сканирования) сначала была доступна только на условиях NDA, но позже [https://mopria.org/spec-download была опубликована Mopria Alliance]. Тем самым, в настоящий момент весь стек протоколов является открытым. Маркетинговые названия, под которыми Apple продвигает этот набор протоколов (Bonjour Printing и AirPrint. AirPrint) для сканеров неофициально называется AirScan. Другой набор протоколов, близкий семантически, но совершенно не совместимый на уровне форматов запросов и ответов, разработан и придвигается компанией Microsoft и называется Web Services for Devices (WSD) и состоит из WS-Discovery, протокола поиска устройств, и WS-Scan/WS-Print, протоколов сканирования/печати. [https://learn.microsoft.com/en-us/windows-hardware/drivers/image/web-services-on-devices-reference Спецификация опубликована]. Для поддержки USB-устройств без сетевого подключения существует [https://www.usb.org/document-library/ipp-protocol-10 протокол IPP over USB], который вернее было бы назвать HTTP over USB. Его идея заключается в замене TCP-транспорта USB-транспортом в HTTP, и тем самым — обеспечения поддержки протоколов IPP и eSCL, основанных на HTTP. Даже встроенная в принтер конфигурационная веб-консоль работает через IPP over USB. При этом протоколы WSD через IPP over USB не поддерживаются. === Основные компоненты стека === Бездрайверное сканирование и печать работает с устройствами, которые подключаются по сети (Ethernet или WiFi) или через USB. Настройка устройств максимально автоматизирована и в большинстве случаев сводится к выбору нужного устройства из предложенного списка. Стек бездрайверного сканирования и печати состоит из нескольких компонент, обеспечивающих следующие функции: # Автоматическое обнаружение устройств в сети. # Поддержку протокола печати. # Поддержку протокола сканирования. # Поддержку IPP over USB. Автором был разработан драйвер сканера sane-airscan, реализующий оба семейства протоколов сканирования в одном драйвере и программа (системный демон) ipp-usb, реализующая поддержку IPP over USB. === sane-airscan === [https://github.com/alexpevzner/sane-airscan sane-airscan] — это драйвер сканера, совместимый с проектом SANE (но не входящий в него, независимый). Он написан на языке Си. sane-airscan реализует оба протокола сканирования, eSCL и WSD. Поиск eSCL-устройств полагается на DNS-SD демона Avahi, но поиск WSD-устройств пришлось реализовать в драйвере самостоятельно из-за отсутствия в Linux стандартной реализации WS-Discovery. При разработке sane-airscan ставилась задача обеспечить максимальный комфорт для пользователя. Это потребовало решения ряда интересных технических задач. % %\item 1. Сведение вместе результатов поиска одного и того же устройства. % Одно и то же устройство может быть найдено сразу в нескольких экземплярах: eSCL/WSD, IPv4/IPv6, HTTP/HTTPS и т.п. sane-airscan сводит все такие «находки» вместе, предлагая пользователю выбирать из списка фактически присутствующих физических устройств. Это оказалось достаточно неочевидной задачей, и её решение занимает примерно 1/4 кодовой базы драйвера. 2. Оптимизация скорости поиска WSD. Поиск DNS-SD через Avahi работает быстро, т.к. фактически Avahi сканирует сеть всё время и по запросу возвращает свой кэш. А вот работающему без демона-помощника WS-Discovery, для надёжного обнаружения устройств требуется время на сканирование сети. Для ускорения сканирования используется тот факт, что большинство WSD-сканеров являются МФУ, совмещёнными с IPP-принтерами: сканирование можно прекратить, как только прояснится статус всех устройств, которые видны через Avahi как IPP-принтеры. 3. Корректировка параметров изображения. Интерфейс SANE предполагает, что процесс сканирования осуществляется в фоновом режиме, поскольку он может быть очень долгим. Однако SANE требует, чтобы сразу после запуска сканирования драйвер мог вернуть точные фактические параметры изображения (которые у ряда устройств отличаются от запрошенных). Для решения этой проблемы sane-airscan спекулятивно возвращает параметры изображения, совпадающие с запрошенными, а при распаковке изображения приводит его в соответствие с заявленными параметрами. === ipp-usb === [https://github.com/OpenPrinting/ipp-usb ipp-usb] — это демон, реализующий поддержку IPP over USB. Он написан на языке Go. Ранняя реализация для Linux, [https://github.com/OpenPrinting/ippusbxd ippusbxd], была очень простая. Эта программа принимала TCP-соединения, принятые из TCP-сокета, данные отправляла в USB, пришедший из USB ответ отправляла назад в TCP. Работало это не очень хорошо. При некорректном поведении клиента синхронизация между хостом и устройством терялась, и это нарушало обработку последующих запросов. Причина в том, что в отличии от TCP, в USB нет механизма, позволяющего восстановить синхронизацию, просто закрыв соединение. ipp-usb понимает протокол HTTP и является полноценным HTTP-proxy, гарантирующим, что при любом поведении клиентов, с точки зрения устройства HTTP-протокол будет полностью соблюдён. === Текущее состояние и перспективы развития === Оба проекта несколько лет находятся в активной эксплуатации и входят во все основные дистрибутивы Linux. Усилиями пользователей sane-airscan перенесён на все основные ветки BSD. Ipp-usb недавно был перенесён на FreeBSD. Sane-airscan входит в состав Google ChromeOS. Реализация IPP over USB из ChromeOS является разработкой Google, но основана на наработках и идеях, позаимствованных из [https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/ippusb_bridge ipp-usb]. Список устройств, протестированных (усилиями пользователей) на совместимость с sane-airscan, состоит более чем из 170-и записей и постоянно продолжает расти. Можно ожидать, что в перспективе нескольких лет практически все новые принтеры и сканеры будут «бездрайверными». === Опыт продвижения проектов в дистрибутивы Linux === Ключевыми моментами успешного продвижения проектов в дистрибутивы Linux явились, по мнению автора, следующие: # Востребованность самих проектов. # Участие автора в дискуссиях на площадках зарубежных форумов коллективной поддержки популярных дистрибутивов Linux. # Качественная реализация. # Распространение программ не только в исходных текстах, но и в виде пригодных для инсталляции пакетов для многих дистрибутивов. # Быстрая реакция на сообщения пользователей о проблемах и ошибках. Для сборки пакетов использовалась площадка [https://build.opensuse.org/ OpenSUSE Build Service], поддерживающая, кроме OpenSUSE, множество других дистрибутивов. Использование этой площадки бесплатно для проектов с открытыми исходными текстами. {{----}} [[File:{{#setmainimage:Стек бездрайверного сканирования и печати ОС Linux (Александр Певзнер, OSSDEVCONF-2023)!.jpg}}|center|640px]] {{LinksSection}} <!-- <blockquote>[©]</blockquote> --> <references/> [[Категория:OSSDEVCONF-2023]] [[Категория:Open-source projects]] [[Категория:Draft]] |
Текущая версия на 13:48, 17 июня 2024
- Докладчик
- Александр Певзнер
Описываются пакеты sane-airscan и ipp-usb. Sane-airscan — это драйвер SANE, реализующий поддержку «бездрайверного» сканирования. Драйвер поддерживает два наиболее популярных протокола: eSCL (часть Apple Airprint) и Microsoft WDS. Ipp-usb — это системный демон, обеспечивающий поддержку «бездрайверного» сканирования и печати для USB устройств без сетевого подключения. Даётся обзор технологии «бездрайверного» сканирования и печати, которая существенно упрощает администрирование и настройку принтеров и сканеров, делая её доступной даже неквалифицированным пользователям.
Содержание
Видео
Презентация
Thesis
Что такое бездрайверное сканирование и печать?
Традиционно любое внешнее устройство нуждается в своём специфическом драйвере. Поиск, установка и настройка драйверов
— не всегда простая задача. Особенно если речь идёт не о Windows.
В то же время, мы привыкли, что любая флешка в любом компьютере под управлением любой ОС «просто работает» и в настройке не нуждается.
Это стало возможным потому, что все флешки поддерживают единый, стандартный протокол. На этом примере мы видим смену парадигмы: теперь не операционная система подстраивается (с помощью драйвера) под аппаратуру, а аппаратура и ОС подстраиваются под стандартный, не зависящий от производителей, протокол.
Аналогичная технология в отношении принтеров и сканеров называется «бездрайверной» печатью и сканированием — в том смысле, что общий, единый для всех устройств драйвер становится частью ОС, а не поставляется вместе с аппаратурой.
Стандарты и протоколы
Существует два набора стандартов для «бездрайверного» сканирования и печати.
Первый набор активно продвигается (и частично разработан) компанией Apple. Он основан на таких открытых стандартах IETF, как DNS-SD[1] для поиска устройств в сети и IPP[2], [3] для печати.
Спецификация eSCL (протокол для сканирования) сначала была доступна только на условиях NDA, но позже [https://mopria.org/spec-download была опубликована Mopria Alliance]. Тем самым, в настоящий момент весь стек протоколов является открытым.
Маркетинговые названия, под которыми Apple продвигает этот набор протоколов (Bonjour Printing и AirPrint. AirPrint) для сканеров неофициально называется AirScan.
Другой набор протоколов, близкий семантически, но совершенно не совместимый на уровне форматов запросов и ответов, разработан и придвигается компанией Microsoft и называется Web Services for Devices (WSD) и состоит из WS-Discovery, протокола поиска устройств, и WS-Scan/WS-Print, протоколов сканирования/печати. Спецификация опубликована.
Для поддержки USB-устройств без сетевого подключения существует протокол IPP over USB, который вернее было бы назвать HTTP over USB. Его идея заключается в замене TCP-транспорта USB-транспортом в HTTP, и тем самым
— обеспечения поддержки протоколов IPP и eSCL, основанных на HTTP. Даже встроенная в принтер конфигурационная
веб-консоль работает через IPP over USB.
При этом протоколы WSD через IPP over USB не поддерживаются.
Основные компоненты стека
Бездрайверное сканирование и печать работает с устройствами, которые подключаются по сети (Ethernet или WiFi) или через USB.
Настройка устройств максимально автоматизирована и в большинстве случаев сводится к выбору нужного устройства из предложенного списка.
Стек бездрайверного сканирования и печати состоит из нескольких компонент, обеспечивающих следующие функции:
- Автоматическое обнаружение устройств в сети.
- Поддержку протокола печати.
- Поддержку протокола сканирования.
- Поддержку IPP over USB.
Автором был разработан драйвер сканера sane-airscan, реализующий оба семейства протоколов сканирования в одном драйвере
и программа (системный демон) ipp-usb, реализующая поддержку IPP over USB.
sane-airscan
sane-airscan — это драйвер сканера, совместимый с проектом SANE (но не входящий в него, независимый). Он написан на языке Си.
sane-airscan реализует оба протокола сканирования, eSCL и WSD.
Поиск eSCL-устройств полагается на DNS-SD демона Avahi, но поиск WSD-устройств пришлось реализовать в драйвере самостоятельно из-за отсутствия в Linux стандартной реализации WS-Discovery.
При разработке sane-airscan ставилась задача обеспечить максимальный комфорт для пользователя. Это потребовало решения ряда интересных технических задач.
% %\item 1. Сведение вместе результатов поиска одного и того же устройства. % Одно и то же устройство может быть найдено сразу в нескольких экземплярах: eSCL/WSD, IPv4/IPv6, HTTP/HTTPS и т.п. sane-airscan сводит все такие «находки» вместе, предлагая пользователю выбирать из списка фактически присутствующих физических устройств. Это оказалось достаточно неочевидной задачей, и её решение занимает
примерно 1/4 кодовой базы драйвера.
2. Оптимизация скорости поиска WSD. Поиск DNS-SD через Avahi работает быстро, т.к. фактически Avahi сканирует сеть всё время и по запросу возвращает свой кэш. А вот работающему без демона-помощника WS-Discovery, для надёжного обнаружения устройств требуется время на сканирование сети.
Для ускорения сканирования используется тот факт, что большинство WSD-сканеров являются МФУ, совмещёнными с IPP-принтерами: сканирование можно прекратить, как только прояснится статус всех устройств, которые видны через Avahi как IPP-принтеры.
3. Корректировка параметров изображения. Интерфейс SANE предполагает, что процесс сканирования осуществляется в фоновом режиме, поскольку он может быть очень долгим.
Однако SANE требует, чтобы сразу после запуска сканирования драйвер мог вернуть точные фактические параметры изображения (которые у ряда устройств отличаются от запрошенных).
Для решения этой проблемы sane-airscan спекулятивно возвращает параметры изображения, совпадающие с запрошенными, а при распаковке изображения приводит его в соответствие с заявленными параметрами.
ipp-usb
ipp-usb — это демон, реализующий поддержку IPP over USB. Он написан на языке Go.
Ранняя реализация для Linux, ippusbxd, была очень простая. Эта программа принимала TCP-соединения, принятые из TCP-сокета, данные отправляла в USB, пришедший из USB ответ отправляла назад в TCP.
Работало это не очень хорошо. При некорректном поведении клиента синхронизация между хостом и устройством терялась, и это нарушало обработку последующих запросов. Причина в том, что в отличии от TCP, в USB нет механизма, позволяющего восстановить синхронизацию, просто закрыв соединение.
ipp-usb понимает протокол HTTP и является полноценным HTTP-proxy, гарантирующим, что при любом поведении клиентов, с точки зрения устройства HTTP-протокол будет полностью соблюдён.
Текущее состояние и перспективы развития
Оба проекта несколько лет находятся в активной эксплуатации и входят во все основные дистрибутивы Linux. Усилиями пользователей sane-airscan перенесён на все основные ветки BSD. Ipp-usb недавно был перенесён на FreeBSD. Sane-airscan входит в состав Google ChromeOS. Реализация IPP over USB из ChromeOS является разработкой Google, но основана на наработках и идеях, позаимствованных из ipp-usb.
Список устройств, протестированных (усилиями пользователей) на совместимость с sane-airscan, состоит более чем из 170-и записей и постоянно продолжает расти.
Можно ожидать, что в перспективе нескольких лет практически все новые принтеры и сканеры будут «бездрайверными».
Опыт продвижения проектов в дистрибутивы Linux
Ключевыми моментами успешного продвижения проектов в дистрибутивы Linux явились, по мнению автора, следующие:
- Востребованность самих проектов.
- Участие автора в дискуссиях на площадках зарубежных форумов коллективной поддержки популярных дистрибутивов Linux.
- Качественная реализация.
- Распространение программ не только в исходных текстах, но и в виде пригодных для инсталляции пакетов для многих дистрибутивов.
- Быстрая реакция на сообщения пользователей о проблемах и ошибках.
Для сборки пакетов использовалась площадка OpenSUSE Build Service, поддерживающая, кроме OpenSUSE,
множество других дистрибутивов. Использование этой площадки бесплатно для проектов с открытыми исходными текстами.