许可证过期是企业IT运维中必然会遇到的问题。向厂商申请到新license文件后,替换流程看起来简单——复制文件、重启服务、验证——但细节处理不当,轻则导致服务中断,重则引发客户端大规模报错。这篇文章把整个流程拆开讲透。
新license文件从厂商渠道拿到后,不要直接往服务器上覆盖。先做三件事:
第一,核对文件格式。 用文本编辑器(Notepad++或VS Code,不要用记事本)打开新license文件,确认:
如果从邮件客户端直接复制粘贴license内容,很容易引入隐藏字符或破坏换行符。建议直接从附件下载原文件。
第二,核对关键信息。 与旧license文件逐项对比:
如果厂商变更了VENDOR行配置(比如更换了端口或修改了路径),需要同步调整。不要假设厂商的配置永远不变。
第三,备份旧license文件。 这是最重要的一步。用时间戳重命名备份:
bash
cp /opt/flexnet/license.lic /opt/flexnet/license.lic.bak.$(date +%Y%m%d)备份后把新license文件放到生产目录,但先别着急重启服务——可以先用lmcksum校验新文件的签名完整性:
bash
lmutil lmcksum -c /path/to/new_license.lic如果能正常输出每行feature的校验码,说明签名有效。输出中包含SIGN字样也说明签名完整。
替换license文件后,需要让lmgrd重新加载新文件。有两种方式:
方案一:Reread(推荐,零中断)
使用lmreread命令让lmgrd重新读取license文件,不需要重启服务,已经在使用中的许可证不受影响:
bash
# 在线重读
lmutil lmreread -c /path/to/license.lic
# 如果文件路径与当前服务一致,也可以简化
lmutil lmreread执行后观察debug.log,会看到类似Reread succeeded或Re-reading license file...的记录。如果看到Re-read of file failed,说明新license文件有问题,需要检查后重试。
需要注意:某些旧版本FlexNet(如10.x)对lmreread支持不完善,可能出现重读后部分feature未生效的情况。如果发现重读后新feature没有出现,用方案二完全重启。
lmreread不仅刷新过期日期,还会重新加载所有新增的feature和INCREMENT行。但以下情况的变更不支持热加载,需要完全重启:
方案二:完全重启(需要停服)
如果新license文件涉及vendor daemon路径变更、端口变更,或lmreread执行后报错,需要完全重启服务:
bash
# 优雅停止
lmutil lmdown -c /path/to/license.lic -q
# 确认进程已退出
ps -ef | grep -E "lmgrd|vendor_name"
# 重新启动
lmgrd -c /path/to/license.lic -l /var/log/flexnet/debug.log如果使用systemd管理:
bash
systemctl stop flexnet
systemctl start flexnet完全重启过程中,所有已签出的许可证会被强制回收,客户端需要重新签出。建议在业务低峰期执行,并提前通知用户保存工作。
替换完成后,执行一系列验证操作,确保新license文件已生效:
1. 检查debug.log。 打开日志,搜索license或error关键字,确认没有报错。正常的日志应该包含类似lmgrd: Reread of license file succeeded或新feature成功加载的记录。
2. 使用lmstat查看许可证状态。
bash
# 查看所有feature和过期时间
lmutil lmstat -a -c /path/to/license.lic
# 查看特定feature的详细信息
lmutil lmstat -f feature_name -c /path/to/license.lic重点确认过期日期字段(expires)已更新为新的日期。
3. 实际签出测试。
bash
# 尝试签出并立即签入测试
lmutil lmstat -f feature_name -c server_port@hostname如果能正常查询到feature信息(显示Users of feature_name:),说明许可证文件已正确加载。
Q1:新license文件放上去后,lmgrd启动失败,报"Invalid license key"
这是签名验证失败。可能原因:文件被修改过(哪怕是加了一个空格)、换行符格式不对、文件包含隐藏字符(如BOM头)。用dos2unix转换换行符后重试,或直接从厂商重新下载未修改的原始文件。
Q2:Reread执行后,部分feature仍显示过期
新license文件中可能只更新了部分feature的过期日期,未包含的那些仍按原日期。如果确定所有feature都在新文件中,lmreread后仍有个别未更新,用lmutil lmstat -f feature_name确认该feature实际状态。如仍未更新,用方案二完全重启。
Q3:新版license文件的feature名称变了怎么办?
厂商有时会调整feature命名规则。替换后如果发现某些客户端报No such feature exists,需要用lmstat -a查看新的feature列表,然后通知用户更新软件配置。
Q4:Reread后debug.log显示"Re-read of file failed"
需要检查:
如确认无误但仍失败,改用完全重启方案。
Q5:多台服务器部署license文件,怎么同步?
如果使用三服务器冗余(Triad)架构,三台服务器都需要更新license文件。更新顺序:先更新备份服务器,再更新主服务器,最后更新仲裁服务器。每台更新后都执行lmreread,并确认三台之间心跳正常。
| 步骤 | 操作 | 状态 |
|---|---|---|
| 1 | 从厂商收到新license文件 | ☐ |
| 2 | 检查文件格式(换行符、签名行) | ☐ |
| 3 | 核对SERVER行主机名/HOSTID | ☐ |
| 4 | 核对VENDOR行配置 | ☐ |
| 5 | 核对feature名称和过期日期 | ☐ |
| 6 | 备份旧license文件 | ☐ |
| 7 | 将新文件放入生产目录 | ☐ |
| 8 | 执行lmreread(或用systemctl restart) | ☐ |
| 9 | 检查debug.log确认无报错 | ☐ |
| 10 | 执行lmstat -a确认过期日期已更新 | ☐ |
| 11 | 签出测试feature验证可用 | ☐ |
| 12 | 通知相关用户许可证已更新 | ☐ |
许可证延期替换的本质是文件替换+服务重读。核心操作看似简单,但核对、备份、验证三个环节缺一不可。
按照这个流程操作,许可证延期替换可以在不中断业务的前提下完成。