摘要

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 后,一般第一件事儿就是换国内源。

  1. 先查看下官方的镜像源管理链接,了解下官方国内链接有没有比较近的,有的话就不用换了:
    rockylinux9官方镜像链接
    国内镜像源前几天看到还有两三个的,现在就剩下一个 大连东软信息学院 了。所以还是去找下常用的非官方的。
    ps:这里发现个奇怪的现象,就是好几个大学的镜像网站打不开了,比如上海交大,不知道是我这边连不上还是其他原因,有知道原因的可以告知下,先谢谢。
  2. 对比了几家后,选择使用阿里云的镜像源,原因是他家的感觉比较全,连 nvidia 的源都有,神了。
  3. 按照惯例,执行 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 提供额外软件包的源。

  1. 安装 epel 源:
    sudo dnf in epel-release
  2. 替换为阿里云:
    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 源,估计这俩之间有啥需要互补的东西吧。

  1. 安装 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
  2. 替换为阿里云:
    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

缓存

  1. 安装/替换完源后,做个缓存:

sudo dnf makecache

  1. 完成。

内核升级

这里选择简单的方式,直接采用 ELRepo 源进行升级。

  1. 常规升级一下:
    sudo dnf update -y
  2. 第一种方式,安装 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
  3. 第二种,直接 dnf 安装:
    sudo dnf in elrepo-release
  4. 发现有阿里源,替换成阿里源:
    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
  5. 确认下可以安装的包:
    sudo dnf list available --disablerepo='*' --enablerepo=elrepo-kernel
  6. 会显示如下最新的内核版本:
    图片.png
  7. lt 是长期支持版本,ml 是最新的主线稳定版本。根据需要如下安装即可:
    sudo dnf --enablerepo=elrepo-kernel install kernel-lt
    或者
    sudo dnf --enablerepo=elrepo-kernel install kernel-ml
  8. 完事儿后,重启即可:
    sudo reboot
  9. 想要更改启动的顺序,使用如下命令即可:
    sudo grub2-set-default 0
    0 是指启动菜单的第一项,也可以直接输入菜单项的名称内容。
    (题记:rocky 9 采用的是 BLS 来记录内核启动菜单,文件保存在 /boot/loader/entries/ 目录下)

nvidia 驱动安装

这里选择采用官方的简易安装方法,现在 nvidia 提供了源,我们可以直接添加源来进行安装。这种建议方式并不适合所有的机器,我的制作机按照这种方式安装重启后无法进入系统,卡死在最后启动界面的步骤,所以需要下载 Nvidia 的驱动进行本地安装才行。

简易安装

这种方式采用的是 dkms,好处就是更新内核后不用自己手动重新安装 nvidia,更新完内核后会自动重新编译模块,就是需要等待一下即可。
因为上面提过,阿里云也有 nvidia 的 cuda 源,这里我们添加 阿里云 的 cuda 源。
按照官方文档,添加 redhat9 的 cuda 源,dnf 安装即可,如下步骤:

  1. 安装 Epel,如下命令:
    sudo dnf in epel-release
    ps:我安装完 rockylinux 后,自带了 epel 的源,不知道跟这个有啥区别,我也没对比过,官方说装,那我们就装吧。
  2. 添加阿里云 Nvidia 的驱动源,如下命令:
    sudo dnf config-manager --add-repo https://mirrors.aliyun.com/nvidia-cuda/rhel9/x86_64/cuda-rhel9.repo
  3. 执行完成后进入 /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
  4. 先安装 kernel 的库和头文件,如下命令:
    sudo dnf in kernel-devel-$(uname -r) kernel-headers-$(uname -r)
    ps:官方介绍里的命令,但是执行的时候可能会说没有这个包,可以搜一下,我这边直接安装 kernel-devel 和 kernel-headers 即可,不用带版本号,这样也会更新 kernel,然后会导致后面驱动问题。
  5. 不管有没有用,先禁用 nouveau:
    sudo vim /etc/modprob.d/blacklist-nvidia-nouveau.conf
    输入以下内容:

    blacklist nouveau
    options nouveau modeset=0
  6. 安装 Nvidia 驱动和设置工具:
    sudo dnf in nvidia-driver nvidia-settings
    ps:几秒钟就下完了,特爽
  7. 可选安装 cuda 驱动,命令如下:
    sudo dnf in cuda-driver
  8. 很多介绍会说重启下,这里如果更新了 kernel,最好重新安装下驱动模块,不然重启后可能会的导致网卡,声卡没了。
    sudo dnf in kernel-modules kernel-moule-extra
  9. 重启完系统后,执行命令可以查看 Nvidia 驱动效果了:
    nvidia-smi

