XServerXSDL如何运行Linux,LXC容器运行X Server

LXC容器运行X Server

Linux Containers (LXC)项目提供了Linux上操作系统级虚拟化容器管理工具.大多数应用容器的场合是不需图形界面,如FTP、HTTP等后台服务.容器要运行X桌面环境可通过ssh,xdmcp远程方式,此时容器是X Client,容器是无需安装X Server.

Linux主机系统使用 Ctrl-Alt-F1 到 Ctrl-Alt-F7 在不同的虚拟终端之间进行切换,其中 vt01 到 vt06 是文本模式的终端,而 vt07 是 X 终端,X一般在虚拟终端7(vt07)上运行.当需要容器以本地方式运行X时,就需为容器分配另外一个虚拟终端(如vt09).

本文介绍的内容是在容器中以本地方式运行X,即在宿主的vt09上运行容器X.

实验环境:同一台机器上安装两套完整的debian 8桌面系统,debian-A和debian-B.

1.手工指定键盘/鼠标输入设备驱动

启动debian-B系统,安装xserver-xorg-input-kbd和xserver-xorg-input-mouse软件包,创建/etc/X11/xorg.conf.d/目录,在其下创建10-input.conf文件,内容如下:

#--v--

Section "ServerFlags"

#禁止设备自动检测

Option "AutoAddDevices" "False"

EndSection

Section "ServerLayout"

Identifier "Desktop"

InputDevice "Mouse0" "CorePointer"

InputDevice "Keyboard0" "CoreKeyboard"

EndSection

Section "InputDevice"

Identifier "Keyboard0"

Driver "kbd"

#Option "XkbLayout" "gb"

EndSection

Section "InputDevice"

Identifier "Mouse0"

Driver "mouse"

Option "Protocol" "auto"

Option "Device" "/dev/input/mice"

Option "ZAxisMapping" "4 5 6 7"

EndSection

#--^--

重新启动debian-B系统,由10-input.conf配置文件手工指定键盘/鼠标设备运行正常.

2.配置容器

先关闭debian-B系统,然后启动debian-A系统,将debian-B系统的根挂载到debian-A系统的目录/mnt/sdc1/上.

debian-A系统作为宿主(下面将称宿主)

debian-B系统作为容器(下面将称容器)

从宿主复制设备文件到容器根中

root@debian:/home/linlin# cp -a /dev/tty1 /mnt/sdc1/dev/

root@debian:/home/linlin# cp -a /dev/tty2 /mnt/sdc1/dev/

root@debian:/home/linlin# cp -a /dev/tty3 /mnt/sdc1/dev/

root@debian:/home/linlin# cp -a /dev/tty4 /mnt/sdc1/dev/

root@debian:/home/linlin# cp -a /dev/tty5 /mnt/sdc1/dev/

root@debian:/home/linlin# cp -a /dev/tty6 /mnt/sdc1/dev/

root@debian:/home/linlin# cp -a /dev/tty7 /mnt/sdc1/dev/

root@debian:/home/linlin# cp -a /dev/tty8 /mnt/sdc1/dev/

root@debian:/home/linlin# cp -a /dev/tty9 /mnt/sdc1/dev/

root@debian:/home/linlin# cp -a /dev/input /mnt/sdc1/dev

root@debian:/home/linlin#

将容器的inittab文件中以下行注释掉

1:2345:respawn:/sbin/getty 38400 tty1

2:23:respawn:/sbin/getty 38400 tty2

3:23:respawn:/sbin/getty 38400 tty3

4:23:respawn:/sbin/getty 38400 tty4

5:23:respawn:/sbin/getty 38400 tty5

6:23:respawn:/sbin/getty 38400 tty6

并增加以下行

1:2345:respawn:/sbin/getty 38400 console

c1:23:respawn:/sbin/getty 38400 tty1

c2:23:respawn:/sbin/getty 38400 tty2

c3:23:respawn:/sbin/getty 38400 tty3

c4:23:respawn:/sbin/getty 38400 tty4

c5:23:respawn:/sbin/getty 38400 tty5

创建容器vm3,其config配置如下:

linlin@debian:~$ cat /var/lib/lxc/vm3/config

##Container

lxc.utsname = vm3

#--v--项目(1)

lxc.network.type = veth

lxc.network.flags = up

lxc.network.link = br0

lxc.network.name = eth0

lxc.network.mtu = 1500

lxc.network.ipv4 = 192.168.0.10/24

#--^--

lxc.rootfs = /mnt/sdc1

lxc.tty = 6

lxc.pts = 1024

##Capabilities

lxc.cap.drop = mac_admin

lxc.cap.drop = mac_override

lxc.cap.drop = sys_admin

lxc.cap.drop = sys_module

##Devices

#Deny all devices

lxc.cgroup.devices.deny = a

#Allow to mknod all devices (but not using them)

lxc.cgroup.devices.allow = c *:* m

lxc.cgroup.devices.allow = b *:* m

#/dev/console

lxc.cgroup.devices.allow = c 5:1 rwm

#/dev/fuse

lxc.cgroup.devices.allow = c 10:229 rwm

#/dev/null

lxc.cgroup.devices.allow = c 1:3 rwm

#/dev/ptmx

