partprobe源码分析
partprobe工具
操作系统目录/usr/sbin/partprobe
程序安装包parted-3.1-17.el7.x86_64.rpm
命令用法:
partprobe
是用来告知操作系统内核 分区表发生变化的工具,告知方式是请求内核重读分区表
选项如下:
-d
不会让内核重读分区表,分区表发生变化后使用该命令partproe -d /dev/sdi
不会告知内核分区发生了变化
-s
先让内核重读分区表,再显示设备已拥有的分区信息
[root@node1 ~]# partprobe -s /dev/hda
/dev/hda: msdos partitions 1 2 3 4 <5 6 7 8 9> #4分区为扩展分区,符号<内部的分区为逻辑分区
-h
显示帮助选项信息
-v
显示程序的版本信息
源码分析
partprobe
主要操作是 告知操作系统内核 磁盘分区表发生了变化,接下来操作由内核完成。内核会先删除当前系统缓存中的磁盘分区表,然后重新从磁盘中读取分区表,主要通过io驱动函数ioctl来完成
执行partprobe
命令基本代码流程如下:
- 正常的
getopt_long
函数的命令行解析 - 根据是否传入磁盘进行判断,如果传入磁盘,如
partprobe /dev/sdb
则进行磁盘处理;如未传入制定磁盘,则先获取到当前设备所有的磁盘,并加入到链表中,然后顺序执行分区表处理
partprobe.c
中的主函数处理如下int n_dev = argc - optind; //获取是否传入磁盘参数 if (n_dev != 0) {//如果传入则一个一个处理int i;for (i = optind; i < argc; i++) { PedDevice *dev = ped_device_get (argv[i]);if (dev == NULL || process_dev (dev) == 0) //process_dev分区处理的主函数status = 1;} } else {//否则先获取当前设备所有磁盘ped_device_probe_all ();//将获取到的磁盘加入到全局链表中PedDevice *dev;for (dev = ped_device_get_next (NULL); dev;//遍历链表,一个一个顺序执行分区检测dev = ped_device_get_next (dev))if (process_dev (dev) == 0)status = 1; }
- 从磁盘将分区表读到内存中,并告知操作系统内核分区表的布局
static int process_dev (PedDevice* dev) {PedDiskType* disk_type;PedDisk* disk;disk_type = ped_disk_probe (dev); //获取分区类型,gpt?msdos?if (!disk_type || !strcmp (disk_type->name, "loop"))return 1;/*创建一个新的分区表,并存放在内存中。当调用ped_disk_commit_to_dev函数,由内核决定是否写入磁盘*/disk = ped_disk_new (dev);if (!disk)goto error;/*该参数为我们的-d参数,即partprobe -d /dev/sdb 表示不会执行告知内核磁盘分区情况的操作,如传入-d参数,则当前数值为1*/if (!opt_no_inform) { if (!ped_disk_commit_to_os (disk)) //内核操作的主函数goto error_destroy_disk;}/*该参数表示 partprobe -s参数,执行是否打印磁盘分区信息的操作*/if (opt_summary)/*打印当前磁盘分区的情况*/summary (disk);ped_disk_destroy (disk);return 1;error_destroy_disk:ped_disk_destroy (disk); error:return 0; }
- 内核操作分区表版本如下,
ped_disk_commit_to_os
函数操作- 在内核版本为2.4之前,partprobe会调用BLKRRPART ioctl函数让内核重读分区表
- 在2.4.x之后的内核已经更改为使用新的blkpg接口告诉内核每一个磁盘分区的起始,结束地址。所以,在新版本内核中,不会因为分区表类型不同而无法读取磁盘分区表
//通过ped_disk_commit_to_os 函数调用的回掉函数disk_commit(disk)进行内核分区的处理 ped_disk_commit_to_os(PedDisk* disk){...if (!ped_architecture->disk_ops->disk_commit (disk)) }PedDiskArchOps linux_disk_ops = {partition_get_path: linux_partition_get_path,partition_is_busy: linux_partition_is_busy,disk_commit: linux_disk_commit //通过改数据结构调用linux_disk_commit函数进行处理 };/*告知内核磁盘分区的布局*/ static int linux_disk_commit (PedDisk* disk) {if (!_has_partitions (disk))return 1; /*若系统支持逻辑卷方式管理磁盘,且磁盘分区类型为支持dm,一般为msdos格式即mbr分区,则重读分区表。一半存放在/dev/mapper目录*/ #ifdef ENABLE_DEVICE_MAPPER if (disk->dev->type == PED_DEVICE_DM)return _dm_reread_part_table (disk); #endif/*如果设备类型为普通文件类型,即文件形式存放的,一般为我们的gpt分区类型的磁盘*/if (disk->dev->type != PED_DEVICE_FILE) {/*要求当前内核支持blkpg的新特性,即使用blkpg接口告知内核磁盘分区表的起始地址,不需要内核自己去读。如果当前内核不支持该特性,或者这里发现有断言退出,可以直接将改行注释掉*/assert (_have_blkpg ());/*内核同步磁盘分区表的主函数*/if (!_disk_sync_part_table (disk)) return 0;}return 1; }
- 内核同步磁盘分区表的操作,即我们partprobe的主要操作
- 通过io设备驱动程序的通道管理函数ioctl,先从内核移除所有的分区表。但是当ioctl执行失败时,不会对此时失败的分区表进行移除
- 从我们遍历到的磁盘中添加分区表。如果我们因为第一步移除分区表的失败无法添加(因为使用的是blkpg新特性,移除以及添加需要保证分区表的起始结束地址一直才能确定执行成功),则进行告警
static int _disk_sync_part_table (PedDisk* disk) {.../*从/sys/block/dev_name/range文件中获取当前系统支持的单个磁盘最大分区数量,如果获取不到,则使用默认的64*/lpn = _device_get_partition_range(disk->dev);.../*对当前磁盘执行分区删除操作通过调用_blkpg_part_command(disk->dev, &linux_part,BLKPG_DEL_PARTITION)函数执行ioctl (arch_specific->fd, BLKPG, &ioctl_arg)的分区删除操作*/_blkpg_remove_partition (disk, j + 1);.../*同样通过_blkpg_part_command (disk->dev, &linux_part,BLKPG_ADD_PARTITION)函数执行ioctl (arch_specific->fd, BLKPG, &ioctl_arg)的分区添加操作*/_blkpg_add_partition (disk, part);/*根据执行的结果是否抛出异常进行告警*/ }
关于常见的两种问题的告警描述如下:
- "Error informing the kernel about modifications to "
"partition %s – %s. This means Linux won’t know "
"about any changes you made to %s until you reboot "
"-- so you shouldn’t mount it or use it in any way "
"before rebooting.
该问题为内核向磁盘添加分区过程中ioctl程序执行失败,一般为当前分区表x相关元数据信息错误 - Partition(s) %s on %s have been written, but we have "
"been unable to inform the kernel of the change, "
"probably because it/they are in use. As a result, "
"the old partition(s) will remain in use. You "
"should reboot now before making further changes.
该问题为内核删除分区表时出现,因为分区仍然被占用,无法从缓存中清除该分区的起始和结束地址导致。
相关文章:

数据库和服务器什么协议,数据库服务器协议
数据库服务器协议 内容精选换一换本章节适用于MRS 3.x之前版本。Loader支持以下多种连接,每种连接的配置介绍可根据本章节内容了解。obs-connectorgeneric-jdbc-connectorftp-connector或sftp-connectorhbase-connector、hdfs-connector或hive-connectorOBS连接是Lo…

VC实用小知识总结 (一),转http://blog.csdn.net/myiszjf/article/details/10007431
在上一篇中,我们以经介绍了程序的流程和框架,在本篇将详细讨论各个功能的实现主要包括1.获取磁盘信息2.获取目录信息3.获取文件信息4.运行指定文件5.删除指定文件6.删除指定目录7.创建指定目录8.上传下载文件9.获取远程文件图标获取磁盘信息磁盘信息可以用API GetDriveType来实…

Linux下快速分区格式化大于2T大容量存储
在生产环境中,我们会遇到分区大于2T的磁盘(比如:添加一个10TB的存储),由于MBR分区表只支持2T磁盘,所以大于2T的磁盘必须使用GPT分区表,而我们在做raid时会划分多个VD来进行装系统,但…

ubuntu18.04 Desktop版本部署13.2.6版本ceph
文章目录选择系统安装系统网络配置CEPH部署想要查看版本较高的ceph在进行录像业务存储且在磁盘占用率在70%左右时且ceph底层出现slow_request是否会对上层录像业务造成显性影响 所以需要在ubuntu 18.04版本部署mimic版本ceph,先将部署步骤描述如下: 选…
java获取ajax上传的文件,Java使用Ajax异步上传文件
相关代码示例:html代码片段:名称class"layui-input">描述文件请选择配置文件立即提交重置js代码片段://上传配置文件$("#save_config_file").click(function () {var name $("#config_name").val();var desc $("#config_desc").v…

hdu 1423
最长公共上升子序列:O(n*m)的算法; 1 #include<cstdio>2 #include<cstring>3 #define maxn 10004 using namespace std;5 int a[maxn],b[maxn],f[maxn];6 int main()7 {8 int t,n,m;9 scanf("%d",&t); 10 while(t…

从HP发布BSM新版套件看网管与安管的融合
2012年11月底,HP发布了新版的BSM套件。在这个新的套件有一个BSM与ArcSight Logger整合的方案。我之前在RSA2012大会观后感系列文章中也提及过HP的这个动向,就是将网管与安管整合的动向。他们正在按部就班地进行中。不过,由于他们的身躯过于庞…

PHP学习课程和培训方向学习路线分享
PHP学习课程和培训方向学习路线分享 php语言的优越性,集结了很多的开发爱好者,无论行业前景和个人发展来说,php正飞速的发展,php在不断兼容着类似closures和命名空间 等技术,同时兼顾性能和当下流行的框架。版本是7之后…

编译ceph源码:cython module not found问题的解决
环境:centos7.5 ceph版本:12.2.1 在当前环境对ceph源码rpm包进行重新编译 执行命令rpmbuild --rebuild ceph-12.2.1-0.el7.src.rpm 最后出现错误如下: Could not find cython3. Please install Cython. 查看此时对Cython3模块的编译规则 vim /BUILD/ce…

把mysql 中的字符gb2312 改为gbk的方法
第一步:查找mysql的字符: mysql> show variables like %char%;------------------------------------------------------------| Variable_name | Value |------------------------------------------------------------|…

1h2g云服务器做网站,云服务器1h2g
云服务器1h2g 内容精选换一换IP地址组是多个IP地址的集合,可被安全组规则引用,可统一管理具有相同安全要求或需要频繁修改的IP地址。通过使用IP地址组,可有效应对需要重复多次编辑安全组规则的场景,方便管理。您需要先创建一个IP地…

×××S:Reporting Services 技巧
S:Reporting Services 技巧 表达式 1、序号:RunningValue(1, sum, nothing) 2、总记录数: CountRows() 3、今天日期:Today 4、本月初:CDate(Now().ToString("yyyy-MM-01")) 5、换行效果(<br/&…

vim 常用指令
1 移动光标 光标动作 hjkl,方向键 移动一位,hjkl代表左、下、上、右 数字0 移至本行开头 ^ 移至本行第一个非空字符,匹配开头 $ 移至本行结尾,可以包含空格 w 移至下一单词或标点的开头…

ceph osd 由于“No space left on device” 异常down,通过扩容文件系统或者显式运行osd进程解决
文章目录ceph版本:环境配置:异常问题:问题解决:总结ceph版本: ceph 12.2.1 环境配置: tier_pool 16个分区大小800G 的osd容量 3副本 data_pool 32个4T盘 3副本 异常问题: ps:在分布式存储中遇到任何问题都不要先…

java云服务器系统选择,java云服务器系统选择
java云服务器系统选择 内容精选换一换登录Windows操作系统弹性云服务器时,无法正常进入系统。自启动系统修复模式,但选择修复选项后报错,无法继续进行系统恢复。Windows文件已损坏。登录管理控制台,选择“计算 > 弹性云服务器”…

WordPress数据库优化技巧
各位站长都知道wordpress用久了就会越来越慢。今天就给大家介绍如何给自己的wordpress提速,分两种方法:1.插件属性wordpress的都知道其插件是相当的多,只要你能想得到的基本都有,在这给大家介绍几个小编知道的插件:WP-…

【JDK7】新特性(2) 语法
2019独角兽企业重金招聘Python工程师标准>>> JDK7对Java语法有少量更新,重点是在易用性和便捷性的改进。 1.二进制字面量 JDK7开始,终于可以用二进制来表示整数(byte,short,int和long)。使用二进制字面量的好处是&am…

AtcoderCodeForces杂题11.6
Preface NOIP前突然不知道做什么,感觉思维有点江僵化,就在vjudge上随便组了6道ABC DCF Div2 C/D做,发现比赛质量还不错,知识点涉及广,难度有梯度,码量稍小,思维较多. 同时发现vjudge的比赛功能很不错 A. ABC112-D-Partition 难度感觉比NOIP T1简单了些了 首先naiive的想法是枚举…

centos下将vim配置为强大的源码阅读器
每日杂事缠身,让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具,每次熟悉源码都需要先在windows端改好,拖到linux端,再编译。出现问题,还得重新回到windows端,这个过程太耗费时间。 vim作为…

虚拟机看服务器mac地址,虚拟机修改服务器mac地址吗
虚拟机修改服务器mac地址吗 内容精选换一换本章节指导用户为Windows系统的ECS主机添加域名解析并添加安全组,防止下载Agent安装包与采集监控数据时出现异常。修改ECS的DNS配置有两种方式:Windows图形化界面和管理控制台。您可以根据自己的使用习惯选择其…

条件注释判断浏览器!--[if !IE]!--[if IE]!--[if lt IE 6]!--[if gte IE 6]
条件注释判断浏览器<!--[if !IE]><!--[if IE]><!--[if lt IE 6]><!--[if gte IE 6]> <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--><!--[if IE]> 所有的IE可识别 <![endif]--><!--[if IE 6]> 仅IE6可识…

USACO09FEB Fair Shuttle
题目传送门 据说\(NOIp\)前发题解可以\(\mathfrak{RP}\) 因为要尽可能满足更多奶牛,所以按照这种区间贪心题的套路,先按右端点排序,然后依次遍历,能坐车的就让它们坐车,这样一定是最优的。 在贪心的时候,我…

diy高性能存储服务器,diy存储服务器
diy存储服务器 内容精选换一换帮助用户完成专属云服务器备份任务的创建,快速完成服务器数据保护。专属云服务器不支持应用一致性备份。当专属对象存储的容量不足时,会导致专属云服务器备份创建失败。已开通专属对象存储。登录管理控制台。单击࿰…

使用内存盘 格式化文件系统以及部署ceph-osd
文章目录创建RAMDISK使用内存盘使用内存盘格式化文件系统使用内存盘部署ceph-osd删除内存盘为了测试内存盘类型的磁盘做ceph osd的io性能,将内存部分空间取出来用作普通物理磁盘(RAMDISK),并在该磁盘上部署ceph osd支持该操作的系统驱动为brd.koPS &…

iBatis的CRUD操作详细总结
昨天晚上看了一下关于iBatis的一个讲解的视频,讲的和我的这个简单的总结差不多.... 思考了一下还是把主要操作都总结一下吧,当然这里也不是全的,知识简单的CRUD。。。 首先我觉得持久层的操作主要就是这几个: public interface IP…

min聚合函数查询带有额外字段sql|dense_rank()over(partition)|+班级学生成绩最高
oracle爱好者和群snowg的问题 上面的这个,有站点stationid,year,month,day和每天记录的day_tmin字段。现在要求统计处每个stationid下面每月每日的最小day_tmin字段,因为不关注year,所以sql这样写 select …

提升jmeter自身性能
JMeter负载测试时使用GUI界面和较多的收集测试结果的监听器容易造成jmeter的性能瓶颈,远程测试时的控制台尤为明显。提升JMeter负载测试时性能的方法如下: 官方的解决办法:http://jakarta.apache.org/jmeter/usermanual/best-practices.html#…

C++ STL的reserve函数
在阅读ceph源码过程中发现部分C语法还是不够熟悉,特此做一下笔记。 关于STL中的reserve函数的使用 reserve()是为容器预留空间,即为当前容器设定一个空间分配的阈值,但是并不会为容器直接allocate具体的空间,具体空间的分配是在创…

AJAX进行分页
新建数据集:PagingDataSet.xsd SELECT * from ( select id, areaID, area, father,Row_Number() over (order by areaID) rownum FROM dbo.area) t where t.rownum >startRowIndex and t.rownum <endRowIndex在集合中添加两个参数: startRowIndex…

华为服务器引入清空外部配置文件,云服务器还原配置文件
云服务器还原配置文件 内容精选换一换外部镜像文件在从原平台导出前,没有按照“Windows操作系统的镜像文件限制”的要求完成初始化操作,推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN Guest OS driver(PV driver)和K…