linux 如何查看 块设备_理解Linux操作系统中的块设备
块设备也就是存储以“块”为单位数据的设备,比较典型的如磁盘设备、光盘或者优盘。本文首先集中在磁盘设备的相关内容的分析,其它设备类型很类似,暂时不做介绍。 在Windows操作系统下磁盘设备似乎是一个实实在在的设备,我们可以通过图形界面对磁盘设备进行管理。如图1是Windows下的磁盘管理界面,可以通过这个界面清晰的看到磁盘设备,并且可以对其进行格式化等操作。
Linux操作系统的磁盘设备并不直观,在LInux系统中“一切皆文件”的理念下,磁盘设备其实也是一个文件,只不过是一个比较特殊的文件。如图2是某些磁盘和分区的文件路径,其中黄色字体部分是磁盘的路径,而前面红色方框内的b
表示这个文件是磁盘设备文件,而非普通文件。
磁盘设备文件也是位于VFS(虚拟文件系统)下面,与Ext4等文件系统类似。用户层面可以用访问普通文件的接口(API)访问磁盘。如下代码是用Python实现的一个向磁盘写入字符串的程序。代码很简单,就是打开磁盘所在的路径(path),然后调用write
函数写数据。
import os, sys def write_file(filename, data):fd = file(filename, "a+")fd.write(data)fd.close()write_file("/dev/sdb", "itworld123")
Linux系统中磁盘的本质
通过上面的描述我们知道对于Linux操作系统来说,磁盘就是一个文件。而磁盘本身就是一个线性存储空间(可以理解为一个大数组),这种方式与文件也是非常类似的。鉴于上述相似性,Linux将磁盘设备抽象为一个文件并没有任何不妥之处。 实质上,在Linux操作系统磁盘设备是基于一个称为bdev
的伪文件系统来管理的,bdev文件系统是一个在内存中的伪文件系统(在内存的文件系统,无持久化的数据),位置与Ext4等文件系统相同。如图3所示,bdev文件系统的位置为图中红色区域。
理解了块设备的管理方式,再结合我们之前对文件系统的相关介绍,这样就很容易理解后续的内容了。在文件系统相关文章介绍中我们知道,不同文件系统数据处理的关键是其提供的函数集,而这个函数集是在打开文件的时候确定的。磁盘设备也是如此,当我们打开磁盘设备时,操作系统根据磁盘设备的特性,会初始化inode中的函数集。而后续对该磁盘设备的读写操作就能通过该函数集完成。如下代码所示 ,块设备连同字符设备和管道都作为特殊的文件进行处理,并初始化对应的函数集。
void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
{inode->i_mode = mode;if (S_ISCHR(mode)) {inode->i_fop = &def_chr_fops;inode->i_rdev = rdev;} else if (S_ISBLK(mode)) { /*块设备函数集*/inode->i_fop = &def_blk_fops;inode->i_rdev = rdev;} else if (S_ISFIFO(mode))inode->i_fop = &pipefifo_fops;
... ...
完成函数集的初始化后,当用户调用VFS层的接口是,VFS层就可以找到具体的处理函数,进而完成用户的操作。这里的函数集与本地文件系统的函数集别无二致,差异在于普通文件系统需要管理目录和文件,而这里是将磁盘看作一个大文件。
磁盘的缓存
既然磁盘伪文件系统bdev本身也是一个文件系统,因此自然也可以有缓存。这个缓存就是用于提升磁盘性能的缓存系统。磁盘的缓存系统与文件系统的缓存系统类似,也是通过页缓存来实现的。当然,Linux磁盘的缓存是可以关闭的,此时将调用另外一套函数集。 这样说起来可能比较抽象,下面我们以一个具体的例子来看一下磁盘缓存的具体实现。如下是磁盘伪文件系统的函数集,我们以写数据为例进行介绍。
写数据的函数为blkdev_write_iter,该函数会调用generic_perform_write函数。如果大家阅读过本号关于文件系统的文件的话,很清楚后者就是VFS中向页缓存写数据的函数。也就是说块设备伪文件系统的逻辑与本地文件系统完全一致。
linux 如何查看 块设备_理解Linux操作系统中的块设备相关推荐
- linux如何查看jupyter日志_在Linux服务器上运行Jupyter notebook server教程
在Linux服务器上运行Jupyter notebook server教程 很多deep learning教程都推荐在jupyter notebook运行python代码,方便及时交互.但只在本地运行 ...
- linux下查看进程的线程数,linux查看进程的线程数
top -H -p $PID #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...
- 在华硕玩家国度魔霸新锐2021的Windows 11操作系统中禁用BitLocker设备加密
在华硕玩家国度魔霸新锐2021的Windows 11操作系统中禁用BitLocker设备加密 How to disable BitLocker on Windows 11 for ASUS ROG S ...
- html块级标签转换,html标签中的块级元素详解
今天,我们就讲解一下html标签中的块级元素,主要包括块级元素的概念.作用.特点,还有就是块级元素有哪些标签等内容. 块级元素概念 块级元素是一类css样式display默认值为block的html标 ...
- linux 虚拟机大量udp请求失败_理解 Linux 网络栈:Linux 网络协议栈简单总结分析...
1. Linux 网络路径 1.1 发送端 1.1.1 应用层 (1) Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的.Linu ...
- Linux查看tomcat服务进程号,linux如何查看tomcat进程_网站服务器运行维护
linux查看端口命令是什么_网站服务器运行维护 linux查看端口命令有两种,分别是"lsof -i:"和"netstat -nltp | grep",其中参 ...
- linux如何查看mac地址_查看mac地址 linux_linux查看mac地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNXpHnwK-1660924515521)(http://img2.nlrsq.com/upfile/b13fd480 ...
- iptables命令_理解 Linux 下的 Netfilter/iptables
Netfilter/iptables 项目由 Rusty Russe 创建于1998年,并于 1999 年建立了 Netfilter Core team,并在此后负责维护此项目,同时也于2000年3月 ...
- linux下camera驱动分析_《Linux设备驱动程序》(五)——字符设备驱动(下)
上一节介绍了字符驱动中的一些概念,这一节我们将会基于系统内存编写一个字符设备驱动,加深对上一节中的概念的理解. 本节主要学会的内容: 字符设备注册 对设备节点进行cat和echo操作 驱动设计 编写驱 ...
- arm linux udp 自发自收_嵌入式linux编程开发必备知识
嵌入式linux是嵌入式开发必不可少的一份子,在科技高速发展的今天,嵌入式已然已经成为了最热门的技术之一了.对于想要学习好嵌入式的学员来说,现在学习好linux是很有必要的,因为这个是嵌入式的核心.那 ...
最新文章
- [洛谷P4722]【模板】最大流 加强版 / 预流推进
- linux之sed命令的用法
- js循环判断有无重复值_JavaScript中的while循环
- python3多线程异步爬虫_python3爬虫中多线程进行解锁操作实例
- 《孵化皮克斯》读书第三天
- JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令
- 阿里云更新ESC镜像
- appium学习链接记录
- 世纪互联蓝云柯文达:与更多海外云服务商共赢中国市场
- QML Item定位器 Anchor
- 2021年高处安装、维护、拆除复审考试及高处安装、维护、拆除模拟考试题
- VelocityTracker简单用法
- 用python计算有效前沿_【投资组合理论】Python绘制上证50成分股有效前沿和CML
- Express脚手架
- 普通文档怎么换成php,wps只读文档怎么修改为普通文档
- Oriented R-CNN完整复现HRSC2016以及训练自己的HBB数据集(DIOR)
- get_post X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?
- CANopen基本原理及其应用(二)——对象字典和通讯机制
- Android 节操视频播放器jiecaovideoplayer使用
- LabelMe标注的.json文件批量转Dataset,通过查询到多种代码无法在我电脑上正常工作,发现他们有共同的报错,于是修改后能正常工作。
热门文章
- linux7.7 离线安装nfs客户端_Linux提权姿势二:利用NFS提权
- for...in、for...of、forEach()有什么区别
- Cesium 显示CZML数据
- js实现无刷新表单提交文件,将ajax请求转换为form请求方法
- Python2.7.3 学习——准备开发环境
- SCVMM 2012 R2---添加Hyper-V虚拟机
- 简单mysql主从配置
- 有趣的JavaScript数组
- 3、Keras中的顺序模型Sequential和函数式模型Model
- TypeError: type ‘types.GenericAlias‘ is not an acceptable base type