前言

由于工作上需要经常要为嵌入式设备制作启动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或以上,以避免不同平台下的行为不一致。

最新文章

  1. 『.NET Core CLI工具文档』(十)dotnet-build
  2. atitit.TokenService v3 qb1 &#160;token服务模块的设计 新特性.docx
  3. 监控Tomcat解决方案(监控应用服务器系列文章分享)
  4. 【NOIP2013】【P1441】花匠
  5. 无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败。
  6. php计算时间差的方法
  7. php字符串首字母转换大小写的实例分享
  8. hdu 4292 Food 网络流
  9. C# FileSystemWatcher 监视磁盘文件
  10. fpga之显示字符串
  11. unity 双面shader
  12. 前端应该知道的Web Components
  13. java打包项目将配置文件放在包外面(后续还会有补充)
  14. PS调出唯美冷色情侣婚纱写真照
  15. Masquerade strikes back Gym - 101911D (数学)
  16. typescript精简版1:用ts表示常见数据类型
  17. Python2.x 与 Python3.x 共存
  18. input单选框多选框时可用的事件
  19. json包
  20. SPRING 集成 KAFKA 发送消息

热门文章

  1. bzoj 3173 最长上升子序列
  2. Stars
  3. ACM学习历程—Codeforces Round #354 (Div. 2)
  4. windows下通过Git Bash使用Git常用命令
  5. 2、Flume1.7.0入门:安装、部署、及flume的案例
  6. keytool生成JKS证书的详细步骤及截图
  7. easyui tree 加载展开全部节点
  8. 1024 Palindromic Number
  9. Zabbix 客户端自定义端口监控
  10. redis基本操作和在springboot中的使用