摘要

由于 rocky linux 实在不适合桌面,xfce 的桌面环境也支持的不太好了,最近入了 opensuse 坑,顺带记录下。
至于为什么用 xfce,主要是由于以前一开始玩儿 linux 的时候,centos 里测试过 gnome,xfce,kde,开 maya 和 nuke 渲染时,只有 xfce 能稳定运行,gonme 经常半路崩,kde 直接就崩,有可能是我机器问题,也可能经过这么长时间迭代,变得稳定了,大伙儿根据自己喜好安装即可。

职业

灯光+渲染+后期合成+脚本

工作软件

maya,nuke,houdini,ps,clarisse 等 cg 软件。

系统版本

opensuse leap 15.3
opensuse leap 15.4

记录

联想 air小新15 2020 amd 版 蓝牙RTL8761B 驱动

问题描述:xfce 下蓝牙按钮为启用状态,但是搜索设备是空的。

进入 https://www.xmpow.com/pages/download 搜索 BH456A,下载驱动文件,解压,然后如下命令将需要的 bin 和 config 文件拷贝到 firmware 里:

sudo cp -iv 20201202_LINUX_BT_DRIVER/rtkbt-firmware/lib/firmware/rtlbt/rtl8761b_fw /lib/firmware/rtl_bt/rtl8761b_fw.bin
sudo cp -iv 20201202_LINUX_BT_DRIVER/rtkbt-firmware/lib/firmware/rtlbt/rtl8761b_config /lib/firmware/rtl_bt/rtl8761b_config

拷贝完后就可以正常搜索蓝牙设备了。

蓝牙设备在不同系统之间切换时无法自动连接问题

买了个USB蓝牙适配器,在 Windows 下配对好蓝牙耳机,切换到openSUSE再次配对好蓝牙耳机,再切换到 Windows 下后,蓝牙耳机无法自动连接,需要移除设备,再重新配对一次。查了下,原因是
我们的蓝牙是一对一传输的,当 Windows 下连接蓝牙设备时,会随机生成一个 linkKey,而 Linux 下也会生成一个不同的 linkKey,所以每次配对都会改变 linkKey,即使是同一个蓝牙芯片(奇怪的设定)。

解决办法:
将其中的一个 linkKey 改为另外一个 linkKey 即可。Windows 下的 linkKey 保存在注册表里,需要用 pstools 在管理员权限下打开注册表编辑器才能看到,不然点不开。

  1. 在 Windows 系统中下载 pstools (点击下载),然后解压,记得选择解压到,不然会直接把所有文件解压到当前目录,很乱。这里暂时定为 D:\pstools
  2. Win+x 然后按 A 以管理员身份启动 PowerShell。然后 cd 进入 D:\pstools 目录:
    cd D:\pstools
  3. 通过 pstools 工具来执行注册表编辑器:
    .\PsExec.exe -s -i regedit
  4. 启动后进入目录:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys
  5. 可以在这个目录下看到以蓝牙适配器地址命名的项(下图蓝框),选择该项后就可以看到以蓝牙设备地址命名的值(下图绿框),双击该值,打开后就可以看到里面的数据,这些数据是 32 位的 16进制的值,就是我们需要的 linkKey,虽然可以右击选择复制,但是复制不了,只能先右击 Keys 项,选择导出,然后用文本编辑器打开导出的 reg 文件,复制这个 16 进制的值。
    下图位 Keys 路径下的内容。
    图片.png
  6. 切换到 linux 下,切换到 root 权限(不然进不去),进入路径 /var/lib/bluetooth/蓝牙适配器地址/蓝牙设备地址,然后编辑 info 文件里的 linkKey,改成跟 Windows 下一样的即可。

升级

执行命令:
sudo zypper update
保持最新,然后执行下面的操作。

fcitx

  1. 安装 fcitx
    sudo zypper in fcitx fcitx-libpinyin
  2. 设置为自动启动,opensuse 里有命令设置自动启动的
    fcitx-autostart
    正常注销进来就可以看到右下角有个键盘的图标,然后设置加入 libpinyin 就可以了。
  3. 如果上面命令不行,就试试下面的:
    在 /etc/environment 里加入如下:

    Qt_IM_MODULE=fcitx
    GTK_IM_MODULE=fcitx
    XMODIFIERS=@im=fcitx

    注销再进来即可。
    ctrl+space 切换输入法。

firefox 升级

  1. 从官网下载 firefox 安装包
  2. tar 解压
  3. 将解压得到的 firefox 目录直接复制到 /user/lib64 目录下,覆盖原来的 firefox即可。
  4. 视频编码问题(一般为 h264/mp4),参考网上常用方法,安装 packman:~~
    sudo zypper ar -fcg 'https://mirrors.tuna.tsinghua.edu.cn/packman/suse/openSUSE_Leap_\$releasever/' packman
  5. 添加完 packman 后,直接执行更新:

    sudo zypper refresh
    sudo zypper dist-upgrade --from packman --allow-vendor-change
    sudo zypper install --from packman ffmpeg gstreamer-plugins-{good,bad,ugly,libav} libavcodec-full vlc-codecs
  6. 升级完毕,重启 firefox 就好了。

evince

系统默认安装好的

问题:中文无法显示

pdf 里中文的部分是空白的。

  1. 可以先用 pdffonts 查看下需要的字体:
    pdffonts xxx.pdf
    ps:提示 Syntax Error: Missing language pack for 'Adobe-GB1' mapping
    用到的字体名称是 Courier 和 CourierNewPSMT
  2. 安装 poppler-data 包即可:
    sudo zypper in poppler-data

mpc-qt

可能很多人喜欢用 vlc,但是如果除了播放电影视频等娱乐,还会拿来检查视频的人来说,mpc-hc 可能会更合适。windows 下习惯用 k-lite codec,opensuse 下找到了 mpc-qt,最重要的是支持逐帧播放,快捷键是 ctrl+方向键。
sudo zypper in mpc-qt

