博客
关于我
(四)块设备文件
阅读量:386 次
发布时间:2019-03-05

本文共 4511 字,大约阅读时间需要 15 分钟。

文章目录

1.块设备文件

  • 在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列)
  • 操作这些不同的类型就像操作文件一样,比如增删改查等
  • 块设备是将信息存储在大小固定的块中,每一个块都有自己的地址,块设备支持随机访问。
    典型的块设备比如我们使用的硬盘

2.主设备号(major)与次设备号(minor)

  • 当一块磁盘被注册到操作系统的时候,会被分配主设备号与次设备号
  • 其中主设备号代表了该设备属于的类型,次设备号代表了该设备在操作系统中的唯一标识
  • 主设备号
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
  • 主设备号和次设备号小结
    主设备号:代表着某一类型的设备,比如SCSI硬盘、虚拟硬盘、USB等等
    次设备号:操作系统分配的整数,与主设备号一起(major,minor),组成了该设备在操作系统当中唯一的ID

3.块设备文件

  • 块设备文件是连接用户空间和内核空间的桥梁,通过块设备文件描述符,能够找到内核中的设备驱动程序
  • 通过内核中的驱动程序从而对该设备进行读写
   +----------------------+   | user space           |   |                      |   |      +---------+     |   |      | test.py |     |   |      +---------+     |   +----------------------+               |               |          +----v----+          |/dev/sda1|          +----+----+               |               |(8,1)               |+---------------------------------------------| kernel space |                             ||              |                             ||              v                             ||        +-----+----+      +---------------+ ||        | major:8  |      | device driver | ||        +-----+----+      |               | ||              |           +---------------+ |       +--------+|              +---------->|  minor:1      |-------->| device ||                          +---------------+ |       +--------+|                          |               | ||                          +---------------+ |+--------------------------------------------+

4.测试

  • 首先虚拟一个块设备文件
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
  • 测试脚本:准备一个python文件,每秒往test.log写入hello wangji
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

5.总结

  • 当块设备挂载的时候,会先在操作系统的/dev下创建一个块设备文件,并且分配主设备号与次设备号
  • 块设备文件是连接用户空间和内核空间的桥梁,应用程序通过它能够找到在内核中的设备驱动,从而实现对设备的读写

参考:

https://www.cnblogs.com/MrVolleyball/p/9993137.html

转载地址:http://qoyzz.baihongyu.com/

你可能感兴趣的文章
MapReduce实验
查看>>
Leaflet 带箭头轨迹以及沿轨迹带方向的动态marker
查看>>
java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式
查看>>
java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式
查看>>
大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?
查看>>
[apue] popen/pclose 疑点解惑
查看>>
[apue] getopt 可能重排参数
查看>>
移动互联网恶意软件命名及分类
查看>>
adb shell am 的用法
查看>>
PySide图形界面开发(一)
查看>>
Android如果有一个任意写入的漏洞,如何将写权限转成执行权限
查看>>
三角网格体积计算
查看>>
现代3D图形编程学习-基础简介(2) (译)
查看>>
Github教程(3)
查看>>
vue实现简单的点击切换颜色
查看>>
vue3 template refs dom的引用、组件的引用、获取子组件的值
查看>>
深入浅出mybatis
查看>>
Zookeeper快速开始
查看>>
882. Reachable Nodes In Subdivided Graph
查看>>
402. Remove K Digits
查看>>