如何使用 mknod 命令在 Linux 中创建设备文件
在Linux中,一切都是文件,甚至磁盘驱动器、CD/DVD ROM 和软盘等物理设备也使用文件来表示。但是,这些文件不是常规的数据文件。相反,这些特殊文件称为设备文件,它们可以生成或接收数据。
通常,所有特殊文件都存在于/dev目录下。一些常见的特殊文件示例包括/dev/null、/dev/zero、/dev/full和/dev/sr0。
特殊文件可以是字符类型或块类型。顾名思义,字符文件一次处理一个字符,而块文件一次处理多个字符。
在本高级指南中,我们将讨论如何使用mknod命令创建设备文件。按照本指南操作后,Linux 用户将能够自信地使用不同类型的设备文件。
mknod 命令语法
mknod命令的语法与其他 Linux 命令略有不同。主要区别在于,我们需要在创建字符和块设备文件时指定主设备号和次设备号:
$ mknod [OPTIONS] [MAJOR] [MINOR] ...
在上面的语法中,方括号([])
表示可选参数,而尖括号(<>)
表示强制参数。
在Linux中,主编号用于指定需要使用的设备驱动程序。此编号是在注册设备驱动程序时分配的。
类似地,次要编号用于指定实际的设备。我们可以在Linux 内核的文档中找到保留的主编号和次要编号。
1. 在 Linux 中创建未命名管道
在 Linux 中,我们使用管道来实现进程间通信。在 Shell 中,管道用垂直线表示(|)
。它读取前一个进程的输出并将其作为输入发送到下一个进程。
让我们通过一个简单的例子来理解这一点:
$ echo "example.com" | wc -c
在这个例子中,我们使用管道读取echo 命令的输出并将其作为输入发送到wc 命令进行进一步处理。
这里,我们使用垂直线(|)
创建了一个管道。但是,这会创建一个未命名的管道,其范围仅限于当前命令。在下一个示例中,我们将了解如何创建命名管道。
2. 在 Linux 中创建命名管道
我们可以使用mknod命令来创建命名管道。命名管道就像任何其他常规文件一样驻留在文件系统上。但是,它的主要目的是允许不相关的进程之间进行进程间通信。
首先,让我们指定设备类型来p
创建命名管道:
$ mknod /tmp/named-pipe p $ ls -l /tmp/named-pipe
现在,让我们尝试读取该文件:
$ cat /tmp/named-pipe
这里,我们可以看到cat 命令正在无限等待:
接下来,让我们打开另一个终端并将一些数据写入/tmp/named-pipe文件:
$ echo "example.com" > /tmp/named-pipe
最后,转到第一个终端查看结果:
在这里,我们可以看到echo和cat命令能够使用命名管道进行通信。
3.在Linux中创建字符设备文件
类似地,我们可以使用设备类型来c
创建字符设备。但是,创建字符设备时必须使用主设备号和次设备号。
让我们使用ls 命令来查找/dev/full设备的主设备号和次设备号:
$ ls -l /dev/full
在上面的输出中,以逗号分隔的数字对(即1、7)分别代表主号码和次号码。
在 Linux 中,/dev/full设备总是返回设备上没有剩余空间的错误。为了理解这一点,让我们向该设备写入一些数据:
$ echo "example.com" > /dev/full
现在,让我们使用mknod命令创建一个行为与/dev/full设备相同的新设备:
$ sudo mknod /tmp/full-device c 1 7
接下来,让我们更改文件权限:
$ sudo chmod 666 /tmp/full-device $ ls -l /tmp/full-device
最后,向新创建的设备写入一些数据:
$ echo "example" > /tmp/full-device
值得注意的是,由于主号和次号相同,新创建的字符设备的行为与/dev/full设备类似。
4. 在 Linux 中创建块设备文件
除此之外,我们还可以指定设备类型来b
创建块设备。要创建块设备,我们必须使用主设备号和次设备号。
在 Linux 中,/dev/sr0代表CD/DVD ROM设备。现在,让我们创建一个行为与/dev/sr0相同的新块设备。
首先,让我们找出/dev/sr0的主设备号和次设备号:
$ ls -l /dev/sr0
在上面的输出中,我们可以看到它的主设备号和次设备号分别为11和0。
现在,让我们创建一个具有相同主号和次号的新块设备:
$ sudo mknod /tmp/dvd-rom b 11 0 $ ls -l /tmp/dvd-rom
接下来,让我们将 ISO 映像从 CD/DVD ROM 挂载到/mnt目录并验证挂载操作是否成功:
$ sudo mount /tmp/dvd-rom /mnt/ $ ls -1 /mnt/
在这个例子中,我们可以看到/tmp/dvd-rom块设备能够访问 CD/DVD ROM 中的 ISO 映像。
5. 创建具有权限的设备文件
有时,我们需要在使用设备文件之前修改其访问权限。在这种情况下,我们必须使用chmod命令。但是,我们可以使用mknod命令来实现相同的结果,而不必使用两个单独的命令。
-m
为了理解这一点,让我们在创建命名管道时使用设置访问权限的选项:
$ sudo mknod -m 444 /tmp/pipe-with-permissions p
现在,让我们验证权限是否已正确设置:
$ ls -l /tmp/pipe-with-permissions
在此示例中,我们将该-m
选项用于命名管道。但是,我们也可以将其用于字符设备和块设备。
您知道 Linux 中mknod命令的其他最佳示例吗?请在下面的评论中告诉我们您的观点。