安装工具
$sudo apt-get install dosfstools dump parted kpartx
根据文件系统大小生成镜像文件
将SD卡插入PC机上
$df -h -m
打印信息如下
文件系统 1M-块 已用 可用 已用% 挂载点
udev 1907 0 1907 0% /dev
tmpfs 386 7 380 2% /run
/dev/sda6 314483 15195 283291 6% /
tmpfs 1930 48 1883 3% /dev/shm
tmpfs 5 1 5 1% /run/lock
tmpfs 1930 0 1930 0% /sys/fs/cgroup
/dev/sda1 300 35 266 12% /boot/efi
tmpfs 386 1 386 1% /run/user/1000
/dev/sdb1 40 8 33 18% /media/youbote/boot
/dev/sdb2 7415 2202 5198 30% /media/youbote/rootfs
其中/dev/sdb1和/dev/sdb2为SD卡的连个分区,需要根据分区的实际的实际使用情况生成指定大小的镜像。
实际镜像的大小 = boot[size] + linux[Used] + 分区损耗[5%~10%]
即:2735M = 40M + 2195M + 500M(估算)
使用dd命令生成空的镜像文件
dd命令中【1k=1024b;1KB=1000b;1M=1024kb;1MB=1000kb】
$sudo dd if=/dev/zero of=nanopi.img bs=1M count=2735
更改镜像文件的分区表信息
首先查看原先Linux系统的各个分区情况(因为SD卡在我这里挂在是sdb,所以指定/dev/sdb)
$sudo fdisk -l /dev/sdb
打印信息如下:
Disk /dev/sdb: 7.5 GiB, 7990149120 bytes, 15605760 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: 0x61d35bcd
设备 启动 Start 末尾 扇区 Size Id 类型
/dev/sdb1 49152 131071 81920 40M 83 Linux
/dev/sdb2 131072 15605759 15474688 7.4G 83 Linux
可以看到SD卡上:
boot分区的大小是40M,起始扇区号49152,结束扇区号131071。
rootfs分区的大小是7.4G,起始扇区号131072,结束扇区号15605759。
根据以上信息,给虚拟磁盘镜像添加如下分区信息:
添加一个msdos分区
添加一个ext4 主分区,起始扇区号49152,结束扇区号131071。
添加一个ext4 主分区,起始扇区号131072,结束分区号为最后的扇区号
$sudo parted nanopi.img --script -- mklabel msdos
$sudo parted nanopi.img --script -- mkpart primary ext4 49152s 131071s
$sudo parted nanopi.img --script -- mkpart primary ext4 131072s -1
查看分区后的镜像文件
$sudo parted nanopi.img
然后输入paint,打印如下信息
Model: (file)
磁盘 /home/youbote/temp/nanopi.img: 2868MB
Sector size (logical/physical): 512B/512B
分区表:msdos
Disk Flags:
数字 开始: End 大小 类型 文件系统 标志
1 25.2MB 67.1MB 41.9MB primary
2 67.1MB 2867MB 2800MB primary
挂在虚拟磁盘并对虚拟磁盘进行分区格式化
losetup:用来连接 img 镜像文件和 loopX回环设备
kpartx:挂载虚拟磁盘
$sudo losetup /dev/loop7 nanopi.img
$sudo kpartx -av /dev/loop7
打印信息如下:
添加了两个映射分区
add map loop7p1 (253:1): 0 81920 linear 7:7 49152
add map loop7p2 (253:2): 0 5468160 linear 7:7 131072
格式化虚拟磁盘分区
$sudo mkfs.ext4 /dev/mapper/loop7p1
$sudo mkfs.ext4 /dev/mapper/loop7p2
备份SD卡数据
备份uboot引导程序
$sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/loop7 bs=1024 seek=8
备份boot分区内容,将虚拟磁盘的boot分区挂载到系统的loop7p1目录上,然后将SD卡的boot分区内容拷贝到虚拟磁盘上boot分区上
$mkdir loop7p1
$sudo mount /dev/mapper/loop7p1 loop7p1
$sudo cp -rf /media/youbote/boot/* loop7p1/
备份rootfs分区内容,将虚拟磁盘的rootfs分区挂载到系统的loop7p2目录上,然后将SD卡的rootfs分区内容拷贝到虚拟磁盘的rootfs分区上
$mkdir loop7p2
$sudo mount /dev/mapper/loop7p2 loop7p2/
$sudo cp -rf /media/youbote/rootfs/* loop7p2/
卸载虚拟磁盘
$sudo umount loop7p1/
$sudo umount loop7p2/
$sudo kpartx -d nanopi.img