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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样让linux启动后不运行桌面而是运行自己写的图形界面程序?相关的知识,希望对你有一定的参考价值。

就是像启动桌面一样启动自己写的应用程序,但是桌面不要了,只显示我的程序
换句话说,就是我想把一个普通的linux版本修改成一个专用的linux,比如一个手持设备,这样再启动的时候就不希望看到桌面啦之类的东西,而是直接进入到我的应用程序界面,和手机启动效果类似.

求助Moblin 2.1下 或者ubuntu 9.10 下的解决方案!!!!!!!!!!!

感谢一楼 糊涂王杂货铺 的回答,不过你好像没有明白我的意思,你说的不进图形界面和开机自动运行这个我知道,我想要实现的就是跟手机开机一样,linux启动后,进入图形界面,但是这个图形界面不是桌面,而是我自己的程序,也就是说用户感觉不到桌面的存在,只能见到我的图形化的应用程序.不知这样说您能否理解我的意思?可有相关的办法?

感谢 二楼 kwydwuf 的回答,我觉的你的回答已经非常接近了,我用moblin调试了,运行的时候会出错,可能是还要运行图形管理什么的东西,不知是否有相关的办法?

本文以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和他联系

参考资料:http://bbs.chinaunix.net/thread-146757-1-1.html

参考技术A 楼主看看 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 而已。
参考技术B 把你的程序放到这个目录下行麽?
在/etc/rc.local文件中加入你想启动的东西 因为这个目录是Linux启动必须检测执行的一个目录。
参考技术C 不进入图形界面,只要把/etc/inittab 里面的id:5:initdefault:其中的5改成3即可.

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

http://www.examda.com/linux/fudao/20080609/111936861.html
参考技术D 如下例,把initab里的
x:5:respawn:/usr/bin/xdm -nodaemon
改成
x:5:respawn:/usr/bin/my_program

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

怎样让win8系统默认以管理员身份启动DOS命令行窗口

参考技术A   CMD(命令提示符)对一些用户而言,使用频率非常高,而且需要是以管理员身份启动。其实我们可以设置默认以管理员身份启动CMD,我们来看看Win8下如何操作。
  操作步骤
  第一步、在桌面右键新建文本文件,复制以下代码到记事本中。
  reg
add
"HKEY_CURRENT_USERSoftwareMicrosoftWindows
NTCurrentVersionAppCompatFlagsLayers"
/v
"c:windowssystem32cmd.exe"
/d
"RUNASADMIN"
/f
  Win8默认以管理员身份启动CMD的方法
  第二步、点击文件菜单,选择“另存为”,在另存为对话框,将保存类型设置成“所有文件”,然后将文件命名为“CMD.BAT”。
  第三步、在桌面右键单击CMD.BAT文件,菜单中选择“以管理员权限运行”,操作完成后,试一下在运行中执行CMD命令,是不是打开就是管理员:C:windowssystem32cmd.exe界面了?

  相信这个简单的操作过程对多数用户不成问题,对CMD有较高使用需求的用户可以赶紧设置起来。

以上是关于怎样让linux启动后不运行桌面而是运行自己写的图形界面程序?的主要内容,如果未能解决你的问题,请参考以下文章

windows系统启动时怎样阻止mysql和apache自动运行?

win10远程桌面断开后,所有的进程都会自动关闭,怎么设置让程序一直运行下去

怎样修改自己创建桌面快捷的图标

linux启动后自动登录并运行自定义图形界面程序

怎么将自己写的程序添加到linux服务中,用service命令来启动或停止

怎样防止App在后台运行,点击应用桌面图标重新启动?