如何使用Linux mknod命令创建节点? (linux mknod 创建结点)

节点是Linux系统上的一个重要概念,节点实际上就是一种特殊的文件,但是它与普通文件相比有着不同的作用和属性。Linux系统中最常见的节点就是设备节点,用于访问硬件设备或其他内核对象。在Linux系统中,我们可以使用mknod命令来手动创建节点,本文将详细介绍如何使用mknod命令创建节点。

一、mknod命令概述

mknod命令是Linux系统中的一个基本命令,它用于创建特殊文件或节点。在Linux系统中,所有文件都是以inode为基础的,但是节点是一种特殊的文件,它通常表示设备或内核对象,节点文件和普通文件的区别在于,节点文件可以直接访问硬件或内核对象,而普通文件则不行。mknod命令主要用于创建设备节点,它可以创建设备节点文件,然后将设备文件和硬件设备或内核对象进行关联。

二、 mknod命令语法

mknod命令的语法如下:

mknod [-m mode] device c|b major minor

说明:device为节点的名称,major和minor分别为设备号的高16位和低16位,c为字符设备,b为块设备,mode为节点的权限,可省略。

三、使用mknod命令创建节点

我们先以一个例子来说明如何使用mknod命令创建节点。

1. 创建一个字符设备节点

我们以一个简单的字符设备节点为例,首先打开终端窗口,在终端中输入以下命令:

$ sudo mknod helloworld c 199 0

其中,helloworld为节点的名称,c表示是字符设备,199为设备号的高16位,0为设备号的低16位。

2. 创建一个块设备节点

如果要创建一个块设备节点,只需要将命令中的c参数改为b即可,例如:

$ sudo mknod harddisk b 8 0

其中,harddisk为节点的名称,b表示是块设备,8为设备号的高16位,0为设备号的低16位。

3. 设置节点的权限

在创建节点时,我们可以使用-m参数来设置节点的权限。例如,我们可以使用以下命令来创建一个只允许root用户读写的字符设备节点:

$ sudo mknod hello c 199 0 -m 600

4. 删除节点

如果需要删除一个节点,可以使用rm命令,例如:

$ sudo rm helloworld

这将删除名为“helloworld”的节点。

四、

Linux系统中的节点是非常重要的,它们可以直接访问硬件设备和内核对象,是操作系统和程序之间的重要接口。在Linux系统中,使用mknod命令可以手动创建节点,让我们拥有更多的灵活性和自由度。在使用mknod命令创建节点时,需要指定节点名称、设备类型、设备号等信息,并可以设置节点的权限。希望本文对您有所启发,让您更好地了解Linux系统下的节点和mknod命令的使用。

相关问题拓展阅读:

如何在ARM Linux上使用FDT和initrd

这文章算是最近工作的备忘。

FDT是ARM

Linux最新的设备驱动程序信息表,使用FDT的内核,就不用像过去的内核那样,一个板子加一个mach的C文件,所有的设备信息可以记录在一个树状信息文件里面。

目前这方面资料比较少,我以AM335x处理器为例激哗洞概括一下FDT的使用:

FDT仅仅是一个信息的目录和参数表,要使用某个功能内核中还必须有相应的驱动程序代码

FDT的源文件位置在:arch/arm/boot/dts,例如,TI的Beagle bone black,源文件是arch/arm/boot/dts/am335x_boneblack.dts

FDT在make ARCH=arm的时候就会自动生成,也可用make ARCH=arm

dtbs来生成,例如TI的Beagle bone black生成的文件是arch/arm/boot/dts/am335x_boneblack.dtb,这是一个二进制文件

要想新增你自定义的FDT,请修改arch/arm/boot/dts/Makefile,并在相应的Kconfig中增加config选项,例如,TI的Beagle

bone black,Kconfig的位置在arch/arm/mach-omap2/Kconfig

FDT的dtb文件由u-boot传递给内核,u-boot必须把这个文件拷贝到内核解压地址之后的某个位置,确保内核解压的时候不会覆盖,然后使用“bootm

– ”来启动内核

如果dtb文件不正确,对于3.10以上的内核,可能什么显示都没有,3.8内核,可能就显示到Uncompressing kernel……done

FDT的编写规则说明在Documentation/devicetree/bindings,不同的设备有相应的txt文件说明,其中的“compatible”可以作为关键字搜索驱动程序的源文件,例如,AM335x的GPIO,用“ti,omap4-gpio”为关键字,可以找到其代码位于drivers/gpio/gpio-omap.c

FDT可以包明枯含子文件,比如am335x_boneblack.dts就包含了am33xx.dtsi,am335x-bone-common.dtsi

以一个例子来说明编写规则,我的板子上,I2C0上挂了一个音频CODEC,其地址是0x18,型号是TLV320AIC3104IRH。

先找到i2c0节点的位置,这在arch/arm/boot/dts/am33xx.dtsi中:

i2c0: i2c@44e0b000

{

compatible =

“ti,omap4-i2c”;

#address-cells =

;

#size-cells =

;

ti,hwmods =

“i2c1”;

reg = ;

interrupts =

;

status =

“disabled”;

};

要在这个节点上挂东西,可以直接在am33xx.dtsi中挂,可以写成这样:

i2c0: i2c@44e0b000

{

compatible =

“ti,omap4-i2c”;

#address-cells =

;

#size-cells =

;

ti,hwmods =

“i2c1”;

reg = ;

interrupts =

;

status =

“okay”;

tlv320aic3x: tlv320aic3x@18 {

compatible = “ti,tlv320aic3x”;

reg = ;

status = “okay”;

AVDD-supply = ;

IOVDD-supply = ;

DRVDD-supply = ;

DVDD-supply = ;

};

};

