Vladimir "Dair" Lebedev-Schmidthof (dair_spb) wrote,
Vladimir "Dair" Lebedev-Schmidthof
dair_spb

Categories:

Рабочее

Борьба с принтером HP LaserJet P1006, в условиях CUPS под Linux Debian


В рамках кампании по насаждению линукса в отдельно взятой игровой компании делал так, чтобы принтер, подключенный к "серверу" под управлением Debian Linux, работал как положено, т.е., с любого компьютера в офисе. Абсолютное большинство копьютеров под Windows (XP, 7/32, 7/64), у меня только iMac.

Исходные компоненты:
1. Принтер HP LaserJet P1006
2. Компьютер под управлением OS Linux Debian "sid"
3. Common Unix Printing System (CUPS), http://www.cups.org
4. Драйвер принтера foo2zjs, http://foo2zjs.rkkda.com

Симптомы: не работает. В /var/log/messages множественные сообщения вида

Mar 30 21:54:34 jbs kernel: [  165.508737] usblp0: USB Bidirectional printer dev 2 if 0 alt 0 proto 2 vid 0x03F0 pid 0x3E17
Mar 30 21:54:34 jbs /etc/hotplug/usb/hpljP1006: foo2zjs: usb://HP/LaserJet%20P1006?serial=XXXXXX... download failed.
Mar 30 21:54:35 jbs /etc/hotplug/usb/hpljP1006: foo2zjs: loading HP LaserJet P1006 firmware /usr/share/foo2xqx/firmware/sihpP1006.dl to /dev/usb/lp0 ...
Mar 30 21:54:35 jbs kernel: [  165.567435] usblp0: nonzero write bulk status received: -108
Mar 30 21:54:35 jbs kernel: [  165.570203] usblp0: removed
Mar 30 21:54:35 jbs /etc/hotplug/usb/hpljP1006: foo2zjs: ... download failed.


План раскопок:
Скрипт к Udev для принтера (в комплекте с пакетом printer-driver-foo2zjs): /lib/udev/rules.d/85-hplj10xx.rules
В нём по подключении принтера запускается скрипт /usr/sbin/hpljP1006 (также в пакете printer-driver-foo2zjs)
В оном скрипте в принтер по подключении записывается прошивка (качается отдельно при помощи программы getweb, входящей в пакет printer-driver-foo2zjs, в моём случае getweb P1006), причём асинхронно (в фоне). Также асинхронно эта прошивка записывается в "CUPS USB device", что бы это ни значило (не разбирался).
Для последнего запускается входящая в состав пакета cups утилита /usr/lib/cups/backend/usb, возвращающая на выходе список принтеров.
По неизвестным мне причинам, эта утилита перезагружает драйвер уровня ядра usblp.

В результате происходит такое:
1. Пишем в принтер (в устройство, созданное драйвером usblp) прошивку (в фоне)
2. Запускаем утилиту /usr/lib/cups/backend/usb
3. Утилита выгружает usblp
4. Запись прошивки обламывается, потому что убили драйвер
5. usblp загружается заново, что триггерит весь процесс заново (т.е., goto 1)
Хорошо, что в скрипте загружки прошивок стоит sleep 3, так что процесс повторяется раз в три секунды.

Что сделал:
1. Убрал в скрипте амперсанды, т.е., теперь прошивка загружается в RAM принтера не в фоне. Теперь она успевает загрузиться, и только потом вызывается /usr/lib/cups/backend/usb, который убивает драйвер.
2. Засабмитил баг в Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=666447


Tags: linux, software, work
Subscribe

  • Как бы так...

    Вернулся от голосования к работе, а там. В реальной жизни борт корабля с т.з. программного обеспечения представляет собой некую локальную сеть с…

  • node.js, typescript, Visual Studio Code

    А нету ли у меня знакомых, умеющих в node.js и отладку command-lineового TypeScript в Visual Studio Code? Visual Studio Code не обязательно. У меня…

  • починить крышу гаража

    Специалист какого профиля (читай: что гуглить) мне нужен чтобы починить рубероидную крышу бетонного гаража? Нет ли у вас таких знакомых специалистов?

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 1 comment