Настройка локального USB принтера с помощью CUPS на FreeBSD 7.0

Действия, которые помогли мне настроить принтер Samsung ML-1210:

1. Проверить с помощью dmesg, что принтер определился:

# dmesg |grep ulp
ulpt0: <Samsung Electronics Co., Ltd. Samsung Laser Printer ML-1200 Series, class 0/0, rev 1.10/1.00, addr 2> on uhub0
ulpt0: using bi-directional mode

2. Если устройство не определилось, то необходимо пересобрать ядро со следующими параметрами:

# USB support
device uhci # UHCI PCI->USB interface
device ohci # OHCI PCI->USB interface
device ehci # EHCI PCI->USB interface (USB 2.0)
device usb # USB Bus (required)
#device udbp # USB Double Bulk Pipe devices
device ugen # Generic
device uhid # "Human Interface Devices"
device ukbd # Keyboard
device ulpt # Printer
device umass # Disks/Mass storage - Requires scbus and da
device ums # Mouse

Если в ядре есть device usb, device uhci, device ulpt ничего не пересобираем. Настройки, с которыми собирается ядро обычно лежат в пути: /usr/src/sys/i386/conf (плюс о системе можно прочесть по команде uname –a)

3. Прописываем в rc.conf:

#printer
usbd_enable="YES"
lpd_enable="YES"

4. Скачиваем драйвер для своего принтера. Для меня этот драйвер Samsung-ML-1210-gdi.ppd.

5. Устанавливаем с портов следующие модули и фильтры, без них cups не будет корректно печатать различный текст и графику.

/usr/ports/print/foomatic-db
/usr/ports/print/foomatic-db-engine
/usr/ports/print/foomatic-filters
/usr/ports/print/ghostscript-gnu

6. Cups можно поставить либо с портов либо из исходников. При попытке установиться с портов у меня выдалась ошибка и установка не удалась. Поэтому я ставилась с исходников с сайта:

http://www.cups.org/software.php
Ссылка на архив: http://www.cups.org/software.php?VERSION=1.3.9&FILE=cups/1.3.9/cups-1.3.9-source.tar.gz
После распаковки вызваем команду (можно с необходимыми параметрами) :

# ./configure

Затем как обычно

# make
# make test
# make install clean

7. После установки cups прописываем в /etc/rc.conf :

#enable cups
cupsd_enable="YES"
linux_enable="YES"

8. Копируем драйвер для своего принтера в папку /usr/share/cups/model и в папку /usr/local/etc/cups/ppd

# cp ./Samsung-ML-1210-gdi.ppd /usr/share/cups/model/samsung.ppd
# cp ./Samsung-ML-1210-gdi.ppd /usr/local/etc/cups/ppd/samsung.ppd

!Имя драйвера samsung.ppd надо запомнить, так как имя драйвера должно потом совпадать с именем принтера в printers.conf.

9. Для того чтобы отследить правильно ли работает принтер и нет ли ошибок изменим в файле /etc/cups/cupsd.conf параметр LogLevel info на LogLevel debug:

# Log general information in error_log - change "info" to "debug" for
# troubleshooting...
LogLevel debug

10. Настраиваем /usr/local/etc/cups/printers.conf – файл описывающий какие принтеры есть в системе. Если такого файла нет - создаем:

# vi /usr/local/etc/cups/printers.conf
<DefaultPrinter samsung> Info Samsung ML-1210 gdi
Location
DeviceURI usb:/dev/ulpt0
State Idle
Accepting Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
</Printer>

Краткое описание полей файла printers.conf:

<DefaultPrinter samsung>
# Default означает, что это принтер по умолчанию; если в системе
#есть еще принтер, то другой будет просто Printer.
# Далее следует название принтера, оно может быть
#любым.
# Важно только, чтобы название ppd
# файла в /etc/cups/ppd было таким же. Угловые скобки - начало
#блока описания принтера.

