img制作

介绍

新买了一个TF卡,Class10的,应该能挺快。原来的卡是class4的,如果用新卡做系统,然后所有软件都重装重配,太麻烦!所以将现有系统,做成镜像(img),然后直接dd到新卡上,然后再执行raspi-conf进行容量扩展就可以正常使用了。

版本

  • 硬件,RaspberryPi3
  • OS,raspbian jessie

步骤

安装需要的软件

安装dosfstoolspartedkpartx软件及依赖包。

1
sudo apt-get install dosfstools parted kpartx

计算镜像大小

获取/dev/root/dev/mmcblk0p1占用的空间,然后计算镜像大小,计算公式:1.2 * (size(/dev/root) + size(/dev/mmcblk0p1))

1
2
3
4
$ df -P
Filesystem 1024-blocks Used Available Capacity Mounted on
/dev/root 30690780 1390740 28024812 5% /
/dev/mmcblk0p1 64366 20698 43668 33% /boot

df返回的容量单位为KB。

生成空白镜像文件

使用dd/dev/zero生成空白镜像文件sudo dd if=/dev/zero of={镜像文件} bs=1K count={镜像大小(单位为K)}

分区镜像文件并格式化

分区

使用parted为img文件分区

1
2
3
4
5
6
7
8
# 标记label,选择MBR or GPT主引导格式,MBR:msdos, GPT:gpt
sudo parted {镜像文件} -s -- mklabel msdos

# 创建分区
sudo parted {镜像文件} -s -- mkpart primary fat32 {开始扇区}s {结束扇区}s

# 创建分区
sudo parted {镜像文件} -s -- mkpart primary ext4 {开始扇区}s -1

开始扇区和结束扇区可是通过sudo fdisk -l /dev/mmcblk0来查看。

格式化

在格式化前,需要先将img文件映射给系统的loop设备,然后在将loop设备映射给device mapper。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 映射loop设备
$ sudo losetup -f --show {镜像文件}
/dev/loop0

# device mapper
$ sudo kpartx -va /dev/loop0
add map loop0p1 (254:0): 0 257 linear /dev/loop0 256
add map loop0p2 (254:1): 0 18015 linear /dev/loop0 513

# 格式化
$ sudo mkfs.vfat /dev/mapper/loop0p1
......
$ sudo mkfs.ext4 /dev/mapper/loop0p2
......

挂载并备份系统

备份/boot

1
2
3
$ sudo mount -f vfat /dev/mapper/loop0p1 /media
$ sudo cp -rfp /boot/* /media/
$ sudo umount /media

备份/

1
2
3
4
$ sudo mount -t ext4 /dev/mapper/loop0p2 /media
$ sudo rsync -aP --exclude={镜像文件} --exclude=/media/* --exclude=/sys/* --exclude=/proc/* --exclude=/tmp/* / /media/
...
$ sudo umount /media

卸载打包镜像文件

1
2
3
4
5
# 关闭device mapper
sudo kpartx -d /dev/loop0

#关闭 loop 设备
sudo losetup -d /dev/loop0

参考&鸣谢