Official Minecraft Bedrock Dedicated Server on Raspberry Pi*

Minecraft Bedrock running on Raspberry Pi
Minecraft Bedrock running on Raspberry Pi

One of the most requested features in my Raspberry Pi Minecraft server guide is support for the Bedrock edition of Minecraft. This is the edition that powers Minecraft on iOS / Android / Xbox / Nintendo Switch as well as the free Windows 10 edition.

There’s one big problem though. The official Minecraft Bedrock dedicated server is only compiled for Windows and Ubuntu X86_64. Without ARM support it seems impossible to run the Bedrock dedicated server on a Raspberry Pi. I couldn’t find a documented instance of anyone doing it anywhere.

So naturally today in this guide we are going to do the impossible. But right off the bat let me point out that there is an asterisk in my article title. Why you ask? That is because unlike my other guides this one will not yield you a well performing server. That is because we will be emulating a x86_64 processor on ARM. This is slow. VERY slow.

What’s the point?

So if the server doesn’t perform well and it’s too slow why did I even bother to write this article?

Basically “too slow” is only in the context of today’s hardware and software we currently have available to us. Both hardware and software for ARM have been evolving at a furious pace. ARM powers smartphones which means it is not going anywhere and will continue to have tons of R&D money put into it and it may not be long before the hardware is powerful enough.

There’s also the possibility that by sharing this work that someone who reads this may know or discover ways to speed things up and build on what I present here. If you’re one of those people drop me a comment or send me an email and I will gladly credit and share your work!

And last but not least, the techniques I use here can be used to run other x86_64 binaries on Raspberry Pi. Many applications will perform just fine even on current generation gear.

Hardware

This is the hardware I used for the server.  I always recommend using solid state storage for the best performance.  To see why check out the Raspberry Pi storage benchmarks section.  This contains benchmarks submitted by others who ran the benchmark so you can see what other people are using and provides the best performance.

Here’s the recommendations:

Raspberry Pi 4
Raspberry Pi 4

The Raspberry Pi 4 is available in different memory configurations all the way up to 8 GB. It’s about the size of a credit card and uses an extremely low amount of power making it ideal for all sorts of projects and ideas!

Links: AliExpress.com*, Amazon.ae*, Amazon.ca*, Amazon.com*, Amazon.com.au*, Amazon.com.mx*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.in*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.sa*, Amazon.se*, Amazon.sg*

Kingston A400 2.5″ SATA SSD

The Kingston A400 has been a great drive to use with the Pi for years. It’s reliable, widely available around the world, has low power requirements and performs very well. It’s also very affordable. This drive has been benchmarked over 1000 times at pibenchmarks.com and is the #1 most popular SSD among the Pi community!

Links: AliExpress.com*, Amazon.ae*, Amazon.ca*, Amazon.com*, Amazon.com.au*, Amazon.com.mx*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.in*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.sa*, Amazon.se*, Amazon.sg*

StarTech 2.5" SATA to USB 3.0/3.1 Adapter
StarTech 2.5″ SATA to USB 3.0/3.1 Adapter

Both the USB 3.0 and USB 3.1 variants of the StarTech 2.5″ SATA adapter work well with the Pi 4. I’ve used the 3.0 variant with my Pi 4 since launch and it has always worked well. I later bought the 3.1 variant and had the same positive experience. These two adapter variants are my go to adapters for all my Pi related projects that need a fast and easy 2.5″ SATA SSD!

Links: AliExpress.com*, Amazon.ae*, Amazon.ca*, Amazon.cn, Amazon.com*, Amazon.com.au*, Amazon.com.mx*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.in*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.sa*, Amazon.se*, Amazon.sg*

Or for a compact setup:

SanDisk Extreme Pro SSD

The SanDisk Extreme Pro USB SSD is a true solid state drive. This is different than a typical “flash drive” which uses extremely cheap memory and has very low random I/O performance/throughput compared to a real solid state drive. I’ve used both the USB 3.1 and USB 3.2 variants with the Pi successfully and they benchmark very well!

Links: AliExpress.com*, Amazon.ae*, Amazon.ca*, Amazon.com*, Amazon.com.au*, Amazon.com.mx*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.in,* Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.sa*, Amazon.se*, Amazon.sg*

SD card setup:

SanDisk Extreme A1
SanDisk Extreme A1

The SanDisk Extreme A1-A2 SD card has the best scoring SD card on pibenchmarks.com for years and is second in popularity only to the SanDisk Ultra (often included in combo kits). The application class (A1) means random I/O speeds (very important when running an OS) have to meet a higher standard. There’s no benefit on the Pi for A2 right now so get whichever is cheaper/available.

