windows切linux过程

背景

公司的服务一直是在windows下运行的,本身服务并不复杂,windows性能和稳定性表现也是不错的,有的服务器也快4年没重启过了,运行的还是挺好的。

这次切linux版本,原因只要是

  1. 技术的沉淀。服务端从windows到linux转变也算是一种趋势。

  2. 使用一些开源库。比如服务的管理、编排、治理…… windows下毕竟小众。

  3. 提升下主机性能、稳定性(这个没什么说服力)。

总之,就是要换到linux。

方案一

之前的工作有过跨平台库的架构经验和开发经验,所以方案一无疑就是接口上的跨平台替换。主要是:

  1. 通讯库。 IOCP—>boost::asio

  2. 数据结构。 CString/CMap —> std::string/map

  3. 线程、锁。 _beginthreadex –> std::thread/std::mutex

  4. 线程的消息队列。 postthreadmessage–> 自定义消息队列

  5. ini 配置文件的接口。 GetPrivateProfileInt —>IniParser(开源库)

  6. 一些开源库。 如log4cpp、json、redis、rabbitmq、libcurl、protobuf、odbc…..本身就是跨平台的

  7. 公司原来的一些基础库

总之,难度不大,花点时间就行。

方案二

在替换的过程中,搜到了一个中间件(winehq),官网的说明是这样的:

Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,macOS 及 BSD 等)上运行 Windows 应用的兼容层。Wine 不是像虚拟机或者模拟器一样模仿内部的 Windows 逻辑,而是將 Windows API 调用翻译成为动态的 POSIX 调用,免除了性能和其他一些行为的内存占用,让你能够干净地集合 Windows 应用到你的桌面。

也就是说,wine中间件将windows的一些函数通过posix接口模式实现了,只要wine xxx.exe 就能执行windows的可执行程序。于是就尝试了下,把一些过程记录下。

  1. 在centos 上安装wine

    1
    2
    3
    4
    yum install epel-release
    yum install wine
    wine --version
    安装成功
  2. 制作成docker容器,700M好大,搜了官网资料没找到如何裁剪

  3. 将进程的依赖库,如mfc120.dll 复制到linux目录中(windows的库不需要复制,如kernel32.dll)

  4. 将xxx.exe 复制到linux目录

  5. 执行 wine xxx.exe

  6. 喔哦,服务正常运行

剩下的就是如何后台运行?

尝试使用nohup、disown命令,虽然可以在后台运行,但cpu却出奇的高(80%)。采用的方式就是使用screen

start.sh

1
2
3
4
5
6
7
#! /bin/bash
screen_name=$"hallsvr"
cmd=$"wine hallsvr.exe"
screen -X -S $screen_name quit
screen -dmS $screen_name
screen -x -S $screen_name -p 0 -X stuff "$cmd"
screen -x -S $screen_name -p 0 -X stuff $'\n'

stop.sh

1
2
3
4
#! /bin/bash
screen_name=$"hallsvr"
cmd=$"wine hallsvr.exe"
screen -X -S $screen_name quit

cpu 稳定在8%左右。

异常、调试:

使用MiniDumpWriteDump可以保持minidump,也可以使用windbg分析这个dmp文件,但却不能保存fulldemp;

调试可以使用winedbg。

稳定性、功能性测试还在继续中,但我其实已经不推荐这个方式了,wine更适合用在有gui界面的程序,服务还是原生跨平台的更好。

总结

方案一