Linux学习笔记 #4 服务器环境配置

本文最后更新于:2024年5月6日 下午

上一节 Linux学习笔记 #3 连接远程服务器 中,介绍了远程控制 Linux 服务器的情景。假设我们已经完成了初次 SSH 鉴权,以下内容为后续的操作。

当新用户登录服务器时,会默认在 /home/user 目录下,此时这里只有配置好的 .ssh 目录。用户目录下的所有配置仅会与用户个人绑定,包括 Python、Conda、Git、Bash 等环境,所以此时我们需要一一配置。

/home/user 目录通常空间有限,因此对于开放权限较高的私人服务器,用户目录只用于存放个人使用的配置文件。而工程以及大文件则会存放在另外的 /data/user 目录下,以节省服务器的存储空间。下面我们称 /home/user 目录为 ~

Anaconda 环境

首先需要安装 Anaconda 环境,使用 wget 命令从清华镜像源下载(该命令由 Unix 自带),不需要下载最新版(这里选用的版本仅支持到 Py3.8):

1
$ wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2020.02-Linux-x86_64.sh

下载完成后,当前目录下就会出现 .sh 脚本形式的安装包,输入以下命令运行:

1
$ bash ./Anaconda3-2020.02-Linux-x86_64.sh

一路 Enter 确定,最后输入 yes,安装后可用 conda -V 查看版本。如果这里提示无法识别命令,参考接下来的做法即可。

虚拟环境

~ 目录下,还有一个 .bashrc 文件,对于大部分 Unix 系统,Bash 是作为默认终端被安装的。你对 bashrc 所做的任何修改将在下一次启动终端时生效。如果你想立刻生效的话,运行下面的命令:

1
$ source ~/.bashrc

此时会发现用户名前面就会有一个 (base),表示现在处于基础环境中。Conda 集成了 Python 发行版,同时可以对 Python 虚拟环境进行管理,常用的命令有:

  • conda create -n <env_name> python=<ver>:创建 conda 环境。
  • conda create -n <env_name> --file <this file>:创建 conda 环境并指定 requirement.txt 路径配置。
  • conda create -n <new_env> --clone <old_env>:复制原有 conda 环境。
  • conda env listconda info -e:查看现有的 conda 环境。
  • conda activate <env_name>:切换 conda 环境。
  • conda deactivate:关闭虚拟环境。
  • conda remove -n <env_name> --all:删除环境。
  • conda list --export > environment.yml:导出环境配置列表。
  • conda env create -f environment.yml:根据环境配置列表创建新环境。

良好的环境管理习惯有益于在同一机器上运行多个深度学习框架而相互之间不会影响,用户创建的环境会被保存在 ~/anaconda3/env/xxx,需要时可以直接拷贝。

CUDA 环境与 PyTorch

安装完 Anaconda 后,我们就能使用 pipconda 两种包管理器了(此前只能用 Linux 自带的 apt)。

在服务器里,我们只推荐用 conda 安装 cudatoolkitcudnn 以及 jupyter 相关的包,其他包建议用 pip 进行安装。

这里建议使用 11.1 版本的 CUDA 环境,使用 condaconda-forge 源下进行安装:

1
$ conda install -c conda-forge cudatoolkit=11.1 cudnn 

安装在基本环境后,可以使用 nvcc -V 查看 CUDA 版本。

有的服务器不装 CUDA 也能使用 GPU,是因为 Nvidia 显卡自带了驱动,如果使用 nvidia-smi 命令可以查看显卡状态则说明自带驱动(上方会注明驱动版本、CUDA 版本,但此时可能用不了 nvcc 命令)。

初次登录可以先测试 nvidia-smi,否则就需要手动安装 N 卡驱动:

1
2
3
$ sudo add-apt-repository ppa:graphics-drivers/ppa  # 把显卡驱动加入PPA
$ ubuntu-drivers devices # 查找当前设备适合的驱动版本
$ sudo apt-get install nvidia-driver-418 # 安装对应版本

第三方库