官方下载安装

  1. 去官方下载驱动文件。
  2. 赋予下载文件执行权限:
    sudo chmod +x Nvidiaxxx.run
  3. 禁用 nouveau:
    sudo vim /etc/modprob.d/blacklist-nvidia-nouveau.conf
    输入以下内容:

    blacklist nouveau
    options nouveau modeset=0
  4. 更新内核:
    dracut -f
  5. 将启动方式改为非界面启动:
    sudo systemctl set-default multi-user.target

    重启进入界面后,执行:
    sudo systemctl isolate multi-user.target
    一样可以切换到命令行模式。
  6. 确保 nouveau 已经被禁用:
    lsmod | grep nouveau
    没有显示,表示禁用成功
  7. 以管理员身份执行 Nvidiaxxx.run:
    sudo ./Nvidiaxxx.run
    然后按照提示 yes/ok 就好了。
  8. 安装完成后设置默认界面启动并立即启动界面:
    sudo systemctl set-default graphical.target
    sudo systemctl isolate graphical.target
    正常启动即可。
  9. 检查驱动是否安装成功:
    nvidia-smi
    显示一个表格表示成功。
  10. 如果显示表格里,显卡处于 off 状态,可以用以下命令强制它一直处于启用状态:
    nvidia-smi -pm 1

问题:

笔记本是 8 年前的 x711, 网卡是 atheros 的,用第一种方式安装 nvidia 的驱动后,重启进来,网卡没了,鼠标点开右上角的小电脑直接提示 no network adapter avilable。

  1. 查看网卡是否还在:
    lspci | grep network
    正常显示网卡型号信息
  2. 输入下面命令查看网卡硬件信息:
    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的。

  1. 启用 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 配置

主要的一些功能和插件:

  1. 兼容 windows 和 linux。
  2. 如果是 windows,会在自动下载 gvimscreen.dll 到安装目录。可以实现窗口的一些控制,比如透明度之类的,快捷键如下:

    ALt + Enter 全屏切换
    Shift + t 降低窗口透明度
    Shift + y 提高窗口的透明度
    Shift + r 切换置顶
    Vim在启动的时候,自动使用但前颜色的背景去掉 vim 的白色边框
  3. 自动下载 plug-vim 到 vim 的安装目录下,windows 下文件夹名称为 vimfiles,linux 下文件夹名称为 .vim。
  4. 会在 vim 的安装目录下自动创建以下目录:

    • .backup
    • .undo
    • .swp

    功用即名称的意思

  5. 配色是 rusticated,有点像纸张的感觉。
  6. 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

  1. 官方下载 blender-x.x.x-linux-x64.tar.xz 压缩包
  2. 解压安装包:
    xz -d blender-x.x.x-linux-x64.tar.xz
    tar xvf blender-x.x.x-linux-x64.tar
    ps:先用 xz 命令解压成 tar 文件,再用 tar 解压 tar 包
  3. 将该文件夹移动到 /opt 下(个人习惯把软件安装到这个目录下):
    sudo mv blender-x.x.x-linux-x64 /opt/blender
  4. 拷贝桌面文件和图标文件到相关目录:
    sudo cp /opt/blender/blender.desktop /usr/share/applications/
    sudo cp /opt/blender/blender.svg /usr/share/icons/
    ps:这个目录下,图标会自动搜索到,不需要修改 desktop 里的路径
  5. 将 blender 启动程序作软链接到 bin 目录:
    sudo ln -s /opt/blender/blender /usr/bin/blender
    ps:加软链接为了方便,不用修改 desktop 里的路径就可以启动

问题1

启动后,viewport 呈现从中心向外的扩散闪烁,感觉有点像色深不够的那种色阶。

解决方案1

既然判定为色深问题,那就把颜色过渡去掉就好了,这也是网上搜到最常见的解决方案。

  1. 打开预设
  2. 修改 Themes -> 3D Viewport -> Theme Space -> Gradient Colors -> Background Type 参数为 Single Color 即可。
    变成单色后,就不会有色阶的问题了。

解决方案2

