后来经过不停google,并用我那可怜的英语水平阅读着英语文档,借助google翻译那语法不通的翻译结果,忙了一天时间,终于找到了解决方案。先总结一下前三轮折腾:
1,通过debootstrap,依靠网络从ubuntu软件源安装最小化的ubuntu系统,并给系统安装了一个jwm+rox-filer的简单桌面
2,新一轮折腾:让系统启动完成后就一个黑屏幕,没有鼠标光标,没有面板,没有桌面,没有图标,没有任何菜单,可是还能用。
折腾出来一个openbox(窗口管理器)+trayer(独立托盘)+unclutter(隐藏鼠标光标)+apwal(图形化启动菜单)+kdocker(最小化程序到托盘)的环境。
3,再一次折腾:启动后把几个最常用的程序都自动启动起来,然后缩小窗口,布置在屏幕四周,鼠标点到谁谁就自动放大(其他的自动缩小)
折腾出来一个:特别配置的awesome。
第四轮折腾的思路来源于:
viewtopic.php?f=15&t=340641我没有那个帖子里面那么伟大的思想。我只是想在一个桌面上不用虚拟机开两套linux的WM。(不是tty7上开一个WM,tty8上面再开一个那种,那个没有什么意思)现在内存这么大,cpu核心也不少。能不能从硬件上或软件上实现多系统并行呢?
这样切换系统就像切换桌面一样,可以随时关闭打开一个系统,可以随时休眠一个系统,可以一个Linux系统用这两个核心编译着程序,那两个核心开着水果做图。
技术难度方面不太懂,不过我觉得能实现还是比较值得的。
大家有什么技术上的或应用上的想法?
高人,闲人,都来说说吧。
正好我前面折腾出3个环境了,本来折腾这些是为了给我住处的老爷机用的,可发现openbox的和awesome的我都比较喜欢,现在这两个环境我轮流着使用着,已经有取代原来kde环境用于日常工作的趋势了。可是这两个环境风格特色上差异也太大了,我于是有了这个想法。另外一个原因是我是在上班时间折腾这些的,可是我不能因此耽误我的工作,我在以后折腾新风格新wm时,希望有一个环境可以开着飞鸽(公司制度有规定,开机必须开飞鸽,随时联系),而且能处理公文,另一个环境随便折腾,所以折腾的同时必须要保证不要丢了飞鸽的信息,及时接收别人传递的文件。
目标:
一个虚拟桌面启动openbox风格的,一个虚拟桌面启动awesome风格的。
如果做不到,就以一个为主,另一个在一个独立窗口里面启动和运行。
如果还是做不到,就加一个按钮或命令,能够在不用关闭已经打开的程序和文件,也不注销的前提下,快速切换wm和风格。
同样还是暂时没有任何思路和办法,不知道怎么解决呀!
其实方法并不特别,只是借助了一个叫Xephyr的软件。
****先是知识培训****(高手跳过)
代码: 全选
sudo apt-get install xserver-xephyr
Xephyr 是一个 Xnest 的替代产品,因为 Xnest 不提供现代 X server 的一些 高级特性,比如图形加速的支持。简而言之,Xephyr 是一个 X server,但是 它执行在一个存在的 X server 里面,这个可以用来做很多事情,比如需要通 过 XDMCP 连接到另外一台主机,那么不需要另外打开一个新的 X server;又 比如正在写一个 window manager,那么在一个 X server 里面打开的 X server 里面调试,将会比直接在现有的 X server 里面替换现有的 window manager 方便很多。对于热衷于更换自己的 window manager 的狂热爱好 者,Xephyr 提供了绝佳的试验环境。
Debian 里的 xserver-xephyr 包:
root@jianlee:~# dpkg -L xserver-xephyr
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/xserver-xephyr
/usr/share/doc/xserver-xephyr/changelog.gz
/usr/share/doc/xserver-xephyr/changelog.Debian.gz
/usr/share/doc/xserver-xephyr/copyright
/usr/share/doc/xserver-xephyr/README
/usr/bin
/usr/bin/Xephyr
运行 -help 获得帮助,基本的使用方式是 Xephyr :n -options。这里 :n 是 DISPLAY 的值,Xephyr 本身是一个 X client,也是一个 X server,它是 client 通过环境变量 DISPLAY 设置显示的 X server,这里的 :n 指定的是它 作为 X server 的序号,也就是说 X client 可以通过 -display 或者更改环 境变量。我们这里简单介绍一些其他的参数,如 -query 和 -indirect 可以用 来向打开了 XDMCP 的主机发送连接请求,-screen 指定屏幕大小,-fullscreen 全屏。
简单说,Xephyr作用就是在我们屏幕上开一个窗口(或全屏),当一个虚拟的屏幕使用,并可以指定这个虚拟屏幕的代号为 :n 。以后我们打开的图形界面的程序,直接打开的就是在真实屏幕上运行的,而用以下方式打开就会到新开的虚拟屏幕中运行了:
代码: 全选
Xephyr :n -options
DISPLAY=:n command
-screen 1024x768x16/-fullscreen(屏幕大小色深/全屏:二选一)
-dpi 96 (dpi值)
:n (虚拟屏幕代号)
-name [name](屏幕名称)
-title [title](屏幕标题)
-noreset(不加此选项,最后一个图形界面的程序关闭后,窗口自动关闭。加上则需要手工关闭。)
-host-cursor(加上以后光标不会被虚拟屏幕里面的程序改变,即鼠标光标是固定样式的,但光标移动速度比较快。不加则光标会改变,但有时反应迟钝)
-keybd(设置键盘类型)
希望我画的这个简单的图能说明Xephyr的工作原理:
代码: 全选
硬 件
|
Xserver----------------
| | |
Xephyr1 WM1---- Xephyr2
| | | |
WM2 soft1 soft2 WM3
| |
soft soft
但是Xephyr在Xserver(图形驱动)和 WM(窗口管理器)中间加上了一层,让后来启动起来的WM看不见Xserver,而把对应的Xephyr当成Xserver,就不会替代掉前面启动的WM。所以我们启动多少Xephyr,就可以对应启动多少WM(只要你的机器撑得住)。
咋一看,这好像是一种虚拟机,其实这和虚拟机是有很大区别的:我们在Xephyr内的程序和在Xephyr外的程序其实都是实实在在的进程,如果Xephyr内外都运行了一个gedit,不管我们在哪里发出一个killall gedit命令,这两个gedit就都被kill掉了。
并且我google到这么一段很有趣的内容:
并且通过测试发现:还真是这样,在Xephyr里面的chromium-browser的字体渲染比在外面的果然要好一些。Xephyr是一个替代的Xnest嵌套X服务器上周提到。这些方案都提供了嵌套的X显示-到一个窗口父X服务器,而不是直接绘制到一个硬屏绘图-但他们在非常不同的方式完成这一。Xnest代理X请求到父服务器(实际上不是执行的操作本身),而Xephyr行为对每个请求和汲取到的X图像,然后将其显示在父服务器上的一个窗口 。
这意味着,Xephyr可以处理父服务器无法处理请求。例如,它可以提供渲染扩展,使客户能够快速显示消除锯齿的文本父显示即使没有渲染扩展。
****测试环境、内容和结果****
测试的环境是上面提到的3个环境。具体看以下链接:
viewtopic.php?f=77&t=338764
测试前的准备:
代码: 全选
setxkbmap -query
每一项的可选值和含义到这个文件去查:/usr/share/X11/xkb/rules/base.lstrules: evdev
model: pc105
layout: us
variant: euro
如果内容是空或者明显是错误的,网上的说法是修改xorg.conf的键盘对应项的键值,可是我改了却不起作用。
代码: 全选
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbLayout" "us"
Option "XkbModel" "pc105"
Option "XkbVariant" "euro"
EndSection
改正确以后,记下这些值。
测试内容:
1,下面这写命令请写成shell文件(可执行权限),用各种方式调用(菜单、快捷键、命令行等),也可以放入WM的启动文件中自动启动,都可以启动Xephyr新环境,命令行如下:
(Xephyr这一行请根据需要来修改,比如键盘布局部分,比如加上-host-cursor等)
代码: 全选
Xephyr :3 -fullscreen -keybd ephyr,,,xkbmodel=pc105,xkblayout=us,xkbrules=evdev,xkboption=euro -noreset -dpi 96 -ac -name awesome -title awesome &
sleep 4
#xkbcomp :0 :3 &
DISPLAY=:3 exec awesome &
DISPLAY=:3 geany &
DISPLAY=:3 dolphin &
DISPLAY=:3 sakura &
DISPLAY=:3 chromium-browser &
DISPLAY=:3 fcitx &
代码: 全选
Xephyr :4 -fullscreen -keybd ephyr,,,xkbmodel=pc105,xkblayout=us,xkbrules=evdev,xkboption=euro -noreset -dpi 96 -ac -name openbox -title openbox &
sleep 5
#xkbcomp :0 :4 &
DISPLAY=:4 exec openbox-session &
DISPLAY=:4 fcitx &
代码: 全选
Xephyr :2 -fullscreen -keybd ephyr,,,xkbmodel=pc105,xkblayout=us,xkbrules=evdev,xkboption=euro -noreset -dpi 96 -ac -name jwm -title jwm &
sleep 4
#xkbcomp :0 :2 &
DISPLAY=:2 jwm &
DISPLAY=:2 rox-filer -p default &
DISPLAY=:2 fcitx &
(1),需要在Xephyr中单独启动一个fcitx进程,才能输入汉字。我估计有的输入法不能同时开多个进程,就无法在这个环境中使用了。
因为已经改变了Xephyr指令的写法,这句指令可以省略了-----2011.08.07 注(2),xkbcomp :0 :n的作用是调整Xephyr的键盘布局,这条指令是我花了接近3个小时才google到的,是最简单最有效的指令,如果不输入这条指令,Xephyr内的键盘是混乱的,很多按键都错位了。当时郁闷死了,还好最后找到了办法解决。
(3),等用指令启动起来在Xephyr中WM以后,利用WM的菜单(以及快捷键)打开的程序是在Xephyr窗口里面的,不能切换到Xephyr窗口外面去(如果Xephyr是全屏模式,其实也不行,只是看不出来了),并且是Xephyr里面WM的风格布局。
但也有例外,比如chromium,假如主WM里面已经开了一个chromium,Xephyr窗口里面再打开的chromium就会跑到主窗口来,反之则不跑出来。
(4),可以在openbox里面再次打开openbox,诸如此类,这主要用于调试,比如改了配置文件,担心出错,就可以这么先来一次看看效果。同样适用于awesome等。调试awesome的命令是:
代码: 全选
awesome -c ~/.config/awesome/rc.lua.new
(6),软件设置:几个WM中打开的软件其实用的是一个~目录,一套设置文件,所以有时有点影响:在awesome中打开一次某个软件然后关闭,再到openbox里面打开他,往往发现这个软件就出现在awesome打开时布局到的位置和大小了,然后把他最大化,再关闭,在到awesome里面打开,软件很可能还是最大化状态,没有被自动布局,需要win-m切换一下。
(7),剪切板有问题:不能共享主WM中打开的全局剪切板,也不能在Xephyr窗口WM中开独立进程,Xephyr窗口WM没有全局剪切板可用。开另外一种类型的全局剪切板可用,但是我担心安全问题,没有开。与主WM共享剪切板有解决方案,如下:
(发现问题:如果一次复制成千上万个字符时,这个方法失效,同步过来的是乱码。慎用----2011.08.09)
先安装xsel:
代码: 全选
sudo apt-get install xsel
代码: 全选
#! /bin/bash
firstxserver=$1
secondxserver=$2
#set the variables to the default
echo . | xsel --display $firstxserver -b -i
echo . | xsel --display $secondxserver -b -i
clipboard=.
while [ 1 ]
do
#get the values of the clipboard
firstdislpayclipboard=$(xsel --display $firstxserver -b -o)
seconddislpayclipboard=$(xsel --display $secondxserver -b -o)
#if the first x servers clipboad chages
if [ "$firstdislpayclipboard" != "$clipboard" ]
then
#if it doesnt change to be blank
if [ $(echo $firstdislpayclipboard | grep ^$ -c) -ne 1 ]
then
#set the appropriate variables to be the contents of the first comand
seconddislpayclipboard=$firstdislpayclipboard
clipboard=$firstdislpayclipboard
xsel --display $firstxserver -b -o | xsel --display $secondxserver -b -i
else
#if it is blank set it to be .in case if its because the x server went down
echo . | xsel --display $firstxserver -b -i
fi
fi
#if the second x servers clipboad chages
if [ "$seconddislpayclipboard" != "$clipboard" ]
then
#if it doesnt change to be blank
if [ $(echo $seconddislpayclipboard | grep ^$ -c) -ne 1 ]
then
#set the appropriate variables to be the contents of the first comand
firstdislpayclipboard=$seconddislpayclipboard
clipboard=$seconddislpayclipboard
xsel --display $secondxserver -b -o | xsel --display $firstxserver -b -i
else
#if it is blank set it to be .in case if its because the x server went down
echo . | xsel --display $secondxserver -b -i
fi
fi
sleep 3
done
用下列命令打开这个文件:
代码: 全选
/path/to/file :0 :n
我还在继续测试中,如果能改进,会汇报出来。
****这个,有什么作用?****
1,装酷唬人:
启动到openbox里面,切换到桌面2,全屏启动一个awesome,再切换到桌面3里面,启动一个jwm......
唬人绰绰有余了,骗个女朋友什么的不难吧。
2,调试系统:
这个就不用说了
3,测试其他WM
也不用多说了
4,提高工作效率
这是我自己折腾这套系统的目的:
awesome工作效率高,但不适合用于im(即时通讯工具),因为他会自动把IM的窗口给“布局”了,并且不能随意移动。
openbox适用于IM,可是在处理事物型工作方面比awesome低太多了,awesome把几个窗口一起开着,布局一下,就是方便。
也许有人有本领把awesome设置成浮动窗口可以自由移动,也许有人能够把openbox设置成可以自动布局,但总归这不是他们擅长的东西,强硬设置成了那样子也不会真正好用,还不如干脆把他们都启动起来。分工合作。
有了这个,鱼和熊掌就能兼得了。我的机器同时开openbox和awesome,并不很慢(这两个都是轻量级的)
几个注意事项:
1,一定要记住主WM关闭窗口的快捷键,Xephyr窗口全屏时,关闭掉里面的WM,Xephyr窗口很可能不会自动关闭,这时需要按一下关闭窗口的快捷键(openbox和大多数WM里面是ctrl+f4,awesome里面默认是win+shift+c)
2,注销主WM时,有很大可能会把Xephyr和里面的WM一起灭掉。所以尽量先关闭掉Xephyr窗口(包括全屏窗口)再注销主WM。
(全文终)
(测试还在进行中,请关注最新进展)