(水)wine移植程序的封包情况的讨论

Wine、Cedega、CrossOver 等配置
回复
tuu1
帖子: 47
注册时间: 2016-04-03 15:26
系统: ubuntu14.04

(水)wine移植程序的封包情况的讨论

#1

帖子 tuu1 » 2016-11-30 0:46

目前,大多数应用都有linux原生应用,而少数情况使用wine移植的软件。
由于wine本身并不提供打包的工具及标准,所以各个开发者对软件打包情况有所差异。

一、wine软件的封包方式大致分为三种:
1、crossover提供的封包
打包生成一个.cxarchive 文件;或者创建为模板,并打包为deb/rpm格式。
两种形式的内容基本相同,都是包含 $WINEPREFIX文件夹 和 cxbottle.conf cxmenu.conf 等文件。
安装过程为 前者直接将文件复制到~/.cxoffice/目录;
后者将文件安装到/opt/cxoffice/support/目录,根据配置文件cxbottle.conf 中定义的不同文件的策略,
将所有文件 有的复制、有的创建符号链接 到~/.cxoffice/下。

2、TeamViewer提供的封包
也可能是Google Picasa 3.0的封包。
直接将整个$WINEPREFIX 放在/opt/teamview/tv_bin/目录中。
第一次运行程序时,进行初始化,将所有文件创建符号链接到~/.local/teamviewer/下。

3、深度QQ2012提供的封包
后来龙井QQ2013SP5和7.8都使用这个方法。
把整个$WINEPREFIX文件夹压缩成.tar.gz 放在/opt/longene/qq/
第一次运行程序时,把文件解压到 ~/.longene/qq/

上面的三种情况大同小异。
tuu1
帖子: 47
注册时间: 2016-04-03 15:26
系统: ubuntu14.04

Re: (水)wine移植程序的封包情况的讨论

#2

帖子 tuu1 » 2016-11-30 0:58

二、安装过程中出现的问题:

1、用户文件夹丢失
由于不同Linux系统的用户名不同,直接复制$WINEPREFIX文件夹,会导致 c:\users\<name>\ 目录找不到。

一般wine虚拟的win32环境,用户文件夹 <name> 是 id -u 命令获取的值,而且用户文件夹分别链接到家目录 $HOME\的几个子目录。

代码: 全选

 c:\users\<name>\my document
 c:\users\<name>\my picture
 c:\users\<name>\my music 
 c:\users\<name>\desktop
一个不完美的解决方法,假设压缩包中的用户名是foo,
在解压完成后,执行

代码: 全选

cd $WINEPREFIX/drive_c/users
set USER=id -u
mv foo $USER
cd $USER
ln -s $HOME/文档 "my document"
ln -s $HOME/音乐 "my music"
ln -s $HOME/图片 "my picture"
ln -s $HOME/桌面 desktop
麻烦的是,有的系统家目录显示中文名,有的是英文名。

2、软件的配置信息丢失
如果注册表或者配置文件包含与路径有关的信息:
比如 QQ7.8 的用户配置文件保存 C:\Users\Public\Documents\Tencent\QQ\UserDataInfo.ini
如果找不到这个文件,在下次运行时,会进行初始化,并且把聊天信息保存到错误的地方。(坑爹)

配置文件的内容为

代码: 全选

[UserDataSet]
UserDataSavePathType=1
UserDataSavePath=C:\Users\foo\Documents\Tencent Files
为了解决这个问题,可以运行命令

代码: 全选

cd $WINEPREFIX/drive_c/users/Public/Documents/Tencent/QQ
set USER=id -u
echo "[UserDataSet]\nUserDataSavePathType=1" > UserDataInfo.ini
echo "UserDataSavePath=C:\\Users\\$USER\\Documents\\Tencent Files" > UserDataInfo.ini
3、快捷方式无法使用
由于 winemenubuilder 生成的启动器与原始路径有关。
解决方法:
在/opt/longe/qq目录放一个 sh 脚本,启动器指向这个脚本,而脚本采用变量来运行exe

4、使用符号链接的文件不能正常修改
直接向/opt/ 目录创建符号链接,会导致链接文件只读,无法修改。
目前 TeamViewer 采用全部 符号链接,家目录中占用空间不到1MB,实际文件放在/opt/teamviewer/目录。
而 TeamViewer 对软件本身做了特殊定制,并不需要对安装文件及目录进行写入操作。
而crossover 对需要修改的文件采用了复制的副本,其它不需要修改的采用符号链接。

5、占用了大量磁盘空间
龙井QQ除了/opt/目录的压缩包,还将其解压到 家目录。多用户将造成大量磁盘空间浪费。
如果采用部分符号链接,又很难区别哪些文件需要修改,干脆全部复制一遍。反正不缺那一点空间。
tuu1
帖子: 47
注册时间: 2016-04-03 15:26
系统: ubuntu14.04

Re: (水)wine移植程序的封包情况的讨论

#3

