开发环境

2023-06-24  本文已影响0人  咚咚董dyh

Linux

查看Unbuntu版本

lsb_release -a
uname -a
cat /proc/version

用户管理

useradd [-m 建立用户目录][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>][-u <uid>][用户帐号]

user=NAME
useradd $user -d /home/$user -g HwHiAiUser; cp -r /etc/skel/. /home/$user/
useradd -m -s /bin/bash $user; usermod -g HwHiAiUser $user
useradd -m -s /bin/bash -g HwHiAiUser $user
chown -R $user:HwHiAiUser /home/$user/
passwd $user

# 修改用户组
usermod -a -G HwHiAiUser $user

useradd通过命令添加用户,adduser在Ubuntu上通过交互式命令添加用户,Centos上两者没区别。

Linux 使用 adduser 与 useradd 添加普通用户

CentOS

清除yum缓存:

yum clean all
# 可选清除缓存,rm -rf /var/cache/yum/*

增删改yum源后,重新构建缓存:

yum makecache

CentOS上yum源在官方源的基础上,可配置EPEL(Extra Packages for Enterprise Linux)源,或安装Software collections(即centos-release-scl,具有持续更新的软件包)。

配置本地源,如配置EulerOS-2.0SP8源:

yum_path=/etc/yum.repos.d/euleros_aarch64.repo
echo "[base]" > ${yum_path}
echo "name=EulerOS-2.0SP8 base" >> ${yum_path}
echo "baseurl=MIRROR.DOMAIN/euler/2.8/os/aarch64/" >> ${yum_path}
echo "enabled=1" >> ${yum_path}
echo "gpgcheck=1" >> ${yum_path}
echo "gpgkey=MIRROR.DOMAIN/euler/2.8/os/aarch64/RPM-GPG-KEY-EulerOS" >> ${yum_path}

安装GCC/G++,若yum无法安装最新版本,则通过SCL安装

yum install devtoolset-7
ln -s /opt/rh/devtoolset-7/root/usr/include/c++/7 /usr/include/c++/7
source /opt/rh/devtoolset-7/enable  # 可将该行写入.bashrc

CentOS C++开发环境配置,仅供参考,有部分错误。

SSH

SSH登录很卡,关闭selinux(重启生效),Arm系统默认是打开的:

sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
setenforce 0
/usr/sbin/sestatus -v

设置ssh不断开:

sed -i "s/^export TMOUT.*/export TMOUT=0/g" /etc/profile
sed -i "s/.*ClientAliveInterval.*/ClientAliveInterval=600/g" /etc/ssh/sshd_config
sed -i "s/.*ClientAliveCountMax.*/ClientAliveCountMax=300/g" /etc/ssh/sshd_config
service sshd restart
export TMOUT=0

端口放开

新装系统默认开启了防火墙,可以放开端口:

# 永久放开
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
# 临时放开
iptables -I INPUT -p tcp --dport 8888 -j ACCEPT
iptables -I INPUT -p tcp --dport 1080 -j ACCEPT

查看进程

ps仅能查看进程启动命令的相对路径。启动一个进程时,在/proc/目录下会生成以进程号命名的文件夹,里面有多个文件记录了进程的详细信息:

删除进程

批量删除/杀死CMD中包含KEYWORD(如train.py)的进程:

kill -9 `ps -ef | grep <KEYWORD> | awk '{print $2}' `

在上述要求的基础上排除root进程:

ps -ef | grep <KEYWORD> | grep -v root | awk '{print $2}' | xargs kill -9

其中:

硬盘管理

查看目录所在硬盘空间信息

df -lh /home/

Linux中查看硬盘信息 (daemon369.github.io)

查看块设备,不带参数时列出所有硬盘,根节点代表硬盘,二级节点代表磁盘上的分区。使用-d选项只列出硬盘,不列出分区。

lsblk [-d]

常用命令

zip -qr html.zip /home/html

Linux 软连接,不要在目录最后加/。软连接实际是字符串映射,源路径(已存在)会被当作字符串,路径不存在也不会报错。源路径请用绝对路径,或在目标(软连接)所在父目录下能访问的路径。目标路径可相对/绝对,父路径不存在会报错,文件/目录已存在则失败(无提示)。

# ln [参数][源文件或目录][目标文件或目录]
ln -s /PATH/TO/data /home/USER/data
# 删除软连接
rm /home/USER/data
# 修改软连接
ln -s /PATH/TO/new_data /home/USER/data

Bash历史管理。

# 全部清除
history -c
# 删除某行
history -d <行号>
# 修改文件
vim ~/.bash_history
# 修改文件后需刷新缓存
history -r 

rsync同步文件到本地,中断后本地文件夹/文件无法删除,提示没有权限。可使用空文件夹/小文件覆盖,然后删除。可能要注意原命令里文件夹是否带有/,保持一致,否则可能失败。