显示有问题,一般考虑的是显卡方面的问题,比如采样,色深等,一开始我以为是采样,或者是 Gsync 之类的问题,但是改了后有点点作用,但是还是有一点点闪,就翻了下色深的选项,还真被我找到了,如下操作(只改色深就可以,不用改采样和Gsync):

  1. 打开 Nvidia 的设置
  2. 找到 DP-0-(AU Optronics Corporation) -> Controls -> Depth,默认是 6bpc,改成 8bpc
  3. 启动 blender,你就可以看到丝滑的背景了

RLM

网上下载 RLM 的集合包,包括了 linux,windows,mac 的,然后手动安装(自动的安装还是老的启动方式)。

  1. 解压后,会有三个版本的 RLM 安装包。
  2. 将里面的 rlm.tar 解压到 /opt/rlm 里,里面应该有各种软件的 lic 文件。
  3. 在 /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
  4. 刷新 systemctl :
    sudo systemctl daemon-reload
  5. 启动并设置 rlm 为开机启动
    sudo systemctl start rlm
    sudo systemctl enable rlm

然后就可以正常使用相关的软件了。

motrix

  1. 官方直接下 AppImage 文件:下载链接。给文件添加执行权限:
    chmod +x xxx.AppImage
  2. 按照习惯创建目录 /opt/motrix,修改拥有者,然后把文件移动到这里:
    sudo mkdir /opt/motrix && sudo chown xxx:xxx /opt/motrix && mv xxx.AppImage /opt/motrix/
  3. 在 bin 里建立个软连接,方便更新和编写 desktop 文件:
    ln -s /opt/motrix xxx.AppImage /usr/bin/motrix
  4. 编写 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 了,接下来设置图标

  5. 去官网下载主页上的图标,保存为 motrix.png:
    motrix
    ps:恩。。。有点大,改不了尺寸,凑合吧。
  6. 将图标文件移动到图标目录下:
    sudo mv motrix.png /usr/share/icons/
    ps:正常应该立马就能看到效果。
  7. 想要开机自动启动,可以在设置里的 Session and Startup 中将其设置为登录自动启动,也可以将 desktop 文件复制到 autostart 目录下:
    sudo cp /usr/share/applications/motrix.desktop ~/.config/autostart/
    ps:两种方式是一样的,只是一个是界面操作,一个是命令操作。复制到 autostart 后,可以在 Session and Startup 里看到 Motrix 的启动项。
  8. 通过 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。

网易云音乐

  1. 跟 opensuse 一样,去网易云音乐官网下载 ubuntu 版本。
  2. 安装 dpkg:
    sudo dnf in dpkg
  3. 用 dpkg 解压 deb 文件:
    dpkg -X neteaseXXX.deb ./netease
  4. 进入 netease 目录,将解压的 opt 和 usr 文件夹移动到 / 目录下:

    cd netease
    sudo mv * /
  5. 执行 netease-cloud-music 命令,提示需要 libnsl.so.1,安装 libnsl:
    sudo dnf in libnsl
  6. 再次执行 netease-cloud-music 命令,就可以打开网易云音乐了。

问题

打开后,个性推荐里可能会显示网络不给力哦,请检查你的网络设置,但是其他专栏都可以正常打开,也可以听音乐。

解决办法

暂时没找到。

百度网盘

工作需要,必装软件。

  1. 官网下载 linux 的 rpm 版。
  2. rpm 正常安装:
    sudo rpm -ivh baidunetdisk-xxx.rpm
  3. 完成

问题

完成后,在菜单里点击,打不开。

  1. 命令行进入到 /opt/baidunetdisk 里,执行命令:
    ./baidunetdisk
    提示 Segmentation fault (core dumped)
  2. 去 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 里挂上池就好。

  1. 在 truenas 里导出(zfs 里称为 export,不明白为啥不叫卸载)要转移的池。
  2. 安装 rokylinux 系统(因为我的系统是装在单独的固态硬盘里,所以不影响池)。
  3. 安装官方步骤,安装 zfs,过程顺利没碰到啥问题。
    ZFS安装官方文档
  4. 把 truenas 里导出的 zfs 文件系统导入到 rocky linux 的 zfs 系统里,如下:
    zpool import 池
  5. 导入完成后,正常应该是可以导入的,如下命令查看导入后的状态:
    zpool status
  6. 然后可能是因为 truenas 的 zfs 版本跟 rocky linux 的不一样,有些选项有兼容上的提示,zfs 也提示升级一下就好了,如下命令:
    zpool upgrade -a
  7. 这样就可以升级所有的池,然后兼容的提示就没了。
  8. 设置 smb 网络共享,如下命令:
    sudo zfs set sharesmb=on 池/文件系统
  9. 完成后可以用以下命令查看共享属性是否设置成功:
    sudo zfs get sharesmb
    ps:后面不加池/文件系统,可以显示所有的
  10. 正常成功后,应该就可以了,或者执行如下命令:
    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 来进行共享。

