Настройка печати с рабочей станции arm64

56a780cad962aadb93dc644716abebd3

Понадобилось тут решить небольшую задачку: настроить печать с рабочей станции на arm64 (бывший TV-бокс) на принтер Pantum 2500W, который хотя и сетевой, но требует драйвер, а драйвера соответственно только под x86.

И вот что получилось:

В системе уже установлена CUPS, но для печати на этот принтер, как уже сказано, одного ppd-файла недостаточно, нужен еще «фильтр», программа, которая есть исключительно под x86 (хотя и в 32/64 вариантах)

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

Логика простая: если для работы требуется запустить на arm64 программу для x86 — ее ведь можно запустить в эмуляторе! Скорость работы, конечно, не очень, но чтобы распечатать несколько страниц документа вполне достаточно.

Драйвера для этого конкретного принтера идут в 

пакете «Pantum Ubuntu Driver V1_1_123.zip» на сайте производителя.
Если распаковать — внутри два deb-файла, для 32 и 64 систем. Поскольку нам понадобятся библиотеки CUPS с x86, а она у нас 64-битная — берем 64-битную версию.

dpkg --extract xxx.deb dir

В каталог dir распаковывается содержимое deb-файла.
Копируем нужные файлы:

cp «dir/usr/share/cups/model/Pantum/Pantum P2500W Series.ppd» /usr/share/cups/model/
cp «dir/usr/lib/cups/filter/pt2500Filter» /usr/lib/cups/filter

Пробуем запустить этот /usr/lib/cups/filter/pt2500Filter — он ответит что-то вроде EXEC format error — естественно, архитектура-то другая.
Устанавливаем эмулятор:

apt install qemu-system-x86 qemu-user qemu-user-static binfmt-support
update-binfmts --enable qemu-x86_64
update-binfmts --enable qemu-i386

Пробуем запустить снова: теперь ошибка «Not found /lib64/ld-linux-x86–64.so.2»
Логично, его нет.
Создаем каталог /usr/lib/x86_64-linux-gnu и делаем симлинк:

mkdir /usr/lib/x86_64-linux-gnu
ln -s /usr/lib/x86_64-linux-gnu /lib64

Потом смотрим, какие еще библиотеки нужны:

objdump -p pt2500Filter | grep NEEDED
NEEDED libcups.so.2
NEEDED libcupsimage.so.2
NEEDED libdl.so.2
NEEDED libc.so.2

А вот теперь надо заходить на x86 машину и копировать оттуда нужные библиотеки.
Это еще не все, там зависимостей много — поэтому напишем простой скрипт:

#!/bin/bash

libs=$((
for i in * ; do
  objdump -p ${i} | grep NEEDED
done
) | sort | uniq | awk '{ print $2 }')

for i in $libs ; do
  if [ ! -f ${i} ] ; then
    scp XX.XX.XX.XX:/usr/lib/x86_64-linux-gnu/${i} .
  fi
done

Положим его в каталог /lib64, и будем запускать до тех пор, пока все найденные зависимости не будут удовлетворены.
Запустим фильтр еще раз, теперь ошибка должна быть другой:

«ERROR: job-id user title copies options [file]»

А вот теперь подключаем принтер:

lpadmin -p Pantum2500W -E -v ipp://XX.XX.XX.XX -P »/usr/local/share/ppd/Pantum P2500W Series.ppd»
lpadmin -d Pantum2500W

И в общем-то всё, теперь он должен работать.
Это — для рабочей станции, но в принципе ничего не мешает взять похожую коробочку и по такой же схеме сделать из нее принт-сервер.
В этом случае нужно будет просто подключать с рабочих компьютеров этот принтер уже через принт-сервер, как IPP Everywhere

© Habrahabr.ru