linux一切皆文件之块设备文件(四)

一、知识准备

1、在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列)

2、操作这些不同的类型就像操作文件一样,比如增删改查等

3、块设备是将信息存储在大小固定的块中,每一个块都有自己的地址,块设备支持随机访问。典型的块设备比如我们使用的硬盘

二、环境准备

组件 版本
OS Ubuntu 16.04.4 LTS

三、主设备号(major)与次设备号(minor)

● 当一块磁盘被注册到操作系统的时候,会被分配主设备号与次设备号

● 其中主设备号代表了该设备属于的类型,次设备号代表了该设备在操作系统中的唯一标识

主设备号

[email protected]:~# ls -l /dev/sd*
brw-rw---- 1 root disk 8,  0 9月  30 17:47 /dev/sda
brw-rw---- 1 root disk 8,  1 9月  30 17:47 /dev/sda1

sda的主设备号是8,代表了sda这块磁盘是属于8这个类型的,那8是什么类型的?

[email protected]:~# grep 8 /proc/devices
108 ppp
128 ptm
248 pps
  8 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/sda

8,1 代表了/dev/sda1

小结一下:

主设备号:代表着某一类型的设备,比如SCSI硬盘、虚拟硬盘、USB等等

次设备号:操作系统分配的整数,与主设备号一起(major,minor),组成了该设备在操作系统当中唯一的ID

四、块设备文件

● 块设备文件是连接用户空间和内核空间的桥梁,通过块设备文件描述符,能够找到内核中的设备驱动程序

● 通过内核中的驱动程序从而对该设备进行读写

   +----------------------+
   | user space           |
   |                      |
   |      +---------+     |
   |      | test.py |     |
   |      +---------+     |
   +----------------------+
               |
               |
          +----v----+
          |/dev/sda1|
          +----+----+
               |
               |(8,1)
               |
+---------------------------------------------
| kernel space |                             |
|              |                             |
|              v                             |
|        +-----+----+      +---------------+ |
|        | major:8  |      | device driver | |
|        +-----+----+      |               | |
|              |           +---------------+ |       +--------+
|              +---------->|  minor:1      |-------->| device |
|                          +---------------+ |       +--------+
|                          |               | |
|                          +---------------+ |
+--------------------------------------------+

五、测试

(a)首先虚拟一个块设备文件

[email protected]:~# dd if=/dev/zero of=/tmp/device_test bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.0890014 s, 1.2 GB/s
[email protected]:~# mknod /dev/device_test b 7 80
[email protected]:~# losetup /dev/device_test /tmp/device_test

我们已经虚拟出一个块设备文件了,由于是通过losetup虚拟出来的,所以major号只能为7

下面将该块设备格式化、挂载:

[email protected]:~# mkfs.ext4 /dev/device_test
mke2fs 1.42.13 (17-May-2015)
Discarding device blocks: done
Creating filesystem with 102400 1k blocks and 25688 inodes
Filesystem UUID: f38c24be-851b-41ff-8d55-4e692d5a4c83
Superblock backups stored on blocks:
    8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

[email protected]:~# mount /dev/device_test /mnt
[email protected]:~# df -h | grep /mnt
/dev/device_test   93M  1.6M   85M   2% /mnt
[email protected]:/mnt# ls -l /dev/device_test
brw-r--r-- 1 root root 7, 80 Nov 12 09:54 /dev/device_test

至此,我们拥有了一个块设备,并且大小为100M

(b)测试脚本

准备一个python文件,每秒往test.log写入hello world

[email protected]:/mnt# more device_test.py
import time
f = open(‘test.log‘,‘a+‘)
while 1:
    f.write(‘hello world\n‘)
    time.sleep(1)

运行并查看其打开的文件描述符

[email protected]:/mnt# python device_test.py &
[1] 25873
[email protected]:/mnt# lsof -n | grep 25873
COMMAND     PID   TID             USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
...
python    25873                   root    3u      REG               7,80      8923         14 /mnt/test.log

整理一下我们的信息:

● 首先运行脚本,它的进程号为25873。脚本的逻辑是需要打开test.log,然后进行读写

● 由于脚本中是相对路径,并且当前目录在/mnt下,/mnt相关联的硬盘是/dev/device_test

● 进程通过/dev/device_test拿到了该设备的设备号(7,80)

● 通过设备号在内存中找到对应的设备驱动程序,然后通过设备驱动程序对块设备进行读写

● 在块设备上没有发现test.log,首先创建一个,然后开始对该文件每秒写入一句‘hello world‘

六、小结

● 当块设备挂载的时候,会先在操作系统的/dev下创建一个块设备文件,并且分配主设备号与次设备号

● 块设备文件是连接用户空间和内核空间的桥梁,应用程序通过它能够找到在内核中的设备驱动,从而实现对设备的读写



至此,本文结束

在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

原文地址:https://www.cnblogs.com/MrVolleyball/p/9993137.html

时间: 2024-10-28 09:44:45

