搭建ubuntu容器内C/C++开发调试环境
一、创建容器
为了让容器内的调试器(gdb、lldb)能够正常调试,在创建容器时需要添加参数:
podman添加参数:--cap-add=SYS_PTRACE
,docker添加参数--cap-add=SYS_PTRACE --security-opt seccomp=unconfined
否则报错:Error disabling address space randomization: Operation not permitted
如果是使用podman则使用命令:
1sudo podman run -itd -p 2023:22 --name ubuntu --cap-add=SYS_PTRACE docker.io/library/ubuntu
如果是docker则使用命令:
1sudo docker run -itd -p 2023:22 --name ubuntu --cap-add=SYS_PTRACE --security-opt seccomp=unconfined docker.io/library/ubuntu
名字可以随便取,将主机某个端口映射到容器中的22端口,方便远程SSH,这里为2023。
使用sudo podman attach <容器ID>
连接到创建的容器,就进入Shell控制台了。
二、安装软件
1、安装openssh-server
ubuntu在安装软件前需要使用apt update
进行源更新。然后使用apt install openssh-server
安装openssh-server
方便远程SSH连接。
1apt update
2apt install openssh-server
3mkdir /run/sshd
4/usr/sbin/sshd&
安装好openssh-server
需要先创建/run/sshd
目录才能启动,否则报错:
1Missing privilege separation directory: /run/sshd
由于ubuntu默认情况是不允许使用root用户远程连接的,所以需要添加一个账号然后使用这个账号进行远程SSH连接,比如使用adduser admin
添加一个admin
账号。
1# adduser admin
2Adding user `admin' ...
3Adding new group `admin' (1000) ...
4Adding new user `admin' (1000) with group `admin' ...
5Creating home directory `/home/admin' ...
6Copying files from `/etc/skel' ...
7New password:
8Retype new password:
9passwd: password updated successfully
10Changing the user information for admin
11Enter the new value, or press ENTER for the default
12 Full Name []:
13 Room Number []:
14 Work Phone []:
15 Home Phone []:
16 Other []:
17Is the information correct? [Y/n] y
2、安装其它必要软件
1apt install sudo net-tools vim
2apt install gcc g++ gdb
sudo
方便远程连接时,可以使用root权限;net-tools
主要是可以使用netstat
查看监听端口。
如果要安装clang和lldb工具链,使用:
1sudo apt install clang-15 lldb-15
2sudo ln -s /usr/bin/clang-15 /usr/bin/clang
3sudo ln -s /usr/bin/clang++-15 /usr/bin/clang++
4sudo ln -s /usr/bin/lldb-15 /usr/bin/lldb
5sudo ln -s /usr/lib/llvm-15/bin/lldb-server-15.0.7 /usr/bin/
如果想使用源码安装最新版本的GCC、GDB、clang、lldb,可以使用下面的命令来下载、编译、安装:
GCC:
1cd ~
2gcc_version=13.2.0
3gcc_URL=https://mirrors.aliyun.com/gnu/gcc/gcc-${gcc_version}/
4curl -LO -C - --no-verbose ${gcc_URL}gcc-${gcc_version}.tar.xz # 下载GCC安装包,`-C -`支持断点续传
5tar xf gcc-${gcc_version}.tar.xz
6cd gcc-${gcc_version}
7./contrib/download_prerequisites # 下载依赖包
8mkdir -p build
9cd build
10../configure --prefix=/usr/local --enable-languages=c,c++ --enable-multilib --enable-nls --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --enable-multiarch --enable-plugin --enable-default-pie --with-system-zlib --enable-threads=posix --enable-checking=release --with-tune=generic --enable-bootstrap
11yum install -y glibc-devel.i686 # 如果是CentOS系统,可能会需要此命令,否则会编译不过
12make -j8
13make install
14cd gmp
15make install # 安装gmp
16cd ~
17
18rm /usr/bin/c++
19update-alternatives --install /usr/bin/cc cc /usr/local/bin/gcc 100
20update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 100
21update-alternatives --install /usr/bin/c++ c++ /usr/local/bin/g++ 100
22update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 100
23
24echo "/usr/local/lib" > /etc/ld.so.conf.d/local.conf
25echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local.conf
26mv /usr/local/lib64/`readlink /usr/local/lib64/libstdc++.so.6`-gdb.py /usr/local/ # 先把安装的py文件移动出来,不然ldconfig会报错
27ldconfig
GDB:
1cd ~
2gdb_version=13.2
3gdb_URL=https://mirrors.aliyun.com/gnu/gdb/
4curl -LO -C - --no-verbose ${gdb_URL}gdb-${gdb_version}.tar.xz
5tar xf gdb-${gdb_version}.tar.xz
6cd gdb-${gdb_version}
7mkdir build
8cd build
9../configure
10make -j8
11make install
12cd ~
llvm:
1yum install -y python3 python-devel python3-devel swig3 libxml2-devel libedit-devel bison gettext doxygen graphviz # 如果是CentOS可能需要安装这些包
2llvm_version=16.0.6
3llvm_URL=https://github.com/llvm/llvm-project/releases/download/llvmorg-${llvm_version}/
4curl -LO -C - --no-verbose ${llvm_URL}llvm-project-${llvm_version}.src.tar.xz
5tar xf llvm-project-${llvm_version}.src.tar.xz
6cd llvm-project-${llvm_version}
7cmake -S llvm -B build -G "Unix Makefiles" -DLLVM_HOST_TRIPLE="x86_64-linux-gnu" -DLLVM_DEFAULT_TARGET_TRIPLE="x86_64-linux-gnu" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;lld;lldb" -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi"
8make -C build -j8
9make -C build install
三、配置
1.让openssh-server启动时自动运行
前面是使用/usr/sbin/sshd&
来直接运行openssh-server
的,但是每次重启容器后,都需要手动执行这条命令才能远程SSH连接,很麻烦,可以让它在启动时自动运行。
之前笔者的博文
配置与管理Ubuntu 21.10中
让容器启动即运行SSH服务一节中有介绍CentOS系统如何在容器启动时就运行SSH服务,但是Ubuntu有点不一样,它不会执行/etc/profile.d/
下的脚本。这里使用了简单粗暴的方法,直接修改root
用户的.bashrc
。
如果是非root用户,使用sudo -i
则会进入root
用户,然后在root
用户目录编辑.bashrc
,在最后添加:
1if [[ `ps -e |grep sshd |grep -v "grep" |wc -l` == 0 ]]
2then
3 /usr/sbin/sshd &
4fi
2.修改locale以显示中文
由于ubuntu默认的locale是POSIX
不能正常显示中文,需要修改为UTF-8
字符编码才能显示中文,可以安装中文zh_CN.UTF-8
,如果只是显示中文也可以使用自带的C.utf8
。
1admin@dce3e311d883:~$ locale
2LANG=
3LANGUAGE=
4LC_CTYPE="POSIX"
5LC_NUMERIC="POSIX"
6LC_TIME="POSIX"
7LC_COLLATE="POSIX"
8LC_MONETARY="POSIX"
9LC_MESSAGES="POSIX"
10LC_PAPER="POSIX"
11LC_NAME="POSIX"
12LC_ADDRESS="POSIX"
13LC_TELEPHONE="POSIX"
14LC_MEASUREMENT="POSIX"
15LC_IDENTIFICATION="POSIX"
16LC_ALL=
使用locale -a
查看所有可用的locale
:
1locale -a
2C
3C.utf8
4POSIX
为了让默认的locale
改为C.utf8
,添加或者修改/etc/default/locale
,ubuntu容器默认是没有这个文件的。sudo vim /etc/default/locale
新建:
1LC_ALL="C.utf8"
2LANG="C.utf8"
四、SSH远程连接
远程连接工具比较多,这里介绍一下 Win10自带的OpenSSH工具。
如何安装可以参阅官网 使用 Windows 设置来安装 OpenSSH
安装好后的OpenSSH在C:\Windows\System32\OpenSSH
目录下。
格式:
ssh -p 端口 用户名@IP
注意:如果之前创建并连接过相同配置的容器,即IP、账号、端口一致的容器,然后重新创建了,则可能会报错误Host key verification failed
:
1ssh -p 2023 admin@IP
2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
3@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
5IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
6Someone could be eavesdropping on you right now (man-in-the-middle attack)!
7It is also possible that a host key has just been changed.
8The fingerprint for the ECDSA key sent by the remote host is
9SHA256:4jOJDemqtgvc864kff6h/Fpp3F+6DuGNRsOBkV9kB+U.
10Please contact your system administrator.
11Add correct host key in C:\\Users\\admin/.ssh/known_hosts to get rid of this message.
12Offending ECDSA key in C:\\Users\\admin/.ssh/known_hosts:1
13ECDSA host key for [IP]:2023 has changed and you have requested strict checking.
14Host key verification failed.
此时只需要根据提示,打开C:\Users\admin/.ssh/known_hosts文件,找到[IP]:端口
相匹配的一行记录删除即可。
- 原文作者:Witton
- 原文链接:https://wittonbell.github.io/posts/2023/2023-06-05-搭建ubuntu容器内C_C++开发调试环境/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。