前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nspawn 运行 QQ 第二弹 有 NtrQQ

nspawn 运行 QQ 第二弹 有 NtrQQ

原创
作者头像
MisakaCloud
修改2021-06-29 11:05:50
7190
修改2021-06-29 11:05:50
举报
文章被收录于专栏:emmmmemmmmemmmm

nspawn 运行 QQ 第二弹 有 NtrQQ

这次教程里还是用 nspawn 技术,但是我们选择不一样的系统. 这次我们选择 ArchLinux 来做

为什么选择 ArchLinux 呢,有如下原因.

同时因为有之前的文章,这里会说的比较简单

  • 包多,以后作为开发环境也爽
  • 是除了 Deepin 以外移植 Deepin 包最完善的发行版
  • 还是因为用的人挺多

并且还要把 QQ 替换为 NtrQQ

准备 ArchLinux rootfs

根据我的测试,如果没有足够新的 pacman 还是不要尝试用 pacstrap

这样子容易搞出一些 GPG 签名的问题

除了去 nspawn.org 寻找,我发现 ArchLinux 官方提供了一个精简的 bootstrap 系统

去镜像站逛一逛!

来到网易镜像站,打开下面的连接

https://mirrors.163.com/archlinux/iso/latest/

找到 archlinux-bootstrap-xxxx.xx.xx-x86_64.tar.gz 下载下来

解压之后这个就是我们需要的 rootfs 了

准备 nspawn 配置文件

直接抄作业吧,保存到 /etc/systemd/nspawn/archlinux.nspawn

[Exec]
Boot = true
PrivateUsers = no
[Files]
# Xorg
BindReadOnly = /tmp/.X11-unix
# GPU
Bind = /dev/dri
# NVIDIA 有显卡才写
Bind = /dev/nvidia0
Bind = /dev/nvidiactl
Bind = /dev/nvidia-modeset
Bind = /dev/nvidia-uvm
Bind = /dev/nvidia-uvm-tools
Bind = /dev/shm
# Controller
Bind=/dev/input
# PulseAudio
BindReadOnly=/run/user/1000/pulse
# AppIndicator
BindReadOnly=/run/user/1000/bus
# Home Dir
# 请在这里修改为具体的路径,这里不能识别变量
Bind = /home/$HOME
[Network]
VirtualEthernet = no
Private=no

rootfs 必须可以从 /var/lib/machines/archlinux 访问

所以具体用什么手段来实现我就不展开说了

安装必要的东西

首先启动容器

machinectl start archlinux

接着进入容器

machinectl shell archlinux

这里我做了以下操作,列一下,不展开说了

  • 设定镜像站
  • 进行系统升级
  • 开启 multilibcommunity 仓库
  • 添加 AURCN 源
  • 安装 yay
  • 添加用户
  • 设定无密码 sudo
  • 设定环境变量

之后的我会用 yay 来替代 pacman

安装并运行 QQ

从容器里面退出来,以新添加的用户身份进去

machinectl shell 你的用户名@archlinux

不打算安装 NtrQQ 的话,直接从仓库里安装 aur/deepin-wine-qq 就完事了

yay -S aur/deepin-wine-qq

运行也很简单

/opt/apps/com.qq.im.deepin/files/run.sh

原作者的仓库在 这里

至于什么替换成 DeepinWine 之类的看作者仓库的说明就好了

使用 NtrQQ

如果要使用 NtrQQ 就得自己去拉仓库然后自行构建

偷懒的可以直接用我的仓库,在 这里

我来说一下魔改的思路

PKGBUILD

NtrQQ 无外乎给 QQ 打个补丁进去,所以我们在准备阶段直接解压一份 NtrQQ 到目录里即可

来看看 PKGBUILD

我用注释标出需要注意的地方

build() {
  msg "Extracting DPKG package ..."
  mkdir -p "${srcdir}/dpkgdir"
  tar -xvf data.tar.xz -C "${srcdir}/dpkgdir"
  sed "s/\(Categories.*$\)/\1Network;/" -i "${srcdir}/dpkgdir/opt/apps/${debpkgname}/entries/applications/${debpkgname}.desktop"
  sed "s/run.sh\".*/run.sh\"/" -i "${srcdir}/dpkgdir/opt/apps/${debpkgname}/entries/applications/${debpkgname}.desktop"
  msg "Extracting Deepin Wine QQ archive ..."
  7z x -aoa "${srcdir}/dpkgdir/opt/apps/${debpkgname}/files/files.7z" -o"${srcdir}/deepinqqdir"
  msg "Cleaning up the original package directory ..."
  # 这里删掉了原来的 QQ 文件夹
  rm -r "${srcdir}/deepinqqdir/drive_c/Program Files/Tencent/QQ"
  #msg "Patching reg files ..."
  #patch -p1 -d "${srcdir}/deepinqqdir/" < "${srcdir}/reg.patch"
  msg "Creating font file link ..."
  ln -sf "/usr/share/fonts/wenquanyi/wqy-microhei/wqy-microhei.ttc" "${srcdir}/deepinqqdir/drive_c/windows/Fonts/wqy-microhei.ttc"
  msg "Copying latest QQ installer to ${srcdir}/deepinqqdir/drive_c/Program Files/Tencent/ ..."
  # 这里拷贝了一个安装包 需要删掉
  install -m644 "${srcdir}/${qq_installer}-${pkgver}.exe" "${srcdir}/deepinqqdir/drive_c/Program Files/Tencent/"
  #find -L "${srcdir}/deepinqqdir/dosdevices" -maxdepth 1 -type l -delete
  msg "Repackaging app archive ..."
  # 这里重新打包了整个 wine 文件系统
  7z a -t7z -r "${srcdir}/files.7z" "${srcdir}/deepinqqdir/*"
}