使用 pip 进行安装时,建议安装在虚拟环境中,特别是一些不常用的包。如果下载过慢或失败,可以使用清华源进行下载,使用以下命令在个人配置中更新及换源:

1
2
$ pip install -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple
$ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

如果不方便换源,临时使用的方法为:

1
$ pip install <package> -i https://pypi.tuna.tsinghua.edu.cn/simple

这里以 PyTorch 为例,我们将其装在虚拟环境中,使用以下命令,不同库之间用空格隔开可一并安装:

1
$ pip install torch torchvision torchaudio

为什么 PyTorch 不要装在基本环境?因为安装高版本的 PyTorch 时会自动替换 Numpy 等依赖库至相应版本。而这些自动替换的基础库很有可能与其他高级库产生不匹配的冲突,导致原先功能无法正常使用,也就是原先的运行环境会被污染。此外这样也便于虚拟环境的拷贝。

成功安装后可以在命令行里打开 Python 测试:

1
2
3
4
5
6
7
8
9
>>> import torch
>>> torch.__version__
>>> torch.cuda.is_available()
>>> torch.cuda.device_count()
>>> torch.tensor([1.0, 2.0]).cuda()
# 1.9.1+cu11.1
# True
# 4
# tensor([1., 2.], device='cuda:0')

下面列举需要安装在基本环境中的常用库,安装方法同上:

  • gpustat:用于查看动态查看 GPU 状态(需要 Nvidia 驱动),watch -n1 -c gpustat --color
  • ipdb:用于简易的断点调试,可以看做 pdb 的升级版,python -m ipdb main.py

Notebook

有时候需要在远程服务器中使用 Jupyter Notebook,就需要先在远程安装:

1
$ conda install -c conda-forge jupyter notebook

之后就可以在远程启动 Jupyter 服务,内核放在远程:

1
$ jupyter notebook --port=8889

启动后会获得服务的 URL 地址,这个地址可以在本地用浏览器直接打开,也可以在 VSCode 中安装 Jupyter 插件后打开。

个人配置

如果这个服务器需要长期使用,那么进行下面的配置就很有必要。以下大部分内容需要用 apt 包管理器安装,因此需要获取 sudo 临时管理员权限,如果没有可以向管理员申请。

Git 配置

安装 Git 后,在 ~ 下就会存在一个 .gitconfig.config/git/config 的文件,如果没有则需自行安装:

1
$ sudo apt-get install git -y  # -y 表示默认 yes

在服务器里配置 Git 有三层,每层的配置(系统 --system 、全局 --global、仓库 --local)都会覆盖掉上一层次的配置,这里要修改 ~ 下的个人配置,则需要用到 --global

1
2
3
4
5
6
7
8
# 替换成个人信息!
$ git config --global user.name "hewei2001"
$ git config --global user.email "[email protected]"
# 解除 GitHub x
$ git config --global http.postBuffer 524288000
# 常用的指令可以取 alias 别名
$ git config --global alias.showlog "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
# 如果要修改指定仓库下的配置,则可以替换成 --local

如果需要建立远程 SSH 鉴权,使用以下命令打印出公钥,手动复制到 GitHub 上:

1
2
3
$ ssh-keygen -t rsa -C "[email protected]"  # 生成
$ cat ~/.ssh/id_rsa.pub # 打印
$ ssh -T [email protected] # 测试

oh-my-zsh

首先检查服务器可用终端是否包含 zsh,如果有直接切换,并安装插件管理器 oh-my-zsh

1
2
3
4
5
6
$ cat /etc/shells  # 打印可用终端,看有没有 /bin/zsh 
$ chsh -s /bin/zsh
$ git clone https://gitee.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
$ cp ~/.zshrc ~/.zshrc.bak # 备份原配置
$ cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
$ source ~/.zshrc

如果没有自带 zsh,完成以下几步后,就可以成功安装二者:

1
2
3
4
5
$ sudo apt-get install zsh -y
$ git clone https://g.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
$ cp ~/.zshrc ~/.zshrc.bak # 备份原配置
$ cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
$ chsh -s /bin/zsh # 切换终端

