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