3. Linux进阶操作:文本编辑器vim的使用、文件权限管理(chmod/chown)、环境变量与PATH、包管理器使用(apt/yum)、进程管理(ps/top/kill)
说实话,很多做数字IC验证的朋友,刚开始接触Linux时都觉得够用就行。不就是跑个仿真、看个波形嘛?嗯,我以前也这么想。直到有一次,我在调试一个复杂的UVM验证环境时,需要同时管理十几个终端窗口、频繁修改配置文件、还要盯着仿真进程别跑死……那时候我才意识到,Linux玩得溜不溜,直接决定了你的工作效率。
这一章,我就把验证工程师最常用的几个Linux进阶操作掰开揉碎讲清楚。你想想看,这些操作几乎每天都会用到,早学会早省心。
3.1 文本编辑器vim的使用
在服务器上做验证,你基本离不开vim。为什么?因为服务器通常没有图形界面,你总不能每次都把文件拖到本地改完再传回去吧?
我个人习惯用vim来编辑Verilog文件、Makefile、脚本等等。刚开始用vim确实有点别扭,但一旦上手,效率真的很高。
3.1.1 vim的三种模式
vim有三种模式,这是理解vim的关键:
- 普通模式(Normal Mode):刚打开vim时的默认模式。可以移动光标、复制粘贴、删除等操作。
- 插入模式(Insert Mode):按
i进入,可以输入文本。按Esc返回普通模式。 - 命令行模式(Command-Line Mode):按
:进入,可以保存退出、查找替换等。
说白了,你大部分时间就是在普通模式和插入模式之间来回切换。编辑文本时按 i,编辑完了按 Esc,就这么简单。
3.1.2 验证工程师最常用的vim命令
我整理了一份清单,都是我在写Verilog和调试脚本时高频使用的命令:
| 操作 | 命令 | 说明 |
|---|---|---|
| 移动光标 | h/j/k/l |
左/下/上/右,比方向键快多了 |
| 跳转到行首/行尾 | 0 / $ |
0跳到行首,$跳到行尾 |
| 跳转到文件首/尾 | gg / G |
gg到第一行,G到最后一行 |
| 复制当前行 | yy |
相当于Ctrl+C |
| 粘贴 | p |
在光标后粘贴 |
| 删除当前行 | dd |
剪切当前行 |
| 撤销 | u |
撤销上一步操作 |
| 查找 | /关键词 |
按n查找下一个,N查找上一个 |
| 保存退出 | :wq |
保存并退出 |
| 不保存退出 | :q! |
强制退出不保存 |
避坑指南: 我曾经在服务器上改一个关键的Makefile,改完后习惯性按了 :q 而不是 :wq,结果改了一小时的内容全没了。从那以后,我每次退出前都会确认一下是不是保存了。你也可以在vimrc里设置 set autowrite,这样切换文件时会自动保存。
3.1.3 针对Verilog的vim配置小技巧
我个人习惯在 ~/.vimrc 里加上这几行,对写Verilog特别友好:
" 显示行号
set number
" 语法高亮
syntax on
" 自动缩进
set autoindent
set shiftwidth=2
" 搜索时高亮
set hlsearch
" 显示匹配的括号
set showmatch
有了语法高亮,你写Verilog时信号名、关键字、注释一目了然,找bug都方便很多。
3.2 文件权限管理(chmod/chown)
做验证时,经常需要多人共享一个项目目录。你写的testbench,同事要跑;同事生成的波形文件,你要看。这时候文件权限就很重要了。
我记得有一次,同事跑了一整夜的回归测试,生成了几百个波形文件。结果第二天我想打开看看,发现权限不够——他忘了给其他人读权限。嗯,这种事其实挺常见的。
3.2.1 理解文件权限
Linux里每个文件都有三组权限:
- 所有者(Owner):文件创建者
- 所属组(Group):文件所属的用户组
- 其他人(Others):其他用户
每组权限又分为三种:读(r)、写(w)、执行(x)。用 ls -l 查看时,你会看到类似这样的输出:
-rw-r--r-- 1 alice verify_group 1024 Mar 15 10:30 testbench.sv
这串字符怎么读?我来拆解一下:
- 第一个
-表示普通文件(如果是目录则是d) rw-:所有者有读写权限r--:所属组只有读权限r--:其他人只有读权限
3.2.2 chmod:修改权限
chmod有两种用法:符号模式和数字模式。我个人更推荐数字模式,简洁明了。
数字模式用三位八进制数表示权限:
| 数字 | 权限 | 说明 |
|---|---|---|
| 7 | rwx | 读+写+执行 |
| 6 | rw- | 读+写 |
| 5 | r-x | 读+执行 |
| 4 | r-- | 只读 |
| 0 | --- | 无权限 |
举个例子,你想让所有人都能读写执行一个脚本:
chmod 777 run_sim.sh
但说实话,777权限太开放了,不安全。我一般这样用:
# 自己可读写,同组可读,其他人不可访问
chmod 640 testbench.sv
# 自己可读写执行,同组可读执行,其他人可读执行
chmod 755 run_sim.sh
3.2.3 chown:修改文件所有者
有时候你需要把文件的所有权转给其他人。比如你离职了,要把项目交接给同事:
# 修改文件所有者为bob
sudo chown bob testbench.sv
# 同时修改所有者和所属组
sudo chown bob:verify_group testbench.sv
# 递归修改整个目录
sudo chown -R bob:verify_group project_dir/
注意,chown通常需要root权限,所以前面要加 sudo。
3.3 环境变量与PATH
环境变量这个东西,刚开始接触时觉得挺玄乎的。说白了,它就是操作系统里的一些「全局变量」,告诉系统去哪里找可执行文件、库文件等等。
做验证时,你经常需要设置各种工具的路径——仿真器、编译器、波形查看器……这些都要靠环境变量来管理。
3.3.1 查看和设置环境变量
查看所有环境变量:
env
查看某个特定变量:
echo $PATH
echo $HOME
临时设置一个变量(只在当前终端有效):
export MY_VAR="hello"
3.3.2 PATH变量——你的命令搜索路径
PATH是最重要的环境变量之一。当你输入一个命令时,系统会按PATH里列出的目录顺序去查找这个命令。
举个例子,你安装了VCS仿真器,它的可执行文件在 /tools/synopsys/vcs/bin/ 下。如果不把这个目录加到PATH里,每次运行VCS都得输入完整路径:
/tools/synopsys/vcs/bin/vcs -f filelist.f
多麻烦啊!所以一般会在 ~/.bashrc 或 ~/.bash_profile 里加上:
export PATH=/tools/synopsys/vcs/bin:$PATH
这样你就可以直接输入 vcs 来运行了。
~/.bashrc 里把所有工具的路径集中管理,按工具类型分组,加上注释。这样换服务器或者重装系统时,直接复制过去就能用,省心。
3.3.3 验证环境常用的环境变量
我整理了几个验证工程师经常用到的环境变量:
| 变量名 | 用途 | 示例 |
|---|---|---|
| VCS_HOME | VCS安装目录 | /tools/synopsys/vcs |
| VERDI_HOME | Verdi波形查看器目录 | /tools/synopsys/verdi |
| LM_LICENSE_FILE | License服务器地址 | 27000@license_server |
| WORK_DIR | 当前项目工作目录 | /home/alice/project_a |
3.4 包管理器使用(apt/yum)
做验证时,你经常需要安装一些依赖库——比如Python的某个包、或者系统级的开发工具。这时候包管理器就派上用场了。
不同的Linux发行版用的包管理器不一样:
- Debian/Ubuntu:用
apt - Red Hat/CentOS:用
yum或dnf
3.4.1 apt常用命令(Ubuntu/Debian)
# 更新软件包列表
sudo apt update
# 安装软件包
sudo apt install gcc make git
# 卸载软件包
sudo apt remove package_name
# 搜索软件包
apt search package_name
3.4.2 yum常用命令(CentOS/RHEL)
# 更新软件包列表
sudo yum update
# 安装软件包
sudo yum install gcc make git
# 卸载软件包
sudo yum remove package_name
# 搜索软件包
yum search package_name
避坑指南: 我曾经在Ubuntu上装一个库,直接 sudo apt install 结果提示找不到包。后来发现是忘了先 sudo apt update。记住,安装前先更新列表,这是基本操作。
3.5 进程管理(ps/top/kill)
做验证时,你经常要跑长时间的仿真。有时候仿真卡住了、或者跑得太慢、或者你想看看它到底跑了多久……这时候就需要进程管理了。
我记得有一次,一个回归测试跑了整整一个周末,结果周一来看发现进程早就挂了,但没人知道。从那以后,我养成了用 top 和 ps 定期检查进程的习惯。
3.5.1 ps:查看进程快照
最常用的用法:
# 查看当前用户的所有进程
ps -u $USER
# 查看所有进程的详细信息
ps -ef
# 查看某个特定进程(比如vcs)
ps -ef | grep vcs
输出里你会看到PID(进程ID)、CPU使用率、运行时间等信息。PID很重要,后面kill进程时会用到。
3.5.2 top:实时监控进程
top命令会实时显示系统里最活跃的进程,有点像Windows的任务管理器:
top
在top界面里,你可以看到:
- 系统总体的CPU和内存使用情况
- 每个进程的CPU和内存占用
- 进程的运行状态(R运行中、S睡眠、Z僵尸等)
按 q 退出top界面。按 k 可以输入PID来杀掉进程。
3.5.3 kill:终止进程
当仿真卡死或者跑偏了,你需要强制终止它:
# 正常终止(发送SIGTERM信号)
kill PID
# 强制终止(发送SIGKILL信号)
kill -9 PID
# 按进程名终止
pkill vcs
kill -9 是最后的手段。它直接杀掉进程,不给进程任何清理的机会。我一般先用 kill(不带-9),等几秒看进程有没有正常退出。实在不行了再用 kill -9。你想想看,如果仿真正在写波形文件,直接-9可能会把文件写坏。
3.6 本章知识体系总览
为了让你更直观地理解这一章的知识结构,我画了一张图:
这张图把这一章的内容串起来了。你想想看,vim是编辑工具,文件权限是安全基础,环境变量是配置核心,包管理器是软件来源,进程管理是运行保障。五个模块缺一不可。
好了,这一章的内容就到这里。记住,这些操作不是背出来的,是用出来的。下次在服务器上做验证时,试着多用用vim的快捷键、用chmod管理好你的文件权限、用top看看仿真进程的状态……用着用着就熟练了。
可可精品资料库