前言:略谈各种开发板常用的“系统镜像”
树莓派(Raspberry Pi)的用户经常提出这样一个问题[注A]
:
为什么不能把.img镜像拷贝到SD卡中,而必须要用专门的刷卡软件?
这个问题,我们从磁盘结构讲起。磁盘内部所有的存储区域,必然分为分区表和数据区域两大块。而数据区域按分区表分区后,每个分区还被文件系统封装和管理[注B]
:
- 分区表占据磁盘最前端的少量存储区,存储了磁盘后边广大的数据区域如何分区的重要信息。
- 数据区域按照分区表的规定,分割成互不影响的若干个区域。
- 每个分区的内部,由文件系统封装并规定了文件的存储方法。读写文件全部都在文件系统这一层的约束下。
SD卡一般是全盘一个主分区的结构。但Raspberry Pi等Linux开发板要求SD卡上有自定义的分区结构(一般是一个小FAT32一个大Ext4)。要求用户自己分区这很麻烦(甚至不可能),所以系统分发往往采用磁盘镜像文件的方式。
磁盘镜像文件就是绕过上述所有的分层结构,直接从磁盘底层原始数据的第1个字节开始一个一个读取并制成.img文件。这样所备份的原始数据,自然也就包含了分区表、上层文件系统等所有复杂的信息。
安装系统时,只要用逆向的方法,仍然绕开磁盘的上层结构,把镜像文件的内容直接写入磁盘底层,就能得到一块和镜像制作者完全一致的SD卡。从这个意义上讲,传播.img文件其实和直接转借、传递、分享SD卡本身是完全等效的。
这个逆向的写入操作就叫直接写盘。如果只把.img文件拷贝到SD卡中,那只是在文件系统这一层折腾,而没有修改磁盘前面的分区表部分,得到的卡必然和分发者的原样不一致。这就是这个新手问题的答案。
▲ 用图片说明直接写盘与拷贝文件的区别。
上:只拷贝文件得到的错误结果 中:直接写盘对磁盘的影响 下:直接写盘的结果(即镜像作者期待的磁盘原样)
警告:直接写盘是一项系统特权操作,错误使用可能导致意外抹除或覆盖磁盘数据。我们关心您的数据安全,确认了软件有防止错误的必要技术手段,也在本文中提供如何安全使用的提示。但仍然必须声明:软件和本文的作者均不对使用本软件可能产生的任何损害负责。[注C]
专门针对USB存储器的直接写盘工具USB Image Tool
对于Raspberry Pi等开发板,几乎所有的新手教程都推荐使用Win32DiskImager作为系统安装工具。但这个工具问题不少:
- 不支持中文目录名(文件或目录有中文,会出现123错误)
- 只使用盘符区分不同USB设备,用户需要自行核实,不方便。
- 浏览文件,记不住最后使用的目录,找常用的文件很麻烦。
- 不支持zip或gz格式的压缩档案。
- 必须先插好SD卡,再开软件。
- 其它小问题:界面风格简陋;MD5在XP下乱码等
所以我一直推荐在Windows环境下使用USB Image Tool做USB设备的直接写盘。
使用与特色
通常使用
左侧选定磁盘后,按Restore
选择一个磁盘镜像写卡。按Backup
读取卡的内容制作成磁盘镜像文件。
Restore
和Backup
命令能够记住上次使用的文件夹位置。
如果是先开启软件再插入磁盘,可能磁盘不会立即显示出来。这时请点击Rescan
刷新左侧磁盘列表。
压缩支持
读卡和写卡都支持zip和gzip压缩的.img
镜像。注意.imz
并非一个专门的格式,其实只是仅含有一个.img
的zip压缩包。
USB Image Tool实际上也可以正确识别.zip
的压缩包。(虽然没有提供这个选项。需要先选择All files (*.*)
以便能够选中.zip
文件。)
收藏夹
USB Image Tool提供了Favorites
标签页,可以收藏一些常用的镜像文件一键刷写,无需寻找。
重置SD卡
USB Image Tool提供了Reset
功能,可以把磁盘的分区表部分全部写成0x00
。
这个功能用来把为树莓派等系统重新分区过(在电脑上看到容量缩小成几十MB)的卡恢复原状。重置SD卡后,拔出并重新插入,Windows就会发现分区表被全部清空,而提示用户格式化磁盘,恢复磁盘全部空间分配为一个FAT32分区的原始结构。
安全性保证
USB Image Tool的安全保证主要是两点:
- 以设备名称区别磁盘而不是盘符。可以直接看到读卡器、U盘的设备名称和磁盘容量。
- 默认只显示存储卡和U盘,不显示移动硬盘和本地磁盘。(
Options
中提供选项突破这一点)
使用软件提供的机制,简单检查就可以避免刷写错误。
但我们仍然建议您:使用直接写盘工具时,请最好保证计算机上只连入了1个需要写入的USB存储设备。(防止数据灾难,戒之慎之)
其他
- 中文文件和路径名称没有问题。
- 一个软件窗口内,多个读卡器就可以并行读写,互不干扰,无需开多个窗口
- 自动请求管理员特权,不会出现软件正常启动但写入时才提示权限不足
推荐给在Windows下开发Raspberry Pi等Linux开发板的用户使用。
对于Linux
Linux下使用dd命令或SUSE Image Writer图形化工具直接写盘。
遗憾
USB Image Tool是免费软件(Freeware)而非开源软件。会不会将来有人会促成作者将此软件开源,或干脆做出一个开源的等效工具呢?
项目主页与下载:http://www.alexpage.de/usb-image-tool/
注:Windows XP下运行需要.net Framework 2.0。
注解
[注A]
其实是三个问题,另一个是“为什么不能直接使用台式机的Linux操作系统安装盘?”。这个问题的答案是:系统架构不同(台机=x86,开发板=ARM/MIPS),造成位于系统最最底层的机器指令层都不通用,上层的就全都更不用说了。
[注B]
这是个简略的说法。
[注C]
软件的免责条款,由许可协议中的AS IS条款规定。文章的免责条款,由CC知识共享许可协议规定。