帖子 tuu1 » 2016-11-30 1:04

三、wine自带的功能【很重要】

1、重置wine环境
把$WINEPREFIX/drive_c/中的所有文件都删除,
然后执行 wine wineboot -u
发现所有wine内置的文件和目录都回来了,而且注册表中的修改还会保留。

不过自己手工创建和替换的文件没有了。

这个功能,可以解决[二-1]用户文件夹丢失 的问题。
此外,利用这个特性,可以在打包前精简掉许多没有用文件。

2、特殊的wine版本
crossover 内置的修改过的 wine ,
用户文件夹就是 C:\users\crossover\ 一直保持不变。
这个特殊版本的 wine ,不会出现 [二-1][二-2] 的问题。
上次由 tuu1 在 2016-11-30 19:46,总共编辑 2 次。
tuu1
帖子: 47
注册时间: 2016-04-03 15:26
系统: ubuntu14.04

Re: (水)wine移植程序的封包情况的讨论

#4

帖子 tuu1 » 2016-11-30 1:15

四、实例说明
1、制作 2345好压 的包
用wine运行好压exe,直到安装结束。
从~/.wine中复制对应文件到/opt/haozip/prefix目录
prefix/system.reg
prefix/user.reg
prefix/userdef.reg
prefix/drive_c/programe files/haozip/

在/opt/haozip目录创建start.sh 内容如下

代码: 全选

export WINEPREFIX=$HOME/.haozip
cp -r /opt/haozip/prefix $HOME/.haozip
wine wineboot -u
2、测试qq轻聊版7.3
以下是/opt/qqlight/目录的所有文件

代码: 全选

start.sh
programfqq 目录
commonfqq 目录
prefix/system.reg
prefix/user.reg
prefix/userdef.reg
prefix/drive_c/windwos/system32/drivers/qqprotect.sys
prefix/drive_c/windwos/system32/drivers/qqfrmmgr.sys
prefix/drive_c/windwos/system32/msvcr100.dll
prefix/drive_c/windwos/system32/msvcp100.dll
prefix/drive_c/windwos/system32/riched20.dll
start.sh的内容

代码: 全选

export WINEPREFIX=$HOME/.wineqq
cp -r /opt/qqlight/prefix $HOME/.wineqq
wine wineboot -u
ln -s /opt/qqlight/programfqq "$HOME/.wineqq/drive_c/programe files/Tencent"
ln -s /opt/qqlight/commonfqq "$HOME/.wineqq/drive_c/programe files/common files/Tencent"
注意:仅作为演示,QQ不能成功运行。
tuu1
帖子: 47
注册时间: 2016-04-03 15:26
系统: ubuntu14.04

Re: (水)wine移植程序的封包情况的讨论

#5

帖子 tuu1 » 2016-11-30 1:31

五、向包中集成wine
一个完整的32位的wine程序,大致有以下文件,约200MB

代码: 全选