Links: AliExpress.com*, Amazon.ae*, Amazon.ca*, Amazon.com*, Amazon.com.au*, Amazon.com.mx*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.in*, Amazon.it*, Amazon.nl*, Amazon.pl*, Amazon.sa*, Amazon.se*

Game Editions

Minecraft: Bedrock Edition is the “Windows 10” version of Minecraft as well as the version of Minecraft on the Xbox / Playstation / Switch. The versions of Minecraft for Android and iOS are also the Bedrock edition.

All of these versions support cross-platform play with each other (but not with the Java edition).

This is the PC Minecraft for Windows 10 (Bedrock) edition of Minecraft. It is able to play cross-platform with other players on Android / iOS / Playstation / Xbox / Switch. Available as a code that is instantly activated to give you permanent access to the game!

Links: Amazon.com*, Amazon.co.jp*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.in*, Amazon.it*

This is the Microsoft Xbox version of Minecraft: Bedrock edition.

Links: Amazon.ae*, Amazon.ca*, Amazon.com*, Amazon.com.au*, Amazon.com.mx*, Amazon.co.uk*, Amazon.de*, Amazon.es*, Amazon.fr*, Amazon.in*, Amazon.it*, Amazon.nl*, Amazon.sg*

Linux Distribution

For this to work it is required that we use a 64 bit aarch64/arm64 distribution. This is because when we try to emulate 32 bit ARM we will get a “bus error” as soon as the server tries to start. This is likely because QEMU 32 bit is missing some support we need to emulate the x86_64 architecture.

Distributions that will work:

Since the server is natively compiled for Ubuntu it is best to use a Debian based distribution. For the Raspberry Pi I recommend Ubuntu Server 20.04 or 20.10. Check out my article on how to install Ubuntu Server on Raspberry Pi.

You can also use the Debian “Buster” preview which has the advantage of having QEMU 3.1 available in the apt repository right now which will save you several steps later of having to acquire a newer static binary of QEMU the “evil” way.

Raspbian will not work with this method unless you use the 64 bit beta because it is only 32 bit. You will get a segmentation fault when you run it on a 32 bit ARM system instead of a 64 bit one.

Automatic Setup Script

If you just want to get your hands on the finished working server my Minecraft Bedrock Dedicated Server guide already supports ARM and will setup the dependencies and download the server for you. It also supports the following:

  • Sets up fully operational Minecraft Bedrock edition server in a couple of minutes
  • Ubuntu / Debian distributions supported
  • Sets up Minecraft as a system service with option to autostart at boot
  • Automatic backups when server restarts
  • Updates automatically to the latest version when server is started
  • Easy control of server with start.sh, stop.sh and restart.sh scripts
  • Optional scheduled daily restart of server using cron

Run the automatic setup script by pasting / typing the following on the command line:

wget https://raw.githubusercontent.com/TheRemote/MinecraftBedrockServer/master/SetupMinecraft.sh
chmod +x SetupMinecraft.sh
./SetupMinecraft.sh

First Join

Before you join the server for the first time make sure the server has started by typing:

screen -r

You should be inside the Minecraft server console. What you want to look for before you try to join is that the server has completely finished starting. This can take a while on ARM. The line we want to see to know it’s ready is this:

[INFO] Server started.

The first time it joins will be very very slow. You may have to try several times as the server generates the starting area. Eventually you’ll get in and be able to move around. You’re able to break blocks but there’s definitely a delay when you break blocks and things are pretty laggy.

Manual Instructions

You only need to follow the manual instructions if you want to recreate my process step by step. Here are the steps:

Getting the Dedicated Server

The latest official dedicated Minecraft Bedrock server binary is available at: https://minecraft.net/en-us/download/server/bedrock/. We will download the Ubuntu Server version.

mkdir bedrock
cd bedrock
wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.16.0.200.zip
unzip -o bedrock-server-1.16.0.200.zip

We now have the Bedrock dedicated server unzipped into a folder called “bedrock”. However, if we try to run it by typing ./bedrock_server we get:

bash: ./bedrock_server: cannot execute binary file: Exec format error

This is because we are on the ARM architecture and this file type is compiled for x86_64. In Linux we can get the file type format of any executable by using the file command:

# file bedrock_server
bedrock_server: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, stripped

Now that we know what target architecture we need to run we need to get QEMU.

Installing QEMU Host Mode Emulator

