以下章节适用于所有硬件类型。关于扫描仪接口类型的具体说明在本节末尾的段落中提及。
Devfs,或“设备文件系统”,自 2.2 系列后期以来一直是 Linux 内核中的一个选项。设备文件系统守护进程 Devfsd 在您的系统中动态创建和删除设备,而无需手动创建设备。如果您正在运行 devfsd/devfs,您可以跳过以下章节,因为设备节点的创建过程将为您完成,而您只需在以下位置找到相应的设备节点即可:/dev.
Devfs 并不能消除为用户访问设备而更改设备权限的需要。
从 2.6 系列内核开始,devfs 已被弃用,转而使用名为 udev 的用户空间守护进程,尽管 devfs 仍然是一个选项。您可以在这里找到关于 udev 的信息。
如果您正在运行配置正确的 devfs、udev 或 libusb 系统,您可以跳过此步骤并转到第 4 节。手动完成必要设备的创建有两种方法。一种是使用 MAKEDEV,另一种是在命令行创建设备节点。
MAKEDEV 脚本是两种方法中较简单的一种,其可执行文件可能位于/dev或用于存储二进制可执行文件的常用位置(/bin,/sbin等等)。我建议您查阅 man MAKEDEV,并提醒您注意特定于设备的命令选项,以便确保主次号码正确(有关此内容以及为什么它很重要,请参阅下一段,尤其是当 MAKEDEV 不起作用或者您更喜欢硬方式时)。
设备可以创建为块设备(如驱动器)、fifo(先进先出文件或管道,如 xconsole)或字符设备,后者代表其他硬件。每个设备都有一个主次号码“坐标”来告诉内核它是什么以及在哪里访问它。这些数字不是任意的。
如果您正在运行 2.4 系列内核,您应该考虑熟悉 SCSI proc 接口访问,并且无论您正在运行哪个内核,您都应该在进一步阅读之前阅读 man sane-scsi。当系统启动时,通用的 SCSI 设备文件被映射到/dev/sgN,其中 N 是从零开始的数值。SCSI 设备的主次号码分别为 21 和 0,1,2,3...。您可以使用 ls -l /dev/sg* 找出已加载的设备,它应该产生类似于以下的输出
crw------- 1 root sys 21, 0 Jan 06 2003 /dev/sg0 crw------- 1 root sys 21, 0 Jan 06 2003 /dev/sg1 crw------- 1 root sys 21, 0 Jan 06 2003 /dev/sg2 crw------- 1 root sys 21, 0 Jan 06 2003 /dev/sg3 crw------- 1 root sys 21, 0 Jan 06 2003 /dev/sg4 crw------- 1 root sys 21, 0 Jan 06 2003 /dev/sg5 |
您将需要创建一个/dev/scanner指向现有设备的符号链接(原因稍后澄清)。例如,如果您的扫描仪连接到 SCSI 主机设备的第一个 scsi 总线(以及 lun 和 target),您应该将其链接到相应的设备
# ln -s /dev/sg0 /dev/scanner |
同样,如果使用 libusb,您可以跳过此步骤。USB 扫描仪设备的主号码为 180,次号码为 48、49 等,最高可达 63。首先,检查/dev以查看您的发行版在哪个目录中布局其 USB 目录设备,因为某些发行版可能在以下位置拥有这些设备scanner0, scanner1...等等,在/dev/usb或者作为usbscanner0, usbscanner1...等等,在基本/dev/目录中。如果您发现在/dev/目录中已经为您创建了扫描仪设备,那么您的工作就完成了。如果不是,您将需要自己创建它们。以 root 用户身份,为您的扫描仪创建一个字符设备,如下所示
# mknod /dev/usbscanner0 c 180 48 |
...或者如果您的发行版有一个“/dev/usb”子目录
# mknod /dev/usb/scanner0 c 180 48 |
按照上面部分概述的示例创建以下通用并行端口设备
crw------- 1 root root 99, 0 Jun 24 13:47 parport0 crw------- 1 root root 99, 1 Jun 24 13:47 parport1 crw------- 1 root root 99, 2 Jun 24 13:47 parport2 crw------- 1 root root 99, 3 Jun 24 13:47 parport3 crw-r----- 1 root root 1, 4 Jan 1 1970 port |
您可能还需要创建/dev/port和/或/dev/parport取决于您将使用的后端,因此如果您的应用程序需要,请准备好返回此步骤。
确保您的用户帐户在所有模块加载和设备节点创建后可以访问设备是一个好主意。最注重安全性的方法是将扫描仪访问权限添加到特定组。在我的系统中,'scanner' 组的成员被允许使用扫描仪。完成此操作的方法是首先更改以下设备的所有权/dev像这样(以 root 用户身份)
# chown root.scanner /dev/usb/scanner* |
...其中 root.scanner 是设备现在将属于的所有者和组。显然,具体命令将因您的系统和设备类型而异,无论是/dev/sg*在 SCSI 扫描仪上等。重要的是您更改设备节点本身的所有权,而不是符号链接;符号链接的所有权仅通过更改它们指向的父设备或文件来影响。
要查看您的用户帐户是否是相关组的成员,请以 root 用户身份发出以下命令:grep -e scanner /etc/group。您应该看到类似以下的内容
scanner:x:103: |
...其中“103”是组号。由于“scanner”组中最后一个冒号后没有成员,我们可以添加它们,例如使用命令添加用户“jhs”
# adduser jhs scanner |
在此之后,只需允许相关用户的设备进行读写访问,如下所示
# chmod g+rw /dev/usb/scanner0 |
...其中 g+rw 表示为 group 添加 read 和 write 访问权限。有关更多信息,请参阅 chmod 的文档(man chmod 或 info chmod)。