xspice: README, TODO, config, xspice launcher script

xspice is placed under scripts, adding a new Makefile.am, only
installed if --enable-xspice.
spiceqxl.xorg.conf.example is placed under examples to be installed
to share/doc if --enable-xspice.
This commit is contained in:
Alon Levy
2011-04-27 18:22:28 +03:00
parent 4d04f2bb72
commit ee0e638e11
8 changed files with 393 additions and 2 deletions

View File

@@ -18,7 +18,7 @@
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
SUBDIRS = src
SUBDIRS = src scripts examples
MAINTAINERCLEANFILES = ChangeLog INSTALL
.PHONY: ChangeLog INSTALL

114
README.xspice Normal file
View File

@@ -0,0 +1,114 @@
1. Introduction
2. Building
2.1 Building from source on fedora
2.2 Building from source with your own Xserver
3. Running
= 1. Introduction =
Xspice is an X server and Spice server in one. It consists of a wrapper script
for executing Xorg with the right parameters and environment variables, a
module names spiceqxl_drv.so implementing three drivers: a video mostly
code identical to the guest qxl X driver, and keyboard and mouse reading from
the spice inputs channel.
Xspice allows regular X connections, while a spice client provides the keyboard
and mouse and video output.
Spice client disconnections don't impact X client connections.
Xserver's select loop is reused to service spice client sockets
and the qxl driver is reused together with some of the qemu qxl device code
The following changes have been done to the qxl driver.
* it creates only one memslot, covering the whole of memory (much like
spice does in simple display mode, i.e. vga, and the tester does)
* it invokes the whole of the qxl device from qemu, patching in both
directions.
* io becomes a function call instead of iob
* irq becomes a function call instead of setting a flag
* it runs spice server directly
* it is linked with spice-server.
The protocol is unchanged.
= 2. Building =
== 2.1 Building from source on fedora ==
The changes for ubuntu/debian should be minimal:
* location of drivers for Xorg (just where you put any qxl_drv.so etc.)
* location of Xorg config files
In fedora they are: (note the lib64 - replace with lib if running on 32 bit
fedora)
DRV_DIR=/usr/lib64/xorg/modules/drivers
XORG_CONF_DIR=/etc/X11
git clone git://anongit.freedesktop.org/~alon/xspice
sudo yum install spice-server-devel spice-protocol
cd xspice
autoreconf -i && ./configure --enable-xspice && make
sudo cp src/.libs/spiceqxl_drv.so $DRV_DIR
sudo cp spiceqxl.xorg $XORG_CONF_DIR
Note: spiceqxl.org is copied to $XORG_CONF_DIR because Xorg only looks in a
very particular config file path, and "." is not there (nor are absolute file
names allowed unless Xorg is run as root).
== 2.2 Building from source with your own Xserver ==
Building the whole xserver is lengthier but can be done without
any root permissions.
This assumes you already have spice-protocol and spice-server
installed into $TEST prefix below.
TEST=/store/test
grab xserver, xspice, xextproto and xkbcomp
for src in git://anongit.freedesktop.org/xorg/proto/xextproto \
git://anongit.freedesktop.org/xorg/app/xkbcomp \
git://anongit.freedesktop.org/xorg/xserver \
git://anongit.freedesktop.org/xorg/lib/libxkbfile \
git://git.freedesktop.org/git/spice/spice-protocol
git://anongit.freedesktop.org/~alon/xspice; do git clone $src; done
build and install into some non common prefix (not to overwrite
your existing server) - note that this is just for testing. This
should all work with the default server as well, but that server
requires root generally and this is undesireable for testing (and
running actually).
export PKG_CONFIG_PATH=${TEST}/lib/pkgconfig
(cd xextproto; ./autogen.sh --prefix=$TEST --without-xmlto && make install)
(cd xserver; ./autogen.sh --prefix=$TEST && make install)
(cd xkbcomp; ./autogen.sh --prefix=$TEST && make install)
(cd libxkbfile; ./autogen.sh --prefix=$TEST && make install)
(cd spice-protocol; ./autogen.sh --prefix=$TEST --datadir=$TEST/lib && make install)
(cd xspice; ./autogen.sh --prefix=$TEST && make install)
mkdir -p $TEST/etc/X11
place the tested config below in $TEST/etc/X11/spiceqxl.xorg.conf.
last bit is a little ugly (FIXME), copy over the xkb bits from the existing X11
installation:
mkdir -p $TEST/share/X11
cp -R /usr/share/X11/xkb $TEST/share/X11
= 3. Running =
$XORG is either your own built $TEST/bin/Xorg or just the default Xorg
Run server with:
export XSPICE_PORT=6000
$XORG -noreset -config spiceqxl.xorg.conf :3.0
Or equivalently:
./xspice --port 6000 :3.0
Run X clients as usual by setting DISPLAY=:3.0
Run spice client with port 5912 (hardcoded currently):
spicec -h localhost -p 5912