bin/wine
bin/wineserver
bin/wine-preloader
lib/libwine.so.1
lib/wine/*.dll.so
lib/wine/fakedll/*.dll *.exe
share/wine/wine.inf
share/wine/fonts/*.ttf
直接依照上述列表,把所需要的文件复制到 /opt/longene/qq/wine-lib/ 目录。
并且在start.sh 中添加一句代码 export WINE=/opt/longene/qq/wine-lib/bin/wine
在 start.sh 下文的代码,使用 $WINE 代替 wine
这样打包的程序就会使用集成的wine,而不是系统中的wine程序。

由于 /opt/longene/qq/wine-lib/bin/wine 并没有在系统 $PATH 中,因此与系统安装的不会出现版本冲突。
多个程序可以各自可以带多个不同的wine,互不影响。
头像
lilydjwg
论坛版主
帖子: 4248
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: (水)wine移植程序的封包情况的讨论

#6

帖子 lilydjwg » 2016-11-30 10:39

麻烦的是,有的系统家目录显示中文名,有的是英文名。

代码: 全选

>>> xdg-user-dir DOCUMENTS
/home/lilydjwg/文档
头像
lilydjwg
论坛版主
帖子: 4248
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: (水)wine移植程序的封包情况的讨论

#7

帖子 lilydjwg » 2016-11-30 10:42

关于用户名:你可以在安装时「为系统中的每个用户安装」,然后打包时不带用户信息相关的目录。
关于写权限:如果软件不需要 Administrator 权限,那么可以假定 Administrator 才能写的目录为只读。
tuu1
帖子: 47
注册时间: 2016-04-03 15:26
系统: ubuntu14.04

Re: (水)wine移植程序的封包情况的讨论

#8

帖子 tuu1 » 2016-11-30 20:09

lilydjwg 写了: xdg-user-dir DOCUMENTS
这种方法确实不错,学习了。
以前进入 tty 后,总是不能进入家目录的下载目录。然后看网上帖子说修改 locale 为英文,重启后家目录的文件名自动更新为英文。
后来基本没有遇到相关的问题,也就没有注意到 xdg-user-dir 这个技巧了。
头像
lilydjwg
论坛版主
帖子: 4248
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: (水)wine移植程序的封包情况的讨论

#9

帖子 lilydjwg » 2016-11-30 20:19

tuu1 写了: 以前进入 tty 后,总是不能进入家目录的下载目录。然后看网上帖子说修改 locale 为英文,重启后家目录的文件名自动更新为英文。
你需要 cjktty + zsh~
tuu1
帖子: 47
注册时间: 2016-04-03 15:26
系统: ubuntu14.04

Re: (水)wine移植程序的封包情况的讨论

#10

帖子 tuu1 » 2016-11-30 20:32

lilydjwg 写了:在安装时「为系统中的每个用户安装」,然后打包时不带用户信息相关的目录。
这样处理有部分软件会出错。
比如,我移植的 AutoCAD 2007 ,安装完成后会把“用户界面配置”和“默认打印样式表”文件放在 \currentuser\AppData\Local\Autodesk\
这个目录在wine环境下与linux用户名有关。
然而移动这些文件的位置,并修改相应的注册表项,都导致AutoCAD界面的菜单栏找不到。研究很久到没有办法。

后来,学习了制作绿色软件的方法。
直接把需要放在\currentuser\AppData\Local\Autodesk\的文件暂时放在安装文件的目录,比如 \programe files\Autodesk\cala\
在安装文件目录创建一个批处理文件 ,inst.bat 内容

代码: 全选

regedit /s cad17.reg
reg add "HKCU\software\Autodesk\R17" /v "LocalRootFolder" /t REG_SZ "%APPDATA%\Autodesk\R17\"
copy /s %cd%\cala %APPDATA%\Autodesk
这个脚本是在 windows 环境下运行的,就不需要考虑[二-2]的问题了。

如果安装过程太复杂,可以使用 AutoIt3 等自动化处理程序替代批处理脚本。
头像
lilydjwg
论坛版主
帖子: 4248
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: (水)wine移植程序的封包情况的讨论

#11

帖子 lilydjwg » 2016-11-30 20:56

tuu1 写了:
lilydjwg 写了:在安装时「为系统中的每个用户安装」,然后打包时不带用户信息相关的目录。
这样处理有部分软件会出错。
比如,我移植的 AutoCAD 2007 ,安装完成后会把“用户界面配置”和“默认打印样式表”文件放在 \currentuser\AppData\Local\Autodesk\
这个目录在wine环境下与linux用户名有关。
然而移动这些文件的位置,并修改相应的注册表项,都导致AutoCAD界面的菜单栏找不到。研究很久到没有办法。

后来,学习了制作绿色软件的方法。
直接把需要放在\currentuser\AppData\Local\Autodesk\的文件暂时放在安装文件的目录,比如 \programe files\Autodesk\cala\
在安装文件目录创建一个批处理文件 ,inst.bat 内容

代码: 全选

regedit /s cad17.reg
reg add "HKCU\software\Autodesk\R17" /v "LocalRootFolder" /t REG_SZ "%APPDATA%\Autodesk\R17\"
copy /s %cd%\cala %APPDATA%\Autodesk
这个脚本是在 windows 环境下运行的,就不需要考虑[二-2]的问题了。

如果安装过程太复杂,可以使用 AutoIt3 等自动化处理程序替代批处理脚本。
这说明这部分软件对为所有用户安装的支持有问题吧。
tuu1
帖子: 47
注册时间: 2016-04-03 15:26
系统: ubuntu14.04

Re: (水)wine移植程序的封包情况的讨论

#12

帖子 tuu1 » 2016-11-30 21:26

lilydjwg 写了: 说明这部分软件对为所有用户安装的支持有问题吧。
在 windows 8 上安装过 AutoCAD 2007,切换用户后,首次运行会出现 msi 正在配置程序 的界面。
然后新用户的 %APPDATA% 目录也会产生一份文件,同时向注册表 HKCU\software\ 分支写入相应配置信息。
这种现象应该是“软件对为所有用户安装的支持有问题”。

补充一点:
在 windows 系统中,上述问题会自动调用备份的安装程序进行修复。
而wine 环境中,安装程序会运行出错,根本不能安装。
于是采用抓取注册表的方式,制作绿色软件,来移植。
tuu1
帖子: 47
注册时间: 2016-04-03 15:26
系统: ubuntu14.04

Re: (水)wine移植程序的封包情况的讨论

#13

帖子 tuu1 » 2016-11-30 21:31

wine 环境下实现“开机自启动项”

写一个简单的弹窗,采用静态链接,编译成test1.exe 。
并放到 ~/.wine/drive_c/windows/test1.exe

使用 wine regedit 编辑注册表
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"MyGod"="C:\\windows\test1.exe"

现在运行一下 wine wineboot -u
发现弹窗运行了。
test1.png
test1.png (1.96 KiB) 查看 4847 次
回复