Running Tailscale on a Kobo Clara 2E

I recently wanted to sync my Kobo Clara 2E with my self-hosted Calibre-Web instance. My server is behind a Carrier-Grade NAT (CGNAT) and only accessible via Tailscale. Since the Kobo can't resolve my internal .home.wilkins.tech domains out of the box, I needed to get the device onto my tailnet.

Here are the steps I took to get Tailscale, SSH, and persistence working on a Kobo Clara 2E.

1. The Objective

The goal was to access http://100.x.y.z:8083 (my Calibre-Web instance) directly from the Kobo to natively sync books using the built-in "Kobo Sync" feature, without exposing the server to the public internet.

2. Enabling Telnet/SSH Access

The first step is running arbitrary commands on the device. NickelMenu is the standard tool for this.

  1. Connect the Kobo via USB.
  2. Download KoboRoot.tgz from the NickelMenu releases.
  3. Drop it into the .kobo/ directory on the device and reboot.

Once installed, I added a config file to .adds/nm/config to launch Telnet, which was necessary for the initial setup and debugging.

3. Installing Tailscale

I used the kobo-tailscale project. Since the Clara 2E shares the same i.MX6 SLL architecture and kernel 4.1.15 as the Libra 2, I used the libra2 binaries.

I downloaded the binaries manually and side-loaded them onto the device. The key components are:

4. Fixing Interactive Shells

One issue I encountered was that while I could run single commands like ssh root@kobo "uname -a", trying to get an interactive shell (ssh root@kobo) would immediately close the connection.

It turned out that the Kobo's boot scripts do not mount /dev/pts (pseudo-terminal filesystem) by default, which is required for interactive sessions.

The Fix: I modified the Tailscale boot.sh script to force-mount it on startup:

#!/bin/sh
# /usr/local/tailscale/boot.sh

# FIX: Mount devpts for interactive SSH shells
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts

# ... rest of startup script ...

5. Making it Persistent

To ensure Tailscale starts automatically on reboot, I used a udev rule (98-tailscale.rules) that triggers the boot script whenever the system initializes.

This setup ensures that on boot:

  1. tun.ko is loaded.
  2. /dev/pts is mounted.
  3. tailscaled starts up.

Conclusion

The Kobo Clara 2E runs a fairly standard Linux environment. With Tailscale installed, it becomes a full member of the homelab, allowing for secure book syncing from anywhere without complex port forwarding or public exposure.