前言

由于工作上需要经常要为嵌入式设备制作启动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创建可启动分区问题相关推荐

  1. 启动盘安装windows系统时提示:“windows安装程序无法创建新的分区,也找不到现有分区”的解决方法

    在使用启动盘安装Windows系统时有时会遇到无法安装的问题,选定主分区或新建主分区出现"windows安装程序无法创建新的分区,也找不到现有分区"的提示信息,导致安装失败.提示信 ...

  2. Linux 中创建 USB 启动盘来拯救 Windows 用户

    WoeUSB 可以在 Linux 中制作 Windows 启动盘,并帮助你的朋友解锁他们罢工的机器. 人们经常要求我帮助他们恢复被锁死或损坏的 Windows 电脑.有时,我可以使用 Linux US ...

  3. 盘启动盘_[装机]推荐唯二的两个开源免费的启动盘工具,轻松创建USB启动盘

    不卖关子: ventoy 和 rufus. 官网等: ventoy github​github.comventoy官网 新一代启多系统启动u盘解决方案​www.ventoy.netrufus 轻松创建 ...

  4. 里面如何创建新的module_硬盘分区:如何一次为新硬盘创建多个分区?

    心仪很久的硬盘,终于入手,到手的第一件是什么?--给它硬盘分区那么怎么使用分区助手快速的对齐分3个,4个,5个甚至更多分区呢?接下来,为你介绍快速分区神器的使用方 一.选择硬盘 打开分区助手,点击新磁 ...

  5. linux启动后分区数据变化,求助!我删除了Linux启动分区

    我删除了Linux系统上的分区,但我还能看见启动菜单.我该如何重新安装GRUB2且不丢失数据呢? 我们来还原下情景:你既不是故意删除Linux启动分区,也不是更新出现错误而删除了它.现在你无法访问你的 ...

  6. 删除Windows 7自动创建的隐藏分区

    如果你安装了Windows 7测试版,在安装完成后发现Windows 7自动划出一个隐藏的分区,大小为200MB的.又不懂该怎样删除? 其实这个隐藏分区的删除比较麻烦的,如果贸然使用DM等分区工具来删 ...

  7. 【转】使用命令行方式创建和启动android模拟器

    原文网址:http://blog.csdn.net/tiandinilv/article/details/8953001 1.Android模拟器介绍 Android中提供了一个模拟器来模拟ARM核的 ...

  8. 启动盘Linux windows,Linux 中创建 USB 启动盘来拯救 Windows 用户

    人们经常要求我帮助他们恢复被锁死或损坏的 Windows 电脑.有时,我可以使用 Linux USB 启动盘来挂载 Windows 分区,然后从损坏的系统中传输和备份文件. 有的时候,客户丢失了他们的 ...

  9. Linux创建磁盘并分区命令

    Linux创建磁盘并且分区命令 目录 1.首先创建磁盘 1.1 首先点击虚拟机,再点设置 1.2点击内存在点下面的磁盘添加 1.4 添加磁盘向导 2.创建磁盘分区 2.1 启动Linux,用超级管理员 ...

  10. Win7/Win8安装我们无法创建新的分区,也找不到现有的分区的解决方法

    本文讨论的是一般情况下默认的4096簇格式化安装windows的问题,即大家常见的安装问题. 如果是指定系统盘c盘64k/32k /16k单元簇大小的,请看这里:系统盘分区单元簇为64K/C盘64k簇 ...

最新文章

  1. integer比较_Java整数缓存Integer.valueOf(127)==Integer.valueOf(127)为True
  2. delphi XE 下打开内存泄漏调试功能
  3. Solr嵌套子文档的弊端以及一种替代方式
  4. 如何才算掌握Java(J2SE篇)
  5. 《剑指offer》栈的压入、弹出序列
  6. Don't Laugh!I'm An English Book笔记(五)——面部词语大总结加补充
  7. Vue.js 极简小例: 点击事件
  8. 国二C语言大题评分,计算机二级C语言题型和评分标准
  9. n皇后问题(在棋盘上找方案)
  10. VS2010 C++工程运行提示找不到MSVCP100D.dll
  11. js基础知识汇总08
  12. linux系统视屏录像_在Linux上的点击,弹出和故障排除录像
  13. 连接服务器显示句柄无效,紧急求助!!1  打印机不能打印 提示:句柄无效...
  14. 亲测有效——C#制作图片Button
  15. 求分子分母最大公约数c语言,怎么求两个分数的最大公约数?
  16. Mac下编译WebRTC(Mac和iOS版本)
  17. graphpad画生存曲线怎么样去掉删失点_手把手教你用graphpadprism绘制生存曲线
  18. vue---父组件实时取到子元素的v-model
  19. 网络安全工程师要学习哪些编程语言?哪里学网络安全知识可靠?
  20. VBA操作Excel之获取单元格区域

热门文章

  1. Spark文本文件输入输出
  2. 基于Stm32F746g_disg平台下移植zephry使用TinyML预测模型
  3. Windows核心编程_注册表操作和小练习程序关联
  4. 3. VPP源码分析(graph node(1))
  5. 如何使用JMeter来实现更大批量的并发的解决方案(即如何设置controller和Agent)
  6. 程序猿的奋斗史(三十八)——大学断代史(二)——我与数据库的故事
  7. hdu 4970 树状数组 “改段求段”
  8. BW作为源系统连接时,激活DSO或其他模型时提示8*数据源不存在,无法激活
  9. Linux fstab配置文件详解
  10. Codeforces Round #535 (Div. 3) 解题报告