rsync -rtv --delete USER@HOST:EMPTY_FOLDER DEL_FOLDER

?

sed -i "s/\r//" install.sh

系统代理

在打开的终端窗口里配置,仅在当前窗口有效,关闭后失效。

# no_proxy为例外,非必须
export no_proxy="127.0.0.1, localhost"
export http_proxy="http://[USER:PASSWORD@]PROXY.DOMAIN:PORT"
export https_proxy="http://[USER:PASSWORD@]PROXY.DOMAIN:PORT"

IDE

Conda

Miniconda — Conda documentation

配置国内镜像源:

新建环境:

# 查看环境
conda env list
# 或
conda info --envs
# 新建环境
conda create -n NAME pyton=3.9  # ==锁死小版本3.9.0,=不锁死小版本3.9.x
# 或拷贝已有环境,节省下载时间
conda create -n NEW --clone OLD

如果是非联网环境,可以通过打包并拷贝conda环境的方式,拷贝到相同目录后conda可以自动识别。要求绝对路径相同,如其他机器的同样用户名下的conda环境/root/miniconda3/envs

激活环境:

# 在base或某个conda环境下
conda activate ENV
# 若未在某个conda环境下
source ~/miniconda3/bin/activate ENV

设置代理:

# 配置(注意对特殊字符做URL Encode)
conda config --set proxy_servers.http http://[USER:PASSWORD@]PROXY.DOMAIN:PORT
conda config --set proxy_servers.https http://[USER:PASSWORD@]PROXY.DOMAIN:PORT
conda config --set ssl_verify false
# 删除
conda config --remove-key proxy_servers
# 查看
conda config --show proxy_servers

删除环境:

# 删除环境及所有包
conda remove -n ENV --all

conda安装环境时,可能会安装CUDA-Toolkit之类的库在~/miniconda3/lib下,部分程序可能默认访问/usr/local/cuda/lib64/下的库文件,导致报错,例如:

ImportError: torch/lib/libtorch_cuda_cpp.so: symbol cudaGraphRetainUserObject version libcudart.so.11.0 not defined in file libcudart.so.11.0 with link time reference

可以手动设置export LD_LIBRARY_PATH=~/miniconda3/lib/:$LD_LIBRARY_PATH解决问题。

如遇到CondaHTTPError: HTTP 000 CONNECTION FAILED,通常是网络不稳定,可在conda配置中删除channels, default_channels项,或者修改custom_channels项。目前发现:

如果在conda create ENV时遇到如下错误,可在conda配置中删除channels, default_channels项,因为镜像源可能不适合用于创建环境,使用默认的pkgs能解决。

Collecting package metadata (current_repodata.json): failed
UnavailableInvalidChannel: The channel is not accessible or is invalid.
  channel name: anaconda/pkgs/main
  channel url: http://mirrors.aliyun.com/anaconda/pkgs/main
  error code: 403

如果遇到如下索引错误,通常是因为缓存中的索引文件因异常中断导致格式错误,可以使用conda clean -i清除索引缓存。

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
ERROR conda.auxlib.logz:stringify(163): Expecting value: line 1 column 1 (char 0)

如果遇到如下包安全检查错误,通常是因为通过不同方式安装了相同的包,手动删除路径对应的tar包和目录即可。

SafetyError: The package for xxx located at /home/xxx/anaconda/... 
appears to be corrupted. The path ... 
has an incorrect size.
    reported size: 7680 bytes
    actual size: 5695 bytes

Python

# 配置清华源
pip config set global.index-url http://pypi.tuna.tsinghua.edu.cn/simple
pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn
# 删除配置
pip config unset global.index-url
pip config unset global.trusted-host
# 查看配置
pip config list

安装whl文件

pip install xxx.whl
# 卸载
pip uninstall xxx

源码安装库

cd xxx
python setup.py install
# 卸载
pip uninstall xxx

源码安装Python

cd Python-3.7.5
./configure --prefix=/root/miniconda3/envs/ci --enable-shared
make -j72
make install -j72
./configure --prefix=/root/miniconda3/envs/ci
make -j72
make install -j72

Jupyter

后台运行Jupyter,log会输出到nohup.out

nohup jupyter lab --ip=10.175.105.195 --port=1080 --allow-root &

CMake

支持非root用户安装:

OpenCV

官网:Home - OpenCV
安装:OpenCV: Installation in Linux
支持非root用户安装,配置CMAKE_INSTALL_PREFIX

# 从Github或者官网下载:[Releases - OpenCV](https://opencv.org/releases/)
wget -O opencv.zip https://github.com/opencv/opencv/archive/master.zip
unzip opencv.zip

# Create build directory
mkdir -p build && cd build

