SDB:Configuring Scanners

跳转到:导航搜索

问题

您想配置您的扫描仪。

流程

要设置扫描仪,请运行YaST扫描仪模块。YaST扫描仪模块可以在YaST控制中心中的硬件 -> 扫描仪下找到。有关更多信息,您可以查看YaST/Modules/Scanner,网址为 http://old-en.opensuse.org/YaST/Modules/Scanner

许多USB扫描仪在插入USB时都会完全自动设置,因此无需运行YaST扫描仪模块。

完全自动的USB扫描仪设置通过udev规则文件/etc/udev/rules.d/56-sane-backends-autoconfig.rules发生,该文件包含在openSUSE软件包“sane-backends-autoconfig”中。有关详细信息,请参阅软件包说明(例如,通过“rpm -qi sane-backends-autoconfig”)。如果您不喜欢自动扫描仪驱动程序激活,请不要安装此软件包或在已安装时将其删除。

以下段落提供了有关技术背景和手动配置的更多信息。

为了限制本文的复杂性,仅关注USB扫描仪。

不专门适用于USB的信息也适用于SCSI和并行端口扫描仪。有关SCSI扫描仪,请参阅“man sane-scsi”。对于并行端口扫描仪,请参阅相应后端的man页面(参见下文的“SANE后端”)以及手册中有关并行端口设置的信息。

基础

“SANE项目” http://www.sane-project.org提供了操作扫描仪的中央软件。

SANE项目软件开发在 https://gitlab.com/sane-project 进行

SANE项目软件由“SANE-backends”和“SANE-frontends”组成。在openSUSE中,您可以在“sane-backends”软件包中找到“SANE-backends”软件。

SANE后端构成各种扫描仪类型的实际硬件驱动程序;请参阅 http://www.sane-project.org/sane-backends.html

通常,“驱动程序”是指特定设备型号的软件和数据。

如果各种型号可以通过相同的方式寻址,则后端可以支持各种型号。这些型号在一定程度上彼此兼容,因为它们理解相同的“语言”。根据后端,这种语言的种类不同

  • 当后端必须直接将特定值写入控制扫描机内部实际扫描单元的芯片组时,这是一种原始的语言。实际值因型号而异。错误的值可能会导致扫描质量差,甚至可能损坏扫描仪。示例:受“plustek”后端支持的型号。
  • 构建良好的扫描仪内置了真正的“扫描仪语言”。驱动此类扫描仪更容易更安全。示例:受“epson2”后端支持的型号。

SANE代表“Scanner Access Now Easy”(现在易于访问扫描仪)。通过“libsane”库,SANE提供统一的API(应用程序编程接口),使应用程序可以统一访问各种扫描仪型号。

使用SANE后端访问扫描仪的应用程序称为SANE前端或简称前端。