如果执行第一步时无 sudo 权限,则需要自行安装资源包及依赖,参考:Linux 以非 root 用户安装 zsh

重启系统,此时已经进入新的 zsh 终端,下载将要用到的主题和插件:

1
2
3
4
5
# 主题 powerlevel10k
git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/themes/powerlevel10k
# 两个插件
git clone --depth=1 https://gitee.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone --depth=1 https://gitee.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

打开 .zshrc手动修改以下配置:

1
2
3
4
5
6
7
8
9
# 主题,如果要用自带的主题推荐 bira
ZSH_THEME="powerlevel10k/powerlevel10k"
# 插件
plugins=(git
tmux
z
extract
zsh-autosuggestions
zsh-syntax-highlighting)

oh-my-zsh 自带的插件定义了常用的别名,可以用 alias 命令查看:

1
2
3
4
5
6
7
8
9
10
11
# git 相关
gaa = git add --all
gcmsg = git commit -m
ga = git add
gst = git status
gp = git push
# tmux 相关
tl = tmux list-sessions
tkss = tmux kill-session -t
ta = tmux attach -t
ts = tmux new-session -s

下面是部分自带的插件、需要手动安装的插件介绍:

  • z:在常用目录之间直接跳转,使用 z <dir_name>
  • extract一键解压各种形式压缩包,使用 x <file_name>
  • gitignore:一键生成 gitignore 模板,使用 gi python > .gitignore
  • cpv:带进度条复制文件,使用 cpv <a> <b>
  • colored-man-pages:带颜色的 man 菜单。
  • sudo:上一条命令忘记加 sudo,双击 ESC 就会自动加上。
  • zsh-autosuggestions命令补全插件,需要手动安装。
  • zsh-syntax-highlighting命令高亮插件,需要手动安装。
  • tldr:简化 man 菜单,使用 tldr <command>。需要手动安装并更新数据库。

之前在 .bashrc 里的一些配置也要搬过来,主要有 Conda 环境的路径配置和一些 alias,配置完成后使用 source ~/.zshrc 命令重启终端即可。之后会进入主题的引导设置,如果想重新配置可以输入 p10k configure 命令。

