windows 应用迁移指导文档

目录

前言

概述

本文档介绍了如何将windows应用迁移至openEuler服务器的相关内容,提供了三种不同的操作方式,通过手动模式和工具模式迁移。工具使得用户只需简单的适配和操作即可将应用迁移至openEuler,同时文档还提供迁移过程中一些常见问题的处理及解答。

读者对象

本文档主要适用于windows迁移的操作人员。操作人员必须具备以下经验和技能

  • 熟悉待迁移windows应用
  • 熟悉C#开发语言
  • 了解Linux操作系统
  • 有服务器维护操作经验

介绍

免责声明

  • 建议您在非生产环境使用本工具,避免影响生产业务运行。
  • 使用过程中涉及的非工具本身验证功能所用的用户名和密码,不作他用,且不会被保存在系统环境中。
  • 在您进行分析或操作前应当确认您为应用程序的所有者或已获得所有者的充足授权同意。
  • 分析结果中可能包含您所分析应用的内部信息和相关数据,请妥善管理。
  • 除非法律法规或双方合同另有规定,华为公司对分析结果不做任何明示或暗示的声明和保证,不对分析结果的适销性、满意度、非侵权性或特定用途适用性等作出任何保证或者承诺。
  • 您根据分析记录所采取的任何行为均应符合法律法规的要求,并由您自行承担风险。
  • 未经所有者授权,任何个人或组织均不得使用应用程序及相关分析记录从事任何活动。华为公司不对由此造成的一切后果负责,亦不承担任何法律责任。必要时,将追究其法律责任。

x2openEuler-client-win应用迁移工具简介

x2openEuler-client-win是一款Windows应用迁移工具套件,工具针对.Net Framework框架,将Web、windows服务场景应用迁移至国产化Linux操作系统上,可实现分钟级系统服务迁移。无需对应用重构,只需要简单适配,结合工具的自动化检查、部署功能,即可实现简单、快速、高效的应用迁移。

应用场景

  • Window应用范围:
    • ASP.NET框架的Web应用
    • Windows 服务
  • 目标操作系统:openEuler系
  • Windows应用迁移任务:当用户运行环境需要适配国产化替代时,可使用该工具将本地Windows应用迁移到新的目标操作系统

部署方式

  • 工具迁移
    • Web端工作模式:使用x2openEuler-WebServer工具作为服务端,通过浏览器访问控制台进行应用迁移
    • 命令行工作模式:将x2openEuler-client-win部署在用户的安装openEuler服务器上,通过命令行方式使用工具迁移
  • 手动迁移
    • 手动工作模式:不依赖工具,手动安装、配置方式进行应用迁移

迁移指南

windows完整迁移方案如图,将部署在windows服务器上的应用迁移至openEuler。文档提供三种迁移方式的操作步骤指导。

windows-migration

工具获取

windows应用迁移工具获取。进入网站,搜索相应的rpm软件包,如图

app-search

工具迁移

通过Web端工作模式迁移

  • 安装x2openEuler工具指南

前提条件
  • 已获取x2openEuler-core-x.x.x-xx.aarch64.rpm服务端工具安装包和x2openEuler-client-win-x.x.x-x.xaarch64.rpm客户端工具安装包。
  • 已安装远程SSH登录工具,如Xshell、MobaXterm、PuTTY等。
  • 已安装sftp工具。
  • 两台openEuler 20.03 (LTS-SP1)的aarch64环境可以通过网络访问本地配置的yum源。
  • 工具安装环境需开启工具端口。
x2openEuler安装指南
  • 此处以在aarch64环境上安装x2openEuler-core工具为例,使用sftp工具将安装包x2openEuler-core-x.x.x-xx.aarch64.rpm上传至远程服务器的/root目录下。
  • 使SSH远程登录工具登录至需要远程服务器命令行界面。
  • (可选)如果服务器OS防火墙已开启,执行如下操作开通服务器OS防火墙端口(如果服务器OS防火墙没有开启,请跳过此步骤)。

icon-note 说明:

以下命令中的18082端口是在启动web服务时默认的HTTPS端口号,请根据实际情况修改。若用户还配置了硬件防火墙,则需要用户联系相关的网络管理员同步完成对硬件防火墙的配置,开通需要访问的端口。

  1. 执行以下命令查看防火墙是否开启:
systemctl status firewalld

显示“inactive”表示防火墙没有开启,请跳过以下步骤。

  1. 执行以下命令查看端口是否开通:
