极客油画

虽然linux桌面一言难尽,但是这不影响linux作为自己的主操作系统,
因为linux中运行windows或者mac的虚拟机性能损耗极低,但是windows或者mac中运行linux虚拟机性能损耗极大。

概念:

  • opengl/vulkan: 定义如何绘制三角形、纹理、光照等,但不关心图像如何显示到屏幕。
    • 开源实现: dioxus->wgpu->[vulkan/opengl前端,例如ash和glow和mesa3d前端api]->[vulkan/opengl后端,例如mesa3d后端api]->mesa3d驱动->gpu硬件
    • mesa3d驱动:硬件驱动模块(如 Intel i965、AMD RadeonSI)
    • mesa3d-api:OpenGL/Vulkan API 的底层实现,包括前端实现,和后端实现。
  • X11/Wayland: 决定窗口如何排列、输入如何传递,以及最终图像如何呈现给用户。
    • X11已进入维护状态,不再接受新功能,Wayland作为linux图形显示的未来已经不可逆转。
    • GNOME 50将在2026年3月完全移除X11代码。
    • cosmic桌面更彻底,完全基于Wayland开发,跨平台gui框架使用的是iced,不依赖gtk和qt这类c或c++写的gui框架。
    • X11采用客户端-服务器模型,应用程序(客户端)需通过X服务器中转图形渲染和输入事件,导致额外的通信开销。
    • Wayland采用的是本地高性能渲染,没有网络开销。

将im软件和会议软件分离是有意义的:

  • 开会的人是未知的,如果把im软件和会议软件合并在一起,会导致开个会还需要加个好友或者加入组织。
  • 会议软件支持屏幕远程控制功能是有意义,im软件支持屏幕远程控制是没有意义的。

gnome

gnome只支持linux操作系统,为何使用 gtk这种跨平台的gui库呢?直接调用wayland不是更好么

  1. gnome shell

GNOME 3 的插件(扩展)主要基于 JavaScript 和 GJS(GNOME JavaScript 引擎),通过修改 GNOME Shell 的运行时对象(如 MetaWindow、St 等)来实现功能。

GNOME 3 早期版本的官方扩展 API 功能有限,许多高级定制(如修改工作区行为、调整窗口动画)只能通过直接操作内部对象实现。

不通过插件API接口,而是通过对象的属性来编写的插件,导致只要 Gnome3 的核心代码一改变,或者属性链中的任一一个变量发生了变化,Gnome3插件就失效了。

  1. GNOME Display Manager

简称gdm,配置文件位置 /etc/gdm3/

当你启动一台安装了 GNOME的 Linux 电脑时,你看到的那个让你输入用户名和密码的界面,通常就是 GDM。

它负责启动 X Server 或 Wayland Compositor,验证用户身份,并加载该用户的桌面环境 GNOME。

  1. gnome-shell-extension-manager

安装命令: sudo apt install gnome-shell-extension-manager

之后就可以点击“扩展管理器”桌面图标,打开“扩展管理器”。

在它的“浏览”界面,可以搜索各种插件,并安装选中的插件。

必装插件:

  • kimpanel:提供更好的输入法状态显示
  1. gnome-remote-desktop

同时支持vnc和rdp协议,但是只能作为服务端,客户端的话需要使用如下技术:

  • vnc: 使用浏览器来访问
  • rdp: 使用freerdp命令行工具来访问。wfreerdp.exe /v:ip地址 /u:用户名/p:"密码" +dynamic-resolution | findstr "^"
    • /drive:是 FreeRDP 中用于设置本地文件夹重定向的参数,它允许你将本地文件夹映射为远程系统中的网络驱动器。
      # 将本地 /home/user/Documents 映射为远程驱动器的 "MyDocs"
      wfreerdp /drive:MyDocs,/home/user/Documents /v:server.example.com
      
      # 在 Windows 客户端上
      wfreerdp /drive:MyDocs,C:\Projects /v:server.example.com
      
      • 连接后,在远程系统中:
        • Windows:在"此电脑"中看到网络位置,如 \tsclient\MyDocs
        • Linux:通常挂载在 /mnt/tsclient/MyDocs或类似路径
    • windows: wfreerdp, linux-x11: xfreerdp, linux-wayland: wlfreerdp

输入法

  1. libinput,evdev,fcitx5,dbus 的关系
  • evdev是Linux内核的输入事件驱动,负责将物理设备的原始输入信号转换为标准事件流;

    • 位于/dev/input/event*设备节点
  • libinput是用户空间的输入处理库,对evdev事件进行高级处理(如手势识别、触摸板优化);

    • 在Wayland环境下,libinput直接与合成器交互;
    • 在X.Org环境下,通过xf86-input-libinput驱动与X服务器通信。
  • fcitx5是输入法框架,最终将经libinput处理后的输入事件转换为文字输出。

    • 支持多种输入法引擎(如拼音、五笔、Rime等),提供词库管理、云输入、智能联想等功能
    • fcitx5通过输入法模块(fcitx5-qt、fcitx5-gtk)与应用程序交互
  • DBus是通信桥梁:evdev、libinput、fcitx5都是独立组件,DBus使它们能在不同进程间协作

  • fcitx5 和 fcitx4 的区别:

    • fcitx4和fcitx5不能共存,需要先卸载fcitx4再安装fcitx5
    • fcitx5可模拟IBus框架,兼容性更强
    • fcitx5原生支持Wayland,fcitx4对Wayland的支持有限
    • fcitx5支持各种插件,fcitx4的插件比较有限
  1. gnome 50的默认输入法,如何从ibus改为fcitx5呢?
# 安装fcitx5框架、配置工具和中文输入法引擎
sudo apt install fcitx5 fcitx5-configtool fcitx5-chinese-addons libime-bin

# 安装前端界面支持(确保GTK/Qt程序正常使用)
sudo apt install fcitx5-frontend-gtk3 fcitx5-frontend-gtk4 fcitx5-frontend-qt5

# 添加fcitx5的环境变量
sudo cat >> /etc/environment << EOF
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
EOF

# 针对GNOME Wayland的额外配置(可选)
# 如何确认GNOME 46使用Wayland: echo $XDG_SESSION_TYPE
gsettings set org.gnome.settings-daemon.plugins.xsettings overrides "{'Gtk/IMModule':<'fcitx'>}"

修改系统默认输入法框架:

  • 方法1: 设置/系统/区域和语言/管理已安装的语言/在"键盘输入法系统"下拉菜单中,选择"fcitx5"
  • 方法2: im-config -n fcitx5

GNOME通常会自动启动Fcitx5,若未启动可手动添加:

  • 打开"启动应用程序"(gnome-session-properties)
  • 添加新条目:名称填"Fcitx5",命令填fcitx5 -d
  • 保存后重启验证

fcitx5的错误信息,可以使用fcitx5-diagnose命令查看

fcitx配置/附加组件/输入法/拼音

  • 管理词库/导入/来自搜狗细胞词库文件
  • 快速输入的触发键:设置为空

Flatpak/AppImage 桌面应用的打包和分发

yum使用python写的,dnf使用c++和python写的,apt使用c++写的,未来apt会使用rust重构。

fedora atomic desktop为何被诟病:安装命令行开发工具(如 gcc、nodejs)无法直接使用 dnf,官方推荐使用 toolbox(基于 Podman 的容器)或 rpm-ostree。前者需要进入容器环境操作,破坏了开发环境的统一感;后者需要重启系统才能生效,失去了命令行安装的即时性。

在ubuntu上,如何将snap改为flatpak:

  • 移除所有 Snap 包:
    • 多次执行:for p in $(snap list | awk '{if(NR>1) print $1}'); do sudo snap remove "$p"; done
    • 根据提示,先卸载被依赖的包,逐步卸载,最终实现snap list无任何包为止。
  • 卸载 snapd + 清理残留:
    sudo systemctl disable --now snapd
    sudo systemctl disable --now snapd.socket
    sudo apt autoremove --purge snapd -y
    rm -rf ~/snap
    sudo rm -rf /root/snap
    
  • 安装 Flatpak
    sudo apt install flatpak -y
    flatpak remote-add --if-not-exists flathub https://mirrors.ustc.edu.cn/flathub
    # 重启后生效
    
  • 安装Flatseal:flatpak install flathub com.github.tchx84.Flatseal
  • 安装chromium: flatpak install flathub org.chromium.Chromium
  • 防止 Snap 死灰复燃: Pin-Priority: -10 会让 APT 拒绝安装这些包
    • 封锁 snapd 包:
      sudo tee /etc/apt/preferences.d/no-snapd.pref << 'EOF'
      Package: snapd
      Pin: release a=*
      Pin-Priority: -10
      EOF
      
    • 封锁 Snap 版 Firefox:
      sudo tee /etc/apt/preferences.d/no-firefox-snap.pref << 'EOF'
      Package: firefox
      Pin: release a=*
      Pin-Priority: -10
      EOF
      

