Настройка принтера HP LaserJet 1018 под OpenBSD

Опубликовано 16.08.2024 в OpenBSD

Продолжаю искать оригинальное применение ненужным вещам.

Одно из удивительных открытий, которое подарила мне прошедшая пандемия - это насколько же современная капиталистическая экономика завязана на сверхпотребление! Подумать только: на какой-то совершенно смешной промежуток времени люди перестали покупать ненужные вещи и навязанные, избыточные услуги - и мировая экономика едва-едва не рухнула. Нет, определенно для того, чтобы всемогущий рыночек всё порешал - люди непременно должны покупать по нескольку за сезон комплектов одежды ("в этом сезоне в моду вошли..."), раз в год менять сматфон на точно такой же, но другой, раз в пять лет - менять автомобиль, а уж без потребительского туризма нам всем и вовсе грозит немедленная смерть от "выгорания" в страшных муках!

И естественно, этот безумно раздутый пузырь сверхпотребления не мог бы существовать без запланированного устаревания вещей. Кому, черт возьми, нужно производить, скажем, автомобиль, который будет исправно функционировать десятилетиями? А новые кто покупать будет? Кому нужна электрическая лампочка, которая не перегорит за всю жизнь? Ну кому вот, кроме нас, потребителей, это нужно? И вот производители светодиодных ламп на тайных совещаниях договариваются, как бы все-таки сделать так, чтоб эти лампочки почаще перегорали... Надо ученых привлечь, гранты выделить, ага.

Тут, правда, есть нюанс: дорогие вещи, которые будут запланированно разваливаться через полгода - хуже продаются. Нет, реклама буквально творит чудеса, миллионы раз-в-год-покупателей новых айфонов не дадут соврать, но... И вот тут на помощь приходят неочевидные технологии "запланированного устаревания". Твой телефон или, там, ноутбук - не развалятся, конечно. Но с каждым годом работать будут все медленнее и хуже, тормозить всё больше... Были уже судебные иски про намеренное замедление тех же смартфонов - но хапугам-капиталюгам хоть ссы в глаза.

Собственно, перейдем от затянувшейся преамбулы к препарированию непосредственно экспоната. Году ориентировочно в 2007-м, плюс-минус, я приобрел свой первый в жизни лазерный принтер Hewlett-Packard LaserJet 1018, монохромный, подключаемый по USB, без особых наворотов. Для учебы нужно было, а негативный опыт со струйными принтерами я к тому времени уже накопил, посему взял лазерный.

И агрегат этот, что любопытно, до сих пор пребывает в полной исправности. Но есть нюансы... Принтер фактически невозможно стало использовать с современными версиями операционных систем Microsoft Windows и MacOS - заставить его хоть как-то функционировать можно только потратив долгие часы на поиски и оживление давно устаревших драйверов (под MacOS, помнится, и вовсе приходилось прикручивать драйвер от другой модели - и всё костылие это закономерно помирало с каждым мажорным обновлением операционки). Производитель давно снял эту модель с производства, с поддержки и даже архивы с драйверами предоставляет очень нетривиальными способами... В общем, рыночек сделал всё мыслимое и немыслимое, чтобы подтолкнуть счастливых владельцем к решению "выкинь на помойку исправную оргтехнику и беги покупать новую - точно такую же, но модную и дороже". Но мы не пойдем на поводу у кровопийц и эксплуататоров!

Дано: вонзаем штепсель в розетку, а USB-провод в свободный порт ноутбука под управлением OpenBSD-current. И dmesg | tail в чорной-чорной консоли уведомляет нас о подключении нового устройства:

ulpt0 at uhub0 port 6 "Hewlett-Packard HP LaserJet 1018" rev 2.00/1.00 addr 2

