摘要
Rocky linux 也更新到 9 了,准备试试可以用了不,还是继续用 xfce4 界面。官方有提供 xfce4 版的 Rocky linux,直接下来装就好:各个版本下载地址。
题外话,之所以要经常试用这些系统,主要是 cg 行业其实很多软件的原生系统都是 linux 下的,maya,blender,katana,nuke 等等,都是 linux 下开发的(centos),而且大部分的 cg 软件都有 linux 版本。
autodesk 和 adobe 两家大财团,都比较亲 windows。adobe 家还好,软件开发的都挺实用。autodesk 亲生的 3dsmax 无论从操作还是脚本就是个非人类的存在。
现阶段其实 linux 的工作环境非常成熟,唯一的遗憾就是 adobe 全家通(因为他们家的软件确实好用),不然 cg 行业已经可以抛弃 windows 了。
之前还试过华为的欧拉,感觉是 centos6.5,不知道现在如何了,等它成熟后看看也试用下看看。
下面是常规的软件安装,以及碰到的一些问题记录。
换源
换官方源
安装完 linux 后,一般第一件事儿就是换国内源。
- 先查看下官方的镜像源管理链接,了解下官方国内链接有没有比较近的,有的话就不用换了:
rockylinux9官方镜像链接
国内镜像源前几天看到还有两三个的,现在就剩下一个 大连东软信息学院 了。所以还是去找下常用的非官方的。
ps:这里发现个奇怪的现象,就是好几个大学的镜像网站打不开了,比如上海交大,不知道是我这边连不上还是其他原因,有知道原因的可以告知下,先谢谢。 - 对比了几家后,选择使用阿里云的镜像源,原因是他家的感觉比较全,连 nvidia 的源都有,神了。
- 按照惯例,执行 sed 命令替换源文件,并做备份:
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' -i.bak /etc/yum.repos.d/rocky*.repo
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' -i.bak /etc/yum.repos.d/Rocky*.repo
ps:注意最后是 rocky*.repo,好多都是写 Rocky-*.repo,现在的目录里都是小写的,而且还有个 rocky.repo 文件需要替换,加横线就不会替换这个文件。
epel源
这是一个为 Fedora/RHEL 系 linux 提供额外软件包的源。
- 安装 epel 源:
sudo dnf in epel-release
- 替换为阿里云:
sudo sed -e 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|g' -e 's|^metalink|#metalink|g' -i.bak /etc/yum.repos.d/epel*.repo
rpmFusion源
这也是一个为 Fedora/RHEL 系 linux 提供额外软件包的源,比如视频编码等等,firefox无法播放视频等都需要用这个源里的东西来快速解决问题。
ps:网上建议是先安装/启用 epel 源,估计这俩之间有啥需要互补的东西吧。
- 安装 rpmFusion 源:
sudo dnf install --nogpgcheck https://mirrors.aliyun.com/rpmfusion/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm https://mirrors.aliyun.com/rpmfusion/nonfree/el/rpmfusion-nonfree-release-$(rpm -E %rhel).noarch.rpm
- 替换为阿里云:
sudo sed -e 's|^#baseurl=http://download1.rpmfusion.org|baseurl=https://mirrors.aliyun.com/rpmfusion|g' -e 's|^metalink|#metalink|g' -i.bak /etc/yum.repos.d/rpmfusion*.repo
sudo sed -e 's|^#baseurl=http://download1.rpmfusion.org|baseurl=https://mirrors.aliyun.com/rpmfusion|g' -e 's|^mirrorlist|#mirrorlist|g' -i.bak /etc/yum.repos.d/rpmfusion*.repo
缓存
- 安装/替换完源后,做个缓存:
sudo dnf makecache
- 完成。
内核升级
这里选择简单的方式,直接采用 ELRepo 源进行升级。
- 常规升级一下:
sudo dnf update -y
- 第一种方式,安装 ELRepo 的 gpg key,并安装相应版本的 rpm:
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo dnf install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
- 第二种,直接 dnf 安装:
sudo dnf in elrepo-release
- 发现有阿里源,替换成阿里源:
sudo sed -e 's|^baseurl=http://elrepo.org/linux|baseurl=https://mirrors.aliyun.com/elrepo|g' -e 's|^mirrorlist|#mirrorlist|g' -i.bak /etc/yum.repos.d/elrepo*.repo
- 确认下可以安装的包:
sudo dnf list available --disablerepo='*' --enablerepo=elrepo-kernel
- 会显示如下最新的内核版本:
- lt 是长期支持版本,ml 是最新的主线稳定版本。根据需要如下安装即可:
sudo dnf --enablerepo=elrepo-kernel install kernel-lt
或者sudo dnf --enablerepo=elrepo-kernel install kernel-ml
- 完事儿后,重启即可:
sudo reboot
- 想要更改启动的顺序,使用如下命令即可:
sudo grub2-set-default 0
0 是指启动菜单的第一项,也可以直接输入菜单项的名称内容。
(题记:rocky 9 采用的是 BLS 来记录内核启动菜单,文件保存在 /boot/loader/entries/ 目录下)
nvidia 驱动安装
这里选择采用官方的简易安装方法,现在 nvidia 提供了源,我们可以直接添加源来进行安装。这种建议方式并不适合所有的机器,我的制作机按照这种方式安装重启后无法进入系统,卡死在最后启动界面的步骤,所以需要下载 Nvidia 的驱动进行本地安装才行。
简易安装
这种方式采用的是 dkms,好处就是更新内核后不用自己手动重新安装 nvidia,更新完内核后会自动重新编译模块,就是需要等待一下即可。
因为上面提过,阿里云也有 nvidia 的 cuda 源,这里我们添加 阿里云 的 cuda 源。
按照官方文档,添加 redhat9 的 cuda 源,dnf 安装即可,如下步骤:
- 安装 Epel,如下命令:
sudo dnf in epel-release
ps:我安装完 rockylinux 后,自带了 epel 的源,不知道跟这个有啥区别,我也没对比过,官方说装,那我们就装吧。 - 添加阿里云 Nvidia 的驱动源,如下命令:
sudo dnf config-manager --add-repo https://mirrors.aliyun.com/nvidia-cuda/rhel9/x86_64/cuda-rhel9.repo
- 执行完成后进入 /etc/yum.repos.d/ 目录下,可以看到 cuda-rhel9.repo。这里面的链接还是指向 Nvidia 官方的地址,手动替换下,或者执行下面命令也行:
sudo sed -e 's|https://developer.download.nvidia.com/compute/cuda/repos|https://mirrors.aliyun.com/nvidia-cuda|g' -i.bak /etc/yum.repos.d/cuda*.repo
- 先安装 kernel 的库和头文件,如下命令:
sudo dnf in kernel-devel-$(uname -r) kernel-headers-$(uname -r)
ps:官方介绍里的命令,但是执行的时候可能会说没有这个包,可以搜一下,我这边直接安装 kernel-devel 和 kernel-headers 即可,不用带版本号,这样也会更新 kernel,然后会导致后面驱动问题。 不管有没有用,先禁用 nouveau:
sudo vim /etc/modprob.d/blacklist-nvidia-nouveau.conf
输入以下内容:blacklist nouveau options nouveau modeset=0
- 安装 Nvidia 驱动和设置工具:
sudo dnf in nvidia-driver nvidia-settings
ps:几秒钟就下完了,特爽 - 可选安装 cuda 驱动,命令如下:
sudo dnf in cuda-driver
- 很多介绍会说重启下,这里如果更新了 kernel,最好重新安装下驱动模块,不然重启后可能会的导致网卡,声卡没了。
sudo dnf in kernel-modules kernel-moule-extra
- 重启完系统后,执行命令可以查看 Nvidia 驱动效果了:
nvidia-smi
官方下载安装
- 去官方下载驱动文件。
- 赋予下载文件执行权限:
sudo chmod +x Nvidiaxxx.run
禁用 nouveau:
sudo vim /etc/modprob.d/blacklist-nvidia-nouveau.conf
输入以下内容:blacklist nouveau options nouveau modeset=0
- 更新内核:
dracut -f
- 将启动方式改为非界面启动:
sudo systemctl set-default multi-user.target
或
重启进入界面后,执行:sudo systemctl isolate multi-user.target
一样可以切换到命令行模式。 - 确保 nouveau 已经被禁用:
lsmod | grep nouveau
没有显示,表示禁用成功 - 以管理员身份执行 Nvidiaxxx.run:
sudo ./Nvidiaxxx.run
然后按照提示 yes/ok 就好了。 - 安装完成后设置默认界面启动并立即启动界面:
sudo systemctl set-default graphical.target
sudo systemctl isolate graphical.target
正常启动即可。 - 检查驱动是否安装成功:
nvidia-smi
显示一个表格表示成功。 - 如果显示表格里,显卡处于 off 状态,可以用以下命令强制它一直处于启用状态:
nvidia-smi -pm 1
问题:
笔记本是 8 年前的 x711, 网卡是 atheros 的,用第一种方式安装 nvidia 的驱动后,重启进来,网卡没了,鼠标点开右上角的小电脑直接提示 no network adapter avilable。
- 查看网卡是否还在:
lspci | grep network
正常显示网卡型号信息 - 输入下面命令查看网卡硬件信息:
lshw -C network
显示的网卡,声卡,全是 unclaimed 的状态。大致意思就是没驱动了。甚至想通过手机 usb 共享网络来debug都没网络,估计也是没驱动。
后来在外网搜索到了 ubuntu 也有人出现这种问题。解释大致意思是,安装 nvidia 驱动时,更新了 kernel,但是没有自动安装匹配的 kernel-modules,所以重启后就没有驱动了。
解决办法
重启,进入上一版的 kernel 系统,一般是引导的第二项,这时候会发现网络是好的,直接执行:sudo dnf in kernel-module kernel-module-extra
安装驱动,然后重启,在进入新的 kernel 里,网卡和声卡驱动就都有了。
ps:下次可以在安装完驱动后,直接安装 modules,重启应该就没事儿了
vim9 编译
参考 OpenSUSE的。
启用 python3,安装 python3-devel 包:
sudo dnf in python3-devel
这样 rocky 下的 python3 支持就能顺利进行了,只需要一个 --enable-python3interp=yes 参数即可,至于 config-dir 的参数,默认有的话就不用指了。
ps:有些参数其实加没加一样,没有安装库,最后都没启用:./configure ./configure \ --with-features=huge \ --enable-multibyte \ --enable-python3interp=yes \ --enable-cscope \ --enable-fontset \ --enable-largefile \ --with-compiledby="yang" \ --enable-terminal \
vim 配置
主要的一些功能和插件:
- 兼容 windows 和 linux。
如果是 windows,会在自动下载 gvimscreen.dll 到安装目录。可以实现窗口的一些控制,比如透明度之类的,快捷键如下:
ALt + Enter 全屏切换 Shift + t 降低窗口透明度 Shift + y 提高窗口的透明度 Shift + r 切换置顶 Vim在启动的时候,自动使用但前颜色的背景去掉 vim 的白色边框
- 自动下载 plug-vim 到 vim 的安装目录下,windows 下文件夹名称为 vimfiles,linux 下文件夹名称为 .vim。
会在 vim 的安装目录下自动创建以下目录:
- .backup
- .undo
- .swp
功用即名称的意思
- 配色是 rusticated,有点像纸张的感觉。
- windows 下 python 版本的识别。通过执行系统命令
python -V
,然后正则获取版本号,指定给 pythonthreedll 设置选项来实现。比如 vim 默认是 python 3.10 的,但是本机用的是 python 3.8 的,可以通过这种方式自动指定到 3.8 。
配置如下:
" Vim with all enhancements
source $VIMRUNTIME/vimrc_example.vim
" Use the internal diff if available.
" Otherwise use the special 'diffexpr' for Windows.
if &diffopt !~# 'internal'
set diffexpr=MyDiff()
endif
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg1 = substitute(arg1, '!', '\!', 'g')
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg2 = substitute(arg2, '!', '\!', 'g')
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let arg3 = substitute(arg3, '!', '\!', 'g')
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
if empty(&shellxquote)
let l:shxq_sav = ''
set shellxquote&
endif
let cmd = '"' . $VIMRUNTIME . '\diff"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
let cmd = substitute(cmd, '!', '\!', 'g')
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
if exists('l:shxq_sav')
let &shellxquote=l:shxq_sav
endif
endfunction
" 自动下载/创建各种必要文件目录
" 自动下载对应的 gvimscreen.dll 到 GvimextXX 下
if has('win32') && empty(glob($VIMRUNTIME . '\gvimfullscreen.dll'))
if has('win64')
let tmpCmd = 'curl -fLo "' . $VIMRUNTIME . '\gvimfullscreen.dll" --create-dirs https://gitee.com/mightyang/misc/raw/master/gvimfullscreen/gvimfullscreen.dll.x64'
else
let tmpCmd = 'curl -fLo "' . $VIMRUNTIME . '\gvimfullscreen.dll" --create-dirs https://gitee.com/mightyang/misc/raw/master/gvimfullscreen/gvimfullscreen.dll'
endif
silent execute '!' . tmpCmd
endif
" 自动下载 plug-vim
if has('win32')
if empty(glob($VIM . '/vimfiles/autoload/plug.vim'))
let tmpCmd = 'curl -fLo "' . $VIM . '/vimfiles/autoload/plug.vim" --create-dirs https://ghproxy.com/https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
silent execute '!' . tmpCmd
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
else
if empty(glob($VIM . '/.vim/autoload/plug.vim'))
let tmpCmd = 'curl -fLo "' . $VIM . '/.vim/autoload/plug.vim" --create-dirs https://ghproxy.com/https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
silent execute '!' . tmpCmd
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
endif
" 自动创建备份,撤销,swp目录
if !isdirectory($VIM . '/.vim/.backup')
call mkdir($VIM . '/.vim/.backup', 'p')
endif
if !isdirectory($VIM . '/.vim/.undo')
call mkdir($VIM . '/.vim/.undo', 'p')
endif
if !isdirectory($VIM . '/.vim/.swp')
call mkdir($VIM . '/.vim/.swp', 'p')
endif
if !isdirectory($VIM . '/.vim/.session')
call mkdir($VIM . '/.vim/.session', 'p')
endif
set backupdir=$VIM/.vim/.backup//
set undodir=$VIM/.vim/.undo//
set directory=$VIM/.vim/.swp//
" store window size and position
" Win平台下窗口全屏组件 gvimfullscreen.dll
" Alt + Enter 全屏切换
" Shift + t 降低窗口透明度
" Shift + y 加大窗口透明度
" Shift + r 切换Vim是否总在最前面显示
" Vim启动的时候自动使用当前颜色的背景色以去除Vim的白色边框
if has('gui_running') && has('gui_win32') && has('libcall')
let g:MyVimLib = $VIMRUNTIME.'/gvimfullscreen.dll'
function! ToggleFullScreen()
call libcall(g:MyVimLib, 'ToggleFullScreen', 1)
endfunction
let g:VimAlpha = 255
function! SetAlpha(alpha)
let g:VimAlpha = g:VimAlpha + a:alpha
if g:VimAlpha < 180
let g:VimAlpha = 180
endif
if g:VimAlpha > 255
let g:VimAlpha = 255
endif
call libcall(g:MyVimLib, 'SetAlpha', g:VimAlpha)
endfunction
let g:VimTopMost = 0
function! SwitchVimTopMostMode()
if g:VimTopMost == 0
let g:VimTopMost = 1
else
let g:VimTopMost = 0
endif
call libcall(g:MyVimLib, 'EnableTopMost', g:VimTopMost)
endfunction
"映射 Alt+Enter 切换全屏vim
map <a-enter> <esc>:call ToggleFullScreen()<cr>
"切换Vim是否在最前面显示
nmap <s-r> <esc>:call SwitchVimTopMostMode()<cr>
"增加Vim窗体的不透明度
nmap <s-t> <esc>:call SetAlpha(10)<cr>
"增加Vim窗体的透明度
nmap <s-y> <esc>:call SetAlpha(-10)<cr>
" 默认设置透明
autocmd GUIEnter * call libcallnr(g:MyVimLib, 'SetAlpha', g:VimAlpha)
endif
"新文件格式
set fileformat=unix
set fileformats=unix,dos,mac
" Specify a directory for plugins
" - For Neovim: ~/.local/share/nvim/plugged
" - Avoid using standard Vim directory names like 'plugin'
" add plug path
set rtp^=$VIM/.vim
call plug#begin($VIM . '/.vim/plugged')
" Make sure you use single quotes
" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
Plug 'junegunn/vim-easy-align'
" Any valid git URL is allowed
Plug 'https://github.com/junegunn/vim-github-dashboard.git'
" Multiple Plug commands can be written in a single line using | separators
" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
" On-demand loading
Plug 'scrooloose/nerdcommenter'
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
" Using a non-master branch
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
Plug 'fatih/vim-go', { 'tag': '*' }
"Plug 'fatih/vim-go', {'do': ':GoUpdateBinaries'}
" Plugin options
Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
" Plugin outside ~/.vim/plugged with post-update hook
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
" Unmanaged plugin (manually installed and updated)
Plug '~/my-prototype-plugin'
"Plug 'vim-scripts/indentpython.vim'
Plug 'jnurmine/Zenburn'
Plug 'altercation/vim-colors-solarized'
" Add author info.
Plug 'alpertuna/vim-header'
" syntax
" Plug 'vim-syntastic/syntastic'
Plug 'w0rp/ale'
" Plug 'Chiel92/vim-autoformat'
" others
Plug 'tweekmonster/braceless.vim'
" colorScheme
Plug 'cheeby/rusticated'
" vim-mucomple
"Plug 'lifepillar/vim-mucomplete'
"Plug 'davidhalter/jedi-vim'
" supertab
"Plug 'ervandew/supertab'
" simpleFold
"Plug 'tmhedberg/SimpylFold'
" fastFold
Plug 'konfekt/FastFold'
" nuke with vim plugin
"Plug 'heavyimage/nuke.vim'
" html
"Plug 'https://gitee.com/mightyang/pyhtmlPreviewer.git'
" powerline
"Plug 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'}
" airline
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
" airline-clock
Plug 'enricobacis/vim-airline-clock'
" tagbar
Plug 'majutsushi/tagbar'
" auto pair
Plug 'jiangmiao/auto-pairs'
" auto session
Plug 'xolox/vim-misc'
Plug 'xolox/vim-session'
"Plug 'xolox/vim-easytags'
" markdown
Plug 'plasticboy/vim-markdown'
"markdown-preview
Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug']}
" markdown tags
Plug 'jszakmeister/markdown2ctags'
" auto switch input method
" Plug 'lyokha/vim-xkbswitch', {'as': 'xkbswitch'}
" rainbow
Plug 'frazrepo/vim-rainbow'
" explorer
if has('nvim')
Plug 'Shougo/defx.nvim', { 'do': ':UpdateRemotePlugins' }
else
Plug 'Shougo/defx.nvim'
Plug 'roxma/nvim-yarp'
Plug 'roxma/vim-hug-neovim-rpc'
endif
Plug 'Yggdroot/indentLine'
" Initialize plugin system
call plug#end()
" set nocompatible
" filetype off
let mapleader=';'
syntax on
set t_Co=256
set encoding=utf-8
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
set nu
set guioptions-=m
set guioptions-=T
set guioptions-=r
set guioptions-=L
set tabstop=4
set softtabstop=4
set shiftwidth=4
set tw=0
set formatoptions=tcqmM
set expandtab
set autoindent
set fileformat=unix
set bg=dark
set cursorline
set ww=b,s
"set wrap
"set sessionoptions-=colors_name
set sessionoptions+=resize,winpos,winsize
if has('win32')
"set gui font
"set guifont=Hack\ Nerd\ Font\ Mono:h10
set guifont=DejaVuSansMono\ NF:h10
"set guifont=DroidSansMono\ NF:h11
else
"set guifont=Hack\ Nerd\ Font\ Mono\ h10
set guifont=DejaVuSansMono\ NF\ h10
"set guifont=DroidSansMono\ NF 11
endif
" set statusline's info
"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
" select colorscheme
if has('gui_running')
set background=dark
"colorscheme solarized
colorscheme rusticated
else
"colorscheme solarized
colorscheme rusticated
"colorscheme zenburn
endif
" Enable folding
set foldmethod=indent
set foldlevel=1
" Enable folding with the spacebar
nnoremap <space> za
hi BadWhitespace guifg=gray guibg=red ctermfg=gray ctermbg=red
au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/
" ==================================== vim-header ===============================
let g:header_auto_add_header = 0
let g:header_field_author = 'yang'
let g:header_field_author_email = 'mightyang@hotmail.com'
map <F4> :AddHeader<CR>
" ==================================== vim-header ===============================
" ======================================vim-hug-neovim-rpc begin=============================
set pyxversion=3
if has('win32')
let PV = join(matchlist(system("python -V"), '\(\d\).\(\d*\)')[1:2], "")
if PV
let &pythonthreedll="python" . PV . ".dll"
let g:python3_host_prog = "python"
endif
else
let g:python_host_prog = "/usr/bin/python"
let g:python3_host_prog = "/usr/bin/python3"
endif
" ======================================vim-hug-neovim-rpc end===============================
" ======================================deoplete begin===============================
let g:deoplete#enable_at_startup = 0
" ======================================deoplete end===============================
"======================================fastfold begin=============================
nmap zuz <Plug>(FastFoldUpdate)
let g:fastfold_savehook = 1
let g:fastfold_fold_command_suffixes = ['x','X','a','A','o','O','c','C']
let g:fastfold_fold_movement_commands = [']z', '[z', 'zj', 'zk']
let g:markdown_folding = 1
let g:tex_fold_enabled = 1
let g:vimsyn_folding = 'af'
let g:xml_syntax_folding = 1
let g:javaScript_fold = 1
let g:sh_fold_enabled= 7
let g:ruby_fold = 1
let g:perl_fold = 1
let g:perl_fold_blocks = 1
let g:r_syntax_folding = 1
let g:rust_fold = 1
let g:php_folding = 1
"======================================fastfold end =============================
" ===================================devicons begin===================================
"let g:webdevicons_enable_nerdtree = 1
"let g:WebDevIconsOS = 'Darwin'
"let g:webdevicons_conceal_nerdtree_brackets = 1
"let g:webdeviconsNerdTreeAfterGlyphPadding = ''
"let g:WebDevIconsUnicodeDecorateFolderNodes = 1
"" let g:webdevicons_enable_unite = 1
"" let g:webdevicons_enable_vimfiler = 1
"let g:webdevicons_enable_airline_statusline = 1
" ===================================devicons end===================================
" ======================================ale begin==================================
let g:ale_set_highlights = 1
highlight ALEErrorSign ctermbg=NONE ctermfg=red
highlight ALEWarningSign ctermbg=NONE ctermfg=yellow
" 自定义error和warning图标
let g:ale_sign_error = '✘'
let g:ale_sign_warning = '⚡'
" 在vim自带的状态栏中整合ale
let g:ale_statusline_format = ['✘ %d', '⚡ %d', '✔ OK']
" 显示Linter名称,出错或警告等相关信息
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_echo_msg_format = '[%linter%] %s %code: %'
" 打开文件时不进行检查
let g:ale_lint_on_enter = 0
" 普通模式下,sj前往上一个错误或警告,sk前往下一个错误或警告
nmap sj <Plug>(ale_previous_wrap)
nmap sk <Plug>(ale_next_wrap)
" <Leader>s触发/关闭语法检查
nmap <Leader>s :ALEToggle<CR>
" <Leader>d查看错误或警告的详细信息
nmap <Leader>d :ALEDetail<CR>
"使用clang对c和c++进行语法检查,对python使用pylint进行语法检查
let g:ale_linters = {'c++': ['clang'],'c': ['clang'],'python': ['flake8'],}
let g:ale_fixers = {'python':['remove_trailing_lines', 'autopep8']}
" flake8 忽略配置
let g:ale_python_flake8_options = '--ignore=E501'
" autopep8 忽略配置
let g:ale_python_autopep8_options = '-a -a --ignore=E501'
" yapf 忽略配置
nmap <F3> <Plug>(ale_fix)
" self define statusline
function! LinterStatus() abort
let l:counts = ale#statusline#Count(bufnr(''))
let l:all_errors = l:counts.error + l:counts.style_error
let l:all_non_errors = l:counts.total - l:all_errors
return l:counts.total == 0 ? 'OK' : printf('%dW %dE', all_non_errors, all_errors)
endfunction
set statusline+=%{LinterStatus()}
" quickfix and loclist
let g:ale_set_loclist = 0
let g:ale_set_quickfix = 1
let g:ale_open_list = 0
let g:ale_keep_list_window_open = 1
" ======================================ale end====================================
"" ======================================mucomplete begin=================================
"set completeopt-=preview
"set completeopt+=longest,menuone,noselect
" let g:jedi#popup_on_dot = 0 " It may be 1 as well
"let g:mucomplete#enable_auto_at_startup = 1
"imap <expr> <down> mucomplete#extend_fwd("\<down>")
"let g:mucomplete#completion_delay = 1
" ======================================mucomplete end=================================
" ======================================tagbar begin=================================
nmap <F8> :TagbarToggle<CR>
let g:tagbar_type_python = {
\ 'kinds' : [
\ 'c:class:0:1',
\ 'f:functions:0:1',
\ 'm:class members:0:0',
\ 'v:variable:0:0',
\ 'i:import:1:0'
\]
\}
let g:tagbar_type_markdown = {
\ 'ctagstype': 'markdown',
\ 'ctagsbin': $VIM . '/.vim/plugged/markdown2ctags/markdown2ctags.py',
\ 'ctagsargs': '-f - --sort=yes ',
\ 'kinds': [
\ 's:sections',
\ 'i:images'
\ ],
\ 'sro': '|',
\ 'kind2scope': {
\ 's': 'section',
\ },
\ 'sort': 0,
\ }
" ======================================tagbar end=================================
" ======================================easytags begin=================================
"let g:easytags_include_members = 1
" ======================================easytags end=================================
" ======================================auto exist quickfix begin=================================
" if quickfix window is last, auto quit.
au BufEnter * call MyLastWindow()
function! MyLastWindow()
" if the window is quickfix go on
if &buftype=="quickfix"
" if this window is last on screen quit without warning
if winbufnr(2) == -1
quit!
endif
endif
endfunction
" ======================================auto exist quickfix end=================================
" =============================airline-clock=================================
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#clock#format = '%H:%M %d %b %Y'
let g:airline_powerline_fonts =1
" =====================================================================
" =============================session begin=================================
let g:session_default_overwrite = 1
let g:session_autosave = 'yes'
let g:session_autoload = 'yes'
let g:session_default_to_last = 1
let g:session_directory = $VIM . '/.vim/.session'
let g:session_autosave_to = 'last'
let g:session_persist_font = 1
" =============================session end=================================
" ===========================markdown preview=================================
let g:mkdp_auto_start = 1
":RainbowToggle -- toggle this plugin
":RainbowLoad -- load/reload this plugin
" ===========================markdown preview=================================
" ==========================rainbow start ====================================
let g:rainbow_active = 1
" ==========================rainbow end ====================================
" ==========================defx start ====================================
call defx#custom#option('_', {
\ 'columns' : 'mark:icon:indent:filename',
\ 'winwidth': 30,
\ 'split': 'vertical',
\ 'direction': 'topleft',
\ 'show_ignored_files': 0,
\ 'ignored_files': '*.pyc,*.swp',
\ 'toggle': 1,
\ 'resume': 1,
\})
call defx#custom#column('mark', {
\ 'readonly_icon': 'R',
\ 'selected_icon': 'S',
\})
call defx#custom#column('icon', {
\ 'directory_icon': '',
\ 'opened_icon': '',
\ 'root_icon': '',
\})
function! s:defx_mappings() abort
" Define mappings
nnoremap <silent><buffer><expr> <CR> defx#do_action('drop')
nnoremap <silent><buffer><expr> c defx#do_action('copy')
nnoremap <silent><buffer><expr> m defx#do_action('move')
nnoremap <silent><buffer><expr> p defx#do_action('paste')
nnoremap <silent><buffer><expr> l defx#do_action('open')
nnoremap <silent><buffer><expr> e defx#do_action('drop')
"nnoremap <silent><buffer><expr> e defx#do_action('open', 'vsplit')
nnoremap <silent><buffer><expr> P defx#do_action('preview')
nnoremap <silent><buffer><expr> o defx#do_action('open_tree', 'toggle')
nnoremap <silent><buffer><expr> K defx#do_action('new_directory')
nnoremap <silent><buffer><expr> N defx#do_action('new_file')
nnoremap <silent><buffer><expr> M defx#do_action('new_multiple_files')
nnoremap <silent><buffer><expr> C defx#do_action('toggle_columns', 'mark:indent:icon:filename:type:size:time')
nnoremap <silent><buffer><expr> S defx#do_action('toggle_sort', 'time')
nnoremap <silent><buffer><expr> d defx#do_action('remove')
nnoremap <silent><buffer><expr> r defx#do_action('rename')
nnoremap <silent><buffer><expr> ! defx#do_action('execute_command')
nnoremap <silent><buffer><expr> x defx#do_action('execute_system')
nnoremap <silent><buffer><expr> y defx#do_action('yank_path')
nnoremap <silent><buffer><expr> . defx#do_action('toggle_ignored_files')
nnoremap <silent><buffer><expr> ; defx#do_action('repeat')
nnoremap <silent><buffer><expr> h defx#do_action('cd', ['..'])
nnoremap <silent><buffer><expr> ~ defx#do_action('cd')
nnoremap <silent><buffer><expr> q defx#do_action('quit')
nnoremap <silent><buffer><expr> <Space> defx#do_action('toggle_select') . 'j'
nnoremap <silent><buffer><expr> * defx#do_action('toggle_select_all')
nnoremap <silent><buffer><expr> j line('.') == line('$') ? 'gg' : 'j'
nnoremap <silent><buffer><expr> k line('.') == 1 ? 'G' : 'k'
nnoremap <silent><buffer><expr> <C-l> defx#do_action('redraw')
nnoremap <silent><buffer><expr> <C-g> defx#do_action('print')
nnoremap <silent><buffer><expr> cd defx#do_action('change_vim_cwd')
endfunction
autocmd FileType defx call s:defx_mappings()
" ==========================defx end ====================================
let g:kite_supported_languages = []
" =========================================map keyboard====================================
map <C-K> :bn<CR>
map <C-J> :bp<CR>
if has('win32')
map <F5> <Esc>:w<CR>:term python %<CR>
else
map <F5> <Esc>:w<CR>:term python3 %<CR>
endif
map <F2> :Defx<CR>
" =======================================================================================
其他的就是一些插件的配置,可以根据需要自行更改。
Blender
- 从官方下载 blender-x.x.x-linux-x64.tar.xz 压缩包
- 解压安装包:
xz -d blender-x.x.x-linux-x64.tar.xz
tar xvf blender-x.x.x-linux-x64.tar
ps:先用 xz 命令解压成 tar 文件,再用 tar 解压 tar 包 - 将该文件夹移动到 /opt 下(个人习惯把软件安装到这个目录下):
sudo mv blender-x.x.x-linux-x64 /opt/blender
- 拷贝桌面文件和图标文件到相关目录:
sudo cp /opt/blender/blender.desktop /usr/share/applications/
sudo cp /opt/blender/blender.svg /usr/share/icons/
ps:这个目录下,图标会自动搜索到,不需要修改 desktop 里的路径 - 将 blender 启动程序作软链接到 bin 目录:
sudo ln -s /opt/blender/blender /usr/bin/blender
ps:加软链接为了方便,不用修改 desktop 里的路径就可以启动
问题1
启动后,viewport 呈现从中心向外的扩散闪烁,感觉有点像色深不够的那种色阶。
解决方案1
既然判定为色深问题,那就把颜色过渡去掉就好了,这也是网上搜到最常见的解决方案。
- 打开预设
- 修改 Themes -> 3D Viewport -> Theme Space -> Gradient Colors -> Background Type 参数为 Single Color 即可。
变成单色后,就不会有色阶的问题了。
解决方案2
显示有问题,一般考虑的是显卡方面的问题,比如采样,色深等,一开始我以为是采样,或者是 Gsync 之类的问题,但是改了后有点点作用,但是还是有一点点闪,就翻了下色深的选项,还真被我找到了,如下操作(只改色深就可以,不用改采样和Gsync):
- 打开 Nvidia 的设置
- 找到 DP-0-(AU Optronics Corporation) -> Controls -> Depth,默认是 6bpc,改成 8bpc
- 启动 blender,你就可以看到丝滑的背景了
RLM
网上下载 RLM 的集合包,包括了 linux,windows,mac 的,然后手动安装(自动的安装还是老的启动方式)。
- 解压后,会有三个版本的 RLM 安装包。
- 将里面的 rlm.tar 解压到 /opt/rlm 里,里面应该有各种软件的 lic 文件。
在 /etc/systemd/system/ 里创建一个 rlm.service,内容如下:
[Unit] Description=RLM Service Documentation=https://www.reprisesoftware.com After=network.target nss-lookup.target [Service] User=nobody NoNewPrivileges=true ExecStart=/opt/rlm/rlm -ws 4102 -dlog /opt/rlm/rlm.log ExecStop=/opt/rlm/rlmutil rlmdown RLM Restart=on-failure RestartPreventExitStatus=23 [Install] WantedBy=multi-user.target
- 刷新 systemctl :
sudo systemctl daemon-reload
- 启动并设置 rlm 为开机启动
sudo systemctl start rlm
sudo systemctl enable rlm
然后就可以正常使用相关的软件了。
motrix
- 官方直接下 AppImage 文件:下载链接。给文件添加执行权限:
chmod +x xxx.AppImage
- 按照习惯创建目录 /opt/motrix,修改拥有者,然后把文件移动到这里:
sudo mkdir /opt/motrix && sudo chown xxx:xxx /opt/motrix && mv xxx.AppImage /opt/motrix/
- 在 bin 里建立个软连接,方便更新和编写 desktop 文件:
ln -s /opt/motrix xxx.AppImage /usr/bin/motrix
编写 desktop 文件。
在 /usr/share/applications 里复制 firefox.desktop:cp /usr/share/applications/firefox.desktop /usr/share/applications/motrix.desktop
修改里面的内容后,如下:[Desktop Entry] Version=1.6.11 Name=Motrix GenericName=Motrix Download Manager Exec=motrix Icon=motrix Terminal=false Type=Application StartupNotify=true Categories=Network; Keywords=downloader;internet;
就可以在菜单里找到 Motrix 了,接下来设置图标
- 去官网下载主页上的图标,保存为 motrix.png:
ps:恩。。。有点大,改不了尺寸,凑合吧。 - 将图标文件移动到图标目录下:
sudo mv motrix.png /usr/share/icons/
ps:正常应该立马就能看到效果。 - 想要开机自动启动,可以在设置里的 Session and Startup 中将其设置为登录自动启动,也可以将 desktop 文件复制到 autostart 目录下:
sudo cp /usr/share/applications/motrix.desktop ~/.config/autostart/
ps:两种方式是一样的,只是一个是界面操作,一个是命令操作。复制到 autostart 后,可以在 Session and Startup 里看到 Motrix 的启动项。 - 通过 Motrix 实验室,在 firefox 里添加 Aria2 的工具(Motrix 用的是 Aria2),配置 RPC 服务器的默认服务器如下:
端口:16800(这个是 Motrix 默认的端口,听说是改不了的)
密钥:与 Motrix 中设置的一样即可。打开 Motrix 设置,到 进阶设置 里,找到 RPC授权密钥,可以点击右边的骰子自动生成密钥,再将这个密钥复制到这里即可(记得保存 Motrix 设置)。
下次在 firefox 中点击下载的时候,会弹出 Aria2 的下载窗口,点击下载会自动传递给 Motrix,当然 Motrix 必须先运行。
个人感觉 Motrix 下载 bt 速度快的原因应该是 tracker 的原因,大伙儿可以直接把这些 tracker 放到在 aria2 里,然后看下速度如何。
问题
安装完成后,执行可能会一闪而过
在 terminal 里执行命令:motrix
会提示 GPU process isn't usable. Goodbye。这应该是在安装完 nvidia 驱动后会有这种问题。
解决办法
打开 motrix.desktop 文件,修改如下内容:Exec=motrix --disable-gpu-sandbox %U
修改后的 desktop 内容:
[Desktop Entry]
Version=1.6.11
Name=Motrix
GenericName=Motrix Download Manager
Exec=motrix --disable-gpu-sandbox %u
Icon=motrxi
Terminal=false
Type=Application
StartupNotify=true
Categories=Network;
Keywords=downloader;internet;
这样就可以正常运行了。
ps:上面添加软连接就是为了方便写 desktop。
网易云音乐
- 跟 opensuse 一样,去网易云音乐官网下载 ubuntu 版本。
- 安装 dpkg:
sudo dnf in dpkg
- 用 dpkg 解压 deb 文件:
dpkg -X neteaseXXX.deb ./netease
进入 netease 目录,将解压的 opt 和 usr 文件夹移动到 / 目录下:
cd netease sudo mv * /
- 执行 netease-cloud-music 命令,提示需要 libnsl.so.1,安装 libnsl:
sudo dnf in libnsl
- 再次执行 netease-cloud-music 命令,就可以打开网易云音乐了。
问题
打开后,个性推荐里可能会显示网络不给力哦,请检查你的网络设置,但是其他专栏都可以正常打开,也可以听音乐。
解决办法
暂时没找到。
百度网盘
工作需要,必装软件。
- 官网下载 linux 的 rpm 版。
- rpm 正常安装:
sudo rpm -ivh baidunetdisk-xxx.rpm
- 完成
问题
完成后,在菜单里点击,打不开。
- 命令行进入到 /opt/baidunetdisk 里,执行命令:
./baidunetdisk
提示 Segmentation fault (core dumped) - 去 message 里查看下日志:
dmesg | grep baidu
提示:segfault at 0 ip 00007fb02ec855f8 sp 00007fb00403dd08 error 4 in libc.so.6[7fb02ebd2000+176000]
跟 opensuse 不一样,暂时没找到解决办法。
zfs 文件存储
最近要弄个素材库,网上凑了二手的东西搭了一个,安装了 truenas,但是因为我用的是 raid 卡,所以 msm 等等一些工具无法安装。因为 truenas 里用了 zfs 文件系统,也创建好了池,转移了素材进来了,所以就想着只换系统,然后在 rocky linux 里挂上池就好。
- 在 truenas 里导出(zfs 里称为 export,不明白为啥不叫卸载)要转移的池。
- 安装 rokylinux 系统(因为我的系统是装在单独的固态硬盘里,所以不影响池)。
- 安装官方步骤,安装 zfs,过程顺利没碰到啥问题。
ZFS安装官方文档 - 把 truenas 里导出的 zfs 文件系统导入到 rocky linux 的 zfs 系统里,如下:
zpool import 池
- 导入完成后,正常应该是可以导入的,如下命令查看导入后的状态:
zpool status
- 然后可能是因为 truenas 的 zfs 版本跟 rocky linux 的不一样,有些选项有兼容上的提示,zfs 也提示升级一下就好了,如下命令:
zpool upgrade -a
- 这样就可以升级所有的池,然后兼容的提示就没了。
- 设置 smb 网络共享,如下命令:
sudo zfs set sharesmb=on 池/文件系统
- 完成后可以用以下命令查看共享属性是否设置成功:
sudo zfs get sharesmb
ps:后面不加池/文件系统,可以显示所有的 - 正常成功后,应该就可以了,或者执行如下命令:
sudo zfs share -a
问题:zfs 的 samba 共享
坑爹的问题来了,作为新手的我一直以为 zfs 内置了 samba,或者在安装的时候一起给装了,但是它就是没给安装,也没给任何提示,就一直给我报创建失败的错误。所以虽然 sharesmb 属性是 on 状态,但是还是无法访问,执行 sudo zfs share -a
提示创建失败(system error: SMB share creation failed) 。找遍了所有的论坛,都没有找到原因,要么就是让你重新创建或者使用独立的 samba 做共享(在系统里可以访问池里的文件)。后来在 zfs wiki 里找到了问题所在,就是需要安装并配置 samba,然后使用 zfs 会使用 samba 的 usershare 来进行共享。
解决办法
- 安装 Samba:
sudo dnf in samba samba-client
修改 /etc/samba/smb.conf,在 global 里加入下面的内容
[global] usershare path = /var/lib/samba/usershares usershare max shares = 100 usershare allow guests = yes usershare owner only = no
创建 /var/lib/samba/usershares 目录,并赋予权限:
# mkdir /var/lib/samba/usershares # chmod +t /var/lib/samba/usershares
- 启动 smb 服务:
sudo systemctl start smb
- 然后就可以启动 zfs 的 smb 了:
sudo zfs share -a
就不会提示错误了。 - 用 smbclient 查看下共享的内容:
smbclient -L localhost -U%
- 配置一下 samba 的用户之类的东西,应该就可以访问了。
samba 安装使用
由于无法自定义共享名称,所以这里想试试独立的 samba 共享。
- 正常 rocky linux 安装了 samba,没有就:
sudo dnf install samba samba-client
编辑 /etc/samba/smb.conf,格式如下:
[materials] path = /xxx/xxx browseable = yes read only = yes valid users = @artists write list = @artists
或者简单点:
[materials] path = /xxx/xxx browseable = yes read only = no valid users = @artists
这里我添加了三个共享文件夹,分别是 materials,softwares,vfxCaches。
- 添加组 artists:
sduo groupadd artists
- 添加非登录用户用户,并将其添加到 artists 组,上面的共享配置里为 artists 组设置了写入权限,注意组前面需要加个 @:
sudo useradd -g artists -s /sbin/nologin xxx
- 设置用户密码:
sudo passwd xxx
输入2次密码。 - 给 samba 添加用户:
sudo smbpasswd -a xxx
然后输入 2 次密码(简单点,设置成跟登录一样的密码) - 按照惯例,重启 smb:
sudo systemctl restart smb
- 访问试试。
问题2:samba 共享的权限
这个是比较奇怪的问题,一直没找到原因。
共享的三个文件里,materials 怎么都无法写入,而其他两个可以正常读写。
- 文件夹权限和 samba 权限都正确。在系统下可以正常写入。
- zfs 创建这个文件系统的时候跟其他两个一样,都是 noacl 的。
- 外网上看到有人说共享名称不能与共享目录的名称一样,所以试着将 materials 改为 materiallib,可以正常读写。
- 将共享名称改为 materials,然后将共享目录名称改为 materials_share,不能写入,所以应该跟路径名无关。或者难道 materials 是个保留的关键字?
没找到原因,但是更改共享名称可以读写,所以暂时不管了,改共享名称为 materiallib。
cockpit
rocky linux 在我 ssh 远程的时候就会提示推荐用 cockpit。用起来确实不错,比 truenas 那个坑爹的监控要精确的多,truenas 监控图表完全就是个搞笑的,感觉数据获取有问题,至少我这台机子用起来是这样的。
cockpit 有挺多工具的,包括管理网络共享的可以安装。
- 暴力安装所有 cockpit 插件:
sudo dnf in cockpit*
- 浏览器打开 xxx.xxx.xxx.xxx:9090,登录可以看到左侧栏里面出现了 File Sharing,所以准备把之前配置好的 samba 共享去掉,用 cockpit 来管理共享。
- 将之前配置好的 /etc/samba/smb.conf 注释掉。
- cockpit 用的是 net share 来实现 samba 管理( zfs 用的是 usershare),所以需要安装 samba-common-tools,(一般都是安装好的):
sudo dnf in samba-common-tools
需要开启 samba 的 net share 的功能,点开 File Sharing 会提示你往 [global] 项里添加一下内容:
include = registry
- 重启 smb 服务:
sudo systemctl restart smb
- 估计还得启动下 nfs 的服务,不然 File Sharing 好像会提示错误。
sudo systemctl start nfs-server
sudo systemctl enable nfs-server
- 然后你就可以在 File Sharing 里配置共享,用户以及用户组权限等。
firefox 打开提示浏览器太老
按照 github 上有人给出的方案,进入 /usr/share/cockpit/static/login.js,修改下面内容:
:is():where()
为:
:is(*):where(*)
- 重启 cockpit 的所有服务(是不是必要不大清楚,保险起见),删除浏览器的 cookies 应该就可以了。
ps:如果还是提示太老,重启 cockpit 的所有服务,然后清理 cookies 试试,打开后应该能正常进入了,我最新的 firefox 是可以了。
MegaRAID Storage Manager
目的是为了在我自己的工作机(win10)上用 MegaRAID Storage Manager 来管理和查看这台 nas 的这列卡。
- 去网上找个安装包,我这边的是下的是 ibm 的 msm 17.05..06.00 版安装包。
- tar -xvf xxx.bin(为啥是个 bin,反正也能解压)
- 进入到 image/64bit 目录。
cd image/64bit
查看下 readme.txt,按照里面的说明,先安装好需要的依赖:
libstdc++-4.4.4-13.el6.i686.rpm compat-libstdc++-33-3.2.3-69.i686.rpm libXau-1.0.5-1.el6.i686.rpm libxcb-1.5-1.el6.i686.rpm libX11-1.3-2.el6.i686.rpm libXext-1.1-3.el6.i686.rpm libXi-1.3-3.el6.i686.rpm libXtst-1.0.99.2-3.el6.i686.rpm net-snmp net-snmp-utils OpenJRE(这个感觉是界面的东西,不过我本机已经装过,所以不知道只是作为服务端,需不需要这个东西)
大部分应该是装好的,版本应该也没啥太大关系。
- msm 的安装脚本是 csh 的,需要装个 tcsh:
sudo dnf in tcsh
- 执行安装脚本:
sudo ./install.csh -d -ru popup
-d 是指只安装远程服务管理组件
-ru popup 不安装 popup - 打开防火墙端口(可以在 cockpit 里操作):307,5571,161
至于为什么,我也是看的别人的教程来的,可能跟 snmp 有关吧。 - 在本地打开 MegaRAID Storage Manager,输入 ip ,登录后,需要等一会儿才能看到信息,我的 windows2016 的服务器显示的速度要比这台 linux 的一些,是 dell 的 h700 卡。这台 nas 的是 lsi 9271-8i 的卡。
问题:msm 安装报错。
- 一开始按照网上教程安装所有东西,在安装 sas-snmp 的两个 rmp 时会报错,索性 dnf 搜索找到了这俩东西,直接安装:
sudo dnf in sas_ir_snmp sas_snmp
- 到 popup 这里也会报错,好像 MegaRAID 里没有 MegaPopup 这个东西了,安装完远程也无法访问。后来查了下,就如上面所述,加了 -d -ru popup,虽然也会提示 sas 报错信息,但是安装完后,远程可以访问。
到此,我的小 nas 需要的东西应该大部分都齐了
nas配置清单:
序号 | 名称 | 价格 |
---|---|---|
1 | 小克思工控 8盘机箱 | 870 RMB |
2 | 超微X11SSL-F | 800 RMB |
3 | LSI 9271-8i(带线) | 325 RMB |
5 | CPU E3 1260LV5 | 345 RMB |
6 | 万兆光卡 x520-sr1 | 150 RMB |
7 | 主机总计 | 2490 RMB |
8 | 6x希捷银河6t | 6900 RMB |
9 | 总计 | 9390 RMB |
差不多 2500 的机子的钱,本来是想买西数的金盘的,但是涨价了,就买希捷的银河了,跟西数白盘价格差不多。不知道是机子整体性能弱还是系统问题,希捷的银河跑起来没西数的金盘快,稳定性也弱,不包括细碎小文件,那个按个数算就不算了,一般文件大小大概 1-10G 左右,综合上来看:可能之前是我测试环境有问题,或者我昨晚改了啥参数,今天稳的一批,32G大文件拷贝,写入稳定 700 左右,两个都差不多,都是误会,剩下就是测试寿命了,看看能用几年开始换盘。
项 | 小nas | 原有的存储 |
---|---|---|
硬盘 | 6x希捷银河6t | 6x西数金盘2t |
主机 | 散装配置(如上面所诉) | dell R510 二手服务器 |
系统 | Rocky linux 9 | Windows Server 2016 |
阵列卡 | lsi 9271-8i | h710 |
阵列类型 | raid5 | raid5 |
写入速度 MB/s | 600-700 稳定曲线 | |
读取速度 MB/s | 万兆上限 | 万兆上限 |
噪音 | 完全静音 | 挺大风声,带耳机可以屏蔽 |
上图看下,这是 nas 的拷贝 32G 文件的曲线,从本地的固态硬盘上拷贝文件上去:
看看这个 nas 能用几年,如果主机寿命长,可以考虑把戴尔的换掉了,对于都在一个房间的小工作室来说,声音确实很重要。
蓝牙耳机连接
xfce4 默认好像没有控制蓝牙的界面,网上介绍的是两个三方的:blueman 和 blueberry 。 我在 github 上找到了另外一个 xfce-bluetooth 的。想想这种东西还要下载编译太麻烦了,就直接命令行解决了。
- 确认蓝牙服务的状态:
sudo systemctl status bluetooth
一般都是正常的,没有就:sudo systemctl start bluetooth
sudo systemctl enable bluetooth
然后如果没有这个服务,那就安装下软件,但是正常默认都会有:sudo dnf in bluez libldac sbc
后面俩不是必要的,我只是看到介绍写的是蓝牙连接用的有损的音频编码之类的,顺带就给装了。 - 然后就会有个 bluetoothctl 的命令可以使用。
- 确认蓝牙没有被阻止:
rfkill
正常是 unblocked 状态,blocked 的话就(一般也不会 blocked):rfkill unblock bluetooth
- 上面都确认完了,就可以使用 bluetoothctl 命令来匹配和连接设备了:
- 进入蓝牙控制:
bluetoothctl
命令行提示符就变成了当前连接的设备名称,颜色为蓝色,如果没有就是 [bluetoothctl]# - 扫描设备:
scan on
就会开始扫描附近的设备,选中设备的 物理地址,然后中键点击复制,下面所有操作都用这个来识别。 - 匹配设备:
pair xx:xx:xx:xx:xx:xx
ps:耳机是 B&O E3 的,所以需要先按住耳机开启匹配模式,然后再执行这个。 - 信任设备:
trust xx:xx:xx:xx:xx:xx
- 连接设备:
connect xx:xx:xx:xx:xx:xx
- 正常情况下就能连上了,完毕,退出。
exit
- 像耳机的话,音频输出那里切换以下输出设备就可以听了,系统不会自动切换。
bluez 的配置文件在 /etc/bluetooth/main.conf,默认在开机后,蓝牙适配器的电源是自动启动的,相关设置是:
[Policy]
AutoEnable=true
这个设置默认就是这样的。
存储挂载
在 OpenSuse的版本基础上更新了下:
- 因为增加了服务器,所以加入了多个服务器的支持。服务器名称和 ip 暂时直接写在脚本里。
- 用户和密码会在输入后写入到文件里,以方便后续映射,文件放在 $HOME 下,命名是 .服务器名称_smbcreds,属于当前用户,权限为 600
- 将提升权限的 pexec 替换成 xfce4-terminal,因为增加了用户名和密码的输入(暂时没找到其他方法来输入用户名和密码),所以在执行的时候会弹出 xfce4-terminal 的窗口
脚本更新如下:
#!/bin/bash
# File : mountServers.sh
# Author : yang <mightyang@hotmail.com>
# Date : 08.12.2022
# Last Modified Date: 08.12.2022
# Last Modified By : yang <mightyang@hotmail.com>
if [ -n $1 ]
then cu=$1
uh=$(getent passwd $cu | cut -f6 -d:)
fi
if [ "$EUID" -ne 0 ]
# 加 xfce4-terminal 是为了保证后面的 read 能输入。
then xfce4-terminal -e "sudo `realpath $0` $USER"
exit 0
fi
# 检查 samba, cifs-utils, mount
rpm -qa | grep "^samba" >/dev/null 2>&1 || { echo >&2 "need samba but it's not installed. Aborting."; exit 1; }
rpm -qa | grep "cifs-utils" >/dev/null 2>&1 || { echo >&2 "need cifscreds command to add user and password, please insatall cifs-utils module, Aborting."; exit 1; }
command -v mount >/dev/null 2>&1 || { echo >&2 "I require mount but it's not installed. Aborting."; exit 1; }
# 创建目录并映射
#if [ -n $uh ]
#then $uh=$HOME
#fi
#if [ -n $cu ]
#then $cu=$USER
#fi
declare -A serverName
declare -A ssdirs
declare -A dirs1
declare -A dirs2
dt=$uh/Desktop
# "projects materials tutorial software"
serverName=( [js-ss-001]='192.168.2.3' [js-ss-002]='192.168.2.4' )
dirs1=([z]=projects [p]=plugins)
dirs2=([m]=materiallib [s]=softwares [t]=tutorials [y]=vfxCaches)
ssdirs=( [js-ss-001]="dirs1" [js-ss-002]="dirs2")
#read -sp "input password:" psw
# 添加访问服务器的用户和密码
for server in ${!ssdirs[@]}; do
credsPath="${uh}/.${server}_smbcreds"
echo "如果用户和密码更新了,请删除/编辑 $credsPath 文件后,重新启动脚本."
if [ ! -f $credsPath ]; then
read -r -p "请输入访问服务器${server}的用户名:" accessuser
read -s -p "请输入访问服务器${server}的密码:" accesspsd
echo -e "username=${accessuser}\npassword=${accesspsd}"> $credsPath
chown $cu:$(id -un $cu) $credsPath
chmod 600 $credsPath
fi
done
# 有时候会有 umount 后直接 mount 会提示 busy 错误,写个 5 次循环判断。
# 但是奇怪的是我用了这个函数后,没有提示 busy 了,且没有跳到 sleep 这步,速度很快,不懂但是能用,有专家给解释下最好。
# uid 跟 gid 必须写上,不然映射后没有权限写入。映射成功后,ll 可以看到映射完的这几个文件夹(不管映射前这几个文件夹用户和用户组是谁的)的用户与用户组为当前的用户和用户组,不然会是 root。
# 也可以使用 dir_mode=0777 和 file_mode=0777,这样映射成功后,这几个文件夹用户和用户组是 root,但是权限是 777 的(ll 结果显示为绿色),也是可以写入的。
# 用户名和密码保存在 $uh/.smbcred 里,格式如下:
# username=XXX
# password=XXX
# 然后用 chmod -r 去掉可读权限,在这个系统下不允许查看这个文件的内容。(当然换个系统或者其他的方式还是可以看到)
# 也可以使用上面注释掉的 read 语句,在下面 -o 的后面加上 passwd=$psw,在脚本启动时,会让你输入密码。
# 有没有密文的方式存储,可以的话给说一下,多谢。
function waitMount(){
mountCmd=`mount -t cifs -o rw,dev,exec,async,user,uid=$(id -u $cu),gid=$(id -g $cu),credentials=$3 $2 $1`
n=1
while ! $mountCmd && [ $n -lt 5 ]
do
((n++))
sleep 0.5
done
}
for server in ${!ssdirs[@]}; do
declare -n dirstmp="${ssdirs[$server]}"
for dirChar in ${!dirstmp[@]}; do
dir=${dirstmp[$dirChar]}
# 如果 Desktop 没有这些文件夹,就创建。
[ -d "$dt/$dirChar" ] || mkdir -m 777 -p "$dt/$dirChar" && chown $cu:$(id -un $cu) "$dt/$dirChar"
credsPath="${uh}/.${server}_smbcreds"
# 如果这些目录已经被映射,就先 umount 然后在映射,否则直接映射,方便测试脚本。这里在 umount 下直接 mount 会提示 busy,所以写了个 waitMount 函数。
if mountpoint -q "$dt/$dir"; then
echo "remount $dt/$dir"
sudo umount -l "$dt/$dir"
waitMount "$dt/$dirChar" "//${serverName[$server]}/$dir" $credsPath
else
echo "mount $dt/$dir"
waitMount "$dt/$dirChar" "//${serverName[$server]}/$dir" $credsPath
fi
done
done
read -rsn1 -p "请按任意键结束..."
综合问题
Grub2 引导 Windows Boot Manager 没有找到 /EFI/MICROSOFT/BOOT/BOOTMGFW.EFI
结论:技嘉个坑爹主板,bios 里有个设置:快速启动 -> SATA Support,默认值是 仅最后一次加载的 SATA 设备。改成 所有 SATA 设备 就好了。这个设置会在重启的时候只检测最后一次加载的 sata 设备,没有就真的没了。
感觉 Rockylinux 还可以,就想着在工作机上着手布置,工作机配置简介:
主板:技嘉 x570 ud
硬盘1:三星 970 M.2 接口
硬盘2:2T 机械 sata 接口
硬盘3:技嘉 256G sata接口
上面只是罗列了跟这次问题相关的一些值。
安装完 Rocky 后,将 Grub2 的默认项改成了 Win10,重启发现出现如题的错误。就进行了如下的过程:
- 重新进入 Rocky,常规方式刷新 grub.cfg
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
- 各种命令查看都能正常显示 Windows 的硬盘。
cat grub.cfg,可以看到 windows 启动项里的 root 值是:
set root='hd1,gpt1'
- 重启进入 grub,还是没有找到,ctrl+c 进入命令行模式,执行:
ls
可以看到 lvm 和 hd0 以及各自分区的信息,但是这时候我还没留意到少了一些硬盘和分区。 - 经过几个小时的来回测试和查找资料,查到外网有人重启后没有找到部分硬盘,但是进入 bios 后再进入 grub ,输入
ls
命令又可以显示之前没有的硬盘。
ps:当时那个晴天霹雳,突然想起了之前因为一些问题翻过这个主板的 bios 设置,隐约记得快速启动下面有其他两个选项,sata support 和 NVMe support 。当时就觉得是不是 快速启动 跳过了硬盘的检测,进入 bios 后会检测硬盘。想到这个是因为早上想进入技嘉主板的 bios 的时候发现死活进不去,一闪就进入系统了,查到说是技嘉主板快速启动会跳过所有硬件检测,包括键盘,特意看了下,果然启动的时候键盘灯没亮。尝试 bios 电池放电,进 Windows UFEI 固件设置之类的操作完全没用,后来想到如果没有系统盘的话,应该就不会进入系统了。立马拔掉主板上的 sata 线,轻松进入 bios,然后发现快速启动选项里设置的是 Ultra fast 。改成 快速启动 就可以在开机的时候正常检测到键盘,然后也可以按 F2 进入 bios 了。 - 在我顿悟后,进入 bios,果然发现 快速启动 下的 sata support 设置成 仅最后一次加载的 SATA 设备。改成 所有 sata 设备 后,Grub2 正常引导 Windows Boot Manager。
- 这个问题跟哪个系统没关系,只是因为我的 Windows 装在 sata 接口的固态里。而 Rocky 装在 NVMe 的固态里。
ps:最后只能感叹,主板产家在大伙儿机子的启动速度上操碎了心啊,不知道加速了零点几秒啊,各种花里胡哨的设置。我也只能觉得技嘉的 ud 系列不适合工作机啊。不知道其他主板会不会有这些坑爹的设置。一天 4 个小时浪费在这里面了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。