从Ubuntu真机到WSL2

记录一次被迫从Ubuntu22.04真机系统迁移到WSL2-Ubuntu22.04虚拟子系统的经历;
原因是运行vcs需要gcc4.8.5,与ysyx项目产生冲突,导致ysyx项目无法编译(动态库链接版本问题),使得真机无法继续进行该项目,于是使用wsl2继续进行ysyx,使用win11平台进行verification,好处是两者均位于同一个系统,使用起来切换自如。且win11系统使用体验确实好于Ubuntu系统,拥有丰富的软件支持。

1 WSL2的启用和Ubuntu的安装

  1. 手动启用HyperV
  2. 管理员权限打开PowerShell,并运行,以启用虚拟子系统和虚拟化平台;并将wsl默认设置为wsl2
1
2
3
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --set-default-version 2
  1. 手动更新最新Linux内核
  2. Microsoft Store安装Ubuntu

2 Terminal的美化和增强

2.1 换源

1
2
3
sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
sudo apt-get update

2.2 美化

1
2
sudo apt install zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

2.3 增强

1
2
sudo apt install git
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git

3 Git配置

3.1 安装和配置git

1
2
3
4
5
sudo apt install git
git config --global user.name "your name" # your student ID and name
git config --global user.email "your email" # your email
git config --global core.editor vim # your favorite editor
git config --global color.ui true

3.2 创建和查看公钥

1
2
ssh-keygen -C "your email" -t rsa
cat ~/.ssh/id_rsa.pub

3.3 复制公钥到github


4 vim配置

4.1 配置.vimrc

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
set nocompatible
filetype on
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" 插件配置 "
"
" YouCompleteMe:语句补全插件
set runtimepath+=~/.vim/bundle/YouCompleteMe
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口"
let g:ycm_collect_identifiers_from_tags_files = 1 " 开启 YCM基于标签引擎
let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 注释与字符串中的内容也用于补全
let g:syntastic_ignore_files=[".*\.py$"]
let g:ycm_seed_identifiers_with_syntax = 1 " 语法关键字补全
let g:ycm_complete_in_comments = 1
let g:ycm_confirm_extra_conf = 0 " 关闭加载.ycm_extra_conf.py提示
let g:ycm_key_list_select_completion = ['<c-n>', '<Down>'] " 映射按键,没有这个会拦截掉tab, 导致其他插件的tab不能用.
let g:ycm_key_list_previous_completion = ['<c-p>', '<Up>']
let g:ycm_complete_in_comments = 1 " 在注释输入中也能补全
let g:ycm_complete_in_strings = 1 " 在字符串输入中也能补全
let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 注释和字符串中的文字也会被收入补全
let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
let g:ycm_show_diagnostics_ui = 0 " 禁用语法检查
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" " 回车即选中当前项
nnoremap <c-j> :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处
let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项
"

" github 仓库中的插件 "
Plugin 'VundleVim/Vundle.vim'

Plugin 'vim-airline/vim-airline'
"vim-airline配置:优化vim界面"
"let g:airline#extensions#tabline#enabled = 1
" airline设置
" 显示颜色
set t_Co=256
set background=dark
set laststatus=2
" 使用powerline打过补丁的字体
let g:airline_powerline_fonts = 1
" 开启tabline
let g:airline#extensions#tabline#enabled = 1
" tabline中当前buffer两端的分隔字符
let g:airline#extensions#tabline#left_sep = ' '
" tabline中未激活buffer两端的分隔字符
let g:airline#extensions#tabline#left_alt_sep = ' '
" tabline中buffer显示编号
let g:airline#extensions#tabline#buffer_nr_show = 1
" 映射切换buffer的键位
nnoremap [b :bp<CR>
nnoremap ]b :bn<CR>
" 映射<leader>num到num buffer
map <leader>1 :b 1<CR>
map <leader>2 :b 2<CR>
map <leader>3 :b 3<CR>
map <leader>4 :b 4<CR>
map <leader>5 :b 5<CR>
map <leader>6 :b 6<CR>
map <leader>7 :b 7<CR>
map <leader>8 :b 8<CR>
map <leader>9 :b 9<CR>


" vim-scripts 中的插件 "
Plugin 'taglist.vim'
"ctags 配置:F3快捷键显示程序中的各种tags,包括变量和函数等。
map <F3> :TlistToggle<CR>
let Tlist_Use_Right_Window=1
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
let Tlist_WinWidt=25

Plugin 'The-NERD-tree'
"NERDTree 配置:F2快捷键显示当前目录树
map <F2> :NERDTreeToggle<CR>
let NERDTreeWinSize=25

Plugin 'indentLine.vim'
Plugin 'delimitMate.vim'

" 非 github 仓库的插件"
" Plugin 'git://git.wincent.com/command-t.git'
" 本地仓库的插件 "

call vundle#end()


