昨天写了一篇文章。但是当时对于这个的理解还不够,以至于我后面又遇到了一些问题。这里再重新整理一下,供大家参考。

我先重述一下我要做的事情。

我电脑系统是windows,里面安装了一个Ubuntu虚拟机。我从官网上下载了一个树莓派img镜像。但是因为工作的需要,我得修改这个img镜像,然后这个img镜像可以批量的写入到tf卡中,别人拿到这个修改的镜像烧入存储卡就能用。

这里知识点特别多,我一点一点说。

首先看镜像内的分区。

镜像这个时候还没被烧入(写入)存储卡中。这个时候,我们单独看一下这个镜像的分区。然后进行挂载。

查看的方式很简单,就是使用

fdisk -l ***.img(imgpath)

这里我举一个例子。

fdisk -l /home/guo/Desktop/2018-06-27-raspbian-stretch-lite.img

执行这个指令之后,我们能看到

Disk /home/guo/Desktop/2018-06-27-raspbian-stretch-lite.img: 1.8 GiB, 1862270976 bytes, 3637248 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4d3ee428

Device                                                  Boot Start     End Sectors  Size Id Type
/home/guo/Desktop/2018-06-27-raspbian-stretch-lite.img1       8192   96663   88472 43.2M  c W95 
/home/guo/Desktop/2018-06-27-raspbian-stretch-lite.img2      98304 3637247 3538944  1.7G 83 Linu

这里,我们能看到单位扇区的大小是512字节。并且,下面有两个设备。一个是img1,类型是W95,另一个是img2,类型是linux.
其实img1对应的就是boot分区,而img2,就是根分区。

boot分区和根分区

boot分区为fat32格式,挂载在/boot,存放一些系统启动需要的基本文件,包括内核、驱动、firmware、启动脚本等;根分区文件系统是ext4格式,挂载于/,存放一些安装的软件和库文件、系统配置、用户数据等等;另外当系统启动时会自动生成和挂载一些必要的其他文件夹,包括temfs、sysfs、proc、debugfs、configfs等(使用mount可以看到他们)

当然,我遇到的问题是需要对两个分区同时做修改,这样的话,就需要同时去挂载两个分区为两个文件系统,并且进行修改。

同时挂载两个分区

上一篇文章中,我讲了如何挂载根分区。很明显,boot分区也是类似的方式。但是如果你试了之后,会发现挂载了一个分区之后,另一个分区会出问题。另一个根本挂不上。

在参考了raspberrypi.org上的一个问题之后,我找到了解决的办法。

先贴出来

mount ***.img /Volumes/boot -t vfat -o rw,loop,offset=4194304,sizelimit=45297664

这里解释一下这个命令。
***.img就是要挂载的文件镜像。
/Volumes/boot就是要挂载的位置。

-t 是类型,boot分区的类型是fat32,而vfat刚好可以兼容fat32,所以用vfat. 而root盘这里会用ext4.

rw, 这里是可读写

offset是偏移量,这里的偏移量对应的就是最开始查看的img1和img2对应的start * 扇区大小。这里boot盘就是8192 * 512.

和上次唯一不同的一点是这里加了一个参数,sizelimit.这个值的计算方法是 end * 扇区大小。这里的boot盘就是96663*512=45297664.

这个值在你要区分不同的分区的时候非常有用,加上之后,就可以同时挂载两个系统了。

挂载上了之后,就可以对两个系统做修改了。
修改的方式就是进入挂载的目录下,进行修改
例子中对应的就是/Volumes/boot/

修改之后

修改了之后,首先umount 挂载的虚拟文件系统。

example
umount /Volumes/boot

卸载了两个分区之后,把tf卡(存储卡)插入到电脑上,然后准备烧制镜像到存储卡。

这里我给出linux下的烧制命令。不需要安装软件。

sudo dd bs=4M if=***.img of=/dev/sdd

这里的if就是输入,这里就是输入的镜像。
输出就是我们的硬盘设备。
这里的硬盘设备我们可以通过查看fdisk -l 来看。
除了可以根据存储卡的大小来看,我们可以看插入存储卡前后,新增了什么设备来判断。

当然,你可能看到类似sdd1和sdd2这样的,这个时候,你需要umount sdd1 和sdd2, 比如我这里就是

umount /etc/sdd1
umount /etc/sdd2

取消了这两个挂载之后,就可以使用上面的命令进行存储卡的烧制。当然,这个命令特别危险,如果没有选好输出,后果可能会格盘。一年前我就干过这事。。。

当然,还有一个特别好用的软件Etcher,感谢老大的推荐,这个软件mac, linux, window都有,特别容易上手。并且,特别安全。速度很快。

我这里整理一下Ubuntu上的安装和使用。
安装:

1.添加源
$echo "deb https://dl.bintray.com/resin-io/debian stable etcher" | sudo tee /etc/apt/sources.list.d/etcher.list
2.信任密钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 379CE192D401AB61
3.更新并安装
sudo apt-get update
sudo apt-get install etcher-electron

因为是图形化界面的,只需要在图形化页面下搜索Etcher,然后你肯定会用。

参考:

http://conanwhf.github.io/2016/08/25/rpi-cloneimg/
https://www.raspberrypi.org/forums/viewtopic.php?t=190154
https://www.jianshu.com/p/53f7e78fd9f1
https://blog.csdn.net/qq_19175749/article/details/52700246

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