Vivado 2014.1 / Linux Ubuntu 14.04 license activation notes
Introduction
After installing Vivado 2014.1 on my laptop running Ubuntu 14.04 (64 bits), I went for license activation. All I wanted was a plain node-locked license. Not a server, and not a floating one. Baseline.
Xilinx abandoned the good old certificate licensing in favor of activation licensing. That is causing some headaches lately…
Going through the process, I had several problems. The most commonly reported is that when one enters the web page on which the license should be generated (see image below), the activation region is greyed out. A “helpful” message next to the greyed area gives suggestions on why this area is disabled: Either a license has already been submitted based upon that certain request ID, or the page was entered directly, and not through Vivado Licensing Manager.
But there’s another important possible reason: The request is maybe invalid. In particular because the computer’s identification is lacking.
If this is the case, there is no special error message for this. Just that “important information” note. See “What the problem was” below.
As a side note: Ubuntu 14.04 is not in the list of supported OS’s, but that’s what I happen to have. Besides, the problem wasn’t with the OS, it turned out.
The activation process (in brief)
It seems like the whole idea about this activation process is that the licensing file that is returned from Xilinx won’t be usable more than once. So instead of making the licensing file valid for a computer ID, it’s made valid with respect to a request ID. Hence the licensing tools on the user’s computer first needs to prepare itself for receiving a licensing file by creating some random data and call it a request ID. That data is conveyed to the licensing web server (Xilinx’ server, that is) along with information about the machine.
The licensing server creates a licensing file, which corresponds to the request ID, enabling the licensed features the user requested on the site. The user feeds this licensing file into the licensing tools (locally on its computer), which match the request ID in its own records with the one in the licensing file. If there is a match, it makes a note to itself that the relevant features are activated. Also, it deletes the information about that request ID from its records.
The database containing the requests and what features are enabled is kept in the “trusted area”. Which is a fine name for some obscured database.
In practice, the process goes as follows: When clicking “Connect Now”, Xilinx licensing client on your computer collects identifying information about your computer, and creates some mumbo-jumbo hex data hashes to represent that information + creates a request ID. It then stores this information in the computer’s own “trusted area” (which must be generated manually prior to this on a Linux machine) so it remembers this request when its response returns.
It then opens a web browser (looks like it just tries running Google Chrome first and then Firefox) with an URL that contains those mumbo-jumbo hex hashes. That eventually leads to that famous licensing page. The user checks some licensing features, a licensing file is generated (and those features are counted as “taken” on the site).
The thing is, that in order to create an activation license, the web server needs those mumbo-jumbo hashes in the URL, so it knows which request ID it works against. Also, if a request ID has already been used to create a license, it can’t be reused, because the licensing tools at the user’s side may have deleted the information about that request ID after accepting the previous licensing file.
What the problem was
The reason turned out to be that my laptop lacks a wired Ethernet NIC, but has only a wireless LAN interface. The FLEXnet license manager obviously didn’t consider wlan0 to be an eligible candidate for supplying the identifying MAC number (even though it’s an Ethernet card for all purposes), so the request that was generated for the computer was rejected.
This can be seen in the XML file that is generated by the command-line tools (see below) in the absence of any identifying method:
<UniqueMachineNumbers> <UniqueMachineNumber><Type>1</Type><Value></Value></UniqueMachineNumber> <UniqueMachineNumber><Type>2</Type><Value></Value></UniqueMachineNumber> <UniqueMachineNumber><Type>4</Type><Value></Value></UniqueMachineNumber> </UniqueMachineNumbers>
Compare this with after adding a (fake) NIC, as shown below:
<UniqueMachineNumbers> <UniqueMachineNumber><Type>1</Type><Value></Value></UniqueMachineNumber> <UniqueMachineNumber><Type>2</Type><Value>51692BAD76FCCBBFAA0D635F0CA3674E0F7FADBC</Value></UniqueMachineNumber> <UniqueMachineNumber><Type>4</Type><Value></Value></UniqueMachineNumber> </UniqueMachineNumbers>
But these XML files aren’t really used. What counts is the URL that is used to enter Xilinx site.
Without any identifying means, it looks like this (important part marked in read):
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=http://license.xilinx.com/getLicense?group=esd_oms&os=lin64&version=2014&licensetype=4&ea=&ds=&di=&hn=&umn1=&umn2=&umn4=&req_hash=297B4710327A0F933FF3382961787271D94FE8CD&uuid=961710372713387A02297B4F3F78F93D924FE8CD&isserver=0&sqn=1&trustedid=1&machine_id=E83C0C895A751459C7449FF5ABFC083849233D7A&revision=DefaultOne&revisiontype=SRV&status=OK&isvirtual=0">
And a proper URL like this:
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=http://license.xilinx.com/getLicense?group=esd_oms&os=lin64&version=2014&licensetype=4&ea=&ds=&di=&hn=&umn1=&umn2=51692BAD76FCCBBFAA0D635F0CA3674E0F7FADBC&umn4=&req_hash=8BD92BFBA481BFD3CA64EF6DB30133A24CA961D5&uuid=8BDCA113ABFD64EF6D392BFBA483A24CB30961D5&isserver=0&sqn=1&trustedid=1&machine_id=483F4E15B8491F0482A56C0E253B8F9D78DCD114&revision=DefaultOne&revisiontype=SRV&status=OK&isvirtual=0">
So quite evidently, the UniqueMachineNumber elements in the XML file appear as unm1, unm2 and unm4 CGI variables in the URL. They’re all empty string for the URL that caused the greyed out authentication region.
So fake a NIC
Since the laptop really doesn’t have a wired Ethernet card, let’s fake one assign it a MAC address:
# /sbin/ip tuntap add dev eth0 mode tap # /sbin/ifconfig eth0 up # /sbin/ip link set dev eth0 address 11:22:33:44:55:66
(pick any random MAC address, of course)
The quick and dirty way to get this running on every bootup was to add it to /etc/rc.local on my machine. The more graceful way would be to create an upstart script executing on network activation. But I’ve had enough already…
By the way, I picked eth1 on my own computer, because eth0 is used by my Ethernet-over-USB device. Works the same.
If “Connect Now” does nothing
Even though Vivado started off apparently OK, Vivado License Manager refused to open a browser window for obtaining a license on Ubuntu 14.04: I clicked the “Connect Now”, but nothing happened. Some extra packages were installed and it fixed it. Not clear if all are necessary:
# apt-get install libgnomevfs2-0 libgnome2-0 # apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0
As usual, strace was used to find out that this was the problem.
Dec 2018 update: Running Vivado 2015.2 on a Mint 19 machine, I got a new error message:
/usr/lib/firefox/firefox: /path/to/Vivado/2015.2/lib/lnx64.o/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/lib/firefox/firefox) /usr/lib/firefox/firefox: /path/to/Vivado/2015.2/lib/lnx64.o/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/lib/firefox/firefox)
Apparently, opening Firefox from within Vivado caused it to use Vivado’s C++ runtime library, which was too old for it. Simple fix:
$ cd /path/to/Vivado/2015.2/lib/lnx64.o/ $ mv libstdc++.so.6 old-libstdc++.so.6 $ ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6
Installing FLEX license manager
This is partly documented in Xilinx’ installation guide. It has to be done once before attempting to acquire a license.
First and foremost, clean up previous installation, in case you’ve been struggling with this for a while already. The license manager keeps its file in these directories. Just delete (or move to another directory) the following directories, to get a fresh start
- /tmp/FLEXnet (empty files with UUID-like file names)
- /usr/local/share/macrovision
- /usr/local/share/FNP
- /usr/local/share/applications/.com.flexnetlicensing
- ~/.Xilinx/*.lic (in particular ~/.Xilinx/trial.lic). Not sure if this is related.
Having this done, become root (or use sudo) and run install_fnp.sh. This is what it looked like when I did this based on what was installed along with Vivado 2014.1:
# software/xilinx/Vivado/2014.1/ids_lite/ISE/bin/lin64/install_fnp.sh ./software/xilinx/Vivado/2014.1/bin/unwrapped/lnx64.o/FNPLicensingService Installing anchor service from ./software/xilinx/Vivado/2014.1/bin/unwrapped/lnx64.o/FNPLicensingService to /usr/local/share/FNP/service64/11.11.0 Checking system for trusted storage area... Configuring for Linux, Trusted Storage path /usr/local/share/macrovision/storage... Creating /usr/local/share/macrovision/storage... Setting permissions on /usr/local/share/macrovision/storage... Permissions set... Checking system for Replicated Anchor area... Configuring Replicated Anchor area... Creating Replicated Anchor area... Setting permissions on Replicated Anchor area... Replicated Anchor area permissions set... Configuring Temporary area... Temporary area already exists... Setting permissions on Temporary area... Temporary area permissions set... Configuration completed successfully.
Working with latest library tool chain
As the latest version of Vivado was 2014.4 at the time, I downloaded Vivado 2014.4′s license manager tools. The rationale was that maybe the interaction with the site had changed. With hindsight, it would probably be OK to use 2014.1′s licensing tools, but this is how I eventually got it working.
I extracted the zipfile into ~/software/xilinx/licensing_tools/linux_flexlm_v11.11.0_201410/.
Then went to the lnx64.o, ran install_fnp.sh again as root and verified that there are no pending requests:
$ ./xlicclientmgr -l ERROR: flxActCommonInit result 2 . Exit(2) FLEXnet initialisation error.
The reason for this error was not finding the libXLicClientMgrFNP.so library, which is in the same directory (strace saved the day again).
The quick and dirty solution is to add the current directory to the library search path (this works only if it’s done in the directory the library is in):
$ export LD_LIBRARY_PATH=$(pwd)
And then prepare a request:
./xlicclientmgr -cr ~/Desktop/newrequest.xml Request written to /home/eli/Desktop/newrequest.xml Request (html) written to /home/eli/Desktop/newrequest.html
The tools indeed remember that they have a pending request:
$ ./xlicclientmgr -l SeqNo Status Date Time Reference 1 Pending 2015-01-19 18:45 "" Listed 1 of 1 composite requests.
Then double-clicked newrequest.html to get a license file.
With the XML file that was emailed back:
$ ./xlicclientmgr -p ~/Desktop/Xilinx_License.xml Response processed successfully. Actions were: Create fulfillment "215469875" FLEXnet response dictionary: COMMENT=This activation license file is generated on Tue Jan 20 16:26:40 UTC 2015 $ ./xlicclientmgr -l No stored composite requests.
(but there was one listed before using the response).
Reader Comments
Wow great thanks for this post!!
Once i had a lxc container. I read that the problem will occur using virtual machine.
Thanks a lot.
I had the same issue and this guide helped me solve it.
C
Thanks so much for posting that! I had the same problem activating version 2015.3 on Fedora 22
Very good information! really helpful
Fake NIC doesn’t appear to work anymore with Vivado 2015.01 and 2015.02 :(
umn1 through 4 remain empty
My Dell XPS13 2015 has no LAN NIC, and VLM wasn’t picking up a MAC address from my wireless card.
I also have KVM installed, so perhaps it was seeing the network device virbr0 and giving up. In any case, wlan0 wasn’t doing the job. I fixed this by renaming the interface in udev, by changing /etc/udev/rules.d/70-persistent-net.rules
from:
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”00:11:22:33:44:55″, ATTR{dev_id}==”0x0″, ATTR{type}==”1″, KERNEL==”wlan*”, NAME=”wlan0″
to:
SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?*”, ATTR{address}==”00:11:22:33:44:55″, ATTR{dev_id}==”0x0″, ATTR{type}==”1″, KERNEL==”wlan*”, NAME=”eth0″
So just change the NAME field. That would then generate a type 2 node ID. I also removed some pending license requests using xlic{client,srvr}mgr -l to find the sequence numbers and then xlic{client,srvr}mgr -zz 1234
One or both of these activities fixed the problem!