克隆Jetson系统

备份和恢复Jetson完整系统 我介绍了如何通过tar工具备份和恢复一个Ubuntu系统(Jetson),这种方法是比较常规的Linux备份恢复方案。不过,由于需要调整磁盘UUID以及重建GRUB,所以操作比较繁琐且有一定难度。

其实还有一种非常简单粗暴的备份和恢复操作系统的方法:通过 dd 命令完整克隆系统。这种方法是块设备的 bit 复制,所以完全不需要了解上层文件系统的结构和内容,只需要保证目标磁盘设备的空间大于源设备就可以实现。

使用 dd 方式clone系统虽然具有和系统无关简单便利的特性,理论上总是能够成功。但是,这种方式需要 bit-to-bit 完整读取整个源磁盘,所以存在以下不足:

  • 必须完整读取磁盘,对于只使用了部分磁盘空间的系统复制效率很低

  • 无法选择只备份必要数据,造成存储资源浪费

  • 目标磁盘必须大于源盘,硬件上有限制

备份和恢复TF卡

clone的目标存储卡容量必须大于源存储卡容量,否则会导致复制失败。

  • 如果有两个存储卡可以直接接在同一台电脑上,则可以使用 dd 命令直接复制

  • 这里我只有一个TF转接卡,所以我先把原先的Jetson Nano的TF卡复制成压缩打包文件:

    sudo dd if=/dev/rdisk2 conv=sync,noerror bs=100m | gzip -c > ~/jetson_image.img.gz
    

备注

这里的 dd 命令是在 macOS上执行,所以和Linux参数上略有差异。

  • 打包成功以后,换成新的目标TF卡,再执行以下命令恢复备份:

    gunzip -c ~/jetson_image.img.gz | sudo dd of=/dev/rdisk2 bs=100m
    

完成恢复之后,使用新的TF卡启动Jetson Nano,验证是否成功。

磁盘分区修复

使用上述 dd 方式复制得到的TF卡实际使用空间和之前的源TF卡一样,因为完全是 bit-to-bit 复制。此时用 fdisk -l 查看,会有一行提示:

GPT PMBR size mismatch (61497343 != 249737215) will be corrected by w(rite).

以下则是当前磁盘分区,显示仅使用了大约30G空间:

Disk /dev/mmcblk0: 119.1 GiB, 127865454592 bytes, 249737216 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: gpt
Disk identifier: 43CAB209-E630-440C-8D77-5A7C6BD76C49

Device          Start      End  Sectors  Size Type
/dev/mmcblk0p1  28672 61495295 61466624 29.3G Linux filesystem
/dev/mmcblk0p2   2048     2303      256  128K Linux filesystem
/dev/mmcblk0p3   4096     4991      896  448K Linux filesystem
/dev/mmcblk0p4   6144     7295     1152  576K Linux filesystem
/dev/mmcblk0p5   8192     8319      128   64K Linux filesystem
/dev/mmcblk0p6  10240    10623      384  192K Linux filesystem
/dev/mmcblk0p7  12288    13055      768  384K Linux filesystem
/dev/mmcblk0p8  14336    14463      128   64K Linux filesystem
/dev/mmcblk0p9  16384    17279      896  448K Linux filesystem
/dev/mmcblk0p10 18432    19327      896  448K Linux filesystem
/dev/mmcblk0p11 20480    22015     1536  768K Linux filesystem
/dev/mmcblk0p12 22528    22655      128   64K Linux filesystem
/dev/mmcblk0p13 24576    24735      160   80K Linux filesystem
/dev/mmcblk0p14 26624    26879      256  128K Linux filesystem

Partition table entries are not in disk order.

我们需要修正GPT分区,并且将磁盘剩余空间使用起来。

  • 使用 parted 工具修正分区:

    parted -a optimal /dev/mmcblk0
    

显示:

GNU Parted 3.2
Using /dev/mmcblk0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Warning: Not all of the space available to /dev/mmcblk0 appears to be used,
you can fix the GPT to use all of the space (an extra 188239872 blocks) or
continue with the current setting?
Fix/Ignore?

这里答复: Fix

然后提示信息:

Model: SD SN128 (sd/mmc)
Disk /dev/mmcblk0: 128GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 2      1049kB  1180kB  131kB                TBC
 3      2097kB  2556kB  459kB                RP1
 4      3146kB  3736kB  590kB                EBT
 5      4194kB  4260kB  65.5kB               WB0
 6      5243kB  5439kB  197kB                BPF
 7      6291kB  6685kB  393kB                BPF-DTB
 8      7340kB  7406kB  65.5kB               FX
 9      8389kB  8847kB  459kB                TOS
10      9437kB  9896kB  459kB                DTB
11      10.5MB  11.3MB  786kB                LNX
12      11.5MB  11.6MB  65.5kB               EKS
13      12.6MB  12.7MB  81.9kB               BMP
14      13.6MB  13.8MB  131kB                RP4
 1      14.7MB  31.5GB  31.5GB  ext4         APP
  • 此时分区表已经被 parted 修复,所以,我们只需要输入 quit 命令退出程序。然后再次执行 parted -a optimal /dev/mmcblk0 就不再提示错误信息。并且使用 fdisk -l 也不再提示错误。

备注

我不知道为何Jetson创建了很多几百K的分区,而实际 / 根文件系统仅使用 /dev/mmcblk0p1 一个分区。这个以后再探索一下。

我准备采用外接的SSD移动硬盘作为Jetson Nano的存储,这样可以大幅度提升存储性能。相关测试实践我另外撰写。

参考