怎样让linux启动后不运行桌面而是运行自己写的图形界面程序? 怎么才能启动X,但是不要桌面程序呢?让linux一进去就直接...

作者&投稿:以诞 (若有异议请与网页底部的电邮联系)
本文以redhat 8.0操作系统平台为背景,阐述如何实现启动级别为3时的自动登录,及自动运行相应程序,并简要介绍了如何在redhat 8.0下自动登录X window(系统启动级别为5),并自动运行指定的应用程序。
一、启动级别为3时自动登录的实现

启动级别为3时自动登录的实现涉及两个软件包:mingetty-1.00-3.src.rpm软件包及util-linux-2.11r-10.src.rpm软件包。

(1)mingetty-1.00-3.src.rpm软件包
对于启动级别为3的自动登录的实现,仍然需要考察/etc/inittab脚本,
3:123:respawn:/sbin/mingetty tty3

因此,如果想在启动级别3的情况下实现自动登录,必须要了解mingetty的功能,甚至要修改mingetty的代码。用命令rpm -qf /sbin/mingetty 可知redhat 8.0版本的mingetty包含在mingetty-1.00-3.src.rpm软件包中,下载该软件包,安装源代码,缺省情况下,代码会安装在/usr/src/redhat/下,我们关心的只是mingetty.c源文件。mingetty.c约有五百行代码,主要实现如下功能:

打开指定的tty(由参数指定);
提示用户登录(login:);
获得登录用户名;
把用户登录名作为参数,调用/bin/login。

我们所关心的部分实质上只有以下三行:

... ...
438 while ((logname = get_logname ()) == 0); //mingetty.c文件438行
439 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
440 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
... ...

第一行的功能是输出login提示,并获得用户输入的登录用户名,登录用户名由logname返回。因此,可作如下修改

... ...
438 // while ((logname = get_logname ()) == 0); //注释掉本行,不再提示login:
439 logname = "root"; //添加本行代码
440 execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL);
441 error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]);
... ...

注意,这里假定用户以超级用户身份登录。

第二行以用户登录名为参数,调用/bin/login程序,进一步实现登录。因此,要想实现自动登录,还应该了解/bin/login的功能,必要时还应修改其源代码。

第三行为出错处理。

(2)util-linux-2.11r-10.src.rpm软件包
采用同样的方法,查看/bin/login所属软件包(redhad8.0版本的login包含在util-linux-2.11r-10.src.rpm软件包中),下载并安装util-linux-2.11r-10.src.rpm,login可执行文件有几个源文件编译而成,我们最关心的是login.c源文件(大约1500行的代码)。下面简要分析一下login要实现的功能,并对相应部分作必要的修改。

Login程序主要可以分为以下几个主要部分:

1.Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc/nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;
2.如果登录用户是超级用户,那么login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。
3.经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。
4.顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)
5.login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local/bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:
6.login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc/passwd中没有给出当前工作目录,则使用"/"。
至此,一个完整的登录过程就结束了。

从以上对login源程序分析过程中可发现,如果要实现自动登录,应该在第三步做文章,设法绕过提示输入密码以及对密码进行验证这一过程。实际上很简单,login源程序对是否要求输入密码设置了一个开关控制passwd_req,缺省情况下,其值为1(passwd_req = 1),即要求输入密码进行身份验证。把该行代码改为(passwd_req = 0)后,问题就解决了。即对源文件作如下修改即可:

... ...
402 fflag = hflag = pflag = 0; //login.c文件402行
403 //passwd_req = 1 //缺省时,要求进行密码验证,注释掉本行
404 passwd_req = 0 //添加本行
... ...

修改后,可以直接使用util-linux-2.11r-10.src.rpm提供的Makefile进行重新编译,也可以自己对其编译:

gcc -o login login.c setproctitle.c checktty.c xstrncpy.c -Wall -lcrypt注意包含后面的编译选项-lcrypt,否则会出问题。

有了新版的mingetty及login后,拷贝mingetty到/sbin/目录,拷贝login到/bin目录,并将/etc/inittab中的启动级别设置为3,再重新引导系统即可(读者可以自己写一个脚本实现上述过程)。

