Ultima Online on Linux by Hugo of Napa Valley
With the increasing popularity in the Linux operating system there are more and more people who want their current PC applications to run on their favorite Linux distribution. While adequate (and often superior) alternatives exist for the most common windows applications, PC games are still largely restricted to the windows platform. Still, hope is not lost. This article will detail how to install and run Ultima Online on the Linux operating system (currently the 2D client is the only one that works, and UOAssist does not work).

There is more than one possible way to run UO on Linux. A PC emulator could be used to run the windows OS in Linux. Examples of this include the bochs open source project and the commercial VMWare product. Another solution would be the Wine project, which I will be focusing on for this article. Currently, Wine seems to be the simplest solution, and it has been found to work quite well.

The distribution used to develop this article was the Fedora Core 1 release. Since Fedora is an RPM-based distribution, the instructions given here will refer to the installation of RPMs. If you are using a non-RPM-based distribution you will have to tweak these instructions for your circumstances. The instructions here are fairly straight-forward, and altering then for different distributions should not be difficult.

An important thing to remember is that OSI does not officially (or unofficially for that matter) support UO running on Linux. Please be aware that any issues you may have while running UO on Linux could be an incomparability issue between UO and the Linux platform.


Wine is an Open Source project that allows Linux users to run windows programs on top of XWindows and Linux. The Wine homepage describes the project in more detail. (Also of interest is the WineX product from TransGaming Technologies. WineX is a commercial product, which I don't currently own. If I decide to buy WineX I will post my results of running UO on it).

Since Fedora Core 1 does not come with Wine, I will cover its installation in detail. Your distribution might ship with Wine. If you already have Wine installed, you can skip down to the section on configuring wine below. If you have an older version of Wine installed, you may want to upgrade.

Downloading and Installing Wine

To start, download Wine for your distribution. Wine distribution is managed on SourceForge. The Wine download page lists all of the packages that are available including binary packages for a wide variety of distributions. The source is also available if you want to download and compile Wine, but that is beyond the scope of this article.

The Fedora releases are with the RedHat packages. At the time of writing, the latest release was 20040121. The RPM used is wine-20040121-1fc1winehq.athlon.rpm. Note there are several architecture specific releases for each distribution (the 'athlon' part). Download the correct one for your specific CPU. If in doubt, download the 'i386' version.

Another very useful package is the Winesetuptk application. It makes the initial creation of the wine configuration file very easy. The RPM (winesetuptk-0-72.i586.rpm) is found in the Support Packages section.

The Wine installation is now as easy as installing these RPMs. This will have to done as the root user:

# rpm -Uvh wine-20040121-1fc1winehq.athlon.rpm
# rpm -Uvh winesetuptk-0-72.i586.rpm
Configuring Wine

Configuring Wine can be done with the winesetuptk application. This should be run as a regular (non-root) user. As a user run (you should be in XWindows at this point):

$ winesetuptk

The defaults should work for just about everybody. Check all of the categories and configuration parameters to ensure you are happy with the default value. There are a couple important things to note:

  • If you change the location of the config file from the default, you will also have to tell wine where to find it.
  • Ensure the 'C Drive' and the tmp drive are both on local drives (i.e. avoid putting it on an NFS mount)
  • Ensure the CDROM drive points to the correct mount point for your CDROM drive (this is usually /mnt/cdrom)

When you are satisfied with the configuration values select "Finish" to exit and write out your configuration file.

Installing UO in Wine

Installing UO into Wine is simply a matter of running the installation program. Insert the UO CD into your CDROM drive and make sure the CDROM is mounted (I used the Age Of Shadows CDROM).

Run the installation program. This can be done with either of the following commands (if you have your CDROM mounted elsewhere or mapped differently in wine you will have to adjust these commands):

$ wine /mnt/cdrom/Setup2D.exe
$ wine "D:\Setup2D.exe"

NOTE: Normally we would run Install.exe. However, it doesn't work in Wine (feel free to try it and see if you get better results than I did). Running the Setup2D.exe program ultimately installs the 2D client.

At this point in the installation I came across my first real problem. As it turns out, there is an issue with a kernel feature in Fedora Core 1 that affects Wine. If you came across an error message about a "security-patched kernel" please see the Prelink Issue Workaround below. If you are fortunate enough to avoid this issue, continue on.

Install UO as you normally would on windows. I have assumed all of the defaults for the UO install.

You'll notice during the installation process that there are a few odd visual artifacts that shouldn't be there. For example, the "Total Installation" label runs over the CDROM image as well as the progress bar. I'm not sure if there is a way to improve on this. It's not that important at this point, but when we get to the patcher we will see some more issues like this.

When prompted with the "re-install DirectX 8.1" dialog click "No"

The "Create Account" button opens the web browser, which doesn't work, and I suspect you already have an account created.

When prompted with "Run UO: AOS" or "Exit Installer" you can do either. Running AOS will start the initial patch process, which will be done the first time you run UO. You probably want to actually see UO at this point, so hit the "Run UO: AOS" button and continue with the First Launch.

First Launch

The first time you run UO the patch process will startup. Notice that you will start out with the old-style (plain text) message window. Continue as you would normally.

At some point the new patch window will open up. Now we see a few more of those 'visual artifacts' mentioned previously. I believe this window uses the MSIE browser functionality that's built into windows. Wine doesn't have this, so you'll get a text version of the Patch Message instead.

Once the patching is finished the "OK" button will become enabled. Click it to get past the patch window and startup UO.

After First Launch

To Run UO in the future, use the following command:

$ wine "C:\Program Files\Ultima Online 2D\UO.exe"

The file "uo.exe" is not actually the game client. It takes care of running the patch program and then launching the client. If you run uo.exe you will notice a little "untitled window" hangs around when you are playing. This is the "uo.exe" application. If you want to get rid of this window, and you know that UO is all patched up, you can start UO using this command:

wine "C:\Program Files\Ultima Online 2D\client.exe"
Enjoy UO on Linux

Hopefully these instructions will be enough to allow you to enjoy UO on Linux. If you have any problems or interesting things to report please feel free to send me an email to hugo at its dot to.

Prelink Issue

The actual error message for this issue is:

err:virtual:map_image Standard load address for a Win32 program (0x00400000) not available - security-patched kernel ?
wine: could not load L"C:\\Program Files\\Ultima Online 2D\\client.exe" as Win32 binary

More information about this issue is available on the Codeweavers forum. There seems to be a number of possible workarounds for this issue, but I have had mixed results with most of them.

The workaround I have the most success with is by executing the following commands (as root):

# echo 0 > /proc/sys/kernel/exec-shield # echo 0 > /proc/sys/kernel/exec-shield-randomize

This fix has to be done after every reboot. You can either do it manually every time you boot into Linux, or put it in a startup script. Hopefully a better solution will present itself soon.

Once you have dealt with this issue you can continue with the install.