You may have used QEMU before in the past to create virtual machines. But QEMU has another less known operating mode called user mode emulation. User mode emulation is faster than a virtual machine because it takes advantage of the host operating system to do a lot of functions rather than emulate an entire operating system.

On top of being much faster, this will allow us to run a x86_64 binary on the ARM platform without having to install a full blown x86_64 operating system inside a QEMU container.

At the time of writing the binaries provided in Ubuntu Server and Raspbian are too old and don’t have the x86_64 support we need. The binaries available in apt are QEMU 2.8 and we need 3.0 or higher.

Check what the latest version of QEMU available for your distribution is by typing:

sudo apt search qemu-user-static

On my system this yielded the result:

qemu-user/stable 1:2.8+dfsg-6+deb9u4 armhf
   QEMU user mode emulation binaries
qemu-user-static/stable 1:2.8+dfsg-6+deb9u4 armhf
   QEMU user mode emulation binaries (static version)

Notice the version is 2.8 and not 3.0 or higher. If your version is 3.0 or higher you can (and should) install qemu-user-static from apt.

Mine aren’t, so we are going to cheat. But before we cheat, I am going to explain why we are violating the Holy Sacred Linux Bylaws by doing what I’m about to show you and explain why it should basically never be used. If you are using the Debian Buster distribution you can skip the next section since QEMU 3.1 is already available in apt for Debian.

Evil way to get latest QEMU

The proper thing to do in this situation is to download QEMU from source and build the newer version yourself. The problem is QEMU takes forever and a day to compile. Even just trying to compile the user mode binaries I came back to my Pi a full 24 hours later and it still wasn’t even close to done.

Okay so building this binary in the Pi is too slow. So what is the proper thing to do then? The proper thing to do would be to set up a development machine for cross compiling on your main more powerful system and compile it that way. The downside? Unless you already have a system set up with a cross compiling chain this is going to also take a lot of research and effort to get set up.

So where could we possibly get precompiled binaries for our system? Well, since we are using a Debian based Linux distribution we are downstream from Debian proper. So let’s take a look at Debian’s repository and see what is available: https://packages.debian.org/buster/qemu-user-static

Well look at that. The upcoming Debian Buster repository contains QEMU 3.1! We can just grab it from there. But wait… RED ALERT!

Picard Facepalm
Captain Picard disliked that

This is very bad practice. The reason we can get away with it in this case is because qemu-user-static is statically compiled and only has one dependency (binfmt-support). All of the current stock Raspberry Pi distributions don’t have anything that depends on either of these packages. This makes qemu-user-static and binfmt-support relatively self contained. Nothing else in our system depends on them and they aren’t a part of any dependency chains.

Have you ever tried to install a package and been stopped by some little dependency? It may be tempting to use this technique in situations like that. However, when you introduce foreign packages into your package tree you will very likely break your entire system. If anything depends on those packages apt will go haywire since it won’t be able to resolve the dependency chains and you will lose the ability to update or install new packages. Many packages have dozens of dependencies and a single wrong one in the chain will break everything. Therefore this technique should almost never be used.

Okay, with all that out of the way, let’s proceed. First we are going to grab a prebuilt QEMU package for our ARM architecture. We can get these from the Debian repository. These links change often so you will need to navigate to the repository yourself and see what the latest available QEMU repository is. First we need to find qemu-user-static. Here’s where that will be in the Debian repository:

http://ftp.us.debian.org/debian/pool/main/q/qemu/

Make a note of the exact name of the package. You will need it in the next step. Now we need to find one more package which is binfmt-support from here:

http://ftp.us.debian.org/debian/pool/main/b/binfmt-support/

Once you’ve found these and made a note of the package names download them to your Pi like this:

wget http://ftp.us.debian.org/debian/pool/main/q/qemu/qemu-user-static_4.1-1+b3_arm64.deb
wget http://ftp.us.debian.org/debian/pool/main/b/binfmt-support/binfmt-support_2.2.0-2_arm64.deb
sudo dpkg --install binfmt*.deb
sudo dpkg --install qemu-user*.deb  

You should now have QEMU installed. You can verify this with the following:

# qemu-x86_64-static --version

qemu-x86_64 version 3.1.0 (Debian 1:3.1+dfsg-7)
 Copyright (c) 2003-2018 Fabrice Bellard and the QEMU Project developers

Your version should be a lot newer than mine since this output is from the date of publication but if you didn’t get an error you should be all set to move on to the next step.

Satisfying Dependencies

Now that we have QEMU installed if we try to run bedrock_server we get the following:

