Running Elite:Dangerous on Linux without Steam

(Skip to the TL;DR section below if you just want the shortest list of commands)

I have a decent spec gaming PC (NVidia GeForce GTX 970 for the graphics card) that's been running Windows 10 for the last few years, since I started playing Elite:Dangerous. But recently the SSD C: started to die, and I switched over to a new drive with Ubuntu 20.10 on it instead. Any day that I don't have to run Windows is a good day.

I found some instructions on running E:D from Steam, using protontricks and launching via Lutris, and they worked! But I'm a bit unusual and have several E:D accounts; only one is on Steam, and I wanted to follow the pattern I'd had previously, with multiple copies of the EDLauncher authenticated to different accounts, but all running from the same single installed copy of Elite.

I tried to generalise the Steam version but in the process broke everything ... so I decided to start again. This time, I was going to try to understand what every step was meant to achieve, as much as I could ...

And just as a warning here – I did all this on my live OS, so there might be some steps I've missed, because I didn't realise pre-requisites were already installed from my earlier experiments. I'd like to rerun these instructions on a new clean install of Ubuntu, but right now I'm just wanting to get into the cockpit ...

Just WINE

I installed Wine 6.6 via the winehq-devel package from WineHQ's Ubuntu repository. I'd also had some other versions installed (notably 6.5) but had been careful to avoid them by careful use of $PATH.

I set WINEPREFIX to point to a new empty directory ($HOME/EDwine), and ran winecfg. This builds & populates a minimal Windows directory structure in $HOME/EDwine, 1.4GB of data, and then presents a Windows-style config box. You don't need to make any changes in there, but have a look around and see what it's up to. In my case, it was set for Windows 7 and to send audio through pulseaudio, which was fine.

The Elite Installer

I grabbed a copy of the EliteDangerous-Client-Installer.exe from my account's 'Downloads' on the Frontier store. There's probably nothing unique or personalised about that file, we probably all get the same one.

Running it directly under Wine was straightforward, and resulted in lots of components like the VC++ Redistributable and DX9 being installed into my minimal Windows filesystem. IIRC it suggested that I 'reboot Windows' so I ran wineboot instead.

EDLaunch

Now we get to the bits where things needed tweaking. EDLaunch.exe needs the right version of the Mono run-time to be present, to provide the things that real Windows gets from the .NET Framework. The version I used came via a protontricks page discussing support for E:D under Steam, and is just the default 6.1.1 version with a couple of small helpful tweaks – https://github.com/redmcg/wine-mono/releases/tag/wine-mono-6.1.1_ED

This is an MSI file, and therefore you install it with the Windows tool msiexec :- wine msiexec /i ...path/to/wine-mono-6.1.1_ED.msi

Now the Launcher will start – but it can't render any of the GalNet News or Frontier Store adverts because there's no web browser components available. Wine will prompt for your permission to install Gecko – say yes if you want; I don't think you strictly need it, but the Launcher looks more normal if you do!

You will need to log in with your CMDR's Frontier account now. It'll work as long as you remember your credentials!

You might also get the Hardware Reporter popping up, which is a debug reporting tool. Cancel it, because Frontier obviously don't support the game being played under Wine or directly on Linux, and can't do anything with your reports anyway.

Pressing PLAY ... but not yet!

At this stage, pressing PLAY will launch the actual game. However, this is where we'll start running into problems with the efficiency of DirectX running under Wine, and any complications with your actual video card drivers.

I had installed the proprietary nvidia-driver-450 previously, this isn't perfect (I occasionally see corrupted blocks on the screen after sleeping the machine, for example, but a simple move or redraw fixes them) but it's probably the best option for my card. Obviously many of you will have different video cards, and will need different drivers, but I don't think it is going to make a difference here ... as long as you have an efficient 3D driver for your card that exposes a decent API it shouldn't matter what it is.

But Wine running DX9 isn't going to know about this, as far as I can see. If you run the game, the 3D graphics will probably be CPU bound, and I ended up crashing my machine a few times. Going through the initial shader generation took over 30 minutes, too, which isn't helpful!

Vulkan

So, I installed Vulkan into the Linux machine. This is an alternative API to DirectX, that's known to give better performance, and as I'm installing it on the Linux side, it will be aware of the NVidia drivers. This doesn't help us completely yet, but ...

sudo apt install libvulkan1 libvulkan-dev vulkan-utils

DXVK

The next part of the job is to install DXVK into the Windows environment. This tool translates the DX9 requests that Elite makes within Windows into Vulkan requests that Linux knows how to answer efficiently.

(I've also heard that it's very good at doing the same thing in a pure Windows environment, speeding up Windows games trying to use DirectX by diverting their requests to the more efficient Vulkan API)

I went to https://github.com/doitsujin/dxvk/releases and grabbed version 1.8.1, unpacked the tar file and executed the setup script under Wine

wine ...path/to/dxvk-1.8.1/setup_dxvk.sh install

You can run winecfg again at this point, and you'll see overrides in the Libraries section, with various DirectX libraries now provided by 'native', which basically means the DXVK tools you just installed.

Success, but still some issues

At this point, pressing PLAY will launch the final game executable, that will make DX9 calls for 3D graphics when you actually enter the cockpit. DXVK will divert those calls to Linux's libvulkan, and from there to the NVidia driver, efficiently.

Now, I still had lots of problems and crashes, when trying to get to Fullscreen or Borderless setups. If you set a resolution & the game crashes before switching back, you may need to find Elite's DisplaySettings.xml file (in $WINEPREFIX/drive_c/users//Local Settings/Application Data/Frontier Developments/Elite Dangerous/Options/Graphics/) and change the FullScreen value back to 0 for 'windowed', and also perhaps the ScreenWidth and ScreenHeight values too.

However, after an actual reboot of Linux (which might have made some difference to the order things were loaded in) and a couple more retries of the Graphics settings in-game, I now seem to have a stable Borderless 1920x1080 display with Ultra settings.

All I need to do now is to remap my HOTAS and I can fly free once more!

o7 Commanders!

CMDR Yojimbosan, Radio Sidewinder 📻🐍

TL;DR