1、SDL
SDL(Simple DirectMedia Layer)是一个跨平台的、免费、开源的多媒体程序库,它提供了一个简单的接口用于操作硬件平台的图形显示、声音、输入设备等
SDL 是 QEMU 模拟器中默认使用的图形显示,但是,需要在编译 QEMU 时配置对 SDL 的支持后,才能编译 SDL 功能到 QEMU 的命令行工具中,最后才能在启动客户机时使用 SDL 的功能。在编译 QEMU 时,需要有 SDL 的开发包的支持(如:在 RHEL 系列系统中需要安装 SDL-devel,如果安装了 SDL-devel 软件包,然后在配置 QEMU 时默认会配置 SDL 的支持)。运行 configure 程序时,在其输出信息中看到 SDL support yes 即表明 SDL 支持将会被编译进去。如果不想将 SDL 的支持编译进去,在配置 QEMU 时加上 --disable-sdl
的参数即可,在 configure 输出信息中会显示提示 SDL support no
图:SDL界面
2、VNC
VNC 是图形化的桌面分享系统,它使用RFB(Remote FrameBuffer)协议来远程控制另外一台计算机系统。其通过网络将控制端的键盘、鼠标的操作传递到远程受控计算机中,而将远程计算机中的图形显示屏幕反向传输回控制端的 VNC 窗口中,VNC 不依赖于操作系统
尽管 QEMU 仍然采用 SDL 作为默认的图形显示方式,但 VNC 的管理方式在虚拟化环境中使用得更加广泛,因为它克服了 SDL 只能在图形界面中使用的局限性,而很多的 Linux 服务器系统通常启动文本模式而不是图形界面模式。VNC 中的操作在 VNC 窗口关闭或网络断开后,仍然会在服务端继续执行。另外,使用了 VNC,可以在服务器端分别启动多个 VNC session,从而让多人通过各自 VNC 客户端同时连接到各自的 VNC 桌面并进行图形界面下的操作与维护
2.1、宿主机中的VNC使用
-
在宿主机中安装VNC的服务器软件包
[root@kvm ~]# yum install tigervnc-server tigervnc -y [root@kvm ~]# rpm -q tigervnc tigervnc-server tigervnc-1.8.0-22.el7.x86_64 tigervnc-server-1.8.0-22.el7.x86_64
-
设置宿主机中的安全策略
# 关闭SELinux [root@kvm ~]# vim /etc/selinux/config SELINUX=disabled
-
在宿主机中启动VNC服务端
运行命令
vncserver :1
即可启动端口为5901(5900+1)的 VNC 远程桌面的服务器,如果需要启动多个VNC Server,使用不同的端口即可供多个客户端使用。如果是第一次启动 vncserver,系统会提示设置连接时需要输入的密码,根据需要进行设置即可[root@kvm ~]# vncserver :1 You will require a password to access your desktops. Password: Verify: Would you like to enter a view-only password (y/n)? n A view-only password is not used New 'kvm:1 (root)' desktop is kvm:1 Creating default startup script /root/.vnc/xstartup Creating default config /root/.vnc/config Starting applications specified in /root/.vnc/xstartup Log file is /root/.vnc/kvm:1.log
-
通过VNC客户端连接VNC server
2.2、使用VNC图形显示方式启动客户机
在 qemu 命令行中,添加 -display vnc=displayport
参数就能让 VGA 显示输出到 VNC 会话中而不是 SDL 中。如果在进行 QEMU 编译时没有 SDL 的支持,却有 VNC 的支持,则 qemu 命令行在启动客户机时不需要 -vnc
参数也会自动使用 VNC 而不是 SDL
参数解释:
host:N
表示仅允许从 host 主机的 N 号显示窗口来建立 TCP 连接到客户机。在通常情况下,QEMU 会根据数字 N 建立对应的 TCP 端口,其端口号为 5900+N。而 host 值在这里是一个主机名或一个IP地址,是可选的,如果 host 值为空,则表示 QEMU 建立的 Server 端接受来自任何主机的连接;增加 host 参数值,可以阻止来自其他主机的 VNC 连接请求,从而在一定程度上提高了使用 QEMU 的 VNC 服务的安全性
to=L
QEMU 在指定的端口(5900+N)已被其他应用程序占用的情况下,会依次向后递增尝试。这里 to=L 就表示递增到 5900+L 端口号为止,不再继续往后尝试。默认为0,即不尝试
none
表示 VNC 已经被初始化,但是并不在开始时启动,而在需要真正使用 VNC 之时,可以在 QEMU monitor 中用
change
命令启动 VNC 连接
2.2.2、示例
-
启动一个客户机,并使用VNC作为显示输出
[root@kvm ~]# qemu-system-x86_64 -enable-kvm -smp 2 -m 4G -net nic,netdev=nic0 -netdev tap,id=nic0,script=/etc/qemu-ifup-NAT,downscript=/etc/qemu-ifdown-NAT /img_dir/centos7.qocw2 -display vnc=:0
-
宿主机访问客户机
[root@kvm ~]# vncviewer :0
-
非宿主机访问客户机
[root@kvm ~]# vncviewer 192.168.1.10:0
2.3、VNC显示中的鼠标偏移
VNC 显示有一个小的缺点,那就是在 VNC 显示中会看到两个鼠标,一个是客户机中的鼠标,另一个是连接到客户机 VNC 的客户端系统中的鼠标。这两个鼠标的焦点通常不重合,而且相差的距离还有点大,这样会导致在客户机中移动鼠标非常不方便
因为存在鼠标偏移的问题,所以在使用 VNC 方式启动客户机时,强烈建议将 -usb
和 -usbdevice tablet
这两个 USB 选项一起使用,从而解决上面提到的鼠标偏移问题。-usb
参数开启为客户机 USB 驱动的支持(默认已经开启),而 -usbdevice tablet
参数表示添加一个 tablet 类型的 USB 设备,( tablet 类型的设备是一个使用绝对坐标定位的指针设备,就像在触摸屏中那样定位)这样可以让 QEMU 能够在客户机不抢占鼠标的情况下获得鼠标的定位信息
[root@kvm ~]# qemu-system-x86_64 -enable-kvm -smp 2 -m 4G -net nic,netdev=nic0 -netdev tap,id=nic0,script=/etc/qemu-ifup-NAT,downscript=/etc/qemu-ifdown-NAT /img_dir/centos7.qocw2 -display vnc=:1 -device piix3-usb-uhci -device usb-tablet