Quiero usar un scanner Cannon Lide 300 que dice ser soportado por sane pero no es visto, prefiero no instalar nada o lo menos posible del fabricante.
No es tanto para evitar un troyanito, con mi conocimiento y el análisis que estoy haciendo, probablemente pasaría por debajo del radar, es sólo puro orgullo, hacer andar algo bajo mis reglas.
Voy a mostrar sin explicar mucho como se usa un poco de sane, lsusb, dpkg, file, ldd, apt, strace para comprender el proceso de instalación.
El objetivo, fallido, es no usar el programa de Cannon.
Lo primero que hice fue:
sane-find-scanner
could not open USB device 0x1d6b/0x0001 at 004:001: Access denied (insufficient permissions)
could not open USB device 0x046d/0xc534 at 003:002: Access denied (insufficient permissions)
could not open USB device 0x1d6b/0x0001 at 003:001: Access denied (insufficient permissions)
# No USB scanners found. If you expected something different, make sure that...
Es razonable, veamos con sudo
sudo sane-find-scanner
found USB scanner (vendor=0x04a9 [Canon], product=0x1913 [LiDE 300]) at libusb:001:004
# Your USB scanner was (probably) detected. It may or may not be supported by
# SANE. Try scanimage -L and read the backend's manpage.
Hagámosle caso:
sudo scanimage -L
tras un ratito...
No scanners were identified.
Ya estoy seguro de dos cosas, quizás sane si, pero linux no sabe que hacer con el scanner o cómo hacerselo llegar, eso es udev.
Y además puede ser que haga falta un driver.
Sigamos dando vueltas por ahí, a ver que pasa en /dev
find /dev > antes.txt
conectar
find /dev > despues.txt
comparar
diff antes.txt despues.txt
12a13
> /dev/vboxusb/001/004
120a122
> /dev/char/189:3
384a387
> /dev/bus/usb/001/004
Ok, vemos que probablemente virtualbox está disponibilizándolo para una virtual
lsusb
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 04a9:1913 Canon, Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
un poco más de detalle:
lsusb -v -s 001:004
trae información y por stderr dice
Couldn't open device, some information will be missing
ya habíamos tropezado con esa piedra:
sudo lsusb -v -s 001:004
Entre otra cosas dice:
iManufacturer 1 Canon
iProduct 2 LiDE 300
iSerial 3 46D4C3
Sólo faltaría conseguir los drivers y apuesto que tiene que haber unas reglas de udev
Tras bajar el instalador y descomprimir el instalador, con
dpkg -x scangearmp2-3.70-1-deb/packages/scangearmp2_3.70-1_amd64.deb .
podemos ver el interior y confirmar las sospechas:
./usr
./usr/lib
./usr/lib/libcncpnet2.so.1.2.4
./usr/lib/bjlib
./usr/lib/bjlib/canon_mfp2_net.ini
./usr/lib/bjlib/canon_mfp2.conf
./usr/lib/libcncpnet30.so.1.0.0
./usr/lib/libcncpnet20.so.1.0.0
./usr/lib/libcncpmslld2.so.3.0.0
./usr/bin
./usr/bin/scangearmp2
./usr/share
./usr/share/scangearmp2
./usr/share/scangearmp2/scangearmp2.glade
./usr/share/doc
./usr/share/doc/scangearmp2
./usr/share/doc/scangearmp2/LICENSE-scangearmp-3.70SC.txt
./usr/share/doc/scangearmp2/LICENSE-scangearmp-3.70EN.txt
./usr/share/doc/scangearmp2/changelog.Debian.gz
./usr/share/doc/scangearmp2/LICENSE-scangearmp-3.70FR.txt
./usr/share/doc/scangearmp2/LICENSE-scangearmp-3.70JP.txt
./usr/share/doc/scangearmp2/copyright
./usr/share/locale
./usr/share/locale/zh
./usr/share/locale/zh/LC_MESSAGES
./usr/share/locale/zh/LC_MESSAGES/scangearmp2.mo
./usr/share/locale/ja
./usr/share/locale/ja/LC_MESSAGES
./usr/share/locale/ja/LC_MESSAGES/scangearmp2.mo
./usr/share/locale/fr
./usr/share/locale/fr/LC_MESSAGES
./usr/share/locale/fr/LC_MESSAGES/scangearmp2.mo
./usr/share/locale/de
./usr/share/locale/de/LC_MESSAGES
./usr/share/locale/de/LC_MESSAGES/scangearmp2.mo
./etc
./etc/udev
./etc/udev/rules.d
./etc/udev/rules.d/80-canon_mfp2.rules
Tenemos varias coas interesantes:
en /usr/share/doc archivos de documentacion
en /usr/share/locale las traducciones disponible
en /usr/share/scangearmp2 pueden haber problemas, ese .glade si mal no recuerdo es la configuración de la interfaz gráfica de la aplicación, esto podría generar instalación de dependencias, veamos...
file /usr/bin/scangearmp2
scangearmp2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.15, BuildID[sha1]=028fbac2701f687da994b21fb506a92aedb587c3, stripped
ese dinamically linked amerita un ldd:
ldd scangearmp2
linux-vdso.so.1 => (0x00007ffdb31b3000)
libgtk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 (0x00007f3071b38000)
libgdk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0 (0x00007f3071883000)
libatk-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libatk-1.0.so.0 (0x00007f307165e000)
libgio-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f30712d6000)
libpangoft2-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f30710c0000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f3070e9e000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3070b95000)
libpangocairo-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f3070988000)
libcairo.so.2 => /usr/lib/x86_64-linux-gnu/libcairo.so.2 (0x00007f3070674000)
libpango-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f3070428000)
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f307017e000)
libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f306ff3b000)
libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f306fce8000)
libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f306fae6000)
libgmodule-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f306f8e2000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f306f6da000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f306f3c9000)
libusb-1.0.so.0 => /lib/x86_64-linux-gnu/libusb-1.0.so.0 (0x00007f306f1b1000)
libcncpmslld2.so => not found
libcncpnet2.so => not found
libcncpnet20.so => not found
libcncpnet30.so => not found
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f306ef94000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f306ebca000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f306e890000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f306e68a000)
libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f306e480000)
libXinerama.so.1 => /usr/lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f306e27d000)
libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f306e06d000)
libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f306de62000)
libXcursor.so.1 => /usr/lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f306dc58000)
libXcomposite.so.1 => /usr/lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f306da55000)
libXdamage.so.1 => /usr/lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f306d852000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f306d640000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f306d426000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f306d204000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f306cfe9000)
libharfbuzz.so.0 => /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f306cd8b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3072183000)
libpixman-1.so.0 => /usr/lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007f306cae3000)
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f306c8be000)
libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f306c6ba000)
libxcb-render.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f306c4b0000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f306c28e000)
libthai.so.0 => /usr/lib/x86_64-linux-gnu/libthai.so.0 (0x00007f306c085000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f306be5c000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f306bc54000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f306ba50000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f306b7e0000)
libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f3072349000)
libgraphite2.so.3 => /usr/lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f306b5ba000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f306b3b6000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f306b1b0000)
libdatrie.so.1 => /usr/lib/x86_64-linux-gnu/libdatrie.so.1 (0x00007f306afa8000)
estamos bien, sólo faltan:
libcncpmslld2.so => not found
libcncpnet2.so => not found
libcncpnet20.so => not found
libcncpnet30.so => not found
Preguntémosle al sistema instalador a ver que dice:
dpkg -I scangearmp2_3.70-1_amd64.deb
Package: scangearmp2
Version: 3.70-1
Architecture: amd64
Maintainer: Canon Inc. <sup-debian@list.canon.co.jp>
Installed-Size: 668
Depends: libatk1.0-0 (>= 1.29.3), libc6 (>= 2.7), libcairo2 (>= 1.2.4), libfontconfig1 (>= 2.8.0), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:4.1.1), libglib2.0-0 (>= 2.16.0), libgtk2.0-0 (>= 2.12.0), libpango1.0-0 (>= 1.14.0) | libpango-1.0-0, libstdc++6 (>= 4.1.1), libusb-1.0-0 (>= 2:1.0.6)
Section: graphics
Priority: optional
Description: ScanGear MP for Linux.
This ScanGear MP provides scanning functions for Canon Multifunction Inkjet Printer.
mmh, necesito saber que me va a pedir, si le pido instalar y no tiene dependencias sigue de largo sin preguntar, necesito algo tipo:
apt install --simulate scangearmp2-3.70-1-deb/packages/scangearmp2_3.70-1_amd64.deb
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'scangearmp2' instead of 'scangearmp2-3.70-1-deb/packages/scangearmp2_3.70-1_amd64.deb'
The following NEW packages will be installed:
scangearmp2
0 upgraded, 1 newly installed, 0 to remove and 274 not upgraded.
Inst scangearmp2 (3.70-1 local-deb [amd64])
Conf scangearmp2 (3.70-1 local-deb [amd64])
Esto sugiere que los libcncp* quizás sean lo que provée el mismo instalador y si miramos lo que ya hicimos, se confirma:
./usr/lib/libcncpnet30.so.1.0.0
./usr/lib/libcncpnet20.so.1.0.0
./usr/lib/libcncpmslld2.so.3.0.0
que era una de las cosas interesantes, sólo nos queda una por ver, lo de udev, son como 70
ATTR{idVendor}=="04a9", ATTR{idProduct}=="1828", MODE="666"
ATTR{idVendor}=="04a9", ATTR{idProduct}=="183e", MODE="666"
ATTR{idVendor}=="04a9", ATTR{idProduct}=="1844", MODE="666"
ATTR{idVendor}=="04a9", ATTR{idProduct}=="1845", MODE="666"
y si no me equivoco lo único que hace es poner los permisos para no tener que ser sudo/root
Necesitaría ver si hay algún script en el .deb
dpkg -e scangearmp2-3.70-1-deb/packages/scangearmp2_3.70-1_amd64.deb
genera una carpeta DEBIAN
conffiles control md5sums postinst postrm
en control está lo mismo que dijo con -I
en conffiles la ruta de udev
en postinst
#!/bin/sh
if [ -x /sbin/ldconfig ]; then
/sbin/ldconfig
fi
#reload udev rules
if [ -x /sbin/udevadm ]; then
/sbin/udevadm control --reload-rules 2> /dev/null
/sbin/udevadm trigger --action=add --subsystem-match=usb 2> /dev/null
fi
Excelente, lo que le está diciendo al sistema es que tome los nuevos .so y avisarle a udev de las nuevas reglas
Ha llegado el momento de actuar, poner las reglas y avisar:
sudo chown root.root ./etc/udev/rules.d/80-canon_mfp2.rules
sudo cp ./etc/udev/rules.d/80-canon_mfp2.rules /etc/udev/rules.d
sudo /sbin/udevadm control --reload-rules
sudo /sbin/udevadm trigger --action=add --subsystem-match=usb
Mirá mamá! sin sudo!
lsusb -v -s 001:004
Bus 001 Device 004: ID 04a9:1913 Canon, Inc.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x04a9 Canon, Inc.
idProduct 0x1913
bcdDevice 1.00
iManufacturer 1 Canon
iProduct 2 LiDE 300
iSerial 3 XXXXXX
bNumConfigurations 1
Configuration Descriptor:
Tenía la infundada esperanza de que de algún modo mágico sane ya lo viera con scanimage. Sería magia, pues con sudo ya debería haber funcionado, esto fueron sólo los permisos, quizás sea hora de leer la documentación de sane
Primero vamos a
http://www.sane-project.org/lists/sane-mfgs-cvs.html
control f, lide 300
que nos dice el backend que entiende este dispositivo:
http://www.sane-project.org/man/sane-pixma.5.html
¿Cómo hacerlo andar? Hace mucho tiempo hice andar un microteck II o III SP (SP significa Simple Pass, de cuando los scanner tenian que pasar tres veces, una vez por cada color) y me ahora me suena lo del backend, pero scanimage sólo entiende --device
scanimage --device /dev/bus/usb/001/004 -L
scanimage --device /dev/char/189:3 -L
Volviendo a la man page, dice como registrar los nombres, entiendo que
[/etc/sane.d/pixma.conf]
pixma:04A91913_46D4C3
pero nada, preguntémosle a strace a ver que archivos está leyenco scanimage
strace -eopen scanimage -L
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/x86_64-linux-gnu/libsane.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("./dll.d", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
open("./dll.d/hplip", O_RDONLY) = 4
open("./dll.conf", O_RDONLY) = 3
open("./dll.aliases", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/sane.d/dll.aliases", O_RDONLY) = -1 ENOENT (No such file or directory)
y despues un montón de /dev, precedidos de...
open("./sharp.conf", O_RDONLY) = 27
está leyendo cada .conf de /etc/sane.d, incluyendo el amigo pixma.conf
y para cada backend:
open("/dev/bus/usb/001/004", O_RDWR) = 96
Le pido ahora que sólo me cuente de la ruta de interés
strace -P /dev/bus/usb/001/004 scanimage -L
open("/dev/bus/usb/001/004", O_RDWR) = 9
ioctl(9, USBDEVFS_GET_CAPABILITIES, 0x558209e4f2c0) = 0
close(9) = 0
open("/dev/bus/usb/001/004", O_RDWR) = 12
ioctl(12, USBDEVFS_GET_CAPABILITIES, 0x558209e4d330) = 0
close(12) = 0
open("/dev/bus/usb/001/004", O_RDWR) = 15
ioctl(15, USBDEVFS_GET_CAPABILITIES, 0x558209e618f0) = 0
close(15) = 0
Para que no sea tanta info, comenté todos los backends en /etc/sane.d/dll.conf salvo pixma
Nada, ha llegado el momento de rendirme e instalar el software a ver si realmente anda...
dpkg -i scangearmp2-3.70-1-deb/packages/scangearmp2_3.70-1_amd64.deb
...como piña. Funciona excelente.
Si quisiera seguir, tendría que capturar el tráfico usb para ver qué está ocurriendo...
Puede ser que la máquina donde estoy instalando tenga una distro vieja. Uno de estos días, cuando haga la actualacion y tenga que reinstalar esto, veré si hay novedades.
Actualización 2021-10-18: con Linux Mint 20.2 que tiene simple-scan 3.36.3, no vale la pena usar el software de cannon pues es mejor. Pero me dí cuenta tras instalar scangear, no sé si simple-scan usa algo de lo instalado, no importa, no está de más tener los dos.