本文共 4511 字,大约阅读时间需要 15 分钟。
root@ubuntu:~# ll /dev/sd*brw-rw---- 1 root disk 8, 0 Nov 23 20:52 /dev/sdabrw-rw---- 1 root disk 8, 1 Nov 23 20:52 /dev/sda1brw-rw---- 1 root disk 8, 2 Nov 23 20:52 /dev/sda2brw-rw---- 1 root disk 8, 5 Nov 23 20:52 /dev/sda5sda的主设备号是8,代表了sda这块磁盘是属于8这个类型的root@ubuntu:~# grep 8 /proc/devices 89 i2c108 ppp128 ptm180 usb189 usb_device248 watchdog 8 sd 68 sd128 sd在/proc/devices告诉我们,8是属于sd类型的,那sd又是啥意思?打开 https://www.kernel.org/doc/Documentation/admin-guide/devices.txt 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 硬盘
由于/dev/sda做了1个分区/dev/sda1,再加上原有的/dev/sda,操作系统内核给二者打上了唯一的标记:8,0 代表了/dev/sda8,1 代表了/dev/sda1
+----------------------+ | user space | | | | +---------+ | | | test.py | | | +---------+ | +----------------------+ | | +----v----+ |/dev/sda1| +----+----+ | |(8,1) |+---------------------------------------------| kernel space | || | || v || +-----+----+ +---------------+ || | major:8 | | device driver | || +-----+----+ | | || | +---------------+ | +--------+| +---------->| minor:1 |-------->| device || +---------------+ | +--------+| | | || +---------------+ |+--------------------------------------------+
root@ubuntu:~# mknod /dev/device_test b 7 80root@ubuntu:~# losetup /dev/device_test /tmp/device_test 说明:mknod命令用于创建Linux中的字符设备文件和块设备文件,https://man.linuxde.net/mknodlosetup命令用来设置循环设备。循环设备可把文件虚拟成块设备,籍此来模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。https://man.linuxde.net/losetup
root@ubuntu:~# mkfs.ext4 /dev/device_test mke2fs 1.42.13 (17-May-2015)Discarding device blocks: done Creating filesystem with 102400 1k blocks and 25688 inodesFilesystem UUID: 4302c7a2-bef9-4dfb-8bb5-9de2e814ae92Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): doneWriting superblocks and filesystem accounting information: done root@ubuntu:~# mount /dev/device_test /mntroot@ubuntu:~# df -h|grep /mnt/dev/device_test 93M 1.6M 85M 2% /mntroot@ubuntu:~# ll /dev/device_test brw-r--r-- 1 root root 7, 80 Nov 23 22:03 /dev/device_test至此,我们拥有了一个块设备,并且大小为100M
root@ubuntu:/mnt# more device_test.py import timef=open('test.log','a+')while 1: f.write('hello wangji') time.sleep(1)
root@ubuntu:/mnt# python device_test.py &[1] 3105root@ubuntu:/mnt# lsof -n|grep 3105COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME...python 3105 root 3u REG 7,80 0 12 /mnt/test.log
整理一下我们的信息:
● 首先运行脚本,它的进程号为3105。脚本的逻辑是需要打开test.log,然后进行读写
● 由于脚本中是相对路径,并且在当前目录在/mnt下,/mnt相关联的硬盘是/dev/device_test
● 进程通过/dev/device_test拿到了该设备的设备号(7,80)
● 通过设备号在内存中找到对应的设备驱动程序,然后通过设备驱动程序对块设备进行读写
● 在块设备上没有发现test.log,首先创建一个,然后开始对该文件每秒写入一句’hello world’
卸载loop设备:
root@ubuntu:/dev# umount -f /mntlosetup -d /dev/device_test不行的话:首先:root@ubuntu:/mnt# fuser -k /mnt然后:root@ubuntu:/dev# rm -rf device_test
参考:
https://www.cnblogs.com/MrVolleyball/p/9993137.html
转载地址:http://qoyzz.baihongyu.com/