这个笔记记录如何在 Raspbian 上编辑 Raspbian 镜像。为什么会有这个需要呢?第一是因为经常在 Raspberry Pi 上尝试各种各样的东西,会把系统弄得乱七八糟,所以经常要重新刷 Raspbian ,因此就有了编辑 Raspbian 镜像的需求。第二是我现在用的是 Mac OS ,编辑镜像文件并不那么方便,所以就干脆在 Raspbian 系统中编辑 Raspbian 镜像了。

首先我们要在 Raspberry Pi 的官网上下载最新的 Raspbian lite 镜像。我们也可以通过以下命令行下载:

wget https://downloads.raspberrypi.org/raspbian_lite_latest

这样我们会得到一个名字叫做 raspbian_lite_latest 的文件。我们将其改名并解压缩:

mv raspbian_lite_latest raspbian.zip
unzip raspbian.zip

解压出来的是一个后缀为 .img 的镜像文件,使用 mv 命令将其改名为 raspbian.img。我们的目的就是编辑这个镜像文件的内容。为了达到这个目的,我们需要把这个镜像加载到系统中。这需要镜像的基本信息。

fdisk -lu raspbian.img

结果大概是这样的:

Disk raspbian.img: *** MB, *** bytes
255 heads, 63 sectors/track, 0 cylinders, total 0 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
Disk identifier: 0x00017b69

       Device Boot      Start         End      Blocks   Id  System
raspbian.img1            8192      122879       57344    c  W95 FAT32 (LBA)
raspbian.img2          122880     3788799     1832960   83  Linux

这个镜像有两个分区,第一个分区对应的是 /boot ,而第二个分区对应的是 / 。如果我们需要开启 ssh 功能,我们需要在第一个分区生成一个名字为 ssh 的空文件。如果我们要让系统连上无线,我们则需要修改第二个分区的 /etc/wpa_supplicant/wpa_supplicant.conf 文件。

在加载这两个分区之前我们需要利用之前的信息(主要是 Start 那一列的信息)计算各分区的起始偏移(offset):
第一个分区:8192*512=4194304
第二个分区:122880*512=62914560

有了这些准备,我们就可以加载这两个分区了。

sudo mkdir /mnt/img1
sudo mount -t vfat -o loop,offset=4194304 raspbian.img /mnt/img1/
sudo mkdir /mnt/img2
sudo mount -t ext4 -o loop,offset=62914560 raspbian.img /mnt/img2/

如果在加载第二个分区的时候出错了,那么我们可以先加载第一个分区,然后再完成对第一个分区的修改后卸载第一个分区:

umount /mnt/img1

这样我们就可以继续使用之前的命令加载第二个分区并对其进行修改。最后修改完了不要忘记卸载第二分区:

umount /mnt/img2