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