【Linux开发】docker加载完整镜像.img的方法
文章目录
- 1 背景
 - 2 传输镜像至板卡
 - 3 加载镜像
 - 4 加载容器
 
1 背景
由于 Docker Hub 在国内大部分地区连接不稳定,在尝试直接在嵌入式开发板上使用 HOST 模式安装 OpenWRT 容器:
sudo docker run -d --name=openwrt --network host --privileged --restart always ophub/openwrt-aarch64:latest
超时报错:

       于是,自己先从网上获取了一个完整镜像的压缩包,但它并非是由 docker save 导出的,不是 .tar ,而是 .img.gz,所以无法使用 docker load 导入。
2 传输镜像至板卡
       当然,首先需要先把下载好的这个 .img.gz 包传输到开发板上。
开发板已联网且支持 SSH 的情况下,可以在 Windows PowerShell 中,使用 SCP 传输:
scp 包名.tar username@开发板IP:~/
需要注意的是,如果是传输到开发板的指定目录,需要开发板根文件系统中存在该目录,否则应该在开发板上创建对应的目录,否则会报错:

 正常传输时,显示如下:

之后等待传输完成即可。
3 加载镜像
在嵌入式板卡上进行对应的目录,先把镜像解压出来:
gunzip 包名.img.gz
       执行完后,会得到 .img 文件,也就是后面一切的开始:

       首先,需要查看 .img 文件的分区布局,找到根文件系统所在的分区:
fdisk -lu 镜像名.img
执行结果如下:

       .img 可以认为是一个完整的系统,一般来说,第一个分区通常是 boot 分区,第二个分区通常是根文件系统分区。我们运行镜像,只关注根文件系统分区即可。所以,我们需要记录下 img2 的 start ,这里的单位是以扇区为单位的,我们这里需要先换算成字节,比如我这里是 ,557056 x 512 字节/扇区就是 285212672,记录下这个值。
       然后通过 mount 命令来挂载 .img 文件的根文件系统分区,当然我们需要先创建一个路径:
mkdir /mnt/openwrt_rootfssudo mount -o loop,offset=上面的计算结果 openwrt.img /mnt/openwrt_rootfs
把上面的计算结果带入命令中,执行后,我们可以尝试进入那个目录,确保没有问题:

cd /mnt/openwrt_rootfs
       挂载完根文件系统后,我们可以自己将根文件系统打包为 .tar 文件(即人为生成):
cd ~sudo tar -cvf openwrt-rootfs.tar -C /mnt/openwrt_rootfs .
这里解压到当前目录,大家可以根据自己需求调整。镜像比较大的话,可能会运行时间较长.

完成后,就可以卸载挂载了:
sudo umount /mnt/openwrt_rootfs
而接下来的操作,基本就与其它加载容器的教程差不多了。
4 加载容器
       首先,使用 docker import 导入 .tar 文件:
docker import openwrt-rootfs.tar openwrt-docker:latest
接着,验证镜像是否创建成功:
docker images
如果没有问题,就可以直接运行容器了:
docker run -d \\ --name openwrt \\ --privileged \\ --network host \\ openwrt-docker:latest \\ /sbin/init
       这里我因为是用的 OpenWRT容器,所以需要使用特权模式 (--privileged) 和主机网络 (--network host),大家根据自己的需求更改即可。