# ./bedrock_server
 /lib64/ld-linux-x86-64.so.2: No such file or directory

This is progress. We’re no longer getting an error that the system can’t read the binary format of the file. We are now met with a dependency error.

This is to be expected because we are running on a ARM system and don’t have any x86_64 dependencies installed. The Minecraft server executable is dynamically linked as we learned earlier with the file info tool. This means that we will need to provide some libraries for the executable to work.

The easiest and fastest way to get them is to install Ubuntu x86_64 on a virtual machine using something like VirtualBox or on a spare machine. If you want to download my copy of the dependencies and skip this step I have them zipped up at https://raw.githubusercontent.com/TheRemote/MinecraftBedrockServer/master/depends.zip

One alternative would be to set up a chroot environment containing a x86_64 environment but I have had nothing but problems trying to create such an environment on ARM. Usually the chroot will crash out QEMU and when you google the crash codes you will come across bug posts where the QEMU authors state that ARM to x86_64 isn’t used all that often and some things are unimplemented. This is also why we need to use QEMU 3.0 or higher to get the support we need to run the server as the support was improved in that version.

Once you have set up a x86_64 environment download the server like we did earlier and we will use the ldd tool to look up the dependencies. On your x86_64 installation type ldd bedrock_server:

# ldd bedrock_server
         linux-vdso.so.1 (0x00007fff04bb0000)
         libcurl.so.4 => /usr/lib/x86_64-linux-gnu/libcurl.so.4 (0x00007fb77c01b000)
         libCrypto.so => /home/james/minecraftbe/./libCrypto.so (0x00007fb77bdf0000)
         libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb77bbd1000)
         libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb77b9cd000)
         libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007fb77b763000)
         libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007fb77b2eb000)
         libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fb77b0ce000)
         libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb77ad45000)
         libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb77a9a7000)
         libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb77a78f000)
         libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb77a39e000)
         /lib64/ld-linux-x86-64.so.2 (0x00007fb780d6b000)
         libnghttp2.so.14 => /usr/lib/x86_64-linux-gnu/libnghttp2.so.14 (0x00007fb77a179000)
         libidn2.so.0 => /usr/lib/x86_64-linux-gnu/libidn2.so.0 (0x00007fb779f5c000)
         librtmp.so.1 => /usr/lib/x86_64-linux-gnu/librtmp.so.1 (0x00007fb779d40000)
         libpsl.so.5 => /usr/lib/x86_64-linux-gnu/libpsl.so.5 (0x00007fb779b32000)
         libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007fb7798e7000)
         libldap_r-2.4.so.2 => /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 (0x00007fb779695000)
         liblber-2.4.so.2 => /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007fb779487000)
         libunistring.so.2 => /usr/lib/x86_64-linux-gnu/libunistring.so.2 (0x00007fb779109000)
         libgnutls.so.30 => /usr/lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007fb778da4000)
         libhogweed.so.4 => /usr/lib/x86_64-linux-gnu/libhogweed.so.4 (0x00007fb778b70000)
         libnettle.so.6 => /usr/lib/x86_64-linux-gnu/libnettle.so.6 (0x00007fb77893a000)
         libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fb7786b9000)
         libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007fb7783e3000)
         libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007fb7781b1000)
         libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007fb777fad000)
         libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007fb777da2000)
         libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007fb777b87000)
         libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007fb77796c000)
         libgssapi.so.3 => /usr/lib/x86_64-linux-gnu/libgssapi.so.3 (0x00007fb77772b000)
         libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007fb7773fc000)
         libtasn1.so.6 => /usr/lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007fb7771e9000)
         libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007fb776fe5000)
         libheimntlm.so.0 => /usr/lib/x86_64-linux-gnu/libheimntlm.so.0 (0x00007fb776ddc000)
         libkrb5.so.26 => /usr/lib/x86_64-linux-gnu/libkrb5.so.26 (0x00007fb776b4f000)
         libasn1.so.8 => /usr/lib/x86_64-linux-gnu/libasn1.so.8 (0x00007fb7768ad000)
         libhcrypto.so.4 => /usr/lib/x86_64-linux-gnu/libhcrypto.so.4 (0x00007fb776677000)
         libroken.so.18 => /usr/lib/x86_64-linux-gnu/libroken.so.18 (0x00007fb776461000)
         libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fb776259000)
         libwind.so.0 => /usr/lib/x86_64-linux-gnu/libwind.so.0 (0x00007fb776030000)
         libheimbase.so.1 => /usr/lib/x86_64-linux-gnu/libheimbase.so.1 (0x00007fb775e21000)
         libhx509.so.5 => /usr/lib/x86_64-linux-gnu/libhx509.so.5 (0x00007fb775bd7000)
         libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007fb7758ce000)
         libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fb775696000)