Info SAMSUNG ML-1210 gdi
# Просто инфа. Необязательный параметр.
Location
# Место расположения принтера. Необязательный параметр.
DeviceURI usb:/dev/ulpt0
# Куда принтер подключен физически. В данном случае, это
#параллельный порт. В случае usb-принтера
# usb:/dev/usb/lp0. Если это сетевой принтер на виндовой машине,
#это будет
#smb:/имя_пользователя:пароль@домен:имя(ip)_машины/название_прин
#тера
# название_принтера - это его сетевое имя, которое можно
#посмотреть выполнив команду
# $ smbclient -L ip(имя)_машины. parallel - это протокол
#обращения к принтеру. Возможные варианты
# находятся в /usr/lib/cups/backend

State Idle
# Состояние принтера. В данном случае - ожидание. Чтобы принтер
#остановить, надо написать Stop и
#перезапустить cups. Включить соответственно - написать Idle и
#перезапустить сервер печати.

Accepting Yes
# Означает готовность к приему заданий.
JobSheets none none
# Текущие задания, страницы.
QuotaPeriod 0
# Всякие квоты и лимиты, в нашем, упрощенном случае, можно
#игнорировать.

PageLimit 0
KLimit 0
</Printer> # Завершение блока описания принтера.

11. Даем доступ cups к устройству принтера:

# vi /etc/devfs.conf
#Give cups printer access
own ulpt0 root:cups
perm ulpt0 0660

12. Запускаем cups

# /usr/local/etc/rc.d/cupsd start
Starting cupsd.
# ps -ax|grep cups
23381 ?? Ss 0:00.07 /usr/local/sbin/cupsd
23383 p0 R+ 0:00.01 grep cups
#

13. Делаем проверку состояния принтера

# lpq
samsung is ready
no entries
# lpstat -p
printer samsung is idle.

16. Проверяем, что автоматически попало в /etc/printcap:

# cat /etc/printcap
# This file was automatically generated by cupsd(8) from the
# /usr/local/etc/cups/printers.conf file. All changes to this file
# will be lost.
samsung|Samsung ML-1210 gdi:rm=freeserver:rp=samsung:
#

17. Проверка что установлена переменная окружения $LANG:

# echo $LANG

Если данная переменная не установлена в en_US.UTF8 (это default настройки для cups), то устанавливаем это значения в файлах: /root/.profile , /etc/profile

LANG=en_US.UTF8
export LANG

И в файле в /root/.cshrc

setenv LANG en_US.UTF8

18. Теперь печатаем тестовую страницу и отслеживаем логи:

# lpr /usr/local/share/cups/data/testprint.ps

Логи:

# tail -100 /var/log/cups/error_log

Если все нормально и такие подробные логи больше не нужны, то меняем LogLevel в файле cupsd.conf со значения debug на info.
Вот и все :)

Важные заметки:

По умолчанию для cups параметр ErrorPolicy принимает значение stop-printer, поэтому если при печати случаются какие-то ошибки cups останавливает принтер и сам меняет состояние принтера в файле printers.conf с State Idle на State Stopped. Чтобы при печати и каких-то ошибках принтер не стопорился,а просто прерывался job необходимо в cupsd.conf прописать:

#Error policy default stop-printer
ErrorPolicy abort-job

Примеры печати:
Альбомная печать двух копий через стандартный Input:

# cat /home/mike/welcome.cgi |lpr -o landscape -#2

Альбомная двусторонняя печать:

# cat /home/mike/welcome.cgi /home/mike/welcome.cgi | lpr -o landscape -o sides=two-sided-short-edge

Ссылка с описанием команд для настройки печати:

http://www.cups.org/cgi-bin/htmldoc//documentation.php/doc-1.4/options.html

Здесь описание всех возможный настроек файла cupsd.conf:

http://www.cups.org/documentation.php/doc-1.4/ref-cupsd-conf.html#ConfigFilePerm