Linux中的主设备号

由于工作中某个需求,需要使用Cgroups对某个进程的IO进行限制。所以,需要在Cgroup的blkio子系统中进行配置,我们限制的是读取磁盘的iops,所以,需要在blkio.throttle.write_iops_device中写入该限制。

echo "8:0 10" > /cgroup/blkio/test/blkio.throttle.read_iops_device

这里,对sda的read iops进行了限制,上限为10次IO操作每秒。

如何获得

于是就产生了一个疑问,这里的”8:0”是什么?为什么对sda进行限制需要使用”8:0”这个奇怪的代号?这个”8:0”又是怎么得到的?

首先说一下”8:0”是如何得到的。在Linux系统下,可以使用:

# ls -l /dev/sd*
brw-rw----. 1 root disk 8, 0 Dec 27 20:23 /dev/sda
brw-rw----. 1 root disk 8, 1 Dec 27 20:23 /dev/sda1
brw-rw----. 1 root disk 8, 2 Dec 27 20:23 /dev/sda2

可以看到,/dev/sda前面有一个标志”8, 0”,这个就是我们要限制的设备的设备号。

为什么是8:0

对于Linux系统/dev/下的所有文件,都是由驱动程序去注册,方便对对应的设备进行调用的。

# ls -l /dev/
total 0
drwxr-xr-x. 2 root root         640 Dec 27 20:23 block
drwxr-xr-x. 2 root root          80 Dec 27 20:23 bsg
crw-------. 1 root root     10, 234 Dec 27 20:23 btrfs-control
drwxr-xr-x. 3 root root          60 Dec 27 20:23 bus
lrwxrwxrwx. 1 root root           3 Dec 27 20:23 cdrom -> sr0
drwxr-xr-x. 2 root root        2660 Dec 27 20:24 char
crw-------. 1 root root      5,   1 Dec 27 20:23 console
lrwxrwxrwx. 1 root root          11 Dec 27 20:23 core -> /proc/kcore
drwxr-xr-x. 4 root root          80 Dec 27 20:23 cpu
crw-rw----. 1 root root     10,  61 Dec 27 20:23 cpu_dma_latency
crw-rw----. 1 root root     10,  62 Dec 27 20:23 crash
...

可以看到,在/dev下有各种各样的“文件”,这些文件各有不同,这些都是驱动程序注册的一个虚拟的文件。

那这些驱动在哪里呢?系统中有一个/proc/deveices文件:

# cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
...

Block devices:
1 ramdisk
259 blkext
7 loop
8 sd
9 md
11 sr
...

可以看到,有2种设备,Character device和Block device,字符型设备和块设备,字符型设备可以按字符去读取,而块设备一次读取必须是一整块数据。
在设备前面的数字,就是主设备号了,可以看到8这个主设备号属于Block device,驱动程序是sd,也就是SCSI disk。
Kernel Documentation中,对这些编号都有比较明确的说明,当然,如果是自己编写的驱动程序,也是可以向系统申请到一个编号的。
在文档中可以看到:

8 block	SCSI disk devices (0-15)
      0 = /dev/sda		First SCSI disk whole disk
     16 = /dev/sdb		Second SCSI disk whole disk
     32 = /dev/sdc		Third SCSI disk whole disk
        ...
    240 = /dev/sdp		Sixteenth SCSI disk whole disk

    Partitions are handled in the same way as for IDE
    disks (see major number 3) except that the limit on
    partitions is 15.

8被SCSI disk devices所占用,可以表示前16个SCSI设备,每个设备最多存在15个分区。而我们的服务器就是SCSI接口的硬盘,所以,8:0就是代表了sda本身,而8:1则是sda1,依次类推。