From fda99331d7da27ff67fbbd0b7353a3223f3830db Mon Sep 17 00:00:00 2001 From: KZ25T Date: Sat, 21 Sep 2024 17:31:44 +0800 Subject: [PATCH] add new distro support --- README.md | 113 ++++++++++++++++++++++------------------------------- distros.md | 38 ++++++++++++++++++ src/AppRun | 67 +++++++++++++++++-------------- 3 files changed, 122 insertions(+), 96 deletions(-) create mode 100644 distros.md diff --git a/README.md b/README.md index 3f22b69..d95cc48 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,74 @@ # 微信 AppImage -使用 AppImage 运行 Linux 原生微信,使用方法非常简单。 +使用 AppImage 运行 Linux 原生微信,使用方法非常简单,支持多种操作系统。 -简单使用方法:从本仓库的 release 下载 `wechat-x86_64.3.AppImage`,下载目录打开终端运行 `chmod a+x wechat-x86_64.3.AppImage`,再运行 `./wechat-x86_64.3.AppImage` 即可。详细说明和使用方法请参见下文。 +[TOC] ---- +## 1 项目特色 -优点: - -- [x] **使用方便**,无需像 flatpak 等那样存在诸多配置问题。下载即可运行,删除即可卸载。 +- [x] **使用方便**,没有配置问题,下载即可运行,删除即可卸载。 - [x] **免权限**,从下载到运行,无需 sudo 权限。 - [x] **不修改系统**,无需修改系统配置文件(`/etc/lsb-release`等) - [x] **不乱放文件**,限制读写目录,以防在操作系统里到处乱放文件 - [x] **体积小**,最小只需 47MB,flatpak 等方案需要多达 GB 级别。 - [x] **适配多**,Debian/RHEL/Arch/Gentoo 等发行版均可使用。 -直接安装原版微信,不使用本 AppImage 的缺点: +其他安装方法的缺点: -- 😕 **使用麻烦**,需要安装 deb 包,无法直接卸载。 +- 😕 **使用麻烦**,原版需要安装 deb 包,无法直接卸载;flatpak 等方式配置复杂。 - 😕 **需要 root 权限**,需要 sudo 才能安装。 - 😕 **乱改系统**,原版微信有发行版检测,需要修改一些系统关键配置。 - 😕 **乱放文件**,家目录、`/var`目录都有放置。 - 😕 **体积大**,需要几百 MB 存储空间。 - 😕 **适配少**,只有 deb 包,没有 rpm/pkg 等安装包。 -适配操作系统(已测试): - -> 注:比较新发行版请使用 release 里的 libfuse3 版本,但也有可能只有 libfuse2 能运行。 -> 如果您自行打包,那么最新的 appimagetool 打包结果是 libfuse3 版本,比较老的是 libfuse2 版本。 - -- [x] **Debian** Debian 12 可直接运行。 -- [x] **Kali Linux** Kali Linux Rolling 可直接运行。 -- [x] **Ubuntu** 22.04、24.04 进行下面操作后可以运行。(建议先尝试能否直接运行,不能的再按照下面操作) - - 需要把下面内容写入 `/etc/apparmor.d/bwrap`: - - ```text - abi , - include - - profile bwrap /usr/bin/bwrap flags=(unconfined) { - userns, +## 2 发行版适配 - # Site-specific additions and overrides. See local/README for details. - include if exists - } - ``` +目前该项目已测试并支持 Debian/Arch/RHEL 系发行版。详细适配情况或其他操作见[适配目录](./distros.md)。 - 然后运行 `sudo systemctl reload apparmor` +## 3 快速开始 -- 😕 **Fedora** Fedora 40 暂不能运行。(敬请期待……作者本人只使用 Debian 系,RedHat 系的库有些奇怪,作者可能稍后补充) +本节仅针对 `x86_64` 架构,其他架构请自行打包。 -## 使用前提 +### 3.1 检查运行环境 -- 需要安装 bwrap(常见发行版都有) -- 需要有 XDG 用户目录(常见发行版都有) - - 查看 `~/.config/user-dirs.dirs`(必须有这个文件) - - 里面要有 `XDG_DESKTOP_DIR`、`XDG_DOWNLOAD_DIR` 和 `XDG_DOCUMENTS_DIR` - - 运行时,在用户目录下,微信只能读写: - - 这三个目录,也就是桌面、下载、文档(应该够用了,不够用的自己改源码) - - 微信数据库文件(放在 `${XDG_DOCUMENTS_DIR}/xwechat_files` 下,原生微信是 `~/xwechat_files`) - - 微信配置文件(`~/.xwechat`) - - 字体配置文件。 +1. 检查[适配目录](./distros.md),检查自己的发行版是否支持,或者是否需要额外的操作。未经测试的发行版可能需要自行修复一些问题。欢迎经过测试后向本仓库提起 issue,我将添加到适配目录。 +2. 操作系统需要有 bwrap 命令(常见发行版都有),若没有请参考[此网站](https://command-not-found.com/bwrap)。 +3. 检查操作系统是否有 XDG 用户目录(常见发行版都有): + - 查看 `~/.config/user-dirs.dirs`(必须有这个文件) + - 上述文件里面要有 `XDG_DESKTOP_DIR`、`XDG_DOWNLOAD_DIR` 和 `XDG_DOCUMENTS_DIR` + - 运行时,在用户目录下,微信只能读写: + - 这三个目录,也就是桌面、下载、文档(应该够用了,不够用的自己改源码) + - 微信数据库文件(放在 `${XDG_DOCUMENTS_DIR}/xwechat_files` 下,原生微信是 `~/xwechat_files`) + - 微信配置文件(`~/.xwechat`) + - 字体配置文件和(可能有的)显示配置文件。 -### 使用须知 +### 3.2 获取 AppImage 文件并运行 -- 目前根据最新版本来看,该微信**不支持**回复消息,期待当前微信进一步改进。 +1. 下载:打开[Releases](https://github.com/KZ25T/wechat-appimage/releases),依说明下载符合你的需求的最新版本的文件。若你不知道下载哪一个,请下载 `wechat-x86_64.AppImage` +2. 修改权限:找到该文件下载路径,添加可执行权限:`chmod a+x wechat-x86_64.AppImage` +3. 运行:从命令行运行 `./wechat-x86_64.AppImage`,或双击该文件运行。 -## 获取 AppImage 文件 +## 4 从本仓库构造 AppImage -### 从 release 下载 +如果需要修改 AppRun 里的内容,或者架构不符,你可以按照如下方法自行打包 AppImage 运行。 -在本仓库 release 下载 x86_64 版,两个 release 基于 238 和 241 版构建,建议使用新的 241 版。 +> 注:本说明暂未给 x86_64 以外的架构以完整支持。 -下载后记得给执行权限。 +### 4.1 下载原包 -### 自行构建 +1. 下载本仓库。 +2. 下载一个微信 Linux 版本的 deb 包,下载地址: -以下构建方式仅测试过 238 和 241 的 x86_64 版。 + - [吾爱破解](https://www.52pojie.cn/thread-1896902-1-1.html),或 + - [银河麒麟deb仓库](https://archive2.kylinos.cn/deb/kylin/production/PART-V10-SP1/custom/partner/V10-SP1/pool/all/),搜索 `wechat-beta` -下载本仓库,同时下载一个微信 Linux 版本的 deb 包,下载地址: +3. 下载“优麒麟微信”deb 包: -- [吾爱破解](https://www.52pojie.cn/thread-1896902-1-1.html),或 -- [银河麒麟deb仓库](https://archive2.kylinos.cn/deb/kylin/production/PART-V10-SP1/custom/partner/V10-SP1/pool/all/),搜索 `wechat-beta` + - [优麒麟微信](https://www.ubuntukylin.com/applications/106-cn.html) + - 这个包只需要提取 `libactivation.so` 备用。 -还需要下载“优麒麟微信”deb 包: - -- [优麒麟微信](https://www.ubuntukylin.com/applications/106-cn.html) - -在后者里提取 libactivation.so 备用。 +### 4.2 自行打包 解包第一个 deb,移植文件: @@ -109,17 +90,15 @@ appimagetool ./src 可以取得 `wechat-x86_64.AppImage` -## 运行方法 +### 4.3 其他架构的注意事项 -注:实际测试中有极少时候第一次扫码之后没反应,此时可以关闭重新启动扫码。 +其他架构可能需要修改 AppRun 的第 72 行。 -### 简单运行 +## 5 高级用法 -直接双击此文件或者命令行启动即可。 +### 5.1 安装运行 -### 安装运行 - -如果您计划长期使用本 AppImage,那么我推荐在这里安装运行。如果只是简单体验,那么选择上一条即可。 +如果您计划长期使用本 AppImage,那么我推荐在这里安装运行。 ```bash # 安装 @@ -140,7 +119,7 @@ sudo wechat --remove 如果想要在桌面上加上图标,只需要把第三个文件复制到桌面。 -### 更多功能 +### 5.2 更多功能 ```bash # 帮助 @@ -154,16 +133,16 @@ sudo wechat --remove # 安装图标、桌面文件、应用 sudo ./wechat-x86_64.AppImage --install # 卸载图标、桌面文件、应用 -sudo ./wechat-x86_64.AppImage --remove +sudo wechat --remove # 解包文件(这属于 appimage 的功能,参考 appimage 文档,其他 appimage 功能不再列出) ./wechat-x86_64.AppImage --appimage-extract ``` -## 声明 +## 6 声明 本仓库仅供学习交流使用,且未经过严格测试,使用本仓库造成的一切后果由使用者负责。 -## 参考 +## 7 参考 参考:[依云's Blog - 使用 bwrap 沙盒](https://blog.lilydjwg.me/2021/8/12/using-bwrap.215869.html) diff --git a/distros.md b/distros.md new file mode 100644 index 0000000..62bf440 --- /dev/null +++ b/distros.md @@ -0,0 +1,38 @@ +# 适配目录 + +目前已测试 Debian/Arch/RHEL 系发行版。 + +## Debian 系 + +- [x] **Debian** 12 可直接运行。 +- [x] **Kali Linux** 可直接运行。 +- [x] **Ubuntu** 24.04 按如下操作后可运行: + - 把下面内容写入 `/etc/apparmor.d/bwrap`: + + ```text + abi , + include + + profile bwrap /usr/bin/bwrap flags=(unconfined) { + userns, + + # Site-specific additions and overrides. See local/README for details. + include if exists + } + ``` + + - 然后运行 `sudo systemctl reload apparmor` 之后即可。 + - 注:Ubuntu 这个操作系统很奇怪,相比于标准 Debian,魔改的地方太多,不见得所有人都能按照以上方法运行好。如果不行请自己查询修改。 + +## Arch 系 + +- [x] **Arch Linux** 可直接运行。 + - 请检查是否有 `/usr/lib/libnss3.so`,否则 `sudo pacman -S nss` + - 请检查是否有基础 Qt 库:`/usr/lib/qt`,否则 `sudo pacman -S qt5-base` + - 因为 Arch Linux 比较灵活,所以是否还有其他默认不带的库我不太了解。如有遇到请自行修复。 +- [x] **Manjaro** 可直接运行。 + +## RHEL 系 + +- [x] **Fedora** 40 可直接运行。 +- [ ] **CentOS Stream** 过气发行版,还没给 livecd,没测 diff --git a/src/AppRun b/src/AppRun index 02e1740..ac819f0 100755 --- a/src/AppRun +++ b/src/AppRun @@ -1,6 +1,6 @@ #!/bin/bash -export PATH="$APPDIR/opt/wechat-beta:$PATH" -export LD_LIBRARY_PATH="$APPDIR/opt/wechat-beta:$APPDIR/usr/lib" +export PATH="/opt/wechat-beta:$PATH" +export LD_LIBRARY_PATH="/opt/wechat-beta:/usr/lib" export LANG=zh_CN.UTF-8 EXEC="wechat" if [ $# -eq 1 ]; then @@ -41,12 +41,8 @@ if [ $# -eq 1 ]; then fi # wechat-beta only support xcb BWRAP_ENV_APPEND="--setenv QT_QPA_PLATFORM xcb " -if [ -z ${QT_IM_MODULE} ]; then - BWRAP_ENV_APPEND="${BWRAP_ENV_APPEND} --setenv QT_IM_MODULE fcitx" -fi -if [ -z ${GTK_USE_PORTAL} ]; then - BWRAP_ENV_APPEND="${BWRAP_ENV_APPEND} --setenv GTK_USE_PORTAL 1" -fi +[ -z ${QT_IM_MODULE} ] && BWRAP_ENV_APPEND+="--setenv QT_IM_MODULE fcitx " +[ -z ${GTK_USE_PORTAL} ] && BWRAP_ENV_APPEND+="--setenv GTK_USE_PORTAL 1 " # append user config file BWRAP_FILE_APPEND="" if [ -e ~/.config/user-dirs.dirs ]; then @@ -63,40 +59,53 @@ else fi FONT1=$HOME/.cache/fontconfig FONT2=$HOME/.config/fontconfig -if [ -e ${FONT1} ]; then - BWRAP_FILE_APPEND+="--bind ${FONT1} ${FONT1} " -fi -if [ -e ${FONT2} ]; then - BWRAP_FILE_APPEND+="--bind ${FONT2} ${FONT2} " +XAUTH=$HOME/.Xauthority +[ -e ${FONT1} ] && BWRAP_FILE_APPEND+="--ro-bind ${FONT1} ${FONT1} " +[ -e ${FONT2} ] && BWRAP_FILE_APPEND+="--ro-bind ${FONT2} ${FONT2} " +# append runtime lib file +[ -e /etc/os-release ] && source /etc/os-release +LIBBIND="" +if [[ "$ID" == "debian" || "$ID_LIKE" == "debian" ]]; then + # this is debian derived. + LIBBIND="--tmpfs /usr/lib" + BWRAP_FILE_APPEND+="--ro-bind /usr/lib/locale /usr/lib/locale " + BWRAP_FILE_APPEND+="--ro-bind /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu " + BWRAP_FILE_APPEND+="--ro-bind /usr/lib/udev /usr/lib/udev " +elif [[ "$ID" == "fedora" || -e /usr/bin/rpm ]]; then + # this is RHEL derived. + LIBBIND="--tmpfs /usr/lib" + BWRAP_FILE_APPEND+="--ro-bind /usr/lib/locale /usr/lib/locale " + BWRAP_FILE_APPEND+="--ro-bind /usr/lib/udev /usr/lib/udev " + [ -e /usr/lib64/libbz2.so.1 ] && BWRAP_FILE_APPEND+="--ro-bind /usr/lib64/libbz2.so.1 /usr/lib/libbz2.so.1.0 " +else + echo "Not a Debian distribution." + LIBBIND="--bind /usr/lib /usr/lib" + [ -e ${XAUTH} ] && BWRAP_FILE_APPEND+="--ro-bind ${XAUTH} ${XAUTH} " fi +# append system config file +ETCFILES=(/etc/alternatives /etc/fonts /etc/hostname /etc/hosts /etc/ld.so.cache \ + /etc/localtime /etc/machine-id /etc/passwd /etc/resolv.conf) +for ETCFILE in "${ETCFILES[@]}"; do + [ -e ${ETCFILE} ] && BWRAP_FILE_APPEND+="--ro-bind ${ETCFILE} ${ETCFILE} " +done # append video devices -BWRAP_DEVICE_APPEND="--dev-bind /dev/snd /dev/snd" -for video_device in /dev/video*; do +BWRAP_DEVICE_APPEND="" +[ -e /dev/snd ] && BWRAP_DEVICE_APPEND="--dev-bind /dev/snd /dev/snd" +[ -e /dev/video0 ] && for video_device in /dev/video*; do BWRAP_DEVICE_APPEND+=" --dev-bind $video_device $video_device" done # run bubblewrap env mkdir -p $HOME/.xwechat -bwrap --die-with-parent \ +bwrap --die-with-parent \ --ro-bind / / \ --tmpfs /sys --tmpfs /home --tmpfs /etc --proc /proc \ - --tmpfs /run --tmpfs /usr/lib --tmpfs /tmp --dev /dev \ - --ro-bind $APPDIR $APPDIR \ + --tmpfs /run ${LIBBIND} --tmpfs /tmp --dev /dev \ + --ro-bind $APPDIR/opt /opt \ --ro-bind $APPDIR/etc/os-release /etc/os-release \ --ro-bind $APPDIR/etc/lsb-release /etc/lsb-release \ --ro-bind $APPDIR/etc/.kyact /etc/.kyact \ --ro-bind $APPDIR/etc/LICENSE /etc/LICENSE \ - --ro-bind /etc/alternatives /etc/alternatives \ - --ro-bind /etc/fonts /etc/fonts \ - --ro-bind /etc/hostname /etc/hostname \ - --ro-bind /etc/hosts /etc/hosts \ - --ro-bind /etc/ld.so.cache /etc/ld.so.cache \ - --ro-bind /etc/localtime /etc/localtime \ - --ro-bind /etc/passwd /etc/passwd \ - --ro-bind /etc/resolv.conf /etc/resolv.conf \ --ro-bind $APPDIR/usr/lib/libactivation.so /usr/lib/libactivation.so \ - --ro-bind /usr/lib/locale /usr/lib/locale \ - --ro-bind /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu \ - --ro-bind /usr/lib/udev /usr/lib/udev \ --ro-bind /run/user/$UID /run/user/$UID \ --bind $HOME/.xwechat $HOME/.xwechat \ ${BWRAP_FILE_APPEND} ${BWRAP_ENV_APPEND} ${BWRAP_DEVICE_APPEND} \