附录A 华为笔记本

  1. 如何解决没有声音的问题
# 解除耳机静音控制
amixer -c 0 set Headphone unmute

# 将音量设置为30%
amixer -c $CARD_NUMBER -M set Headphone 30%

或者,命令行执行alsamixer,在弹出的界面按F6,在弹出的界面选项中选择default:0 sof-hda-dsp,切到Headphone,然后按M键。

  1. 开机功能键

F2 BIOS/UEFI 设置

F12 启动菜单(Boot Menu)

Esc 总控菜单

附录B windows桌面

  1. 安装msys2

官网: https://www.msys2.org

github: https://github.com/msys2/msys2-installer

镜像地址: https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/x86_64/

安装位置: D:\software\msys64

在终端内启动msys2: D:\software\msys64\msys2_shell.cmd -ucrt64 -defterm -no-start -here

  1. 配置pacman镜像

pacman是arclinux中的软件管理工具,也是widows上msys2默认的软件管理工具。

镜像地址:https://mirrors.tuna.tsinghua.edu.cn/help/msys2/

启动msys2,并执行如下命令:

1
sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*

执行 pacman -Sy 刷新软件包数据

解决错误:clangarm64: 密钥 "5F944B027F7FE2091985AA2EFA11531AA0AA7F57" 未知问题:

1
2
3
4
# 编辑/etc/pacman.conf文件,设置这三个配置
SigLevel    = Never
LocalFileSigLevel = Optional
RemoteFileSigLevel = Never
  1. pacman常用命令

pacman -Sy: 从服务器下载新的软件包数据库(实际上就是下载远程仓库最新软件列表到本地)。

pacman -Syu: 升级系统及所有已经安装的软件。

pacman -S 软件名: 安装软件。也可以同时安装多个包,只需以空格分隔包名即可。

pacman -Rs 软件名: 删除软件,同时删除本机上只有该软件依赖的软件。

pacman -Ru 软件名: 删除软件,同时删除不再被任何软件所需要的依赖。

pacman -Ssq 关键字: 在仓库中搜索含关键字的软件包,并用简洁方式显示。

pacman -Qs 关键字: 搜索已安装的软件包。

pacman -Qi 软件名: 查看某个软件包信息,显示软件简介,构架,依赖,大小等详细信息。

pacman -Sg: 列出软件仓库上所有的软件包组。

pacman -Sg 软件包组: 查看某软件包组所包含的所有软件包。

pacman -Sc:清理未安装的包文件,包文件位于 /var/cache/pacman/pkg/ 目录。