# Configure
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=$HOME/programs/opencv/ ..

# Build,或者make -j4,通过nproc命令查询线程数
cmake --build . -j4

# Install,将include目录和lib目录拷贝到`CMAKE_INSTALL_PREFIX`
# 如果不拷贝到系统目录,则无需sudo
sudo make install

CUDA支持,WITH_CUDA=ON, OPENCV_DNN_CUDA=ON。OpenCV 4.0之后所有CUDA加速库被移到opencv_contrib下,需要将opencv和opencv_contrib一起build,即增加配置OPENCV_EXTRA_MODULES_PATH

# build with all modules in opencv_contrib
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ../opencv
# build with one of opencv_contrib modules
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/cudaarithm ../opencv

# 示例
cmake .. -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=$HOME/programs/opencv/ \
-D WITH_CUDA=ON -D WITH_CUDNN=ON -D OPENCV_DNN_CUDA=ON -D WITH_CUBLAS=1 -D WITH_CUFFT=ON -D WITH_NVCUVID=ON \
-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.5.5/modules/

# 可选指定,未指定时自动识别
-D CUDNN_LIBRARY=/usr/local/cuda/lib64/libcudnn.so.8.3.3 \
-D CUDNN_INCLUDE_DIR=/usr/local/cuda/include  \
-D CUDA_CUDA_LIBRARY=/usr/local/cuda/lib64/stubs/libcuda.so

TensorRT

若使用root权限使用apt-get/yum安装,请下载deb/rpm包,否则请下载tar包,NVIDIA TensorRT 8.x Download

安装方法参考官方Install Guide,含deb、rpm、tar包等安装方法。

安装Boost

参考官网安装指导,支持非root用户安装,支持安装部分lib。在页面前部Get Boost获取源码下载链接,下载并解压,执行:

cd path/to/boost_1_82_0
./bootstrap.sh --prefix=$HOME/programs/boost_1_82_0/
./b2 install

安装GoogleTest/gtest

参考官方仓库使用指导,通常无需安装,直接下载源码,然后将源码集成到C++工程中。如需安装,下载源码,执行:

cd googletest        # Main directory of the cloned repository.
mkdir build          # Create a directory to hold the build output.
cd build

# Configure, Generate native build scripts for GoogleTest。 GoogleMock可选关闭。
cmake .. [-DBUILD_GMOCK=OFF] -D CMAKE_INSTALL_PREFIX=$HOME/programs/googletest/

# Build,或者make -j4,通过nproc命令查询线程数
cmake --build . -j4

# Install,将include目录和lib目录拷贝到`CMAKE_INSTALL_PREFIX`
# 如果不拷贝到系统目录,则无需sudo
sudo make install

C++编译器

GCC/G++,Clang/LLVM。
《CMake Best Practice》第 2 章笔记

将include目录添加到C/C++头文件搜索路径里:

export C_INCLUDE_PATH=/opt/rh/devtoolset-11/root/usr/include/c++/11
export CPLUS_INCLUDE_PATH=/opt/rh/devtoolset-11/root/usr/include/c++/11

在Ubuntu 22.04中安装Clang

sudo apt-get install libclang-14-dev clang-14

提示:libclang.so一般位于/usr/lib/x86-linux-gnu/libclang-10.so

在CentOS 7.6中安装Clang

yum install centos-release-scl-rh
yum install llvm-toolset-7.0-clang
# 使Clang在当前Session生效
source /opt/rh/llvm-toolset-7.0/enable
# 可选,修改.bashrc便于Clang自动生效
echo "source /opt/rh/devtoolset-7/enable" >> ~/.bashrc

配置环境变量。为防止后续Clang无法自动找到头文件,建议添加如下环境变量。

export CPLUS_INCLUDE_PATH=/opt/rh/llvm-toolset-7.0/root/usr/lib64/clang/7.0.1/include

提示:libclang.so一般位于/opt/rh/llvm-toolset-7.0/root/usr/lib64/libclang.so.7

在SLES 12.5中安装Clang

sudo zypper install libclang7 clang7-devel

配置环境变量。为防止后续Clang无法自动找到头文件,建议添加如下环境变量。

export CPLUS_INCLUDE_PATH=/usr/lib64/clang/7.0.1/include

提示:libclang.so一般位于/usr/lib64/libclang.so

Clang

安装Clang预编译包

# 使用`uname -m`可获取机器硬件架构,例如返回`x86_64`
# 使用`cat /etc/os-release`可获取系统名称、版本等信息
NAME=`cat /etc/os-release | awk -F= '{if ($1=="NAME") print $2}'`
VERSION_ID=`cat /etc/os-release | awk -F= '{if ($1=="VERSION_ID") print $2}'`

