sfidsk创建可启动分区问题
前言
由于工作上需要经常要为嵌入式设备制作启动SD卡,因此本人使用sfdisk编写了自动分区、格式化和安装文件的脚本。(不选择fdisk是因为它是为用户交互设计的,在脚本上使用不够方便)
实际使用过程中,有同事反馈在有些机器的虚拟机上使用,制作出来的卡不能启动。经过一番排查,终于搞清楚问题所在。
先从结论来说,使用sfdisk时, 最好指定第一个分区的起始柱面(cylinder)为1或以上 !
基础知识 - sfdisk使用
截选自 man sfidsk :
sfdisk reads lines of the form<start> <size> <id> <bootable> <c,h,s> <c,h,s> where each line fills one partition descriptor.Fields are separated by whitespace, or comma or semicolon possibly followed by whitespace; When a field is absent or empty, a default value is used.
即sfdisk会从标准输入读取分区描述信息;每一行描述一个分区,常用格式为:<起始柱面>,<柱面数 量>,<分区ID>,< bootable >。如果参数没有指定,则使用默认值;而<起始柱面>的默认值为当前最小可用的柱面编号。
因此最初编写出来的脚本类似这样:
DRIVE=$1 SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'` CYLINDERS=`echo $SIZE/255/63/512 | bc`sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF ,9,0x0C,* ,114,,, EOF
- 每一个柱面的大小为255 63 512=8,225,280 Bytes
- sfdisk的-D参数指定与DOS兼容,并自动在每个分区前预留空间,以存放 MBR (Master Boot Record);
- 第一行分区描述 ,9,0x0C,* , 自动分配起始柱面,数量为9,分区ID为0x0C(表示FAT32分区),< bootable >为 * , 表示可启动分区。
- 第二行分区描述 ,114,,, , 同样自动分配起柱面,数量为114,其它为默认。
现象
执行时,输出的信息如下:
Device Boot Start End #cyls #blocks Id System /dev/sdb1 * 0+ 8 9- 72261 c W95 FAT32 (LBA) /dev/sdb2 9 122 114 915705 83 Linux /dev/sdb3 0 - 0 0 0 Empty /dev/sdb4 0 - 0 0 0 Empty
在安装Linux的机器上运行,制作出来的卡没有任何问题;但在虚拟机上的Linux系统(同一版本)上使用,制作出来的SD卡的启动分区不能被设备识别。
由于设备需要读取MBR引导启动,所以很可能是MBR的数据有问题。
观察到上面分区表的Start(起始柱面)为 0+ ,本人怀疑指定了-D参数自动预留给MBR的空间分配有问题,尝试将起始柱面改为1后,就可以正常从SD卡启动:
sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF 1,9,0x0C,* ,114,,, EOF
PS: fdisk提示第一个分区的起始柱面值范围也是从1开始的!
结论
最终本人也没有深究为什么在虚拟机上会导致这样的问题。得到的经验是,使用sfdisk时,最好指定第一个分区的起始柱面为1或以上,以避免不同平台下的行为不一致。
- 本文来自:Linux教程网
转载于:https://www.cnblogs.com/ah1234/p/4235389.html
sfidsk创建可启动分区问题相关推荐
- 启动盘安装windows系统时提示:“windows安装程序无法创建新的分区,也找不到现有分区”的解决方法
在使用启动盘安装Windows系统时有时会遇到无法安装的问题,选定主分区或新建主分区出现"windows安装程序无法创建新的分区,也找不到现有分区"的提示信息,导致安装失败.提示信 ...
- Linux 中创建 USB 启动盘来拯救 Windows 用户
WoeUSB 可以在 Linux 中制作 Windows 启动盘,并帮助你的朋友解锁他们罢工的机器. 人们经常要求我帮助他们恢复被锁死或损坏的 Windows 电脑.有时,我可以使用 Linux US ...
- 盘启动盘_[装机]推荐唯二的两个开源免费的启动盘工具,轻松创建USB启动盘
不卖关子: ventoy 和 rufus. 官网等: ventoy githubgithub.comventoy官网 新一代启多系统启动u盘解决方案www.ventoy.netrufus 轻松创建 ...
- 里面如何创建新的module_硬盘分区:如何一次为新硬盘创建多个分区?
心仪很久的硬盘,终于入手,到手的第一件是什么?--给它硬盘分区那么怎么使用分区助手快速的对齐分3个,4个,5个甚至更多分区呢?接下来,为你介绍快速分区神器的使用方 一.选择硬盘 打开分区助手,点击新磁 ...
- linux启动后分区数据变化,求助!我删除了Linux启动分区
我删除了Linux系统上的分区,但我还能看见启动菜单.我该如何重新安装GRUB2且不丢失数据呢? 我们来还原下情景:你既不是故意删除Linux启动分区,也不是更新出现错误而删除了它.现在你无法访问你的 ...
- 删除Windows 7自动创建的隐藏分区
如果你安装了Windows 7测试版,在安装完成后发现Windows 7自动划出一个隐藏的分区,大小为200MB的.又不懂该怎样删除? 其实这个隐藏分区的删除比较麻烦的,如果贸然使用DM等分区工具来删 ...
- 【转】使用命令行方式创建和启动android模拟器
原文网址:http://blog.csdn.net/tiandinilv/article/details/8953001 1.Android模拟器介绍 Android中提供了一个模拟器来模拟ARM核的 ...
- 启动盘Linux windows,Linux 中创建 USB 启动盘来拯救 Windows 用户
人们经常要求我帮助他们恢复被锁死或损坏的 Windows 电脑.有时,我可以使用 Linux USB 启动盘来挂载 Windows 分区,然后从损坏的系统中传输和备份文件. 有的时候,客户丢失了他们的 ...
- Linux创建磁盘并分区命令
Linux创建磁盘并且分区命令 目录 1.首先创建磁盘 1.1 首先点击虚拟机,再点设置 1.2点击内存在点下面的磁盘添加 1.4 添加磁盘向导 2.创建磁盘分区 2.1 启动Linux,用超级管理员 ...
- Win7/Win8安装我们无法创建新的分区,也找不到现有的分区的解决方法
本文讨论的是一般情况下默认的4096簇格式化安装windows的问题,即大家常见的安装问题. 如果是指定系统盘c盘64k/32k /16k单元簇大小的,请看这里:系统盘分区单元簇为64K/C盘64k簇 ...
最新文章
- integer比较_Java整数缓存Integer.valueOf(127)==Integer.valueOf(127)为True
- delphi XE 下打开内存泄漏调试功能
- Solr嵌套子文档的弊端以及一种替代方式
- 如何才算掌握Java(J2SE篇)
- 《剑指offer》栈的压入、弹出序列
- Don't Laugh!I'm An English Book笔记(五)——面部词语大总结加补充
- Vue.js 极简小例: 点击事件
- 国二C语言大题评分,计算机二级C语言题型和评分标准
- n皇后问题(在棋盘上找方案)
- VS2010 C++工程运行提示找不到MSVCP100D.dll
- js基础知识汇总08
- linux系统视屏录像_在Linux上的点击,弹出和故障排除录像
- 连接服务器显示句柄无效,紧急求助!!1 打印机不能打印 提示:句柄无效...
- 亲测有效——C#制作图片Button
- 求分子分母最大公约数c语言,怎么求两个分数的最大公约数?
- Mac下编译WebRTC(Mac和iOS版本)
- graphpad画生存曲线怎么样去掉删失点_手把手教你用graphpadprism绘制生存曲线
- vue---父组件实时取到子元素的v-model
- 网络安全工程师要学习哪些编程语言?哪里学网络安全知识可靠?
- VBA操作Excel之获取单元格区域
热门文章
- Spark文本文件输入输出
- 基于Stm32F746g_disg平台下移植zephry使用TinyML预测模型
- Windows核心编程_注册表操作和小练习程序关联
- 3. VPP源码分析(graph node(1))
- 如何使用JMeter来实现更大批量的并发的解决方案(即如何设置controller和Agent)
- 程序猿的奋斗史(三十八)——大学断代史(二)——我与数据库的故事
- hdu 4970 树状数组 “改段求段”
- BW作为源系统连接时,激活DSO或其他模型时提示8*数据源不存在,无法激活
- Linux fstab配置文件详解
- Codeforces Round #535 (Div. 3) 解题报告