firewall-cmd --query-port=18082/tcp

提示“no”表示端口未开通。

  1. 执行以下命令永久开通端口:
firewall-cmd --add-port=18082/tcp --permanent

提示“success”表示开通成功。

  1. 执行以下命令重新载入配置。
firewall-cmd --reload
  1. 再次执行以下命令查看端口是否开通:
firewall-cmd --query-port=18082/tcp

提示“yes”表示端口已开通。

icon-note说明: 如果想要移除端口,请执行以下命令:

firewall-cmd --permanent --remove-port=18082/tcp
firewall-cmd --reload
  • 执行以下命令安装x2openEuler工具。
yum install -y /root/x2openEuler-core-x.x.x-xx.aarch64.rpm
  • 工具包安装成功后,执行以下命令启动web服务。

icon-note说明:

  1. 如web服务受SELinux策略无法正常运行,请更改SELinux策略或关闭SELinux
  2. 如web服务需停止或重启请参考启动/停止/重启服务
  3. 首次启动服务时,需要配置MariaDB用户密码。密码需要满足如下复杂度要求:
    • 密码长度为8~32个字符
    • 必须包含大写字母、小写字母、数字、特殊字符(`~!@#$%^&*()-_=+|[{}];:'",<.>/?)中的两种及以上类型的组合
  4. 建议对数据库x2openEuler用户密码定期进行修改,确保业务安全运行。
  5. 如本地已存在MariaDB数据库,建议更新MariaDB到最新版本,并禁止远程访问数据库。
cd /usr/local/x2openEuler/portal/service
bash service_init.sh

根据回显交互信息提示完成服务启动配置。配置x2openEuler服务。

  1. 配置数据库用户x2openEulerDB密码。
  2. 配置是否启用SSH身份验证。
  3. 配置Web Server的IP地址。
  4. 配置HTTPS端口,默认端口为18082。
  5. 配置GUNICORN端口,默认端口为18080。
[root@localhost ~]# cd /usr/local/x2openEuler/portal/service
[root@localhost service]# bash service_init.sh
Start the MariaDB custom configuration for the use of the x2openEuler tool.
Has MariaDB been installed on the server and can be used properly? [Y/n] (default: n) n
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
MariaDB is active.

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

success
Enter the password of the root user of the MariaDB again:
Set the password of the x2openEuler user for MariaDB:
If the selected database already exists, it will be overwritten.
Use default x2openEulerDb database? [Y/n] (default: Y)
MariaDB is configured successfully.
If authentication is enabled,
the SSH connection fails after the fingerprint of the machine changes.
Please confirm whether public key authentication is not required for SSH connection(y/n default: n):
Start Nginx service and Gunicorn service
Ip address list:
sequence_number         ip_address              device
[1]                     x.x.x.x          eth0
Set the web server IP address 192.168.122.45
Set the HTTPS port 18082
Set the GUNICORN port 18080
To ensure successful running of the tool, enable the web service port and reload the configuration as follows:
   1.Enable the web service port: firewall-cmd --add-port=18082/tcp --permanent
   2.Reload the configuration: firewall-cmd --reload
   3.Check whether the port is enabled: firewall-cmd --query-port=18082/tcp
Port 18082 is enabled successfully.
The Nginx and Gunicorn ports are set up successfully.
Installing the django dependent environment.
The django dependency environment is installed successfully.
Generating the Django secret key.
Generate the Django secret key successfully.
Migrations for 'certificatemanager':
  /usr/local/x2openEuler/portal/src/certificatemanager/migrations/0001_initial.py
    - Create model CertificateInfo
    - Create model CertPathConfig
    - Create model ScheduleTask
Migrations for 'config':
  /usr/local/x2openEuler/portal/src/config/migrations/0001_initial.py
    - Create model RollbackFilterConfig
    - Create model UserConfig
Migrations for 'operationlogmanager':
  /usr/local/x2openEuler/portal/src/operationlogmanager/migrations/0001_initial.py
    - Create model OperationLog
Migrations for 'taskmanager':
  /usr/local/x2openEuler/portal/src/taskmanager/migrations/0001_initial.py
    - Create model Node
    - Create model Repo
    - Create model Report
    - Create model SoftwareAssessment
    - Create model Step
    - Create model Task
    - Create model SoftwareAssessmentReport
Migrations for 'usermanager':
  /usr/local/x2openEuler/portal/src/usermanager/migrations/0001_initial.py
    - Create model User
    - Create model FailedLogin
    - Create model LockedIp
    - Create model UserExtend
Migrations for 'weakpasswordmanager':
  /usr/local/x2openEuler/portal/src/weakpasswordmanager/migrations/0001_initial.py
    - Create model WeakPassword
Operations to perform:
  Apply all migrations: auth, certificatemanager, config, contenttypes, operationlogmanager, sessions, taskmanager, usermanager, weakpasswordmanager
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying certificatemanager.0001_initial... OK
  Applying config.0001_initial... OK
  Applying operationlogmanager.0001_initial... OK
  Applying sessions.0001_initial... OK
  Applying taskmanager.0001_initial... OK
  Applying usermanager.0001_initial... OK
  Applying weakpasswordmanager.0001_initial... OK
Installed 1 object(s) from 1 fixture(s)
Installed 1 object(s) from 1 fixture(s)
Installed 13 object(s) from 1 fixture(s)
Installed 52 object(s) from 1 fixture(s)
Installed 2 object(s) from 1 fixture(s)
Encrypting phase successfully.
It may take a few minutes to generate the certificate, please wait...
Certificate generated successfully. You can import the root certificate to the browser to mask security alarms when you access the tool. The root certificate is stored in /usr/local/x2openEuler/portal/thirdapp/nginx-install/webui/ca.crt.
Web console is now running, go to: https://x.x.x.x:18082/x2openEuler/#/login
  • 把x2openEuler-client-win-x.x.x-x.xaarch64.rpm上传到x2openEuler工具部署服务器的/etc/x2openEuler/rpms路径下,执行如下命令修改成x2openEuler属组
chown x2openEuler:x2openEuler /etc/x2openEuler/rpms/x2openEuler-client-win-*.rpm
登录x2openEuler工具迁移

  • 创建windows迁移任务

  • 添加节点

添加windows应用迁移到的服务器信息,并上传需要迁移的windows应用的zip或tar.gz格式压缩包

  • 待迁移服务器节点指纹验证

添加单个节点进行指纹验证为例,工具对导入的节点信息校验完成后,进入节点指纹验证页面,确认节点指纹无误后,单击“确定”。

fingerprints

节点添加完成,确认添加节点信息无误后,单击任务名称右侧“确定”,完成windows迁移任务创建。若需要修改或删除相应节点,单击右侧“操作”项下的“修改”或“删除”对节点进行操作。单击右下角“确认”启动windows迁移任务,单击右下角“取消”,取消windows迁移任务。

  • 环境检查

环境检查用于分析x2openEuler工具与待迁移节点的环境连通性,验证ssh和repo源是否处于可用状态,若环境检查无法通过,则需参考对应检查项操作建议修改节点配置信息。

  • 迁移前检查

迁移前检查用于分析待迁移的windows应用的(解决方案结构分析、拓展库兼容性分析、数据库配置信息、windows API信息)

  • 业务部署

工具使用mono、xsp、httpd或nginx自动把windows应用在服务器上部署

  • 启动服务

拉起httpd或者nginx服务,以便能启动访问windows迁移应用

  • 环境清理

环境清理节点上安装的x2openEuler-client-win-x.x.x-x.xaarch64.rpm的client包,清理环境后无法进行回退且该操作不可撤销。请谨慎操作!

通过命令行工作模式迁移

前置条件:
获取x2openEuler-client-win安装包
已安装远程工具,如Xshell、MobaXterm、PuTTy等。
已安装SFTP工具。
工具安装环境需开启工具端口

操作步骤

此处以在x86_64环境上安装x2openEuler-client-win为例,业务软件包使用"RightControl_Blog-master.zip"。

  • 步骤1 使用SFTP工具将x2openEuler-client-win安装包x2openEuler-client-win-x.x.x-x.x86_64.rpm上传至服务器的"/root"目录下。
  • 步骤2 使用SSH远程管理工具登录至服务器命令行界面。
  • 步骤3 执行以下命令安装x2openEuler-client-win工具。
dnf install x2openEuler-client-win-x.x.x-xxxxxxxx.x86_64.rpm

  • 步骤4 将需要迁移的应用软件包上传至待迁移节点目录"/opt"(目录可自定,当前仅支持上传tar.gz和zip类型的业务软件包)。

  • 步骤5 迁移前检查。对业务软件解压缩、架构分析、兼容性检查等

x2openEuler-client-win app-check -f /opt/RightControl_Blog-master.zip -d /opt/windows_migrate

参数说明:

参数 说明
-f 业务软件包
-d 业务部署路径

迁移前检查主要将业务包进行解压到部署路径下(确保路径下有足够空间,否则解压失败,默认部署路为"/opt/windows_migrate")并解析项目类型(当前仅支持ASP.NET类型的Windows项目),读取数据库配置信息并测试数据库连接是否正常。最后将项目信息检查结果将汇总为.json文件并保存至服务器上项目部署路径下。

json文件项目信息说明

项目信息 说明
check_result true:项目解压成功;false:项目解压失败。
solution_dir 包括项目名称、类型(当前仅支持ASP.NET)、发布类型(源码发布source_code、工程发布publish_pack)、项目部署路径。
packages .DLL动态链接文件库,辅助识别迁移后不兼容或缺失的三方库信息。
interface 项目依赖接口,提前识别业务迁移后缺失接口信息。
database_config 数据库连接配置信息。包括数据库名称、IP地址、端口等。
  • 步骤6 业务部署。对业务软件进行配置和部署,主要进行x2openEuler-client-win工具运行所需的依赖mono、xsp及httpd等的安装及对配置文件的配置。文档提供两种应用部署方式(httpd/nginx),在命令行中通过参数"-w"进行指定。

6.1 通过httpd方式部署服务

通过httpd方式部署服务,会将业务软件包的路径自动配置到"mod_mono.conf"配置文件,以便http启动后能够通过配置文件找到并拉起服务。业务部署命令行如下:

x2openEuler-client-win env-deploy -o RightControl_Blog-master -t asp.net -d /opt/windows_migrate -p 80 -w httpd

命令行参数信息说明

命令行参数 说明
-o Windows业务软件包。
-t 项目类型。当前仅支持asp.net类型的Windows项目迁移。
-d 项目部署路径。
-p 服务的侦听端口号。
-w 服务部署方式。(httpd/nginx,可选参数,不加默认为httpd)

6.2 通过nginx方式部署服务

除了上述通过httpd方式部署之外,当"-w"指定参数为"nginx"时则提供nginx部署方式。通过nginx方式部署则会修改"nginx.conf"配置文件,将服务通过nginx代理部署到服务器上。

x2openEuler-client-win env-deploy -o RightControl_Blog-master -t asp.net -d /opt/windows_migrate -p 80 -w nginx
  • 步骤7 服务启动。启动服务验证服务是否正常工作。由于部署方式的不同,启动方式也不一样。

7.1 以httpd方式部署,启动命令为:

systemctl start httpd

7.2,以nginx方式部署,启动命令为

systemctl start RightControl_Blog-master

"RightControl_Blog-master"为部署的服务

手动工作模式

该部分将介绍手动迁移windows应用操作流程,分别介绍httpd和nginx两种不同方式代理服务的方式

前置步骤

已获取mono、xsp、mod_mono rpm包并上传至服务器。rpm包获取

通过httpd方式代理服务:

步骤1 安装mono。mono是实现windows应用迁移的关键工具,其提供了一套完整的.NET框架实现,使得开发者可以在非Windows平台上使用C#和.NET框架进行开发

dnf install mono-6.12.0.199-2.x86_64.rpm

步骤2 安装xsp。xsp提供了一个测试版本的服务器。用于运行ASP.NET应用程序

dnf install xsp-4.7.1-0.x86_64.rpm

步骤3 下载安装httpd。httpd是Apache HTTP服务器的核心程序,主要用于提供Web服务。

dnf install httpd httpd-devel

步骤4 安装mod_mono

dnf install mod_mono-3.13-1.x86_64.rpm

mod_mono是一个Apache HTTP服务器的模块,它允许Apache服务器执行ASP.NET应用程序,这个模块使得Apache能够与Mono运行时环境进行交互,从而使得运行在Mono平台上的ASP.NET应用程序可以通过Apache服务器对外提供服务。

步骤5 配置Apache

  1. 打开配置文件"/etc/httpd/conf/httpd.conf"
vi /etc/httpd/conf/httpd.conf

2.在配置文件新增如下配置,确保服务能够找到mod_mono配置文件

Include /etc/httpd/conf.d/mod_mono.conf

  1. 打开配置文件"/etc/httpd/conf.d/mod_mono.conf"
vi /etc/httpd/conf.d/mod_mono.conf

在配置文件中增加以下配置信息

<IfModule mod_userdir.c>
    UserDir disabled
</IfModule>

MonoServerPath "/usr/bin/mod-mono-server4"

ForceType application/x-asp-net

DocumentRoot "/opt"
<Directory "/opt">
    Options Indexes FollowSymLinks
    AllowOverride None
    #Order allow,deny
    #Allow from all
    # 新版本需要这样设置
    Require all granted
</Directory>

ServerName 127.0.0.1
AddType application/x-asp-net .aspx .ashx .asmx .ascx .asax .config .ascx
DirectoryIndex index.aspx
DirectoryIndex Index.aspx
MonoSetEnv MONO_IOMAP=all
MonoApplications "/:/opt/Publish"

<Location “/opt”>
    #Allow from all
    Require all granted
    Order allow,deny
    SetHandler mono
    #SetOutputFilter DEFLATE
    #SetEnvIfNoCase Request_URI “\.(?:gif|jpe?g|png)$” no-gzip dont-vary
</Location>

# 两个<Location />配置节,让静态资源文件使用apache的默认handler处理
<Location ~ "^/(styles|scripts|images)/">
    SetHandler default-handler
</Location>
<Location ~ "^/[^/]+\.(txt|html|ico|js|css|jpg|jpeg|gif|png)">
    SetHandler default-handler
</Location>

其中需要将"MonoApplications"选项对应修改成服务器上业务存放路径,如上面配置表示Publish windows业务存放在路径"/opt"目录下面。

上述配置一些简单项说明:

“MonoServicePath” 设置Mono应用程序的根目录,Apache服务器将在这个目录及其子目录中查找ASP.NET应用程序;

"ServerName"指定服务名称;

“Location"用来指定一个特定的URL路径,以便Apache知道哪些请求应该被转发给Mono处理,上面例子中表示任何指向”/opt"的请求都会被mono处理。

步骤6 启动服务

systemctl start httpd

在浏览器输入服务器ip:80 验证服务是否成功,httpd默认服务端口号为80

除了上面通过httpd方式部署服务外,文档另外提供通过nginx方式手动部署服务。nginx代理方式也需要mono及xsp,其安装方式同上,此部分不再赘述。

通过nginx方式代理服务:

步骤1,下载nginx

dnf install nginx

步骤2 打开配置文件"/etc/nginx/nginx.conf"修改配置

vi /etc/nginx/nginx.conf

关键配置信息说明:

nginx配置项 说明
listen Nginx侦听的服务端口号,默认80。若修改为其他值,则在浏览器访问服务时需带上配置的端口号
root 请求寻址的根目录,也即业务的存放目录
fastcgi_pass 表示Nginx通过fastcgi_pass将用户请求的资源发给127.0.0.1:9000进行解析,由于Nginx和php脚本解析服务器是在同一台机器上,所以127.0.0.1:9000表示的就是本地的php脚本解析服务器。

步骤3 在文件"/etc/nginx/fastcgi_params"中增加配置信息

fastcgi_param  PATH_INFO          "";
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

步骤4 启动nginx

systemctl start nginx

步骤5 启动服务

fastcgi-mono-server4 /applications=/:/opt/WebApplication1 /socket=tcp:127.0.0.1:9000

在浏览器输入服务器ip和端口号验证服务是否成功,端口号为nginx.conf中配置的listen的值。

常用操作

关闭SELinux

windows应用迁移到openEuler上,如果服务器SELinux是开启状态,将访问不了服务,因此需要将SELinux安全模式关闭

- 临时关闭

1.查询SELinux状态

sestatus

“Current mode” 显示"enforcing"表示安全模式已开启
2.关闭SELinux

setenforce 0

再次查询SELinux状态,"Current mode"显示为"permissive"表示安全模式已临时关闭

须知:

设置临时关闭一旦服务器重启后失效,工具使用过程中可能会出现服务异常。

- 永久关闭
永久关闭需要修改安全模式的配置文件 “/etc/selinux/config”。

  1. 打开配置文件
vi /etc/selinux/config
  1. 按下键盘"i"键进入编辑模式,将"SELINUX=enforcing"改为"SELINUX=disabled"
    3.按"ESC",然后输入":wq",最后按"Enter"保存退出
    4.重启服务器配置生效
reboot

5.重启后查看SELinux状态验证配置是否生效,"SELinux status"显示SELinux表示已关闭。

防火墙关闭

服务器防火墙如果为开启状态,应用部署后将会访问失败,需要将防火墙关闭。

1.查看服务器状态

systemctl status firewalld

当"Active"选项显示"active(running)"表示防火墙为开启状态。

2.关闭防火墙

system stop firewalld

3.再次查看防火墙状态,“Active"项显示"inactive(dead)”,说明防火墙已关闭。

启动/停止/重启服务

httpd:

启动服务

systemctl start httpd

停止服务

systemctl stop httpd

重启服务

systemctl restart httpd

nginx:

启动服务

systemctl start 服务名

停止服务

system stop 服务名

重启服务

systemctl restart 服务名

相关路径说明

通过日志可以查看x2openEuler-client-win工具的运行情况及一些常见错误的定位。

表4.1 路径说明

路径 说明
/opt/windows_migration x2openEuler-client-win工具运行日志保存路径。
/opt/windows_packages 软件包存储路径(mono xsp等)。
/opt/windows_migration Windows应用解压后的存储路径。
/opt/x2openEuler-client-win/output 环境检查报告的输出的保存路径。

版本查看(CLI)

查看当前安装的x2openEuler工具的版本号信息

x2openEuler-client-win -v

说明:

"/usr/lib/x2openEuler-client-win"为工具安装源码目录

FAQ

1,若启动服务时出现报错信息如图

说明:该报错表示当业务启动出现异常情况时,是否将异常调用堆栈信息显示到页面

解决方法:可以修改业务配置Web.config文件,在标签"system.web"下增加配置信息"",mode设置为"Off"表面异常堆栈对打印至界面展示

2,x2openEuler-client-win工具安装依赖缺失

解决方法:安装对应缺失的依赖

dnf install -y efibootmgr

3,应用部署失败

该报错首先检查解压后的项目路径,解压出来的项目路径必须要到业务"Web.config"文件的前一层目录,如果目录嵌套多层,则部署后会找不到项目。

如根据上图的报错信息,首先进入到业务部署的目录"/root/WWH-test"下查看解压后的项目路径,进入后发现解压后的项目里面多嵌套了一层目录,导致部署时找不到项目信息。

解决方法:确保我们上传的压缩包在解压后没有嵌套目录,在解压后项目名称的下一层能够找到项目工程信息

4,静态资源加载失败

通过nginx代理方式部署windows应用,当应用中有静态资源(如静态图片等)时可能会导致迁移后静态资源找不到,如下图

出现静态资源找不到可能是nginx默认将"server_name"项配置为下划线,nginx寻找静态资源时会按照"server_name"去寻找,导致资源找不到。

解决方法:将nginx.conf配置文件中的"server_name"配置项注释掉,这样nginx则会按照代理的url去寻找静态资源。具体操作如下

4.1,通过nginx.conf配置找到已部署的服务

vi /etc/nginx/nginx.conf

4.2,查看已部署服务的配置文件,并将默认的"server_name"配置修改注释,保存重启服务解决

vi /opt/windows_migration/asp.net/web_conf/nginx-dhnw-19019.conf

4.3重启后查看静态资源已加载

static-result

5,linux文件大小写敏感问题

当应用迁移至openEuler启动后,如果业务代码中存在大小写问题,有可能会导致服务启动失败,此时可以查看报错信息,查看相关文件的路径信息并修改。

解决方法:根据报错提示,在linux环境上查看对应的文件路径信息是否存在大小写问题。并将路径修改为与业务代码里的实际路径一致。

updown-linux

对比上面两图可知,userControl文件夹路径在linux上首字母为小写,而业务代码中userControl为大写,由于linux大小写敏感,导致寻找文件资源报错。将linux上文件路径改为大写或者在业务代码对应位置将路径改为小写可解决。

6、页面乱码问题

如果业务迁移到openEuler后,页面中文字符可能会显示乱码,该问题可能是由于文件编码格式问题,linux上中文字符需要使用utf-8编码格式。

解决方法:将中文字符对应的前端页面文件的编码格式设置为utf-8。如图

编码格式修改后刷新页面。中文显示正常

相关链接

联系我们

示例:

迁移社区 SIG:迁移问题可在兼容性 SIG 提交相关问题。

openEuler 公众号:进入迁移专区,点击“加群”,进入技术交流群,可在群内直接提问,我们会有专人为您解答。

openEuler 小助手:备注“迁移”进入技术交流群,可在群内直接提问,我们会有专人为您解答。

openEuler公众号

openEuler小助手