Заводим Canon LBP2900 под linux, без ущерба для других принтеров и проиводительности

18 апреля 2011 г.

GDI-принтеры, в частности Canon LBP2900, это довольно актуальная проблема для linux-пользователей, так как поставщик драйверов для этого чуда не сильно позаботился об их юзаюбельности. У этих драйверов есть open-source форк, но он нестабилен и находится в стадии отлаживания. Пример его использования я приводить не буду, а приведу пример использования проприетарных драйверов от Canon.

Зачем этот пост? Насколько мне известно, множеству людей не удалось заставить работать такой принтер под linux, поэтому я поделюсь с сообществом своей success story.

Основной проблемой является то, что для работы проприетарных драйверов необходим демон ccpd, который несколько мешает работе других принтеров, при этом в случае каких-то непредвиденных обстоятельств и сбоев он приводит к увеличению нагрузки на процессор.

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

Все действия я производил на Ubuntu 10.04 LTS, libc6 ver. 2.11. Говорят, что работа драйвера при разных версиях библиотеки libc6 может отличаться.

Для начала нам необходимо скачать проприетарные драйвера c сайта Canon. Путем проб и ошибок я выяснил, что версия 1.60 лучше всех поддается настройке, но это сугубо мое мнение.

Скачиваем архив, распаковываем, и в каталоге drivers находим искомые cndrvcups-capt_1.60-2_i386.deb cndrvcups-common_1.60-2_i386.deb
Устанавливаем их в таком порядке:

sudo dpkg-i cndrvcups-common_1.60-2_i386.deb
sudo dpkg -i cndrvcups-capt_1.60-2_i386.deb 

также нам необходимо:

sudo apt-get install cups 

Итак, приступим. Для настройки и удаления принтера я набросал bash-скрипт:

#!/bin/bash
if [ $1 = kill ]; then sudo killall -9 captmon2
fi
if [ $1 = start ] ;then 
sudo ccpdadmin -x LBP2900 #удаляем записи о принтере на всякий случай
sudo /etc/init.d/cups stop #останавливаем демон печати
sudo mkdir /var/ccpd
sudo mkdir /var/captmon
sudo mkfifo /var/ccpd/fifo0 #эти файлы почему то не создаются автоматом..
sudo chmod 777 /var/ccpd/fifo0
sudo /etc/init.d/cups start #запускаем демон печати
sudo /usr/sbin/lpadmin -p LBP2900 -m CNCUPSLBP2900CAPTK.ppd -v ccp:/var/ccpd/fifo0 -E #регистрируем принтер в системе
sudo cp /home/jamb/scripts/ccpd /etc/init.d/ccpd #заменяем стандартный демон на патченный
sudo /usr/sbin/ccpdadmin -p LBP2900 -o /dev/usblp0 # добавляем принтер, адрес работает почему-то только такой. разработчики?
sudo /etc/init.d/ccpd stop # здесь обязательно надо отрубить ccpd, таков ритуал
sudo /etc/init.d/ccpd start
captstatusui -P LBP2900 # показываем интерфейс управления, там отобразятся события, например замятие бумаги
else if [ $1 = stop ] ;then 
sudo ccpdadmin -x LBP2900
sudo /etc/init.d/cups stop
sudo /etc/init.d/ccpd stop
fi
fi

Теперь о ритуале запуска.
Во-первых, ccpd надо заменять на патченный, стандартный не справляется. исходную ссылку на него дать не могу, утеряна за давностью лет, но вот он:

#
# ccpd startup script for Canon Printer Daemon for CUPS
#
# Modified for Debian GNU/Linux
# by Raphael Doursenaud <rdoursenaud@free.fr>
# and Markovtsev Vadim <markhor@mail.ru>

DAEMON=/usr/sbin/ccpd
LOCKFILE=/var/lock/subsys/ccpd
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=ccpd
DESC="Canon Printer Daemon for CUPS"

test -f $DAEMON || exit 0

. /lib/lsb/init-functions

case $1 in
 start)
 log_begin_msg "Starting $DESC: $NAME"
 start-stop-daemon --start --quiet --exec $DAEMON
 log_end_msg $?
 ;;
 stop)
 log_begin_msg "Stopping $DESC: $NAME"
 start-stop-daemon --stop --quiet --oknodo --exec $DAEMON
 log_end_msg $?
 ;;
 status)
 echo "$DESC: $NAME:" `pidof $NAME`
 ;;
 restart)
 log_begin_msg "Restarting $DESC: $NAME"
 start-stop-daemon --stop --quiet --oknodo --exec $DAEMON
 sleep 1
 start-stop-daemon --start --quiet --exec $DAEMON
 log_end_msg $?
 ;;
 *)
 echo "Usage: ccpd {start|stop|restart|status}"
 exit 1
 ;;
esac

exit 0

Все благодарности за патч отправляйте Raphael Doursenaud и Markovtsev Vadim . Копируем содержимое по ссылке в файл ccpd и указываем путь к нему в скрипте, мой путь: ~/scripts/ccpd
Во-вторых, если подключить принтер по usb, и довольно долго не запускать скрипт, то вероятность правильной работы устройства очень сильно уменьшается, при этом captstatusui выдает ошибку *socket error*.

Итак, называем основной скрипт как нибудь, например lbp2900, даем ему права на исполнение

chmod +x ./lbp2900

Теперь подключаем принтер к компьютеру, ждем секунды три, и запускаем скрипт

lbp2900 start

если все сделано верно, то появится окошко captstatusui с надписью Ready to print. Можем печатать. Заметьте, теперь в cups два принтера, один поднимается по умолчанию системой и не работает, а второй наш, рабочий. У меня он называется LBP2900-2.

Для отключения принтера выполняем

lbp2900 stop

и вынимаем usb провод.
При этом может возрасти нагрузка на процессор. Это бунтует процесс captmon2, лечится командой

lbp2900 kill

Таким образом, наша система не загрязнена ничем, кроме драйвера для устройства, и довольно быстро настраивается для работы с LBP2900.

Теги: рубрика Linux
  • Похожие статьи
  • Предыдущие из рубрики