Настройка печати с рабочей станции arm64
Понадобилось тут решить небольшую задачку: настроить печать с рабочей станции на 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