Farseerfc的小窝 - archlinux//farseerfc.me/zhs/2019-02-07T02:14:00+09:00用 usbip 转发 raspberry pi 的 USB 键盘鼠标给 Arch Linux 的 PC2019-02-07T02:14:00+09:002019-02-07T02:14:00+09:00farseerfctag:farseerfc.me,2019-02-07:/zhs/usbip-forward-raspberrypi.html<p>惠狐 <a class="reference external" href="/links.html#megumifox">megumifox</a> 写了篇 <a class="reference external" href="https://blog.megumifox.com/public/2019/02/06/%E7%94%A8pulseaudio%E5%B0%86%E7%94%B5%E8%84%91%E7%9A%84%E5%A3%B0%E9%9F%B3%E7%94%A8%E6%89%8B%E6%9C%BA%E6%94%BE%E5%87%BA%E6%9D%A5/">用PulseAudio将电脑的声音用手机放出来</a>
,文末提到想知道我怎么用树莓派转发 USB 的,于是写篇文章记录一下。</p>
<div class="section" id="id1">
<h2>起因</h2>
<p>家里有个装了 Arch Linux ARM 的树莓派3B 闲置着,装了 Arch Linux ARM 偶尔上电更新一下,
不过因为性能实在不适合做别的事情于是一直在吃灰。某日 <del>给老婆安利幻想万华镜</del><ins>和老婆看片</ins>
的时候, <del>老婆不吃安利于是迁怒键盘鼠标</del><ins>键盘鼠标被长长的 USB 线扯着感觉很难受</ins>
,于是偶发奇想,能不能利用一下树莓派的多达 4 个 USB 2.0 端口接鼠标键盘呢,
这样鼠标键盘就可以跟着树莓派来回走,不用拖着长长的 USB 线了。</p>
<p>上网搜了一下, Linux 环境有个 usbip 工具正好能做到这个。原理也很直观, usbip 能把 USB …</p></div><p>惠狐 <a class="reference external" href="/links.html#megumifox">megumifox</a> 写了篇 <a class="reference external" href="https://blog.megumifox.com/public/2019/02/06/%E7%94%A8pulseaudio%E5%B0%86%E7%94%B5%E8%84%91%E7%9A%84%E5%A3%B0%E9%9F%B3%E7%94%A8%E6%89%8B%E6%9C%BA%E6%94%BE%E5%87%BA%E6%9D%A5/">用PulseAudio将电脑的声音用手机放出来</a>
,文末提到想知道我怎么用树莓派转发 USB 的,于是写篇文章记录一下。</p>
<div class="section" id="id1">
<h2>起因</h2>
<p>家里有个装了 Arch Linux ARM 的树莓派3B 闲置着,装了 Arch Linux ARM 偶尔上电更新一下,
不过因为性能实在不适合做别的事情于是一直在吃灰。某日 <del>给老婆安利幻想万华镜</del><ins>和老婆看片</ins>
的时候, <del>老婆不吃安利于是迁怒键盘鼠标</del><ins>键盘鼠标被长长的 USB 线扯着感觉很难受</ins>
,于是偶发奇想,能不能利用一下树莓派的多达 4 个 USB 2.0 端口接鼠标键盘呢,
这样鼠标键盘就可以跟着树莓派来回走,不用拖着长长的 USB 线了。</p>
<p>上网搜了一下, Linux 环境有个 usbip 工具正好能做到这个。原理也很直观, usbip 能把 USB
端口上的数据封装成 IP 协议通过网络转发出去,从而两个网络间相互联通的电脑就可以远程转发 USB 了。
设置好的话,就像是一台 PC 多了几个位于树莓派上的 USB 端口,插上树莓派的 USB 设备统统作为 PC
的设备。</p>
<p>这篇文章假设有一个装了 Arch Linux 的 PC ,和一个装了 Arch Linux ARM 的树莓派,
并且两者间能通过网络互相访问到。别的发行版上大概也可以这么做,只是我没有试过。 usbip
工具似乎普遍被发行版打包了,除此之外需要的也只是 Linux 内核提供好的功能而已。</p>
</div>
<div class="section" id="arch-linux-arm">
<h2>设置 Arch Linux ARM 的树莓派端</h2>
<p>假设树莓派上面网络已经设置妥当,开机插电就能自动联网。接下来安装 usbip 工具:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> sudo pacman -Syu usbip</span>
</pre></div>
<p>然后需要记录一下树莓派的 IP 地址:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> ip addr</span>
<span class="code-line"><span class="go">3: wlan0: ......</span></span>
<span class="code-line"><span class="go">inet 192.168.0.117/24 brd 192.168.0.255 scope global noprefixroute wlan0</span></span>
<span class="code-line"><span class="go">......</span></span>
</pre></div>
<p>接下来给 udev 添加一个规则,当插入 usb 设备的时候,执行我的脚本 usbipall.sh
把 usb 设备通过 usbip 共享出去:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> cat /etc/udev/rules.d/usbipall.rules</span>
<span class="code-line"><span class="go">ACTION=="add", SUBSYSTEM=="usb", RUN+="/usr/bin/bash /usr/local/bin/usbipall.sh"</span></span>
</pre></div>
<p>这个 rules 文件 <a class="reference external" href="https://github.com/farseerfc/dotfiles/blob/master/usbiprpi/usbipall.rules">可以在我的 dotfiles 里面找到</a> 。</p>
<p>然后规则调用的 usbipall.sh 我这么写的, <a class="reference external" href="https://github.com/farseerfc/dotfiles/blob/master/usbiprpi/usbipall.sh">文件同样在我的 dotfiles 里面</a> :</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="ch">#!/bin/sh</span></span>
<span class="code-line"><span class="o">(</span></span>
<span class="code-line"><span class="nv">allusb</span><span class="o">=</span><span class="k">$(</span>usbip list -p -l<span class="k">)</span></span>
<span class="code-line"><span class="k">for</span> usb in <span class="nv">$allusb</span></span>
<span class="code-line"><span class="k">do</span></span>
<span class="code-line"> <span class="nv">busid</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$usb</span><span class="s2">"</span> <span class="p">|</span> sed <span class="s2">"s|#.*||g;s|busid=||g"</span><span class="k">)</span></span>
<span class="code-line"> <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$busid</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"1-1.1"</span> <span class="o">]</span></span>
<span class="code-line"> <span class="k">then</span></span>
<span class="code-line"> <span class="c1"># ignoring usb ethernet</span></span>
<span class="code-line"> <span class="k">continue</span></span>
<span class="code-line"> <span class="k">fi</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"</span><span class="k">$(</span>date -Iseconds<span class="k">)</span><span class="s2">: Exporting </span><span class="nv">$busid</span><span class="s2">"</span></span>
<span class="code-line"> usbip <span class="nb">bind</span> --busid<span class="o">=</span><span class="s2">"</span><span class="nv">$busid</span><span class="s2">"</span></span>
<span class="code-line"><span class="k">done</span></span>
<span class="code-line"><span class="o">)</span> >>/var/log/usbipall.log <span class="m">2</span>><span class="p">&</span><span class="m">1</span></span>
</pre></div>
<p>这个脚本做了这样几件事。</p>
<ol class="arabic simple">
<li>调用 <code class="code">
usbip list --local</code>
列出本地所有 usb 设备。</li>
<li>针对每个设备<ol class="arabic">
<li>取出它的 busid</li>
<li>判断是不是树莓派的 USB 以太网卡,不是的话继续</li>
<li>通过 <code class="code">
usbip bind --busid=</code>
命令把这个 usb 设备导出到网上</li>
</ol>
</li>
<li>最后把所有输出记录到 /var/log/usbipall.log 日志里面</li>
</ol>
<p>树莓派这边设置就完成了。从此之后插入的 usb 设备就会统统导出出去。</p>
<p>这里需要注意一下,启用了 udev 规则之后,就没法插键盘鼠标到树莓派上控制它了……我都是从另一端 ssh
上树莓派操作的。如果有什么地方设置错误,可能需要把树莓派的 SD 卡拔下来插到电脑上,删除掉 rules
文件……</p>
<p>仔细检查设置正确了之后,重新载入 udev 规则,或者重启树莓派:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">#</span> systemctl restart systemd-udevd</span>
</pre></div>
<p>这样树莓派这边就设置好了。</p>
</div>
<div class="section" id="arch-linux-pc">
<h2>设置 Arch Linux 的 PC 端</h2>
<p>同样假设 PC 这边也已经联网。接下来同样安装 usbip 工具:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> sudo pacman -Syu usbip</span>
</pre></div>
<p>然后我写了个小脚本去链接树莓派端, <a class="reference external" href="https://github.com/farseerfc/dotfiles/blob/master/usbiprpi/usbiprpi3.sh">这个文件 usbiprpi3.sh 也在我的 dotfiles</a>:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="ch">#!/bin/sh</span></span>
<span class="code-line"><span class="nv">rpi3</span><span class="o">=</span><span class="s2">"192.168.0.117"</span></span>
<span class="code-line"></span>
<span class="code-line">modprobe vhci-hcd</span>
<span class="code-line"></span>
<span class="code-line"><span class="nv">allusb</span><span class="o">=</span><span class="k">$(</span>usbip list -p -r <span class="nv">$rpi3</span> <span class="p">|</span> cut -d<span class="s2">":"</span> -f1 -s <span class="p">|</span> sed <span class="s1">'s|^[ \t]*||;/^$/d'</span><span class="k">)</span></span>
<span class="code-line"><span class="k">for</span> busid in <span class="nv">$allusb</span></span>
<span class="code-line"><span class="k">do</span></span>
<span class="code-line"> <span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$busid</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"1-1.1"</span> <span class="o">]</span></span>
<span class="code-line"> <span class="k">then</span></span>
<span class="code-line"> <span class="c1"># ignoring usb ethernet</span></span>
<span class="code-line"> <span class="k">continue</span></span>
<span class="code-line"> <span class="k">fi</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"Attaching </span><span class="nv">$busid</span><span class="s2">"</span></span>
<span class="code-line"> usbip attach --remote<span class="o">=</span><span class="nv">$rpi3</span> --busid<span class="o">=</span><span class="s2">"</span><span class="nv">$busid</span><span class="s2">"</span></span>
<span class="code-line"><span class="k">done</span></span>
</pre></div>
<p>其中脚本第一行填入上面记录下来的树莓派的 IP 地址,接下来脚本做了这么几件事:</p>
<ol class="arabic simple">
<li>用 modprobe 确认加载 vhci-hcd 通用虚拟键鼠驱动</li>
<li>用 <code class="code">
usbip list --remote=</code>
列出远程设备上已经导出了的 USB 设备,取出他们的 busid</li>
<li>对每个设备用 <code class="code">
usbip attach</code>
接上该设备</li>
</ol>
<p>然后就已经准备妥当,接下来是见证奇迹的时刻:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> sleep <span class="m">10</span><span class="p">;</span> sudo ./usbiprpi3.sh</span>
<span class="code-line"><span class="go">Attaching 1-1.4.3</span></span>
<span class="code-line"><span class="go">Attaching 1-1.4.1</span></span>
</pre></div>
<p>因为只有一套键盘鼠标,所以先 sleep 个 10 秒,在此期间快速把键鼠拔下来插到树莓派的 USB 口上去。
如果对自己手速没自信也可以把时间设长一点。然后用 root 权限执行 usbiprpi3.sh 。</p>
<p>一切正常的话,先能观测插上树莓派的键盘鼠标被树莓派初始化了一下,比如键盘灯会亮,
然后这些设备会被导出出去,从而键盘灯灭掉,然后 10 秒等待结束后他们被远程接到了 PC 端,
又会被初始化一下,同时 PC 端这边会有上述 Attaching 的输出。然后键盘鼠标就能像平常一样用啦。</p>
</div>
<div class="section" id="id3">
<h2>使用体验</h2>
<p>因为就是通过 IP 转发 USB 嘛,所以就和普通地接 USB 的体验差不多,当然前提是网络环境足够稳定。
在我家间隔 5 米到无线路由器的环境下,基本感觉不到网络延迟的影响。
通过这种方式聊天上网应该和直接接 USB 设备完全一样。本文就是在通过树莓派转发的前提下用键盘打字写的。</p>
<p>不过如果网络负载本身就很大的话,可能会一些延迟,比如我开着 OBS 直播打东方的时候,原本就手残
的我感觉更加手残了……</p>
<p>试过拿着树莓派在房间到处走,走到无线信号覆盖不到的地方, usbip 会断掉,PC 上的现象就像是 USB
设备被拔下来了……所以如果无线网络不稳的话,可能需要对上面脚本做个循环?不过那样可能会用起来很别扭吧。</p>
<p>以及,上述操作 usbip 是走 TCP 3240 端口,数据包大概完全没有加密,所以考虑安全性的话,
最好还是在内网环境使用。不过转念一想,万一有别人接上了我导出出去的 USB ,也就是截获我的键盘,
PC 这边没法 attach 设备了,应该马上会发现吧。我敲打 sudo 之类命令的时候 shell 里面没有回显,
就不会再继续敲密码了。而且似乎对攻击者也没有什么好处?要是他 usb attach 到了我的设备上,
我就能控制他的键盘了耶~</p>
</div>
archlinux 上用 chrome 实现 透明计算 远程登录2015-02-13T20:39:00+09:002015-02-13T20:39:00+09:00farseerfctag:farseerfc.me,2015-02-13:/zhs/arch-chrome-remote-desktop.html
<p><a class="reference external" href="http://news.sciencenet.cn/htmlnews/2015/1/311393.shtm">透明计算</a>
具体是什么,因为他们没有公开技术细节所以我并不知道,只是看
<a class="reference external" href="http://v.qq.com/page/h/v/q/h0145ebh1vq.html">公开出来的演示视频</a>
,感觉似乎只要能从手机上远程登录系统桌面,就能算是透明计算了。
如果透明计算真是这个意思,那么我似乎已经用着这个技术很多年了嘛。</p>
<p>Xorg 上常用的远程桌面工具有很多,基于 VNC 协议的、基于NX的和基于 RDP 协议的都能找到,
直接 ssh X forwarding 效果也不错。只是这些方案的一个 <strong>不太易用</strong> 的地方在于,需要
通过 ip 访问到远程的电脑,所以在跨越 NAT 之类的情况下不太容易使用。</p>
<p>于是今天介绍一个使用方便设置也简单的方法: 通过 chrome-remote-desktop 在 archlinux
上使用远程桌面。这个方案的优势在于,借助 Google 的云端服务器(内部貌似是XMPP协议下的握手)
方便地实现了 NAT 穿透,无论什么网络环境基本都能使用。当然,要支持远程登录,
位于远端的登录的计算机必须一直开着 …</p>
<p><a class="reference external" href="http://news.sciencenet.cn/htmlnews/2015/1/311393.shtm">透明计算</a>
具体是什么,因为他们没有公开技术细节所以我并不知道,只是看
<a class="reference external" href="http://v.qq.com/page/h/v/q/h0145ebh1vq.html">公开出来的演示视频</a>
,感觉似乎只要能从手机上远程登录系统桌面,就能算是透明计算了。
如果透明计算真是这个意思,那么我似乎已经用着这个技术很多年了嘛。</p>
<p>Xorg 上常用的远程桌面工具有很多,基于 VNC 协议的、基于NX的和基于 RDP 协议的都能找到,
直接 ssh X forwarding 效果也不错。只是这些方案的一个 <strong>不太易用</strong> 的地方在于,需要
通过 ip 访问到远程的电脑,所以在跨越 NAT 之类的情况下不太容易使用。</p>
<p>于是今天介绍一个使用方便设置也简单的方法: 通过 chrome-remote-desktop 在 archlinux
上使用远程桌面。这个方案的优势在于,借助 Google 的云端服务器(内部貌似是XMPP协议下的握手)
方便地实现了 NAT 穿透,无论什么网络环境基本都能使用。当然,要支持远程登录,
位于远端的登录的计算机必须一直开着 Chrome Remote Desktop 的后台服务。</p>
<div class="panel panel-default">
<div class="panel-heading">
Chrome Remote Desktop 插件</div>
<div class="panel-body">
<img alt="Chrome Remote Desktop 插件" class="img-responsive" src="//farseerfc.me/zhs/images/chrome-remote-desktop-plugin.png"/>
</div>
</div>
<div class="section" id="chrome-remote-desktop">
<h2><a class="toc-backref" href="#id5">Chrome Remote Desktop 的客户端</a></h2>
<p>虽然可能有很多人不知道,不过 Chrome 内包括远程桌面的功能很久了。只是这个功能的界面默认
没有提供界面,要使用它需要安装 Google 官方出品的
<a class="reference external" href="https://chrome.google.com/webstore/detail/chrome-remote-desktop/gbchcmhmhahfdphkhkmpfmihenigjmpp">remote-desktop 插件</a> 。
装好之后远程桌面的客户端就准备好,可以用来远程访问别的计算机桌面了(无论是 Windows/OS X
还是 Linux 都支持)。并且不光可以自己远程访问自己账户的桌面,还可以远程协助朋友的桌面。</p>
</div>
<div class="section" id="archlinux">
<h2><a class="toc-backref" href="#id6">Archlinux 上设置远程登录的服务器</a></h2>
<p>有了客户端之后还要设置一下才能让桌面作为远程登录的服务器。Windows 和 OS X 上 Chrome
会自动下载需要的安装包,无脑下一步就能装好了。Linux上由于发行版众多,桌面配置各异,
所以需要一点手动配置。官方的设置步骤记载在 <a class="reference external" href="https://support.google.com/chrome/answer/1649523">这里</a>
其中给出了 debian 用的二进制包和 Ubuntu 12.10 上的设置方式,以下设置是参考官方步骤。</p>
<p>首先要安装 chrome-remote-desktop 这个包,这个包实际上对应了 Windows/OS X 上用安装程序
安装的 Remote Desktop Host Controller。 archlinux 上开启了
<a class="reference external" href="https://github.com/archlinuxcn/repo">[archlinuxcn]</a>
仓库的话,可以直接安装打好的包。或者可以从
<a class="reference external" href="https://aur.archlinux.org/packages/chrome-remote-desktop/">AUR</a> 装。</p>
<pre><span class="code-line">$ pacman -Ss chrome-remote-desktop<br/><span style="color:purple;font-weight:bold;">archlinuxcn/</span><span style="font-weight:bold;">chrome-remote-desktop </span><span style="color:green;font-weight:bold;">40.0.2214.44-1</span><br/>Allows you to securely access your computer over the Internet through Chrome.</span></pre><p>装好之后从会说这么一段话:</p>
<blockquote>
<p>groupadd:无效的组 ID “chrome-remote-desktop”</p>
<p>Please create ~/.config/chrome-remote-desktop folder manually, if it doesn't exist, or else you can't use CRD.
The needed files are created by the Chrome app, inside the chrome-remote-desktop folder, after Enabling Remote Connections.
To {enable,start} the service use systemctl --user {enable,start} chrome-remote-desktop</p>
<p>You may need to create a ~/.chrome-remote-desktop-session file with commands to start your session</p>
<p>Go to <a class="reference external" href="https://support.google.com/chrome/answer/1649523">https://support.google.com/chrome/answer/1649523</a> for more information.</p>
</blockquote>
<p>那句报错是 AUR 里打的包还没跟上上游 Google 的更改导致的错误,
首先我们需要把远程登录的用户添加入 chrome-remote-desktop 这个用户组里。
新版本的 chrome remote desktop 提供了一个命令做这个事情,所以执行以下命令就可以了:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> /opt/google/chrome-remote-desktop/chrome-remote-desktop --add-user</span>
</pre></div>
<p>然后我们需要手动创建 <code class="code">
~/.config/chrome-remote-desktop</code>
这个文件夹,内容是空的
就好了,随后 chrome 会往这里面放 <code class="code">
host#.json</code>
文件用于身份验证。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> mkdir ~/.config/chrome-remote-desktop</span>
</pre></div>
<p>然后我们要创建一个 shell 脚本 <code class="code">
~/.chrome-remote-desktop-session</code>
,这是远程
登录时的 .xinitrc ,内容么就是启动你想在远程登录时用的桌面环境。
这里可以指定一个和你正在登录的 WM/DE 不同的桌面,比如我启动 xfce4:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> cat ~/.chrome-remote-desktop-session</span>
<span class="code-line"><span class="gp">#</span>!/bin/bash</span>
<span class="code-line"><span class="go">startxfce4</span></span>
<span class="code-line"><span class="gp">$</span> chmod <span class="m">755</span> .chrome-remote-desktop-session</span>
</pre></div>
<p>接下来需要从 Chrome 的插件里启用远程桌面。打开 Chrome 的 Remote Desktop 插件,这时
应该可以看到一个「启用远程链接」的按钮。</p>
<div class="figure">
<img alt="Chrome Remote Desktop 插件中「启用远程链接」的按钮" class="img-responsive" src="//farseerfc.me/zhs/images/chrome-remote-desktop-enable-button.png"/>
<p class="caption">Chrome Remote Desktop 插件中「启用远程链接」的按钮</p>
</div>
<div class="alert alert-warning compound">
<p>在撰写本文的时候, Archlinux 官方源里的 chromium 的版本和 aur/google-chrome
的版本尚且还是 40.0.2214.111 ,而 Chrome Web Store 中提供的 Chrome Remote
Desktop 的插件的版本是 41.0.2272.41 。虽然通常并不要求两者版本一致,不过貌似最近
Chrome 内部的 Remoting 功能更改了 API 导致可能出问题。如果你找不到
「启用远程链接」的按钮,请尝试一下新版本的 Chrome 比如 google-chrome-dev 。
在这一步启用之后,老版本的 chrome 应该也就能使用远程桌面了。</p>
</div>
<div class="alert alert-warning compound">
<p>在32位的 Linux 版本上,最近更新的 Chrome Remote Desktop 插件可能无法正确识别 Host
的版本,具体 <a class="alert-link reference external" href="https://code.google.com/p/chromium/issues/detail?id=332930">参考这个 bug</a> 。</p>
</div>
<p>点击「启用远程链接」,设定一个 PIN 密码(不需要很复杂,这里首先有 Google 帐号验证保证只有
你才能访问),然后就能看到这套电脑的 hostname 出现在「我的电脑」列表里。</p>
<div class="figure">
<img alt="启用远程链接之后的样子" class="img-responsive" src="//farseerfc.me/zhs/images/chrome-remote-desktop-after-enabled.png"/>
<p class="caption">启用远程链接之后的样子</p>
</div>
<p>同时,启用了远程链接之后,可以在刚刚创建的 ~/.config/chrome-remote-desktop
文件夹中找到记录了验证信息的文件。</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> ls .config/chrome-remote-desktop</span>
<span class="code-line"><span class="go">chrome-profile host#8cfe7ecfd6bb17955c1ea22f77d0d800.json pulseaudio#8cfe7ecfd6</span></span>
</pre></div>
<p>然后就可以启动对应的 systemd 用户服务了,如果想自动启动服务要记得 <code class="code">
systemctl --user enable</code>
:</p>
<div class="highlight"><pre><span class="code-line"><span></span><span class="gp">$</span> systemctl --user start chrome-remote-desktop.service</span>
</pre></div>
<p>如果上面的设置一切正常,就可以看到 chrome-remote-desktop 启动了另外一个 Xorg 执行你
刚刚指定的桌面环境:</p>
<div class="figure">
<img alt="htop 中看到的 chrome-remote-desktop 启动的另外一个 Xorg" class="img-responsive" src="//farseerfc.me/zhs/images/chrome-remote-desktop-htop.png"/>
<p class="caption">htop 中看到的 chrome-remote-desktop 启动的另外一个 Xorg</p>
</div>
<p>然后就可以试着通过 Remote Desktop 插件登录到这个新开的 Xorg 了:</p>
<div class="figure">
<img alt="「远程」登录到新的 XFCE4" class="img-responsive" src="//farseerfc.me/zhs/images/chrome-remote-desktop-xfce4.png"/>
<p class="caption">「远程」登录到新的 XFCE4</p>
</div>
</div>
<div class="section" id="linux-chrome-windows-os-x">
<h2><a class="toc-backref" href="#id7">Linux 版本的 Chrome远程桌面 和 Windows/ OS X 上的区别</a></h2>
<p>通过上面的设置步骤也可以看出,Linux版本的远程桌面会在后台开一个独立的 X 会话,而不能
复用现在已有的 X 会话。对远程登录的用法而言这还能接受,对远程协助的功能而言有点问题,
因为正在使用的人不能观察协助者做了什么,协助者也不能继续请求协助的人的操作。</p>
<p>当然目前 Chrome 远程桌面的 Linux Host Controller 还只是 beta 版本,官方只测试支持
Ubuntu 12.04 和 12.10 (14.04之后似乎有
<a class="reference external" href="https://code.google.com/p/chromium/issues/detail?id=366432">Bug</a>
),所以不能要求太多。希望以后能改善吧。</p>
</div>
<div class="section" id="bonus">
<h2><a class="toc-backref" href="#id8">Bonus: 手机远程登录</a></h2>
<div class="panel panel-default">
<div class="panel-heading">
手机上的 Chrome 远程桌面 App</div>
<div class="panel-body">
<img alt="手机上的 Chrome 远程桌面 App" class="img-responsive" src="//farseerfc.me/zhs/images/chrome-remote-desktop-android.png"/>
</div>
</div>
<p>通过上面的设置就可以从任何一个 Chrome 远程桌面客户端登录刚刚设置的这台电脑了。
因为 Chrome 在三大桌面系统 Windows / OS X / Linux 上都有,所以应该能覆盖大多数桌面
系统了。</p>
<p>除了桌面的 Chrome 之外还有一个客户端是 Android 上的
<a class="reference external" href="https://play.google.com/store/apps/details?id=com.google.chromeremotedesktop">Chrome 远程桌面 App</a> 经过上面的设置之后,从这个 App 也能看到并登录:</p>
<div class="figure">
<img alt="手机远程登录" class="img-responsive" src="//farseerfc.me/zhs/images/chrome-remote-desktop-android-logined.png"/>
<p class="caption">手机远程登录</p>
</div>
<p>好啦,开始享受国家自然科学一等奖的透明计算技术吧!</p>
</div>