mknod命令

时间:2024-10-13 07:16:11

##简介

命令mknod,可以生成块设备文件或者字符设备文件,格式为:

mknod [OPTION] NAME TYPE [MAJOR MINOR]

OPTION是选项,比较有用的是-m,表示生成的设备文件的权限;

NAME是生成的设备的名称

TYPE是设备类型,b表示块设备,c表示字符设备,p表示管道

MAJOR是主设备号,MINOR是次设备号,主设备号是由文件/usr/include/linux/定义的。摘取的代码段如下:

#ifndef _LINUX_MAJOR_H
#define _LINUX_MAJOR_H

/*
 * This file has definitions for major device numbers.
 * For the device number assignments, see Documentation/.
 */

#define UNNAMED_MAJOR           0
#define MEM_MAJOR               1
#define RAMDISK_MAJOR           1
#define FLOPPY_MAJOR            2
#define PTY_MASTER_MAJOR        2
#define IDE0_MAJOR              3
#define HD_MAJOR                IDE0_MAJOR
#define PTY_SLAVE_MAJOR         3
#define TTY_MAJOR               4
#define TTYAUX_MAJOR            5
#define LP_MAJOR                6
#define VCS_MAJOR               7
#define LOOP_MAJOR              7
#define SCSI_DISK0_MAJOR        8
#define SCSI_TAPE_MAJOR         9
#define MD_MAJOR                9
#define MISC_MAJOR              10
#define SCSI_CDROM_MAJOR        11
#define MUX_MAJOR               11      /* PA-RISC only */
#define XT_DISK_MAJOR           13
#define INPUT_MAJOR             13
#define SOUND_MAJOR             14
#define CDU31A_CDROM_MAJOR      15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

例子

mknod -m 0660 /dev/loop2 b 7 2
  • 1

表示创建loop设备,-m设置设备文件的权限,根据文件的定义,loop设备的主设备号是7,此设备号自定义为2。

设备文件

对于每种硬件设备,系统内核都有相应的设备驱动程序负责对其进行处理。在Linux中使用设备文件的方式来表示硬件设备,每种设备驱动程序都被抽象为设备文件的形式,这样就可以给应用程序一个一致的文件界面,方便应用程序和操作系统之间的通信。

一般所有的设备文件都放置在/dev目录下:

[jamza@A23488809 base]$ ls -l /dev
总用量 0
crw-------  1 root root     10, 235 1月  29 15:12 autofs
drwxr-xr-x  2 root root         280 3月  23 11:07 block
drwxr-xr-x  2 root root          60 1月  29 15:12 bsg
crw-------  1 root root     10, 234 1月  29 15:12 btrfs-control
drwxr-xr-x  3 root root          60 1月  29 15:12 bus
drwxr-xr-x  2 root root        3360 1月  29 17:02 char
crw-------  1 root root      5,   1 1月  29 15:12 console
lrwxrwxrwx  1 root root          11 1月  29 15:12 core -> /proc/kcore
drwxr-xr-x 10 root root         220 1月  29 15:12 cpu
crw-------  1 root root     10,  61 1月  29 15:12 cpu_dma_latency
crw-------  1 root root     10,  62 1月  29 15:12 crash
drwxr-xr-x  5 root root         100 1月  29 15:12 disk
brw-rw----  1 root disk    253,   0 1月  29 15:12 dm-0
brw-rw----  1 root disk    253,   1 1月  29 15:12 dm-1
brw-rw----  1 root disk    253,   2 1月  29 15:12 dm-2
brw-rw----  1 root disk    253,   3 1月  29 15:45 dm-3
brw-rw----  1 root disk    253,   4 3月   9 09:15 dm-4
drwxr-xr-x  2 root root          80 1月  29 15:12 dri
crw-rw----  1 root video    29,   0 1月  29 15:12 fb0
lrwxrwxrwx  1 root root          13 1月  29 15:12 fd -> /proc/self/fd
crw-rw-rw-  1 root root      1,   7 1月  29 15:12 full
crw-rw-rw-  1 root root     10, 229 1月  29 15:12 fuse
crw-------  1 root root     10, 228 1月  29 15:12 hpet
drwxr-xr-x  3 root root           0 1月  29 16:31 hugepages
crw-------  1 root root     10, 183 1月  29 15:12 hwrng
lrwxrwxrwx  1 root root          25 1月  29 15:12 initctl -> /run/systemd/initctl/fifo
drwxr-xr-x  3 root root         280 1月  29 15:12 input
crw-r--r--  1 root root      1,  11 1月  29 15:12 kmsg
crw-rw-rw-  1 root kvm      10, 232 3月  23 11:00 kvm
srw-rw-rw-  1 root root           0 1月  29 15:12 log
brw-rw----  1 root disk      7,   0 1月  29 15:45 loop0
brw-rw----  1 root disk      7,   1 1月  29 15:45 loop1
brw-rw----  1 root root      7,   4 3月  23 10:25 loop4
brw-rw----  1 root root      7,   5 3月  23 10:25 loop5
......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

从以上输出的列表可看出,每个设备文件原来显示文件大小的位置,现在使用两个逗号分隔的数字显示,这两个数字分别表示主设备号和从设备号。

主设备号用来表示设备使用的硬件驱动程序在系统中的序号。

从设备号是硬件驱动程序使用来区分不同的设备和判定对设备操作如何处理。

事实上,设备文件的名称并不是最重要,重要的是主设备号和从设备号,操作系统使用主设备号和从设备号确定硬件驱动程序,并与硬件驱动程序通信。