# aptitude install cupsys cupsys-bsd \
cupsys-client cupsys-common cupsys-dbg \
cupsys-driver-gimpprint \
cupsys-driver-gutenprint
Do you want to set up the BSD lpd compatibility server?
<<<--- No
ปรับตั้ง cupsys
# dpkg-reconfigure cupsys
Do you want CUPS to print unknown jobs as raw jobs?
<<<--- Yes
Printer communication backends:
<<<--- [DEFAULT]
ปรับตั้งให้สามารถใช้งานผ่านเว็บ ใช้พอร์ต 631 แบบไม่ต้องล๊อกอิน
# vi /etc/cups/cupsd.conf
... #--- Listen localhost:631 Listen *:631 ... #BrowseAllow @LOCAL BrowseAllow all ... <Location /> Order allow,deny # Allow localhost Allow all </Location> <Location /admin> # Encryption Required AuthType None Order allow,deny # Allow localhost Allow all </Location> <Location /admin/conf> AuthType None Require user @SYSTEM Order allow,deny # Allow localhost Allow all </Location> ...
# /etc/init.d/cupsys restart
สามารถใช้งานผ่านบราวเซอร์ในเครือข่ายได้แล้ว
เช่น http://192.168.1.5:631/
สำหรับเครื่องพิมพ์ในลินุกซ์ เราเรียกใช้จาก cups ผ่านบราวเซอร์ที่พอร์ต 631 ซึ่งก็ใช้งานสะดวกพอควร
แต่ถ้าหากว่าเป็นเครื่องพิมพ์อิงก์เจ็ตที่ต้องมีการตรวจดูระดับหมึกด้วย การใช้งานผ่าน cups จะดูระดับหมึกไม่ได้
สำหรับเครื่องพิมพ์ Epson เดเบียนจะมีแพกเกจที่ทำหน้าที่ดังกล่าว ชื่อ mtink
ติดตั้งดังนี้
ติดตั้งแพกเกจ
$ sudo aptitude install mtink
แก้ไขให้เราสามารถใช้งานเครื่องพิมพ์ได้ โดยปรับตั้งให้เราไปอยู่ในกรุ๊ปของเครื่องพิมพ์ คือ lp
สมมุติว่าเราชื่อ user1
$ sudo usermod -G lp user1
หรือถ้ามีชื่อผู้ใช้หลายคน อาจแก้ไขที่ไฟล์ /etc/group โดยตรง
$ sudo vi /etc/group
... lp:x:7:cupsys,user1 ...
เรียกใช้งานด้วยคำสั่ง mtink
มีปัญหาเรื่อง cups พิมพ์ผ่านเครือข่ายไม่ได้ เป็นอยู่เครื่องเดียว ไม่ทราบว่าเป็นเพราะอะไร
แก้ชั่วคราวด้วยการสร้างซอคเก็ตสำหรับรับงานพิมพ์ผ่านเครือข่าย (เผื่อเอาไว้เวลาอัปเกรดรุ่นบนเดเบียนแล้ว cups ชอบตายด้วย)
เอาความรู้จาก debian: ปรับปรุง HylaFax Client โดยใช้ perl สร้างเครื่องพิมพ์เทียมขึ้นมา โดย
ที่เครื่องปรินต์เซิร์ฟเวอร์
สร้างไฟล์ perl รับงานพิมพ์ผ่าน socket
สมมุติว่าเครื่องพิมพ์ชื่อ brother ติดตั้งไดร์ฟเวอร์ไว้เรียบร้อยแล้ว
เราจะสร้างสคริปต์สำหรับรับงานพิมพ์ผ่านทาง socket หมายเลข 5692
# vi /usr/local/bin/brother-print
#!/usr/bin/perl # Daniel E. Markle # 20031114 Revision 0.1 # This program starts up a daemon which will watch for a postscript file # coming in from CUPS, then launch pyla to send it as a fax. # Use it with the socket://localhost:5691 URL in cups. # Issues: # -security, make sure only localhost can see this port, it allows anyone # who can stream data to this port to popup pyla on your desktop # -must be ran as the user or the window may not pop up at the right # place, if at all # ***CONFIGURE ME HERE # Port to listen on, use socket://localhost: in cups my $MY_PORT = 5692; # Printer name my $PRINTER = "brother"; # Temporary file storage, this is a file not a folder my $TMP_FILE_NAME = "/tmp/brotherprint"; # ***END CONFIGURATION # ----- You shouldn't need to touch anything beyond this point ----- use IO::Socket::INET; # check to make sure we can use the temp file open ( TMPFILE, ">", $TMP_FILE_NAME ) or die "Can not open temp file $TMP_FILE_NAME, " . "check to make sure it is not owned by another user"; close ( TMPFILE ); my $data; my $server = IO::Socket::INET->new ( LocalPort => $MY_PORT, Type => SOCK_STREAM, Reuse => 1, Listen => 1 ) or die "Could not start server process"; while ( my $job = $server->accept() ) { open ( TMPFILE, ">", $TMP_FILE_NAME ); while ( <$job> ) { print TMPFILE $_; } close ( TMPFILE ); close $job; `lpr -P "$PRINTER" "$TMP_FILE_NAME"`; unlink "$TMP_FILE_NAME"; }
สร้างสคริปต์สำหรับเปิดปิดการใช้งาน
เอาไว้ที่ /etc/init.d/ (ไม่ค่อยดีเท่าไหร่ ควรเอาไว้ที่อื่นแล้วสร้างลิงก์มาจะดีกว่า)
# vi /etc/init.d/brother-printd
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/local/bin/brother-print NAME=brother-print DESC="Pseudo printer for Brother" test -x $DAEMON || exit 0 case "$1" in start) echo -n "Starting $DESC: " start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ --chuid $USER --background --make-pidfile \ --exec $DAEMON -- $DAEMON_OPTS echo "$NAME." ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \ --oknodo echo "$NAME." ;; restart|force-reload) echo -n "Restarting $DESC: " start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \ --oknodo sleep 1 start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ --chuid $USER --background --make-pidfile \ --exec $DAEMON -- $DAEMON_OPTS echo "$NAME." ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 ;; esac exit 0
สั่งเปิดใช้งานเมื่อเริ่มเปิดเครื่อง และสั่งเปิดใช้งานเลย
# update-rc.d brother-printd defaults
# /etc/init.d/brother-printd start
ที่เครื่องลูกข่าย
เปิดใช้งานด้วยบราวเซอร์ http://localhost:631
ให้ตั้งเครื่องพิมพ์ไปที่ Device URI: socket://server:5692
โดยใช้ไดร์ฟเวอร์เป็น Generic Postscript Printer
หรือสั่งด้วยบรรทัดคำสั่งว่า
$ sudo lpadmin -p brother -E -v socket://server:5692
เสร็จเรียบร้อยแล้ว สามารถพิมพ์ผ่านเครือข่ายได้แล้ว
ปกติเวลาจะติดตั้งเครื่องพิมพ์เครือข่าย จะใช้การติดตั้งผ่านเว็บ ทางพอร์ต 631
แต่ปัญหาคือ สำหรับเครื่องพิมพ์ที่ต่ออยู่กับเครื่องวินโดวส์ จะไม่สามารถติดตั้งผ่านเว็บแบบนั้นได้
ต้องติดตั้งผ่าน gnome-cups-manager คือ System -> Administration -> Printing
ผมลองติดตั้งเครื่องพิมพ์ Brother MFC-7420
พบว่าต้องติดตั้งไดร์เวอร์สองตัวคือ brmfc7420lpr-2.0.1-1.i386.deb และ cupswrapperMFC7420-2.0.1-1.i386.deb
เมื่อติดตั้งเสร็จจึงเรียก gnome-cups-manager อีกทีนึง แต่พอติดตั้งเสร็จแล้ว เขาไม่ยอมบันทึกค่าให้ ลองย้อนมาดูล๊อกไฟล์ที่ /var/log/cups/error_log จึงทราบว่าเขาไม่ยอมคัดลอกไฟล์ MFC7420.ppd ไปยังไดเรคทอรี่ /usr/share/ppd
ก็เลยคัดลอกไฟล์ด้วยมือ
$ sudo cp /usr/share/cups/model/MFC7420.ppd /usr/share/ppd
ก็จะสามารถใช้งานเครื่องพิมพ์เครือข่ายวินโดวส์ได้แล้ว
บางครั้งเวลาอัปเกรดแพกเกจ อาจเกิดปัญหาพิมพ์ไปยังเครื่องพิมพ์วินโดวส์ไม่ได้
แก้ปัญหาด้วยการ ถอดและลงไดรฟเวอร์ปรินเตอร์ใหม่
บางครั้งเวลาเลือกเปลี่ยนไดรฟเวอร์เครื่องพิมพ์ให้เหมาะสมกับเครื่องพิมพ์นั้น ๆ เมื่อเปลี่ยนแล้วพิมพ์ผ่านเครือข่ายไม่ออก
ดู /var/log/cups/error_log แล้วแก้ปัญหาโดยต้องเปลี่ยนการอนุญาตใช้ไฟล์ของ cache ของ cups
$ sudo chmod 660 /var/cache/cups/*
$ sudo chown root:lp /var/cache/cups/*
โดยให้เราเข้าไปเป็นสมาชิกของกลุ่ม lp
$ sudo usermod -G lp $USER
(แต่ผมใช้วิธีเข้าไปแก้ไฟล์ /etc/group ตรง ๆ )
$ sudo vi /etc/cups/mime.convs
... application/octet-stream application/vnd.cups-raw 0 - ...
(ลองบน sid เครื่องนึงต้องแก้ อีกเครื่องนึงไม่ต้องแก้ ยังงงอยู่ครับ)
เอามาจาก: Debian and Windows Shared Printing mini-HOWTO
Upgrade Required
/etc/cups/cupsd.conf
โดยเติม
DefaultEncryption Never
แล้วสั่งเริ่มใหม่
$ /etc/init.d/cupsd.conf restart
เอามาจาก CUPS: 426 - Upgrade Required
ถ้าติดตั้งใหม่แล้วโดนรายงานว่า หาไฟล์ /usr/share/cups/model/MFC7420.ppd ไม่พบ
ให้สร้างไฟล์เปล่าขึ้นมา แล้วติดตั้งใหม่ เขาจะสร้างไฟล์ใหม่ขึ้นมาแทน
# mkdir -p /usr/share/cups/model
# touch /usr/share/cups.model/MFC7420.ppd
# aptitude reinstall cupwrappermfc7420
# /etc/init.d/cupsys restart
~/.cups/lpoptions
/etc/cups/lpoptions
สมมุติว่าจะให้พิมพ์ไปเครื่องพิมพ์ brother โดยตั้งความละเอียดที่ 600dpi และขนาดกระดาษ A4
Dest brother Resolution=600dpi PageSize=A4
จากเรื่อง debian: สร้างเครื่องพิมพ์ socket ให้ cups
พบว่าหลังปรับรุ่น cups เป็นรุ่น 1.4.4-1 แล้วมีปัญหาว่าเครื่องพิมพ์แบบ socket พิมพ์ไม่ออก
ค้นพบว่า มีบั๊กอยู่ตรงไดเรคทอรี่ backend โดยให้เพิ่มข้ออนุญาตในการอ่านและรัน
$ sudo chmod go+rx /usr/lib/cups/backend
ที่มา: Bug#586324: Printing fails with "/usr/lib/cups/backend/socket failed" fixed for me