if [ "$NAME" == '"Ubuntu"' ];then
  # 在Ubuntu 22.04中安装Clang
  if [ $VERSION_ID == '"22.04"' ];then
    sudo apt-get install libclang-14-dev clang-14
  else
    # 在Ubuntu 18.04中安装Clang
    sudo apt-get install libclang-10-dev clang-10
  fi
elif [ "$NAME" == '"CentOS Linux"' ];then
  # 在CentOS 7.6中安装Clang
  yum install centos-release-scl-rh
  yum install llvm-toolset-7.0-clang
  ENABLE="source /opt/rh/llvm-toolset-7.0/enable"
  CPLUS_INCLUDE_PATH=/opt/rh/llvm-toolset-7.0/root/usr/lib64/clang/7.0.1/include
  # 可选,修改.bashrc便于Clang自动生效
  echo $ENABLE >> ~/.bashrc
  # 配置环境变量。为防止后续Clang无法自动找到头文件,建议添加如下环境变量。
  echo "export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH" >> ~/.bashrc
elif [ "$NAME" == '"SLES"' ];then
  # 在SLES 12.5中安装Clang
  sudo zypper install libclang7 clang7-devel
  CPLUS_INCLUDE_PATH=/usr/lib64/clang/7.0.1/include
  export $CPLUS_INCLUDE_PATH
  echo "export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH" >> ~/.bashrc
else
  echo "Warning: $NAME is not supported automatic installation of Clang, Please install it manually."
fi

# 必须通过`source`或`.`执行脚本,其中的环境变量才会在当前bash生效
# 新建bash也可以使环境变量立即生效
bash

源码编译安装Clang

如果无法通过上述方法或者包管理工具安装Clang>=6.0.0,可以在LLVM Release页面尝试
下载对应平台的安装包。如果以上方法都不可行,则可以通过源码编译安装LLVM和Clang,详细安装指导参考
Getting Started with the LLVM System。编译LLVM依赖一些软件包,
需用户提前确保依赖满足,或者自行手动安装依赖。下表列出了这些依赖,“包名”列是LLVM所依赖的软件包通常的名称,
“版本”列是“可以工作“的软件包版本,“说明”列描述了LLVM如何使用这个软件包。

包名 版本 说明
CMake >=3.20.0 生成Makefile/workspace
GCC >=7.1.0 C/C++编译器
zlib >=1.2.3.4 压缩/解压功能
GNU Make 3.79, 3.79.1 编译Makefile/build

下面以Clang7.0.0为例编译安装LLVM和Clang。

获取源码。通过Git获取源码,包括LLVM和Clang子工程,切换到对应版本。

git clone https://github.com/llvm/llvm-project.git
git checkout llvmorg-7.0.0

或者直接下载对应版本的源码zip包。

wget https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-7.0.0.zip
# 如果没有安装wget,可以采用curl
curl -o llvmorg-7.0.0.zip https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-7.0.0.zip
# 解压得到llvm-project-llvmorg-7.0.0目录
unzip -q llvmorg-7.0.0.zip

编译和安装LLVM和Clang。

cd llvm-project-llvmorg-7.0.0/; mkdir build; cd build
# 建议不开启libcxx;libcxxabi,使用默认的gcc/g++配套的libstdc++
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang" -G "Unix Makefiles" ../llvm
make -j32  # 将32换成小于所在机器CPU线程数的数字,或者去除数字,自动设定
make install  # 安装到默认位置/usr/local/lib/

配置环境变量。为防止后续Clang无法自动找到头文件,建议添加如下环境变量。

export CPLUS_INCLUDE_PATH=/usr/local/lib/clang/7.0.0/include

提示:libclang.so一般位于/usr/local/lib/libclang.so

CUDA

CUDA官网见CUDA Toolkit - Free Tools and Training | NVIDIA Developer,包含下载、发行说明、安装指导和文档。三方教程见保姆级安装NVIDIA CUDA、CUDNN

CUDA Toolkit与Toolkit Driver版本配套关系,参见CUDA 12.2 Release Notes,包括:

从CUDA 11开始,各个组件分别设置版本。

安装流程为:

  1. 下载CUDA Toolkit 12.2 Update 1 Downloads
  2. 安装:先安装CUDA Driver,再安装CUDA Tookit
  3. 配置环境变量

安装指导见:

Rust

在 Windows 上针对 Rust 设置开发环境 | Microsoft Learn

VSCode插件:Rust with Visual Studio Code

配置Rustup镜像源

配置Crates镜像源

.cargo/config配置示例

[source.crates-io]
replace-with = 'ustc'

[source.ustc]
registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"

[source.tsinghua]
registry = "sparse+http://mirrors.tuna.tsinghua.edu.cn/crates.io-index/"

[http]
check-revoke = false
上一篇 下一篇

猜你喜欢

热点阅读