所以只要你往里面扔个打包好的 NtrQQ 就完事了

注意这里的 NtrQQ 必须内置 TXSSO

找一下 TXSSO 安装包,解压里面的 TXSSO 文件夹直接扔进 QQ/Bin 文件夹下面就可以了

这也是一种绿色的 TXSSO 部署方式,不需要给系统安装

NtrQQ 本身就是可以绿色运行的,所以拷贝安装包这一行也给他扬了

但是这样子你会发现启动 QQ 以后并没有让 NtrQQ 成功挂钩,并且运行一段时间以后 QQ 还是会弹出已损坏错误

这是因为 NtrQQ 的注入点 msimg32.dll 没有成功加载.

我也不知道为什么会这样子,但可以通过修改 Wine 配置来完成

只需要把 msimg32 设定为 原装先于内建 即可

虽然你可以选择每次运行前先跑一下 winecfg 来调整设置

但是直接给修改一下注册表来自带这个设置不好吗?

wine 的函数顶替配置在 user.reg[Software\\Wine\\DllOverrides] 部分

我们在最后加入一行

"msimg32"="native,builtin"

就可以让 wine 优先加载当前目录下面的 msimg32.dll

从而成功加载 NtrQQ

启动脚本 run.sh

对运行脚本我们也需要做一些修改

因为 NtrQQ 在 Wine 中可以不需要安装,总之就是非常的绿色和便携.

所以我们也要删掉 run.sh 里面运行安装包的一段

Run()
{
    extract_archive "$ARCHIVE_FILE_DIR/helper_archive.7z" "$ARCHIVE_FILE_DIR/helper_archive.md5sum" "$SPECIFY_SHELL_DIR"

    if [ -n "$PATCH_LOADER_ENV" ] && [ -n "$EXEC_PATH" ];then
        export $PATCH_LOADER_ENV
    fi

    if [ -n "$EXEC_PATH" ];then
        # 这里开始
        # if [ ! -f "$WINEPREFIX/reinstalled" ];then
        #     touch $WINEPREFIX/reinstalled
        #     env LC_ALL=zh_CN.UTF-8 WINEDLLOVERRIDES="winemenubuilder.exe=d" $START_SHELL_PATH $BOTTLENAME $APPVER "$QQ_INSTALLER_PATH" "$@"
        #     if [ $APPRUN_CMD = "deepin-wine5" ]; then
        #         echo "5" > $WINEPREFIX/deepin
        #     fi
        # else
            # 只需要保留这一段
            env LC_ALL=zh_CN.UTF-8 $START_SHELL_PATH $BOTTLENAME $APPVER "$EXEC_PATH" "$@"
        # fi
        # 到这里结束
    else
        env LC_ALL=zh_CN.UTF-8 $START_SHELL_PATH $BOTTLENAME $APPVER "uninstaller.exe" "$@"
    fi
}

改完 run.sh 需要重新计算 MD5 并且更新 PKGBUILD 里面的 md5sums

接下来还可以修改一下 PKGBUILD 里面的包名,我这里改为了 deepin-wine-ntrqq

之后,打包,芜湖,起飞!

因为 wine 目录里面有一些特殊文件,在 nspawn 里面会显示找不到这些文件

所以我的打包是在 Fedora 上,也就是主机系统里进行的

在下面的命令中忽略掉了依赖. 如果不需要忽略依赖可以选择第二条命令

makepkg --nodeps -f --cleanbuild
# 自动下载依赖
makepkg --syncdeps

安装打包出来的东西

# 文件名可能不同
yay -U deepin-wine-ntrqq-9.4.8.27843-1-x86_64.pkg.tar.gz

完事,可以直接运行了

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • nspawn 运行 QQ 第二弹 有 NtrQQ
    • 准备 ArchLinux rootfs
      • 准备 nspawn 配置文件
        • 安装必要的东西
          • 安装并运行 QQ
            • 使用 NtrQQ
              • PKGBUILD
              • 启动脚本 run.sh
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档