嵌入式开发环境搭建——Docker+WSL2
Docker安装Ubuntu
Docker基本命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32docker search Ubuntu #从Docker Hub上查找ubuntu镜像
docker pull Ubuntu #从Docker Hub上下载ubuntu镜像
docker images -a #列出本地所有的镜像
docker rmi Ubuntu #从Docker中删除Ubuntu镜像
docker commit -m "提交的描述信息" -a "作者" 容器ID 要创建的目标镜像名称:[标签名]提交容器使之成为一个新的镜像
如:docker commit -m "新的tomcat" -a "lizq" f9e29e8455a5 mytomcat:1.2
docker run [OPTIONS] IMAGE #根据镜像新建并启动容器。IMAGE是镜像ID或镜像名称
OPTIONS说明:
--name=“容器新名字”:为容器指定一个名称
-d:后台运行容器,并返回容器ID,也即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-p:指定端口映射,有以下四种格式:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
docker ps #列出当前所有正在运行的容器
docker ps -a #列出所有的容器
docker ps -l #列出最近创建的容器
exit #退出并停止容器
Ctrl+p+q #只退出容器,不停止容器
docker start #容器ID或容器名称启动容器
docker restart #容器ID或容器名称重新启动容器
docker stop #容器ID或容器名称停止容器
docker kill #容器ID或容器名称强制停止容器
docker rm #容器ID或容器名称删除容器
docker rm -f #容器ID或容器名称强制删除容器
docker exec -it #容器ID进到容器内Docker运行Ubuntu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27> docker pull ubuntu
> docker run -it -p 22000:22 -v /D:/mnt ubuntu /bin/bash #把D盘映射到ubuntu /mnt 目录下并运行bash 端口映射
root@4f25326b0866:~# cat /etc/*-release #查看下OS信息
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.3 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
> apt-get update #更新软件源
> apt-get install openssh-server openssh-client vim #安装ssh服务端和客户端 vim编辑器
> service ssh start #启动ssh服务
> vim /etc/ssh/sshd_config #编辑/etc/ssh/sshd_config 增加PermitRootLogin yes port 22 注释#UsePAM yes
> service ssh restart #重启ssh服务TIPS 忘记映射端口如何新增
1
2
3
4
5
6
7
8
9> docker stop 4f25326b0866 #停止ID
> docker commit 4f25326b0866 ubuntu_dev #重新镜像一个image名称未Ubuntu_dev
sha256:474bc763fada7a618d66b2ea57759792dd4689f0102f599e08a02509add3ceea
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_dev latest 474bc763fada 21 seconds ago 271MB
ubuntu latest fb52e22af1b0 4 weeks ago 72.8MB
> docker run -it -p 22000:22 ubuntu_dev #映射端口22000 至docker的22Docker运行自动开启ssh服务
首先我们想到的可定使用
systemctl
,一般我们如果不是用的docker 容器的话都这么干1
sudo systemctl enable ssh
但是在容器中是无法这么干的,因为docker容器并没有使用
systemctl
的权限这里可以用脚本解决
1
2vim /root/startup_run.sh
chmod +x /root/startup_run.shstartup_run.sh 脚本内容
1
2
3
4
5
6#!/bin/bash
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$LOGTIME] startup run..." >>/root/startup_run.log
service ssh start >>/root/startup_run.log
#service mysql start >>/root/startup_run.log将脚本加入到启动文件中
1
vim /root/.bashrc
在
.bashrc
末尾增加如下语句1
2
3
4# startup run
if [ -f /root/startup_run.sh ]; then
. /root/startup_run.sh
fi这样就能实现开机启动ssh了
经多方调研,发现镜像启动时,自动执行的是~/.bashrc文件,所以,环境变量需要配置在该文件内,这样镜像启动时,可自动执行该文件,使环境变量生效。
安装CMake
1
apt-get install cmake
安装gcc g++
1
apt-get install build-essential
指定交叉编译器
下载交叉编译器https://releases.linaro.org/components/toolchain/binaries/
放入D:\ToolChain\gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf
之前将D盘映射到了/mnt目录下 /mnt/ToolChain/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin
配置环境变量
1
2
3
4
5
6
7
81、打开编辑~/.bashrc 文件
vim ~/.bashrc
2、在最底部添加以下内容
export PATH=$PATH:/mnt/ToolChain/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin
3、使环境变量立即生效
source ~/.bashrc
4、验证有没生效
arm-linux-gnueabihf-gcc -v
VS Code ssh远程连接
安装VS Code
安装插件
Remote-SSH
Remote Explorer中新建ssh 连接到docker的Ubuntu
ssh root@localhost -p 22000
安装插件
CMake
CMake Tools
C/C++
GDB Server远程调试
拷贝可执行程序到开发板这里以生成的mqtt为例
1
2
3
4scp mqtt root@192.168.10.2:/tmp
scp ../lib/libpaho-mqtt3a.so root@192.168.10.2:/tmp/libpaho-mqtt3a.so.1
scp ../lib/libpaho-mqtt3c.so root@192.168.10.2:/tmp/libpaho-mqtt3c.so.1
scp /mnt/ToolChain/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/gdbserver root@192.168.10.2:/tmpssh 连接至开发板
1
2
3
4ssh root@192.168.10.2
cd /tmp
export LD_LIBRARY_PATH=/tmp:$LD_LIBRARY_PATH #新增libpath
./mqttgdbsever远程调试
1
gdbserver 192.168.10.4:1234 mqtt
问题
gdb 提示没有libncurses5安装
1
2
3
4
5https://stackoverflow.com/questions/17005654/error-while-loading-shared-libraries-libncurses-so-5
find /usr/lib/ -name *ncurses*
$ sudo ln -s /usr/lib/libncursesw.so.6.0 /usr/lib/libncurses.so.5
$ sudo ln -s /usr/lib/libncursesw.so.6.0 /usr/lib/libtinfo.so.5提示没安装libpython2.7
1
apt-get install libpython2.7