LXC容器運行X Server前端
Linux Containers (LXC)項目提供了Linux上操做系統級虛擬化容器管理工具.大多數應用容器的場合是不需圖形界面,如FTP、HTTP等後臺服務.容器要運行X桌面環境可經過ssh,xdmcp遠程方式,此時容器是X Client,容器是無需安裝X Server.node
Linux主機系統使用 Ctrl-Alt-F1 到 Ctrl-Alt-F7 在不一樣的虛擬終端之間進行切換,其中 vt01 到 vt06 是文本模式的終端,而 vt07 是 X 終端,X通常在虛擬終端7(vt07)上運行.當須要容器以本地方式運行X時,就需爲容器分配另一個虛擬終端(如vt09).安全
本文介紹的內容是在容器中以本地方式運行X,即在宿主的vt09上運行容器X.app
實驗環境:同一臺機器上安裝兩套完整的debian 8桌面系統,debian-A和debian-B.dom
1.手工指定鍵盤/鼠標輸入設備驅動ssh
啓動debian-B系統,安裝xserver-xorg-input-kbd和xserver-xorg-input-mouse軟件包,建立/etc/X11/xorg.conf.d/目錄,在其下建立10-input.conf文件,內容以下:ide
#--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/上.ui
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)上.按<Ctrl>+<Alt>+<F7>可切回到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 )本篇從原網易遷移過來