部署用于学术研究的 Linux 服务器
最近,我将一台 MiniPC 改造为一台基于 Ubuntu 操作系统的服务器,配置它以满足未来研究的潜在需求。
鉴于我对 Linux 的了解有限,我花了一些时间学习并尝试完成部署,并记录配置步骤、可能出现的问题及其相应的解决方案。
在 Ubuntu 上创建具有管理员权限的新用户
当使用云服务、供应商提供或者自己配置的 Ubuntu 服务器时,会创建一个默认用户(default User)。通常,这个用户可以通过sudo
命令临时提升权限来执行需要管理员权限的任务,但它本质上仍是一个普通用户(不是管理员账户)。如果需要创建一个拥有相同管理员权限的自定义用户,可以按照以下步骤进行:
1. 创建新用户并指定主目录、登录 shell
sudo useradd -d "/home/<user_name>" -m -s "/bin/bash" <user_name>
参数说明:
-
-d "/home/<user_name>"
:设置用户的主目录为/home/<user_name>
。 -
-m
:自动创建主目录。 -
-s "/bin/bash"
:指定用户的默认登录 shell 为/bin/bash
。
2. 赋予新用户管理员权限
要创建具有 sudo(管理员)权限的用户,运行以下命令:
sudo useradd -d "/home/<user_name>" -m -s "/bin/bash" -G sudo <user_name>
其中:
-
-G sudo
:将<user_name>
添加到sudo
用户组,使其具有管理员权限。
3. 设置新用户的密码
新创建的用户默认没有密码。通过以下命令为 <user_name>
设置密码:
sudo passwd <user_name>
运行此命令后,系统将提示输入两次密码。注意,出于安全考虑,在输入密码时不会有任何字符显示(不显示文本或提示符号)。只需输入密码并按 Enter
确认。
通过以上步骤,可以成功创建一个新用户 <user_name>
,该用户具备管理员权限,可以使用 sudo
执行命令。
终端命令美化
好看好用的终端提示符可以增加工作的愉悦感,这里使用zsh
来美化终端,相关操作参考先前记录。
启用服务器的远程访问
若要实现从非服务器物理位置远程访问 Ubuntu 服务器,可以通过安装并配置 SSH 服务来实现,并进行必要的防火墙配置。
1. 安装和配置 SSH 服务
如果只需基本的 SSH 访问,安装openssh-server
并开启 SSH 服务已足够。然而,在更高安全性需求的环境中,可以进一步优化 SSH 的配置文件/etc/ssh/sshd_config
:
sudo apt update
sudo apt install openssh-server
在完成安装后,检查 SSH 服务的状态以确认其正常运行:
sudo systemctl status ssh
-
配置建议:
-
禁用 Root 用户直接登录(推荐):避免直接以 root 身份登录服务器,增加安全性。在
/etc/ssh/sshd_config
中找到PermitRootLogin
并将其设置为no
。sudo nano /etc/ssh/sshd_config
PermitRootLogin no
-
限制允许访问的用户:可以通过
AllowUsers
配置项指定允许通过 SSH 登录的用户,进一步强化安全性。AllowUsers <user_name>
-
使用非默认端口(可选):将 SSH 端口从默认的 22 改为其他端口,比如 2200。此方法可以减少扫描攻击的可能性,但需同时更新防火墙规则。
Port 2200
-
启用自动断开空闲连接:为避免未使用的 SSH 会话长期占用资源,可在配置中添加以下行,以设置自动断开空闲连接。
ClientAliveInterval 300 ClientAliveCountMax 2
-
更改完成后,重启 SSH 服务以应用配置:
sudo systemctl restart ssh
2. 配置 UFW 防火墙
如启用了 UFW 防火墙,确保开启 SSH 端口,并根据是否更改了端口号进行相应设置。若使用默认的 22 端口,可以直接使用:
sudo ufw allow ssh
若更改了端口号,如设置为 2200,则需要如下命令:
sudo ufw allow 2200/tcp
-
配置建议:
-
启用防火墙后,进行状态检查以确保规则正确应用:
sudo ufw enable sudo ufw status
-
3. 验证 SSH 连接
在客户端系统(如 Windows)上测试与服务器的连接。Windows 下推荐使用 PuTTY 或 Windows Terminal 等支持 SSH 协议的终端工具,以确保连接的安全性和稳定性。
要在 Windows 系统上测试与服务器的远程连接,可以使用 telnet 命令(注意:telnet 常用于测试连接,但生产环境中应使用更安全的 SSH 客户端):
telnet <remote_ip> <remote_port>
将
4. 修复 .Xauthority 文件权限问题
/home/<user_name>/.Xauthority
文件权限错误可能是因为在非 root 权限下创建了该文件。除了修改用户目录的所有权外,确保相关 SSH 会话目录的权限也正确:
sudo chown <user_name>:<user_name> -R /home/<user_name>
若问题仍然存在,可以试试创建一个新的 .Xauthority
文件:
sudo -u <user_name> touch /home/<user_name>/.Xauthority
sudo chown <user_name>:<user_name> /home/<user_name>/.Xauthority
5. 设置 Fail2Ban(推荐)
为了进一步保护 SSH 服务免受暴力破解攻击,可以安装并配置 fail2ban
。该工具会自动检测多次失败的登录尝试,并暂时禁用相应的 IP:
sudo apt install fail2ban
fail2ban
会自动启用 SSH 保护,也可以自定义 /etc/fail2ban/jail.local
文件以调整禁用时间、重试次数等参数:
[sshd]
enabled = true
port = 22
maxretry = 5
bantime = 600
Fail2Ban 将自动识别多次失败的登录尝试并禁用相应 IP,从而进一步保障服务器安全。
配置服务器与 GitHub 的 SSH 连接
以下是将 Ubuntu 服务器与 GitHub 配置为 SSH 连接的详细步骤,确保可以安全地克隆、推送和拉取 GitHub 上的仓库。
1. 安装并验证 Git
首先,安装 Git,并确认安装版本:
sudo apt install git
git --version
2. 配置 Git 用户信息
使用 GitHub 用户名和电子邮箱配置 Git。确保填写与 GitHub 账户一致的信息,以便在提交代码时正确记录作者身份:
git config --global user.name "<github_account_name>"
git config --global user.email "<github_account_email>"
以上配置会添加到 ~/.gitconfig
文件中,是全局设置,即应用于该用户下所有 Git 仓库。
3. 生成 SSH 密钥对
为了在服务器上与 GitHub 建立安全连接,需要生成 SSH 密钥对:
ssh-keygen -C "<github_account_email>" -t rsa
- 说明:
-
-C "<github_account_email>"
:为密钥添加注释,一般是 GitHub 账户的邮箱地址。 -
-t rsa
:指定密钥类型为 RSA(GitHub 支持的常用类型)。
-
运行命令后,按 Enter
三次(即保持默认文件名 id_rsa
和默认无密码的设置),密钥对会存储在 ~/.ssh
目录中。
4. 添加 SSH 公钥到 GitHub
-
使用以下命令打开生成的公钥文件,并复制其中的内容:
cat ~/.ssh/id_rsa.pub
此命令会将公钥打印在终端上,可以选择性地使用文本编辑器打开并复制(例如使用
vim ~/.ssh/id_rsa.pub
)。 -
登录 GitHub 网站并导航到
Settings
→SSH and GPG keys
→New SSH key
。 -
将
id_rsa.pub
中的内容粘贴到New SSH key
页面,并为此密钥设置一个描述性的名称(如Ubuntu Server Key
),然后保存。
5. 测试与 GitHub 的 SSH 连接
配置完成后,通过以下命令测试与 GitHub 的连接:
ssh -T git@github.com
执行该命令时,GitHub 会返回一条信息确认连接成功,例如:
Hi <github_account_name>! You've successfully authenticated, but GitHub does not provide shell access.
此信息表明 SSH 连接已成功建立,可以在服务器上与 GitHub 进行代码的推送和拉取操作。
6. 常见问题和解决方法
-
SSH 密钥权限问题:确保 SSH 密钥对文件的权限正确,以防连接问题。检查和设置密钥的权限:
chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub
-
添加密钥到 SSH Agent(推荐):若密钥在服务器启动后未自动加载,可以将其添加到 SSH Agent,以便每次重启后自动加载:
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa
Python 环境配置与管理
Miniforge
在服务器上管理 Python Scientific 环境,我选择轻量、高效的 Miniforge 作为包管理工具,代替 Anaconda。Miniforge 默认配置 conda-forge 频道并集成了 Mamba,为包管理提供了更快的解决方案。下面是安装和配置 Miniforge 以及创建和删除环境的步骤。
1. 安装 Miniforge
首先,按照 Miniforge
的 GitHub 项目页面 中的安装说明进行下载和安装。以下是核心安装命令:
wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3-$(uname)-$(uname -m).sh
-
配置建议:
- 建议将 Miniforge 安装在
/usr/local/miniforge3
,这样可以让多个用户共享环境,但只有 root 用户可以进行修改。安装过程中,可以选择安装目录,系统会自动创建所需文件夹。 -
如果使用 ZSH,应确认 Miniforge 的路径被添加到
.zshrc
文件中。export PATH="$usr/local/miniforge3/bin:$PATH"
- 重新加载
.zshrc
配置:source ~/.zshrc
- 建议将 Miniforge 安装在
2. 初始化 Mamba 环境
安装完成后,初始化 Mamba 以便在终端使用该命令。假设 Miniforge 安装在 /usr/local/miniforge3
,执行以下命令:
/usr/local/miniforge3/bin/mamba init
此命令将初始化环境变量,需要重新启动终端以应用更改
若使用 ZSH 无法,可以将.bashrc
中的mamba
配置复制到.zshrc
,或者其他方式配置。
3. 创建和管理环境
在多用户服务器环境中,建议使用 root 权限(通过 sudo su
切换)创建和管理环境。这种方式可以避免普通用户意外或不受控地更改环境配置。
创建新环境
# 以指定名称创建新环境
mamba create --name <new_env_name> python=3.11 --no-default-packages
-
--name <new_env_name>
:为新环境命名。 -
python=3.11
:设置 Python 版本为 3.11。 -
--no-default-packages
:仅安装 Python,不自动安装其他包。 - 普通用户可以在其主目录中创建私有环境(例如
/home/username/myenv
),执行如下命令:
mamba create --prefix /home/username/myenv python=3.11 --no-default-packages
删除环境
若要删除某个环境(包括所有关联的包),可以使用以下命令:
# 通过环境名称删除
mamba remove --name <env_name> --all
# 通过路径删除
mamba remove --prefix /path/to/directory --all
4. 安装常用包
通常建议不直接修改 base
环境,而是根据实际需求创建专门环境。例如,可能需要安装 JupyterHub
,它为多个用户提供 Jupyter notebook 服务。
# 创建 Machine Learning 环境
mamba create --name ml_env python=3.12 jupyterhub jupyterlab notebook notebook scipy numpy numpy
# 激活环境
mamba activate ml_env
# 下载其他包
mamba install jupyter-lsp-python jupyterlab-lsp jupyterlab-git jupyterlab_execute_time
5. 防止未经授权的更新
在多用户环境中,限制普通用户修改系统级环境有助于保持环境的稳定性。如果用户试图更新环境,将会遇到权限不足的错误。示例如下:
mamba update --all
错误信息:
EnvironmentNotWritableError: The current user does not have write permissions to the target environment.
environment location: /usr/local/miniforge3
uid: 1000
gid: 1000
这种设计可以确保环境的安全和一致性,避免因权限问题导致更新失败。
如果需要临时给权限更新base
环境,可以用sudo
命令:
sudo /usr/local/miniforge3/bin/mamba update --all
Poetry
Poetry 是一种高效、便捷的 Python 项目依赖管理工具,适用于快速创建和管理虚拟环境、安装依赖库以及发布 Python 包。
1. 安装 Poetry
在安装 Poetry 前,应确保已安装 Python 3.7 以上版本。
-
使用官方安装脚本:
Poetry 的安装脚本可以自动将 Poetry 安装在
$HOME/.local/bin
目录下。运行以下命令下载并执行安装脚本:curl -sSL https://install.python-poetry.org | python3 -
-
将 Poetry 添加到 PATH:
默认安装完成后,需要将 Poetry 添加到环境变量中。如果出现
command not found
错误,可以通过以下命令将其添加到当前会话的环境变量中:export PATH="$HOME/.local/bin:$PATH"
-
验证安装:
安装完成后,可以通过以下命令检查安装版本,确认安装是否成功:
poetry --version
2. 创建新项目
Poetry 提供了简化的命令来快速生成新项目的基本结构。
-
创建新项目:
使用以下命令创建新项目目录(例如
my_project
),并生成默认的pyproject.toml
文件。poetry new my_project
该命令将在项目目录中生成以下结构:
my_project/ ├── my_project/ │ └── __init__.py ├── pyproject.toml └── tests/ └── __init__.py
-
初始化现有项目(可选):
如果已存在项目并希望使用 Poetry 进行管理,可以通过
poetry init
初始化该项目。此命令将引导生成pyproject.toml
文件,并配置初始依赖项:cd existing_project poetry init
3. 管理项目依赖
Poetry 提供了便捷的依赖管理方式,区分了生产依赖和开发依赖。
-
添加生产依赖:
将依赖项添加到生产环境,例如
requests
库:poetry add requests
-
添加开发依赖:
如果某些库仅用于开发和测试环境,可以使用
--dev
参数。此参数将依赖项添加到[tool.poetry.dev-dependencies]
部分。例如,添加pytest
作为开发依赖:poetry add pytest --dev
-
安装所有依赖:
项目依赖项写入
pyproject.toml
文件后,可以使用以下命令安装所有依赖:poetry install
poetry install
会自动创建虚拟环境,并在虚拟环境中安装所需依赖。如果已存在poetry.lock
文件,它将确保安装的依赖版本与锁定文件中的版本一致,以保证环境一致性。
4. 管理虚拟环境
Poetry 在项目目录外创建虚拟环境,并自动激活和使用该虚拟环境。
-
激活虚拟环境:
可以通过以下命令激活 Poetry 创建的虚拟环境:
poetry shell
-
退出虚拟环境:
在虚拟环境中工作结束后,输入
exit
即可退出。 -
查看虚拟环境路径:
若需查看虚拟环境的实际存储路径,可以使用:
poetry env info --path
-
删除虚拟环境(可选):
如果需要重新创建虚拟环境或清理环境,可以删除虚拟环境:
poetry env remove python
5. 管理依赖锁定文件
Poetry 使用 poetry.lock
文件锁定依赖的确切版本,以保证跨环境的一致性。
-
更新依赖版本:
当需要更新依赖版本时,可以使用以下命令重新解析依赖项并更新锁定文件:
poetry update
-
安装指定的锁定版本:
在协作项目中,团队成员可以基于
poetry.lock
文件安装项目的精确依赖项版本:poetry install
6. 运行脚本和命令
Poetry 支持直接在虚拟环境中运行脚本或命令,简化了命令管理。
-
运行项目脚本:
使用
poetry run
在虚拟环境中执行命令。例如,执行 Python 脚本:poetry run python script.py
-
直接运行单元测试:
可以在虚拟环境中直接运行测试命令,如
pytest
:poetry run pytest
7. 发布 Python 包
Poetry 可以将项目发布到 PyPI 或其他自定义包仓库。
-
构建项目:
Poetry 提供了一键构建项目的功能,将项目打包为
.whl
和.tar.gz
文件,准备发布:poetry build
-
发布到 PyPI:
将包发布到 PyPI,需要在
~/.pypirc
文件中配置 PyPI 凭据,或使用 Poetry 的publish
命令交互输入:poetry publish --build
注意:要在测试环境中验证发布过程,可以使用
--repository
参数发布到 PyPI 测试仓库。poetry publish --repository testpypi
以下是针对计量经济学领域使用 R 环境的配置指南,包括安装 R 和 RStudio、常用的 R 包配置等。
在 Ubuntu 上配置 R 环境用于计量经济学分析
在计量经济学领域,R 适合处理经济数据、执行回归分析、时间序列分析等任务。
1. 安装 R
Ubuntu 默认的软件仓库包含 R,但可能不是最新版本。为了获取最新的 R 版本,可以使用 CRAN 仓库。
-
添加 CRAN 仓库:
更新软件包列表并安装必要的依赖项:
sudo apt update sudo apt install software-properties-common dirmngr -y
-
添加 R 项目的 GPG 密钥:
下载并添加 CRAN 的 GPG 公钥,以确保软件包的完整性:
wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
-
验证 GPG 密钥(可选):
验证密钥的指纹(
E298A3A825C0D65DFD57CBB651716619E084DAB9
):gpg --show-keys /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
-
添加 CRAN 仓库到源列表:
将 CRAN 仓库添加到 apt 源列表中,以确保获取最新版本的 R:
sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
-
安装 R 和开发包:
安装最新版本的 R 和开发库:
sudo apt install r-base r-base-dev -y
2. 安装 RStudio
RStudio 是一个功能强大的 IDE,适用于数据分析和可视化。RStudio 的安装过程简单,具体安装步骤可参考 RStudio 官方安装指南。
安装步骤:
- 下载 RStudio Server 的最新版本。
-
使用
dpkg
命令进行安装:sudo dpkg -i rstudio-server-<version>.deb
-
检查安装状态:
sudo systemctl status rstudio-server
RStudio Server 安装成功后,可以通过 http://<your-server-ip>:8787
在浏览器中访问。
3. 安装计量经济学相关的 R 包
计量经济学分析通常需要专门的数据处理、回归分析和时间序列分析包。
-
安装系统依赖:
安装系统级的开发包,以确保 R 包安装顺利(特别是对一些需要编译的包,如
tidyverse
和data.table
):sudo apt-get install build-essential libssl-dev libcurl4-openssl-dev libxml2-dev
-
安装计量经济学和数据处理包:
启动 R 控制台并安装常用的计量经济学包:
sudo R
在 R 控制台中执行以下命令:
chooseCRANmirror(graphics = FALSE) install.packages(c("tidyverse", "data.table", "broom", "plm", "forecast", "lmtest", "sandwich", "stargazer"))
-
tidyverse
:包含dplyr
、ggplot2
、tidyr
等数据处理和可视化包。 -
data.table
:用于快速数据处理。 -
broom
:将回归分析结果整理成易于分析的表格。 -
plm
:用于面板数据回归分析。 -
forecast
:用于时间序列预测和分析。 -
lmtest
和sandwich
:提供计量经济学的测试工具和稳健标准误差。 -
stargazer
:用于将回归结果输出为易于理解的表格,适合论文或报告。
-
-
安装高级计量经济学工具:
-
AER
(Applied Econometrics with R):包含用于经济学研究的常用函数和数据集。 -
urca
:提供单根和协整检验。 -
vars
:用于向量自回归(VAR)分析。
install.packages(c("AER", "urca", "vars"))
-
-
安装金融时间序列分析包(可选):
-
quantmod
和TTR
:用于金融市场数据分析和技术指标计算。 -
zoo
和xts
:处理不规则时间序列数据。
install.packages(c("quantmod", "TTR", "zoo", "xts"))
-
4. 使用 GitHub 令牌安装私有包
如果需要从 GitHub 安装某些实验性或定制的包,建议使用 GitHub 令牌,以免受到 API 速率限制。
生成 GitHub 令牌:
-
在 R 控制台中生成令牌:
usethis::create_github_token()
-
在 GitHub 网站上生成一个新的 Personal Access Token(路径:
Settings
→Developer settings
→Personal access token
→Tokens (classic)
)。 -
配置 GitHub 令牌:
将生成的令牌添加到 R 环境中:
gitcreds::gitcreds_set()
在此设置下,可以安全地从 GitHub 安装私有包,避免 API 限制。
5. 示例:安装和使用 plm
包进行面板数据回归
假设要使用面板数据进行回归分析,下面是如何安装 plm
并执行固定效应模型的示例:
-
安装
plm
(如果未安装):install.packages("plm")
-
加载并使用
plm
:library(plm) # 创建示例面板数据集 data("Produc", package = "plm") pdata <- pdata.frame(Produc, index = c("state", "year")) # 固定效应模型回归 fe_model <- plm(log(gsp) ~ log(pcap) + log(hwy) + log(water) + log(util), data = pdata, model = "within") summary(fe_model)
以下是整理优化后的指南,以帮助更有效地同步数据、安装字体、并处理 Nvidia 驱动程序和库的相关问题。
其他问题
1. 同步数据
要将本地数据同步到远程服务器,建议使用 rsync
,这是一种高效且可靠的同步方法。更多细节应参考此教程。
-
同步命令:
rsync -r /path/to/sync/ <username>@<remote_host>:<destination_directory>
上述命令会将本地目录
/path/to/sync/
的所有内容「推送」到远程服务器的<destination_directory>
。 -
监控大文件的传输进度:
如果同步的是较大文件,可以用
watch
命令来监控同步进度:watch -n <time_interval> du -sh /path/to/large/file
该命令会每隔
<time_interval>
秒刷新一次文件的大小变化。
2. 安装常用字体
Linux 系统默认不带有一些 Windows 中的常用字体(例如 Arial
和 Times New Roman
)。安装这些字体可以改善文档和网站的显示效果,特别是那些依赖这些字体的图形输出。安装 Microsoft TrueType 核心字体包并刷新缓存:
sudo apt install msttcorefonts
rm -rf ~/.cache/matplotlib
-
msttcorefonts
包括多种 Microsoft 字体,如 Arial 和 Times New Roman。 - 第二个命令删除了
matplotlib
缓存目录,以确保更新后的字体正确加载。
3. 驱动程序/库版本不匹配
在运行 nvidia-smi
时,如果出现以下错误:
Failed to initialize NVML: Driver/library version mismatch
可以参考 Stack Overflow 上的解决方案。简要的步骤如下:
-
重启服务器:
某些情况下,重启服务器即可解决问题:sudo reboot
-
卸载并重新安装 Nvidia 驱动程序:
如果重启无效,尝试以下命令清除现有的 Nvidia 驱动程序并重新安装:
sudo apt purge nvidia* libnvidia* sudo ubuntu-drivers install sudo reboot
4.升级 Nvidia 驱动程序
要升级 Nvidia 驱动程序,可以按照以下步骤进行:
-
卸载旧驱动程序:
sudo apt purge *nvidia* -y sudo apt remove *nvidia* -y sudo rm /etc/apt/sources.list.d/cuda* sudo apt autoremove -y && sudo apt autoclean -y sudo rm -rf /usr/local/cuda*
-
查找并安装推荐的驱动程序:
运行以下命令来查找推荐的 Nvidia 驱动程序版本:
ubuntu-drivers devices
或者通过以下命令安装指定版本(例如
550
,根据系统需求调整版本号):sudo apt install libnvidia-common-550-server libnvidia-gl-550-server nvidia-driver-550-server -y
-
重启并检查:
重启服务器并使用
nvidia-smi
检查新驱动是否正常运行:sudo reboot now
如果
nvidia-smi
返回以下错误:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.
尝试重新安装内核头文件并重启。
5.内核头文件安装和 GCC 配置
如遇到内核头文件或 GCC 版本问题,按以下步骤操作:
-
重新安装内核头文件:
sudo apt install --reinstall linux-headers-$(uname -r) sudo reboot
-
更新 GCC 版本:
如果内核头文件安装过程中遇到 GCC 错误,可以升级到
gcc-12
:sudo apt-get install gcc-12 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
重新安装内核头文件并重启服务器后,
nvidia-smi
应该能够正常工作。
Enjoy Reading This Article?
Here are some more articles you might like to read next: