linux mknod命令使用

名字

mknod - 建立块专用或字符专用文件  

总览

mknod [options] name {bc} major minor
mknod [options] name p  

GNU 选项(缩写):

[-m mode] [--help] [--version] [--]  

描述

mknod 用指定名称产生一个FIFO(命名管道),字符专用或块专用文件。

文件系统中的一个专用文件存贮着三种信息(布朗型?、整型、整型)。布朗型?在字符文件与块文件之间作出选择,两个整型是主、次设备号。

通常,一个专用文件并不在磁盘上占用空间,仅仅是为操作系统提供交流,而不是为数据存贮服务。一般地,专用文件会指向一个硬件设备(如:磁盘、磁带、打印机、虚拟控制台)或者操作系统提供的服务(如:/dev/null, /dev/random)。

块文件通常类似于磁盘设备(在数据可以被访问的地方赋予一个块号,意味着同时设定了一个块缓存)。所有其他设备都是字符文件。(以前,两种文件类型间是有差别的。比如:字符文件I/O没有缓存,而块文件则有。)

mknod命令就是用来产生这种类型文件的。

以下参数指定了所产生文件的类型:


p
FIFO型
b
块文件
c
字符文件

GNU版本还允许使用u('unbufferd'非缓冲化),以保持与C语言的一致。

当创建一个块文件或字符文件时,主、次设备号必须在文件类型参数后给出。(十进制或八进制以0开头;GNU 版本还允许使用以0x开头的十六进制)缺省地,所产生的文件模式为0666('a+rw')。  

选项

