Skip to content

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 CoreNginx/Apache + .NET直接支持
IIS + ASP.NET Framework需要重构或替换无直接迁移路径
SQL ServerMySQL/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 的迁移是一个复杂的跨平台项目,需要详细的规划和充分的测试。成功的关键在于分阶段实施、充分验证和做好回滚准备。建议在生产环境迁移前,先在测试环境完整验证整个迁移流程。

相关文档:

基于 MIT 许可发布