如果读者对mingetty或login代码的其他部分感兴趣,可以反复修改login.c或mingetty.c的源代码,测试一下代码的功能,这里要注意的是,在拷贝新版mingetty和login之前,一定要把原来的mingetty和login备份,同时还要准备系统引导盘(有系统安装盘亦可,这样读者有机会键入linux rescue),在测试新版程序前更应如此,如果对代码修改稍有不当,系统将不能正常启动。

如果不想再作进一步的代码测试,只是按本文给出的方法进行代码修改,在系统启动上不会出现什么问题。

二、自动登录后,自动运行特定的应用程序

在实现了启动级别3时的自动登录后,自动运行应用程序非常简单,把应用程序添加在/etc/rc.d/rc.local脚本中既可。(读者可以尝试一下把startx加入脚本中,看一看效果如何。在某种意义上,又增加了一种自动登录X window的方法)

三、对自动登录X window(系统启动级别为5),并自动运行指定的应用程序的补充

在"如何实现自动登录linux"中,主要以redhat 7.2平台为背景进行阐述的,其中的自动登录部分可以直接用于redhat 8.0中,不需要任何修改。

但是,登录后自动运行应用程序的接口在redhat 8.0中有所不同,主要是登录gnome后,自动运行应用程序的接口有所改变:首先点击面板上的GNOME帮助(那个红色的小帽子),然后选择/其它/首选项/Sessions,在Session对话框的启动程序属性页中添加要启动的程序即可。

对于登录kde后,自动运行程序的接口没有改变。

四、结论

本文同"如何实现自动登录linux"一文,基本上解决了如何实现自动登录Linux,并自动运行相应应用程序的问题。对于两个最常见的启动级别(3、5),都给出了各自的方法。

在系统初始化到mingetty及login这一阶段,内核实际上已经完成了引导过程,已经到了系统初始化的最高阶段,与内核没什么关系了。此时,主要是/sbin/init根据/etc/inittab的内容而相机行事。读者可通过(man 8 init)或者(man 5 inittab)了解更多东西。

在对文中提到的软件包修改时,请遵守GNU General Public License(GPL)相关标准,另外,替换login通常被视为黑客行为,应当谨慎行事。

参考文献

1.login手册页面
2.mingetty-1.00-3.src.rpm,在redhat 8.0的发行版本的源代码中,包含该软件包;
3.util-linux-2.11r-10.src.rpm,

可在http://rpmfind.net/linux/RPM/redhat/8.0/i386/util-linux-2.11r-10.i386.html处下载,注意下载源代码包(..src.rpm)

关于作者

郑彦兴,男,现攻读国防科大计算机学院博士学位。您可以通过电子邮件 mlinux@163.com和他联系

楼主看看 startx 这个常见命令,他其实就是一个启动 X 进程,之后再由 X 进程启动一个 session 程序的东西。
你可以把启动 session 进程的地方改成启动你的程序的内容,这样 startx 就可以启动 X 后直接启动你的程序了。
其实 start 在某些系统里面,会首先看当前用户目录里面的 .xinitrc ,如果有就执行这个脚本,这个脚本用 exec 命令启动你的程序就行了。
这种系统你可以方便的添加一个专用的用户,之后在用户目录里面写好 .xinitrc 。
之后在 inittab 或者 rc.local 里面写上 su user -c startx 就行了。

另外,不一定非要用 startx ,你只要知道如何启动 xinit 后再启动你的程序就行了。

这一切都是看系统的设计。
最佳的还是看看如何自己写脚本启动 X ,再由 xinit 进程启动你的图形程序。这是最正统的办法。详细可以参考 xfce4 ,他自己有一个 startxfce4 的脚本,这个好像是绕过 startx 命令的,当然其实他们俩没啥区别,就是一个启动默认的界面,一个启动 xfce4 而已。

把你的程序放到这个目录下行麽?
在/etc/rc.local文件中加入你想启动的东西 因为这个目录是Linux启动必须检测执行的一个目录。

不进入图形界面,只要把/etc/inittab 里面的id:5:initdefault:其中的5改成3即可.

运行自己的程序有好几种方法, 参考这个吧:

http://www.examda.com/linux/fudao/20080609/111936861.html

如下例,把initab里的
x:5:respawn:/usr/bin/xdm -nodaemon
改成
x:5:respawn:/usr/bin/my_program

ps:你的系统里不一定是 xdm,可能是 gdm之类的,都一样,改了

