Foreword
最近因为要学python,加上对于linux系并不是非常了解,操作也不熟练,干脆买了块Raspberry Pi来学习,刚好有换下来的老屏也是hdmi接口的当作是树莓派的屏幕好了,于是发现要操作树莓派还得另需一副鼠标键盘,之前也有过用PieTTY | PuTTY的经验,依然还是想试试看有没有共享鼠键的方式(其实老早之前有想尝试通过usb/串口连接两台电脑,加上上位机,当鼠标滑出屏幕之后切换到另外一边的显示器去实现鼠键共享,后来发现驱动部分非常麻烦,就暂时搁置了). |
1.KVM切换器
用KVM切换器来解决(就是稍微有点贵,我想的是有一根usb线 一头是母头,两头是公头,带开关切换连接的公头,从而就可以1控2甚至更多,然而并没有这样的线,自己想的话可以DIY一个)
2.Synergy
通过 Synergy在局域网内共享一台电脑的键盘/鼠标,就可以控制多台电脑,可以设置通过快捷键切换屏幕(也可设置鼠标在屏幕边缘即可切换),可以共享剪贴板(在任意屏幕的剪贴板操作都可以带到其他屏幕上)。Win 版本有图形界面,Mac 版本只提供命令行,并且需要自行配置文件(我没Mac),Linux 版本有图形的也有命令行的。(其实Synergy的github上是有通过usb连接来共享的code)
毫无疑问这里我要选择使用Synergy来完成和树莓派的共享鼠键.非常感谢引用中的三位博主,我是借鉴了他们的才弄好的。
Windows & Synergy
我是Windows 10 能正常使用Synergy,那其他版本Windows应该问题不大。 这个是Synergy的github,可以直接下到源代码,Windows下我是直接从网上下了一个synergy-1.7.4-stable的目前(2015年11月1日)的最新版本,Synergy的官网需要你购买才能下载,实际上安装的时候跳过注册也能正常使用。
https://github.com/synergy
安装完后,按照界面选就可以了(服务端,IP地址高亮的就是你的局域网IP,也是应该填到另一台机器的IP(建议先进路由把两台机器的IP设置为静态的,不然DHCP换IP地址比较麻烦)
设置服务端,从右上角要把那个电脑拖过来放到你主机的对应上下左右的位置上,起好名字(另一台机器也必须是这个名字,我之前没注意名字打错了,死活连不上)
剩下还有热键等设置自己琢磨就好了,这里可能还会遇到比如某个按键不好使:shift等,那是版本太低就会有这个问题,之前我是树莓派是最新版,win是个低一些的版本,果断shift怎么都用不了,换成最新版本的就好了
环境
Camera:树莓派原装的摄像头
system:2015-09-24-raspbian-jessie
RaspberryPi:Raspberry Pi 2
RaspberryPi & Synergy
-
从上面的github下源码到树莓派中去
-
解压源码,解压完了之后一定要解压./ext/下的openssl gtest gmock 三个压缩包,不然一会链接和编译的时候都会找不到各种文件。
-
进入源码目录,先尝试
./configure
如果没有意外,应该会提示cmake相关的,大概就是cmake没装
./configure ... ./configure: line 1: cmake: command not found sudo apt-get install cmake
装完cmake,继续缺少X11,继续安,应该还会提示xtst
./configure ... CMake Error at CMakeLists.txt:203 (message): Missing header: X11/Xlib.hX11/XKBlib.h -- Configuring incomplete, errors occurred! sudo apt-get install libx11-dev sudo apt-get install libxtst-dev
我又出现了Missing library:curl 装了这个之后就能继续了
sudo apt-get install libcurl4-openssl-dev如果不是以上的错误,那仔细看一下错误提示是哪里的文件,哪行代码,缺少了什么东西 比如:
CMake Error at CMakeLists.txt:203 (message): Missing header: X11/Xlib.hX11/XKBlib.h -- Configuring incomplete, errors occurred!
就需要去看一下203行到底写了啥为什么没找到这个头文件
# add include dir for bsd (posix uses /usr/include/) set(CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH}:/usr/local/include") set(XKBlib "X11/Xlib.h;X11/XKBlib.h")
发现认为文件在/usr/local/include中实际上是在/usr/include才有x11的头文件,修改一下这里就能继续了。 中间如果还提示缺少openssl gtest gmock等文件,那肯定是第二步没做,或者是放的文件夹不对,看错误提示修改一下解压的文件夹就没问题了。 如果没错了就能开始make了
-
make,make时碰到的错误基本和上面一样,是一些头文件找不到,对应找到以后修改一下源码中的位置就奔最后就能ok了,大概要编译10分钟左右,就完成了
我出现了:
cannot find -lssl sudo apt-get install libssl-dev
之后恢复正常 一般出现了:
/usr/bin/ld: cannot find -lxxx
是指缺少lab xxx 那么只要对应安装xxx就行了
sudo apt-get install libxxx-dev
参考这里
http://blog.csdn.net/a936676463/article/details/8480672
-
复制到/usr/bin中去
sudo cp -a ./bin/. /usr/bin
-
开机自动启动Synergy,不然每次还得插个键盘啥的启动一下多麻烦。在/etc/init.d/中新建synergy然后编辑成下面的内容。
解释一下这里的参数 - –daemon是将synergy作为后台程序 - –name 是指客户端的名字 填写你自己的到这里 - –restart 是指断线后重连(不是重启服务,只是重连而已,实际上我遇到的就是直接死了,只有pkill进程以后重新开才能恢复,所以这里就没办法了) - –log /home/pi/log 可以把日志输出到这个目录的log文件中,实际上我每次开启以后都会出现dup2的error,但是程序是正常的,并不影响 - 还有其他-d debug 参数什么的 没有仔细研究
### BEGIN INIT INFO # Provides: py_synergy # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: synergy initscript # Description: This service is used to manage the synergy ### END INIT INFO #!/bin/sh #/etc/init.d/synergy case "$1" in start) cd /home/pi/synergy-1.4.10-Source/bin/ su pi -c './synergyc --daemon --name Pi --restart 192.168.0.1' echo "Starting synergy client..." ;; stop) pkill synergyc echo "Attempting to kill synergy client" ;; *) echo "Usage: /etc/init.d/synergy (start/stop)" exit 1 ;; esac exit 0
这里必须用su pi -c 命令 不然会导致使用sudo service start等所有以sudo开头的命令无法使用。 比如 我直接减去了 cd 和 su 命令 如下
synergyc --daemon --name pi --restart --log /home/pi/sylog 192.168.1.104
用这个命令代替,那么结果就是服务无法启动,虽然执行了,但是你会发现synergyc进程根本没启动 当然,我用这个命令的前提是 我把 synergy编译后的./bin目录下的权限都改为了777 并且复制到了/usr/bin 的目录下,并且这个脚本也改为了777 在确保了所有权限都没错的情况下,如果用sudo/root权限 是完全打不开synergyc的
sudo synergyc --daemon --name pi --restart --log /home/pi/sylog 192.168.1.104 sudo service synergy stop sudo service synergy start
上面的命令你甚至能看到输出,但是实际上程序完全没起来
-
设置权限,无论如何确保运行,如果提示缺少LSB tags(上面是有tags的所以应该不会提示),可以无视
sudo chmod 755 /etc/init.d/synergy sudo update-rc.d synergy defaults sudo insserv synergy
-
启动Synergy服务,之后重启一下看看,是不是鼠标可以直接外滑到另一台设备的屏幕上去了,键盘输入也是需要以鼠标激活的屏幕为基础
sudo /etc/init.d/synergy start sudo /etc/init.d/synergy stop sudo service synergy stop sudo service synergy start
以上方法无法自动启动的情况(周三/11/6 17:04:29)
配完synergy的那天和第二天都非常好用,开机自启动,长时间开着都没有掉线的情况。
放了几天以后,更新了一下系统,然后开机启动就废了,我重烧过系统,重做了三四遍,都不行。
反复查原因,目前找到的就是:
是开机启动项,服务激活(启动过),但是看不到synergy连接的信息,这时候直接start无效,必须得stop 然后start 才能重新开起来。
只好开机以后,用putty手动启动一下synergy 然后再用
(我查看了国外友人博客,有近期评论(5月前)中说做完整个流程的基本都成功了,至少我确实是成功好用了两天,如果你能正常使用上面的方式就不用往下看了)
说一下我尝试解决的办法
- 刚好学习了python就用python写了一个脚本,然后开机自动启动python,然后再用python脚本来调用synergy的服务,间接调用,依然是不能开机启动,所以问题应该在脚本/启动流程中
- 修改了用su pi -c的脚本调用的方式,直接用synergyc 来启动 就遇到了上面说的问题,服务根本无法运行
- 在su pi -c 前先pkill一次 然后再开启,失败
- 参考另外一个博客的方法,使用LXDE的启动脚本来启动,失败
sudo mkdir -p ~/.config/lxsession/LXDE
sudo touch ~/.config/lxsession/LXDE/autostart
sudo nano ~/.config/lxsession/LXDE/autostart
编辑下面内容
~/.startsynergy.sh
sudo nano ~/.startsynergy.sh
#!/bin/bash
killall synergyc
sleep 1
synergyc --name pi 192.168.0.16
exit 0
sudo chmod 777 ~/.startsynergy.sh
- synergy的官方论坛,提到树莓派的只有这一个,有人回答的也刚好是上面的方法并且还是最近10月20号的,说是可以,但我怀疑他应该用的是老版本的树莓派系统,不是最新的,链接在下面
http://synergy-project.org/forum/viewtopic.php?f=9&t=30&hilit=raspberry&start=10
- 参考了synergy官方所有wiki呀,论坛啊之类的关于linux下autostartup的问题,全都无解
- 单独查找树莓派设置开机启动的方法还有debian开机启动的方法,不外乎上面这种还有一种写在/etc/rc.local调用上面的脚本/直接命令启动,失败
-
查看log,log是正常的,只有一次出了这个错误(忽略时间,我树莓派的时间是错的)
raspberrypi synergyc[629]: Synergy 1.7.4: [2015-09-26T04:19:32] WARNING: secondary screen unavailable: unable to open screen
- 根据这个warning找到了另外一篇博客,帮我确定了错误,会出现越界的错误
http://wp.sgrosshome.com/2014/01/31/configure-synergy-client-systemd-service-auto-start-linux-fedora-20/ https://bugzilla.redhat.com/show_bug.cgi?id=1212860
-从官方wiki来看,synergy是不能从boot启动的(更新不及时),也就是说不登录的情况下是无法启动synergyc的(会出现什么情况不知道,但不能用),但是呢,偏偏有不少博客写着成功从boot启动了,在用户未登录的情况下就能启动,但这基本取决于用的系统和当时的版本,更换了之后立马就都不行了,为此之后会单独写一篇关于树莓派/linux系统启动相关的,梳理一下我对于linux以及树莓派系统的理解
截至到几个小时前,我都没找到自动启动的办法。直到我看到他
http://www.raspberrypi-spy.co.uk/2014/05/how-to-autostart-apps-in-rasbian-lxde-desktop/
成功通过python脚本启动了synergyc
这个帖子中的第一种方法不知道由于什么原因,我在第一次做的时候,成功启动了终端,从此以后再也没成功过了。 而100%成功的是第二种方法。
第二种自启动方法
下面介绍第二种100%成功的方法(基于树莓派2的2015-09-24-raspbian-jessie版本的系统下) 其他的版本请尝试我上面提到过的所有方法
首先,修改LXDE桌面自启动的脚本
sudo nano ~/.config/lxsession/LXDE-pi/autostart
然后可以看到
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@/usr/bin/python /home/pi/script/synergy.py
@lxterminal
@sh ${HOME}/.config/lxsession/LXDE-pi/autokey.sh
在最后一行代码的前面加入
@/usr/bin/python /home/pi/script/synergy.py
@lxterminal
@lxterminal是终端,可以测试重启是否执行了这上面的命令,执行了的话会自动打开终端的
关键脚本就在这里了,首先调用/usr/bin下的python 来 运行/home/pi/script/目录下的synergy.py脚本
synergy.py脚本内容如下
import subprocess
import time
time.sleep(1)
p=subprocess.Popen("sudo service synergy stop",shell=True,stdout=subprocess.PIP$
text=p.stdout.read().decode()
print(text)
text=p.stderr.read().decode()
print(text)
time.sleep(1)
p=subprocess.Popen("sudo service synergy start",shell=True,stdout=subprocess.PI$
text=p.stdout.read().decode()
print(text)
text=p.stderr.read().decode()
print(text)
这是通过python的subprocess来启动synergy服务(这是建立在第一种方法建立好服务的基础上的)
你也可以修改这里 选择直接调用这个,就不用做建立服务了
synergyc --daemon --name pi --restart --log /home/pi/sylog 192.168.1.104
在启动前加了一个停止和延时,确保不会有冗余的进程存在。
做完上面的步骤就可以reboot 重启看效果了,如果你的平台是和我一样的,没有自动启动,那就仔细检查上面的内容,肯定有小疏忽。
The end
到这里就设置结束了,应该能正常使用Synergy,如果还有后续的话就是如何在windows下编译出来一个Synergy。 总体来说Synergy还是不错的,我参考的博客中有提到占用cpu太高什么的,其实在我用的最新版本1.74中基本都解决了,没有体会到占用很高的cpu。
但是本来双屏幕的被占用了一个屏幕,并且不能随意拖拽东西过去(我是指窗口,实际上剪贴板是共享的,文件也可以拖拽),不过有好几秒的延迟,有时候putty和winSCP配合使用还是不错的。
其实也可以用VNC,虽然我是在一个局域网里,但是延迟感总是要高一些,很不舒服,synergy的鼠标和键盘的延迟很低,感觉就好像直接扩展屏一样。
类似synergy的软件也有几个(zeroOS,input director,maxVista还有什么winnoborder),但他们都是不是全平台通用的,各自有各自的限制,synergy目前是mac linux windows android等等都可以用,从论坛什么的,也能看到synergy的bug颇多,什么情况都有
树莓派下也可以用使用带UI的Synergy和QuickSynergy,就是不能自动启动需要你手动,下面的博客有介绍的。
Quote
http://www.shumeipai.net/thread-18993-1-1.html?_dsign=4330837c
http://blog.csdn.net/lonerzf/article/details/13996895
http://blog.sina.com.cn/s/blog_5922f3300101e20o.html
https://www.rootusers.com/compiling-synergy-from-source-on-the-raspberry-pi/
http://synergy-project.org/forum/viewtopic.php?f=9&t=30&hilit=raspberry&start=10
https://learn.adafruit.com/synergy-on-raspberry-pi/setup-synergy-client-autostart
http://www.raspberrypi-spy.co.uk/2014/05/how-to-autostart-apps-in-rasbian-lxde-desktop/
http://wp.sgrosshome.com/2014/01/31/configure-synergy-client-systemd-service-auto-start-linux-fedora-20/