<think>嗯,用户想了解Linuxmknod命令的功能和使用场景。从引用资料来看,用户已经查阅了一些相关信息,但需要更系统的解释。用户可能正在学习Linux设备管理,或者遇到了驱动开发中设备节点创建的问题。根据引用[2]提到的场景,用户似乎尝试过加载驱动但找不到设备文件,这正是mknod的典型应用场景。需要重点解释几个关键点:1.设备节点的本质是特殊文件(字符设备/块设备),引用[5]提到它不占用磁盘空间而是作为通信接口2.mknod的核心功能是手动创建设备节点,引用[1]和[3]都强调了这点3.主次设备号的重要性,引用[4]说明这是驱动注册时分配的关键标识用户可能混淆的点在于:-为什么insmod后设备不会自动出现在/dev(现代系统多用udev自动管理)-主设备号如何获取(引用[2]提到/proc/devices查询)需要特别说明现代Linux中手动使用mknod的场景已经减少,但理解其原理对驱动调试仍有价值。引用[5]关于设备节点指向硬件设备的描述可以引申出实际例子。考虑用块设备(如硬盘分区)和字符设备(如串口)作为示例,这样能覆盖两种设备类型。命令语法部分要强调TYPE参数b/c的区别,这是引用[3]提到的关键参数。安全提示也很重要,避免用户随意创建节点导致系统问题。最后补充udev的对比说明,因为用户可能在较新系统中操作,引用[2]的调试经验可能过时。</think>好的,我们来详细解释 Linux 中的 `mknod` 命令,包括其功能、使用场景以及相关注意事项。 **Linux `mknod` 命令详解** **1. 核心功能:创建设备节点文件 (Device Node File)** * `mknod` 命令最核心、最直接的作用就是**在文件系统中手动创建设备节点文件**。 * **什么是设备节点文件?** * 在 Linux 中,硬件设备(如硬盘、键盘、鼠标、串口、声卡)以及一些内核提供的虚拟设备(如 `/dev/null`, `/dev/zero`, `/dev/random`)并非像普通文件那样直接可见和访问。 * 设备节点文件是**内核提供给用户空间程序访问硬件设备或内核服务的接口**。它们是一种特殊类型的文件。 * 当你对设备节点文件执行读写操作时,这些操作会被 Linux 内核拦截,并由相应的**设备驱动程序**来处理,最终作用到真实的硬件或内核服务上[^1][^5]。 * **设备节点文件的类型:** * **字符设备 (Character Device - `c`)**: 数据以字符流(字节流)的形式传输。通常用于顺序访问、无缓冲的设备,如终端、键盘、鼠标、串口、大多数打印机、声卡等。对应内核中的 `struct cdev`。 * **块设备 (Block Device - `b`)**: 数据以固定大小的块(如 512字节、4K)为单位传输。通常用于支持随机访问、带缓冲的存储设备,如硬盘、SSD、USB 存储、CD-ROM 等。对应内核中的 `struct block_device`。 * **命名管道 (Named Pipe / FIFO - `p`)**: 虽然 `mknod` 也能创建 FIFO(使用 `p` 类型),但更常用且专门化的命令是 `mkfifo`。FIFO 用于进程间通信 (IPC)。 **2. 关键参数:主设备号 (Major Number) 和次设备号 (Minor Number)** * 创建字符设备 (`c`) 或块设备 (`b`) 节点时,**必须**指定两个数字参数: * **主设备号 (Major Number)**: 标识**设备驱动程序**或设备的大类。内核使用主设备号将设备的操作请求(通过设备节点文件发起)路由到正确的驱动程序。例如,所有 SCSI 磁盘可能共享一个主设备号,而所有 tty 设备共享另一个主设备号[^1][^3][^4]。 * **次设备号 (Minor Number)**: 在同一个驱动程序管理的设备中,标识**具体的设备实例**。例如,第一个 SCSI 硬盘的第一个分区可能次设备号为 0,第二个分区次设备号为 1;或者主设备号相同的多个串口,用次设备号 0, 1, 2 等区分 `/dev/ttyS0`, `/dev/ttyS1`[^1][^3][^4]。 * **如何获取主次设备号?** * **驱动程序注册时分配**: 驱动程序在初始化时(例如通过 `register_chrdev` 或 `register_blkdev` 函数)向内核申请主设备号(可以静态指定或动态分配)[^4]。 * **查看 `/proc/devices`**: 这是最常用的方法。加载了驱动程序(`insmod` 或 `modprobe`)后,`cat /proc/devices` 会列出当前系统中已注册的字符设备 (`Character devices:`) 和块设备 (`Block devices:`),显示它们的主设备号和名称[^2]。例如: ```bash $ cat /proc/devices Character devices: 1 mem 4 tty 4 ttyS 5 /dev/tty 5 /dev/console 5 /dev/ptmx 7 vcs 195 mytestdrv # 假设我们的驱动主设备号是 195 ... Block devices: 7 loop 8 sd 9 md 11 sr ... ``` * **内核文档或驱动文档**: 有些标准设备的主次设备号是固定的(如 `/dev/null` 是 `1, 3`),可以在内核文档 `Documentation/devices.txt` (较旧内核) 或在线文档中找到。 **3. 基本语法** ```bash mknod [选项] 名称 类型 [主设备号 次设备号] ``` * **`名称`**: 要创建的设备节点文件的路径和名称,通常位于 `/dev/` 目录下(如 `/dev/mycustomdev`)。 * **`类型`**: 指定文件类型,**必需**是以下之一: * `b`: 创建块设备节点。 * `c` 或 `u`: 创建字符设备节点(`u` 是历史遗留,通常用 `c`)。 * `p`: 创建 FIFO (命名管道) 节点。 * **`主设备号` 和 `次设备号`**: **仅当类型为 `b` 或 `c` 时必需**。必须是整数。对于 `p` 类型,不能提供这两个参数。 * **常用选项**: * `-m MODE` 或 `--mode=MODE`: 设置创建的文件权限模式(八进制格式,如 `0660`)。默认权限通常取决于 umask。**强烈建议使用此选项设置合适的权限**,避免安全风险(如 `-m 0660 root:groupname`)。 * `--help`: 显示帮助信息。 * `--version`: 显示版本信息。 **4. 主要使用场景** * **手动创建设备节点(历史原因或特殊情况)**: * **早期系统/嵌入式系统**: 在广泛使用 `udev` 或 `devtmpfs` 等自动设备管理机制之前,系统管理员或开发者需要手动运行 `mknod` 来创建设备节点[^1][^2]。 * **调试驱动程序**: 这是**当前最常见的手动使用 `mknod` 的场景**。当你开发一个新的内核驱动程序(字符设备或块设备驱动)并加载(`insmod`/`modprobe`)后,驱动程序会在 `/proc/devices` 中注册主设备号。但是,**加载驱动模块本身并不会自动在 `/dev` 下创建设备节点文件!** 此时,你需要手动使用 `mknod` 创建节点文件,指定正确的主次设备号,然后才能让用户空间的应用程序通过这个节点文件打开 (`open`)、读写 (`read`/`write`) 你的设备[^2]。 * 示例(假设驱动主设备号 195,次设备号 0): ```bash sudo mknod /dev/testdrv c 195 0 # 创建字符设备节点 sudo chmod 0666 /dev/testdrv # 通常需要设置权限让测试程序能访问 ``` * **创建特定权限或位置的节点**: 如果需要设备节点具有非常特定的权限、所有权或位于非标准位置(虽然不推荐),手动 `mknod` 可以做到。 * **创建 FIFO (命名管道)**: 如前所述,虽然 `mkfifo` 更常用,但 `mknod NAME p` 也能创建 FIFO。 **5. 现代替代方案与注意事项** * **`udev` / `devtmpfs` (强烈推荐)**: 现代 Linux 发行版几乎都使用 `udev` (用户空间) 或 `devtmpfs` (内核空间) 来自动管理 `/dev` 目录下的设备节点。 * 当设备被内核检测到(或驱动程序注册时),这些机制会自动在 `/dev` 下创建设备节点文件。 * 它们会根据规则 (`udev rules`) 设置节点名称、权限、所有权、创建符号链接等,管理更加智能、动态和安全。 * **因此,在常规的系统管理和应用开发中,普通用户和系统管理员几乎不再需要手动使用 `mknod`。** * **权限与安全**: 手动创建的设备节点如果权限设置不当(如 `0666`),可能导致任何用户都能访问底层硬件或驱动,带来安全隐患。**务必使用 `-m` 选项设置最小化必要权限(如 `0660` 配合特定用户组)。** 推荐使用 `udev` 规则来管理权限更安全可靠。 * **设备号冲突**: 错误指定主次设备号可能导致访问错误的设备或驱动程序行为异常。确保从 `/proc/devices` 获取正确的信息。 * **位置**: 设备节点通常应创建在 `/dev` 目录下以符合惯例。在其他位置创建可能会导致应用程序找不到设备。 **总结** `mknod` 是一个用于在 Linux 文件系统中**手动创建设备节点文件**的低级命令。其主要功能是创建**字符设备 (`c`)节点、块设备 (`b`)节点和命名管道 (`p`)**。创建设备节点时需要指定关键的**主设备号 (标识驱动) 和次设备号 (标识具体设备实例)**,这些信息通常从 `/proc/devices` 获取。 虽然 `mknod` 在历史上很重要,但在现代 Linux 系统中,其手动使用场景已大大减少,主要限于**驱动程序开发调试阶段**(在驱动加载后手动创建设备节点供测试程序访问)和一些**非常特殊的管理需求**。**对于日常使用,强烈推荐依赖 `udev` 或 `devtmpfs` 来自动化、安全地管理设备节点。**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值