其中compatible字串“ti,tlv320aic3x”是在Documentation/devicetree/bindings里面全文搜索“tlv320aic”获得的,“tlv320aic3x:

tlv320aic3x@18”遵循的是“标识符:名称@地址”的格式,前面的“i2c0:

i2c@44e0b000”也是这个格式。这里的标识符可以在芦绝包含这个文件的文件或这个文件的其他位置引用,因此,可以使用arch/arm/boot/dts/am335x-boneblack.dts包含arch/arm/boot/dts/am33xx.dtsi,然后在am335x-boneblack.dts里写:

&i2c0 {

status = “okay”;

tlv320aic3x: tlv320aic3x@18 {

compatible = “ti,tlv320aic3x”;

reg = ;

status = “okay”;

AVDD-supply = ;

IOVDD-supply = ;

DRVDD-supply = ;

DVDD-supply = ;

};

};

&i2c0表示引用了i2c0这个标识符,然后把括号里的内容挂载到标识符下,如果属性的名字相同,例如status出现两次,前面是“disabled”后面是“okay”,以后面的为准,引用标识符的次数不受限制。

也许一开始会觉得FDT的工作过程很神秘,但你只要用compatible的字串去全文搜索一下C文件,然后仔细阅读一下,就会发现很简单,没过几分钟你就可以自定义FDT节点的属性了。反倒是这些操作过程我没找到什么文档说,比较头痛,所以我把这些写出来,希望能给大家帮助。

下面说说initrd,initrd的用处是给内核一个初始的基本文件系统,用来加载内核模块之类的东西。很多人觉得嵌入式系统不需要initrd,也可以把initrd作为最终的根文件系统。我用initrd是用来校验真正的根文件系统,因为在嵌入式设备上,无法预测用户到底什么时候关机,可能会造成文件系统问题。

initrd可以用buildroot,像制作正常文件系统一样做,最后把根下的linuxrc换成一个例如下面这样的文件:

#!/bin/sh

/bin/echo Now Check SD Card

/in/fsck.ext4 /dev/mmcblk0p5

虽然Documentation/initrd.txt里面说,内核会执行initrd里面的/in/init,但在我用的linux-3.8.13上,init/do_mounts_initrd.c里面,执行的是/linuxrc,不知道是不是文档没有更新过来。具体的调用顺序是,kernel_init(init/main.c)

> kernel_init_freeable(init/main.c)

> prepare_namespace(init/do_mounts.c)

> initrd_load(init/do_mounts_initrd.c) > handle_initrd

(init/do_mounts_initrd.c)。

在使用initrd的时候有几点需要注意的:

不建议在initrd上挂载别的东西,会引起未知的问题,貌似看到个文章说这个,找不到了

因为上面的这条,而且在initrd的时候,内核还没有挂载devtmpfs,因此建议使用静态设备节点,以AM335x为例(内核参数console=/dev/ttyO0,115200n8),必须的节点有:

/dev/null

/dev/console

/dev/ttyO0

这些节点可以用fakeroot之后mknod在buildroot的output/target/dev里创建,除了/dev/console,buildroot会自己创建,其他也可以写到buildroot的system/device_table.txt里面让buildroot自动创建:

#

/dev/null

c

/dev/ttyO0 c

如果你用的是Atmel的处理器,上面的ttyO0可能是ttyS0,如果是三星的,可能是ttySAC0,而且major和minor也会不一样,请自行解决。如果你像我一样要检验SD卡,那就还必须加上SD卡的分区对应的节点。

/linuxrc可以是个程序也可以是个脚本,脚本的话,命令写绝对路径,而且记得把/linuxrc的mode改为755

使用initrd只需要用u-boot把buildroot制作的文件系统映像拷贝到内存里,然后传递initrd=,这样的参数给内核,例如initrd=0x,8M,最终的root参数可以不变,例如root=/dev/mmcblk0p5,这表示最终的root是SD卡上扩展分区中的之一个逻辑分区。给两个内核参数的例子:

console=ttyO0,115200n8 root=/dev/mmcblk0p5 initrd=0x,8M vram=16M

consoleblank=0

console=ttyO0,115200n8 initrd=0x,8M root=/dev/nfs rw

nfsroot=192.168.5.226:/home/cdu/nfsroot

ip=192.168.5.222:192.168.5.226:192.168.5.1:255.255.255.0:core335x:eth0:off

vram=16M consoleblank=0

之一个不解释了,第二个表示使用initrd,同时使用nfsroot。

linux系统中 /dev目录下的设备都连接到开发板上了吗?

linux /dev下的设备都连接到开发板上了吗?不是

比如说/dev/vedio0 是用于视频传输的吧 可腊核是我开发板上没有任何视频设备 为啥还有这个节点?

节点是可以随意创建的 名字也可以随意取(当然有些约定俗称的名字,比如tty这类设备瞎起是不行的)

创建节点用命令 mknod 你可山局岁以查阅相关的内容

创建一个节点的意义在于让应用层可以通过这个节点对对应的“硬件”进行操作(一切皆文件的思想)

硬件可以是真的 可以是假的,可以是不存在的。 与/dev/下面的节点文件没有逗睁关系

为啥还有这个节点?名字应该是/dev/video0吧? 看名字这个节点应该是一个显示设备啊 (当然也可能不是)

就像我上面写的 只要你原意 你创建个/dev/keyboard 然后其实实际的设备和驱动是一个炸弹 都可以。。

linux mknod 创建结点的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux mknod 创建结点,如何使用Linux mknod命令创建节点?,如何在ARM Linux上使用FDT和initrd,linux系统中 /dev目录下的设备都连接到开发板上了吗?的信息别忘了在本站进行查找喔。


数据运维技术 » 如何使用Linux mknod命令创建节点? (linux mknod 创建结点)