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