除了包含在“SANE-backends”软件中的SANE命令行前端“scanimage”之外,统一的接口还允许使用其他前端,例如图形前端XSane(参见 http://www.xsane.org/),该前端由openSUSE在软件包“xsane”中提供。

后端不直接访问扫描仪硬件,而是使用内核以及各种子系统进行数据传输到扫描仪硬件。例如,访问USB扫描仪涉及以下子系统,除了纯内核

  • libusb(访问USB设备的库)
  • udev(设置用户访问权限以访问USB设备)
  • 访问USB设备的内核模块

无论细节如何,通常必须完全正常运行的各种层堆栈才能使用户能够从应用程序访问USB扫描仪

User
  |
Application (scanner user frontend)
  |
SANE backend (scanner driver)
  |
libusb (generic USB device access functions)
  |
USB kernel modules (plus udev triggered by USB scanner plug-in)
  |
USB hardware in the machine
  |
USB cable connection (additional USB hubs if necessary)
  |
Scanner

只有“SANE后端(扫描仪驱动程序)”和“应用程序(扫描仪用户前端)”这两部分才能被称为“实际的扫描软件”。

所有较低层的可操作性是较高层可操作性的先决条件。因此,从下到上讨论各个层或子系统。

扫描仪

首先,openSUSE必须支持扫描仪。

openSUSE支持的扫描仪信息

运行YaST扫描仪模块并检查其中的型号列表。您无需连接扫描仪即可执行此操作。单击“添加”并假装设置一个假想的扫描仪。选择型号和驱动程序,然后单击“下一步”,以便YaST扫描仪模块可以向您显示有关特定已知问题和问题的其他消息。最后,为该型号激活所选驱动程序。如果未连接扫描仪,则发生的情况是驱动程序尝试自动检测扫描仪,这当然会在此情况下失败。

或者,要确定您的安装的SANE版本中是否为您的扫描仪提供SANE后端,请检查以下文件

/usr/share/doc/packages/sane-backends/sane-mfgs.html

无法保证其中信息的准确性,因为Linux支持信息通常基于用户声明。例如,供应商可能会对各种设备变体使用相同的型号名称,其中一些变体可能不受支持(例如,请参阅有关“Artec/Ultima 2000”的信息)。

此外,您可以检查 http://www.sane-project.org/sane-mfgs.html,以查看您的扫描仪是否提供SANE后端。该站点上的信息代表SANE软件的最新状态。无法保证其中信息的准确性,因为Linux支持信息通常基于用户声明。可能您的openSUSE版本中包含的SANE版本尚未支持您的扫描仪。

以下列表显示了您的安装的SANE版本支持(或不支持)哪些扫描仪型号,以及通过哪个后端支持

/usr/share/doc/packages/sane-backends/sane-backends.html

上述HTML文件是从每个后端的描述文件创建的:/usr/share/sane/descriptions/"backend".desc。

条目的格式如下

:mfg "Vendor A"

:model "Model 1"
:interface "USB"
:status :complete

:model "Model 2"
:interface "SCSI"
:status :good

:mfg "Vendor B"

:model "Model X"
:interface "Parport"
:status :minimal

:model "Model Y"
:interface "IEEE-1394"
:status :untested

:model "Model Z"
:interface "Proprietary"
:status :unsupported

Linux支持的扫描仪信息(不一定由openSUSE支持)

相当数量的扫描仪仅通过所谓的“外部后端”支持;请参阅文件/usr/share/doc/packages/sane/sane-backends/sane-mfgs-external.html和/usr/share/doc/packages/sane/sane-backends/sane-backends-external.html,以及有关最新信息的 http://www.sane-project.org/lists/sane-backends-external.html,此外请参阅下文的“第三方扫描仪驱动程序”部分。

外部后端不是SANE项目的“SANE-backends”软件的一部分。因此,外部后端不包含在“sane-backends”软件包中。

对于每个已知的外部后端,描述文件/usr/share/sane/descriptions-external/"backend".desc显示了支持或不支持的扫描仪型号。

如果某些扫描仪在通电时没有上传到扫描仪的合适的固件(控制设备硬件的扫描仪内部软件),则它们将无法工作。对于这种奇怪的型号,您需要获取合适的固件(询问扫描仪的供应商)并配置后端以进行固件上传(参见下文的“SANE后端”部分)。由于固件由设备供应商许可,除非供应商使固件可用于分发和重新分发,否则我们不能将固件与openSUSE一起分发。对于正常的扫描仪,固件永久存储在设备中,因此正常扫描仪在通电后即可使用。

如果未为扫描仪提供SANE后端,或者当扫描仪在SANE中列为“不受支持”(请参阅 http://www.sane-project.org/sane-backends.html#S-UNSUPPORTED 和文件/usr/share/sane/descriptions/unsupported.desc),则无法使用常见的frontend(scanimage,xsane)使用该设备。可能还有其他软件,例如,直接来自供应商 - 询问供应商,并阅读有关“第三方扫描仪驱动程序”的部分。

“sane-backends”扫描仪驱动程序的RPM软件包

各种openSUSE版本(例如openSUSE Leap,openSUSE Tumbleweed)通常提供SANE项目在特定openSUSE版本开发和准备时(而不是稍后发布特定openSUSE版本时)正式发布的最新“sane-backends”版本。

SANE项目正式发布的最新“sane-backends”版本通常在openSUSE Build Service开发项目“graphics”中可用(通常在SANE项目发布后不久)。

通常,我们不会在用于开发openSUSE“sane-backends”RPM软件包的“graphics”项目中提供不稳定的“sane-backends”开发版本(例如Git快照),但扫描仪驱动程序的开发发生在SANE项目上游。

如果您的特定扫描仪型号在SANE上游列出,需要比您的特定openSUSE版本提供的更新的“sane-backends”版本,并且该更新的“sane-backends”版本在SANE上游正式发布,那么请查看openSUSE Build Service开发项目“graphics”中是否有适用于您的特定openSUSE版本的“sane-backends”版本。

要从“graphics”项目获取“sane-backends”RPM软件包,请访问 https://software.opensuse.net.cn 并搜索“sane-backends”。单击列出的结果“sane-backends”,然后单击“显示其他版本”。然后选择您的确切openSUSE版本(例如openSUSE Leap 15.1,openSUSE Leap 15.2,openSUSE Tumbleweed),然后“显示不稳定软件包”,最后选择“graphics”项目中的软件包。使用与您的系统匹配的软件包。较旧系统的软件包可能适用于较新的系统。例如,openSUSE Leap 15.1的软件包可能适用于openSUSE Leap 15.2,但切勿在较旧的系统中使用较新系统的软件包,例如,除非您真的想破坏您的系统,否则不要在您的系统不是“openSUSE Tumbleweed”时使用“openSUSE Tumbleweed”的软件包。

“graphics”存储库是openSUSE“sane-backends”RPM软件包的官方openSUSE开发存储库,这意味着

“graphics”开发项目可能包含新的软件或现有软件的正在进行中的更改,这些更改可能既不稳定也不适合当前安装的系统。如果您考虑将“graphics”项目中的软件包安装到您当前运行的系统中,请记住这一点。

“graphics”项目中的软件包没有保证或担保,也没有任何支持。作为极端示例,这意味着如果由于这些软件包导致您的整个计算机中心崩溃,那将只是您的问题。

另一方面,这并不意味着这些软件包已知存在严重问题,但它们没有经过彻底测试,因此可能会发生任何意外问题。

最终,“sane-backends”软件只是一个应用程序(扫描仪驱动程序不是内核驱动程序),这意味着当你从“graphics”项目升级到更新版本的“sane-backends”时,你的系统不应该“爆炸”(前提是你为你的特定系统使用匹配的软件包)。

如果新版本不起作用,通常降级(并根据需要重新配置)以使其再次工作会有所帮助。

警告:损坏的扫描仪驱动程序软件甚至可能损坏你的扫描仪硬件。特别是当扫描仪发出不好的声音时,这意味着扫描仪硬件可能会损坏。

一般来说,我们(即 openSUSE)从 SANE 项目分发“sane-backends”扫描仪驱动程序,但我们不开发扫描仪驱动程序。

通常,我们没有那么多各种类型的扫描仪和各种类型的扫描仪驱动程序,因此通常我们无法在特定的扫描仪驱动程序无法工作时做任何事情。特别是,我们通常无法重现扫描仪驱动程序的问题。

当某个扫描仪驱动程序在 SANE 项目中列出应该适用于你的特定扫描仪型号,但它对你来说在使用 SANE 项目官方发布的最新“sane-backends”版本时却无法工作,那么建议直接向 SANE 项目的驱动程序作者报告问题,网址为 http://www.sane-project.orghttps://gitlab.com/sane-project/backends,以便你和上游作者之间进行直接沟通。

也就是说,在向 SANE 项目的驱动程序作者报告问题之前,你可能需要将“sane-backends”RPM 包升级到 openSUSE “graphics”项目中的版本,并验证该问题是否也发生在最新的“sane-backends”版本中。

报告问题的最佳方式是 sane-devel 邮件列表,以便上游作者和感兴趣的用户可以注意到它,请参阅 http://www.sane-project.org/mailing-lists.html,或者更直接地通过 https://gitlab.com/sane-project/backends/-/issues 报告为“新问题”。

扫描仪驱动程序包的版本升级

对于扫描仪驱动程序,版本升级只有对那些尚未用我们提供的 openSUSE 发布版或 SUSE Linux Enterprise 产品版本支持的扫描仪的用户才有意义。

由于“sane-backends”包和“hplip”包都支持非常多的不同扫描仪型号,因此由我们(即 openSUSE)以合理的方式对其进行测试是不可能的,这意味着:基本上,扫描仪驱动程序根本没有针对所有支持的不同扫描仪型号进行测试。

因此,扫描仪驱动程序包的版本升级作为常规维护更新,所有用户或多或少都会自动获得是不可能的,因为对于这个或那个扫描仪型号的回归情况是提前未知的。

或者换句话说:当特定版本的扫描仪驱动程序对特定用户和特定扫描仪型号有效时,没有理由通过常规维护更新强制该用户升级版本。

另一方面,当特定版本的扫描仪驱动程序对特定用户和特定扫描仪型号无效时,该用户没有理由不升级版本并尝试较新版本是否适用于他的特定型号(前提是较新版本声称支持该型号)。

因此,我们尝试在 openSUSE “graphics”项目中提供最新的“sane-backends”版本,并在 Printing 项目中提供最新的“hplip”版本。

一般来说,我们(即 openSUSE)从上游项目分发扫描仪驱动程序包,但不开发扫描仪驱动程序,因此通常我们无法在特定的扫描仪驱动程序无法工作时做任何事情。特别是,我们通常无法重现扫描仪驱动程序的问题。如果出现扫描仪驱动程序问题,请参阅下面的“故障排除(调试)”部分,了解基本的测试和基本操作,以诊断问题的原因。

USB

USB 速度

如今,基本上有三种不同类型的 USB 连接器

  • USB 1.0 和 USB 1.1,具有所谓的“低速”和“全速”(USB 内核驱动程序 uhci_hcd 或 ohci_hcd)
  • USB 2.0,具有所谓的“高速”(USB 内核驱动程序 ehci_hcd)
  • USB 3.0 和 USB 3.1,具有所谓的“超高速”和“超高速+”(USB 内核驱动程序 xhci_hcd)

理论上,使用 USB 1.x 接口的旧扫描仪也应该可以在计算机上的 USB 2.0 端口上工作,甚至可以在 USB 3.x 端口上工作,因为计算机上速度更高的 USB 端口应该与速度更低的 USB 设备兼容。

但在实践中,特别是使用 USB 1.x 接口的旧扫描仪可能根本无法在计算机上的 USB 3.x 端口上工作,或者无法可靠地工作。

当旧的 USB 扫描仪被列为受支持但无法工作或无法可靠工作时,建议将其连接到计算机上具有匹配 USB 速度的 USB 端口,或者至少不要连接到 USB 3.x 端口。

当使用 USB 3 内核驱动程序 xhci_hcd 时,可能会出现奇怪的问题

目前,有时在使用“xhci_hcd”作为内核驱动程序的 USB 端口上可能会出现问题。

当“lsusb -t”显示 USB 总线和端口上连接的 USB 扫描仪的“Driver=xhci_hcd”时(请参阅扫描仪连接到的“lsusb”),根据计算机硬件和固件、内核版本以及 sane-backends 版本,可能会出现问题:例如“I/O 错误”或任意无法解释的故障,尤其是在彩色模式和/或更高分辨率下扫描时(即,当有大量扫描数据时,这种情况更容易发生)。

如果连接到使用内核驱动程序 xhci_hcd 的 USB 端口的 USB 扫描仪出现问题,请尽可能将其连接到传统的真实 USB 2 端口。

USB 连接器的颜色或计算机上标记的名称并不可靠,这关系到 USB 端口使用的内核驱动程序。只有“lsusb -t”的输出显示使用的内核驱动程序。使用的 USB 内核驱动程序取决于计算机中的 USB 硬件。不可能将 USB 3 硬件用作 USB 2 硬件。不可能在没有 xhci_hcd 内核驱动程序的情况下使用 USB 3 硬件。如今的计算机通常只有 USB 3 硬件,因此阻止 xhci_hcd 内核模块将导致整个 USB 停止工作,这对于通过 USB 3 硬件连接键盘和鼠标来说尤其糟糕。只有少数特定的 USB 3 兼容芯片组才提供真正的 USB 3 硬件和真正的 USB 2 硬件。需要计算机中的真正的 USB 2 硬件才能在没有 xhci_hcd 内核驱动程序的情况下使用扫描仪。

如果只有使用内核驱动程序 xhci_hcd 的 USB 端口,并且 USB 扫描仪出现问题(特别是“I/O 错误”或任意无法解释的故障),请参阅最新 sane-backends 版本中的 sane-usb 关于 SANE_USB_WORKAROUND 的说明。

USB 数据线连接和额外的 USB 集线器

USB 数据线最长长度

  • 低速电缆:不超过 3 米。
  • 全速和高速电缆:不超过 5 米。
  • 超高速电缆:最大实际长度为 3 米。

请参阅 Wikipedia 上关于 USB 布线的页面

如果插入了 USB 集线器,最大长度可能会更短,具体取决于电缆和集线器的属性。

一些扫描仪没有内置电源,而是通过 USB 供电。如果你的 USB 系统没有提供足够的电力,这种扫描仪将无法工作。在这种情况下,尝试使用带有独立电源的 USB 集线器。

USB 内核模块 + udev

这里的细节会随着版本的变化而变化。关于扫描仪设置的文章无法描述各个较低级别的所有细节。如果这些区域出现问题,请参阅相应的具体文档。

USB 扫描仪必须由以下命令显示

lsusb

(以 root 和普通用户身份运行它),或者,如果上述命令不可用

/sbin/lsusb

如果它没有显示扫描仪型号,则机器和扫描仪之间的数据传输无法工作,因为内核可能无法识别 USB 设备,或者并非所有必需的 USB 内核模块都已加载。

为了在出现问题时测试系统,请将扫描仪直接连接到机器作为唯一的 USB 设备(除了 USB 键盘或 USB 鼠标,如果有的话)。然后,在保持扫描仪开启状态的同时重新启动系统。通常,热插拔/udev 确保自动加载所需的 USB 内核模块。重新启动后立即使用

dmesg | grep -i usb

并查找任何错误消息,例如“error”或“fail”。

检查是否已加载特定机器的 USB 硬件所需的 USB 内核模块。检查你的机器的 USB 硬件(即 USB 芯片组)是否受支持。命令“lspci | grep -i usb”(你可能需要以 root 身份运行它)列出了 USB 控制器;请参阅 http://www.linux-usb.org/

通过 udev 进行 USB 扫描仪访问权限

这里的细节会随着版本的变化而变化。关于扫描仪设置的文章无法描述各个较低级别的所有细节。如果这些区域出现问题,请参阅相应的具体文档。

后端通过 libusb 访问 USB 扫描仪。这发生在/proc/bus/usb/xxx/yyy或者通过/sys/bus/usb/devices/或者通过/dev/bus/usb/xxx/yyy(实际位置会随着内核/udev/libusb/任何版本的变化而变化)其中 xxx(总线 ID)和 yyy(设备 ID)不是固定值。

自内核 2.6 以来,没有为通过 libusb 进行访问而使用静态设备文件(如内核 2.4 中使用的 /dev/usbscanner)。相反,/proc/bus/usb//dev/bus/usb/(或当前版本实际所在的位置)的条目会在每次系统启动和/或扫描仪从 USB 拔出并重新插入时重新生成(甚至在 USB 扫描仪关闭和打开时)。因此,无法使用传统的“chmod”命令永久设置访问权限。

解决这些问题的最佳方法是使用“saned”,它是一种通过网络扫描的服务(有关详细信息,请参阅下面的“通过网络扫描”部分)。在服务器上,saned 通常通过 xinetd 或现在通过 systemd 设置和启动。在客户端,使用“net”元后端通过网络进行扫描。请参阅“man saned”和“man sane-net”。通过使用环回网络,即使在本地主机上也可以使用它。在这种情况下,服务器和客户端是同一台机器“localhost”。要通过 saned 在本地主机上访问扫描仪,你可以设置以下内容

  1. 让 saned 以 root 身份运行(对于 xinetd,默认在 /etc/xinetd.d/sane-port 中)
  2. 允许在 /etc/sane.d/saned.conf 中从“localhost”访问
  3. 在 /etc/sane.d/net.conf 中指定服务器“localhost”
  4. 在 /etc/sane.d/dll.conf 中激活“net”元后端

在 YaST 扫描仪配置中,你可以通过“其他”和“通过网络扫描”设置这样的“本地主机配置”。通常,这是扫描仪访问问题最简单的解决方法。一个小缺点是,对于 root 用户,扫描前端会识别扫描仪两次。一次直接作为“backend:...” ,另一次通过 net 元后端作为“net:localhost:backend:...”。

你可以限制对/etc/sane.d/saned.users中特定用户的访问,并使用特定的 saned 密码。为了保密密码,请确保只有 root 具有对该文件的读取访问权限。

请注意,以 root 身份运行 saned 是一个安全问题,因为现在你有一个在你的计算机上以 root 身份运行的服务器进程,可以通过网络访问。因此,你必须对 saned 进行防火墙保护,以防止未经授权的访问,请参阅 SDB:CUPS 和 SANE 防火墙设置

或者,你可以更改 udev 访问权限设置

udev 用于通过 ACL 设置读/写权限(运行“getfacl /dev/bus/usb/<bus-number>/<device-number>”以显示它们)对于当前登录到本地的普通桌面用户(即通过图形 XDM/Kdm 登录),以便当前登录的桌面用户可以像普通用户一样使用扫描仪单元。

sane-backends 包中的 udev 规则位于 /etc/udev/rules.d/55-libsane.rules - 请参阅“man udev”了解如何创建此类条目。

对于 HP 多合一设备中的扫描仪,udev 规则中存在一个特殊问题,因为 HP 多合一设备具有 hplip 包中的其他 udev 规则,位于 /etc/udev/rules.d/55-hpmud.rules 或 /usr/lib/udev/rules.d/56-hpmud.rules,这些规则在 /etc/udev/rules.d/55-libsane.rules 中 sane-backends 包中的 udev 规则之前或之后设置,因此一个文件中的条目可能会被另一个文件中的设置覆盖。为了避免意外结果,请保持这些文件中的设置同步。

仅作为非权威信息,USB 扫描仪(和打印机)设备节点设置通过 udev 应该如何正常工作(截至 2015 年 10 月撰写本文时)

USB 扫描仪和 USB 多功能设备(打印机/扫描仪/复印机)通过 udev 获得普通用户读/写访问权限,并且对于 USB 多功能设备中的打印机单元,设备节点具有组“lp”和组读/写访问权限(也通过 udev)就足够了,因为 CUPS 后端以用户“lp”运行,该用户位于组“lp”。(CUPS 后端和 SANE 后端是不同的东西。有关 CUPS 后端,请参阅 SDB:CUPS 在一个 Nutshell 中 中的“CUPS 后端是什么以及它是如何工作的”。)

因此,USB 扫描仪和 USB 多功能设备获得“rw-rw-r-- root lp”设置为设备节点,这发生在 /etc/udev/rules.d/55-libsane.rules(来自 sane-backends RPM)中,对于 HP 多合一设备,还发生在 /usr/lib/udev/rules.d/56-hpmud.rules(来自 hplip RPM)中。

两者都设置 ENV{libsane_matched}="yes",这触发了 /usr/lib/udev/rules.d/70-uaccess.rules(来自 systemd RPM)中的 TAG+="uaccess",这触发了 /usr/lib/udev/rules.d/73-seat-late.rules(来自 systemd RPM)中的 RUN{builtin}+="uaccess",这管理设备节点用户 ACL,最终导致“rw-rw-r--+ root lp”中的“+”(即 ACL 设置)设备节点。

要显示 ACL,以 root 身份运行“getfacl /dev/bus/usb/<bus_number>/<device_number>”。

只有在普通用户直接登录到计算机(而不是远程)时,才会设置 ACL。在这种情况下,该普通用户将获得 USB 设备节点的读/写访问权限。

对于多功能 USB 设备,其多功能特性可能在其他 Linux 发行版中造成麻烦,这些发行版可能使用 SANE 上游的方式来设置扫描仪设备节点为“scanner”组,并将用户添加到该“scanner”组,这与 CUPS 后端通常需要“lp”组的读/写权限才能访问打印机单元相冲突,因此需要特殊的设置才能使打印工作正常。

在 openSUSE 中,没有“scanner”组。只有“lp”组存在,并且在 /etc/udev/rules.d/55-libsane.rules 中用作 MODE="0664", GROUP="lp"。

默认情况下,为打印机和扫描仪使用相同的“lp”组是足够安全的,并且易于使用,因为这两种设备通常需要物理用户访问(获取打印纸或将纸张放置在扫描仪上),因此这两种设备通常需要相同类型的安全性,并且对于多功能设备,只能设置一个组,然后“lp”组是更合理的默认设置。

例如,当某人以普通用户“johndoe”直接登录时,向 'root' 报告的内容是什么

# lsusb
...
Bus 002 Device 003: ID a1b2:c3e4 ACME Fancy Scanner 1000
...

# ls -l /dev/bus/usb/002/003
crw-rw-r--+ ... root lp ...

# getfacl /dev/bus/usb/002/003
getfacl: Removing leading '/' from absolute path names
- file: dev/bus/usb/002/003
- owner: root
- group: lp
user::rw-
user:johndoe:rw-
group::rw-
mask::rw-
other::r--

SANE 后端

每个后端都有自己的配置文件 /etc/sane.d/"backend".conf 和自己的 man 手册页: "man sane-backend"(将 "backend" 替换为相应后端的名称)。

其中一个后端具有特殊功能: "dll" 后端是一个元后端(参见 http://www.sane-project.org/html/doc005.html)。dll 后端允许单个前端通过其他后端访问各种扫描仪。访问过程如下

                   user
                    |
                 frontend
                    |
     ------ dll meta-backend ------
    |                              |
backend_A                      backend_B
    |                              |
   ...                            ...
    |                              |
scanner A                      scanner B

即使只有一个扫描仪,dll 元后端始终会插入。

要由 dll 元后端使用的后端必须在以下位置激活/etc/sane.d/dll.conf,dll 元后端的配置文件

# SANE Dynamic library loader config
backend_A
backend_B
# backend_C

在此示例中,后端 "backend_A" 和 "backend_B" 已激活,而 "backend_C" 已停用。

通常,只需在 /etc/sane.d/dll.conf 中激活适当的后端,就可以使 USB 扫描仪准备就绪 - 只要 USB 系统和 udev 层工作正常,并且后端可以自动检测 USB 扫描仪,并且扫描仪具有内置固件即可。

如果同时激活多个后端,后端之间可能会发生冲突。如果发生这种情况,请尝试一次只激活一个后端。这样可以检查后端是否根本无法工作,或者问题仅仅是由与其他特定后端发生冲突引起的。

可能需要在以下位置进行手动修改/etc/sane.d/"backend".conf,具体取决于扫描仪型号、连接方式(例如,通过 USB 或 SCSI)以及相应的后端。无论如何,请务必阅读 /etc/sane.d/"backend".conf 中的注释以及使用 "man sane-backend"(将 "backend" 替换为相应后端的名称)的相应后端的 man 手册页。

示例

通常,后端会自动检测其支持的 USB 扫描仪。如果未发生这种情况,则可以在 /etc/sane.d/"backend".conf 中添加如下行

usb 0xVVVV 0xMMMM

基于 "lsusb" 的输出,输入十六进制的供应商 ID 为 0xVVVV 和十六进制的模型 ID 为 0xMMMM。对于某些后端,语法 "usb 0xVVVV 0xMMMM" 可能不同或根本不可用,请参阅相应后端的 man 手册页。

对于 SCSI 扫描仪,输入如下行以获取 SCSI 设备文件/etc/sane.d/"backend".conf:

scsi /dev/sg0

警告:不正确的 SCSI 设备文件可能会导致系统无法运行!

对于并行端口扫描仪,手动输入如下行/etc/sane.d/"backend".conf:

ieee1284 parport0

(例如,在 /etc/sane.d/canon_pp.conf 中)

pio 0x378

(例如,在 /etc/sane.d/epson.conf 中)

device 0x378

parport0

(例如,在 /etc/sane.d/plustek_pp.conf 中) 警告:不正确的条目可能会导致系统无法运行!

对于某些扫描仪,必须将合适的固件上传到扫描仪中。获取合适的固件文件(向供应商咨询),并在以下位置输入固件文件名/etc/sane.d/"backend".conf。警告:不合适的固件可能会损坏扫描仪!

由于后端通常适用于多个扫描仪型号,因此默认设置必须反映所有支持型号的最小公分母。因此,您可能希望在以下位置优化特定型号的设置/etc/sane.d/"backend".conf。警告:不正确的设置可能会损坏扫描仪!

前端

为了测试目的,请使用命令行前端 "scanimage"(参见 "man scanimage")。

"scanimage -L" 应该显示您的扫描仪。如果未发生这种情况,则 SANE(更准确地说:后端)无法访问扫描仪。如果 "scanimage -L" 仅在以用户 "root" 身份执行命令时才显示扫描仪,则只有 root 才能访问扫描仪,而普通用户则不能。在这种情况下,问题在于 "通过 udev 的 USB 扫描仪访问权限" 层。USB 扫描仪的 "scanimage -L" 输出通常具有以下格式

device 'backend-name:libusb:bus-ID:device-ID' ...

对于 SCSI 扫描仪

device 'backend-name:/dev/sg[0123...]' ...

实际的 SANE 设备字符串格式(例如 libusb:bus-ID:device-ID 或 /dev/sg[0123...])取决于特定的后端。

命令 "scanimage -d Device >/tmp/image.pnm" 提示扫描仪扫描图像并将结果保存到文件 /tmp/image.pnm 中。将 "Device" 替换为 "scanimage -L" 输出中的 SANE 设备字符串。示例

scanimage -d backend:libusb:123:456 >/tmp/image.pnm

扫描过程将使用相应后端的默认设置进行。

"scanimage -d Device -h" 列出所有可用选项。第一部分列出不依赖于相应后端的常规选项。第二部分列出后端特定的选项及其可能的值或范围以及相应的默认设置(用方括号括起来)。示例(摘录)

-d, --device-name=DEVICE
        use a given scanner device
    --format=pnm|tiff|png|jpeg
        file format of output file
-v, --verbose
        more status messages
...
Options specific to device 'backend:libusb:123:456':
  Scan Mode:
    --mode Gray|Color [Color]
        Selects the scan mode.
    --resolution 75..600dpi [150]
        Sets the resolution of the scanned image.
  Geometry:
    -l 0..216mm [0]
        Top-left x position of scan area.
    -t 0..297mm [0]
        Top-left y position of scan area.
    -x 0..216mm [216]
        Width of scan-area.
    -y 0..297mm [297]
        Height of scan-area.

例如,扫描 10 x 15 厘米的黑白图像,纵向方向,300 dpi,jpeg 输出文件格式,并显示详细状态消息的命令如下

scanimage -v -d backend:libusb:123:456 --format=jpeg --mode Gray --resolution 300 -x 100 -y 150 >photo.jpg

通过网络扫描

如何通过网络连接直接访问扫描仪设备

最好具有 USB 和网络连接的扫描仪设备也应支持传统的有线网络电缆连接,而不仅仅是无线连接,因为无线连接有时会存在问题,因此当无线访问出现问题时,应该能够切换到有线网络电缆连接。理论上,使用哪种类型的网络连接并不重要。在实践中,与传统的有线网络连接相比,无线网络通常不可靠。此外,无线网络可能不安全,请参阅 SDB:CUPS_and_SANE_Firewall_settings。如果通过 USB 扫描(最好是传统的 USB2 - 参见上述关于 USB3 可能存在的问题),但不能通过无线网络扫描,请通过传统的有线网络电缆连接设备并重新进行扫描仪设置以测试是否可以通过传统的有线网络扫描。通常,通过网络扫描的前提条件是至少可以通过传统的 USB2 扫描。如果扫描仪驱动程序无法通过 USB2 工作,通常没有希望它可以通过网络工作。

当扫描仪设备具有网络连接时,需要一个具有内置网络连接扫描仪设备访问和通信支持的特殊 SANE 扫描仪驱动程序。

"saned"(如下所示)不支持通过网络访问扫描仪设备。

原因是中间没有通用的层来执行某种通用的扫描仪设备访问和/或扫描仪设备通信。对于每个扫描仪设备,扫描仪驱动程序本身都实现设备访问和通信。例如,对于 USB 扫描仪,扫描仪驱动程序本身实现与设备的实际 USB 通信。因此,对于网络扫描仪,扫描仪驱动程序本身必须实现设备访问和通信。

如何通过网络访问连接到另一主机的 USB 扫描仪

假设 USB 扫描仪连接到一个主机(“服务器”),并且您希望从另一个主机(“客户端”)访问它。

前提条件是在服务器上已经可以使用扫描。

为了授予通过网络访问权限,您可以使用 "saned",它是一种通过网络扫描的服务。在服务器上,saned 通常通过 xinetd 设置和启动,但现在使用 systemd,情况有所不同。在客户端上,用于通过网络扫描的 "net" 元后端。

  1. 在服务器上让 saned 运行(在 /etc/xinetd.d/sane-port 中设置 "disable = no" 并启动 xinetd,或者对 systemd 执行等效操作)
  2. 在服务器上,允许在 /etc/sane.d/saned.conf 中从客户端访问
  3. 在客户端上,在 /etc/sane.d/net.conf 中指定服务器
  4. 在客户端上,在 /etc/sane.d/dll.conf 中激活 "net" 元后端

在 YaST 扫描仪配置中,您可以通过 "Other" 和 "Scanning via Network" 设置此类配置。

阅读 "man saned" 时请注意安全警告

saned is not intended to be exposed to the internet
or other non-trusted networks.

运行 saned 是一个安全问题,因为现在您有一个在计算机上运行的可通过网络访问的服务器进程。因此,您必须对 saned 进行防火墙保护,以防止未经授权的访问,请参阅 SDB:CUPS_and_SANE_Firewall_settings

为了使用户能够访问连接到远程主机(服务器)的 USB 扫描仪,用户应用程序在用户的本地工作站(客户端)上运行,必须完全正常运行以下各种层组成的堆栈

User
  |
Application (frontend)
  |
SANE net (meta-backend on the client)
  |
Client network interface  
  |                             client machine
Network =======================================
  |                             server machine
Server network interface
  |
SANE saned (meta-frontend for the backend)
  |
SANE backend (actual driver for the scanner)
  |
libusb
  |
USB kernel modules
  |
USB hardware in the server machine
  |
USB cable connection  
  |
Scanner

这种通过网络扫描的设置只有当客户端工作站也位于扫描仪旁边时才有意义(特别是当客户端和带有扫描仪的服务器位于同一房间时),请参见以下内容

如何使用专业的网络打印机扫描仪复印一体机

与上述 USB 扫描仪上的扫描不同,功能强大的网络打印机扫描仪复印一体机通常以“独立扫描到电子邮件”的方式使用,其中不涉及任何特定的扫描仪驱动程序软件或 SANE 软件。

通常,您可以在专业的网络打印机扫描仪复印一体机上直接扫描,并直接在设备上指定扫描分辨率和图像文件格式(例如,tiff、PDF 等)以及所有其他扫描选项,特别是您可以指定设备将扫描的图像文件发送到的电子邮件地址,以便您将扫描的图像作为附件收到,具体取决于指定的图像文件格式。

在购买网络打印机扫描仪复印一体机之前,请仔细检查特定设备是否支持“独立扫描到电子邮件”(无需任何其他软件),并且设备是否提供易于日常使用的用户界面。

这种操作方式通常对用户来说更方便,因为如果使用 SANE 后端,您必须使用 SANE 前端在工作站上指定所有扫描参数。

但是,如果您的工作站远离网络扫描仪,您必须走到网络扫描仪旁放置纸张,并在网络扫描仪上张贴一张大红纸条,说明您当前正在使用它进行扫描,以便其他人知道发生了什么情况,然后走回您的工作站指定扫描参数并启动扫描,最后您必须再次走到网络扫描仪旁取走您的纸张并移除您的纸条,然后走回您的工作站。另一方面,这种操作方式对您的身体健康更好;-)

有关一体机中的打印机单元,请参阅 SDB:Printer buying guide 中的“Printer plus Scanner all-in-one devices”部分。

故障排除(调试)

对于调试,SANE 中各个层的调试消息和 "scanimage" 的详细模式很有用。请参阅 "man sane-usb"、"man sane-scsi"、"man sane-dll"、"man sane-backend" 和 "man scanimage"。将 "backend" 替换为相应后端的名称。将 "Device" 替换为相应后端的名称或完整的 SANE 设备,例如 "backend:libusb:123:456"(参见 "前端" 部分)。

示例

不带调试消息的测试

scanimage -d Device -v >/dev/null && echo OK || echo FAILED

仅使用 "dll" 元后端的调试消息进行测试。当例如 "dll" 元后端无法找到或加载实际的后端或更准确地说后端库 "/usr/lib[64]/sane/libsane-backend.so..." 时很有用

export SANE_DEBUG_DLL=4
scanimage -d Device -v >/dev/null && echo OK || echo FAILED
unset SANE_DEBUG_DLL

仅使用实际后端的调试消息进行测试。调试值取决于特定的后端,请参阅 "man sane-backend"(将 "backend" 替换为相应后端的名称)

export SANE_DEBUG_backend=128
scanimage -d Device -v >/dev/null && echo OK || echo FAILED
unset SANE_DEBUG_backend

仅使用 USB 系统的调试消息进行测试(对于 SCSI,请参阅 "man sane-scsi”)

export SANE_DEBUG_SANEI_USB=128
scanimage -d Device -v >/dev/null && echo OK || echo FAILED
unset SANE_DEBUG_SANEI_USB

可以组合使用,但可能会使查找错误更加困难,因为可能会一次显示太多的调试消息

export SANE_DEBUG_DLL=4
export SANE_DEBUG_backend=128
export SANE_DEBUG_SANEI_USB=128
scanimage -d Device -v >/dev/null && echo OK || echo FAILED
unset SANE_DEBUG_SANEI_USB
unset SANE_DEBUG_backend
unset SANE_DEBUG_DLL

第三方扫描仪驱动程序

当第三方驱动程序包含至少一个专有部分(通常是专有的仅二进制库,可能称为“模块”)时,它就是专有软件。

对于专有软件,除了专有软件的作者或供应商之外,没有人可以提供任何类型的帮助和支持,因为除了作者或供应商之外,没有人知道他们的专有软件真正如何工作。

在这种情况下,您只能联系您获得专有软件的来源以获取任何类型的帮助和支持。

如果第三方扫描仪驱动程序软件无法与 SANE 兼容,您只能联系您获得第三方驱动程序软件的来源以获取帮助和支持。

如果第三方扫描仪驱动程序软件与 SANE 兼容

YaST2 扫描仪模块无法支持第三方扫描仪驱动程序,因为 SANE 中没有定义第三方扫描仪驱动程序软件必须如何安装,以便通用的扫描仪设置软件(如 YaST2 扫描仪模块)可以支持它。

但通常不需要通用的扫描仪设置支持,因为

基本上与 SANE 兼容的第三方扫描仪驱动程序软件应在安装驱动程序软件时将其驱动程序名称添加到/etc/sane.d/dll.conf以便驱动程序被激活,然后驱动程序应该可以工作,请参阅上面的 "SANE 后端"。

安装了符合 SANE 标准的第三方扫描仪驱动程序后,请验证其驱动程序是否已列在 /etc/sane.d/dll.conf 中,以便激活该驱动程序。

之后,检查 "scanimage -L" (以 root 用户和普通用户身份运行) 是否能找到扫描仪,请参阅上面的 "前端"。

如果驱动程序通过 /etc/sane.d/dll.conf 激活,但您以 root 用户身份运行 "scanimage -L" 时找不到扫描仪,那么实际上是驱动程序找不到扫描仪,这意味着驱动程序无法工作。

如果以 root 用户身份运行 "scanimage -L" 时能找到扫描仪,但以普通用户身份运行时找不到,通常是访问权限问题,请参阅上面的 "通过 udev 设置 USB 扫描仪访问权限"。

如果 YaST 支持第三方扫描仪驱动程序,这并无帮助,因为 YaST 能够做的只是在 /etc/sane.d/dll.conf 中激活驱动程序,但 YaST 无法修复已激活但无法工作的驱动程序。

如果第三方扫描仪驱动程序无法工作,您可以尝试自行调试,请参阅上面的 "故障排除(调试)" 或联系您获取第三方驱动程序的来源以获取进一步的帮助和支持。

更多信息