在MacOS上利用docker构建buildroot

以前有据说过docker,可是一直没有使用过。最近终于下定决定使用了一下docker,感受docker用于跨操做系统的软件工具使用仍是比较友好的。html

适用人群

本文忽略的部分Linux软件包安装的过程,须要读者有必定Linux操做基础,具备软件包查找与安装能力。docker

Docker的基本用法

在使用docker时,首先须要安装docker。安装完成后,经过从dockerhub上下载不一样系统环境的image,而后运行相应的image,完成docker的运行操做。shell

在docker的运行的过程,是经过docker命令调用image进行的运行,image运行的实体叫作container。image和container的关系比较像网吧系统的关系,网吧系统开机会加载操做系统,而且用户能够在操做系统中进行操做和修改;当系统关机重启后,再次开机的系统不会保留用户的更改,会还原成本来最初的系统状态。docker的过程与之相同,在docker使用image启动的container中,用户在container所作的操做并不会保存下来,而是会在用户退出的时候清除。macos

若是用户但愿保存下container中的修改,则须要将container保存成一个新的image,实现对修改的保存;或者使用共享磁盘的形式,将外部系统的目录共享到container内部,共享磁盘上的修改会被保留。ubuntu

从Docker Hub上下载image

docker官方提供了image的下载渠道dockerhub,地址为:https://hub.docker.com。vim

以Ubuntu为例,在dockerhub上,能够找到Ubuntu的image下载页面【https://hub.docker.com/_/ubuntu】,在该页面中能够看到不少不一样的Ubuntu的版本信息,经过api

docker pull ubuntu

 

能够完成对Ubuntu最新image的下载,也能够经过tag页面中根据tag寻找到所需的image,对指定的image进行下载。例以下载Ubuntu 1804的image,命令以下:bash

docker pull ubuntu:18.04

 

下载完成后,本地经过docker images命令能够看到所下载的镜像了。框架

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               7698f282e524        4 weeks ago         69.9MB

 

因为这个镜像只是一个最小的系统环境,包含了软件包安装命令apt,因此这个镜像很小。若是后续须要装更多的软件包,而且建立新的image,新的image的尺寸会变大。工具

运行image

使用docker运行image的命令以下:

docker run ubuntu:18.04 bash

 

上面的命令是经过docker调用了ubuntu:18.04image中的bash。可是该命令一闪而过,没有留下任何痕迹。这并非运行错误,而是由于bash运行完成以后退出了。若是不但愿运行后退出,而是留在终端里,能够经过下述命令来进行执行:

docker run -it ubuntu:18.04

 

上述命令运行完成后,能够停留在shell中,该shell是docker所运行的Ubuntu image的container的shell,能够看到命令提示以下:

root@7ab5341e698c:/# 

 

进入container后,用户为root,容器编号为7ab5341e698c,停留的目录为“/”。接下来,就能够在容器内进行各类操做了,能够经过apt命令去安装本身所需的软件。

 

!!注意!!

退出容器时,若是直接使用exit命令会致使容器退出,全部容器内部的更改将会丢失。若是只是想离开窗口而不退出容器,须要使用“ctrl + p,ctrl + q”这组命令来离开容器,容器将会在后台保持运行。容器在后台运行的状态能够经过“docker ps”进行查看,例如:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7ab5341e698c        ubuntu:18.04        "/bin/bash"         About an hour ago   Up About an hour                        vigilant_kapitsa
 

经过上述命令能够看到,容器在后台运行,命令的ID为“7ab5341e698c”。若是但愿再次进入到容器中,则能够经过attach命令再次进入到容器中。例如:

docker attach 7ab5341e698c

 

再次返回容器中,会继续看到容器内部shell的执行状态。若是返回容器中时,容器内部的shell正在执行命令,则会在shell处卡住。在shell处卡住时,经过“ctrl + c”命令可以结束当前命令的运行,也能够经过“ctrl + z”命令将执行的程序挂起,须要时经过“fg”恢复挂起程序的运行。

须要注意的是,在容器运行时,多个窗口经过attach命令链接容器,会进入到同一个shell中,致使shell的抢占,因此要尽可能使用多个attach操做链接同一个container。

保存container

在docker运行过程当中,安装好所需的软件工具后,能够经过“docker diff containner”命令看到有哪些修改,例如:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7ab5341e698c        ubuntu:18.04        "/bin/bash"         About an hour ago   Up About an hour                        vigilant_kapitsa

$ docker diff 7ab5341e698c
C /root
C /root/.viminfo
A /root/.vimrc

 

