ubuntu 12.04设置开机启动图形应用程序,替换默认图形桌面

想把ubuntu 12.04的开机设置模式改为默认为命令方式,搜索半天,现将成功的方法转出,并感谢作者。
http://blog.csdn.net/liebergott/article/details/7793408  我只用了设置runlevel内容,其他未验证,保留以为后用。

一、前言

无论你想要在ubuntu 12.04(11.10适用)开机启动图形程序,或者非图形程序,相信这篇文章能帮上大忙。

我将根据我的需求讲解我的做法,并解释为什么这么做。完了以后,各位看官根据自己的需求不加修改或稍加修改即可适用。我这边,总得来说,需求是做一个RDP瘦客户端,在一个板子上装上ubuntu12.04,然后要这个系统启动后能立即弹出RDPclient登录框,而不是进入ubuntu的图形桌面。

二,三部分讲解我是怎么做的,四部分总结设置程序为开机启动的方法,五部分主要针对需要把图形界面程序弄成开机启动的同学,讲解startx。

第六部分为后来补充的:如何关闭ubuntu的启动时载入画面(“loadingscreen”)。


二、阻止默认图形桌面启动

ubuntu12.04默认的开机会进入一个图形界面,用命令pstree可以看到图形界面所在的进程树:



首先要做的,就是阻止这个lightdm的进程开机启动。 做法:

一、查看文件/etc/init/rc-sysinit.conf,在第14行附近:确认“envDEFAULT_RUNLEVEL=2”。2是新装系统默认的,确保不被修改。

二、编辑文件/etc/init/lightdm.conf,在第12行附近,原句“ and runlevel[!06]” 改为“ and runlevel [!026]”。

解释:linux系统都有一个运行级别(runlevel)的概念,不同的运行级别配置将导致系统的启动过程有很大差异,比如当配置runlevel 为 1是,是不进入图形界面的。系统启动过程中会有一个init进程来拉起许多其他进程(各种系统服务,窗口界面)。在ubuntu上(11.10,12.04是这样,其他版本或其他linux发行版不确定)init会执行两个目录下的脚本,一个是/etc/init/下的,另一个是/etc/rc?.d/下的,问号可能是0~6的其中一个数字,代表运行级别。接下来,讲解一下流程以加深理解。

在ubuntu上,init进程首先执行/etc/init/目录下的rc-sysinit.conf,这个文件指明了本次启动的默认运行级别。这是上面第一步的意义:确保默认运行级别是2。接下来目录/etc/init下的其他脚本的执行都会根据不同的运行级别做出不同的动作,比如lightdm会判断运行级别是否处于1,2,3,4,5中的一个,是则启动lightdm,不是则不启动lightdm。这便是上面第二步的意义,修改lightdm.conf,把“2”加入到判断语句,使得lightdm在运行级别2的时候不要启动。明白了这些,你就可以灵活一点,例如把默认级别设置为3,而把3加入那个判断语句,也可以达到阻止lightdm启动的效果。完成了/etc/init/目录下的启动动作,init进程会继续执行/etc/rc2.d目录下的脚本。


三、设置自己的程序为开机启动

阻止了lightdm的启动之后,还要做的就是把我的RDPClient设置为开机启动。做法:

一、在目录/usr/bin下,有个文件startx,在当前目录复制出一份来,命名为mystartx(cpstartx mystartx)。编辑mystartx,在文件末尾有一行“xinit "$client" $clientargs --"$server" $display$serverargs”,在这一行的前面加入一行"client="/root//myRdpClient/myRdpClient.py"。

二、编辑文件/etc/rc.local,在"exit0"前添加一行:/usr/bin/mystartx。

解释:第一步里,我制作了一个启动RDPClient的脚本,第二步里,我把这个脚本设置为开机启动。制作RDPClient或其他图形应用程序的启动脚本请看本文的第五部分,第四部分讲解开机启动的方法和注意事项。


四、添加开机启动程序的方法及其注意事项

对于开机启动程序,需要关注4个地方(排序有分先后):1.目录 /etc/init/下的所有conf都会被init进程首先执行。2.运行级别为2的时候,目录 /etc/rc2.d/下的所有脚本会其次执行,其他运行级别雷同。3.文件/etc/rc.local里的命令会得到执行。4.在文件/etc/crontab里面配置为@reboot的命令会得到执行。
以下分别讲解每个地方该怎么做。

1.在/etc/init/目录下添加开机启动程序的方法。该目录下新建文件myrdpclient.conf。将下面的内容拷贝至文件保存即可。

start on login-session-start

script

    /usr/bin/mystartx
end script