linux一切皆文件之块设备文件(四)的相关文章

linux中普通文件和块设备文件的区别

1,基本概念 普通文件(Regular File).指普通意义上的文件,如数据文件.可执行文件等. 设备文件(Device File).类unix操作系统都是基于文件概念的,文件是由字节序列而构成的信息载体.根据这一点,可以把IO设备当作设备文件这种所谓的特殊文件来处理:因此,与磁盘上的普通文件进行交互所用的同一系统调用可直接用于IO设备.根据设备驱动程序的基本特征,设备文件可以分为两种:块和字符.这两种硬件设备之间的差异并不容易划分,但我们至少可以假定以下的差异:[1] · 块设备的数据可以随

linux文件类型:设备文件、mknod创建设备文件

设备文件: 块设备文件b: 按块为单位,随机访问的设备: 字符设备文件c:按字符为单位,线性设备: 常见的块设备文件b: 硬盘 硬盘设备的设备文件名:    IDE ,ATA: hd    SATA.SCSI.USB:sd          a,b,c,...来区分同一类型下的不同设备 IDE: 第一个IDE口:主.从 /dev/hda, /dev/hdb 第二个IDE口:主.从 /dev/hdc, /dev/hdd SD:  sda, sdb, sdc,... hda: hda1: 第一个主分

LINUX中块设备文件和字符设备文件的本质区别

在LINUX系统文件类型分类的文章中我们提到了 块设备 和 字符设备文件,那么什么是块设备 字符设备文件呢?他们之间有什么本质上的区别呢? 设备文件分为 Block(块) Device Driver 和 Character(字符)Device Drive 两类.Character Device Drive又被称为字符设备或裸设备 raw  devices. Block Device Driver称为块设备. 区别: Block Device Driver 是以固定大小长度来传送转移资料,Char

文件作为块设备访问

1. loop设备介绍 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备.它能使我们像块设备一样访问一个文件.在使用之前,一个 loop 设备必须要和一个文件进行连接.这种结合方式给用户提供了一个替代块特殊文件的接口.因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来.    上面说的文件格式,我们经常见到的是 CD 或 DVD 的 ISO 光盘镜像文件或者是软盘(硬盘)的 *.img 镜像

.用 Shell 编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目 录下

#!/bin/bash  read  -p "Please input a file name" FILENAME  if [ -c "$FILENAME" ];then      cp $FILENAME /dev  else      echo "The $FILENAME is not a char device!!!"   fi

Linux磁盘管理之设备文件详解04

Linux一切接文件,除了普通文件和目录文件,还包括一些其它的特殊文件:块设备文件.字符设备文件.套接字文件.链接文件等.今天这里主要说一下常见的块设备文件和字符设备文件,这2类是最常见的设备文件类. 设备常见有鼠标.键盘.显示器.硬盘等等.其中硬盘是块设备,鼠标.键盘.终端等是属于字符设备.这些设备在linux中也是以文件形式存在,存在于目录/dev/中,这些设备文件不占磁盘块空间,只用一个inode来表示即可,主要记录设备文件的一些信息,包括主设备号和次设备号等信息.主设备号指的是设备主类型

Linux: Linux的文件类型及查看文件类型的方法

Linux文件类型和文件的文件名所代表的意义是两个不同的概念,在linux中文件类型与文件扩展名没有关系.它不像Windows那样是依靠文件后缀名来区分文件类型的,在linux中文件名只是为了方便操作而的取得名字.Linux文件类型常见的有:普通文件.目录.字符设备文件.块设备文件.符号链接文件等. 一 常见的文件类型 1,普通文件类型 Linux中最多的一种文件类型, 包括 纯文本文件(ASCII):二进制文件(binary):数据格式的文件(data);各种压缩文件.第一个属性为 [-] .

linux 基本命令常用选项(目录和文件)

命令类型: 内置命令(shell内置),内部,内建 外部命令:在文件系统的某个路径下有一个与命令名称相应的可执行文件 man COMMAND: 分章节: 1:用户命令(/bin, /usr/bin, /usr/local/bin) 2:系统调用 3:库用户 4:特殊文件(设备文件) 5:文件格式(配置文件的语法) 6:游戏 7:杂项(Miscellaneous) 8: 管理命令(/sbin, /usr/sbin, /usr/local/sbin) MAN: NAME:命令名称及功能简要说明 SY

十六、文件和目录——设备特殊文件

16.1 设备特殊文件介绍 每个文件系统所在的存储设备都由主.次设备号表示,文件系统为设备文件 major 和 minor 这两个宏可用来获得主.次设备号.所有文件都由对应的主设备号和次设备号,可以通过 st_dev 加这两个宏获得 只有字符特殊文件和块特殊文件俺才有 st_rdev 值,其他的设备一般都是 st_dev ,这个两个值都在 stat 结构体中 8 为主设备号,1为次设备号 16.2 例子 1 #include <unistd.h> 2 #include <fcntl.h&