PostScriptプリンタが壊れ、つなぎに急遽エプソンのPX-435Aという、有線LAN無し、新しく入れ替えたインクを普通の文字だけの文書でも秒速で使い果たすという大食漢なプリンタを、アクセスポイントとの相性なのか無線LAN接続がいまいち安定しないので、長いことご無沙汰なUSB接続で使用するというお遊びをしてみます。
まずCUPS(print/cups-base)
1 |
# cd /usr/ports/print/cups-base && make config |
lprで使えれば十分なのでZeroconfは無視します。
libusbを使う場合はulptなど他のドライバがロードされていない状態の素のugenであることが重要とpkg-messageに書かれていて、しかしこのプリンタはUSB接続した瞬間にulptどころかSDカードリーダでumassまでロードされて後で何かとめんどそうなので、逆にulptを使用してlibusbを使用しない方向に。
1 |
LIBUSB_DESC=USB support via libusb instead of ulpt |
とかいうknobにしておいてくれれば良いのかも。いろいろな環境ではそう簡単な話じゃないのだとは思うけど。というわけでlibpaperとGhostscriptとD-Busを選択し、一方libusbの選択はされていない状態でインストールしてみます。
1 2 3 4 5 6 |
# printf '\ndevfs_system_ruleset="system"\n' >>/etc/rc.conf # printf "\n[system=10]\nadd path 'ulpt0' mode 0660 group cups\n" >>/etc/devfs.rules # service devd restart # portmaster print/cups # printf '\ncupsd_enble="YES"\n' >> /etc/rc.conf # service cupsd start |
http://127.0.0.1:631/にアクセス。ちゃんとlocalhostだけでlistenしていて、デフォルト設定でいきなり普通に動作している模様。うれしい。
続いてCUPS用ドライバ。GutenprintにPX-401Aはあるものの、まだPX-435Aは載っていませんでした(2013/7/5)。他のモデルやGenericなESC/P系でいけるのだろうと思うも試行錯誤がありそう。OpenPrntingのwebサイトによるとrpmやらdebやらがあるようなので、それにしてみることに。FreeBSDのlinuxulatorはFedra 10(なんと)の対応のパッケージが多いようなので、emulators/linux_base-f10をインストール。
1 2 3 |
# portmaster emulators/linux_base-f10 ===>>> This port is marked IGNORE ===>>> linuxulator is not (kld)loaded |
なるほど。
1 2 3 |
# printf '\nlinux_enable="YES"\n' >> /etc/rc.conf # service abi start # portmaster emulators/linux_base-f10 |
epson-inkjet-printer-201203j-1.0.0-1lsb3.2.i486.rpmをダウンロードして、’package epson-inkjet-printer-201203j is not relocatable’だそうなのでrpm2cpioですごく変な場所に書きこまれてしまうものがないことを確認してからインストールしてみます(今思えばそのまま/compat/linux下にcpioで展開して、/optにsymlinkすればよかったです…)。
1 2 3 4 |
# portmaster archivers/rpm # rehash # rpm2cpio epson-inkjet-printer-201203j-1.0.0-1lsb3.2.i486.rpm | cpio -it # rpm -i --nodeps --noscripts --ignorearch --ignoreos epson-inkjet-printer-201203j-1.0.0-1lsb3.2.i486.rpm |
- フィルタ: /opt/epson-inkjet-printer-201203j/cups/lib/filter/epson_inkjet_printer_filter
- PPD(gzip): /opt/epson-inkjet-printer-201203j/ppds/Epson/Epson-PX-435A_Series-epson-driver.ppd.gz
のようです。
1 2 3 |
# ldd /opt/epson-inkjet-printer-201203j/cups/lib/filter/epson_inkjet_printer_filter | fgrep 'not found' ELF interpreter /lib/ld-lsb.so.3 not found /opt/epson-inkjet-printer-201203j/cups/lib/filter/epson_inkjet_printer_filter: signal 6 |
lsbなんじゃそりゃ、とほこりをかぶったUbuntu機で確認。なるほど、いろんなディストロ向けのパッケージングをしやすくするためのものですか。えいっ、
1 |
# ln -s ld-linux.so.2 /compat/linux/lib/ld-lsb.so.3 |
あとはたんたんと繰り返し。
1 2 3 4 5 6 7 8 9 10 |
# ldd /opt/epson-inkjet-printer-201203j/cups/lib/filter/epson_inkjet_printer_filter | fgrep 'not found' libcupsimage.so.2 => not found libcups.so.2 => not found libjpeg.so.62 => not found # portmaster print/linux-f10-cups-libs graphics/linux-f10-jpeg # ldd /opt/epson-inkjet-printer-201203j/cups/lib/filter/epson_inkjet_printer_filter | fgrep 'not found' libtiff.so.3 => not found libpng12.so.0 => not found # portmaster graphics/linux-f10-tiff graphics/linux-f10-png # ldd /opt/epson-inkjet-printer-201203j/cups/lib/filter/epson_inkjet_printer_filter | fgrep 'not found' |
ふつうのユーザでフィルタを実行してみる
1 2 |
> /opt/epson-inkjet-printer-201203j/cups/lib/filter/epson_inkjet_printer_filter Insufficient options. |
ダイナミックリンクは解決してちゃんと動作してエラーを出力。結果的にLSB 3.2なるものがFedra 10との相性抜群なおかげもあってportsで全部済み、ありがたいことこのうえないです。stringsで覗いてコマンドは呼び出していなさそうなので、これでOKなはず。
http://127.0.0.1:631/で、Find New Printersでは無線LANの接続だけが見つかるので、Add Priterを押し、Local Printers ‘USB Printer #1’ で追加。Or Provide a PPD File:に先ほどの /opt/epson-inkjet-printer-201203j/ppds/Epson/Epson-PX-435A_Series-epson-driver.ppd.gz を指定してAdd Printer。デフォルト設定をしてからPrint Test Pageであっさり印字されました。linuxulator を動かす分の手間だけで、本当にいい世の中になったものです。
続いて他の*BSD機でも使えるようにとman cups-lpdするとinetd経由で呼ぶのが吉とのこと。inetdで起動しているものは何もなかったので、/etc/inetd.confが変なもの起動しないことを確認、/etc/hosts.allow(TCP wrapperの作者は今はPostfixで有名なWietse Venemaさんですね)を適切に指定してからinetdを起動するようにします。そしてCUPSが自動生成したprintcapを見ておきます。
1 2 3 4 5 6 |
# printf '\nprinter stream tcp nowait cups /usr/local/libexec/cups/daemon/cups-lpd cups-lpd -o document-format=application/octet-stream\n' >>/etc/inetd.conf # printf '\ninetd_enble="YES"\n' >>/etc/rc.conf # service inetd start # cat /usr/local/etc/printcap ... PX-435A|PX-435A on homepac:rm=foo.bar.example.com:rp=PX-435A: |
他の*BSD機にはCUPS不要でlpdが動いていなければ動かすだけ、例えば、
1 2 |
# printf '\nlpd_enable="YES"\n' >> /etc/rc.conf # service lpd start |
そして先ほどのサーバ側のprintcapを素の/usr/bin/lprが見てくれる/etc/printcapに追記します。
1 |
# printf '\nlp|PX-435A|PX-435A on homepac:rm=foo.bar.example.com:rp=PX-435A:sh:\n' >> /etc/printcap |
他に使えるプリンタがないので lp にして引き数無しで使えるデフォルトにし、バナーは不要なので sh を追加します。webブラウザから印刷でlprしてみたところさくっと印刷してくれました。めでたしめでたし。
おまけ。せっかくCUPSいじったので、横でネットワークにつながっ
ているCITIZEN CT-S300のドライバ追加してみます。 ctzpos-cups-1.1.0-0.src.rpm というsource rpmがあるので、こちらはそのままいけそうです。
1 2 3 4 5 6 7 8 9 |
# rpm2cpio ctzpos-cups-1.1.0-0.src.rpm | cpio -iv # tar xjvf ctzpos-cups-1.1.0.tar.bz2 # cd ctzpos-cups-1.1.0 # /bin/sh # for f in *.c; do b=$(basename $f .c); cc -O -I/usr/local/include -L/usr/local/lib -lcups -lcupsimage -o $b $f; chown root:cups $b; chmod ug=rx,o= $b; mv -iv $b /usr/local/libexec/cups/filter/; done # exit # gzip -9k *.ppd # chown root:cups *.ppd.gz # mv -iv *.ppd.gz /usr/local/share/cups/model/ |
これで
- CT-S280
- CT-S281/281L
- CT-S300
- CT-S310
- CT-S2000/2000L
- CT-S4000
- CT-S601/S651
- CT-S801/801L
- CT-S851
- PPU-700
- CT-P29X
- CBM1000
- CD-S500
- PMU22XX
- PMU23XX
がFreeBSDのCUPSでも使えるはず。うちのCT-S300は’Find New Printers’で見つかり、自動的に socket://xxxxxxxx になりました。ポートが明示されていない場合のデフォルトポートは9100の模様です。そのまま追加完了して、デフォルト設定を74mm x 2000mmにしたら、えらい長いテストページの左端だけが出てきました…