vim8.2 编译

zypper 安装的 vim8.0 不支持复制到粘贴板,而且 vimrc 里配置了一些需要 8.2 支持的一些插件,所以编译个。

  1. 去 github 下个最新的 vim。
    可以在 github 链接前加上 http://ghproxy.com/,可以通过代理快速下载,如 http://ghproxy.com/https://github.com/xxx/xxx.git
  2. 安装一些依赖:
    sudo zypper in ncurses ncurses-devel python3-devel libXt-devel gtk3-devel libcanberra-devel libcanberra-gtk3-devel libsodium-devel gpm gpm-devel libXpm-devel libXdmcp-devel
    ps:
  3. python3-devel 跟 python3 有关,安装后就会有 config-3.6m-x86_64-linux-gnu 目录了,而且会自动找到。
  4. libXt-devel 是为了启用 x window 的剪切板。
  5. canberra 跟声音事件有关。
  6. sodium 是个加密库。
  7. gpm 跟鼠标操作有关
  8. xpm 是用于操作 pixmaps 的库,跟图像有关吧。
  9. Xdmcp 是X显示监控协议,为啥需要它我也不知道,我只是在 config.log 里发现提示这个没有,就装了。
  10. 解压并进入 vim 目录,按照网上如下配置:

    ./configure --with-features=huge \
    --enable-multibyte \
    --enable-pythoninterp=yes \
    --with-python-config-dir=/usr/lib64/python2.7/config \
    --enable-python3interp=yes \
    --with-python3-config-dir=/usr/lib64/python3.6/config-3.6m-x86_64-linux-gnu \
    --enable-cscope \
    --enable-gui=auto \
    --enable-fontset \
    --enable-largefile \
    --with-compiledby="yang" \
    --with-x

    最近看了下 Makefile,发现其实有些选项在大部分系统下默认就是这样的,或者没有看到一些选项,没必要添加, 现在也基本不用到 python2 了,去掉,精简了下:

    ./configure --prefix=/usr \
    --with-features=huge \
    --enable-python3interp=dynamic \
    --enable-cscope \
    --enable-gpm=dynamic \
    --enable-gui=gtk3 \
    --with-compiledby="yang"
  11. --enable-gui=auto,默认自动选择 gtk2, 但是编译的时候会出一大堆经高,就用 gtk3 了,没有警告。
  12. --enable-fontset,这个设置了 gtk3 后,configure脚本里就会强制这个禁用,如果改 configure 脚本,编译会出错,具体不知道啥原因,就没加了。
  13. 然后 make -j8 && sudo make install 即可。
  14. 编译后 vim --version 即可看到 python3 为 dyn,clipboard 和 xterm_clipboard 均为 + 。唯一有疑问的就是 system vimrc file,据网上资料显示 Centos 的路径应该是 /etc/vimrc ,而我在另外一台机器上编译的 vim8.2 也是这个路径,但是在这个笔记本上编译的路径是 $VIM/vimrc。可能哪个参数不一致把。

网易云音乐

  1. 官方下载 ubuntu 18.04 版
  2. 安装dpkg(如果没安装):
    sudo zypper in dpkg
  3. 创建解压目录:
    mkdir netease
  4. 解压 deb 的内容到 netease 文件夹里:
    dpkg -X neteaseXXX.deb ./netease
  5. 解压的文件是 opt 跟 usr 两个文件夹。
  6. 复制粘帖到根目录即可,正常运行。

    一开始下的 deepin 版的,有问题,zypper 安装了 deepin-music-libnetease-meta-search 也不行。
    rocky linux 下会有各种问题。
    (工作的时候一般都会听点音乐,习惯了,所以会装这个)

问题1:

15.4版更新了一些东西,所以安装完后会报两个错误:libselinux.so.1 和 libpangocairo-1.0.so.0。主要还是版本问题,而且是关联性的,方式是直接去掉出问题的库,调用系统自带的库就好:

  1. 进入到网易云音乐的 libs 目录里:
    cd /opt/netease/netease-cloud-music/libs
  2. 将相关的 so 删除或者做备份处理:

    sudo mv libselinux.so.1 libselinux.so.1.backup
    sudo mv libpango-1.0.so.0 libpango-1.0.so.0.backup
    sudo mv libpangoft2-1.0.so.0 libpangoft2-1.0.so.0.backup
    sudo mv libfribidi.so.0 libfribidi.so.0.backup

    这样就可以正常执行。

百度网盘

  1. 官方下 rpm 安装
    安装过程中,提示需要 libXtst libuuid nss,openSUSE 的zypper 没有找到合适的依赖,查资料,有人说强制忽略依赖安装。
  2. 加参数强制安装:
    sudo rpm -ivh baidunetdiskXXXX.rpm --nodeps --force
  3. 启动
  4. 正常打开登录,提示 Buffer() 问题警告,但是不影响使用
  5. 如果启动不起来,查看下日志:
    sudo cat /var/log/message | grep baidu
  6. 如果发现有类似下面的错误信息:

    segfault at 1000000038 ip 00007fd8f346b5e7 sp 00007ffed0a32ce0 error 4 in libcrypto.so.1.1
  7. 大概原因是调用的 openssl 的版本不合适,百度网盘又没把自己开发用的库打包进来,而网易云音乐的开发比较靠谱,把用到的库都打包到 libs 目录下了,所以直接拷贝来用即可。
  8. 去网易云音乐目录下的 libs 里拷贝 libcrypto.so.1.1, libk5crypto.so.3 这俩文件到百度网盘安装目录下即可,默认情况下,程序会优先调用同目录下的库文件。网易云音乐跟百度网盘的默认安装目录应该都在 /opt 目录里。
    ps: libk5crypto.so.3 不用拷贝好像也行

测试如下:

  • 点击网盘内文件正常下载,速度正常。
  • 点击浏览器中百度网盘的文件,正常下载,速度正常。
  • 本地拖拽上传,秒传正常,上传正常。

