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

  • Post author:
  • Post category:linux




嵌入式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

    快捷键打开站点管理器。

在这里插入图片描述

  • 点击

    新站点

    ,主机配置为宿主机IP

    192.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



版权声明:本文为w0801101117原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。