解决办法

  1. 安装 Samba:
    sudo dnf in samba samba-client
  2. 修改 /etc/samba/smb.conf,在 global 里加入下面的内容

    [global]
     usershare path = /var/lib/samba/usershares
     usershare max shares = 100
     usershare allow guests = yes
     usershare owner only = no
  3. 创建 /var/lib/samba/usershares 目录,并赋予权限:

    # mkdir /var/lib/samba/usershares
    # chmod +t /var/lib/samba/usershares
  4. 启动 smb 服务:
    sudo systemctl start smb
  5. 然后就可以启动 zfs 的 smb 了:
    sudo zfs share -a
    就不会提示错误了。
  6. 用 smbclient 查看下共享的内容:
    smbclient -L localhost -U%
  7. 配置一下 samba 的用户之类的东西,应该就可以访问了。

samba 安装使用

由于无法自定义共享名称,所以这里想试试独立的 samba 共享。

  1. 正常 rocky linux 安装了 samba,没有就:
    sudo dnf install samba samba-client
  2. 编辑 /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。

  3. 添加组 artists:
    sduo groupadd artists
  4. 添加非登录用户用户,并将其添加到 artists 组,上面的共享配置里为 artists 组设置了写入权限,注意组前面需要加个 @:
    sudo useradd -g artists -s /sbin/nologin xxx
  5. 设置用户密码:
    sudo passwd xxx
    输入2次密码。
  6. 给 samba 添加用户:
    sudo smbpasswd -a xxx
    然后输入 2 次密码(简单点,设置成跟登录一样的密码)
  7. 按照惯例,重启 smb:
    sudo systemctl restart smb
  8. 访问试试。

问题2:samba 共享的权限

这个是比较奇怪的问题,一直没找到原因。
共享的三个文件里,materials 怎么都无法写入,而其他两个可以正常读写。

  1. 文件夹权限和 samba 权限都正确。在系统下可以正常写入。
  2. zfs 创建这个文件系统的时候跟其他两个一样,都是 noacl 的。
  3. 外网上看到有人说共享名称不能与共享目录的名称一样,所以试着将 materials 改为 materiallib,可以正常读写。
  4. 将共享名称改为 materials,然后将共享目录名称改为 materials_share,不能写入,所以应该跟路径名无关。或者难道 materials 是个保留的关键字?
    没找到原因,但是更改共享名称可以读写,所以暂时不管了,改共享名称为 materiallib。

cockpit

rocky linux 在我 ssh 远程的时候就会提示推荐用 cockpit。用起来确实不错,比 truenas 那个坑爹的监控要精确的多,truenas 监控图表完全就是个搞笑的,感觉数据获取有问题,至少我这台机子用起来是这样的。
cockpit 有挺多工具的,包括管理网络共享的可以安装。

  1. 暴力安装所有 cockpit 插件:
    sudo dnf in cockpit*
  2. 浏览器打开 xxx.xxx.xxx.xxx:9090,登录可以看到左侧栏里面出现了 File Sharing,所以准备把之前配置好的 samba 共享去掉,用 cockpit 来管理共享。
  3. 将之前配置好的 /etc/samba/smb.conf 注释掉。
  4. cockpit 用的是 net share 来实现 samba 管理( zfs 用的是 usershare),所以需要安装 samba-common-tools,(一般都是安装好的):
    sudo dnf in samba-common-tools
  5. 需要开启 samba 的 net share 的功能,点开 File Sharing 会提示你往 [global] 项里添加一下内容:

    include = registry
  6. 重启 smb 服务:
    sudo systemctl restart smb
  7. 估计还得启动下 nfs 的服务,不然 File Sharing 好像会提示错误。
    sudo systemctl start nfs-server
    sudo systemctl enable nfs-server
  8. 然后你就可以在 File Sharing 里配置共享,用户以及用户组权限等。

firefox 打开提示浏览器太老

  1. 按照 github 上有人给出的方案,进入 /usr/share/cockpit/static/login.js,修改下面内容:

    :is():where()

    为:

    :is(*):where(*)
  2. 重启 cockpit 的所有服务(是不是必要不大清楚,保险起见),删除浏览器的 cookies 应该就可以了。
    ps:如果还是提示太老,重启 cockpit 的所有服务,然后清理 cookies 试试,打开后应该能正常进入了,我最新的 firefox 是可以了。

