Tiskárny Canon LBP pod Systemd

Začal bych slovy, že podpora Linuxu od výrobců některého hw je stále na mizerné úrovni, ale to všichni a víme, i čím to je víme, tak není moc co řešit. Tiskárny Canon nějakou podporu Linuxu mají, sice nevalné kvality, ale lepší něco než nic a tak se vrhneme rovnou do práce. V dnešním článku nainstaluji tiskárnu Canon LPB6300dn do Sabayonu upravenou jako nativní službu pod Systemd. Asi většina z nás ví, že Systemd alternativní init systém, pod kterým nám už dvě vydání startuje Sabayon.

20.7.2017 Nedávno byly vydány konečně po dlouhé době nové ovladače, takže jsem článek upravil pro ně.

Proč jsem nevyužil startovacího skriptu z balíku, se dozvíte dále. Na instalaci byl použit 64-bitový Sabayon 13.08 a cílem mělo být možnost tisknout po nastartování systému, tak aby byla kromě CUPS i automaticky startovaná služba ccpd pro tisk.

V návodu dále jsou jako prefixy příkazů používány v kódech znaky $ a # podle toho, zda stačí provést příkaz jako uživatel, nebo jsou potřeba práva roota.

Požadavky na systém *

  • Linux s x86 kompatibilním CPU (32-bit nebo 64-bit)
  • CUPS 1.1.17 (doporučená 1.1.19 nebo pozdější)

Instalace ovladačů *

Stáhněte CAPT ovladače z webu výrobce, momentálně ve verzi 2.71.

Ovladače podporují tyto typy tiskáren:

i-SENSYS LBP2900
i-SENSYS LBP2900B
i-SENSYS LBP3000
i-SENSYS LBP3010
i-SENSYS LBP3100
i-SENSYS LBP3250
i-SENSYS LBP3300
i-SENSYS LBP3310
i-SENSYS LBP5000 
i-SENSYS LBP5050
i-SENSYS LBP5050n
i-SENSYS LBP5100
i-SENSYS LBP5300
i-SENSYS LBP6000
i-SENSYS LBP6000B
i-SENSYS LBP6020
i-SENSYS LBP6020B
i-SENSYS LBP6200d 
i-SENSYS LBP6300dn
i-SENSYS LBP6310dn
i-SENSYS LBP7010C
i-SENSYS LBP7018C
i-SENSYS LBP7200Cdn
i-SENSYS LBP7210Cdn
Laser Shot LBP1120
Laser Shot LBP1210
Laser Shot LBP3200

Stažený balík obsahuje všechny potřebné ovladače, a to jak v binární podobě (deb, rpm), tak i ve zdrojové. Rozbalte rpm větev z požadované architektury na nějaké dočasné místo na disku. Nástrojů na rozbalení archívu, i grafických, je k dispozici dostatečné množství, proto rozbalování popisovat nebudu. Otevřete si svůj oblíbený terminálový emulátor, neboli zkráceně terminál a přesuňte se v něm do adresáře s dvěma vybalenými soubory:

$ cd Linux_CAPT_PrinterDriver_V260_uk_EN/64-bit_Driver/RPM/ 
$ ls 
cndrvcups-capt-2.71-1.x86_64.rpm 
cndrvcups-common-3.21-1.x86_64.rpm

Oba balíky nainstalujte pomocí rpm. Je možné, že rpm v systému nemáte, v tom případě nejdříve doplňte správce balíků rpm do systému (dle potřeby použijte pro instalaci Rigo):

# equo i app-arch/rpm

Pak už můžete spustit instalaci samotných balíků:

# rpm -ivh cndrvcups-common-3.21-1.x86_64.rpm --nodeps
# rpm -ivh cndrvcups-capt-2.71-1.x86_64.rpm --nodeps

První (a poslední) prasárna aneb proč zrovna RPM *

Protože se v RPM balíku počítá s jiným umístěním binárky ccp a filtrů CUPS, po instalaci je přesuňte na správné místo.

Zde bych se rád zastavil pro jeden komentář. V této chvíli jsem si totiž řekl: “Hmm, nemám rád nestandardní řešení a tak se pustím do instalace ze zdrojáků”. Poté jsem ale absolvoval relativně dlouhé martyrium s pokusy o kompilaci, kvůli nepopsaným závislostem, které byly příčinou pádů kompilací, kdy pak následovala detekce chyb a hledání řešení. Vše se postupně dařilo, ale poslední kapkou abych se vrátil zpět k rpm a opustil nápad s kompilací ze zdrojových kódů, byla závislost grafického nastavovátka captstatusui na knihovnách z gtk+ verze 1 (přes ovladači deklarovanou závislost pouze na v. 2). Nutnost kompilace této prehistorie z emerge mě poněkud odpudila. V té chvíli jsem se vrátil k rpm a už neremcal na nesystémovost, neboli prasárnu s přesunem pouhých 4 souborů.

Takže zpět k přesunu. Proveďte následující:

