嵌入式linux开发环境搭建(Docker版,基于iTop 4412开发板)

-1. 前言

为啥要用docker?

  • 据说docker挺火,尝试一下“新”技术(好多年了…)
  • 相对于VMware虚拟机,docker容器占用空间少,启动/关闭速度特别快,一秒搞定。
  • 闲的…

docker的安装步骤就不介绍了,可以去官网查查。

0. 环境

  • 宿主机:win10专业版,64位
  • 宿主机IP地址:192.168.100.186
  • docker:19.03.8
  • docker image:ubuntu 18.04

1. 需求分析

  • 基于ubuntu
  • ssh支持,端口22(默认)
  • nfs支持,端口2049(默认),9999(9999端口需要配置进行强行指定)
  • vim
  • net-tools
  • 交叉编译工具链、源码

2. 基本服务搭建

2.1 获取镜像

docker pull ubuntu:18.04

2.2 创建volume

docker volume create dataVolume

2.3 创建并打开容器

//创建容器
docker run -itd --name u1804 --privileged=true -p 9022:22 -p 9049:2049 -p 9999:9999 -v dataVolume:/work ubuntu:18.04

//进入容器
docker exec -it u1804 /bin/bash

创建容器时,容器内部的ssh端口22映射到宿主机的9022,nfs端口2049映射到宿主机的9049,mountd端口9999映射到宿主机的9999,因此在使用ssh和nfs服务时,需要注意指定对应端口。

在容器内部,想要退出容器时,可以直接执行exit命令。

2.4 软件源更新

//该命令在容器内部运行
apt-get update
apt-get upgrade

2.5 vim安装

//该命令在容器内部运行
apt-get install -y vim

2.6 net-tools安装

//该命令在容器内部运行
apt-get install -y net-tools

2.7 ssh-server搭建

//以下命令在容器内部运行

//安装server服务
apt-get install -y openssh-server

//开启服务
/etc/init.d/ssh start

//查看是否正常启动
ps -e | grep ssh

编辑/etc/ssh/sshd_config文件,将PermitRootLogin prohibit-password前面的注释符#去掉,并改为PermitRootLogin yes

//以下命令在容器内部运行
//重启服务
service ssh restart
//以下命令在容器内部运行
//设置ssh密码
passwd root

使用secureCRT或其他工具连接192.168.100.186:9022验证ssh功能是否正常。

注意:192.168.100.186是docker所在的宿主机的IP地址。

2.8 nfs-server搭建

//以下命令在容器内部运行
//安装nfs server服务
apt-get install -y nfs-kernel-server

修改/etc/exports文件,在文件末尾添加/work *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

修改/etc/default/nfs-kernel-server文件,将RPCMOUNTDOPTS="--manage-gids"修改为RPCMOUNTDOPTS="--manage-gids --port 9999"

//以下命令在容器内部运行
//使配置文件的修改生效
exportfs -r

//启动rpcbind服务
service rpcbind start

//重启nfs服务
service nfs-kernel-server start

在客户端使用如下命令挂载验证:

mount -t nfs -o nolock,vers=3,port=9049,mountport=9999 192.168.100.186:/work /mnt

注意:192.168.100.186是docker所在的宿主机的IP地址。

2.9 创建服务开启脚本

docker容器在重启之后,ssh和nfs等服务并不会自动开启,为了操作方便,我就写了个脚本。执行vim /bin/start_server创建脚本,并添加如下内容:

#!/bin/bash

/etc/init.d/ssh restart
service rpcbind restart
service nfs-kernel-server restart

为脚本添加可执行属性:chmod +x /bin/start_server

以后重启容器后,直接执行start_server即可开启服务。

3. 嵌入式编译环境搭建(基于iTop 4412)

3.1 Filezilla拷贝文件

iTop 4412需要的文件如下:

  • arm-2009q3.tar.bz2
  • CodeSign4SecureBoot_POP
  • CodeSign4SecureBoot_SCP
  • iTop4412_uboot_20180320.tar.gz
  • iTop4412_Kernel_3.0_20180604.tar.gz

这里,我们使用Filezilla软件将以上软件拷贝到之前创建的docker容器中。

  • 打开Filezilla软件后,使用ctrl+s快捷键打开站点管理器。

在这里插入图片描述

  • 点击新站点,主机配置为宿主机IP192.168.100.186,端口配置为9022,协议选择SFTP,登陆类型选择正常,用户名root,输入root账户密码。

在这里插入图片描述

  • 点击连接,即可连接到之前建立的容器(如果弹出对话框,直接点击确定

在这里插入图片描述

  • 将iTop 4412需要使用的文件全部拷贝到容器的/work/itop目录下。(/work下面没有itop文件夹,需要自己创建一个)

此时,docker容器中就包含了我们所需要的所有资源,接下来就需要到docker容器下/work/itop/目录进行操作了。

3.1 交叉编译工具链

  • 执行tar -xvf arm-2009q3.tar.bz2解压。
  • 修改/root/.bashrc,在文件的最后添加如下代码:
export ARCH=arm
export CROSS_COMPILE=arm-none-linux-gnueabi-
export PATH=$PATH:/work/itop/arm-2009q3/bin
  • 执行source /root/.bashrc命令使配置生效。
  • 分别执行echo $ARCH, echo $CROSS_COMPILE, echo $PATH验证配置是否正确。正常执行结果如下:

在这里插入图片描述

这个时候,就会遇到一个坑了。 咱们安装的是64位ubuntu系统,而交叉编译工具链式32位的,所以这个时候执行arm-none-linux-gnueabi-gcc -v总是会出错,就像这样:

在这里插入图片描述

明明PATH变量啥的都正确,就是提示找不到文件!!!

解决方案在这:https://blog.csdn.net/bryanwang_3099/article/details/105701328

按照上面的方案搞定之后,执行arm-none-linux-gnueabi-gcc -v,结果就变成了这样:

在这里插入图片描述

3.2 uboot编译

  • 执行tar -xvf iTop4412_uboot_20180320.tar.gz解压
  • 切换到uboot源码目录:cd /work/itop/iTop4412_uboot
  • 执行apt-get install -y make安装make工具
  • 打开Makefile文件,搜索ifeq ($(ARCH),arm),注释掉紧邻着的CROSS_COMPILE定义语句,改成CROSS_COMPILE = arm-none-linux-gnueabi-,修改后,代码如下:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-none-linux-gnueabi-
endif
  • 执行./build_uboot.sh SCP_1GDDR编译uboot

3.3 Linux Kernel编译

  • 执行tar -xf iTop4412_Kernel_3.0_20180604.tar.gz解压源码
  • 切换到源码目录:cd /work/itop/iTop4412_Kernel_3.0
  • 创建配置文件:cp config_for_linux_scp_elite .config
  • 修改Makefile,将CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-改为CROSS_COMPILE ?= arm-none-linux-gnueabi-
  • 修改kernel/timeconst.pl文件第373行,将if (!defined(@val)) {改为if (!(@val)) {
  • 编译内核:make zImage

4. 常用docker操作

4.1 启动docker容器

docker start u1804

4.2 进入docker容器

docker exec -it u1804 /bin/bash

4.3 退出docker容器

//在容器内部,执行exit命令
exit

4.4 停止docker容器

docker stop u1804

4.5 重启docker容器

docker restart u1804
Logo

更多推荐