这样init进程就会启动的时候执行/usr/bin/mystartx。之前我解释运行级别(runlevel)的时候,说这个目录下的是脚本,是不想在那个地方废话。其实,这个目录下的.conf文件是供init进程读取的配置文件,每个配置文件的内容包含两个内容,一是一段脚本在告诉init要启动哪个程序,即指定一个job,或者说任务;二是一些标签(如“starton”)表明这个程序在什么时候启停。首先被读取执行的是rc-sysinit.conf。关于具体该如何写一个conf文件来让init在适当的时候运行某个程序请自行搜索,我给出个这个配置是个非常简单的配置,如果你需求不多的话,把/usr/bin/mystartx替换为你的程序就够了。

2.在/etc/rc2.d目录下添加开机启动程序的方法。执行命令:

ln -s /usr/bin/mystartx ./S99mystartx

这个命令将会该目录下建立一个指向/usr/bin/mystartx的链接,这样init在启动时就会执行这个链接指向的命令。那个S99打头的命名规则,我其实不清楚其意义是什么,大约是在标明启动优先级。总之,你只需要将/usr/bin/mystartx替换为你想要执行的命令(你的程序),同时链接的名字以"S99"为前缀即可。

3.在/etc/rc.local文件里添加启动程序,在“exit0”之前写上你的命令就可以了,我正是这么做的。

4.在文件/etc/crontab里添加开机启动程序,编辑该文件,在文件末尾添加一行:

@reboot   root /usr/bin/mystartx

这样你的程序会被一个叫 cron 的例程拉起(而不是 init ),实际上,是 init在启动过程中启动啦 cron 例程,而 cron 例程通常在系统中做一些定时作业,通过配置也可以让 cron在启动时做一些作业。

 

 


所以,如果你要添加自己的开机启动程序,以上四个地方都可以,其中要大家注意的几点:

一、前两种方法可能是不稳妥的,因为这两个阶段是系统启动阶段,你添加的程序若对系统某些服务有依赖,将导致你的程序出现错误,比如我的RDPclient会出现段错误。

二、第三种方法,添加到/etc/rc.local里面,是网上出现最多的答案,这也是我采用的方法。。事实上,rc.local是系统特地为用户提供的一个添加开机启动程序的接口。需要注意的是,并非每个运行级别都会运行rc.local,在ubuntu里只有2,3,4,5运行级别会执行,所以如果运行级别设置不对的话,你写在rc.local里的命令可能就不能如期执行了。如果你对rc.local如何被执行感兴趣的话读下面。实际上运行rc.local是rc2.d目录下所有脚本中的最后一个脚本。接下来证明这点,可以在rc2.d目录下执行命令:ls-l:

S99rc.local ->../init/rc.local

可以看到,rc2.d目录下的S99rc.local是一个到/etc/init.d/rc.local 的链接,运行 S99rc.local 就是在运行 /etc/init.d/rc.local,而打开这个文件发现里面的注释:

# Default-Start:    2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist

实际上,就是在运行 /etc/rc.local。所以,执行rc2.d目录下的所有脚本,最后一步,就是执行 /etc/rc.local。其中的注释同样表明了只有2、3、4、5运行级别会执行rc.local,这是因为,只有在2、3、4、5对应的 /etc/rc?.d目录才有运行 rc.local 的链接。




五、制作图形应用程序启动脚本

对于要开机启动非图形界面的同学来说,事情是非常简单的,在rc.local里添加你的命令即可(或者使用第四部分的其他方法)。之前的阻止lightdm启动你都不需要做,做了也无妨。至于运行级别,你没动过的话应该是2,是ok的。

对于要启动图形化界面的同学,要知道为什么我在startx里面添加一行,设置为开机启动,同时屏蔽lightdm的启动,就可以达到目的,可能还需要进一步的说明。

在linux里,要运行图形界面,需要同时有 X server(或者叫X11server,"11"是当前的版本号), 和X client,这是 x windows工作的模式(据说以后会改成wayland什么的,那是后话)。X server在目录 /etc/X11 下,Xserver启动后的进程名字叫 Xorg ,如果你的系统启动了图形桌面。那么运行命令 pstree一定可以看到Xorg,正如我在第一部分的贴图里显示,在那里,Xorg 是被 lightdm 拉起来的。

所以,如果ubuntu系统要跑图形程序,不管是它的默认图形桌面lightdm,还是我的RDPClient,都必须先启动X server(Xorg),再启动图形程序作为Xclient。没有修改过的ubuntu的图形桌面就是这样启动的,从图中你可以看到它先启动了Xorg,再启动了自己的一大堆metacity什么的。那么,我现在阻止了lightdm的启动,要运行RDPCLient,也同样要分两步:一、启动Xserver,二、启动RDPClient(作为X client)。

这看起来真难,因为我其实也不知道如何启动X server。但是在 /usr/bin下有一个脚本叫 startx。这个脚本是个历史遗留脚本,在过去的ubuntu,或者现在某些其发行版本linux,是这个脚本负责启动默认的图形桌面的。它会做两件事,一、启动X11server,二,启动图形桌面作为Xclient。我可以拿这个脚本稍作修改,替换掉其中的图形桌面为我的RDPClient就可以了,具体做法在第二部分。

