这次教程里还是用 nspawn
技术,但是我们选择不一样的系统. 这次我们选择 ArchLinux
来做
为什么选择 ArchLinux
呢,有如下原因.
同时因为有之前的文章,这里会说的比较简单
Deepin
以外移植 Deepin
包最完善的发行版并且还要把 QQ 替换为 NtrQQ
根据我的测试,如果没有足够新的 pacman
还是不要尝试用 pacstrap
了
这样子容易搞出一些 GPG 签名的问题
除了去 nspawn.org 寻找,我发现 ArchLinux 官方提供了一个精简的 bootstrap 系统
去镜像站逛一逛!
来到网易镜像站,打开下面的连接
https://mirrors.163.com/archlinux/iso/latest/
找到 archlinux-bootstrap-xxxx.xx.xx-x86_64.tar.gz
下载下来
解压之后这个就是我们需要的 rootfs 了
直接抄作业吧,保存到 /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
这里我做了以下操作,列一下,不展开说了
multilib
和 community
仓库yay
之后的我会用 yay
来替代 pacman
从容器里面退出来,以新添加的用户身份进去
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 无外乎给 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
对运行脚本我们也需要做一些修改
因为 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 删除。