Windows Server 到 AlmaLinux 10 迁移指南
本指南详细介绍如何从 Windows Server 迁移到 AlmaLinux 10,包括评估、规划、实施和验证的完整流程。
迁移概述
迁移特点
yaml
迁移类型: 跨平台迁移 (Windows -> Linux)
复杂度级别: 高
预计时间: 3-12个月
主要挑战:
- 应用架构差异
- 技能转换
- 数据格式兼容
- 管理模式变化
成功关键:
- 详细的现状评估
- 充分的测试验证
- 分阶段实施
- 人员培训
第一阶段:现状评估
1.1 系统清单和服务评估
Windows 服务清单
powershell
# 收集系统信息
Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, TotalPhysicalMemory, CsProcessors
# 列出已安装的角色和功能
Get-WindowsFeature | Where-Object InstallState -eq Installed | Format-Table Name, DisplayName
# 检查运行的服务
Get-Service | Where-Object Status -eq Running | Format-Table Name, DisplayName, Status
# 列出已安装的软件
Get-WmiObject -Class Win32_Product | Select-Object Name, Version, Vendor | Export-Csv software_inventory.csv
# 网络配置
Get-NetIPConfiguration | Format-Table InterfaceAlias, IPv4Address, IPv4DefaultGateway
应用程序评估清单
yaml
Web 应用程序:
- IIS 网站数量: 记录每个网站配置
- ASP.NET 版本: Framework 2.0-4.8 或 .NET Core
- 自定义模块: ISAPI 筛选器, HTTP 模块
- SSL 证书: 记录证书和绑定
数据库:
- SQL Server 实例: 版本和数据库数量
- MySQL/PostgreSQL: 是否有其他数据库
- 数据大小: 估算迁移数据量
- 备份策略: 现有备份和恢复流程
文件服务:
- 共享文件夹: 路径、权限、大小
- DFS 配置: 分布式文件系统
- 备份配置: 文件备份策略
其他服务:
- DNS 服务: 区域和记录
- DHCP 服务: 作用域配置
- 打印服务: 打印机和驱动
- 终端服务: RDS 配置
1.2 依赖关系分析
应用依赖映射
powershell
# 分析 .NET 应用依赖
# 使用工具如 .NET Portability Analyzer
Install-PackageProvider -Name NuGet -Force
Install-Module -Name Microsoft.DotNet.ApiPortability -Force
# 检查应用程序池配置
Import-Module WebAdministration
Get-IISAppPool | Format-Table Name, State, ManagedRuntimeVersion, Enable32BitAppOnWin64
# 检查网站配置
Get-IISSite | Format-Table Name, State, PhysicalPath, Bindings
1.3 迁移可行性评估
技术可行性矩阵
服务类型 | 迁移难度 | AlmaLinux 等价方案 | 注意事项 |
---|---|---|---|
IIS + ASP.NET Core | 低 | Nginx/Apache + .NET | 直接支持 |
IIS + ASP.NET Framework | 高 | 需要重构或替换 | 无直接迁移路径 |
SQL Server | 中 | MySQL/PostgreSQL | 需要数据迁移 |
文件共享 | 低 | Samba | 配置转换 |
AD 域控制器 | 高 | Samba4/FreeIPA | 复杂配置 |
Exchange Server | 高 | 邮件服务器替换 | 重大架构变更 |
第二阶段:迁移规划
2.1 目标架构设计
AlmaLinux 服务对应关系
yaml
Web 服务器:
Windows: IIS + ASP.NET
AlmaLinux: Nginx/Apache + PHP/Python/Node.js/.NET Core
数据库服务器:
Windows: SQL Server
AlmaLinux: MySQL 8.0/PostgreSQL 14
文件服务器:
Windows: Windows File Sharing
AlmaLinux: Samba 4.x
代理/负载均衡:
Windows: IIS ARR
AlmaLinux: Nginx/HAProxy
监控服务:
Windows: Performance Monitor
AlmaLinux: Prometheus + Grafana
备份服务:
Windows: Windows Server Backup
AlmaLinux: Rsync/Bacula/Amanda
2.2 分阶段迁移计划
第一阶段:非关键服务
timeline
周 1-2: 开发测试环境
- 安装 AlmaLinux 10 测试环境
- 基础服务配置 (Web, 数据库)
- 应用程序概念验证
周 3-4: 文件服务迁移
- 配置 Samba 文件服务器
- 测试文件共享访问
- 权限和安全配置
周 5-6: Web 服务迁移
- 配置 Nginx/Apache
- 迁移静态网站
- 配置 SSL 证书
第二阶段:数据库迁移
timeline
周 7-9: 数据库评估和迁移
- SQL Server 到 MySQL/PostgreSQL 迁移
- 数据同步和验证
- 应用连接字符串更新
周 10-11: 应用程序迁移
- .NET Core 应用部署
- 应用配置和优化
- 性能测试和调优
第三阶段:生产切换
timeline
周 12-14: 生产环境准备
- 生产环境部署
- 数据最终同步
- 切换计划执行
周 15-16: 稳定和优化
- 系统监控和调优
- 问题解决和优化
- 文档整理
第三阶段:实施迁移
3.1 AlmaLinux 10 基础环境部署
系统安装和初始配置
bash
# 1. 最小化安装 AlmaLinux 10
# 使用 UEFI 引导,选择服务器安装模式
# 2. 基础系统配置
hostnamectl set-hostname server.company.com
timedatectl set-timezone Asia/Shanghai
# 3. 网络配置
nmcli con mod "System eth0" ipv4.addresses 192.168.1.100/24
nmcli con mod "System eth0" ipv4.gateway 192.168.1.1
nmcli con mod "System eth0" ipv4.dns 8.8.8.8,8.8.4.4
nmcli con mod "System eth0" ipv4.method manual
nmcli con up "System eth0"
# 4. 系统更新
dnf update -y
# 5. 安装基础工具
dnf install -y vim wget curl git htop lsof
防火墙和安全配置
bash
# 配置防火墙
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
# SELinux 配置
setenforce 1
setsebool -P httpd_can_network_connect 1
# SSH 安全配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cat >> /etc/ssh/sshd_config << 'EOF'
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
EOF
systemctl restart sshd
3.2 Web 服务器迁移
安装和配置 Nginx
bash
# 安装 Nginx
dnf install -y nginx
# 基础配置
cat > /etc/nginx/nginx.conf << 'EOF'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
EOF
# 创建虚拟主机配置
cat > /etc/nginx/conf.d/default.conf << 'EOF'
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
index index.html index.htm index.php;
# PHP 支持
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
EOF
# 启动服务
systemctl enable --now nginx
安装 PHP (如果需要)
bash
# 安装 PHP-FPM
dnf install -y php php-fpm php-mysql php-xml php-mbstring php-json
# 配置 PHP-FPM
sed -i 's/user = apache/user = nginx/' /etc/php-fpm.d/www.conf
sed -i 's/group = apache/group = nginx/' /etc/php-fpm.d/www.conf
# 启动 PHP-FPM
systemctl enable --now php-fpm
3.3 数据库迁移
从 SQL Server 迁移到 MySQL
安装 MySQL 8.0
bash
# 安装 MySQL
dnf install -y mysql-server
# 启动和配置
systemctl enable --now mysqld
# 安全配置
mysql_secure_installation
数据迁移脚本
bash
# 1. 在 Windows Server 上导出数据
# 使用 sqlcmd 或 SQL Server Management Studio
sqlcmd -S localhost -E -Q "SELECT * FROM database_name.table_name" -o "table_data.csv" -h-1 -s"," -w 700
# 2. 架构迁移
# 创建对应的 MySQL 数据库结构
mysql -u root -p << 'EOF'
CREATE DATABASE migrated_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE migrated_db;
-- 根据 SQL Server 表结构创建 MySQL 表
-- 注意数据类型转换:
-- NVARCHAR -> VARCHAR
-- DATETIME2 -> DATETIME
-- UNIQUEIDENTIFIER -> CHAR(36)
CREATE TABLE example_table (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
created_date DATETIME DEFAULT CURRENT_TIMESTAMP,
description TEXT
);
EOF
# 3. 数据导入
mysql -u root -p migrated_db < migrated_data.sql
数据类型转换参考
sql
-- SQL Server -> MySQL 数据类型对应
-- INT -> INT
-- BIGINT -> BIGINT
-- NVARCHAR(MAX) -> TEXT
-- NVARCHAR(n) -> VARCHAR(n)
-- DATETIME2 -> DATETIME
-- BIT -> TINYINT(1)
-- UNIQUEIDENTIFIER -> CHAR(36)
-- MONEY -> DECIMAL(19,4)
-- NTEXT -> TEXT
-- IMAGE -> LONGBLOB
3.4 文件服务迁移
配置 Samba 文件共享
bash
# 安装 Samba
dnf install -y samba samba-client
# 配置 Samba
cat > /etc/samba/smb.conf << 'EOF'
[global]
workgroup = WORKGROUP
server string = AlmaLinux File Server
security = user
map to guest = bad user
dns proxy = no
# 共享目录配置
[shared]
path = /srv/samba/shared
browsable = yes
writable = yes
guest ok = no
valid users = @users
create mask = 0755
directory mask = 0755
[public]
path = /srv/samba/public
browsable = yes
writable = yes
guest ok = yes
read only = no
force user = nobody
EOF
# 创建共享目录
mkdir -p /srv/samba/shared /srv/samba/public
chown -R nobody:nobody /srv/samba/public
chmod -R 0755 /srv/samba/public
# 添加 Samba 用户
useradd -M -s /sbin/nologin sambauser
smbpasswd -a sambauser
# 启动服务
systemctl enable --now smb nmb
firewall-cmd --permanent --add-service=samba
firewall-cmd --reload
数据迁移脚本
bash
# 从 Windows 文件服务器同步数据
# 在 Windows 端运行 robocopy
robocopy "C:\SharedFolder" "\\almalinux-server\shared" /E /COPY:DATSO /R:3 /W:10 /LOG:migration.log
# 或者使用 rsync (如果已安装 WSL)
rsync -avz --progress /mnt/c/SharedFolder/ user@almalinux-server:/srv/samba/shared/
3.5 .NET 应用迁移
安装 .NET Runtime
bash
# 添加 Microsoft 仓库
rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm
# 安装 .NET 8.0 运行时
dnf install -y dotnet-runtime-8.0 dotnet-sdk-8.0
# 验证安装
dotnet --version
部署 .NET Core 应用
bash
# 创建应用目录
mkdir -p /var/www/dotnetapp
cd /var/www/dotnetapp
# 从 Windows 复制应用文件
# (假设已经转换为 .NET Core)
scp -r admin@windows-server:/path/to/app/* .
# 配置应用设置
cat > appsettings.Production.json << 'EOF'
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=AppDb;Uid=appuser;Pwd=password;"
},
"Logging": {
"LogLevel": {
"Default": "Information"
}
}
}
EOF
# 创建 systemd 服务
cat > /etc/systemd/system/dotnetapp.service << 'EOF'
[Unit]
Description=.NET Core App
After=network.target
[Service]
Type=notify
WorkingDirectory=/var/www/dotnetapp
ExecStart=/usr/bin/dotnet /var/www/dotnetapp/App.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnetapp
User=www-data
Environment=DOTNET_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
systemctl enable --now dotnetapp
systemctl status dotnetapp
第四阶段:验证和测试
4.1 功能验证清单
Web 服务验证
bash
# 测试 Web 服务器响应
curl -I http://localhost
curl -I https://localhost
# 测试 PHP 功能 (如果适用)
echo "<?php phpinfo(); ?>" > /var/www/html/info.php
curl http://localhost/info.php | grep "PHP Version"
# 测试 .NET 应用
curl http://localhost:5000/health
数据库验证
sql
-- 验证数据完整性
SELECT COUNT(*) FROM migrated_table;
SELECT COUNT(*) FROM original_table; -- 在 Windows 上比较
-- 验证数据样本
SELECT TOP 10 * FROM migrated_table ORDER BY id;
-- 性能测试
EXPLAIN SELECT * FROM migrated_table WHERE indexed_column = 'value';
文件服务验证
bash
# 从 Windows 客户端测试访问
# 在 Windows CMD 中运行:
net use Z: \\almalinux-server\shared /user:sambauser
# 测试文件读写
echo "test content" > test.txt
copy test.txt Z:\
dir Z:\
4.2 性能基准测试
Web 服务器性能测试
bash
# 安装压力测试工具
dnf install -y httpd-tools
# 性能测试
ab -n 1000 -c 10 http://localhost/
ab -n 1000 -c 10 http://localhost/index.php
# 比较 Windows IIS 的性能基准
# 记录响应时间、吞吐量等指标
数据库性能测试
bash
# 安装 sysbench
dnf install -y sysbench
# MySQL 性能测试
sysbench --db-driver=mysql --mysql-host=localhost --mysql-user=root --mysql-password=password --mysql-db=testdb --tables=4 --table-size=1000000 oltp_read_write prepare
sysbench --db-driver=mysql --mysql-host=localhost --mysql-user=root --mysql-password=password --mysql-db=testdb --tables=4 --table-size=1000000 --threads=8 --time=60 oltp_read_write run
第五阶段:生产切换
5.1 切换前检查清单
yaml
基础设施检查:
- ✅ AlmaLinux 系统稳定运行
- ✅ 所有服务正常启动
- ✅ 网络配置正确
- ✅ SSL 证书已安装
- ✅ 防火墙规则配置
- ✅ 备份系统就绪
应用程序检查:
- ✅ Web 应用功能验证
- ✅ 数据库连接正常
- ✅ 文件访问权限正确
- ✅ 用户认证工作正常
- ✅ 所有 API 接口可用
数据一致性检查:
- ✅ 数据库数据完整
- ✅ 文件同步完成
- ✅ 配置信息正确
- ✅ 日志记录正常
运维准备:
- ✅ 监控系统配置
- ✅ 告警规则设置
- ✅ 故障预案准备
- ✅ 回滚计划就绪
5.2 DNS 切换计划
bash
# 1. 降低 DNS TTL (提前一天)
# 在域名管理界面将 TTL 设置为 300 秒
# 2. 更新 DNS 记录
# 将 A 记录指向新的 AlmaLinux 服务器 IP
# 3. 验证 DNS 传播
nslookup example.com
dig example.com @8.8.8.8
# 4. 监控访问日志
tail -f /var/log/nginx/access.log
5.3 切换执行
bash
# 切换日执行计划 (建议在业务低峰期)
# 时间 T-60分钟: 最后数据同步
# 停止 Windows 服务器上的应用写入
# 执行最终数据同步
# 时间 T-30分钟: 系统最终检查
systemctl status nginx mysql dotnetapp
curl -I http://localhost
mysql -e "SELECT 1"
# 时间 T: DNS 切换
# 更新 DNS 记录指向 AlmaLinux 服务器
# 时间 T+30分钟: 验证切换结果
# 检查访问日志确认流量切换
tail -f /var/log/nginx/access.log
第六阶段:后期优化
6.1 性能监控和调优
安装监控系统
bash
# 安装 Prometheus 和 Grafana
dnf install -y prometheus grafana
# 配置 Prometheus
cat > /etc/prometheus/prometheus.yml << 'EOF'
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']
EOF
# 启动监控服务
systemctl enable --now prometheus grafana-server
系统调优
bash
# 内核参数优化
cat >> /etc/sysctl.conf << 'EOF'
# 网络优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 文件描述符限制
fs.file-max = 65535
# 虚拟内存优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
EOF
sysctl -p
# 服务限制优化
cat > /etc/security/limits.d/nginx.conf << 'EOF'
nginx soft nofile 65535
nginx hard nofile 65535
EOF
6.2 备份策略实施
文件备份
bash
# 创建备份脚本
cat > /root/backup_files.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/backup/files"
SOURCE_DIR="/srv/samba/shared"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 增量备份
rsync -avz --delete $SOURCE_DIR/ $BACKUP_DIR/latest/
tar -czf $BACKUP_DIR/backup_$DATE.tar.gz -C $BACKUP_DIR latest/
# 清理旧备份 (保留30天)
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +30 -delete
EOF
chmod +x /root/backup_files.sh
# 添加到 crontab
echo "0 2 * * * /root/backup_files.sh" | crontab -
数据库备份
bash
# 创建数据库备份脚本
cat > /root/backup_mysql.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_USER="backup_user"
MYSQL_PASSWORD="backup_password"
mkdir -p $BACKUP_DIR
# 全备份
mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD --all-databases --single-transaction --routines --triggers > $BACKUP_DIR/full_backup_$DATE.sql
# 压缩备份
gzip $BACKUP_DIR/full_backup_$DATE.sql
# 清理旧备份 (保留7天)
find $BACKUP_DIR -name "full_backup_*.sql.gz" -mtime +7 -delete
EOF
chmod +x /root/backup_mysql.sh
# 添加到 crontab
echo "0 1 * * * /root/backup_mysql.sh" | crontab -
6.3 安全加固
系统安全配置
bash
# 安装和配置 fail2ban
dnf install -y fail2ban
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
[nginx-http-auth]
enabled = true
[mysql-auth]
enabled = true
EOF
systemctl enable --now fail2ban
# 定期安全更新
echo "0 3 * * 1 dnf update -y --security" | crontab -
故障排查和回滚计划
常见问题解决
Web 服务问题
bash
# Nginx 无法启动
systemctl status nginx
journalctl -u nginx -f
nginx -t # 检查配置语法
# 502 Bad Gateway 错误
systemctl status php-fpm
systemctl status dotnetapp
netstat -tlnp | grep :9000 # 检查 PHP-FPM
数据库连接问题
bash
# MySQL 连接失败
systemctl status mysqld
mysql -u root -p -e "SHOW PROCESSLIST;"
netstat -tlnp | grep :3306
# 检查应用配置
grep -r "connection" /var/www/dotnetapp/appsettings.json
文件访问问题
bash
# Samba 访问失败
systemctl status smb nmb
smbclient -L localhost -U sambauser
testparm # 检查 Samba 配置
# 权限问题
ls -la /srv/samba/shared/
sestatus # 检查 SELinux 状态
回滚计划
紧急回滚步骤
yaml
DNS 回滚 (5分钟内):
1. 立即更新 DNS 记录指向原 Windows 服务器
2. 验证 DNS 传播: nslookup example.com
3. 监控原服务器状态
应用回滚 (15分钟内):
1. 启动 Windows 服务器上的所有服务
2. 验证数据库连接和数据完整性
3. 检查应用程序功能
4. 通知用户系统恢复正常
数据恢复 (30分钟内):
1. 如有数据丢失,从最新备份恢复
2. 验证数据一致性
3. 重新同步文件
4. 检查所有业务功能
总结: Windows Server 到 AlmaLinux 10 的迁移是一个复杂的跨平台项目,需要详细的规划和充分的测试。成功的关键在于分阶段实施、充分验证和做好回滚准备。建议在生产环境迁移前,先在测试环境完整验证整个迁移流程。
相关文档: