-
On Building Custom Debian Kernels (and Backporting)
It’s not often in 2021 that you find yourself building new kernels, but nevertheless, the occasion comes that you need to either enable a flag—or even worse—patch the kernel. This happened recently: on DMOJ, we recently run into a kernel issue that misreports the memory usage for processes as an “optimization.” For more information about this issue, see the excellent blog post by my friend Tudor. As a result of this, I was forced to build a patched kernel to work around this issue. Since the process was far from easy, I decided to write this blog post to help others in the future.
Building a kernel is not too difficult, actually. The real challenge comes in the form of building the kernel in a maintainable way, which basically means that we should at least build the kernel into an easily installable package. For example, on DMOJ, we manage multiple judge virtual machines, and they all need to receive the same kernel. Furthermore, we want our custom build of the kernel to be distinct from the standard kernels that the operating system offers, as we don’t want a system upgrade to undo the patch that we applied.
In this article, we will explore the process I used to build a custom kernel package on Debian for the scenario described above. This will involve both patching the kernel and subsequently changing a configuration option. Specifically, we will be applying this patch. These instructions should work with minor adaptations for other Debian-based distributions.
-
Tor Onion Farming in 2021
Around four years ago, I wrote a blog post about creating vanity
.onion
domains for Tor. To recap,.onion
domains are special domains understood by Tor, and when visiting these sites, traffic never leaves the Tor network and is end-to-end encrypted, just as if you were to use HTTPS. Furthermore, the server’s identity is completely protected, if you are into that sort of thing. Also, the domain name is linked to the server’s public key fingerprint, and so knowing the.onion
domain is sufficient to authenticate the server and preventing any MITM attacks or certificate authority compromises that could happen with HTTPS.Recently, I decided that my password generator
correcthorse.pw
(GitHub) should also have a vanity onion domain, and naturally, I decided to generate some onions. -
Sharing Unix sockets between multiple users
I am sure that if you managed a Linux system for a while, you probably have dealt with Unix sockets—special files that act like sockets. You probably also run into permission issues when dealing with these socket files.
In this post, I’ll describe some methods of dealing with these permission issues, and a situation in which each might apply.
-
How to make an ARM virtual machine (armhf/aarch64)
Update (2022-03-19): I wrote about a new way to create an ARM virtual machine that’s simpler and handles kernel updates properly. I highly suggest you follow those instructions instead, unless you are building a chroot.
I noticed that very few people seem to know how to create a full ARM virtual machine, so I decided to create a quick guide.
This tutorial will use aarch64 and Debian as examples, but the same methodology should work for 32-bit ARM and other distributions. The instructions can also be adapted to create a simple chroot.
-
Run a Linux Program on a Different Network Interface
Sometimes, you have multiple Internet connections, whether physical or virtual, and you want a few programs to access the Internet through one connection without making it the default gateway. For example, if you want a program to connect to the Internet through a VPN, but without forcing the entire system’s traffic through the VPN as well.
The traditional way to do this is with packet marking with
iptables
and anip rule
to force marked packets through a different routing table to send the traffic to the correct destination. However, as the source IP was selected before routing, anSNAT
rule iniptables
is required to change the source IP. This is ugly and clearly a hack.However, since around 2013, Linux has introduced networking namespaces, which can be managed via
ip netns
as part of theiproute2
package. We can easily exploit this feature to achieve the desired goal with minimal fuss. -
Desktop Audio Visualizer with i3 and Cava on WSL
After seeing pictures of people running desktop audio visualizers on Reddit, I started to think if it is possible to replicate the effect on my i3-gaps setup running on Windows Subsystem for Linux (WSL).
-
Install Debian on a VPS Provider without Debian Images
Recently, I came across a VPS provider that does not provide Debian images. This is rather annoying since I much prefer a fresh minimal install of Debian over a “minimal” Ubuntu image that still has a lot of stuff that I don’t want.
Naturally, I decided to install Debian anyways, and came up with an approach to do so.
If you are feeling particularly bold, you can try running my pre-made scripts that would convert a fresh Ubuntu install to a fresh Debian install.
To use the scripts, you should download either the UEFI version or the BIOS version, depending on whether your current OS is using BIOS or UEFI.
At the top of the script, change the variables to match your system configuration. The most important one being
BOOT_DRIVE
so thatgrub
would be installed on the correct device.The scripts will prompt you for a root password and SSH keys. Once the script finishes, the system will be rebooted and you should be able to SSH into the now-Debian machine as root via the SSH keys.
If you don’t feel like using the script, I am also providing manual instructions. This also explains how the scripts work.
-
Using Unordered Data Structures on C++ std::pair
In many situations, it seems fairly natural to use
std::unordered_set
andstd::unordered_map
onstd::pair
. Here’s an example of what you might be tempted to do:#include <unordered_set> int main(void) { std::unordered_set<std::pair<int, int>> test; }
However,
std::pair
is not hashable by default, so a simple snippet like the above would not work.There are many proposals online to define a
pairhash
class and explicitly specify it as the hash function as a template parameter tostd::unordered_set
andstd::unordered_map
.This is not a bad idea. In fact, if you are writing a library, you should probably do this. But we can do better…
-
Simple NDP Proxy to Route Your IPv6 VPN Addresses
If you tried setting up an IPv6-capable VPN on a VPS provider that gave you an IP range to play with, perhaps a /64 or larger, you would want to assign some of the IPv6 addresses you have to your clients. In this post, we suppose that you have the range
2001:db8::/64
.This should be a simple process: enable the
sysctl
optionnet.ipv6.conf.all.forwarding
to1
(or whatever the equivalent is on your system), use DHCPv6 or SLAAC to assign the addresses to the clients, and then your client should have working IPv6.The Problem
Unfortunately, this is not so simple. Most VPS providers are not actually routing the entire subnet
2001:db8::/64
to you. Rather, they just connect a number of VPSes onto the same virtual Ethernet network and rely on the Neighbour Discovery Protocol (NDP) to find the router. -
On Invalidation of Aggressively Cached Static Sites
I have always wanted to make this website load fast everywhere in the world, despite the server being in Montréal, Canada, without investing heavily. It shouldn’t be hard: after all, it is just a bunch of static files, generated with Jekyll.
Cloudflare brings a free CDN. You can set a page rule to aggressively cache your website on their CDN edge nodes, allowing your site to load as if it is hosted locally, even if you are half a world away.
There is just a little problem: how do you efficiently purge the cache when you update your site? It is quite easy to purge the entire cache on Cloudflare, but that is rather inefficient: most of your assets probably did not change, and now they will all have to be fetched again.
Today I decided to tackle this problem by creating
purge-static
, a tool designed to purge your CDN cache. It can purge your Cloudflare cache for you. You can get started by runningpip install purge-static
.