说明

前段时间给斐讯N1改装USB Type C供电口,这样就可以使用充电宝供电随时随地使用了。便携性是有了,但是缺少输入输出设备,只能连接手机热点之后用手机SSH进去操作,不太方便。当然随身带个显示器和键盘也是不可能的…

想起来以前有人把Kindle作为树莓派的显示器。既然树莓派可以,N1同为Linux当然也应该能做到了。

Kindle系统基于Linux,root之后可以使用很多Linux命令,这里我们主要用到SSH。只要Kindle和N1同在一个网段,就可以在Kindle上通过SSH登录N1,登录之后就有很多可能性了,比如通过tmux、screen共享终端。Kindle的终端模拟器kterm内置软键盘,这样就可以把Kindle作为N1的显示器和键盘了,而且是支持触屏的键盘!

kindle_screen2

准备

从上面的原理来看,所有操作的前提是Kindle和N1处于同一个网段,这样才能SSH登录。实现这个前提有两种方法:一种是让Kindle和N1通过USBNet连接,另一种是连上同一个WIFI。本文主要探讨的是USBNet连接的方法,相比WIFI方案有如下优点:

  • 物理连接,稳定性好、速度快
  • 在Kindle休眠时不会断线(Kindle休眠断WIFI)
  • 便携(连接不依赖热点)
  • 供电方便(Kindle插在N1的USB接口供电、无需额外电源)

USBNet方案唯一的缺点就是Kindle与N1之间需要通过Mini USB线物理连接,而WIFI方案则不需要,相对来说使用时要优雅一些。

需要准备的软硬件

  • Kindle
    • 一台能JailBreak的Kindle
    • KUAL
    • USBNet
    • Kterm
  • N1
    • Tmux(或者screen)
  • 可选硬件
    • USB键盘(准备阶段写脚本、测试等)
    • 显示器

建立连接

Kindle的配置

1. JailBreak

Kindle需要JailBreak之后才能自行安装插件,新版本的固件已经不支持软JailBreak了。我有台KPW一代,幸好很久之前就破解了,这里就用它来当N1的屏幕吧。
有关Kindle的JailBreak资料可参考这里: Kindle Touch/PW1/PW2 5.0.x - 5.4.4.2 JailBreak. Plus FW 5.x USBNetwork., 下载地址在 Snapshots of NiLuJe’s hacks

2. 安装KUAL

KUAL是Kindle的一个应用载入器,我们可以把它理解为Windows的开始菜单或者Android的Launcher之类的。KUAL能够支持众多插件,后面要用到的USBNet就是其中一个。
KUAL的安装方法和相关信息可以在这里找到:KUAL: Kindle Unified Application Launcher

3. 安装USBNet

顾名思义,USBNet就是通过把Kindle当成一块USB网卡,这样N1就可以和N1建立物理连接了。
有关Kindle的USBNet资料可参考这里: Kindle Touch/PW1/PW2 5.0.x - 5.4.4.2 JailBreak. Plus FW 5.x USBNetwork., 下载地址在 Snapshots of NiLuJe’s hacks
下载后解压kindle-usbnet-0.22.N-xxx.xz,然后把extensions目录下的usbnet拷贝到kindle的extensions目录,把对应版本的升级文件(KPW一代是Update_usbnet_0.21.N_install_touch_pw.bin)放到mrpackages目录(不存在则新建一个)。
拔掉Kindle,然后启动KUAL,依次点击Helper -> Install MR Packages菜单,稍等一会儿提示安装完成并自动重启。

usb_net_install

安装完成之后需要配置一下SSH,方便我们通过N1管理Kindle,当然这个操作不是必要的。连上电脑,进入usbnet/etc文件夹将DISABLED_auto改名为auto,然后修改USE_WIFItrue,修改USB_WIFI_SSHD_ONLYfalse,最后新建一个authorized_keys文件添加一组公钥,这样就可以通过WIFI和USBNet登录Kindle了。完成这些步骤之后重启Kindle。

4. 启动USBNet

