> 技术文档 > 【Linux开发】docker加载完整镜像.img的方法

【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

       超时报错:

【Linux开发】docker加载完整镜像.img的方法

       于是,自己先从网上获取了一个完整镜像的压缩包,但它并非是由 docker save 导出的,不是 .tar ,而是 .img.gz,所以无法使用 docker load 导入


2 传输镜像至板卡

       当然,首先需要先把下载好的这个 .img.gz 包传输到开发板上

       开发板已联网且支持 SSH 的情况下,可以在 Windows PowerShell 中,使用 SCP 传输:

scp 包名.tar username@开发板IP:~/

       需要注意的是,如果是传输到开发板的指定目录,需要开发板根文件系统中存在该目录,否则应该在开发板上创建对应的目录,否则会报错:

【Linux开发】docker加载完整镜像.img的方法

​       正常传输时,显示如下:

【Linux开发】docker加载完整镜像.img的方法

       之后等待传输完成即可。

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),大家根据自己的需求更改即可。