# cp -r /usr/lib64/cups/* /usr/libexec/cups/
# rm -rf /usr/lib64/cups/

Nakonec restartujte službu CUPS:

# systemctl restart cups

Pokud chcete ověřit správné umístění souborů, spusťte webovou konzoli CUPS (http://localhost:631/admin), kde musíte po stisku Add printer (a přihlášení jako root) vidět CAPT Printer u Local Printers, jako je to na obrázku. Pokud v lokálních tiskárnách CATP nemáte, zřejmě se je nějaký problém s přesunovanými soubory a vraťte se o krok zpět.

Instalace tiskárny *

Instalace tiskárny do CUPS *

K instalaci použijeme opět terminál a to pro obě varianty, jak síťové, tak USB varianty. LBP6300 je název fronty, který si zvolíte (téměř) libovolně sami (používejte tisknutelné znaky kromě /# a mezery) z názvu tiskárny a soubor ppd který detekujete v adresáři /usr/share/cups/model/ podle typu tiskárny, nebo, pokud si nejste jistí, najdete tabulku souborů a tiskáren v souboru README-capt-2.6xUK.txt v balíku ovladačů. Také můžete použít následující příkaz na výpis ovladačů:

# lpinfo -m | grep Canon
CNCUPSLBP1120CAPTJ.ppd Canon LBP1120 CAPT ver.1.5
CNCUPSLBP1120CAPTK.ppd Canon LBP1120 CAPT ver.1.5
CNCUPSLBP1210CAPTJ.ppd Canon LBP1210 CAPT ver.1.5
CNCUPSLBP1210CAPTK.ppd Canon LBP1210 CAPT ver.1.5
CNCUPSLBP2900CAPTK.ppd Canon LBP2900 CAPT ver.1.5
CNCUPSLBP3000CAPTJ.ppd Canon LBP3000 CAPT ver.1.5
CNCUPSLBP3000CAPTK.ppd Canon LBP3000 CAPT ver.1.5
CNCUPSLBP3050CAPTK.ppd Canon LBP3010/LBP3018/LBP3050 CAPT (UK)
CNCUPSLBP3100CAPTJ.ppd Canon LBP3100 CAPT (JP)
CNCUPSLBP3150CAPTK.ppd Canon LBP3100/LBP3108/LBP3150 CAPT (UK)
...... výpis pokračuje

Nyní když již máte všechny potřebné informace přidejte do CUPS tiskárnu:

# lpadmin -p LBP6300 -P /usr/share/cups/model/CNCUPSLBP6300CAPTK.ppd \
-v ccp://localhost:59687 -E

Toto samé můžete provést i z webové konzole CUPS po vybrání CAPT (viz předchozí obrázek) a pokračováním v průvodci po zadání potřebných údajů z předchozího příkazu. Nicméně k výsledku dojdete pomalejší cestou.

Síťová varianta tiskárny *

Dále nastavíte pro námi definovanou frontu LBP6300 (upravte podle předchozího příkazu) vstup tiskárny, v tomto případě síť. IP 192.168.1.6 nahraďte vlastní IP tiskárny:

# ccpdadmin -p LBP6300 -o "net:192.168.1.6"
CUPS_ConfigPath = /etc/cups/
LOG Path        = None
UI Port         = 59787

Entry Num : Spooler : Backend : FIFO path         : Device Path     : Status
----------------------------------------------------------------------------
    [0]   : LBP6300 : ccp     : //localhost:59687 : net:192.168.1.6 : New!!

Síť je možné případně také nastavit graficky, což je alternativa k předchozímu příkazu, přiznám se ale že jsem tuto možnost ještě nikdy nepoužil:

# captstatusui -P LBP6300

USB varianta tiskárny *

Zda systém vidí správně USB tiskárnu se přesvěčte příkazem:

# lsusb | grep Canon
Bus 005 Device 003: ID 04a9:26ff Canon, Inc.

Natáhněte modul usblp

# modprobe usblp

Po chvíli zkontrolujte vytvořené LP zařízení:

$ ls /dev/usb/lp*
/dev/usb/lp0

Vstup ccpd pak podobně jako v případě síťové varianty nakonfigurujte tímto příkazem (použijte správné číslo podle předchozího výstupu):

# ccpdadmin -p LBP6300-USB -o /dev/usb/lp0
 CUPS_ConfigPath = /etc/cups/
 LOG Path        = None
 UI Port         = 59787

 Entry Num : Spooler : Backend : FIFO path         : Device Path  : Status 
 ----------------------------------------------------------------------------
     [0]   : LBP6300 : ccp     : //localhost:59687 : /dev/usb/lp0 : New!!

Autostart modulu *

Jelikož CUPS již nepotřebuje modul usblp pro připojení USB tiskáren (na což by ale musel reflektovat tento výrobce tiskárny) je modul na blacklistu. Proto ho musíme z blacklistu odebrat aby se natáhnul po restartu automaticky. Zakomentujte v souboru /etc/modprobe.d/blacklist.conf řádek s modulem tak aby vypadal po úpravě takto:

#blacklist usblp 

Poznámka o direct USB *

V CUPS (nebo v lsinfo -m) si můžete všimnout v možnosti připojení  přímo na USB (možnost přímého připojení  na usb://Canon/LBP6300?serial=001E8F29A9AC), ale vězte že toto fungovat nebude, dokud výrobce neaktualizuje ovladače pro tuto možnost.

Vytvoření služby ccpd jako nativní služby Systemd *

Nyní se dostáváme k odpovědi z počátku článku, proč jako službu Systemd. Systemd by měl být s většinou předchozích skriptů kompatibilní a měl by instalovaný spouštěcí skript /etc/init.d/ccpd detekovat a správně ovládat. To ale neudělal. On to neudělal ani sysvinit, když jsem tiskárnu kdysi instaloval do Gentoo a musel jsem si skript také přepsat. Ale Systemd nyní nedetekoval originál (ani upravený) po instalaci, ale ani můj zcela přepsaný spouštěcí skript, s kterým jsem dlouho na Gentoo normálně fungoval. Ani za boha jsem Systemd nepřinutil byť jen zaregistrovat, že soubor existuje. Přitom jiné spouštěcí skripty akceptuje a ovládá v pořádku. Takže výsledkem bylo, že jsem musel napsat servis vlastní, nativní pro Systemd. Naštěstí je v tomto Systemd velice přívětivý. Nyní vytvoříme jako root soubor servisu /etc/systemd/system/ccpd.service s obsahem:

[Unit]
Description=Canon printer daemon
After=network.target
Requires=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/ccpd

[Install]
WantedBy=multi-user.target

Původní spouštěcí skript /etc/init.d/ccpd nyní smažte.

# rm /etc/init.d/ccpd

Nyní již servis existuje a měl by se hlásit jako neaktivní

# systemctl status ccpd
ccpd.service - Canon printer daemon
 Loaded: loaded (/etc/systemd/system/ccpd.service; disabled)
 Active: inactive (dead)

Inactive znamená, že neběží a disabled znamená, že není možné ho nyní spustit automaticky. Teď servis nastavíme na automatické spuštění po startu.

# systemctl enable ccpd
ln -s '/etc/systemd/system/ccpd.service' '/etc/systemd/system/multi-user.target.
wants/ccpd.service'

Vidíte, že povolením spuštění po startu se službě vytvoří příslušný link do multi-user targetu, podle sekce [install] v nastavení služby ccpd. Nyní můžete zkusit restartovat PC a nebo spustit službu ručně. Ruční spuštění provedeme takto

# systemctl start ccpd

Podíváme se zda se servis nastartoval

# systemctl status ccpd
ccpd.service - Canon printer daemon
   Loaded: loaded (/etc/systemd/system/ccpd.service; enabled)
   Active: active (running) since Pá 2013-10-18 17:27:24 CEST; 35s ago
  Process: 5773 ExecStart=/usr/sbin/ccpd (code=exited, status=0/SUCCESS)
 Main PID: 5774 (ccpd)
   CGroup: name=systemd:/system/ccpd.service
           ├─5774 /usr/sbin/ccpd
           ├─5779 /usr/sbin/ccpd
           └─5780 captmoncnabb --data-write-fd=3 --data-read-fd=12 
                  --cmd-write-fd=13 --cmd-read-fd=16 --output-fd=-1 
                  --input-fd=-1 --printer-uri=net:192.168.1.6
říj 18 17:27:24 cname systemd[1]: Starting Canon printer daemon...
říj 18 17:27:24 cname systemd[1]: Started Canon printer daemon.

Zde jsou vidět všechny důležité informace. Služba běží (active running), je nastavená na autostart (enabled) a běží dva procesy /usr/sbin/ccpd. To je velmi důležité. Pokud běží jen jeden tiskárna netiskne. Občas se to v Gentoo stávalo a stačilo servis pro opravu restartovat. Je velmi pohodlné, že jsou ve výpisu vidět i procesy. V systevinit bylo potřeba kontrolovat servis, pak procesy a případně ještě log při detekcích závad. Nyní je v Systemd vše zobrazené pěkně na jednom místě.

Detekce chyb *

Samozřejmě se instalace nemusí vyhnout problémům, zvláště při vlastních experimentech konfigurace služby, nebo když služba nestartuje jak má. Pro případné odladění používejte kromě již uvedeného systemctl tatus tyto nástroje:

Po změně obsah souboru servisu natáhněte znovu démony:

# systemctl --system daemon-reload

Pak teprve restartujte servis.

# systemctl restart ccpd

Při změně obsahu sekce [install] proveďte ještě znovu disable a pak enable služby, aby se aktualizoval link do příslušného targetu:

# systemctl disable ccpd
# systemctl enable ccpd

Pokud služba nenabíhá po restartu, podívejte se do případně žurnálu.

# journalctl -b /usr/bin/systemd

Luděk