也有别人打包的 AppImage,但是后来发布的链接实效了,各位看官得自己找找。

向日葵远程

1.官方下 rpm 安装
安装过程提示缺依赖:webkitgtk3,libappindicator-gtk3。
查了下,应该都已经安装了,只是名称有所不同,决定强制安装。
2.加参数 --nodeps 强制安装:
sudo rpm -ivh SunloginClientXXXX.rpm --nodeps
3.安装完成后,正常启动,远程测试OK。
4.输入法问题,在Windows下,输入法的切换快捷键是直接传递给远程系统的,不影响本地系统,但是 opensuse 下会影响到本地。

Motrix 安装

  1. 官方有 AppImage,也有 rpm,看个人喜好安装。
  2. rpm 安装会提示跟 百度网盘 一样的依赖问题,照样 --force --nodeps 强制安装即可。
  3. 如果是 AppImage,直接下 AppImage 文件:下载链接。给文件添加执行权限:
    chmod +x xxx.AppImage
  4. 按照习惯创建目录 /opt/motrix,修改拥有者,然后把文件移动到这里:

    sudo mkdir /opt/motrix
    sudo chown xxx:xxx /opt/motrix
    mv xxx.AppImage /opt/motrix/
  5. 在 bin 里建立个软连接,方便更新和编写 desktop 文件:
    ln -s /opt/motrix xxx.AppImage /usr/bin/motrix
  6. 编写 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 了

  7. 去官网下载主页上的图标,保存为 motrix.png:
    motrix
    ps:恩。。。有点大,改不了尺寸,凑合吧。
  8. 将图标文件移动到图标目录下:
    sudo mv motrix.png /usr/share/icons/
    ps:正常应该立马就能看到效果。
  9. 想要开机自动启动,可以在设置里的 Session and Startup 中将其设置为登录自动启动,也可以将 desktop 文件复制到 autostart 目录下:
    sudo cp /usr/share/applications/motrix.desktop ~/.config/autostart/
    ps:两种方式是一样的,只是一个是界面操作,一个是命令操作。复制到 autostart 后,可以在 Session and Startup 里看到 Motrix 的启动项。
  10. 通过 Motrix 实验室,在 firefox 里添加 Aria2 的工具(Motrix 用的是 Aria2),配置 RPC 服务器的默认服务器如下:
    端口:16800(这个是 Motrix 默认的端口,听说是改不了的)
    密钥:与 Motrix 中设置的一样即可。打开 Motrix 设置,到 进阶设置 里,找到 RPC授权密钥,可以点击右边的骰子自动生成密钥,再将这个密钥复制到这里即可(记得保存 Motrix 设置)。空着也可以,两边一样就行。

下次在 firefox 中点击下载的时候,会弹出 Aria2 的下载窗口,点击下载会自动传递给 Motrix,当然 Motrix 必须先运行。
个人感觉 Motrix 下载 bt 速度快的原因应该是 tracker 的原因,大伙儿可以直接把这些 tracker 放到在 aria2 里,然后看下速度如何。

astah 安装

  1. 下载官方 rpm 安装包,正常安装。
  2. 下载安装 oracle 的 jdk8(非 openjdk,会提示有问题),也可以试试 jre 的,毕竟只是运行软件。
  3. 重点(^_^),用 crack 里的 jar 文件覆盖安装目录下的同名文件,可以用 locate 搜索下路径。
  4. 执行命令:
    java -jar dvt-AstahKeyfileMaker.jar
  5. 在弹出的窗口上点击 Generate,选择保存 license 的路径,一般会在 astah 安装目录下创建个 license 目录用来存放。
  6. 打开 astah,选择 Help -> License -> Set License Key,选择刚保存的 xml 就可以了。

wing pro 8

  1. 官网下载 rpm 包安装,如果提示需要 freetype,但是已经安装过了,就加个 --nodeps 安装。
    sudo rpm -ivh wingXXX.rpm --nodeps
  2. 启动后,会提示需要激活。下面 脚本(转载)支持5,6,7,8,9 的版本(需要 python 和 tkinter):
import os
import string
import random
import hashlib
import platform
py_version = platform.python_version()
if py_version[0] != '3':
    print("Can't run under python2 env ! please run tool under python 3.2 or later version !")
    os.system("pause")
    os._exit(0)
# GUI Import
from tkinter import *
from tkinter import ttk
from tkinter import messagebox

BASE16 = '0123456789ABCDEF'
BASE30 = '123456789ABCDEFGHJKLMNPQRTVWXY'


def RandomString(size=20, chars=string.ascii_uppercase + string.digits):
    return ''.join((random.choice(chars) for _ in range(size)))


def BaseConvert(number, fromdigits, todigits, ignore_negative=True):
    if not ignore_negative and str(number)[0] == '-':
        number = str(number)[1:]
        neg = 1
    else:
        neg = 0
    x = 0
    for digit in str(number):
        x = x * len(fromdigits) + fromdigits.index(digit)

    res = ''
    while x > 0:
        digit = x % len(todigits)
        res = todigits[digit] + res
        x //= len(todigits)

    if neg:
        res = '-' + res
    return res


def AddHyphens(code):
    return code[:5] + '-' + code[5:10] + '-' + code[10:15] + '-' + code[15:]


