smallest dog

Signal on FreeBSD

Share on Twitter

Signal (the chat service) doesn’t have an official client for FreeBSD. But my entire household talks to each other primarily via Signal and I recently switched to FreeBSD as my desktop’s only operating system.

FreeBSD’s Linux Emulation

I tried using FreeBSD’s Linux Binary Compatibility (also known as the “Linux Emulator” or “Linuxulator”) to run the official Debian client. This didn’t go well. I also, unfortunately, didn’t document it and have at this point forgotten most of what I discovered.

Given how much I use Signal and how frustrating it was to not have it on my desktop, I decided to focus on an approach that seemed like it would be usable more quickly, even if it wasn’t as nice.

I’ll likely revisit using Linux Binary Compatibility in the future.

Debian VM in bhyve

Skipping over like an hour of me failing at reading documentation, I wound up setting up a Debian VM using bhyve.

bhyve is a hypervisor. This is about all I know about it. Everything after this paragraph is me basically using my General Knowledge About Virtual Machines™ combined with copy/pasting/editing a bunch of stuff from the FreeBSD Handbook. (It’s mostly the latter, honestly.)

Setting up a VM

I don’t know what I’m doing.

Go to debian.org and click the big “Download” button. You’ll get debian-10.10.0-amd64-netinst.iso or something like that.

Make sure you’re root. Also, be careful, you’re root. Surprise.

First, do everything in 22.7.1 “Preparing the Host”.

Acording to history | grep bhyve, at this point I ran something along the lines of the following commands.

(# is the prompt, and also means if you copy/paste this without paying attention it’ll be a comment — wait, is that why they make # the root prompt?)

# mkdir ~/vms/debian
# cd ~/vms/debian
# truncate -s 20G debian.img
# printf "(hd0) ./debian.img\n(cd0) ./debian-10-10.0-amd64-netinst.iso\n" > device.map
# grub-bhyve -m device.map -r cd0 -M 2048M debian

This drops you into GRUB. In your terminal. Neat. Choose the non-graphical install, because you’re working in a terminal and things will get awkward otherwise. It’ll exit abruptly. Don’t worry, that’s expected. Debian won’t run until we run the next command. Again, history | grep bhyve, tells me it vaguely resembled this:

# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./debian.img -s 4:0,ahci-cd,./debian-10.10.0-amd64-netinst.iso -l com1,stdio -c 4 -m 2048M debian

Then you do the install. Make sure you get an SSH server — we’re using that later! I don’t know whether you need a DE and Xorg and all that. I personally chose Xfce, and disabled LightDM once everything was installed. Continuing again:

# bhyvectl --destroy --vm=debian

Don’t worry, the disk image still exists, and that’s the important part.

Now we’re at the exciting part: starting the fresh Debian installation!

# printf "(hd0) ./debian.img\n" > device.map
# grub-bhyve -m device.map -r hd0,msdos1 -M 2048M debian
# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./debian.img -l com1,stdio -c 4 -m 2048M debian

Log in with the root credentials for the new VM. Then, go to the Signal download page, get the download instructions for Linux (specifically Debian-based distros), and copy/paste it into the VM’s shell. Disable the display manager, if any. (For LightDM, that’s systemctl disable lightdm && systemctl stop lightdm.)

Then, open up a non-root terminal. Now we’re doing to ssh in to the VM, with X forwarding enabled (-X), and run Signal. The --no-sandbox flag is the only way to run Signal — it’s in the .desktop file for it, too. My username in the VM is puppy and my VM’s hostname is debian-cerberus. Adjust the command for what you entered during installation.

$ ssh -X puppy@debian-cerberus signal-desktop

We’re almost done, now! Once you log in, you may notice it freezes for roughly two minutes after you receive a message. That’s no good.

If you have that problem as well, go to File -> Preferences -> Notifications -> Disable Notifications. That should fix it.

I also disabled spell checking, because it made it noticeably faster.

Conclusion

This works but it’s awkward as fuck and really should not be necessary.

SIGNAL PLEASE MAKE AN OFFICIAL FREEBSD CLIENT. WITHOUT ELECTRON. PLEASE.

Alternatively, someone else: PLEASE MAKE A VIABLE ALTERNATIVE TO SIGNAL THAT IS ACTUALLY SECURE AND DOESN’T USE ELECTRON.