虽然微软改进了对xRDP的支持,使得Hyper-V虚拟机中运行的Ubuntu和宿主可以有比较好的交互性,可以使用Enhanced Session Mode功能。但是还是存在若干性能不够强,不能独立显示某个应用程序窗口等缺点。

当今而论,性能最好的远程桌面协议莫过于NX,也就是Nomachine所使用的协议。到NX3为止,NX的协议和实现都是开源的;然而到了NX4,Nomachine就将协议和产品变成专有的了。所以你有两个选择,使用Nomachine提供的专有产品,或者使用继承自NX3的开源产品。

使用Nomachine

Nomachine分为客户端和服务端,这两个是在一个软件包里面发行的。首先到从Nomachine下载页面下载Window的安装包,在宿主的Windows系统里面安装。然后到Ubuntu虚拟机中,下载debian/ubuntu格式的nomachina软件包。当前下载的到的文件是nomachine_6.4.6_1_amd64.deb,然后执行下面的命令进行安装:

sudo dpkg -i nomachine_6.4.6_1_amd64.deb
# 或者
sudo apt install nomachine_6.4.6_1_amd64.deb

可以用sudo dkpg --list | grep nomachine查看nomachine是否正确安装。以后如果准备删除的话,可以使用命令sudo dkpg -r nomachine

Nomachine的服务端带有控制台界面,对于远程桌面来说,有很高的易用性和可配置性。但是免费版的Nomachine不带有Floating Window Mode功能(也就是把虚拟机中的图形程序模拟成一个本地的程序来运行),只有订阅版的Nomachin才支持Floating Window Mode,这对一些人来说会是一个缺点。

使用x2go

x2go是基于开源的NX3,并且它本身也是开源的。虽然功能没有Nomachine强大,但是支持Floating Window Mode和Published Applications。

如果你用过Mac上的虚拟机Parallels,就知道它带有一个Coherence View Mode,和上面提到的Published Applications类似。Published Applications可以显示一个菜单,上面是各种可运行的远程应用,如同Windows的开始菜单, 不过显示的是Ubuntu的应用。

首先在Ubuntu上安装x2go服务端:

$ sudo apt-get install software-properties-common
# 添加x2go的安装源
$ sudo add-apt-repository ppa:x2go/stable
# 添加后会自动fresh,如果没有的话,手动执行下面的命令
$ sudo apt-get update
# 安装x2go server相关的软件包
$ sudo apt-get install x2goserver x2goserver-xsession

然后,在x2go的网站上下载Windows客户端,在本地安装,然后就可以使用客户端去连接服务端,使用方法和Nomachine类似。

在配置x2go session的时候,可以选择使用Single Application (Floating Window Mode)还有Published Applications。

调整Ubuntu的运行级别

有了远程桌面之后,就不需要把Ubuntu运行在runlevel 5(桌面模式),只需要运行在runlevel 3(共享模式)就行了。

使用以下命令可以修改Ubuntu的运行模式:

sudo systemctl set-default runlevel3.target

上面的命令输出

Removed /etc/systemd/system/default.target
Created symlink /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target

参考: How to boot into runlevel 3 (as default) on Ubuntu Bionic(18.04)?

参考

nomachine

NX

x2go

其他

2019-06-06更新

Ubuntu18.04采用netplan来管理网络,具体的配置文件在/etc/netplan/01-network-manager-all.yaml。修改这个配置文件,让Ubuntu18.04使用静态IP地址:

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.0.110/24]
      gateway4:  192.168.0.1
      nameservers:
            addresses: [8.8.8.8, 8.8.4.4]

参考:

如果想用NetworkManager来管理,则可以使用其命令行nmcli,具体参考:

(更新完)

2020-05-14 更新

如果Ubuntu装在另外一个机子上,没有无线网。可以将一台有无线网的Windows机子将网络分享给Ubuntu。

对于Wifi来说,桥接好像不能工作,参考Bridge from Wifi to Ethernet not working (Windows 10)Bridged Client Mode Issues

推荐的方式是使用Internet Connection Sharing,也就是ICS,参考

简单地说,就是在无线网卡上开启网络共享,指定共享的网卡是另外一个连接Ubuntu的网卡。然后连接Ubuntu的网卡就会自动被设置为192.168.137.1。Ubuntu可以使用DHCP自动从该网关动态获取IP地址。

Ubuntu的netplan需要将配置更改如下:

network:
  version: 2
  ethernets:
    enp3s0:
      dhcp4: yes
      dhcp-identifier: mac

具体参考https://netplan.io/examples。执行sudo netplan apply之后重启即可生效。

使用ip a可以查看网络端口信息。

C:\Windows\System32\drivers\etc\host.ics中可以查看分配给ICS各个主机的ip地址,以及对于的主机名。值得注意的是,对应的主机名都是FQDN(Fully Qualified Domain Name),比如ubuntu.mshome.net。在Ubuntu上可以使用hostname –fqdn来查询。

注意,Ubunt的hostname不能为FQDN,否则可能不被Windows的ICS识别。也不能设成如ubuntu.local之类的

其他参考

(更新完)

2021-07-04更新

把Wifi共享给Ethernet的时候,在Sharing标签页的Home Networking Connection无法找到Ethernet。解决办法是把Sharing标签页的所有选项都去掉,然后选择应用,然后再重新勾选,就好了。

(更新完)