Yikes. This thing has a ton of dependencies! This is because it is dynamically linked executable so none of the source code is compiled into the binary for any of these dependencies.

Fortunately I have a bash one liner that will gather a copy of all these dependencies and put it into a folder:

mkdir depends
ldd bedrock_server | grep "=> /" | awk '{print $3}' | xargs -I '{}' cp -Lv '{}' depends

Now zip or tar this folder and move it to your Raspberry Pi. We are going to put the dependencies right in the root of the bedrock folder that we created earlier. Your file structure on the Pi should now look something like this:

 bedrock_server               libgnutls.so.30      libresolv.so.2
 bedrock-server-1.10.0.7.zip  libgpg-error.so.0    librtmp.so.1
 bedrock_server_how_to.html   libgssapi_krb5.so.2  libsasl2.so.2
 behavior_packs               libhogweed.so.4      libssh2.so.1
 definitions                  libidn2.so.0         libssl.so.1.1
 depends.zip                  libk5crypto.so.3     libstdc++.so.6
 ld-2.28.so                   libkeyutils.so.1     libtasn1.so.6
 libcom_err.so.2              libkrb5.so.3         libunistring.so.2
 libCrypto.so                 libkrb5support.so.0  libz.so.1
 libcrypto.so.1.1             liblber-2.4.so.2     permissions.json
 libc.so.6                    libldap_r-2.4.so.2   README.txt
 libcurl.so.4                 libm.so.6            release-notes.txt
 libdl.so.2                   libnettle.so.6       resource_packs
 libffi.so.6                  libnghttp2.so.14     server.properties
 libgcc_s.so.1                libp11-kit.so.0      structures
 libgcrypt.so.20              libpsl.so.5          whitelist.json
 libgmp.so.10                 libpthread.so.0

Now for the last step there is one more dependency we need to resolve that won’t be included in the command we executed. This dependency is the linker dependency ld-2.28.so and the trick we are going to use in the next section won’t work on it. Use these commands:

sudo mkdir /lib64
sudo ln -s /home/pi/bedrock/ld-2.28.so /lib64/ld-linux-x86-64.so.2

This will install the linker binary where it needs to be for us to run the application by creating a symbolic link. The rest of the dependencies will be able to be in the folder that the server is running.

Running the Server

Now we have all our dependencies in place and are ready to run the server. I can’t wait to issue a ./bedrock_server! Let’s try it:

# ./bedrock_server

/lib64/ld-linux-x86-64.so.2: No such file or directory

Ugh. It’s looking for the dependencies in the wrong place! So how do we fix that? The trick is actually on the Minecraft Bedrock server dedicated server download page. We need to change the library load path to our local directory. So the proper way to run the server will be like this:

LD_LIBRARY_PATH=. ./bedrock_server

Now that we run the server this way we see the following output:

 NO LOG FILE! - setting up server logging…
 [2019-04-27 00:47:16 INFO] Starting Server
 [2019-04-27 00:47:16 INFO] Version 1.11.1.2
 [2019-04-27 00:47:16 INFO] Level Name: Bedrock level
 [2019-04-27 00:47:16 INFO] Game mode: 0 Survival
 [2019-04-27 00:47:16 INFO] Difficulty: 1 EASY
 Unknown host QEMU_IFLA type: 50
 Unknown host QEMU_IFLA type: 51
 Unknown host QEMU_IFLA type: 50
 Unknown host QEMU_IFLA type: 51
 Unknown host QEMU_IFLA type: 50
 Unknown host QEMU_IFLA type: 51
 Unknown host QEMU_IFLA type: 50
 Unknown host QEMU_IFLA type: 51
 Unknown host QEMU_IFLA type: 50
 Unknown host QEMU_IFLA type: 51
 Unknown host QEMU_IFLA type: 50
 Unknown host QEMU_IFLA type: 51
 Unsupported setsockopt level=41 optname=20
 Unsupported setsockopt level=41 optname=20
 Unsupported setsockopt level=41 optname=34
 [2019-04-27 00:51:14 INFO] IPv4 supported, port: 19132
 [2019-04-27 00:51:15 INFO] IPv6 supported, port: 19133
 [2019-04-27 00:53:48 INFO] Server started.

