linux mknod命令

本文详细介绍了Linux操作系统中如何创建和管理设备文件,包括设备文件的类型、创建命令及参数解释,帮助开发者理解设备文件在系统与外部设备通信过程中的作用。


我们的linux操作系统跟外部设备(如磁盘、光盘等)的通信都是通过设备文件进行的,应用程序可以打开、关闭、读写这些设备文件,从而对设备进行读写,这种操作就像读写普通的文件一样easy。linux为不同种类的设备文件提供了相同的接口,比如read(),write(),open(),close()。

      所以在系统与设备通信之前,系统首先要建立一个设备文件,这个设备文件存放在/dev目录下。其实系统默认情况下就已经生成了很多设备文件,但有时候我们需要自己手动新建一些设备文件,这个时候就会用到像mkdir, mknod这样的命令。

       mknod 的标准形式为:       mknod DEVNAME {b | c}  MAJOR  MINOR

       1,DEVNAME是要创建的设备文件名,如果想将设备文件放在一个特定的文件夹下,就需要先用mkdir在dev目录下新建一个目录(需要root权限);

       2, b和c 分别表示块设备和字符设备:

它帮助操作系统查找设备驱动程序代码,和指定次设备的数目,也就是单元驱动器或行号,它们是十进制或八进制的。一个设备的主要和次要编号由该设备的配置方法分配,它们保存在 ODM 中的 CuDvDr 类里。在这个对象类中定义了主要和次要编号以确保整个系统设备定义的一致性,这是很重要的。

                  b(块设备)表示系统从块设备中读取数据的时候,直接从内存的buffer中读取数据,而不经过磁盘;比如串口用的就是这样的设备

                  c表示字符设备文件与设备传送数据的时候是以字符的形式传送,一次传送一个字符,比如打印机、终端都是以字符的形式传送数据;

       3,MAJOR和MINOR分别表示主设备号和次设备号:

             为了管理设备,系统为每个设备分配一个编号,一个设备号由主设备号和次设备号组成主设备号标示某一种类的设备,次设备号用来区分同一类型的设备。linux操作系统中为设备文件编号分配了32位无符号整数,其中前12位是主设备号,后20位为次设备号,所以在向系统申请设备文件时主设备号不好超过4095,次设备号不好超过2^20 -1。

 .

 例子:       

          mkdir -p  /dev/myserial

          mknod /dev/myserial/mydev1 b 64 128


转载  : http://blog.youkuaiyun.com/cgzhello1/article/details/7938483


<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` 来自动化、安全地管理设备节点。**
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值