pacman -Scc:清理所有的缓存文件

  1. msys2中mingw64,ucrt64,clang64的区别

    • https://www.msys2.org/docs/environments/
    • mingw64、ucrt64、clang64都是windows原生程序(不依赖cygwin.dll),不过mingw64是很早就有的,后两者是2021年6月之后才新加的,现在msys2官方推荐优先选择ucrt64。
    • 这三者的区别是:mingw64 与 ucrt64 都是用 gcc 编译器编译的 Windows 64 位程序,只不过它们链接到的 crt(C runtime)不同, mingw64 是链接到了 msvcrt ,而 ucrt64 则是链接到了 Windows 上新的 ucrt 上。
    • 而 clang64 很好理解,就是用 clang 而非 gcc 来编译各种库。另外它也是链接到了 ucrt 而非 msvcrt。
    • 三者的共同点是,它们都需要 mingw-w64 环境来进行编译。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      
      $ ldd /ucrt64/bin/zstd
      ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffb256b0000)
      KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffb24cc0000)
      KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffb22e80000)
      ucrtbase.dll => /c/WINDOWS/System32/ucrtbase.dll (0x7ffb232e0000)
      
      $ ldd /mingw64/bin/zstd
      ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffb256b0000)
      KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffb24cc0000)
      KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffb22e80000)
      msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffb23e9000)
      
      $ ldd /clang64/bin/zstd
      ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffb256b0000)
      KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffb24cc0000)
      KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffb22e80000)
      apphelp.dll => /c/WINDOWS/System32/apphelp.dll (0x7ffb1ff00000)
      ucrtbase.dll => /c/WINDOWS/System32/ucrtbase.dll (0x7ffb232e0000)
      
      # /usr/bin/zstd就是依赖cygwin的非原生程序,这里的msys-2.0.dll实际上就是msys2版的cygwin.dll
      $ ldd /usr/bin/zstd
      ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffb256b0000)
      KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffb24cc0000)
      KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffb22e80000)
      msys-2.0.dll => /usr/bin/msys-2.0.dll (0x180040000)
      
  2. Cygwin和MinGW的区别

    • 从目标上说
      • MinGW 是让Windows 用户可以用上GNU 工具,比如GCC。
      • Cygwin 提供完整的类Unix 环境,Windows 用户不仅可以使用GNU 工具,理论上Linux 上的程序只要用Cygwin 重新编译,就可以在Windows 上运行。
    • 从能力上说
      • 如果程序只用到C/C++ 标准库,可以用MinGW 或Cygwin 编译。
      • 如果程序还用到了POSIX API,则只能用Cygwin 编译。
    • 从依赖上说
      • 程序经MinGW 编译后可以直接在Windows 上面运行。
      • 程序经Cygwin 编译后运行,需要依赖安装时附带的cygwin.dll。
    • 注意,mingw已经过时,现在都用mingw-w64,而mingw64 = gcc + mingw-w64
  3. MSYS 和 MSYS2 的区别

    • MSYS fork Cygwin(较旧版),且万年不更新。
    • MSYS2 fork Cygwin(较新版),使用了pacman包管理工具,且项目开发活跃。

附录C 安卓的HAL层 和 鸿蒙的HDF层

安卓的硬件抽象层(HAL)是连接 Android 操作系统与底层硬件设备的核心桥梁。它的主要意义在于屏蔽不同硬件的具体实现细节,为上层框架和应用提供统一、稳定的硬件访问接口

因为 Android 通过将硬件支持的复杂性从内核空间转移到用户空间的 HAL,所以,安卓的内核是linux,是宏内核,但是其驱动接口依然稳定。

Android HAL 并非一成不变,其主要经历了三个阶段:

  • 传统 HAL(Android 8.0 之前):以 .so动态库形式存在,通过 hw_get_module()加载
  • HIDL(Android 8.0 及以后):引入 HAL 接口定义语言(HIDL),支持 Binder IPC 进程间通信,HAL 可运行于独立进程,进一步增强了稳定性和安全性
  • AIDL HAL(Android 11 及以后):逐步采用 AIDL(Android Interface Definition Language)来定义接口,旨在简化开发流程

微内核将系统核心功能(如文件系统、设备驱动、网络协议栈等)作为独立的服务运行在用户态,与最核心的内隔离开,安卓的HAL实际上借鉴了微内核的思想,但是又保留了宏内核的性能优势。

OpenHarmony 的 HDF(Hardware Driver Foundation)驱动框架的目标是让驱动开发者能专注于硬件操作本身,而不必过多纠结于驱动与系统其他模块的交互。它通过几种核心设计来实现这一点:

  • 驱动模型抽象与组件化:HDF 为常见类型的设备(如 Audio、Camera、Sensor 等)提供了标准化的驱动模型。开发者更多地是进行“适配”而非“从零创造”,这提升了开发效率,也使得驱动更容易在不同硬件平台间迁移。
  • 配置与代码分离:驱动通过 .hcs(HDF Configuration Source) 配置文件来定义硬件资源、设备属性、加载策略等。
  • 统一的驱动接口(HDI):HDF 通过 Hardware Driver Interface (HDI)​ 为上层系统服务提供标准化的硬件操作接口。
  • 灵活的加载与部署:HDF 支持驱动按需动态加载和静态加载,并允许驱动根据需要部署在内核态 (KHDF) 或用户态 (UHDF)。用户态部署可以增强系统稳定性(驱动崩溃不会导致内核恐慌),而内核态部署则利于追求极致性能。

本文发表于 0001-01-01,最后修改于 0001-01-01。

本站永久域名「 jiavvc.top 」,也可搜索「 极客油画 」找到我。


上一篇 « 下一篇 »

赞赏支持

请我吃鸡腿 =^_^=

i ysf

云闪付

i wechat

微信

推荐阅读

Big Image