Windows Server 2019 on Hetzner's EX62 & AX100 Dedicated Servers

This post is a follow-up to my 2016 article on how to install Windows Server on Hetzner’s EX51 hosted dedicated servers.

Hetzner offers many types of dedicated servers at very attractive prices and - astonishingly - good support. This article lists some issues we encountered while installing Windows Server 2019 on the EX62 and AX100 servers and how we worked around them. Reading the earlier article is highly recommended.

Server Hardware

Most of Hetzner’s servers are custom builds based on regular PC mainboards. You can get “real” servers, too (they have several Dell offerings), but at a much higher price. I can relate from many years of personal experience that Hetzner’s “non-server” machines are very reliable.

EX62 - Intel

The EX62 is a powerful Intel machine, available for €82/month (traffic included). Specs:

  • Intel Core i9-9700K, 8 cores
    • Cinebench R15 single core: 219
    • Cinebench R15 multi core: 2081
  • 64 GB RAM
  • 2 x SSD NVMe 1 TB
CDC 6600 keyboard close-up by Marcin Wichary under CC

AX100 - AMD

The AX100 is a powerful AMD machine, available for €130/month (traffic included). Specs:

  • AMD Ryzen Threadripper 2950X, 16 cores
    • Cinebench R15 single core: 180
    • Cinebench R15 multi core: 3187
  • 128 GB RAM
  • SSDs (priced extra):
    • 1 x SSD NVMe 1.92 TB datacenter edition: €58

Mainboards

In order to look for drivers or compatibility information, you need to know a server’s mainboard. Unfortunately, Hetzner does not publish the mainboard types they use for their custom builds. To make planning easier for others here are the boards we saw in our machines:

  • EX62: Gigabyte B360HD3PLM-CF (U3E1)
  • AX100: MSI X399 HZ (SP3r2)

Installing Windows Server 2019

Booting from the Setup ISO

In order to be able to install your own OS, you need to ask Hetzner Support to connect a remote KVM console called LARA. I have described the process in detail in my earlier article.

You have two options to boot from the Windows setup ISO image:

  1. Copy the ISO file from another Hetzner machine to a Hetzner backup space or storage box and mount it from the LARA console
  2. Ask Hetzner support to copy your ISO to a bootable USB thumb drive and attach said drive to your server

Let me make this quick: the second variant works much better. Mounting ISOs from the LARA console results in extremely slow setup procedures that may run into timeouts after several hours.

Installing Missing Drivers

EX62

Windows Server 2019 does not come with drivers for the mainboard’s NIC, an Intel I-219. Install the Windows 10 drivers from Gigabyte for both the NIC and the Intel chipset.

AX100

Install the chipset driver from MSI.

Once that is done, there remain three unknown devices in Device Manager. For each of those, opt to install a driver manually and point the OS wizard to the extracted chipset driver you downloaded in the previous step.

The Intel I211 NIC requires more work. The Gigabyte driver cannot be installed because it is blocked on server versions of Windows. Nevertheless, download and extract it. Then proceed as follows:

  • In Device Manager, right-click the NIC and select Properties
  • Click the Driver tab, then Update Driver, then Browse my computer for driver software
  • Click Let me pick from a list of available drivers on my computer
  • Click Have disk
  • Browse to the following subfolder of the extracted files: PROWinx64\PRO1000\Winx64\NDIS65
  • Select e1r65x64.inf and click open
  • This brings up a list of NIC types. Select I210

The only downside we found to this little trickery is that the I211 NIC shows up as an I210.

Comments

Related Posts

Docker (Compose) Cheat Sheet

Docker (Compose) Cheat Sheet
This is a collection of tips and tricks I picked up while learning and working with Docker and Docker Compose on my home server and web server. Container Configuration Environment Variables Where to Define Environment Variables Environment variables are a common way to configure containers. To keep things organized, don’t put them in your Compose file but into dedicated files with the extension env. env_file vs. .env .env file: this “special” file can be used to set environment variable for use in the Compose file. The variables specified in .env are not available in the container. env_file: this section in the Docker Compose file lets you specify files that contain environment variables for use in the container. The variables specified in this section are not available in the Compose file. Bind Mounts vs. Docker Volumes Bind mounts let you control the directory structure. This has the advantage that you know exactly what gets stored where in the host’s file system. It has the disadvantage that you need to create the directory structure before you can start a container. Docker volumes are managed by the Docker engine. They’re stored in /var/lib/docker, “far away” from the Compose file. Personally, I very much prefer bind mounts because of the control they offer. I use subdirectories relative to the Compose file, e.g., ./data:/data. Keeping the container configuration and the container data in one place facilitates backups. Networking Expose vs. Ports Expose serves as documentation which ports a container is accessible on. Note: container ports are always accessible from other containers on the same Docker network. Ports makes container ports accessible to the host. Most of my services are accessible through the Caddy reverse proxy only. Opening ports to the host is, therefore, only rarely necessary. Static IP Address on the Host Network Use the Macvlan Docker network to attach a container directly to the host’s local network. Assign a static IP address by specifying the ip_range parameter in the ipam section of the Docker Compose file. See this configuration for an example. Disable Macvlan Container/Host Isolation Containers on a Macvlan network are isolated from the host. While the container can contact other machines on the local network, communications with the host are blocked. To work around that, create a virtual link with a route that points to the container’s IP address (example). Time Zone Containers should know about your local time zone. To achieve that, make it a habit to pass in /etc/localtime as a read-only volume to every container:
Virtualization & Containers

Latest Posts