""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""新文件自动填补
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"新建.c,.h,.sh,.v文件,自动插入文件头
autocmd BufNewFile *.cpp,*.[chv],*.sv,*.sh, exec ":call SetTitle()"
""定义函数SetTitle,自动插入文件头
func SetTitle()
"如果文件类型为.sh文件
if &filetype == 'sh'
call setline(1, "##########################################################################")
call append(line("."), "# File Name: ".expand("%"))
call append(line(".")+1, "# Author: planckgh")
call append(line(".")+2, "# Mail: planckgh@gmail.com")
call append(line(".")+3, "# Created Time: ".strftime("%c"))
call append(line(".")+4, "#########################################################################")
call append(line(".")+5, "#!/bin/bash")
call append(line(".")+8, "")
else
call setline(1, "/*************************************************************************")
call append(line("."), " > File Name: ".expand("%"))
call append(line(".")+1, " > Author: planckgh")
call append(line(".")+2, " > Mail: planckgh@gmail.com ")
call append(line(".")+3, " > Description: ")
call append(line(".")+4, " > Created Time: ".strftime("%c"))
call append(line(".")+5, " ************************************************************************/")
call append(line(".")+6, "")
endif

if expand("%:e") == 'cpp'
call append(line(".")+7, "#include<iostream>")
call append(line(".")+8, "using namespace std;")
call append(line(".")+9, "int main(int argc, char *argv[])")
call append(line(".")+10, "{")
call append(line(".")+11, "")
call append(line(".")+12, " return 0;")
call append(line(".")+13, "}")
endif
if expand("%:e") == 'c'
call append(line(".")+7, "#include<stdio.h>")
call append(line(".")+8, "int main(int argc, char *argv[])")
call append(line(".")+9, "{")
call append(line(".")+10, "")
call append(line(".")+11, " return 0;")
call append(line(".")+12, "}")
endif
if expand("%:e") == 'h'
call append(line(".")+7, "#ifndef __".toupper(expand("%:r"))."_H__")
call append(line(".")+8, "#define __".toupper(expand("%:r"))."_H__")
call append(line(".")+9, "#include<stdio.h>")
call append(line(".")+10, "")
call append(line(".")+11, "")
call append(line(".")+12, "")
call append(line(".")+13, "")
call append(line(".")+14, "#endif")
endif
if &filetype == 'verilog'
call append(line(".")+7, "module ".expand("%:r")."(")
call append(line(".")+8, " input")
call append(line(".")+9, " output")
call append(line(".")+10, ");")
call append(line(".")+11, "")
call append(line(".")+12, "")
call append(line(".")+13, "")
call append(line(".")+14, "endmodule")
endif
if &filetype == 'systemverilog'
call append(line(".")+7, "class ".expand("%:r").";")
call append(line(".")+8, "")
call append(line(".")+9, "")
call append(line(".")+10, "")
call append(line(".")+11, "")
call append(line(".")+12, "")
call append(line(".")+13, "")
call append(line(".")+14, "endclass")
endif

"新建文件后,自动定位到文件末尾
autocmd BufNewFile * normal 5G$
endfunc
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""键盘命令
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

nmap <leader>w :w!<cr>
nmap <leader>f :find<cr>

" 映射全选+复制 ctrl+a
map <C-A> ggVGY
map! <C-A> <Esc>ggVGY
map <F12> gg=G
" 选中状态下 Ctrl+c 复制
vmap <C-c> "+y


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""实用设置
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 设置当文件被改动时自动载入
set autoread
" quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
"代码补全
set completeopt=preview,menu
"允许插件
filetype plugin on
"共享剪贴板
set clipboard=unnamedplus
"从不备份
set nobackup
"make 运行
:set makeprg=g++\ -Wall\ \ %
"自动保存
set autowrite
set ruler " 打开状态栏标尺
"set cursorline " 突出显示当前行
set magic " 设置魔术
set guioptions-=T " 隐藏工具栏
set guioptions-=m " 隐藏菜单栏
"set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
" 设置在状态行显示的信息
set foldcolumn=0
set foldmethod=indent
set foldlevel=3
set foldenable " 开始折叠
" 不要使用vi的键盘模式,而是vim自己的
set nocompatible
" 语法高亮
set syntax=on
" 去掉输入错误的提示声音
set noeb
" 在处理未保存或只读文件的时候,弹出确认
set confirm
" 自动缩进
set autoindent
set cindent
" Tab键的宽度
set tabstop=2
" 统一缩进为2
set softtabstop=2
set shiftwidth=2
" 不要用空格代替制表符
set noexpandtab
" 在行和段开始处使用制表符
set smarttab
" 显示行号
set number
" toumingbeijing
hi Normal ctermfg=10 ctermbg=none
" au GUIEnter * call libcallnr("vimtweak.dll", "SetAlpha", 15)
" 历史记录数
set history=1000
"禁止生成临时文件
set nobackup
set noswapfile
"搜索忽略大小写
set ignorecase
"搜索逐字符高亮
set hlsearch
set incsearch
"行内替换
set gdefault
"编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn
" 我的状态行显示的内容(包括文件类型和解码)
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
" 总是显示状态行
set laststatus=2
" 命令行(在状态行下)的高度,默认为1,这里是2
set cmdheight=2
" 侦测文件类型
filetype on
" 载入文件类型插件
filetype plugin on
" 为特定文件类型载入相关缩进文件
filetype indent on
" 保存全局变量
set viminfo+=!
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
" 字符间插入的像素行数目
set linespace=0
" 增强模式中的命令行自动完成操作
set wildmenu
" 使回格键(backspace)正常处理indent, eol, start等
set backspace=2
" 允许backspace和光标键跨越行边界
set whichwrap+=<,>,h,l
" 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
set mouse=a
set selection=exclusive
set selectmode=mouse,key
" 通过使用: commands命令,告诉我们文件的哪一行被改变过
set report=0
" 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\
" 高亮显示匹配的括号
set showmatch
" 匹配括号高亮的时间(单位是十分之一秒)
set matchtime=1
" 光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3
" 为C程序提供自动缩进
set smartindent
" 高亮显示普通txt文件(需要txt.vim脚本)
au BufRead,BufNewFile * setfiletype txt
"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {}<ESC>i
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
":inoremap " ""<ESC>i
":inoremap ' ''<ESC>i
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunction
filetype plugin indent on
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu
"set termguicolors

