s-sgdisk源码分析 “--set-alignment=value分区对齐参数”
文章目录
- 边界对齐子命令使用
- 源码分析
- sgdisk.cc main函数入口
- gptcl.cc DoOptions解析并执行具体命令函数
- gpt.cc CreatePartition创建分区函数,设置起始扇区对齐
- gpt.cc Align分区对齐函数,设置起始扇区对齐
sgdisk
命令是由 gdisk-0.8.6-4.el7.x86_64
程序包安装sgdisk源码路径 https://github.com/Shihta/gdisk
边界对齐子命令使用
本节主要描述sgdisk源码中关于命令-a --set-alignment=value
的边界对齐逻辑描述,借此各位可以看到sgdisk命令集
的其他参数源码白编写的逻辑
该参数使用方式一般是在创建分区过程中使用
sgdisk --set-alignment=8 --new=1:0:2G --mbrtogpt -- /dev/sdb
这个命令是在/dev/sdb上创建一个编号为1,大小为2G的gpt分区,且start_sector是4K对齐的。sgdisk
底层做分区是以扇区为单位,同时设置边界对齐时单位是扇区,默认以1M(2048个扇区)为单位进行对齐,最小只能设置8个扇区对齐
源码分析
sgdisk.cc main函数入口
int main(int argc, char *argv[]) {GPTDataCL theGPT;#主要执行函数,对参数进行解析以及调用各个执行函数执行具体功能return theGPT.DoOptions(argc, argv);
}
gptcl.cc DoOptions解析并执行具体命令函数
/*
该函数的返回值如下:
0 :执行命令成功
1:执行参数过少
2:读磁盘分区表错误
3:格式化磁盘分区格式为gpt时没有-g参数
4:无法保存sgdisk对磁盘的操作
8:备份磁盘分区表失败,-R参数failed
*/
int GPTDataCL::DoOptions(int argc, char* argv[]) {...#将参数长项和短项以及对应的描述封装为结构体struct poptOption theOptions[] ={{"attributes", 'A', POPT_ARG_STRING, &attributeOperation, 'A', "operate on partition attributes","list|[partnum:show|or|nand|xor|=|set|clear|toggle|get[:bitnum|hexbitmask]]"},{"set-alignment", 'a', POPT_ARG_INT, &alignment, 'a', "set sector alignment", "value"},{"backup", 'b', POPT_ARG_STRING, &backupFile, 'b', "backup GPT to file", "file"},{"change-name", 'c', POPT_ARG_STRING, &partName, 'c', "change partition's name", "partnum:name"},{"recompute-chs", 'C', POPT_ARG_NONE, NULL, 'C', "recompute CHS values in protective/hybrid MBR", ""},{"delete", 'd', POPT_ARG_INT, &deletePartNum, 'd', "delete a partition", "partnum"},{"display-alignment", 'D', POPT_ARG_NONE, NULL, 'D', "show number of sectors per allocation block", ""},{"move-second-header", 'e', POPT_ARG_NONE, NULL, 'e', "move second header to end of disk", ""},{"end-of-largest", 'E', POPT_ARG_NONE, NULL, 'E', "show end of largest free block", ""},{"first-in-largest", 'f', POPT_ARG_NONE, NULL, 'f', "show start of the largest free block", ""},...}...// 确保最后一个参数一定是设备名称(之前会做参数筛选)device = (char*) poptGetArg(poptCon);poptResetContext(poptCon);//如果设备名称不为空的话开始进行具体的参数解析if (device != NULL) {JustLooking(); // reset as necessaryBeQuiet(); // Tell called functions to be less verbose & interactive//加载磁盘分区表if (LoadPartitions((string) device)) {...//开始进行具体的sgdisk参数解析while ((opt = poptGetNextOpt(poptCon)) > 0) {...//设置分区边界对齐的短项参数 对应--set-alignment=valuecase 'a'://初始化分区边界对齐参数 ,会为全局变量 sectorAlignment 赋值SetAlignment(alignment);break;...//创建分区参数短项,对应--new=num:start_sector:end_sectorcase 'n':JustLooking(0);//获取分区编号newPartNum = (int) GetInt(newPartInfo, 1) - 1;//如果分区编号小于零则选择第一个没有被使用的编号(最小的没有被使用的)if (newPartNum < 0)newPartNum = FindFirstFreePart();//从磁盘的剩余空间中寻找最大的未被分配的块,取该块中的第一个可用的扇区作为起始扇区配置low = FindFirstInLargest();/*将该扇区调整为512字节,因为不通磁盘有自己的扇区大小设置,这里会将这种类型的磁盘扇区大小设置为操作系统识别的512字节*/Align(&low);//依据该块空间的起始扇区位置寻找终止扇区位置high = FindLastInFree(low);//这里做一个转换,将我们创建分区在start和end处输入的IEEE-1541-2002 value(K,M,G,T,P,E)转换为扇区单位startSector = IeeeToInt(GetString(newPartInfo, 2), sSize, low, high, low);endSector = IeeeToInt(GetString(newPartInfo, 3), sSize, startSector, high, high);//创建分区:成功返回1,失败返回0if (CreatePartition(newPartNum, startSector, endSector)) {saveData = 1;} else {cerr << "Could not create partition " << newPartNum + 1 << " from "<< startSector << " to " << endSector << "\n";neverSaveData = 1;} // if/else//释放存放参数列表的char *空间free(newPartInfo);break;...}...}
gpt.cc CreatePartition创建分区函数,设置起始扇区对齐
uint32_t GPTData::CreatePartition(uint32_t partNum, uint64_t startSector, uint64_t endSector) {int retval = 1; // assume there'll be no problemsuint64_t origSector = startSector;if (IsFreePartNum(partNum)) {//确保起始扇区是能够被我们设置的边界对齐参数整除(全局变量sectorAlignment)/*Align(&startSector)函数操作如下 1. 如果startSector % sectorAlignment == 0那么直接返回成功2. 否则 假设startSector=2049,sectorAlignment=8该函数会定位两个区间[2048,2049]和[2049-2056],先从该第一个区间起始扇区++查看是否未被占用,如未被占用,则用作起始扇区否则从第二个区间2056扇区--查看是否未被占用,如未被占用,则用作起始扇区详细可查看如下Align(&startSector)实现*/if (Align(&startSector)) {cout << "Information: Moved requested sector from " << origSector << " to "<< startSector << " in\norder to align on " << sectorAlignment<< "-sector boundaries.\n";} // ifif (IsFree(startSector) && (startSector <= endSector)) {if (FindLastInFree(startSector) >= endSector) {partitions[partNum].SetFirstLBA(startSector);partitions[partNum].SetLastLBA(endSector);partitions[partNum].SetType(DEFAULT_GPT_TYPE);partitions[partNum].RandomizeUniqueGUID();} else retval = 0; // if free space until endSector} else retval = 0; // if startSector is free} else retval = 0; // if legal partition numberreturn retval;
}
gpt.cc Align分区对齐函数,设置起始扇区对齐
int GPTData::Align(uint64_t* sector) {int retval = 0, sectorOK = 0;uint64_t earlier, later, testSector;if ((*sector % sectorAlignment) != 0) {earlier = (*sector / sectorAlignment) * sectorAlignment;later = earlier + (uint64_t) sectorAlignment;// Check to see that every sector between the earlier one and the// requested one is clear, and that it's not too early....if (earlier >= mainHeader.firstUsableLBA) {sectorOK = 1;testSector = earlier;do {sectorOK = IsFree(testSector++);} while ((sectorOK == 1) && (testSector < *sector));if (sectorOK == 1) {*sector = earlier;retval = 1;} // if} // if firstUsableLBA check// If couldn't move the sector earlier, try to move it later instead....if ((sectorOK != 1) && (later <= mainHeader.lastUsableLBA)) {sectorOK = 1;testSector = later;do {sectorOK = IsFree(testSector--);} while ((sectorOK == 1) && (testSector > *sector));if (sectorOK == 1) {*sector = later;retval = 1;} // if} // if} // ifreturn retval;
} // GPTData::Align()
相关文章:

NuGet学习笔记(3) 搭建属于自己的NuGet服务器
文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库,接下来进行最重要的一步,从零开始搭建属于自己的NuGet服务器,诚然园子里及其…

计算机网络共享打不开,网络和共享中心打不开,共享无法访问没有权限
在Win7系统下如果别的计算机设置了共享,那么在本机设置网络发现后就可以打开网络搜索到共享计算机和共享文件了,不过一些朋友反馈win7系统网络发现无法启用的问题,下面小编整理了解决方法,大家可以参考一下哦。解决方法如下&#…
千万不要把 bool 当成函数参数
我们有很多 Coding Style 或 代码规范。 但这一条可能会经常被我们所遗忘,就是我们 经常会在函数的参数里使用bool参数,这会大大地降低代码的可读性。 不信?我们先来看看下面的代码。 当你读到下面的代码,你会觉得这个代码是什么意…

修改ceph-disk源码,增加指定ceph.conf部署osd的功能
文章目录 ceph环境源码修改 主文件:`ceph-disk/main.py`main函数入口parse_args(argv)增加子命令解析get_conf函数使`conf`生效修改所有调用get_conf函数的上级函数参数配置由于最近工作中需要优化osd部署流程,单节点并发加盘过程需要指定特定conf文件,来完成单盘db,wal分区…

相关计算机专业的英语文献,英文文献及翻译计算机专业.doc
英文文献及翻译计算机专业外文资料翻译—英文原文NET-BASED TASK MANAGEMENT SYSTEMHector Garcia-Molina, Jeffrey D. Ullman, Jennifer WisdomABSTRACTIn net-based collaborative design environment, design resources become more and more varied and complex. Besides c…

作业 3 应用分支与循环结构解决问题 统计字符个数
/*统计字符,包括空格或回车,数字字符和其他字符*/#include<stdio.h> int main(void) {int digit,space,letter,other; /*定义4个变量分别存放统计结果*/ char ch;int i;digitspaceletterother0; /*置…

php后期静态绑定
从php5.3开始,php增加了一个叫后期绑定的功能,用于在继承范围内引用静态调用的类 该功能从语言内部角度考虑北命名为“后期静态绑定”;“后期绑定”意思说:static::不再被解析为定义当前方法所在的类&#…

pytest 9 pytest-datadir读取文件信息
安装:pip install pytest-datadir 介绍:用于操作测试数据目录和文件的插件。pytest-datadir他会寻找包含测试模块名字的文件夹或者全局的一个文件夹名字为data下的数据。比如以下的一个结构: firstdemo.py可以从test_firstdemo文件夹下的文件…

深入理解ceph-disk activate 源码逻辑
文章目录CEPH-DISK代码逻辑Activate osd的主要逻辑如下DEF main_activate激活osd的入口函数DEF mount_activate挂载临时目录,分配osd id并初始化osdDEF activate 分配osd_id以及初始化osdCEPH-DISK代码逻辑 本文在上文 :深入理解ceph-disk prepare 源码逻辑基础上描…

simple_html_dom meta,HTML DOM Meta content 属性
HTML DOM Meta content 属性Meta 对象定义和用法content 属性可设置或者返回 meta 元素 content 属性值。content 属性指定了 meta 信息的内容。注意: 这个属性可用的值依赖于name 和httpEquiv 属性的值。语法设置 content 属性:linkObject.content"…

struts2登录后返回登录前的页面
在Action中添加 String getUrl() { return ServletActionContext.getRequest().getHeader("referer"); } 然后配置struts的这个Action的result为:<result type"redirect">${url}</resu…

Exchange 2010 恢复误删除的邮箱账户及其邮箱
在误删除邮箱后,AD中相应的账号也会随之删除,此时该如何恢复? 先来模拟邮箱被误删除,在EMC控制台中删除别名为jqq的邮箱 打开ADUC,发现相应的jqq账号也被删除了: 1.恢复AD账号 下载运行ADRecycle Bin,点击【…

Python 函数初识 (1)
一、今日主要内容 认识函数 函数:对功能或者动作的封装(定义) 语法: def 函数名字(形参) 函数体 函数的调用格式:函数名(实参) 函数的返回值 关键字:return 终止函数的运行 1、函数内部不写return,默认函数末尾返回…

python的popen函数
最近了解了一下python的popen函数的使用,主要是用来执行linux命令 函数使用 使用之前需要导入import os模块 使用方式: os.popen(cmd)返回值: 返回一个文件句柄 import os cmd"/sbin/partx /dev/sdb" result_listos.popen(cmd) print result_list执行…

计算机竞赛CCC可以直接学吗,CCC 计算机竞赛到底有多牛!
加拿大计算机竞赛是什么?难度情况?加拿大计算机竞赛是由加拿大滑铁卢大学主办的,每年举办一次,是一场面向中学生的计算机程序设计比赛,CCC竞赛的一个目的是为广大中学生朋友们提供一个机会来测试自己分析、设计以及编程…

PHP basename() 函数
定义和用法 basename() 函数返回路径中的文件名部分。 语法 basename(path,suffix) 参数描述path必需。规定要检查的路径。suffix可选。规定文件扩展名。如果文件有 suffix,则不会输出这个扩展名。转载于:https://www.cnblogs.com/wuyou/p/3387079.html

真实工作经验总结——案例解析企业选型操作步骤
这是一个融合了本人以前工作经验的案例,包含有多个企业的选型需求。选型的过程也参考了本人以前所经历的部分事实。展现的目的在于让PUBer看到一个相对真实的选型。企业介绍这是一家中型的电脑和周边设备生产企业,即一个典型的电子企业。企业有内贸和外贸…

Oracle Goldengate Windows平台Oracle-Oracle单向复制
实验目的 Goldengate最基本的从源端一对一的单向复制,注意其中Goldengate版本取决于Oracle的版本。单向复制一般适用于保持目标数据库的实时更新,且目标数据库用来检索,如报表或者分析使用。 Source DB 操作系统:Windows 10 64 Or…

C语言解析命令行函数:getopt系列
头文件:/usr/include/getopt.h 函数传入较长参数 函数getopt_long_only和getopt_long两者用法差不多,都可以用来解析命令行选项 函数出处 #include <getopt.h> //getopt_long()头文件位置 int getopt_long (int ___argc, char *const *___ar…

宁波大学计算机专业复试,2016年宁波大学信息科学与工程学院计算机专业考研复试题库. (1)...
2016年宁波大学信息科学与工程学院计算机专业考研复试题库(二)——————————————————————————————————————————一、选择题1.下列有关浮点数加减运算的叒述中,正确的是()。对阶操作丌会引起阶码上溢戒下溢右规和尾…

RedHat、CentOS设置静态IP、主机名、关闭防火墙(虚拟机VMware客户机)
设置静态IP、主机名 1. /etc/sysconfig/network [roothadoop ~]# vi /etc/sysconfig/network NETWORKINGyes HOSTNAMEhadoop #主机名 GATEWAY192.168.80.1 #网关 2. /etc/sysconfig/network-scripts/ifcfg-eth0 [roothadoop ~]# vi /etc/sysconfig/network-scripts/ifc…

关于box2d相关学习教程记录一下
Box2D 2.0.1版本 认识Box2D世界掉落的苹果——b2Body刚体创建圆形刚体创建静止不动的刚体在运行时创建刚体刚体的上衣——b2BodyDef.userDataBox2D能再简单点吗——LDEasyBox2D让刚体听我的——ApplyForce、ApplyImpulse、SetLinearVelocity创建多边形刚体创建圆角刚体给圆角刚…

韦东山网课https://edu.csdn.net/course/play/207/1117
接口讲解https://edu.csdn.net/course/play/207/1117转载于:https://www.cnblogs.com/chulin/p/9878555.html

使用dd查看磁盘前4个扇区的内容
想要获取磁盘前四个扇区的内容可以先将扇区内容从磁盘dd出来,使用如下命令 dd if/dev/sdb ofmbr.txt bs1 count2048 改命令将sdb磁盘的前2048个字节内容即4个扇区内容备份到文件mbr.txt里面。 其中bs为块大小1即为1个字节,count表示块个数,即…

在SharePoint 2010使用OWA查看自己邮箱的内容
在SharePoint 2010使用OWA 背景: 利用 Outlook Web Access Web 部件,可以在 SharePoint 网站中显示从 Microsoft Exchange Server 2003 至 2007 电子邮件帐户中的文件夹中选择的内容. 这些 Web 部件连接到您的组织的 Office Outlook Web Access 服务器,而…

北京大学深圳研究生院计算机学什么,2018年北京大学深圳研究生院408计算机学科专业基础综合之计算机操作系统考研核心题库...
一、选择题1. 下列选项中,降低进程优先权级的合理时机是( )。A. 进程的时间片用完B. 进程刚完成I/O操作,进入就绪列队C. 进程长期处于就绪列队D. 进程从就绪状态转为运行态【答案】A【解析】本题的解答关键在于找出哪个选项中的进程应当被赋予…

网络瓶颈、线程死锁、内存泄露溢出、栈堆、ajax
网络瓶颈:网络传输性能及稳定性的一些相关元素 线程死锁:多个线程因竞争资源造成的一种僵局 下面我们通过一些实例来说明死锁现象。 先看生活中的一个实例,2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才…

g-gdb调试core文件
文章目录core文件判读是否为core文件打开系统 core dump修改core文件的保存路径gdb调试core文件最近初步了解了一下core 文件,已经如何将gdb工具与core文件结合调试出现段错误的程序core文件 core是指操作系的程序统核心。当我们的程序在操作系统上运行异常崩溃时&…

信息整合的讨论案例
我所在的公司是广州的一个大型国有企业,目前所用的信息管理系统包括企业管理的方方面面,大约有7到8个互相独立的信息系统,这些系统都是在7、8年前就已经投入使用了,完全自主开发和维护,所用的工具是delphi+…

html中sprite标签,Three.js模型标签
Three.js模型标签在很多的实际的项目中,你可能需要给一个Three.js的模型添加标签,标签可以通过一个包含文字图形信息的HTML元素或者一个three.js的精灵模型来表示。层级模型复杂的项目,一个three.js场景往往包含包含多个模型对象,…