在ubuntu9.10下实现开机自动登录 (转自)
并运行自己的图形界面程序(本人接触ubuntu时日不长,文中一些说法难免有错误和疏漏之处,还请大家不吝批评指正。)实现步骤分以下三大步:1、 实现ubuntu文本形式启动2、 实现ubuntu自动登录3、 实现程序自动运行一、文本模式启动:两种方法异曲同工:(1) 直接修改/etc/grub/grub.cfg找到类似下面的代码:53 linux /boot/vmlinuz-2.6.31-14-generic root=UUID=0f31592d-e741-42d7 -b577-8b0931f965f4 ro quiet splash 在splash后面 一个text,修改后如下:53 linux /boot/vmlinuz-2.6.31-14-generic root=UUID=0f31592d-e741-42d7 -b577-8b0931f965f4 ro quiet splash text 由于我在虚拟机中实验,默认的文本模式分辨率为640X480,因而为把分辨率调大,有在后面加了一句:var=791 将分辨率调为1024X768。还有就是把splash改成了nosplash,这是因为splash完后,有时会卡住,不知什么原因,所以索性不让它闪屏了,(还请知道原因的大侠点化一下)最终修改如下:53 linux /boot/vmlinuz-2.6.31-14-generic root=UUID=0f31592d-e741-42d7 -b577-8b0931f965f4 ro quiet nosplash text vga=791(2) 修改/etc/default/grub找到如下代码:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"将其修改为:GRUB_CMDLINE_LINUX_DEFAULT="quiet nosplash text"更新grub:$update-grub到此为止,我们就实现了以文本的模式启动。有一点儿还没有弄明白,就是我用runlevel查看的时候,会出现这样的结果:N 2如果再运行一次$init 2,然后$runlevel,结果如下:2 2不知道这个是否会有影响。有待进一步实验……二、实现ubuntu自动登录。要实现这一步,需要对两个文件进行修改,一个是getty,另一个是login。至于这两个文件的功能,我还没完全弄明白,在网上看过一些介绍,简单摘录如下:1)gettty主要实现如下功能:(心急的朋友可直接跳过此段) 打开指定的tty(由参数指定); 提示用户登录(login:);获得登录用户名;把用户登录名作为参数,调用/bin/login。2)login主要实现如下功能:(心急的朋友可直接跳过此段)Login首先检查登录者是否为超级用户,如果不是超级用户,并且存在/etc /nologin文件,则输出该文件内容,并中止登录过程;主要由checknologin()实现;如果登录用户是超级用户,那么 login必须在/etc/securetty/中指定的tty列表中实现登录,否则将导致登录失败。同样可以不指定/etc/securetty文件,此时,超级用户可以在任何tty上登录。经过前两步测试后,login接下来将提示输入登录密码(由getpass()调用完成,有兴趣的读者可参考其手册页面),并进行验证,如果密码不对,则提示重新登录。顺利经过密码验证后,login还将检查是否存在.hushlogin文件,如果该文件存在,则执行一次"quiet"登录(所谓的quiet登录指的是,登录时不再提示邮件mail,不再显示最后一次登录时间,不输出任何消息。启动级别为3时,正常情况下输出这些信息)login接下来设置登录tty的用户ID和组ID,并设置相应的环境变量,包括HOME、PATH、SHELL、TERM、LOGNAME等。对于普通用户来说,PATH缺省被设置成/usr/local /bin: /bin/usr/bin:;对于超级用户来说,PATH被设置成/sbin: /bin: /usr/sbin: /usr/bin:login的最后一步是为用户启动shell。如果在/etc/passwd中没有为用户指定shell,那么将使用/bin/sh,如果在/etc /passwd中没有给出当前工作目录,则使用"/"。至此,一个完整的登录过程就结束了。由上面的过程我们不难得出,为了要实现自动登录,我们可以不让getty提示输入用户名,在调用login时,不让login要求输入密码。要修改这两个文件,首先需要获取他们的源代码。我们可以通过以下几步来完成:(注1:以下六步摘自:http://blog.csdn.net/gothicane/archive/2007/08/17/1747956.aspx)(注2:原文作者是在6.10上实现的,包的版本号会有差异,不过变化不大,我会在变化的地方进行标注)(1)查找命令所属的deb包。$ dpkg -S gettyutil-linux: /usr/share/doc/util-linux/README.modems-with-getty.gzutil-linux: /usr/share/man/man8/getty.8.gzutil-linux: /sbin/gettyutil-linux: /usr/share/doc/util-linux/README.getty.gz由上面的输入,我们可以猜测到,getty命令由名字为util-linux的deb包提供。(2)下载deb包源代码$ sudo apt-get source util-linux在当前目录下即可得到util-linux的源码包,有如下文件:util-linux_2.12r-11ubuntu2.diff.gzutil-linux_2.12r-11ubuntu2.dscutil-linux_2.12r.orig.tar.gzutil-linux-2.12r源代码即在util-linux-2.12r文件夹中。(注:在9.10中此包更新为2.16版本,显示结果如下:util-linux_2.16-1ubuntu5.diff.gzutil-linux_2.16-1ubuntu5.dscutil-linux_2.16.orig.tar.gz util-linux-2.16)getty命令和login命令的源代码在util-linux-2.12r/login-utils/文件夹下。注意,此处于文章《如何自动登陆Linux》中不同之处在于,不需要下载两个source rpm包,而两个命令的源代码都在此处。其中,getty命令的源代码可以为agetty.c,login命令的源代码为login.c。getty 就是一个程序,他让你能从各种设备上登陆,比如虚拟终端,文字终端或是一个modem。他显示一个登陆提示符,一旦你键入用户名,getty把它传送到 login,login会向你要密码,认证成功后给你一个shell。有很多getty,有的发行版,包括red hat使用很小的,只能在虚拟终端上用的mingetty。login(登陆)程序是linux功能包的一部分,包含了一个名为agetty的 getty。(3)修改getty命令的源代码getty的功能一般包括:打开终端线,并设置模式;输出登录界面及提示,接受用户名的输入;以该用户名作为login的参数,加载login程序;缺省的登录提示记录在/etc/issue文件中。在agetty.c的源代码中的第366行和367行可以看到:(注:在2.16版本中,行号有所变动,但可以通过搜索找到这两行,行号为345和346。)366 while ((logname = get_logname(&options, &chardata, &termio)) == 0)367 next_speed(&termio, &options);此处调用了get_logname得到用户输入的用户名,get_logname在1014行调用了do_prompt函数,输出了登录的提示符,类似于“login:”。这里,我们把366和367行注释,直接赋值logname为root:(注:在2.16版本中,行号有所变动,但可以通过搜索找到这两行,行号为345和346。)366 //while ((logname = get_logname(&options, &chardata, &termio)) == 0)367 // next_speed(&termio, &options);368 logname = “root”;(4)修改源login命令的源代码login程序在getty的同一个进程空间中运行,接受getty传来的用户名参数作为登录的用户名。在login.c的源代码中的第407行: (注:在2.16版本中,行号有所变动,但可以通过搜索找到这一行,:/passwd_req.行号为425。)407 passwd_req = 1;通过对源代码的分析,此处为密码是否需要验证的一个开关。我们修改此处,把密码需要验证的开关直接关闭:407 //passwd_req = 1;408 passwd_req = 0;(注:在2.16版本中,还要注释掉下面四行:610 if (fflag && (getuid() == 0)) 611 passwd_req = 0; 612 else 613 passwd_req = 1;注释完后如下:610 // if (fflag && (getuid() == 0))611 // passwd_req = 0;612 // else613 // passwd_req = 1;)(5)编译生成可执行文件直接利用util-linux-2.12r/login-utils/目录下的makefile文件进行编译,直接打make命令,编译完成后,即可得到可执行文件:agetty和login。(注:在2.16版本中,需要先运行./configure ,而默认的configure文件中,编译不出login文件,需要对configure进行修改。vim打开configure文件:$vim configure搜索下列语句::/ enable_login_utils在15796行找到15796 enable_login_utils=no将其修改为:15796 enable_login_utils = yes保存退出::wq运行configure文件:$./configure出现如下错误:configure: error: ncurses or ncursesw selected, but library not found (--without-ncurses to disable)我们加上参数--without-ncurses从新执行./configure,成功。进入login_util目录,进行编译:$cd login_util$make这样就得出了agetty和login文件)下面备分系统原来的getty和login可执行文件。查找文件所在位置,并备份,把新生在的可执行文件移入相应的目录中,对agetty改名。$ whereis loginlogin: /bin/login /etc/login.defs /usr/share/man/man1/login.1.gz$ sudo cp /bin/login /bin/login.bak$ sudo cp login /bin/$ whereis gettygetty: /sbin/getty /usr/share/man/man8/getty.8.gz$ sudo cp /sbin/getty /sbin/getty.bak$ sudo cp agetty /sbin/$ sudo mv /sbin/agetty /sbin/getty最后这一步,也可以创建一个名字为getty的软链接到agetty。$ sudo ln -s /sbin/agetty /sbin/getty(6)重启系统在启动信息显示过后,系统将直接进入root用户登录状态,出现类似于下面的提示符:root@link-desktop:~#这表示我们已经顺利自动登Ubuntu系统中了。三、实现程序自动运行实现程序自动运行可以将要运行的命令添加到/etc/profile文件的最后这里先提一下之前实现的方法:(不好)由于ubuntu从文本模式登录,要运行图形界面程序,需要xwindow的支持(这里说的不一定对,我是凭自己理解写的,错误支持请大侠指正,以免起到误导作用),所以要运行xinit,再运行我们自己的程序。因此需要在/etc/profile最后加上下面一行:xinit mybinfile这样能够实现自动运行,但有很大的缺陷,就是自动登录以后xinit窗口先出现,大约一秒钟之后,自己的程序才会弹出来,中间衔接的太差。后来经eexpress 指导(在此严重感谢eexpress!!),修改方法如下:(1)在~目录下,新建.xinitrc文件,在里面写一句:exec mybinfile(2)在/etc/profile文件最后添加一句: startx到此为止自动登录搞定。四、目前尚存在的问题:1、程序运行后没有鼠标。2、进入有输入框的节目狂晃鼠标会出现一个鼠标指针,不过是个“X”行的符号,不知如何才能让它显示成箭头。3、开机闪屏不稳定,有时出有时不出。