MegaRAID Storage Manager

目的是为了在我自己的工作机(win10)上用 MegaRAID Storage Manager 来管理和查看这台 nas 的这列卡。

  1. 去网上找个安装包,我这边的是下的是 ibm 的 msm 17.05..06.00 版安装包。
  2. tar -xvf xxx.bin(为啥是个 bin,反正也能解压)
  3. 进入到 image/64bit 目录。
    cd image/64bit
  4. 查看下 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(这个感觉是界面的东西,不过我本机已经装过,所以不知道只是作为服务端,需不需要这个东西)

    大部分应该是装好的,版本应该也没啥太大关系。

  5. msm 的安装脚本是 csh 的,需要装个 tcsh:
    sudo dnf in tcsh
  6. 执行安装脚本:
    sudo ./install.csh -d -ru popup
    -d 是指只安装远程服务管理组件
    -ru popup 不安装 popup
  7. 打开防火墙端口(可以在 cockpit 里操作):307,5571,161
    至于为什么,我也是看的别人的教程来的,可能跟 snmp 有关吧。
  8. 在本地打开 MegaRAID Storage Manager,输入 ip ,登录后,需要等一会儿才能看到信息,我的 windows2016 的服务器显示的速度要比这台 linux 的一些,是 dell 的 h700 卡。这台 nas 的是 lsi 9271-8i 的卡。

问题:msm 安装报错。

  1. 一开始按照网上教程安装所有东西,在安装 sas-snmp 的两个 rmp 时会报错,索性 dnf 搜索找到了这俩东西,直接安装:
    sudo dnf in sas_ir_snmp sas_snmp
  2. 到 popup 这里也会报错,好像 MegaRAID 里没有 MegaPopup 这个东西了,安装完远程也无法访问。后来查了下,就如上面所述,加了 -d -ru popup,虽然也会提示 sas 报错信息,但是安装完后,远程可以访问。

到此,我的小 nas 需要的东西应该大部分都齐了

nas配置清单:

序号名称价格
1小克思工控 8盘机箱870 RMB
2超微X11SSL-F800 RMB
3LSI 9271-8i(带线)325 RMB
5CPU E3 1260LV5345 RMB
6万兆光卡 x520-sr1150 RMB
7主机总计2490 RMB
86x希捷银河6t6900 RMB
9总计9390 RMB

差不多 2500 的机子的钱,本来是想买西数的金盘的,但是涨价了,就买希捷的银河了,跟西数白盘价格差不多。不知道是机子整体性能弱还是系统问题,希捷的银河跑起来没西数的金盘快,稳定性也弱,不包括细碎小文件,那个按个数算就不算了,一般文件大小大概 1-10G 左右,综合上来看:可能之前是我测试环境有问题,或者我昨晚改了啥参数,今天稳的一批,32G大文件拷贝,写入稳定 700 左右,两个都差不多,都是误会,剩下就是测试寿命了,看看能用几年开始换盘。

小nas原有的存储
硬盘6x希捷银河6t6x西数金盘2t
主机散装配置(如上面所诉)dell R510 二手服务器
系统Rocky linux 9Windows Server 2016
阵列卡lsi 9271-8ih710
阵列类型raid5raid5
写入速度 MB/s200-400 上下起伏阶梯曲线600-750 稳定曲线600-700 稳定曲线
读取速度 MB/s万兆上限万兆上限
噪音完全静音挺大风声,带耳机可以屏蔽

上图看下,这是 nas 的拷贝 32G 文件的曲线,从本地的固态硬盘上拷贝文件上去:
5fd2127621587a281b38995a4cb940d.png
看看这个 nas 能用几年,如果主机寿命长,可以考虑把戴尔的换掉了,对于都在一个房间的小工作室来说,声音确实很重要。

蓝牙耳机连接