As we can see QEMU does complain about several missing QEMU_IFLA types. These messages relate to certain functionality not being implemented in QEMU yet. These can be safely ignored for now but hopefully if QEMU implements these later it will provide a speed boost to the server.

Another thing to note is the timestamps. The server takes some time to load when using emulation. The total time to reach the “Server started.” line was about 5 minutes. I told you it was slow!

You may now connect to the server but expect it to time out many of your connection attempts. When you do get in monsters will be very slow and glitchy. Breaking blocks will have a significant delay.

Conclusion

With the tools and hardware that are available to us today we are able to run the Minecraft Bedrock dedicated server on Pi but it is too slow.

Improvements in hardware and software such as more updates and better implemented of x86_64 emulation on the ARM platform will likely change this in the near future.

Another game changer would be if Mojang chooses to distribute a native ARM binary that we can run on the Pi. This would be *much* faster and would be the ideal scenario. Definitely send them an email or leave a comment on their feedback form if you want to see this!

I will update this article as things change going forward. If you are experimenting with this and find a way to speed things up definitely leave a comment here so I can credit you and publish your findings!

If your goal with this project was to have a small self contained Minecraft server that doesn’t use a lot of power I do have some alternative recommendations below to use in the mean time for getting a well performing Bedrock server!

64 thoughts on “Official Minecraft Bedrock Dedicated Server on Raspberry Pi*”

  1. Avatar for Lester

    I’m still getting this error:

    ./bedrock_server: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory

    Is there a dependency I’m missing and how to resolve?

    1. Avatar for jamesachambers

      Hey Lester,

      That’s an odd dependency! I believe libnsl.so.1 is just a part of libc. Let’s try:

      sudo apt install libc6

      There’s one more we can try if that doesn’t work:

      sudo apt install build-essential -y

      The build-essential should definitely get all these types of libraries in there!

      1. Avatar for Aaron

        Hi, I also face the same issue.
        I’ve tried the both apt install command, but the problem is not fixed.

        PS. While I was running the install command, it replied:
        “libc6 is already the newest version (2.28-10)” and “build-essential is already the newest version (12.6).”

        I also the find the libnsl.so.1 in the directory of “/lib/arm-linux-gnueabihf”

        Thanks for help.

        1. Avatar for jamesachambers

          Hey Aaron,

          That’s so strange! I wonder if a library has been updated. This is only on the Raspberry Pi I am guessing since you posted it in this thread. I will test it out here and see what I can find!

          1. Avatar for Aaron

            Thanks for your help.

            In additional for your information,
            1. when I type “ldd bedrock_server”, it replied “not a dynamic executable”
            2. My os version is: “Debian GNU/Linux 10 (buster)” which is the 64bit Respberry Pi OS

            Thanks.

              1. Avatar for Aaron

                Hi, the QEMU in my system is 3.1 already and I’ve

                qemu/stable,stable 1:3.1+dfsg-8+deb10u8 arm64
                fast processor emulator, dummy package

                qemu-user/stable,stable 1:3.1+dfsg-8+deb10u8 arm64
                QEMU user mode emulation binaries

                qemu-user-static/stable,stable,now 1:3.1+dfsg-8+deb10u8 arm64 [installed]
                QEMU user mode emulation binaries (static version)

                Thanks for your help and sorry for my lack of knowledge in Linux.

                1. Avatar for jamesachambers

                  Hey Aaron,

                  Can you try the package binfmt-support? That should be the package that registers the interpreter for QEMU for Debian. The equivalent on Ubuntu would be binfmt-utils but on Debian it’s a different package.

                  Give that a try and let me know!

  2. Avatar for Richy

    Thanks,
    I got my Pi4 running after getting the right libs from the same distro 20.04 Ubuntu off a X86_64 system.
    Great small playground for my children.
    Perhaps they will enjoy to hack around on RPi and Linux 😉

  3. Avatar for Anoymous

    hi i had my server up and running using this guide then it quited/ crashed does anyone know how to restart it withou getting a new ip adress

  4. Avatar for Peter Clements

    Also, I think there’s a small step missing….

    If you manually create your dependencies from your local PC (if you happen to be running Ubuntu 20.04 anyway) then you won’t find ld-2.31.so in the resulting directory.

    I guess you’d need to do something like:

    cp /usr/lib/x86_64-linux-gnu/ld-2.31.so depends/ld-2.31.so

    Thank you so much for the guide, would never have gotten Bedrock Server running on RPi without it!

    1. Avatar for jamesachambers

      Hey Peter,

      You’re absolutely right again! I did forget to put this step in the manual steps. That’s not good, because as you pointed out the linker version can vary! I’ll get this added in.

      When I ran the script on 18.04 originally I got the 2-28 linker and when I ran the steps again on 20.04 (to generate the updated dependencies) I ended up with 2.31. I think it depends on which version of the linker that your system’s qemu-user-static was built with so this may vary across different systems!

  5. Avatar for Peter Clements

    If you download and use the ZIP file, then a word of warning…

    It contains ld-2.31.so (not ld-2.28.so) so instead of:

    sudo ln -s /home/pi/bedrock/ld-2.28.so /lib64/ld-linux-x86-64.so.2

    use:

    sudo ln -s /home/pi/bedrock/ld-2.31.so /lib64/ld-linux-x86-64.so.2

    and you’ll be good to go.

    If you don’t, you’ll get the same error as you previously did:

    /lib64/ld-linux-x86-64.so.2: No such file or directory

    1. Avatar for jamesachambers

      Hey Peter,

      You’re absolutely right! I used to have ld-2.28 in there but I rebuilt the project on 20.04 to try and update the dependencies. That is definitely a problem with this approach!

      The other issue you may run into in the future is that the linker that the server is built against has changed before. That was one of the other reasons I updated the dependencies as some of the library versions had changed since my original build.

      Thanks for commenting though as this will really help clear things up for others trying to follow my footsteps through this process which is definitely not easy to wrap your head around! I see a couple other replies from you and I’m going to reply to each of them to keep things focused on each point. Thanks!

  6. Avatar for Brett Rogers

    “Ugh. It’s looking for the dependencies in the wrong place! So how do we fix that? The trick is actually on the Minecraft Bedrock server dedicated server download page. We need to change the library load path to our local directory. So the proper way to run the server will be like this:” I don’t understand HOW to implement this, ive typed in the following code, same error. No clue of what you mean when you say “change the local library path to our local directory”, when my path is root@ubuntu/home/ubuntu/Desktop/minecraft, isnt this my local directory?

    1. Avatar for jamesachambers

      Hey Brett,

      Great question! That is absolutely your local directory. It is also the directory we need to change the LD_LIBRARY_PATH to. That is the folder that the libraries are loaded from to support the server.

      To understand what I am saying in that paragraph go to the Minecraft Bedrock dedicated server download page.

      The official instructions to run the dedicated server are:

      UBUNTU SERVER SOFTWARE FOR UBUNTU
      Unzip the container file into an empty folder. Start the server with the following command:

      LD_LIBRARY_PATH=. ./bedrock_server

      Follow the bundled how to guide to configure the server.

      That first piece, LD_LIBRARY_PATH, is what we’re talking about in that paragraph. That is the piece we need to set to your server directory. Basically the LD_LIBRARY_PATH is an environment variable that tells the server where to find the other server files and libraries that it needs to run.

      In the example on the official Minecraft server page the LD_LIBRARY_PATH is set to . which just means the current directory. You would set yours to:

      LD_LIBRARY_PATH=/home/ubuntu/Desktop/minecraft ./bedrock_server

      This will set the LD_LIBRARY_PATH to your Minecraft server directory which will have the dependencies in there! It looks very weird, but that is exactly how you have to type it to launch the server (even on native x86_64 without the help of the scripts). You may be able to use the same dot syntax as well as long as you have navigated to the folder already in the terminal (you had done this and navigated to the folder already within the terminal) but I usually specify the full path since I’ve had issues in the past otherwise. Hopefully that helps!

      1. Avatar for Peter Clements

        Being a little OCD I wanted the lib files in their own directory and I also wanted to have the server run from a mounted USB drive, not my home directory.

        Doing so, my command became this, which you can run from any working directory (the brackets spawn a sub-shell so your working directory isn’t changed in your parent shell but aren’t actually needed):

        (cd /media/usb1/bedrock_server && LD_LIBRARY_PATH=./lib ./bedrock_server)

        “cd /media/usb1/bedrock_server” changes to the directory where I unzipped bedrock server to
        “&&” means the second command will only run if the first succeeded (rather than using a semicolon to separate commands)
        “./lib” is the relative path for /media/usb1/bedrock_server/lib (where I unzipped the contents of depends.zip to)

  7. Avatar for Jack Spence

    I can install and start the server, but I can’t connect to it. I am using a Raspberry pi 4 4gb with ubuntu 64bit desktop.

  8. Avatar for ArcticTurtle

    I have been trying many options like nukkit, pocketmine, in many different configurations and I was never able to get a good functioning server, until I found your page and your installation script was super easy so thank you for that. I have a couple of suggestions: Start in console without X and enable SSH (sudo raspi-config). Install firewall (sudo apt install ufw). Enable firewall (sudo ufw enable). Open the port in the firewall (sudo ufw allow 19132/tcp). Check that the server is accepting incoming connections on selected port when it has started (netstat -lu). You will want to check your ports open etc because even with the server running it is so slow on my RPi4 that I have so far not been able to start the game, only successfully connect and then get disconnected due to lag. At least by checking ports etc you will know it’s working.

    1. Avatar for jamesachambers

      Hey ArcticTurtle,

      I’m glad it was helpful! There are really not a lot of good options for a Bedrock server on the Pi but the problem I ran into is a lot of those other projects were really outdated, not compatible with the newer versions/features, etc. At least doing it this way you can *always* use the latest client and it supports 100% of all features since it is in fact the official server.

      You’re just about as far as I have got with gameplay. I think if you try a few more times you will be able to get into the game and actually move around. The first couple/few times I tried to join I got timed out as well as it generates the starting area/terrain which is incredibly hard on the Pi using emulation. After this gets completely generated you should be able to get actually in the game!

      The monsters will move *very* slowly (almost hilariously so) and there will be a good 1-2 second delay when you break a block before it appears on the ground. I think some of the options in server.properties have some effect on performance as well but I have not tried all combinations or done a ton of testing on these but in Java they can have a dramatic impact. Even if some of the options just slightly reduce CPU usage I think you would literally feel each improvement on the Pi.

      This is actually *much* more than this exact same script was able to do a year ago. QEMU’s x86_64 continues to be updated and there’s way less warnings on newer versions as well as better performance. Building the latest QEMU from source may even yield additional gains over the repository version too if you are really looking to push the limits!

      I feel like we’re maybe one more Raspberry Pi model away from it actually running fast enough to be playable. Maybe the Raspberry Pi 5, or the Raspberry Pi 4 B+ if they do one of those and give it a boost would be fast enough to do it alongside more QEMU improvements over time. Microsoft releasing a ARM binary for the server would definitely 100% be fast enough as well. It’s the emulation layer that is making the Pi not quite make the cut for playable performance.

      The only other thing in your control hardware-wise is your storage. If you’ve tried more than a few times and still can’t get in a game this may explain it. Do you have access to a SSD? This may speed things up enough for you to get in before it times out! This isn’t necessarily a requirement. I have been able to do it on high rated A1-A2 SD cards like a SanDisk Extreme but you definitely want to be using an application class (A1 – A2) at the very least.

      Thanks for all your suggestions/tips. I agree with every tip and suggestion you gave!

  9. Avatar for Ka Lam

    What about using dietpi OS (which has x86_64 variant) , running under VM Workstation on a Intel box, then run the BDS official x86_64 server under that?

    1. Avatar for jamesachambers

      That would absolutely work. The big problem with this one was that emulating the x86 instructions on the Pi with QEMU at the time was way too slow. I need to try it with the 8GB model but the bedrock_server binary is up to over 300MB in size just for the x86_64 binary. That is a lot of instructions/resources to translate and just loading the binary on older Pis used up a huge amount of resources relative to the Pi’s memory.

      By running it on x86_64 you are eliminating the need to do this very slow emulation. Using the x86_64 DietPi distro would completely eliminate the need for this translation and basically still be a Pi OS.

      It has been on my todo list for a very long time to try this on the 8GB Pi so it’s probably time to try it and update this!

      I’m not sure if anyone has tried it yet in that exact scenario, but theoretically the Bedrock server setup script should work as is on there. It works well for x86 in its current form and that’s how everyone who uses it pretty much is right now. I think I will give it another go here on the Pi and update the binaries and get that piece of it working. Last time it was so slow you timed out when joining before it could send you the map, but that has been years now and there was no 8GB. QEMU should have made substantial progress in that time speeding things up and optimizing.

      EDIT: I did end up updating it. It works again on the Pi. It’s still very slow, especially at loading the map and joining, but I can actually move around and break blocks now (with a 1 second lag delay), so that’s further than I got last time!

  10. Avatar for hao

    Hi,I encountered a problem during start
    # LD_LIBRARY_PATH=. ./bedrock_server

    *** stack smashing detected ***: terminated
    qemu: uncaught target signal 6 (Aborted) – core dumped

Leave a Comment

Your email address will not be published. Required fields are marked *

Type here..