怎样让linux启动后不运行桌面而是运行自己写的图形界面程序?~

把你所有需要起的程序都写到/etc/rc.local里面
需要起xserver就写x
:0&
然后再起你自己的界面程序
或者直接改x的配置文件,改成你自己的界面管理器

要先自动登录才行
有另一个办法:
安装一个xdm,
去/etc/X11 目录下,有一个脚本,会在xdm运行时执行,
可以用来运行任何程序,包括图形程序,
不过,那个登录窗口会时钟存在,
可以配置登录窗口显示在屏幕以外,就不会影响显示了。

linux控制台启动程序后,关掉控制台不让程序停止
答:在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:./test.sh & [1] 17208

Linux下如何让某指令在后台一直运行
答:该终端标签页也不能关闭。这就带来了很多不便,那么如何让其在后台持续运行,退出运行状态和关闭终端标签页也不影响呢?方法就是在该命令后面加  &   符号,即可。示例 gocron的客户端服务运行命令,./gocron web 图2退出和关闭标签页后,图三依然如此,服务也可以使用。

Linux启动界面linux启动界面
答:3-Fullmultiusermode//完全多用户模式,标准的运行极,即命令行界面。4-unused//一般不用,但在一些特殊情况下可以用他来做一些事情。5-X11//选择此项,系统在登录时将进入图形化登录界面。6-reboot(DoNOTsetinitdefaulttothis)//重新启动(不要把initdefault设置为6,因为这样会使Linux不断重新启动)(...

linux桌面切换命令行linux桌面切换
答:Ubuntu怎么从图形桌面切换到命令行界面?工具/材料:电脑,UbuntuDesktop 1、打开系统后,在BIOS引导界面选择菜单中,点击“Ubuntu”,“e”键进入编辑模式。2、在出现的编辑项里,在GRUB解析内核的参数末尾给出引导运行级别,3。3、按CTRL+X或F10引导系统,启动之后就是命令行模式了。4、将GRUB_CMDLINE_...

linux怎么开启桌面模式
答:如果Linux系统安装有图形界面的情况下,启动linux后在终端下输入:startx#即可进入X11的桌面图形操作模式 希望每次进入Linux都自动进入桌面模式,需要修改inittab文件。vi /etc/inittab #找到id:3:initdefault: #按i键进入编辑模式,将3改为5,然后按esc退出编辑,输入 :qw 保存。如果系统没有安装图像...

桌面图标固定位置不让移动
答:在Linux系统下,固定桌面图标的位置也是可以实现的。不同的Linux系统可能有不同的方法,这里我以Ubuntu系统为例。1. 首先,我们需要安装一个叫做“dconf-editor”的程序。我们可以打开终端,输入以下命令来安装该程序:sudo apt-get install dconf-editor 2. 安装完毕后,打开“dconf-editor”程序,找到...

启动虚拟机后进入linux操作系统,只有命令行没桌面,怎么在命令行启动桌...
答:修改在/etc/inittab文件下initdefualt:3 把3改为5 就可以了 或者每次在命令行输入startx 或者init 5

如何将前台程序,后台运行?
答:1。下载pitaschio 可以最小化到托盘,然后在任务栏属性隐藏对应的托盘图标,就可以后台。2。使用虚拟桌面程序,当前桌面看不到程序。这样占用CPU及内存都有点大。3。也有这方面的程序。度一下,http://www.baidu.com/s?ie=gb2312&bs=%B3%CC%D0%F2+%B5%BD%BA%F3%CC%A8&sr=&z=&cl=3&f=8...

linux显示桌面快捷键linux显示桌面
答:二、再次从上面分析的结果看到,当前运行级别是3,而且也没有安装桌面环境的软件。然后我们使用命令查看一下桌面有哪些桌面环境的软件,然后装显示出来的软件组件就可以了。linux桌面分辨率怎么设置?1 /8 打开Linux操作系统,登陆到桌面。此时可以明显看出,这个分辨率对我的Linux不合适,字体太小看不清。2...

redhat7.0 linux开机后桌面打不开是咋回事,好像是直接进入家目录,桌 ...
答:应该是桌面没有装好,建议重装桌面就可以解决了;系统安装完只是第一步,还需要深入的学习系统,这方面我给你推荐我正在看的书,基于红帽最新版本写的书,我几乎每天都在看。