xfce4 默认好像没有控制蓝牙的界面,网上介绍的是两个三方的:bluemanblueberry 。 我在 github 上找到了另外一个 xfce-bluetooth 的。想想这种东西还要下载编译太麻烦了,就直接命令行解决了。

  1. 确认蓝牙服务的状态:
    sudo systemctl status bluetooth
    一般都是正常的,没有就:
    sudo systemctl start bluetooth
    sudo systemctl enable bluetooth
    然后如果没有这个服务,那就安装下软件,但是正常默认都会有:
    sudo dnf in bluez libldac sbc
    后面俩不是必要的,我只是看到介绍写的是蓝牙连接用的有损的音频编码之类的,顺带就给装了。
  2. 然后就会有个 bluetoothctl 的命令可以使用。
  3. 确认蓝牙没有被阻止:
    rfkill
    正常是 unblocked 状态,blocked 的话就(一般也不会 blocked):
    rfkill unblock bluetooth
  4. 上面都确认完了,就可以使用 bluetoothctl 命令来匹配和连接设备了:
  5. 进入蓝牙控制:
    bluetoothctl
    命令行提示符就变成了当前连接的设备名称,颜色为蓝色,如果没有就是 [bluetoothctl]#
  6. 扫描设备:
    scan on
    就会开始扫描附近的设备,选中设备的 物理地址,然后中键点击复制,下面所有操作都用这个来识别。
  7. 匹配设备:
    pair xx:xx:xx:xx:xx:xx
    ps:耳机是 B&O E3 的,所以需要先按住耳机开启匹配模式,然后再执行这个。
  8. 信任设备:
    trust xx:xx:xx:xx:xx:xx
  9. 连接设备:
    connect xx:xx:xx:xx:xx:xx
  10. 正常情况下就能连上了,完毕,退出。
    exit
  11. 像耳机的话,音频输出那里切换以下输出设备就可以听了,系统不会自动切换。

bluez 的配置文件在 /etc/bluetooth/main.conf,默认在开机后,蓝牙适配器的电源是自动启动的,相关设置是:

[Policy]
AutoEnable=true

这个设置默认就是这样的。

存储挂载

OpenSuse的版本基础上更新了下:

  1. 因为增加了服务器,所以加入了多个服务器的支持。服务器名称和 ip 暂时直接写在脚本里。
  2. 用户和密码会在输入后写入到文件里,以方便后续映射,文件放在 $HOME 下,命名是 .服务器名称_smbcreds,属于当前用户,权限为 600
  3. 将提升权限的 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,重启发现出现如题的错误。就进行了如下的过程:

  1. 重新进入 Rocky,常规方式刷新 grub.cfg
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  2. 各种命令查看都能正常显示 Windows 的硬盘。
  3. cat grub.cfg,可以看到 windows 启动项里的 root 值是:

    set root='hd1,gpt1'
  4. 重启进入 grub,还是没有找到,ctrl+c 进入命令行模式,执行:
    ls
    可以看到 lvm 和 hd0 以及各自分区的信息,但是这时候我还没留意到少了一些硬盘和分区。
  5. 经过几个小时的来回测试和查找资料,查到外网有人重启后没有找到部分硬盘,但是进入 bios 后再进入 grub ,输入 ls 命令又可以显示之前没有的硬盘。
    ps:当时那个晴天霹雳,突然想起了之前因为一些问题翻过这个主板的 bios 设置,隐约记得快速启动下面有其他两个选项,sata supportNVMe support 。当时就觉得是不是 快速启动 跳过了硬盘的检测,进入 bios 后会检测硬盘。想到这个是因为早上想进入技嘉主板的 bios 的时候发现死活进不去,一闪就进入系统了,查到说是技嘉主板快速启动会跳过所有硬件检测,包括键盘,特意看了下,果然启动的时候键盘灯没亮。尝试 bios 电池放电,进 Windows UFEI 固件设置之类的操作完全没用,后来想到如果没有系统盘的话,应该就不会进入系统了。立马拔掉主板上的 sata 线,轻松进入 bios,然后发现快速启动选项里设置的是 Ultra fast 。改成 快速启动 就可以在开机的时候正常检测到键盘,然后也可以按 F2 进入 bios 了。
  6. 在我顿悟后,进入 bios,果然发现 快速启动 下的 sata support 设置成 仅最后一次加载的 SATA 设备。改成 所有 sata 设备 后,Grub2 正常引导 Windows Boot Manager。
  7. 这个问题跟哪个系统没关系,只是因为我的 Windows 装在 sata 接口的固态里。而 Rocky 装在 NVMe 的固态里。

ps:最后只能感叹,主板产家在大伙儿机子的启动速度上操碎了心啊,不知道加速了零点几秒啊,各种花里胡哨的设置。我也只能觉得技嘉的 ud 系列不适合工作机啊。不知道其他主板会不会有这些坑爹的设置。一天 4 个小时浪费在这里面了。

休息,休息一下...


mightyang
1 声望1 粉丝