Based on the comments and feedback from my older guides I have added many requested features and fixes. It has changed so much since 1.12’s World of Color that my old guide is now obsolete and it’s time for the 1.13 Aquatic era update!
This script and guide are written to help you get a great performing Raspberry Pi Minecraft server up and running in only a few minutes.
I play on my server with 3-4 players on Survival mode without any difficulty on default settings (vanilla view distance of 10 and normal entity spawns/ranges). Above that number of players you will want to look into hardware with more memory but if you just want to play with a few friends it will be an excellent experience!
- Sets up fully operational Minecraft server in a couple of minutes
- Raspbian / Ubuntu / Debian distributions supported
- Installs and configures OpenJDK 9 (or OpenJDK 11 if available)
- Sets up Minecraft as a system service with option to autostart at boot
- Automatic backups to minecraft/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 Pi using cron
- Optional configuration of video memory to 16MB (default 64MB) and overclocking MicroSD reader to 100Hz (default 50Hz) for maximum performance
- Raspberry Pi model with 1024MB of RAM. Basically a Raspberry Pi 2B or higher. (No Zero unfortunately, 512MB is not enough RAM to do this, I’ve tried!)
- Headless Linux distribution such as Raspbian Stretch Lite, Ubuntu Server 18.04.2, or any Debian based distribution (GUI distros can be used at the expense of available RAM and server performance)
- Solid state drive highly recommended but not required.
You can get a SSD setup on a Pi for < $30. See my article here for details
- If using MicroSD you want to be using a mid to high range card otherwise you will really be hurting on IO when the server is reading/writing chunks of terrain. Your card’s name should have lots of Pros/Ultras/Extremes in the title! Click here for MicroSD card benchmarks/recommendations.
Or for a compact setup: SanDisk Extreme Pro 128GB USB Solid State Flash Drive
Choosing a Linux Distribution
The most important consideration when choosing which flavor of Linux to run the server on is simple: available RAM. Headless Linux distributions such as Raspbian Lite that don’t have a built in GUI have substantially more memory available for the Minecraft server.
Our biggest obstacle when running a Minecraft server on the Pi is available RAM since 1 GB is extremely low for this type of server. To have a playable experience you should not be running anything else on the Pi so all memory is available to be used.
After testing on many different distros I am finding Raspbian Lite and Ubuntu Server 18.04.2 32-bit to be the best choices. These distributions come with very few background processes and have rock solid support and performance.
64-bit vs 32-bit
There’s a lot of discussion in the Pi world about the up and coming aarch64 64-bit distributions vs. armhf 32-bit distributions. They have been and continue to improve dramatically. There are already use cases where 64-bit is far superior such as video encoding, advanced compression, etc.
So how about for running a Minecraft server? I have been testing extensively with Ubuntu Server 18.04 64-bit and the Debian Buster 64-bit. I have consistently had worse performance and stability than on 32-bit versions of the exact same distros.
But how can that be? It’s certainly true that Minecraft servers benefit in CPU performance from 64-bit versions of Java. The answer is actually incredibly simple: memory. The server running on a 64-bit Java Virtual Machine uses a minimum of about 100 MB more memory. This makes perfect sense because 64 bits > 32 bits by definition!
The Raspberry Pi’s 1 GB of memory has been the biggest obstacle for this project since the very beginning. Back when I first went into the Paper Minecraft developer IRC room and told them what I was trying to do I was practically laughed out of the chat room for even thinking of trying this. Most Minecraft server branches including vanilla can’t even start on the Pi because of the limited memory.
For a dedicated Minecraft server on the Pi I very highly recommend staying 32-bit. You will have more available memory which means it will be much faster and more stable. Since memory is our bottleneck the increased CPU throughput does not help us and losing *any* of our memory is disastrous!
If the Raspberry Pi 4 has more memory like we all expect it to this recommendation will change completely. Even 2 GB of memory would make the extra memory that 64-bit uses a non-issue and the CPU throughput performance gains very desirable. For now though stay 32-bit for a Minecraft server!
Raspbian Lite – It’s Raspbian. It has very low memory usage and is the official distribution of the Raspberry Pi. The server runs very well on this. One downside is it does not have packages for OpenJDK 11 (OpenJDK 9 is the newest one in the Raspbian repository at time of writing). It’s overall a great choice.
Ubuntu Server 18.04.2 – Ubuntu Server is my favorite Linux distro. I use it for nearly all of my projects. The performance of the 32-bit armhf version is on par and in some ways superior to Raspbian due to the availability of OpenJDK 11 on Ubuntu. It’s a fantastic choice! Click here for my Ubuntu setup guide for Raspberry Pi. The 64-bit version is not a fantastic choice and not recommended because of the higher memory usage. Stick with 32-bit and you’ll be a happy camper with Ubuntu Server.
Debian Buster 64-bit – Debian is the distribution Raspbian is based on. This version is a preview of Debian “Buster” which is the successor to Stretch and will be the next version of Raspbian when it is released. I like this distribution but it is currently still unofficial and unsupported. Performance and stability was less than Ubuntu and Raspbian.
Benchmark Your Storage
Make sure your storage is running fast enough to be an effective Minecraft server. I wrote a benchmark for this purpose to make this extremely easy. To get accurate results make sure nothing is running when the benchmarking is taking place.
Run the benchmark by pasting/typing:
sudo systemctl stop minecraft
curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash
Ideally you will score around 1000 for a good quality Micro SD card (and much higher for solid state storage). A low score (< 700) here indicates here that it is probably time to upgrade to a solid state drive or a faster Micro SD card.
You can still run the server if you’d like with a low storage score but be advised when operations like saving the server’s blocks take place the people online may experience quite a big of lag!
SSH into your Raspberry Pi and paste the following commands:
chmod +x SetupMinecraft.sh
The script will setup the Minecraft sever and ask you some questions on how to configure it. I’ll explain here what they mean.
“Set clock speed to 100 MHz? Requires reboot. (y/n)?” – Highly recommended but at your own risk. This will overclock your MicroSD card reader for you to 100 MHz giving you much faster read/writes on your server.
There are some cards (usually cheap ones) that can’t handle this overclock and will fail to boot afterward. If this happens don’t panic! You can simply undo the overclock by connecting the MicroSD/SSD to your computer and removing the line dtparam=sd_overclock=100 from /boot/config.txt. Save and reboot the Pi. Run MinecraftSetup.sh again and choose ‘no’ the next time.
“Change GPU shared memory to 16MB? Requires reboot. (y/n)?” – This is recommended for everyone. Unless you are running on a GUI distro you would be crazy not to do this! Since we are running a headless lite distribution we don’t need any more than the bare minimum of 16MB. That extra memory makes a gigantic difference when we are only working with 1 GB total.
“Enter amount of memory in megabytes to dedicate to the Minecraft server” – The amount of memory that will be dedicated to the Minecraft server. The more the better, but you must leave some room for the operating system background processes.
If you exceed the total available memory either the server will crash or the Pi will get incredibly slow to the point where your SSH session will start timing out. The setup script will make a recommendation to you which is your available memory – 10% for headroom. If you aren’t sure what to put just go with the recommended amount.
“Start Minecraft server at startup automatically (y/n)?” – This will set the Minecraft service to start automatically when your Pi boots. This is great because whenever you want to play you can just plug it in and go without having to SSH in.
“Automatically reboot Pi and update server at 4am daily (y/n)?” – This will add a cron job to the server that reboots the Pi every day at 4am. This is great because every time the server restarts it backs up the server and updates to the latest version. See the “Scheduled Daily Reboots” section below for information on how to customize the time or remove the reboot.
That is it for the setup script. The server will finish configuring and start!
The first time you run the server it will take a little longer to start since it is generating all the server data. If you try to log in before it fully starts you will get a connection timeout error. Watch for the line: “Timings Reset”. This is the last line that prints when the server is ready to rock and roll. At this point you will be able to connect successfully.
The very first time you log into the server it will be slow for about 1-2 minutes. This is because since nobody has logged in before the server has to scramble to generate all the chunks within your view distance (10 by default) and send them to you/store them. During this time you may not be able to see very far and if you try to destroy blocks there will be noticeable lag from when they break to when they actually disappear.
Don’t panic! This will go away within a couple of minutes as the Pi catches up with all the first time login stuff it needs to do. Performance stabilizes and it will feel very much like the offline experience after that.
If you are hosting for a few friends I’d recommend logging in for the first time right after you set up the server instead of having several people nail a blank server at first startup. This gets it out of the way and when everyone is ready to log in the starting area chunks will be fully fleshed out and the Pi just has to read them. It’s an order of magnitude faster for the Pi to read chunks than to generate and store chunks.
In my experience after the initial login exploring new parts of the server doesn’t cause any lag even though new chunks are being generated. The reason for this is that when you’re walking it’s really only having to generate a new chunk as you get close to the border instead of a huge square area of chunks in all directions and all at the same time like during the first login.
Start, Stop and Restart Server
The server can be started, stopped and restarted two different ways. You can use the provided scripts in the Minecraft folder or you can use systemctl. Here are the commands:
sudo systemctl start minecraft
sudo systemctl stop minecraft
sudo systemctl restart minecraft
The server backs up each time it starts. This helps you recover easily if something goes wrong. This system works best if you configured the server to restart daily since it means you will have a backup every day.
To access these backups type:
When a backup is made the filename will be the date and time the backup was taken. If you need to restore a backup it’s very easy. Substitute the timestamp in my example to the backup you want to roll back to. Type:
rm -rf world world_nether world_the_end
tar -xf backups/2019.02.15.22.06.30.tar.gz
Your world has now been restored! It’s a good idea to download these backups off the Pi periodically just in case the Pi’s storage fails.
Scheduled Daily Reboots
The daily reboots are scheduled using cron. It’s very easy to customize the time your server restarts.
To change the time that the server restarts type: crontab -e
This will open a window that will ask you to select a text editor (I find nano to be the easiest) and will show the cronjobs scheduled on the Pi. The Minecraft one will look like the following:
0 4 * * * /home/ubuntu/minecraft/restart.sh
There are 5 fields here. The default restart time is set to reboot at 0 minutes of the 4th hour of the day (4 AM). The other 3 fields are left as * to represent every day of every month. Make any desired changes here and press Ctrl+X to exit nano and update the cronjob.
To remove the daily reboot simply delete the line and save.
Reconfigure / Update Scripts
The scripts can always be reconfigured and updated by downloading the latest SetupMinecraft.sh and running the installer again. It will update all of the scripts in the Minecraft directory and reinstall the startup service for you.
Running SetupMinecraft.sh again will also give you a chance to reconfigure options such as the memory dedicated to the server, daily reboots, starting the server on boot, etc.
This will not overwrite your world or any other data so it is safe to run!
If everyone on your server is on the same LAN or WiFi network as you then you don’t need to do this. If you want people to connect from outside your local network then you need to set up port forwarding on your router.
The process for this is different for every router so the best thing to do is just look at your router and find the model # and put that in google with port forwarding for easy instructions on how to do it for your specific router.
You want to forward port 25565. The type of connection is TCP if your router asks. Once you do this people will be able to connect to your Minecraft server through your public IP address. This is different than your local IP which is usually a 192.x.x.x or 10.x.x.x. If you don’t know what that is just go to google and type “what’s my ip” and Google will kindly tell you!
Wired vs. Wireless
Going with an ethernet (wired) connection is going to be faster and more reliable. There’s so much wireless traffic and other interference in the air that running your server on WiFi is not recommended.
Even if it is working great 99% of the time it can ruin your experience very quickly if the WiFi drops for a couple of seconds and you get blown up by a creeper!
All that being said, the server works fine on wireless. The script will work fine as is with a wireless connection.
OpenJDK 9’s new garbage collector has made running a server on the Raspberry Pi feel great! We can run at the default view distance of 10 with default entity settings.
If you have any feedback or suggestions let me know in the comment section. A lot of the new developments in this script were directly from comments to the older articles.