| ### Setting up a gopher server on a RaspberryPi B+ ### | |
| Until now, my gopher was running on a full-blown Debian server (that was also | |
| tasked with a few other things). I decided to terminate this server due to | |
| maintenance cost, and pondered about shutting down the gopher service as well, | |
| after 12 years of solid service. But before doing so, I thought I'd try | |
| running it at home on some cheap RPi box. If it proves not to be too flaky | |
| or time consuming, I might leave it on for another 12 years or so. | |
| I have a few RPis laying around. For this gopher hosting task, I decided to | |
| go with the oldest one: a Raspberry Pi B+ from 2014. I chose this one mostly | |
| out of concern for power consumption - according to benchmarks found on the | |
| internet, all newer RPis have a higher consumption, even at idle time. | |
| Besides, gopher being a tech from the '90, it needs no CPU power anyway. | |
| I downloaded the latest available Raspbian release (took the "lite" variant, | |
| in the hope it was indeed light - but it was not). The image I downloaded was | |
| dated August 2020 and nicknamed "Buster" (/etc/debian_version says "10.4"). | |
| I made some minor changes to the boot/config.txt file: | |
| arm_freq=100 (sets CPU speed to 100 MHz, should keep it cool and low-power) | |
| gpu_mem=16 (limits GPU memory to minimum, 16 MB, so OS can use the rest) | |
| I also created an empty "ssh" file in the boot partition of the SD card, for | |
| enabling out-of-the-box ssh support. | |
| Powered the RPi and... yes, it actually booted and allowed me to log in via | |
| ssh using the default "pi" account. | |
| Then, I tweaked the ssh and IP configuration: | |
| /etc/ssh/sshd.conf -> enabled root login, disable password auth (and PAM) | |
| /etc/dhcpcd.conf -> set up a static IP address | |
| Since the distribution, despite claiming to be "lite", is kind of bloated, I | |
| removed (apt-get purge) "some" packages that I didn't feel useful to me: | |
| bluez bluez-firmware avahi-daemon dphys-swapfile dc logrotate libx11-6 ed | |
| libx11-data libxau6 libxcb1 libxdmcp6 bind9-host geoip-database libdaemon0 | |
| libavahi-common-data libavahi-common3 libavahi-core7 libbind9-161 libdns1104 | |
| libfstrm0 libgeoip1 libisc1100 libisccc161 libisccfg163 liblmdb0 liblwres161 | |
| libprotobuf-c1 avahi-daemon bluez bluez-firmware libnss-mdns pi-bluetooth | |
| firmware-atheros firmware-realtek firmware-libertas g++ lua5.1 luajit nano | |
| manpages manpages-dev ncdu ntfs-3g parted pigz rpcbind rsync triggerhappy | |
| alsa-utils fuse g++-8 libasound2 libasound2-data libbabeltrace1 libc6-dbg gdb | |
| libdw1 libevent-2.1-6 libfftw3-single3 libfuse2 libluajit-5.1-2 libtirpc3 | |
| libluajit-5.1-common libnfsidmap2 libntfs-3g883 libparted2 libpython3.7 iw | |
| libsamplerate0 libstdc++-8-dev libtirpc-common rsyslog curl wpasupplicant | |
| xkb-data console-setup-linux libcurl4 libnghttp2-14 libnl-route-3-200 dbus | |
| libpcsclite1 librtmp1 libssh2-1 man-db htop netcat-openbsd netcat-traditional | |
| rfkill unzip wireless-tools wireless-regdb libiw30 zlib1g-dev libfreetype6 | |
| libdbus-1-3 v4l-utils libnl-3-200 libnl-genl-3-200 libpng-tools libpng16-16 | |
| libpolkit-agent-1-0 libpolkit-backend-1-0 libpolkit-gobject-1-0 libncursesw5 | |
| python3-urllib3 python3-six python3-requests python3-idna openresolv libv4l-0 | |
| libjpeg62-turbo libv4l2rds0 libv4lconvert0 python3-certifi python3-chardet | |
| python3-pkg-resources libraspberrypi-doc gcc-5-base gcc-6-base gcc-7-base | |
| libboost-iostreams1.58.0 libfastjson4 liblognorm5 | |
| And proceeded with a minor upgrade: | |
| apt-get update | |
| apt-get upgrade | |
| apt-get dist-upgrade | |
| Once all was done, the OS was taking about 1 GiB of SD space... Still way too | |
| much to my taste, but I will leave it as it is for the time being. I can't | |
| fight progress forever. | |
| When configuring the network, I had set up the static IP by editing the | |
| /etc/dhcpcd.conf file, as advised by Debian. Weird idea to configure a static | |
| IP through a DHCP client if you ask me, but whatever works, right? Well, I | |
| then noticed that the DHCP daemon was still listening on a UDP/68 socket: | |
| root@raspberrypi:~# netstat -anup | |
| Active Internet connections (servers and established) | |
| Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name | |
| udp 0 0 0.0.0.0:68 0.0.0.0:* 280/dhcpcd | |
| Not cool! | |
| So I ended up doing it the good old way by adding a configuration file named | |
| /etc/network/interfaces.d/eth0, and removed all DHCP clients: | |
| apt-get purge isc-dhcp-client isc-dhcp-common dhcpcd5 | |
| Next, I downloaded the latest version of the Motsognir gopher server, built | |
| it (make), configured it and copied all my gopher content to the RPi. | |
| Finally, added a tmpfs-based /tmp in fstab and switched the partitions into | |
| read-only mode to forbid the system to wear off the SD card. | |
| Mounting / as read-only requires to pass a "ro" argument through the | |
| /boot/cmdline.txt file. I added there "fastboot" as well, to disable boot-time | |
| fsck checks (useless, since partitions are read-only anyway). | |
| Final reboot. Done. Let's see how stable this setup will be. | |