"Invalid license key"是FlexNet运维中遇到频率最高的错误之一。每当这个错误出现,lmgrd会拒绝启动,vendor daemon加载license文件失败,所有依赖该许可证的软件全部停摆。
这个问题最麻烦的地方在于:错误信息只告诉你"invalid key",但不告诉你哪里invalid。 排查全靠经验。
下面列出最常见的七种原因,按出现频率排序。
这是最容易被忽略、但发生率最高的原因,尤其在跨平台传输license文件时。
背景: Windows系统的换行符是CRLF(\r\n),Linux系统是LF(\n)。FlexNet的license文件格式要求使用正确的换行符,而不同操作系统对换行符的处理方式不同。
具体场景:
排查方法: 在Linux上用cat -A查看license文件。如果行尾显示^M$,说明是Windows换行符(CRLF)。正常应该是$(LF)。
解决方法: 用dos2unix命令转换:
text
dos2unix license.lic转换后再用cat -A确认,行尾应该只显示$。
Windows环境下怎么处理: 用Notepad++打开,右下角状态栏会显示当前换行符格式(Windows(CRLF)或Unix(LF))。如果显示的是Windows,点击,切换到Unix(LF),保存。
部分文本编辑器(尤其是Windows记事本)保存UTF-8文件时会在文件开头添加BOM(Byte Order Mark)标记。这个BOM是几个不可见字节,FlexNet的解析器不认识它,直接报invalid key。
解决方法: 用Notepad++打开,点击"编码"菜单,选择"转为UTF-8无BOM格式编码",保存。
或者用命令行去掉BOM:
text
sed -i '1s/^\xEF\xBB\xBF//' license.licFlexNet license文件的每一行FEATURE或INCREMENT末尾都有一个SIGN或SIGN2签名。这个签名是厂商服务器根据该行的所有字段(feature名称、版本、过期日期、数量、HOSTID等)计算出来的哈希值。

关键规则: 只要改动了该行的任何一个字段,签名就失效。
具体来说,以下操作都会导致签名失效:
为什么很多人在这个地方犯错: 拿到license文件后,用文本编辑器打开检查,不小心删了一个空格或者改了个字母,保存,上传,启动,报错。自己完全意识不到改过什么。
排查方法: 用lmcksum校验:
text
lmutil lmcksum -c license.lic如果输出中某行的checksum与文件头部记录的checksum不一致,说明该行被修改过。
解决方法: 从厂商重新下载原始license文件。不要尝试手动修复签名——你不可能算出正确的签名值。
SERVER行和VENDOR行是license文件的"头部",lmgrd先解析这两行。格式不对,后面的内容根本不会读。
常见格式错误:
SERVER行有三个参数:主机名、HOSTID、端口号。
text
SERVER my-server 001122334455 27000少一个参数,或者顺序不对,都会报错。比如漏了端口号,或者把主机名写成了带下划线的字符串(某些老版本不支持下划线),lmgrd直接退出。
VENDOR行格式:
text
VENDOR snpslmd /opt/synopsys/snpslmd如果路径中包含空格(比如C:\Program Files\FlexNet\snpslmd.exe),但没有用引号括起来,解析器会把Program和Files当成两个独立的参数,解析失败。
解决方法: 检查SERVER行是否有且仅有三个参数。检查VENDOR行的路径,如果有空格,用双引号括起来:
text
VENDOR snpslmd "C:\Program Files\FlexNet\snpslmd.exe"license文件应该是纯ASCII文本。如果文件中混入了非ASCII字符——比如中文全角空格、制表符、零宽空格等——lmgrd解析时就会出错。
常见来源:
排查方法: 用od -c license.lic | head -50查看文件内容,找出非ASCII字符。或者用hexdump查看十六进制内容,对照ASCII表判断是否有异常字节。
解决方法: 直接从厂商的邮件附件下载原文件,不要复制粘贴。如果只能复制粘贴,先粘贴到Notepad++,在"视图"菜单中开启"显示所有字符",检查是否有异常符号。

每行FEATURE或INCREMENT的字段顺序是固定的:
text
FEATURE feature_name vendor_daemon version expire_date num_lic [attributes] SIGN=...如果你复制粘贴时不小心把字段顺序弄乱了,或者漏了某个字段,lmgrd解析时就会报invalid key。
特别容易出错的地方: num_lic字段。有些license的num_lic是uncounted,有些是数字。如果把uncounted写成了uncount,或者把数字写成了带逗号的格式(如"10,000"),解析器不认识。
这个看起来很初级,但确实会发生。
运维人员修改license文件前通常会备份,备份文件命名成license.bak、license.lic.old等。lmgrd启动时通过-c参数指向某个文件。如果指向了备份文件,而备份文件里的签名已经过期或失效,就会报invalid key。
还有一种情况:目录下有多个license文件,lmgrd的-c参数指向了错误的那个。
遇到"Invalid license key"时,按这个顺序检查效率最高:
这五个步骤走完,90%的invalid key问题都能定位。
绝大多数"Invalid license key"错误,根源不是license文件坏了,而是它被某种方式"改变"了。 换行符、编码、空格、粘贴引入的隐藏字符——这些看起来微不足道的东西,在FlexNet的解析器眼里都是重大变化,足以让签名失效。
所以一个可靠的解决方法是:直接从厂商的邮件附件下载原始license文件,不做任何修改,直接上传到服务器使用。 不要去动它,不要打开它,不要复制它。需要用的时候,wget或scp传过去就行。这能避免大部分人为主观因素导致的格式问题。