23
TODO.xspice Normal file
View File

@@ -0,0 +1,23 @@
TODO:
OOM. Not releasing?
Out of memory allocating 3145748 bytes
Out of mem - stats
Cursor channel missing.
No copy paste.
No agent at all.
agent should probably be thought to run with Xspice too. That way
mouse emulation in Xspice can be avoided entirely. But how do you
get an input device to belong to Xspice :1.0 and not to Xorg :0.0?
Keyboard:
* repeat (xset r 100) does nothing. This is because spice client
of course does repeat. But would be nice to transmit this.
Video: youtube seemed choppy, some frames were repeating (cpu 30%~, so not
cpu bound). Possible multimedia time? Isn't this set by the driver, i.e.
should be identical with in vm qxl driver?
Performance:
didn't check.

View File

@@ -116,7 +116,9 @@ AC_CHECK_FILE(.git, [
AC_CONFIG_FILES([
Makefile
src/Makefile
src/uxa/Makefile
src/uxa/Makefile
scripts/Makefile
examples/Makefile
])
AC_OUTPUT

24
examples/Makefile.am Normal file
View File

@@ -0,0 +1,24 @@
# Copyright 2011 Red Hat, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# on the rights to use, copy, modify, merge, publish, distribute, sub
# license, and/or sell copies of the Software, and to permit persons to whom
# the Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
if BUILD_XSPICE
doc_DATA = spiceqxl.xorg.conf.example
endif
EXTRA_DIST = spiceqxl.xorg.conf.example

View File

@@ -0,0 +1,101 @@
Section "Device"
Identifier "XSPICE"
Driver "spiceqxl"
# Enable regular port. Either this or SpiceTlsPort, or one of XSPICE_PORT or
# XSPICE_TLS_PORT environment variables must be specified
# Defaults to 5900.
#Option "SpicePort" "5900"
# Enable a TLS (encrypted) port. Either this or SpicePort must be specified,
# either here or via environment varialbes or via xspice --port or --tls-port
#Option "SpiceTlsPort" "5901"
# Listen to a specific inteface. Default is to listen to all (0.0.0.0)
#Option "SpiceAddr" ""
# Enable usage of SASL supported by spice-gtk client. Not required,
# defaults to false.
#Option "SpiceSasl" "True"
# Do not request any password from client
#Option "SpiceDisableTicketing" "0"
# Set directory where cacert, server key and server cert are searched
# using the same predefined names qemu uses:
# cacert.pem, server-key.pem, server-cert.pem
#Option "SpiceX509Dir" ""
# Set password client will be required to produce.
#Option "SpicePassword" ""
# Set spice server key file.
#Option "SpiceX509KeyFile" ""
# Set streaming video method. Options are filter, off, all
# defaults to filter.
#Option "SpiceStreamingVideo" ""
# Set zlib glz wan compression. Options are auto, never, always.
# defaults to auto.
#Option "SpiceZlibGlzWanCompression" ""
# Set jpeg wan compression. Options are auto, never, always
# defaults to auto.
#Option "SpiceJpegWanCompression" ""
# Set image compression. Options are off,auto_glz,auto_lz,quic,glz,lz.
# defaults to auto_glz.
#Option "SpiceImageCompression" ""
# Set to true to only listen on ipv4 interfaces.
# defaults to false.
#Option "SpiceIPV4Only" ""
# Set to true to only listen on ipv6 interfaces.
# defaults to false.
#Option "SpiceIPV6Only" ""
# Set cert file location.
#Option "SpiceX509CertFile" ""
# Set key file password.
#Option "SpiceX509KeyPassword" ""
# Set tls ciphers used.
#Option "SpiceTlsCiphers" ""
# Set cacert file.
#Option "SpiceCacertFile" ""
# Set dh file used.
#Option "SpiceDhFile" ""
EndSection
Section "InputDevice"
Identifier "XSPICE POINTER"
Driver "xspice pointer"
EndSection
Section "InputDevice"
Identifier "XSPICE KEYBOARD"
Driver "xspice keyboard"
EndSection
Section "Monitor"
Identifier "Configured Monitor"
EndSection
Section "Screen"
Identifier "XSPICE Screen"
Monitor "Configured Monitor"
Device "XSPICE"
DefaultDepth 24
EndSection
Section "ServerLayout"
Identifier "XSPICE Example"
Screen "XSPICE Screen"
InputDevice "XSPICE KEYBOARD"
InputDevice "XSPICE POINTER"
EndSection

24
scripts/Makefile.am Normal file
View File

@@ -0,0 +1,24 @@
# Copyright 2011 Red Hat, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# on the rights to use, copy, modify, merge, publish, distribute, sub
# license, and/or sell copies of the Software, and to permit persons to whom
# the Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
if BUILD_XSPICE
bin_SCRIPTS = xspice
endif
EXTRA_DIST = xspice

103
scripts/xspice Executable file
View File

@@ -0,0 +1,103 @@
#!/usr/bin/python
"""
xspice
xspice is a standard X server that is also a Spice server.
It is implemented as a module with video, mouse and keyboard drivers.
The video driver is mostly the same code as the qxl guest driver, hence
xspice is kept in the same repository. It can also be used to debug the qxl
driver.
xspice (this executable) will set a bunch of environment variables that are
used by spiceqxl_drv.so, and then exec Xorg, giving it the default config file,
which can be overridden as well.
"""
import argparse
import os
import sys
def which(x):
for p in os.environ['PATH'].split(':'):
candidate = os.path.join(p, x)
if os.path.exists(candidate):
return candidate
return None
cgdb = which('cgdb') and os.path.exists(
os.path.join(os.path.dirname(sys.modules[__name__].__file__),
'configure.ac'))
def add_boolean(flag, *args, **kw):
parser.add_argument(flag, action='store_const', const='1', default='0',
*args, **kw)
wan_compression_options = ['auto', 'never', 'always']
parser = argparse.ArgumentParser("xspice",
description="X and Spice server. example usage: xspice --port 5900 :1.0",
usage="xspice [xspice and Xorg options intermixed]",
epilog="Any options not parsed by xspice get passed to Xorg as is.")
parser.add_argument('--xorg', default=which('Xorg'))
parser.add_argument('--config', default='spiceqxl.xorg.conf')
# Don't use any options that are already used by Xorg (unless we must)
# specifically, don't use -p and -s.
parser.add_argument('--port', type=int, help='standard spice port')
parser.add_argument('--tls-port', type=int, help='spice tls port')
add_boolean('--disable-ticketing', help="do not require a client password")
add_boolean('--sasl', help="enable sasl")
parser.add_argument('--x509-dir', help="x509 directory for tls")
parser.add_argument('--cacert-file', help="ca certificate file for tls")
parser.add_argument('--x509-key-file', help="key file for tls")
parser.add_argument('--x509-key-password', help="key file password for tls")
parser.add_argument('--tls-ciphers')
parser.add_argument('--dh-file')
parser.add_argument('--password', help="set password required to connect to server")
parser.add_argument('--image-compression',
choices = ['off', 'auto_glz', 'auto_lz', 'quic',
'glz', 'lz'],
default='auto_glz', help='auto_glz by default')
parser.add_argument('--jpeg-wan-compression',
choices=wan_compression_options,
default='auto', help='auto by default')
parser.add_argument('--zlib-glz-wan-compression',
choices=wan_compression_options,
default='auto', help='auto by default')
# TODO - sound support
#parser.add_argument('--playback-compression', choices=['0', '1'], default='1', help='enabled by default')
parser.add_argument('--streaming-video', choices=['off', 'all', 'filter'],
default='filter', help='filter by default')
add_boolean('--ipv4-only')
add_boolean('--ipv6-only')
if cgdb:
parser.add_argument('--cgdb', action='store_true', default=False)
# TODO:
#add_boolean(parser, '--agent-mouse')
args, xorg_args = parser.parse_known_args(sys.argv[1:])
def error(msg, exit_code=1):
print "xspice: %s" % msg
sys.exit(exit_code)
if not args.xorg:
error("Xorg missing")
var_args = ['port', 'tls_port', 'disable_ticketing',
'x509_dir', 'sasl', 'cacert_file', 'x509_key_file', 'x509_key_password',
'tls_ciphers', 'dh_file', 'password', 'image_compression',
'jpeg_wan_compression', 'zlib_glz_wan_compression',
'playback_compression', 'streaming_video']
for arg in var_args:
if getattr(args, arg):
os.environ['XSPICE_' + arg.upper()] = str(getattr(args, arg))
exec_args = [args.xorg, '-config', args.config]
if cgdb and args.cgdb:
exec_args = [cgdb, '--args'] + exec_args
args.xorg = cgdb
os.execv(args.xorg, exec_args + xorg_args)