经过上述命令,能够看出在容器中,新增了viminfo和vimrc文件。为了保存这些修改,能够经过commit命令将container保存成一个新的image。命令以下:

docker commit -m "Add vimrc and viminfo" 7ab5341e698c myubuntu_1804:v0.1

 

经过上述命令,实现经过container 7ab5341e698c建立了一个名字为myubuntu_1804,tag为v0.1的image。下次运行docker的时候,能够直接运行该image。运行命令以下:

docker run -it myubuntu_1804:v0.1

 

经过该image运行的container中,包含了以前对viminfo和vimrc的更改,实现了对原容器的保存。

MacOS

在MacOS上,默认使用的文件系统是不区分大小写的,这对于Linux编译来讲会出现问题,因此须要建立一个区分大小写的扩展磁盘来存储buildroot项目文件。

在MacOS上,经过磁盘管理工具,能够在原有磁盘上新增一个添加到原磁盘上的卷宗。该卷宗能够与原磁盘共享存储空间,同时具备独立的磁盘格式。

新增卷宗时,将磁盘格式设置为“APFS区分大小写”,便可建立出一个新的区分大小写的卷宗。至此,MacOS上的磁盘准备工做就绪。

编译Buildroot

Buildroot是一个Linux平台上快速构建嵌入式Linux系统的框架,它可使用menuconfig进行配置,实现快速构建Linux工具链、rootfs等环境的工具。

从Buildroot的官方网站上能够下载到Buildroot的源码包,网址在:https://buildroot.org/download.html。下载完成后进行解压缩,便可获得Buildroot的工做目录。

在该目录中,存在configs目录,其中包含了默认的config信息,能够经过默认配置快速实现构建。

下文中,将使用”qemu_mips64el_malta_defconfig”做为默认配置,来讲明Buildroot的基本使用方法。

Docker共享磁盘

为了可以在docker内部使用Buildroot,能够经过使用共享磁盘的形式将Buildroot挂载到docker内部,而不用将Buildroot放在容器的文件系统内部。这样可以很方便的保留Buildroot的编译结果,而不用经过保存container的形式去保存变动。

因为使用了共享磁盘做为Buildroot的存储环境,因此须要注意的是:

该磁盘必须是区分大小写的,!!不然部分软件包编译会报错!!

该磁盘必须是区分大小写的,!!不然部分软件包编译会报错!!

该磁盘必须是区分大小写的,!!不然部分软件包编译会报错!!

能够经过如下命令将共享目录挂载到container内部:

docker run -it -v ${PWD}:/dockershare myubuntu_1804:v0.1

 

上述命令中,${PWD}指的是当前目录(全路径),”/dockershare”指的是container内部能够看到的共享目录路径(全路径)。上述命令执行完成后,便可将当前目录挂载到docker container内部,也能够经过将${PWD}替换成其余全路径,实现指定路径的挂载。

须要注意的是,外部路径必定是存储了Buildroot的路径,而且该路径中能够存放区分大小写的文件。

配置

经过加载共享磁盘的方式进入容器后,能够进入”/dockershare/buildroot-2019.05”路径(本文下载的是2019.05版本的Buildroot),在该路径中,能够经过直接调用defconfig的形式进行快速配置,如:

make qemu_mips64el_malta_defconfig

 

配置完成后,须要调整部分选项信息,则能够经过”make menuconfig”进入菜单,进行修改。

这里能够将默认的软件包下载仓库调整为Buildroot的备份仓库,这样能够加快下载速度,避免部分软件包没法下载的状况。调整的配置路径以下:

  │ Symbol: BR2_PRIMARY_SITE [=http://sources.buildroot.net]                │  
  │ Type  : string                                                          │  
  │ Prompt: Primary download site                                           │  
  │   Location:                                                             │  
  │     -> Build options                                                    │  
  │       -> Mirrors and Download locations
  
将该值设置为“http://sources.buildroot.net”

 

修改完配置后,便可经过ecs进行后退,到最后一层退出时提示保存配置信息,保存便可。

编译

在配置完成后,便可进入编译步骤。编译命令以下:

make source # 提早将软件包所有下载,可省略
make        # 进行编译

 

上述编译步骤中,”make source”是能够省略的。可是经过“make source”能够将编译所需的所有软件包进行下载,后续进行编译便可,减小了编译过程当中因为软件包没法下载致使的编译暂停。“make source”能够不执行,这样在编译的过程当中,须要编译某个软件包时再下载,也是能够的。

Buildroot能够“make”命令完成编译,编译完成后,在output目录下存放着编译结果。至此,所有操做结束。

相关文章
相关标签/搜索