前言
我参考了北京科音的Sobereva大佬的购机单中提到的“入门级推荐配置”购买了一整套机器。
CPU:AMD Ryzen 9 7950X(16核,4.5-5.7GHz,集显)
主板:技嘉B650M AORUS ELITE AX 小雕
CPU、主板套装价约4100
散热器:瓦尔基里GL360水冷 650元
固态硬盘1:三星PM9A1 1TB 500(系统/程序/个人文件盘)
固态硬盘2:三星PM9A1 1TB 500(临时文件读写盘)
内存:2×美商海盗船 32GB DDR5-5200 2×640
电源:振华铜皇550W 250
机箱:先马黑洞PRO 280
总价:约7600
不过因为是线下,所以完全按照这个购机单买贵了400……(是我妈认识的一个供货商)
下面对我全程对系统设置和初始化部分做一个记录。计算结果测试我会放在另外一篇文章里面。
另外看得懂日语的可以看看計算科学のためのWindowsセットアップ这个博客,我个人感觉也很实用。部分我觉得不好写的也直接参考一些内容了。
初始系统折腾
作为供货商提供的电脑,嘛,几乎不用思考就会发生的一件事情就是果然自带了魔改win10系统(主要是修改了管理员授权窗口的弹出、系统不是正版、微软商店无法正常打开、盘符分区混乱存在无效分区、360全家桶等)。
这造成的问题就是直接通过装机盘装机会无法选择分区,以及后续还有很多乱七八糟的问题。
Win11重装
首先做一个装机盘,可以用微PE工具箱写入到装机U盘里面。
然后把从学校下好的正版Win11镜像iso丢到u盘里。
(上Linux的话就是另外一个教程了。)
进bios改启动盘以后,先做一下分区相关的清理把工作文件硬盘清理干净并做好格式化。
然后点击iso直接就可以安装了。为了方便安装,可以用微PE工具箱在装机盘附的Win装机助手设置一下无人值守安装和免微软账号安装,这样后续作为仅在本地运行的小主机的重启也比较方便。
装好以后就可以直接用了。
软件安装
安全软件不装也行,或者装个火绒也行,反正内存占用不能太大。
首先最好装一下驱动和CPU灯光控制软件。
一个是AMD显卡支持
其他的就只需要Gaussian 16的Win64位版本、Gview、SFTP软件、shell软件、压缩软件、文本编辑器等,这方面请参考本博客的【重要】有机化学计算工具箱
如果有外部访问需求的可以额外安装一下SakuraFRP。
Gaussian 16既可用Win也可以用调用WSL的linux版,前者要经常用虚拟桌面才能方便文件管理但是相对傻瓜;后者配置完成后可以实现与服务器相似的计算体验。
如果你的CPU核数不是很少的话,强烈不建议用Windows版Gaussian。十几核情况下,Windows 64bit Gaussian就已经远远远远慢于Linux版Gaussian,几乎没使用价值,极大地浪费CPU计算能力。在虚拟机(CentOS 7.6)里跑Gaussian可以发挥CPU至少85%的实际运算能力,速度已经远远快于用Windows版了。Win10用户也可以用WSL跑。
唯一要注意的一个就是Win版Gaussian是同时存在两个版本的,我在有机化学计算工具箱里面下到的是64位(Rev C.01版);而我在组里下到的是Rev A.03版,后者我试了半天输入文件一直在报错,前者则一直没有正确调用内核又或是内存,等我调试好以后再在另外一篇文章中做一个整合性的对比吧。
然后Win的缓存文件按要求设置到备用的第二个1T固态硬盘里面吧。
一个专用来装操作系统、计算程序、个人文件,另一个用来作为临时文件读写盘。之所以分成两个1TB硬盘而不是弄一个2TB的,在于长期大量读写临时文件对固态硬盘读写量消耗较快(量子化学程序做后HF计算、大体系振动分析等任务经常需要大量连续读写临时文件),专用一个硬盘放临时文件用可以避免未来硬盘寿命耗尽导致操作系统、程序、个人文件无法访问而造成巨大损失。
WSL环境配置
参考文章:Do This: Gaussian 16 Linux Version on Windows 10/11 Using WSL in 15 Minutes!
下面的配置是基于我们需要至少在局域网内其他计算机访问此WSL为前提进行的,如果没有此需求可以只看WSL安装和g16安装。
WSL的安装
用管理员权限打开终端(开始-搜索终端-在终端图标右键以管理员身份运行),然后输入wsl --install
即可。
遇到0x80370114报错需要在启动与关闭windows功能里打开或者关闭适用于Linux的windows子系统以及Hyper-V(部分安卓模拟器喜欢开),打开虚拟机平台,然后按要求重新启动系统。
实际上只需要虚拟机平台是打钩的就可以,另外两个是关着的
安装完成以后看到开始菜单会有一个Ubuntu的图标,第一次打开会要求设置一个普通用户的账号和密码(我们假设为USER
)。这个用户我们拿来跑g16。
在开始下面的步骤前,先设置一下设置root用户密码:sudo passwd root
。这一步的密码在默认用户为root时打开wsl是没有必要的,但是切换默认用户以后需要sudo指令升权之前可以先用su
+root密码来解决问题。
之前如果安装过安卓模拟器,需要在PowerShell(管理员)中执行以下内容:
bcdedit /set hypervisorlaunchtype auto
这个跟功能里面是否启用Hyper-V没有关系。
如果后续需要恢复安卓模拟器使用,则需要在PowerShell(管理员)中执行:
wsl --shutdown
关闭wsl主机;bcdedit /set hypervisorlaunchtype off
关掉wsl需要的hyper-v设定;- 重启电脑即可
SSH配置
在更改打开WSL时默认用户为USER
前,我们先用root用户完成必要的环境配置。
更新系统包:sudo apt update
sudo apt upgrade
SSH服务重装:sudo apt remove openssh-server
sudo apt install openssh-server
SSH配置文件修改:sudo vim /etc/ssh/sshd_config
按i进入替换模式,将Port:22
前面的#注释去掉,并修改为2222(也可以不修改,下一步你绑这个22端口也是可以的),紧接的几行也可以去掉;
为了提高安全性我没有允许密码登录,还去除了PubkeyAuthentication yes
和AuthorizedKeysFile .ssh/authorized_keys
的注释。
这样后续只要用单独一台机器生成的私钥文件就可以远程登录了。
修改完成后按:wq
保存退出。
重启SSH:sudo service ssh restart
SSH端口绑定
查看虚拟机的ip地址:在windows,而不是wsl的终端输入:wsl -- ifconfig eth0
,应该是172开头的一段内网ip,记下此时的ip为[IP]。
然后在此终端再输入netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2223 connectaddress=[IP] connectport=2222
这样我们就把本Win计算机的2223端口与内置WSL虚拟机的2222的SSH端口进行了绑定。这里本地Win不采用22端口也是为了避免一些软件有可能造成的端口冲突。
端口绑定删除指令:netsh interface portproxy delete v4tov4 listenport=2223 listenaddress=0.0.0.0
防火墙规则修改
在搜索窗口搜索 防火墙 并打开 高级安全Windows Defender 防火墙 功能。
新建入站规则,选择 端口;TCP;2223(上一步绑定的本Win计算机的SSH端口)
其他不动,名称随便填写即可。
SSH环境配置
生成SSH密钥:
在win的终端输入ssh-keygen -t rsa -m PEM -b 4096 -C "your@mail.com"
(替换上面的your@mail.com
为任意邮箱。然后直接按一堆回车到生成密钥。)
生成的密钥在用户目录(C:\Users\用户名)的.ssh文件夹下。
回到wsl终端,通过su USER
+输入密码切换回USER
用户。
首先cd ~
切换到用户文件夹,也就是/home/USER
。
然后建立各种文件夹:
mkdir .ssh
建立.ssh文件夹。
用记事本打开id_rsa.pub
文件并复制后,通过cat '[鼠标右键]' >> ~/.ssh/authorized_keys
将公钥灌入到虚拟机的授权公钥文件中。
然后赋权chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
即可。
重新打开wsl窗口以后通过刚才在win生成的私钥id_rsa
就可以在127.0.0.1:2223
登录USER了。
不过这里可以先配置好下一步的g16以后再进行测试。
这个道理也可以应用到局域网计算机,也就是说通过[局域网IP]:2223
+传输到远程电脑的私钥就可以登录了。
Gaussian 16在WSL Linux的配置
本节部分内容同样参考自:Gaussian的安装方法及运行时的相关问题
首先还是通过USER
用户创建文件夹,没切换用户的su USER
+输入密码切换回USER
用户。
然后建立用户文件夹内的高斯用文件夹mkdir ~/gaussian
;建立输入文件专用文件夹mkdir ~/input
。
通过Windows的资源管理器将下载好的linux版g16的压缩包移动到/home/USER/gaussian
下,然后cd ~/gaussian
。
并且通过tar xvfJ E6B-114X.tbJ
解压(这个是我们这边版本的名称和压缩包,请根据实际情况调整名称)。
解压完成以后赋权chmod 770 -R *
并通过rm E6B-114X.tbJ
删掉压缩包。
再cd回到根目录cd ~
,建立Gaussian缓存用文件夹mkdir ~/gaussian/scratch
,同样加之赋权chmod -R 770 ~/gaussian/scratch
修改.bashrc
文件,在文件末尾添加一下内容:
export g16root=/home/USER/gaussian
export GAUSS_SCRDIR=/home/USER/gaussian/scratch
export PGI_FASTMATH_CPU=haswell #AMD的CPU专用,Intel的话就不需要这行了
source /home/USER/g16/bsd/g16.profile
参考上面提过的方法保存以后重开wsl窗口,请注意这时不需要切换身份,保持root。
为了输入文件便于管理以及缓存能在单独SSD上运作,先在单独SSD(E盘)再新建一个Linux缓存用文件夹,我们这里叫LinuxScratch
。新建工作硬盘(D盘)上的输入文件专用文件夹input
。
然后vim /etc/fstab
,并在fstab文件中添加:
/mnt/d/input /home/USER/input none bind 0 0
/mnt/e/LinuxScratch /home/USER/gaussian/scratch none bind 0 0
wsl后期版本是自动将各个驱动器映射到/mnt/盘符/
目录下的,所以只要做一个傻瓜式的绑定就可以了。
然后打开一个windows下的终端,输入ubuntu config --default-user USER
修改默认登录用户为USER。
关闭后重开wsl终端窗口,此时会显示报错:Processing fstab with mount -a failed.
WSL下G16内存分配原则和设置
CPU和内存的分配原则
内存分配量≤物理内存闲余量,否则系统可能调用虚拟内存严重拖慢计算,或者中途报错。 单任务时:内存≤32GB:预留2GB系统内存;内存>32GB:5%给系统内存。 CPU分配核心数通常建议等于物理核心数,除非核数很多而内存很小,或有其它任务。
from:科音讲义
WSL默认占用Windows的一半内存(“50% of total memory on Windows”),这一点通过输入free -h --giga
就能确定WSL目前被默认分配的内存数,从而得到验证。
因此需要修改WSL的配置文件,有需要的话可以改改。
Win+R
,输入%UserProfile%
打开用户目录,新建.wslconfig
文件;- 按配置和下面的示例代码确定配置文件的写法。
- CMD下
wsl --shutdown
然后重新打开wsl窗口。
# 设置在wsl2上运行
[wsl2]
# 设置分配给WSL的内存大小(默认:50%电脑内存,可预留5%~10%供Win本体运作)
memory=48GB
# 设置要分配给WSL的逻辑处理器数(默认:与电脑的逻辑处理器数相等,可不修改)
#processors=16
# 设置要分配给WSL的交换分区(默认:25%分配给WSL的内存大小,可不修改)
#swap=12GB
测试显示内存占用好像是50G,不知道是怎么归整的。
其他配置请参考:https://learn.microsoft.com/en-us/windows/wsl/wsl-config
WSL下提交文件的相关指令
首先把需要的文件丢到刚才提到的映射文件夹也就是D盘的input文件夹,通过ls ~/input
可以看到是否有正常映射。
然后通过g16 < test.gjf |tee test.out
可以测试前台计算+指令行输出结果;
通过screen
相关指令,可以实现任务的后台执行(相当于新建在服务器一个任务窗口在后台让任务跑,ssh直联相当于任务在前台,关闭了就杀任务了)
在root权限下apt install screen
,安装后通过screen -S [NAME]
新建一个窗口,会清屏然后开始执行你的任务。
这种情况下通过g16 < test.gjf |tee test.out
就可以实现在[NAME]这个窗口下跑任务,然后想关掉也是可以直接关的。
其他screen指令:
screen -ls
指令:查看运行窗口的运行情况;screen -r
指令:恢复离线的screen作业;screen -r [name]
指令:连接对应窗口;- 主界面终止特定窗口运行:
screen -S [name] -X quit
- 进入窗口后销毁当前窗口:
Ctrl+A
→K
→y
。
番外 让计算体验更像服务器
①让访问体验更像服务器
首先得把在本机生成的id_rsa
通过各种手段发送到需要连接wsl的远程电脑端。
另外请注意远程连接是需要时刻维持wsl的实例是打开的。
当然也可以通过这篇文章实现让WSL开机启动,后台运行,以减少唤醒时间,但是这样我不是感觉很安心,所以我个人是打开一个空窗口以后保持最小化的。
对于可以直接访问的局域网IP,比如拥有内网10开头ip或者路由器内192开头ip的两种情况,直接通过[ip:2223]访问就行了。
对于局域网外的需要访问wsl实例的电脑,可以在电脑上安装前面提到过的SakuraFRP。
按照官网提供的帮助文档安装好默认设置的软件后,创建隧道,选择TCP隧道,然后本地端口填入2223,名称随意,其他不填,直接生成即可。
这样就可以通过远程计算机+私钥通过SakuraFRP分配的域名+访问端口实现对wsl实例的访问,这样基本上和服务器上的使用体验差别很小了,除了不像超算可以大量提交和排队以外……
免费用户5G的流量对于计算需求不是太大的情况我感觉是基本上够用的,不够用还能买vip会员不是吗。
②让提交任务体验更像服务器【待测试】
通过ai写了一段脚本,还没测试,我先放这里。
1.提交任务脚本,后台运行和排队指令sg16
:
#!/bin/bash
# 配置
MAX_JOBS=4 # 最大任务数
MAX_PARALLEL_JOBS=2 # 最大并行任务数
TIME_LIMIT="24:00:00" # 单任务最大运行时间 (格式: HH:MM:SS)
QUEUE_FILE="./sg16_queue" # 任务队列文件
LOG_DIR="./logs" # 日志目录
mkdir -p "$LOG_DIR"
# 检查任务队列文件是否存在
if [ ! -f "$QUEUE_FILE" ]; then
touch "$QUEUE_FILE"
fi
# 获取当前运行和排队任务数
running_jobs=$(jobs -r | wc -l)
queued_jobs=$(wc -l < "$QUEUE_FILE")
# 检查任务是否超时
function check_timeout() {
local pid=$1
local start_time=$2
local time_limit_seconds=$(date -d "$TIME_LIMIT" +%s)
while kill -0 "$pid" 2>/dev/null; do
current_time=$(date +%s)
elapsed_time=$((current_time - start_time))
if [ $elapsed_time -ge $time_limit_seconds ]; then
echo "Task $pid exceeded time limit. Terminating..."
kill -9 "$pid"
return 1
fi
sleep 60
done
return 0
}
# 提交任务
function submit_task() {
local input_file="$1"
local base_name="${input_file%.*}"
local gjf_file="${base_name}.gjf"
local out_file="${base_name}.out"
if [ $running_jobs -ge $MAX_PARALLEL_JOBS ]; then
echo "Too many running jobs. Adding $input_file to the queue."
echo "$input_file" >> "$QUEUE_FILE"
return
fi
echo "Starting task for $input_file..."
g16 < "$gjf_file" > "$LOG_DIR/$out_file" &
task_pid=$!
start_time=$(date +%s)
check_timeout $task_pid $start_time
if [ $? -eq 1 ]; then
echo "Task $input_file was terminated due to timeout."
else
echo "Task $input_file completed."
fi
}
# 执行下一个排队任务
function process_queue() {
while [ $queued_jobs -gt 0 ] && [ $running_jobs -lt $MAX_PARALLEL_JOBS ]; do
next_task=$(head -n 1 "$QUEUE_FILE")
sed -i '1d' "$QUEUE_FILE"
submit_task "$next_task"
running_jobs=$(jobs -r | wc -l)
queued_jobs=$(wc -l < "$QUEUE_FILE")
done
}
# 主逻辑
if [ $# -lt 1 ]; then
echo "Usage: sg16 <input_file>"
exit 1
fi
if [ $queued_jobs -ge $MAX_JOBS ]; then
echo "Error: Maximum number of queued jobs ($MAX_JOBS) exceeded."
exit 1
fi
input_file="$1"
submit_task "$input_file"
process_queue
2.检查任务运行状态指令qstat
#!/bin/bash
# 配置
QUEUE_FILE="./sg16_queue" # 任务队列文件
LOG_DIR="./logs" # 日志目录
# 显示当前任务状态
function qstat() {
echo "Running jobs:"
jobs -l | grep "Running" | awk '{print $1, $3, $4}'
echo "Queued jobs:"
if [ -f "$QUEUE_FILE" ]; then
cat "$QUEUE_FILE"
else
echo "No tasks in the queue."
fi
}
qstat
3.添加用户变量
- 移动脚本文件:将上述两个脚本文件放在用户目录下如
~/scripts
; - 设置脚本权限:
chmod +x sg16
chmod +x qstat
; - 写入系统变量:
cat 'export PATH="/home/USER/scripts:$PATH"' >> ~/.bashrc
然后重新打开wsl窗口检查是否可行。