4.2 安装Vundle中的插件

1
2
3
4
5
sudo apt install universal-ctags
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
vim
:PluginInstall
# 一直等到左下角出现“Done!"标志

5 hexo构建

5.1 安装Node.js和npm

1
2
sudo apt-get update  
sudo apt-get install nodejs npm

5.2 安装hexo并初始化

1
2
3
4
mkdir hexo
cd hexo
sudo npm install -g hexo-cli
hexo init

5.3 安装插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
npm install hexo-generator-index --save  &
npm install hexo-generator-archive --save &
npm install hexo-generator-category --save &
npm install hexo-generator-tag --save &
npm install hexo-server --save &
npm install hexo-deployer-git --save &
npm install hexo-deployer-heroku --save &
npm install hexo-deployer-rsync --save &
npm install hexo-deployer-openshift --save &
npm install hexo-renderer-marked --save &
npm install hexo-renderer-stylus --save &
npm install hexo-generator-feed --save &
npm install hexo-generator-sitemap --save &
npm install hexo-wordcount --save

5.4 配置主题

5.4.1 修改_config.yml

5.4.2 修改theme

选择你喜欢的主题 ,以butterfly为例:

  1. 选择中文安装和配置手册
  2. 根据安装和配置手册进行安装,关键步骤如下:
    • 应用主题:修改hexo根目录下的_config.yml文件(theme: butterfly
    • 主题配置:修改hexo/theme/butterfly根目录下的_config.yml文件。

5.5 hexo相关命令

1
2
3
4
hexo n "文章名称"
hexo g // 本地部署
hexo s // 本地预览
hexo d // 推到远程

6 YSYX构建

6.1 安装PA相关工具

1
2
sudo apt install build-essential man gcc-doc gdb git libreadline-dev libsdl2-dev llvm llvm-dev llvm-11 llvm-11-dev ccache
sudo apt install tmux vim

6.2 获取项目代码

1
2
3
4
5
6
7
git clone -b master git@github.com:OSCPU/ysyx-workbench.git
bash init.sh nemu
bash init.sh abstract-machine
bash init.sh am-kernels
bash init.sh npc
# 打补丁
sudo apt install flex bison help2man

6.3 安装verilator v5.008

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo apt-get install git perl python3 make autoconf g++ flex bison ccache
sudo apt-get install libgoogle-perftools-dev numactl perl-doc
sudo apt-get install libfl2 # Ubuntu only (ignore if gives error)
sudo apt-get install libfl-dev # Ubuntu only (ignore if gives error)
sudo apt-get install zlibc zlib1g zlib1g-dev # Ubuntu only (ignore if gives error)
git clone https://github.com/verilator/verilator
unset VERILATOR_ROOT # For bash
cd verilator
git pull # Make sure git repository is up-to-date
git tag # See what versions exist
git checkout v5.008 # Switch to specified release version
autoconf # Create ./configure script
./configure # Configure and create Makefile
make -j \`nproc\` # Build Verilator itself (if error, try just 'make')
sudo make install
verilator --version

7 Debug

Bug1:系统找不到指定的文件

  1. 原因一:安装了VMware,导致注册表发生了改变
  2. 解决方案:卸载VMware,并使用CleanMyPC软件重新修复注册表
  3. 原因二:原先安装的Ubuntu卸载之后没有注销
  4. 解决方案
1
2
wsl --list --all
wsl --unregister Ubuntu-22.04

Bug2:VIM打开文件无响应

1
2
$ vim
$ (无响应)
  1. 原因:安装了vim-gtk3导致的
  2. 解决方案:卸载掉vim-gtk3