def SHAToBase30(digest):
    tdigest = ''.join([c for i, c in enumerate(digest) if i // 2 * 2 == i])
    result = BaseConvert(tdigest, BASE16, BASE30)
    while len(result) < 17:
        result = '1' + result
    return result


def loop(ecx, lichash):
    part = 0
    for c in lichash:
        part = ecx * part + ord(c) & 1048575
    return part


g_version_list = ('9.0.4', '8.0.0', '7.X.X', '6.X.X', '5.X.X')
g_version_magics = {
    '5.X.X': [7, 123, 23, 87],
    '6.X.X': [23, 161, 47, 9],
    '7.X.X': [221, 13, 93, 27],
    '8.0.0': [179, 95, 45, 245],
    '9.0.4': [123, 17, 42, 7]
}


def CalcActivationCode(args):
    if not isinstance(args, Application):
        return
    # # Generate License ID
    # licenseID = AddHyphens('CN' + RandomString(18, '123456789ABCDEFGHJKLMNPQRTVWXY'))
    licenseID = args.LicID.get()
    print('License id: ' + licenseID)

    # requestCode = input('Enter request code:')
    requestCode = args.ReqCode.get()
    if requestCode.strip() == '':
        messagebox.showerror("Hints", "Please input the Request Code !")
        return
    # # SHA1
    shaHasher = hashlib.sha1()
    shaHasher.update(requestCode.encode('utf-8'))
    shaHasher.update(licenseID.encode('utf-8'))
    hashResult = shaHasher.hexdigest().upper()
    lichash = AddHyphens(requestCode[:3] + SHAToBase30(hashResult))

    versionMagic = None
    # Supported crack WingIDE Pro version list : 5.x.x, 6.x.x, 7.x.x
    wingIDEProVerStr = args.VersionInfo.get()
    print('Cracking WingIDE Version : ' + wingIDEProVerStr)
    if wingIDEProVerStr in g_version_magics.keys():
        versionMagic = g_version_magics[wingIDEProVerStr]
    if versionMagic:
        activationCode = format(loop(versionMagic[0], lichash), '05x') + \
            format(loop(versionMagic[1], lichash), '05x') + \
            format(loop(versionMagic[2], lichash), '05x') + \
            format(loop(versionMagic[3], lichash), '05x')
    else:
        print('Get wrong WingIDE version, exit...')
        os._exit(0)
    activationCode = BaseConvert(activationCode.upper(), BASE16, BASE30)
    while len(activationCode) < 17:
        activationCode = '1' + activationCode

    activationCode = AddHyphens('AXX' + activationCode)
    print('Activation code: ' + activationCode)
    args.ActCode.set(activationCode)


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.master.title('WingIDE Pro Keygen(5, 6, 7)')
        self.master.geometry('350x180')
        self.create_widgets()

    def create_widgets(self):
        current_row = 0
        current_col = 0

        # Version Info
        self.l0 = Label(self.master, text='WingIDE Pro :')
        self.l0.grid(padx=5, pady=5, row=current_row, column=current_col)
        self.VersionInfo = StringVar()
        self.versionComb = ttk.Combobox(self.master, textvariable=self.VersionInfo, state='readonly')
        self.versionComb['values'] = g_version_list
        self.versionComb.grid(padx=5, pady=1, row=current_row, column=current_col + 1)
        self.versionComb.current(0)
        current_row += 1

        # License ID info
        self.l1 = Label(self.master, text='LicenseID:')
        self.l1.grid(padx=5, pady=5, row=current_row, column=current_col)
        self.LicID = StringVar()
        self.LicEntry = Entry(self.master, textvariable=self.LicID, width=30, state='readonly')
        self.LicEntry.grid(padx=5, pady=5, row=current_row, column=current_col + 1)
        self.LicID.set(AddHyphens('CN' + RandomString(18, '123456789ABCDEFGHJKLMNPQRTVWXY')))
        current_row += 1

        # Request code info
        self.l2 = Label(self.master, text='RequestCode:')
        self.l2.grid(padx=5, pady=5, row=current_row, column=current_col)
        self.ReqCode = StringVar()
        self.ReqcodeEntry = Entry(self.master, textvariable=self.ReqCode, width=30)
        self.ReqcodeEntry.grid(padx=5, pady=5, row=current_row, column=current_col + 1)
        current_row += 1

        # Activation code info
        self.l3 = Label(self.master, text=b'ActivationCode:')
        self.l3.grid(padx=5, pady=5, row=current_row, column=current_col)
        self.ActCode = StringVar()
        self.ReqcodeEntry = Entry(self.master, textvariable=self.ActCode, width=30, state='readonly')
        self.ReqcodeEntry.grid(padx=5, pady=5, row=current_row, column=current_col + 1)
        current_row += 1

        self.btn_Calc = Button(self.master)
        self.btn_Calc['text'] = 'Generate'
        self.btn_Calc['command'] = lambda: CalcActivationCode(self)
        self.btn_Calc.grid(padx=5, pady=5, row=current_row, column=current_col + 1)


if __name__ == '__main__':
    root = Tk()
    #
    app = Application(master=root)
    app.mainloop()

转自:小敏的博客

onedrive

  1. 执行命令:
    sudo zypper in onedrive
  2. 安装完后,执行:
    systemctl --user start onedrive
  3. 设置自动启动服务:
    systemctl --user enable onedrive
    注意用 --user,不需要 sudo。
  4. 可以根据需要配置本地的同步目录等,具体请查看官方文档

(不使用 rclone 的原因在于它用的是 mount 的方式,所以操作上会有些卡,而不像这个直接同步到本地,如果有谁知道 rclone 可以是以同步的方式工作,请告知,多谢!)

squid 安装

小工作室,需要屏蔽制作组的外网,但是浏览器、QQ、微信之类的工具需要访问,所以做一个简单的 squid 代理服务器即可。

  1. 直接 zypper 安装:
    sudo zypper in squid
  2. 编辑配置文件 /etc/squid/squid.conf 里的端口,需要开几个端口就写几个,我考虑是一个人一个端口:

    http_port xxxx

    ps: 把默认的注释掉,根据需要改

  3. 防火墙开一下这几个端口,这里我把局域网的网卡分配给 internal(内部)区域,心理上安全些:

    sudo firewall-cmd --zone=internal --change-interface=网卡名称
    sudo firewall-cmd --zone=internal --add-port=xxx/tcp
    sudo firewall-cmd --zone=internal --add-port=xxx/udp

    ps:把 tcp 跟 udp 协议都加上。

  4. 制作机上配置代理地址即可,基本上所有软件都有代理的配置,自己查一下。

微信、QQ 无法发送图片、文件

查了半天,都是添加语句让服务器不知道你是通过代理连接的,比如:

header_access Via deny all
header_access X-Forwarded-For deny all
或者:
forwarded_for off
via off

最后查到,把 80 端口 添加到 SSL_ports 后面,重启 squid 即可。

acl SSL_ports port 443 80

ps:大概是 QQ 跟 微信 用了非标准的 SSL 端口,所以传输图片文件受阻了,加上就好

百度网盘能登陆,但是下载会卡在请求中,等很久会下几个文件,再等待

这个跟微信,QQ差不多的问题,但是百度网盘的端口我也不知道,索性给全开了,注释掉所有 deny 的语句,然后加入允许所有的语句:
http_access allow all
重启下百度网盘,然后就可以正常下载了。
至于安全问题,就交给 firewalld 吧,不想管了,麻烦。

nvidia 显卡安装

  1. 去 nvidia 上下载对应的驱动文件。
  2. 禁用 nouveau
    sudo echo -e 'blacklist nouveau \noptions nouveau modeset=0' | sudo tee -a /etc/modprobe.d/50-blacklist.conf
  3. 更新内核
    sudo mkinitrd
  4. 重启,使新内核生效
    sudo reboot
  5. 重启后安装必要的编译环境
    sudo zypper in gcc kernel-devel pkg-config libglvnd
  6. 安装当前版本的核心开发包
    sudo zypper in -y kernel-default-devel=$(uname -r | sed 's/\-default//')
  7. 添加执行权限并执行 run 文件
    sudo chmod +x NVIDIA-*.run
    sudo NVIDIA-*.run

安装完毕,重启即可
也可以选择 NVIDIA 专门为 OpenSUSE 做的源,参考官方即可。

存储挂载

  1. 存储系统是 windows 的,安装 samba,gfvs-backend-samba
    sudo zypper in samba gvfs-backend-samba
    gvfs-backend-samba 给 thunar 用
  2. 然后写好映射脚本:

    #!/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
    dt=/mnt
    # "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 $credsPath
         chmod 755 $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=`sudo mount -t cifs -o rw,dev,exec,async,suid,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 "$dt/$dirChar"
         credsPath="${uh}/.${server}_smbcreds"
         # 如果这些目录已经被映射,就先 umount 然后在映射,否则直接映射,方便测试脚本。这里在 umount 下直接 mount 会提示 busy,所以写了个 waitMount 函数。
     if mountpoint -q "$dt/$dirChar"; then
         echo "remount $dt/$dirChar"
         sudo umount -l "$dt/$dirChar"
         waitMount "$dt/$dirChar" "//${serverName[$server]}/$dir" $credsPath
         ln -s "$dt/$dirChar" "$uh/Desktop/$dirChar"
     else
         echo "mount $dt/$dirChar"
         waitMount "$dt/$dirChar" "//${serverName[$server]}/$dir" $credsPath
     fi
     done
    done
    
    read -rsn1 -p "请按任意键结束..."

    设置可执行权限后,双击运行,在弹出的窗口里输入管理员密码窗口,然后输入连接存储的用户和密码,保存在 ~/服务器名_smcreds 中,权限为当前用户读写,可执行。
    ps: 这里面有两个服务器,还有相关的目录,直接写在脚本里,可以根据需要修改

  3. thunar 默认没有双击运行的功能,先关掉 thunar,通过下面命令开启:
    xfconf-query --channel thunar --property /misc-exec-shell-scripts-by-default --create --type bool --set true
    然后就有了双击运行的功能了。

Maya2022 安装

  1. 安装库
    sudo zypper in libGLU1 libXp-devel
  2. 正常 rpm 安装 Packages 里除了 adlm 以及 adsk 开头的其他 rpm 文件。
  3. 将 ADPClientService 更名,保证不被运行,比如文档说明里说的:ADPClientService_NOTHANKYOU
  4. 重点(^_^):将 maya.bin 覆盖到 /usr/autodesk/maya2022/bin 目录下

问题:

  1. 安装 Pymel 出现的 pip 的 ssl 问题
    pip is configured with locations that require TLS/SSL
    将压缩包里提供的 libcrypto.so.10-and-libssl.so.10.tar.xz 解压,将解压出来的文件复制到 /usr/lib64 目录下即可
  2. 缺少 libpng15.so.15
    安装包的 ODIS 里有这个,直接拷贝到 /usr/lib64 里
  3. 缺少 libjpeg.so.62
    对着版本去 https://pkgs.org 上搜索:
    下载 libjpeg-turbo-1.5.3-10.el8.x86_64.rpm 安装即可,没碰到依赖问题。
  4. libtiff.so.5 no version infomation available 问题
    下载 libtiff-4.0.9-18.el8.x86_64.rpm,直接解压,然后将里面跟 libtiff.so.5 有关的都拷贝到 maya 的 lib 下。openSUSE 的 /usr/lib64 下默认带了这个文件,但是执行 maya 会提示这个文件里没有版本信息的错误,所以放到 maya 的 lib 下,maya 会优先调用该目录下的 so 文件,避免覆盖导致的其他异常。
  5. maya 启动提示 colormanager 的问题
    安装显卡驱动即可。

anrold 渲染器安装

  1. 去官网下载 arnold for maya2022 的,我下的 mtoa_4.2.4。具体链接可以自己google,百度不一定能搜到。
  2. 给 Mtoa-4.2.4-linux-2022.run 添加可执行权限:
    chmod +x Mtoa-4.2.4-linux-2022.run
  3. sudo 执行 run 文件,这里我选择解压模式(我的插件都装在服务器上,方便切换调用),并不自动配置 maya 加载的环境变量,路径自己选择个,默认是在 autodesk 的目录下。
  4. 修改 mtoa.mod 文件,将所有行中的安装路径改成 . 号(包括第一行),这样默认指向 mtoa 所在的目录。
  5. 在 /usr/share/applications 下添加一个 desktop 文件,内容如下:

    [Desktop Entry]
    Type=Application
    Version=2002_4.2.4
    Name=Maya2022 With Arnold 4.2.4
    Comment=Open Maya With Arnold 4.2.4
    Path=/usr/autodesk/maya2022/bin
    Exec=env MAYA_MODULE_PATH=arnold的安装路径 /usr/autodesk/maya2022/bin/maya2022 %u
    Icon=
    Teminal=false
    Categories=Applications;Graphics;
    Encoding=UTF-8

    Exec 行加入 env Maya_MODULE_PATH 添加 arnold 的路径,在启动时添加环境变量 MAYA_MODULE_PATH 来加载 arnold 渲染器。

  6. 如果 arnold 的路径里包含了环境变量,比如 $HOME 之类的,则 desktop 需要如下编写:\

    [Desktop Entry]
    Type=Application
    Version=2002_4.2.4
    Name=Maya2022 With Arnold 4.2.4
    Comment=Open Maya With Arnold 4.2.4
    Path=/usr/autodesk/maya2022/bin
    Exec=bash -c "MAYA_MODULE_PATH=arnold的安装路径 /usr/autodesk/maya2022/bin/maya2022 %u"
    Icon=
    Teminal=false
    Categories=Applications;Graphics;
    Encoding=UTF-8

    ps: 把 env 换成 bash -c 来解析中间用到的环境变量

  7. 在菜单栏点击就可以启动 maya2022,在插件库可以找到 mtoa,勾选即可加载,并且不用 crack 直接渲染。
  8. 批渲染时可能会出现水印,装个 rlm 服务端,然后在 arnold 安装目录的 bin 里放一个 solidangle_client.lic文件,内容如下:

    SERVER hostname ANY 5053

    hostname 为服务端地址,ip 也行,5053 为 rlm 服务的端口,默认是 5053,根据自己的配置修改即可。

3DEqualizer 安装

  1. 下载 3DEqualizer 的压缩包,这边下的是 v4r6 版(网上没找到 windows 版,只有 linux),因为 r6 版可以直接直接导出 alembic 文件。
  2. 放到想要的路径下,我一般放 opt 下,可以直接进入 bin 里执行 3DE4 来运行,它比较简单,不用安装。比较坑的地方在于,想要能正确加载 python 的环境,我们不能直接运行3DE4,而是执行同目录下的 wrapper_startup_script 的脚本文件,它会配置 3DE4 的 python 环境,不然这个版本在选择导出 Alembic 的时候提示没有 imath 模块。
  3. 创建 Desktop 文件:

    [Desktop Entry]
    Name=3DEqualizerV4R6
    Type=Application
    Comment=Run 3DEqualizerV4R6
    Categories=Application;Graphics;
    Icon=/opt/3DEqualizer/bin/3DEqualizer-logo.jpg
    Exec=/opt/3DEqualizer/bin/wrapper_startup_script -open %u
    Encoding=UTF-8

    Exec 跟 Icon 路径自己改下

  4. 修改 wrapper_startup_script.sh 文件内容,加入对 -open 参数的判断,如果 %u 为空时,wrapper_startup_script.sh 不传入 -open 参数,直接启动,否则 3DEqualizer 会不启动:

    var=`echo $@ | sed "s|\-open\s*\(\w*\).*|\1|g"`
    
    if [ $var ]
    then
     # run 3DE4
     $ROOT/bin/3DE4 "$@"
    else
     $ROOT/bin/3DE4
    fi

Nuke 安装

  1. 去官网下载安装文件,并解压
    tar -xvf NukeXXXX.tgz
  2. 赋予执行权限
    sudo chmod +x NukeXXXX.run
  3. 执行 run 文件
    sudo ./NukeXXX.run --prefix=/opt/nuke --accept-foundry-eula
    --prefix 是指定安装目录,默认还会在下面创建一个 NukeXXX 的文件夹
    --accept-foundry-eula 是指同意 foundry 的协议
    ps:13.0v4 安装并没有像以前那样出现界面,而是 shell 里面显示协议,同意并配置好后安装在自己指定的目录下(默认跟 run 同目录下,所以感觉有点像解压),也没有创建 .desktop 文件,难道是官方换开发了?
  4. 自己创建 desktop 文件:
    sudo vim /usr/share/applications/nukeXXX.desktop
    ps: nukeXXX.desktop 里的 XXX 自己根据版本号填一下
    内容如下:

    [Desktop Entry]
    Name=NukeX 13.0
    GenericName=NukeX 13.0
    Comment=影视后期软件
    TryExec=/opt/nuke/Nuke13.0v10/Nuke13.0 --nukex
    Exec=/opt/nuke/Nuke13.0v10/Nuke13.0 --nukex %f
    Icon=/opt/nuke/Nuke13.0v10/plugins/icons/NukeXApp48.png
    Terminal=false
    StartupNotify=true
    MimeType=application/x-nuke;
    Type=Application
    Categories=Graphics;2DGraphics;RasterGraphics;
  5. 安装 rlm 服务
    将 rlm 放到某个目录下(自己定),我是放到 /opt/rlm 目录下。
    然后在 /etc/systemd/system 下创建 rlm.service,内容如下:

    [Unit]
    Description=RLM License Server
    After=network.target remote-fs.target nss-lookup.target
    [Service]
    ExecStart=/opt/rlm/rlm -ws 4102 -dlog rlm.log
    ExecStop=/opt/rlm/rlmutil rlmdown RLM
    Restart=on-abort
    KillMode=process
    # Restart service after 5 seconds RealityServer crashes
    RestartSec=5
    User=root
    Group=root
    [Install]
    WantedBy=multi-user.target

    上面的 ExecStart 和 ExecStop 替换成自己的 rlm 路径。
    然后执行下面命令刷新 service:
    sudo systemctl daemon-reload
    再执行下面命令启动 rlm 服务:
    sudo systemctl start rlm
    再执行下面命令开机启动 rlm 服务:
    sudo systemctl enable rlm

  6. 如果启动出现 __init__.py 的什么问题,可以在 shell 里执行下 Nuke 的启动程序,这边出现没有找到 libffi.so.6 的问题,locate 下 libffi.so,这边有 libffi.so.7,所以直接 ln -s 做个软链接即可:
    sudo ln -s /usr/lib64/libffi.so.7 /usr/lib64/libffi.so.6

问题1

rlm 无法启动,提示 (rlm) Cannot bind Web Server port 5054, exiting."。这个问题有好多情况,最普遍的就是已经启动了一个 rlm,然后 5054 端口被占用了,这种情况会额外提示你这个端口被占用了。换一个端口或者关掉一存在的都可以。
这里是另外一种情况,如果 rlm 版本为 11 的,只是告诉你无法绑定端口,然后没有其他提示,rlm 版本是 12 的,会额外提示你无法找到 localhost 之类的信息,最终表现为无法绑定到 localhost 上。
主要原因是更改了系统的 hostname,这里我改成了 js-pd-001,所以我需要把这个名称添加到 hosts 里,告诉系统 js-pd-001 就是 localhost:

  1. 编辑 /etc/hosts 里的一项如下:
    127.0.0.1 localhost js-pd-001
    ps:将主机名添加到后面即可,这里是 js-pd-001
  2. 进入 rlm 目录,执行:
    ./rlm
    ps: 如果成功启动,那就 OK。

houdini 安装

openSUSE 15.4

  1. 网上下载 houdini 安装包,这里是 houdini 19.5.303 的,然后解压:
    tar zxvf houdini-19.5.303-linux_x86_64_gcc9.3.tar.gz
  2. 进入解压的目录里,并执行安装命令:
    cd houdini-19.5.303-linux_x86_64_gcc9.3 && sudo ./houdini.install
  3. 根据提示,选择 yes 到底就可以。中间可以选装那三个插件。
  4. 停止 license 服务,有三种方式可选:
  5. sesictl-q
  6. sudo systemctl stop sesinetd.service
  7. sudo /etc/init.d/sesinetd stop
  8. 覆盖包里提供的 sesinetd:
    cp sesinetd /usr/lib/sesi/
    ps: 注意这个文件需要有启动权限
  9. 链接 service 文件到相关目录:
    sudo ln -s /usr/lib/sesi/sesinetd.service
    ps: 吐槽下,不知道为什么,做软链接过去,在输入的时候是无法自动补全的
  10. 然后执行 Hodini License Administrtor 命令:
    hkey
  11. 按照老办法,启动 Houdini-Tools,然后输入 server name 和 server code,将生成的码输入到 Hodini License Administrtor 里。
    ps: 手动输入的位置在 File -> Import Licenses -> MANUAL INSTALL
  12. 完事儿正常启动就好了。

问题1

www-data 用户问题。可能其他系统或者因为装过一些软件,这个用户会存在,但是我目前的系统不存在这个用户,所以需要做一些额外的处理。一种是用其他用户启动,还有一种是创建该用户,都可以。我是直接改成我自己的用户执行。

第一种方式:
  1. 检查 groups 里有没有跟自身用户名同名的组,没有就创建一个,并把用户添加到该组里
    cat /etc/group
    查看列出的组有没有与用户相同名称的组
    sudo groupadd gxxx
    没有就创建
    sudo usermod -a -G gxxx uxxx
    将用户 uxxx 添加到 gxxx 副组里(-G 是添加到组里,-g是直接覆盖原来的组)
    ps: 具体为什么要创建一个相同名称的组,这里好像是个 bug,假设我的用户名是 uxxx,属于 users 组,我直接用 users 来作为组启动 sesinetd 服务,会报一个没有找到 users 用户的错误,所以干脆直接创建一个同名的组就好
    ps2: 之前用其他系统,如果我创建了个 uxxx 管理员账户,安装的时候,会自动创建一个同名的组,但是 openSUSE 没有
  2. 修改 sesinetd 的配置文件 /usr/lib/sesi/sesinetd.ini 里的内容:
    user=uxxx
    group=gxxx
    ps: sesinetd 是可以用 --user 和 --group 传递用户和用户组信息,但是如果 ini 里配置了,这俩参数就没用了,注释掉 ini 里的这两条内容就可以传递参数了,当然注释掉后,不传递这两个参数,sesinetd 会以什么用户启动,我也没试过,你们可以试试
  3. 启动服务:
    sudo systemctl start sesinetd
第二种方式

创建用户和用户组就好了
groupadd www-data
useradd -G www-data www-data
然后启动自己试一下,我没试过。

可选配置

如果用 /etc/init.d/sesinetd start 启动的时候,可以通过 sudo systemctl status sesinetd 来查看启动的配置信息,发现是通过 sesinetd_safe 脚本来启动的,所以可以将 service 修改成如下:

[Unit]
Description=SideFX License Server
Requires=network-online.target
Documentation=https://www.sidefx.com/docs/houdini/ref/utils/sesinetd.html

[Service]
Type=simple
ExecStart=/usr/lib/sesi/sesinetd_safe --sesi=/usr/lib/sesi --sesinetd=/usr/lib/sesi/sesinetd --log-file=/var/log/sesinetd.log -V 4 -z 10485
ExecStop=/bin/kill -s QUIT $MAINPID
WorkingDirectory=/usr/lib/sesi
Restart=on-failure
RestartSec=1
StartLimitInterval=10
StartLimitBurst=5

[Install]
WantedBy=multi-user.target

clarisse 安装

这边需要安装 3.6 跟 4.0 版本的 clarisse,安装也比较简单,解压,覆盖就可以使用。
启动时可能会提示缺少 libtinfo.so.5,安装 libncurses5 即可。
配置 python2.7 的路径,可以参考 3DEqualizer 的 warpper_startup_script 脚本来写一个,然后编写桌面文件:

mime-type 设置

mime-type 的主要用处就是识别这是什么文件,然后再设置用什么软件打开,在文件浏览器里显示为什么图标等等。所以我们需要知道几个内容:如何添加 mime-type,如何设置默认的程序来打开某种 mime-type 的文件以及为各个 mime-type 设置图标。先了解下有关 mime-type 的基础内容,这是简书的有个人写的,挺不错的。然后就是各种命令用于设置。最后需要设置图标,可以使用绝对路径进行设置,这样就没有记录的意义了,所以我们想要设置相对路径,就需要了解 linux 里对图标文件的搜索规则,这样就可以不需要设置图标文件的绝对路径,直接使用图标的文件名,系统自动搜索到该图标文件。linux 对于图标搜索的规则可以查看 freedesktop 里的内容。
这里用的是 xfce,大概了解了下,xfce 也有自己设置默认应用打开的方式,/etc/xfce-default.conf 可以设置默认的 mime-type 与默认打开程序的关系,各位可以自行试试,下面是介绍的是 linux 本身的方法。

  1. 根据介绍,先创建一个 autodesk-maya.xml,路径随意,用来编写对 ma,mb 文件的识别,内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
      <mime-type type="application/maya">
     <comment>Maya File</comment>
     <comment xml:lang="zh_CN">Maya 文件</comment>
     <glob pattern="*.ma"/>
     <glob pattern="*.mb"/>
     <icon name="autodesk-maya"/>
      </mime-type>
    </mime-info>

    上面的 xml 中,表示将扩展名为 .ma,.mb 文件识别为 application/maya 文件,注释为 Maya File,中文语言下注释为 Maya 文件,大家可以根据自己的需要进行修改。

  2. 按照上面格式,分别为 3DEqualizer,Nuke,Houdini 创建 .3de,.nk,.hip 扩展名的 xml。
  3. 这里使用 xdg 工具来进行控制,所以通过 xdg-mime 命令进行安装:
    sudo xdg-mime install 路径/autodesk-maya.xml
    这个命令会测试该文件的内容是否有错,并将其拷贝到 /usr/share/mime/packages 里。如果不使用 xdg-mime 命令,直接将该文件拷贝到这个目录下会如何,你们自己测试下,应该也可以
  4. 输入以下命令对缓存进行更新:
    sudo update-mime-database /usr/share/mime
    一般系统会对各种 xml 生成缓存文件,这样不用每次都搜索,提高效率
  5. 然后打开 Thunar,到有 ma 或者 mb 文件的目录,可以在 Type 栏看到变成了 Maya File(Maya 文件)。
  6. 设置双击用 maya2022 打开 ma 或者 mb 文件,命令如下:
    sudo xdg-mime default Autodesk-Maya.desktop application/maya
    意思就是默认情况下,用 Autodesk-Maya.desktop 来打开 application/maya 类型的文件。命令为:xdg-open 文件路径
  7. 用相同的办法为 Nuke,3DEqualizer,Houdini 设置 mime-type 和默认打开程序。

    注意
    application/maya,application 是 media type,本来想自己创建个比如 cg 作为 media type。但是没有找到任何办法,只是找到一堆的国际标准,所以谁知道的可以给介绍下,谢谢。
  8. 为各个 mime-type 设置图标,正常情况下,图标是跟桌面系统有关的,毕竟后台不需要图标,所以每种桌面肯定有自己不同的设置方式。设置 deaktop 的图标,可以将图标文件放到 /usr/share/pixmaps 里,desktop 中 Icon 设置不带扩展名的文件名即可。但是 pixmaps 下的图标文件无法被 mime-type 识别,具体愿意不清楚,但是因该是跟桌面主题的缓存有关。所以按照管理直接放到 /usr/share/icons/hicolor/scalable/apps 里,然后执行下面语句:
    gtk-update-icon-cache /usr/share/icons/hicolor/scalable/apps
  9. 刷新完毕后,就可以在 desktop 与 mime-type 里同时使用相对图标路径了,不用带扩展名。

    路径比较坑,本来想着 /usr/share/pixmaps 里就可以解决所有问题,但是并不能如愿,也没有一个统一的比较简单的自定义路径用于放置全局的图标文件。我所接触的软件基本上都是通过系统的环境变量来记录需要搜索的路径,所以我理想的状态就是 linux 提供一个环境变量如 LINUX_IOCNS_PATH,用于搜索可能用到的图标(但是 linux 并不是一定需要界面,所以这个变量并不是必要的,对于桌面用户比较喜欢),XFCE 提供一个环境变量如 XFCE_ICONS_PATH,用于用户添加需要用到的图标文件,然后执行 xfce4-update-icons-cache,系统搜索该环境变量下的目录,并生成 cache,与主题文件分离,不需要编写 theme 文件啥的,简单方便暴力。而 theme 则按照现有规则,适合有强迫症的玩家。

整合以上所有软件

作为用户,当然希望所有的东西能整合到一个脚本里,全自动设置完全,所以准备将上面所有的内容整合到脚本里,然后一键运行,等待完成即可用于工作。首先设置目录结构:

cg
├── cg.sh
├── drivers
│   ├── installDrivers.sh
│   └── nvidia.run
├── apps
│   ├── installApps.sh
│   ├── maya2022.run
│   ├── 3dequalizer.tar.bz
│   └── nuke.run
├── desktopFiles
│   ├── linkDesktops.sh
│   ├── Autodesk-Maya2022.desktop
│   ├── Maya2022_Arnold-4.2.4.desktop
│   └── Nuke 13.0v4.desktop
└── mimeTypes
    ├── linkMimeTypes.sh
    ├── autodesk-maya.xml
    ├── foundry-nuke.xml
    ├── sdv-3dequalizer.xml
    ├── sidefx-houdini.xml
    └── nuke.run

先干活,有空继续。


mightyang
1 声望1 粉丝

引用和评论

1 篇内容引用
0 条评论