为什么我不修改lightdm.conf来达到目的?lightdm也是做了两件事,不是也可以替换它的Xclient为我的Xclient就可以了么?也许这样是可以的,但是,lightdm.conf那个脚本,哥们儿,你去看看吧,我反正下不了手。反观startx,startx的启动逻辑是非常清晰的,它通过执行了一个xinit 命令来同时启动X server 和 X client,建议你使用命令“man xinit”查看xinit的相关内容。修改startx来达到目的比较容易,这就是为什么我不修改lightdm。

总结,阻止lightdm启动默认桌面,通过修改startx来制作一个脚本mystartx以启动Xserver和我的RDPClient,把mystartx搞成开机启动。这是这样!


六、关闭Ubuntu的载入画面

ubuntu启动时,会有一个ubuntu字样出现在屏幕,文字下方有闪烁的点,这时按ESC可以在动画和文字界面之间切换。这一步骤不属于lightdm,而是一个叫plymouth 的进程在起作用。实际上,plymouth的意义就在于,在开机到图形桌面(lightdm)起来这段时间里展示出一个动画,从而提高用户体验。

屏蔽的方法:

一、编辑 /etc/default/grub 文件,原文11行附近:

GRUB_CMDLINE_LINUX_DEFAULT="quietsplash" 

去掉”splash“,改后:

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

二、执行命令:

sudu updat-grub

重启,即可看到,不再有载入画面出现了。


以下引自 :http://hi.baidu.com/bihailan/blog/item/f12e78c8cb77821f7e3e6fba.html 感谢他的辛勤工作!


Ubuntu的默认开机的runlevel是2,可以用runlevel来查看当前的默认运行级别。

debian系(ubuntu是基于debian)的Linux一直是用runlevel2来默认启动,并且runlevel定义也与redhat有区别。

debian的runlevel级别定义如下:
0 - Halt
1 - Single
2 - Full multi-user with display manager (GUI)
3 - Full multi-user with display manager (GUI)
4 - Full multi-user with display manager (GUI)
5 - Full multi-user with display manager (GUI)
6 - Reboot

可以发现2~5级是没有任何区别的。

######而redhat的runlevel级别定义如下:
######0 - Halt
######1 - Single
######2 - Not used/User definable
######3 - Full multi-user NO display manager
######4 - Not used/User definable
######5 - Full multi-user with display manager (GUI)
######6 - Reboot

对应的配置文件夹如下:
/etc/rc0.d Run level 0
/etc/rc1.d Run level 1
/etc/rc2.d Run level 2
/etc/rc3.d Run level 3
/etc/rc4.d Run level 4
/etc/rc5.d Run level 5
/etc/rc6.d Run level 6

这里的runlevel3-5都是进入图形界面。这与其他的linux发行版不太一致,通常runlevel3是Multi user mode,即直接登录到字符界面;而runlevel 5是Multi user mode withGUI,即登录到图形界面


    首先说一下我用的系统是:Linux version2.6.26-2-686 (Debian 2.6.26-17)    每次都进窗口界面,慢,而且也一般不用窗口界面,这个。。。要专业点嘛:)      
   网上找了N多相关信息,大部分是说改/etc/inittab里的defaultrunlevel,我装完debian后的defaultrunlevel是2,改成3之后(大部分这样说),reboot后还是进入了图形窗口界面。

正确的方法应该是这样的(说白了,runlevel2~5随便,你选定x就去修改/etc/rcx.d里的内容即可):

       第一步:先把/etc/inittab里的The defaultrunlevel改成3,因为以前其他版本的linux的3 runlevel就可以从字符界面启动。我们也把defaultrunlevel改成3。

       第二步:cd
到/etc/rc3.d目录,因为当系统以runlevel=3启动时,会到/etc/rc3.d这个目录里执行里面的脚本。有个
README文件,内容如下:

The scripts in this directory are executed each time the systementers
this runlevel.

The scripts are all symbolic links whose targets are locatedin
/etc/init.d/ .

To disable a service in this runlevel, rename its script in thisdirectory
so that the new name begins with a 'K' and a two-digit number,where the
number is the difference between the two-digit number following the'S'
in its current name, and 100.  To re-enable theservice, rename the script
back to its original name beginning with 'S'.

说得很清楚:这个目录下的脚本会在系统启动时执行(当runlevel=3时),如果想要某个脚本不执行,就重命名一下,重命名是有方法的:新的文件名是以“K”开头的(注意大小写),后面紧跟两位数字,这两位数字不能是原文件名中“S”后面的两位数字,当然也不能是100(都三位数了)。OK,看懂README后,就把S30gdm重命名为K31gdm。

      完成,reboot,直接进入字符界面了:)
 
     要想从字符界面进入图形界面,运行startx即可,当然,你得有这个权限。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值