有时候配置完 zsh 后会使用不了 pip 等命令,出现 zsh: command not found: xxx 报错,这时候需要在 ~/.zshrc 中找到 User configuration 位置,将 ~/.bash_profile 或者 ~/.profile 中的跟系统路径有关的命令复制进去。(export $(cat /proc/1/environ |tr 0 n | xargs --null)

反向代理

加载预训练模型时,总是不可避免地要去访问国外下载源,而部署在国内网络的服务器则无能为力。此时就需要在主机使用 VPN,通过「反向代理」的方法让服务器也能使用到主机的 VPN。

本机终端输入以下命令,并保持终端开启:

1
2
$ ssh -NR 12306:localhost:7890 [email protected]
# 其中 12306 可以是任意端口,7890 则必须改成 VPN 的代理端口!

服务器终端输入以下命令:

1
2
3
$ export http_proxy=http://127.0.0.1:12306/
$ export https_proxy=http://127.0.0.1:12306/
# 其中 12306 必须和 前述端口 一致!

完成后,可以使用 wget google.com 测试是否成功。为了方便在服务器开启服务,可以在 ~./zshrc 中加上别名:

1
2
$ alias proxyon='export http_proxy=http://127.0.0.1:12306 https_proxy=http://127.0.0.1:12306 && echo Proxy On!'
$ alias proxyoff='unset http_proxy https_proxy && echo Proxy Off!'

如果上述方法行不通,除了用本机下载预训练模型后 scp 到服务器,还可尝试此方案:如何优雅的下载 huggingface-transformers 模型

最新的总结,包含镜像站:如何快速下载huggingface模型——全方法总结 - 知乎 (zhihu.com)

服务器安装 Clash

这里展示在 Linux 系统中使用 Clash 挂载 VPN 的方法:

  1. 下载 Clash Premium:参考 clash-linux-amd64-vX.Y.Z.gz 或 clash-linux-amd64-YYYY.MM.DD.gz

  2. 进入服务器,在任意目录下新建文件夹 /clash,解压上述文件:

    1
    2
    3
    4
    # 解压上述文件
    gzip -d clash-linux-amd64-vX.Y.Z.gz
    # 将解压后的文件重命名为 `clash`,再赋权
    chmod 777 clash
  3. 在该目录下运行解压后的文件:./clash

    • 这个时候会报错,然后在 ~/.config 下会自动创建一个 clash 目录,并自动下载 MMDB 文件
    • 如果没有自动下载,则到 仓库 中手动下载然后拖到 ~/.config/clash 下
    • 此时这个目录下有三个文件:cache.db + config.yaml + Country.mmdb
  4. 在本地找到 VPN 的 Clash 配置文件 config.yaml,复制到 ~/.config/clash/config.yaml 中:

    • 直接配置的服务器可能时断时续,可以打开 Tun 模式使用(只有 Premium 版才能开启),在 YAML 配置文件末尾加入以下内容:

      1
      2
      3
      4
      5
      6
      7
      8
      tun:
      enable: true
      stack: system # gvisor
      dns-hijack:
      - any:53
      auto-route: true # auto set global route
      auto-redir: false
      auto-detect-interface: true # conflict with interface-name
    • 复制完再到 /clash 目录下运行 ./clash,此时就能跑通

    • 如果报错显示 7890 或 9090 端口被占用,一般是被僵尸进程占用了,使用 ps aux | grep clash 找到进程号,再 kill 即可

  5. 成功运行后,在终端中配置端口转发:

    1
    2
    export http_proxy=127.0.0.1:7890
    export https_proxy=127.0.0.1:7890

大功告成!可以测试连接:

1
curl google.com

一键配置

下面对于临时使用的命令进行汇总,由 Shell 脚本的形式一键执行。只需在 /home/user 目录下新建一个 run.sh 文件,输入以下内容:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash

# conda 相关
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2020.02-Linux-x86_64.sh
bash Anaconda3-2020.02-Linux-x86_64.sh
source ~/.bashrc
conda install -c conda-forge cudatoolkit=11.1 cudnn

# pip 相关
pip install -U pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install gpustat
pip install nvitop

# apt 相关
apt update
apt install zip -y
apt install unzip -y
apt install tmux -y
apt install inetutils-ping -y

# 别名配置
echo "alias gpus='watch -n1 -c gpustat --color'" >> ~/.bashrc
echo "alias nvi='nvitop'" >> ~/.bashrc

echo "alias ca='conda activate'" >> ~/.bashrc
echo "alias cda='conda deactivate'" >> ~/.bashrc

echo "alias proxyon='export http_proxy=http://127.0.0.1:12306 https_proxy=http://127.0.0.1:12306 && echo Proxy On!'" >> ~/.bashrc
echo "alias proxyoff='unset http_proxy https_proxy && echo Proxy Off!'" >> ~/.bashrc

echo "alias tl='tmux list-sessions'" >> ~/.bashrc
echo "alias tk='tmux kill-session -t'" >> ~/.bashrc
echo "alias ta='tmux attach -t'" >> ~/.bashrc
echo "alias tn='tmux new-session -s'" >> ~/.bashrc

echo "alias ll='ls -alF'" >> ~/.bashrc
echo "alias la='ls -A'" >> ~/.bashrc
echo "alias l='ls -CF'" >> ~/.bashrc
echo "alias ls='ls --color=tty'" >> ~/.bashrc

echo "alias md='mkdir -p'" >> ~/.bashrc
echo "alias rd='rmdir'" >> ~/.bashrc

source ~/.bashrc

# git 配置,替换成自己的
git config --global user.name "hewei2001"
git config --global user.email "[email protected]"

在命令行中执行 sh run.sh


Linux学习笔记 #4 服务器环境配置
https://hwcoder.top/Linux-Note-4
作者
Wei He
发布于
2022年3月5日
许可协议