启动KUAL,一次点击菜单USBNetwork -> Toggle USBNetworkUSB Mass Storage模式和USB Network模式之间切换。当前状态可点击USBNetwork Status查看,成功的话提示USBNetwork enabled
可以打开kterm使用ifconfig命令查看网卡的地址。注意这里默认是192.168.15.x网段,和网上常见的192.168.2.x网段不同。这个配置是可以在usbnet的config文件修改的。

usbnet_ip

N1的配置

1. 配置网卡

将Kindle通过USB连接到N1,重启N1。不知道为什么不支持热插拔,只能重启才能识别。
输入lsusb命令,如果看到Linux-USB Ethernet/RNDIS Gadget这样的设备说明连接成功。

usbnet_card

编辑/etc/network/interfaces添加网卡配置:

1
2
3
4
5
6
7
8
9
10
# Kindle USBNet
allow-hotplug usb0
mapping hotplug
script grep
map usb0
iface usb0 inet static
address 192.168.15.1
netmask 255.255.255.0
broadcast 192.168.15.255
up iptables -I INPUT 1 -s 192.168.15.1 -j ACCEPT

重启N1,输入ifconfig usb0检查网卡是否连接成功:

usbnet_connection

此时可以ping 192.168.15.244检查Kindle是否能够连通。

2. 安装Tmux

tmux和screen都可以实现屏幕共享,但是我觉得tmux要强大很多,所以选择了tmux。

3. 自动打开tmux

N1这边需要实现的是登录tty1然后tmux,Kindle连上这个session后就可以和显示器同步了,可以使用Kindle的软键盘或者USB实物USB键盘同步控制。
可以通过连接USB和显示器的方式实现上述操作,但是我们的目的是为了脱离键盘和显示器,自动完成这些操作。

a. 自动登录
新建目录/etc/systemd/system/[email protected],新建文件`/etc/systemd/system/[email protected]/override.conf`,内容如下:

1
2
3
4
[Service]
ExecStart=
ExecStart=-/sbin/agetty --noissue --autologin 用户名 %I $TERM
Type=idle

这样每次启动的时候就可以自动登录了,牺牲了一些安全性,但是方便多了。

b. 自动打开tmux
根据需要在.bashrc.profile.zshrc等某个文件添加tmux的自启动代码。我用zsh,所以在.zshrc文件添加。

1
2
3
4
5
6
7
# start tmux on console(not ssh)
if command -v tmux>/dev/null; then
if [[ "$(tty)" =~ /dev/tty ]] && [ -z "$TMUX" ]; then
# We're on a TTY and *not* in tmux
exec tmux -u
fi
fi

重启N1,可以在屏幕上看到自动登录并且启动了tmux。

4. 自动连接

在Kindle的/mnt/us/extensions/kterm/bin目录新建一个n1脚本文件,实现自动登录N1并连接到tmux session的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash

# This script checks if kindle is connected to a Linux host via USBNet
# then try to attach to a tmux session from the host
# Author https://www.shuyz.com
# Update date: 2019/11/11 23:32

HOST=192.168.15.1
PINGTIMEOUT=2

USER=lance
SSHKEY=/mnt/us/extensions/data/k3

# Check if USBNet is enabled
if [ -z "$(ifconfig | grep usb0)" ]; then
echo "USBNet is not enabled."
exit 1
fi

# Check if HOST is accessable
isConnected=$(ping -w $PINGTIMEOUT -c 2 $HOST | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
if [ -z $isConnected ]; then
echo "$HOST is not accessable!"
exit 1
fi

# Get the list of tmux sessions
sessionCnt=$(ssh $USER@$HOST -i $SSHKEY "tmux ls" | grep 'windows' | wc -l)
if [ $sessionCnt -lt 1 ]; then
echo "No tmux session found!"
exit 1
fi

# Try to connect to the first session
#ssh [email protected]$HOST -i $SSHKEY -t "tmux attach"
ssh $USER@$HOST -i $SSHKEY -t "tmux attach -d"

修改kterm的启动脚本将kterm的bin目录添加到PATH

将Kindle连上N1,重启N1,然后在Kindle上打开kterm,输入n1命令即可登录。
此时Kindle的屏幕与电脑屏幕完全同步:

screen_sync

脱离键盘和屏幕,使用Kindle完全控制N1:

kindle_screen1

参考资料