Я хочу иметь доступ к моему принтеру DCP 195C (Brother) по локальной сети. Для этого я купил Raspberry Pi и установил на него CUPS. CUPS работает отлично, и все остальное тоже работает гладко. Моя проблема в том, что я не могу установить драйверы, которые поставляет Brother (они только для x86 и x64) на свой Pi. Есть ли возможность установить драйвер на свой Pi, которую я упустил?
решение1
Вкратце: Вам нужно извлечь файл ppd из драйвера Linux.
длинный:
ПЕРВЫЙ
- Перейдите на сайт Brothers Driver и найдите DCP195:http://support.brother.com
- Загрузите deb-версию Linux "Драйвер принтера CUPSwrapper (deb-пакет)"
- Откройте deb-файл с помощью инструмента сжатия и перейдите по пути к «dcp195ccupswrapper-1.1.3-1.i386/opt/brother/Printers/dcp195c/cupswrapper».
- Извлеките файл «brother_dcp195c_printer_en.ppd»
ВТОРОЙ
- Откройте веб-интерфейс Cups через
https://192.168.1.2:631/admin
[замените IP на PI] - Нажмите «Добавить принтер». Выберите «Brother DCP-195C (Brother DCP-195C)» и нажмите «Продолжить».
- При необходимости отредактируйте предстоящую информацию, отметьте «общий доступ к принтеру» и нажмите «продолжить».
- В разделе «Или укажите PPD-файл» найдите извлеченный файл «brother_dcp195c_printer_en.ppd» и загрузите его. Выполните следующие действия... готово
После этого принтер стал доступен, но с ошибкой: «Файл «/usr/lib/cups/filter/brlpdwrapperdcp195c» недоступен». Поскольку я установил драйвер на свой ноутбук с Ubuntu, я мог просто скопировать файл со своего ноутбука в /usr/lib/cups/filter/ на pi.
После этого мой ноутбук смог обнаружить принтер.
решение2
Вы можете заставить работать драйвер i386 на Raspberry Pi через эмуляцию, даже если у него другой набор инструкций. Это очень медленно и занимает несколько минут, пока не придет распечатка, но это работает.
Я нашел подсказку в этом сообщении на форуме: https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=15526&start=25#p708038
Шаг 1: Установите драйвер, следуя инструкциям в документации Brother.
У вас должен быть каталог, например, /opt/brother/Printers/dcp195c/lpd
с бинарным файлом фильтра brdcp195cfilter
. Этот бинарник вызывается filterdcp195c
скриптом оболочки прямо рядом с ним в том же каталоге.
Я думаю, что сейчас они предлагают скрипт установки, но я сделал это без него. Где-то есть инструкции, что нужно предварительно установить.
Шаг 2: Заставьте работать эмуляцию i386
Это соответствует шагам, указанным вhttps://wiki.debian.org/QemuUserEmulation
В конце шага 2 вы должны иметь возможность запускать двоичные файлы i386 так же, как и обычные двоичные файлы. В ps ax
, они покажут
Установить QEMU
Установите пакеты qemu
, binfmt-support
и qemu-user-static
.
Запустите update-binfmts --display
, чтобы увидеть, какие двоичные форматы поддерживаются. Они должны быть автоматически включены на Raspbian и Debian.
Установить библиотеки поддержки x86
На Raspbian добавьте в свой файл следующую строку /etc/apt/sources.list
:
## Debian i386
deb [arch=i386] http://http.debian.net/debian stable main contrib non-free
Подойдет и другой репозиторий Debian.
В репозитории Raspbian нет двоичных файлов x86, поэтому добавьте [arch=armhf]
строку к существующим строкам, начинающимся с deb
. Строки, начинающиеся с , deb-src
можно оставить как есть.
Сообщите Raspbian, что вам нужна многоархитектурная система с пакетами i386, и получите i386 libc. Чтобы этот update
шаг сработал, вам нужно импортировать и довериться ключам Debian GPG для управления пакетами.
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386
На этом этапе вы сможете запустить brdcp195cfilter
двоичный файл, который поставляется вместе с драйвером:
$ ./brdcp195cfilter
ERROR: ld.so: object '/usr/lib/arm-linux-gnueabihf/libarmmem.so' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored.
Error: invalid option !!
Если вы видите этот вывод, это сработало. Строка Error: invalid option !!
жалуется brdcp195cfilter
, что вы должны были передать аргументы.
Необязательно: Удалить ld.so
сообщение об ошибке
Raspbian использует /etc/ld.so.preload
предварительную загрузку libarmmem
библиотеки во все процессы. Библиотека заменяет некоторые дорогие процедуры памяти более быстрыми процедурами, написанными на ассемблере ARM, но она не является строго необходимой для запуска Raspbian.
Можно безопасно игнорировать предупреждение, но также безопасно удалить или закомментировать эту строку из /etc/ld.so.preload
. Предупреждение будет отображаться в журналах ошибок CUPS, если его не отключить.
Шаг 3: Заставьте это работать с CUPS
Вам необходимо установить CUPS, следуя инструкциям с веб-сайта Brother.
Ненадежное USB-соединение
На моем Raspberry dmesg
в какой-то момент в журнале быстро появлялись следующие строки:
[58981.586842] usblp0: removed
[59222.794260] usblp 1-1.3:1.0: usblp0: USB Bidirectional printer dev 8 if 0 alt 0 proto 2 vid 0x04F9 pid 0x0222
Для меня это решилось тем, что я зашел в localhost:631
(веб-интерфейс CUPS) и изменил принтер в разделе «Принтеры» так, чтобы он использовал распознаваемое CUPS USB-устройство, а не само устройство usb://dev/usb/lp0
.
Позвольте принтеру получать данные с нормальной скоростью.
brdcp195cfilter
это шаг в процессе печати, который получает огромное входное растровое изображение и преобразует его во что-то, что позже передается на принтер. Я измерил размер входных данных ~90 МБ для простого сообщения "Hello world" в верхней части страницы.
Эмуляция на Raspberry недостаточно быстра, чтобы успевать за подачей данных на принтер. Печать работает, но я слышал нездоровые шумы от моторов принтера, которые работали в ожидании данных.
Чтобы исправить это, установите утилиту sponge
из moreutils
пакета и отредактируйте filterdcp195c
так, чтобы вывод $BRCONV $BRCONV_OP
(aka brdcp195cfilter
) был передан по конвейеру sponge
. В конце файла должно быть три строки в регистрах "PostScript", "PDF" и "*", заканчивающиеся на ... | $BRCONV $BRCONV_OP | sponge
.
Это приводит к тому, что весь вывод из долгого процесса конвертера поглощается и отправляется на принтер только сразу после того, как конвертер завершит работу. Таким образом, печать начинается позже, но принтер получает данные с нормальной скоростью.
( sponge
сохраняет буферизованные данные во временном каталоге, поэтому вы не ограничены оперативной памятью Raspberry Pi)
решение3
Ответ Гюнтерабыло очень полезно. Это частично продолжение моего собственного опыта и информации.
Я не увидел никаких проблем с модулями ядра; вероятно, это было исправлено за последние шесть лет.
Сначала я протестировал это на Raspberry Pi 3. Печать идет медленно (~3 минуты на страницу), но я редко пользуюсь принтером, так что это приемлемо.
Чтобы избежать ld.so
сообщения об ошибке, вы можете удалить raspi-copies-and-fills
пакет.
Я счел необходимым установить Debian libc6:i386
и libc6:armhf
, поскольку эти пакеты требуют точного совпадения версий, а версия Raspbian содержит, например +rpi1
. Пакеты armhf Debian, похоже, работают правильно на Raspberry Pi 3; я считаю, что они должны работать на Raspberry Pi 2 (armv7) и более поздних версиях, а также на новом Raspberry Pi Zero 2 W, но не на Raspberry Pi 1 или Zero/W (armv6). Обратите внимание, что любой, кто смешивает дистрибутивы, должен посмотреть man apt_preferences
.
Я хотел использовать Raspberry Pi Zero W в качестве сервера печати. Это еще медленнее (~5 минут на страницу) и не может использовать пакеты armhf Debian. После долгого чтения и проб и ошибок мне удалось собрать пакет Raspbian libc6:i386
"bootstrap" из исходников.
Получить исходный код легко:
apt-get source glibc
cd glibc-N.NN
Оказывается, следующим шагом будет выбор профилей сборки.
https://wiki.debian.org/BuildProfileSpec
cross
потому что мы кросс-компилируемstage2
потому что нам нужно загрузить glibcnobiarch
позволяет избежать сборки пакетов amd64/x32nocheck
устраняет зависимость от сборки
Я подумал, что можно установить зависимости сборки следующим образом:
sudo apt-get -a i386 --build-profiles=cross,stage2,nobiarch,nocheck build-dep glibc
Однако это не удалось из-за некоторых недоступных пакетов, таких как perl:i386
. Может быть, я делаю что-то не так? Похоже, из-за моего очень ограниченного понимания пакетов Debian. Я сделал это вместо этого:
sudo apt-get build-dep glibc
Затем проверьте debian/control
, какая версия gcc
требуется, и:
sudo apt install dpkg-cross gcc-10-i686-linux-gnu g++-10-i686-linux-gnu
Часто это эквивалентно установке crossbuild-essential-i386
.
Теперь мы можем строить.
dpkg-buildpackage --no-sign -b -a i386 --build-profiles=cross,stage2,nobiarch,nocheck -d
Примечания:
- Процесс сборки занимает очень много времени на одноядерном armv6 Raspberry Pi. Я рекомендую использовать более быстрый Raspberry Pi для сборки пакетов.
- Этот пакет "bootstrap" был достаточен для моих нужд. Я не знаю, могут ли у него быть какие-то функциональные ограничения.
- Когда я попытался установить свой
libc6:i386
пакет, он конфликтует с существующимchangelog.Debian.gz
файлом, предоставленным Raspbianlibc6:armhf
. Я переименовал существующий файл, и пакет установился правильно.