Красиво, волшебно - но пока что это бесполезный для нас кусок пластика. Потому что богомерзкое это устройство не имеет в ПЗУ постоянно хранящейся прошивки от производителя - ее необходимо загружать в принтер при каждом подключении. Файл прошивки можно самостоятельно отыскать, скачать, преобразовать... Но есть способ проще: в системе портов OpenBSD имеется /usr/ports/sysutils/firmware/ulpt - собственно, идем туда, делаем там подобающий ситуации make и make install - и в папочке /etc/firmware у нас прирастает файлов прошивок, в том числе искомый "ulpt-hp1018". Зачем эти танцы? Да потому, что Hewlett-Packard, ластоногие глиномесы и враги свободы, распространяют свои прошивки на условиях несвободной и дискриминирующей лицензии. Кстати, если после этих манипуляций снова воткнуть шнурок принтера в USB-порт, случится бодрое жужжание и перемигивание лампочками, свидетельствующее, что прошивка благополучно теперь в принтер загружается.

Но нет, это далеко не конец нашим приключениям. Как учит нас Коммунистическая партия, все тела при нагревании расширяются... эээ... в смысле, как учит нас дккументация к пакету cups (/usr/local/share/doc/pkg-readmes/cups), нам будет необходим переконфигурировать ядро (не пугайтесь, это не больно):

*** WARNING ***
ulpt(4) needs to be disabled in the kernel (see bsd.re-config(5)) or the printer
will not be available to libusb:
# echo 'disable ulpt' >>/etc/bsd.re-config
# reboot

Теперь принтер при подключении будет определяться как устройство с именем ugen* (что означает, что оно обслуживается USB generic device driver) и фича автоматической загрузки прошивки при подключении закономерно отвалится. Как ее вернуть? Как всегда в OpenBSD, проще простого. Подключение устройств мониторит демон hotplugd, запускающий по факту подключения/отключения shell-скрипты attach/detach из каталога /etc/hotplug. Соответственно, нам нужно всего лишь вписать в /etc/hotplug/attach что-нибудь наподобие:

if usbdevs -v | grep "HP LaserJet 1018"; then
    logger "HP LaserJet 1018 printer attached as $DEVNAME, loading firmware..."
    cat /etc/firmware/ulpt-hp1018 > /dev/$DEVNAME.01
fi

Ах да, вы ведь не забыли поставить себе, собственно, Common Unix Printing System с базой драйверов и включить демон оной?

$ doas pkg_add cups foomatic-db foomatic-db-engine foo2zjs
$ doas rcctl enable cupsd
$ doas rcctl start cupsd

Ну а для дальнейших настроек достаточно браузером зайти на localhost:631 (веб-интерфейс CUPS) и посредством примитивного мышетыканья обнаружить там принтер, выбрать для оного рекомендуемый драйвер foo2zjs-z1 и выполнить оставшиеся настройки (назначить его принтером по умолчанию и выдать разрешение на использование вашему текущему юзеру, root и _cups).

Да, невкусная вишенка: по факту печати любого задания (уже после того, как все благополучно распечаталось) в /var/log/cups/error_log будет появляться ошибка "Backend usb returned status -139 (crashed)", последнее задание будет зависать в очереди печати, а сам принтер останавливать работу. С чем это связано - мне достоверно выяснить не удалось, но есть простой воркэраунд, позволяющий полностью забыть об этой проблеме: там же, в интерфейсе CUPS в "обслуживании принтера" настроить поведение при ошибке - изменить его с дефолтного "stop printer" на "abort job", после чего успешно распечатанное задание станет пропадать из очереди, а принтер сохранять работоспособность.

Собственно, всё, теперь моя уютная OpenBSD на десктопе еще и с принтером дружит.

P.S. В системе также доступен пакет hplip, гипотетически предоставляющий более стильный. модный и молодежный драйвер для принтера и даже гуй к нему hplip-gui - но подружить систему с этим драйвером мне не удалось, что-то там, кажется, сильно линуксо-специфичное стреляло. Ну я особо и не упирался, работает же.