lxc.cgroup.devices.allow = c 5:2 rwm

#/dev/pts/*

lxc.cgroup.devices.allow = c 136:* rwm

#/dev/random

lxc.cgroup.devices.allow = c 1:8 rwm

#/dev/rtc

lxc.cgroup.devices.allow = c 254:0 rwm

#/dev/tty

lxc.cgroup.devices.allow = c 5:0 rwm

#/dev/urandom

lxc.cgroup.devices.allow = c 1:9 rwm

#/dev/zero

lxc.cgroup.devices.allow = c 1:5 rwm

#--v--项目(2):容器要启动X所必需的

#tty9 即 vt9

lxc.cgroup.devices.allow = c 4:9 rwm

#/dev/mem

lxc.cgroup.devices.allow = c 1:1 rwm

#input

lxc.cgroup.devices.allow = c 13:* rwm

#--^--

##Filesystem

lxc.mount.entry = proc /mnt/sdc1/proc proc nodev,noexec,nosuid 0 0

lxc.mount.entry = sysfs /mnt/sdc1/sys sysfs defaults,ro 0 0

linlin@debian:~$

说明:容器vm3的config配置是在LXC debian模版的基础上修改并增加(1)(2)项目而成.

3.容器运行X

3.1 手工启动X

启动容器vm3后,以根用户命令行登录,然后输入命令startx -- vt9 便可在tty9(即vt09)上运行X桌面环境.

Debian GNU/Linux vm3 console

vm3 login: root

密码:

root@vm3:~# startx -- vt9

已成功在容器运行X桌面环境,并且可以切换到宿主系统,vt7和vt9可以互相切换.在容器X桌面环境注消能正常返回容器控制台.

出现问题:只是容器的X界面刷新很慢,运行的X server是Xorg.不知是什么原因?

3.2 自动启动X

上面容器vm3的gdm是使用缺省配置,启动容器后无法自动启动X.查看/usr/share/gdm/defaults.conf中有一行内容是:

command=/usr/bin/X -audit 0

即指定X命令.

因此可修改容器的gdm配置,即可在宿主上往/mnt/sdc1/etc/gdm/gdm.conf(即容器上/etc/gdm/gdm.conf)加下面两行:

[server-Standard]

command=/usr/bin/X vt09 -audit 0

测试:

root@vm3:~# /etc/init.d/gdm stop

Stopping GNOME Display Manager: gdm.

root@vm3:~# /etc/init.d/gdm start

Starting GNOME Display Manager: gdm.

root@vm3:~#

已正常启动X并进入桌面环境.

以后在宿主启动容器后就可自动启动X.

root@debian:/home/linlin# lxc-start -n vm3 -d

root@debian:/home/linlin#

现在用 lxc-start 启动容器,就会自动切换到容器X(即vt9)上.按++可切回到vt7(即宿主X)上,vt7和vt9可以互相切换.

在容器X桌面环境点击关机按钮,可正常关闭容器.

gdm配置(即/mnt/sdc1/etc/gdm/gdm.conf)内容如下:

#GDM Custom Configuration file.

[daemon]

[security]

[xdmcp]

[gui]

[greeter]

[chooser]

[debug]

[servers]

#--v--增加的两行,X命令command比缺省多了vt09参数

[server-Standard]

command=/usr/bin/X vt09 -audit 0

#--^--

说明:有文章讲将gdm设置为FirstVT=9和VTAllocation=false可自动启动X到vt9上,但经测试无效的.调试容器gdm的结果是:FirstVT的值vt09没传到X命令参数中.不知是什么原因?

4.Xvesa

因容器使用Xorg的X界面刷新很慢,可使用Xvesa代替Xorg.

debian不提供独立的Xvesa软件包,可将轻量级发行版SliTaz系统上的可执行二进制文件Xvesa复制到容器vm3下,即/mnt/sdc1/usr/bin/Xvesa

启动容器vm3后,以根用户命令行登录,然后输入很长的命令

Debian GNU/Linux vm3 console

vm3 login: root

密码:

root@vm3:~# startx -- /usr/bin/Xvesa -ac -shadow -screen 1024x768x24 -keybd keyboard -mouse mouse,5,/dev/input/mice -- vt9

startx启动X的同时,也会启动窗口管理器的,已成功在容器运行X桌面环境,可以正常移动鼠标和键盘输入,但就是无法切换vt7和vt9,还好注消容器用户后可以返回到宿主的容器控制台.

Xvesa的X界面刷新正常,不会很慢.

说明:使用Xvesa,是不用改动gdm配置,不用安装xserver-xorg-input-kbd和xserver-xorg-input-mouse软件包.

5.安全

因容器要使用X必需允许访问/dev/mem,所以存在安全隐患,因此不要在生产环境的容器运行X.即在容器config配置中,只要不配置下面内容,即使容器安装了X,也是无法启动X的.

#/dev/mem

lxc.cgroup.devices.allow = c 1:1 rwm

通常,LXC各个模版是不配置访问/dev/mem的.

( 附:LXC容器图形前端 fglxc-ver0.0.9.zip 源代码 下载地址 http://u.163.com/xtfcsdnT 提取码: lAPs2V9m )

本篇从原网易迁移过来

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值