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.
- Connect the Kobo via USB.
- Download
KoboRoot.tgzfrom the NickelMenu releases. - 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:
tailscaled: The background daemon.tun.ko: The kernel module (compiled for Kobo's specific 4.1.15 kernel).boot.sh: The startup script to load the module and start the daemon.
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:
tun.kois loaded./dev/ptsis mounted.tailscaledstarts 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.