在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 getty
util-linux: /usr/share/doc/util-linux/README.modems-with-getty.gz
util-linux: /usr/share/man/man8/getty.8.gz
util-linux: /sbin/getty
util-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.gz
util-linux_2.12r-11ubuntu2.dsc
util-linux_2.12r.orig.tar.gz
util-linux-2.12r
源代码即在util-linux-2.12r文件夹中。
(注:在9.10中此包更新为2.16版本,显示结果如下:
util-linux_2.16-1ubuntu5.diff.gz
util-linux_2.16-1ubuntu5.dsc
util-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 // else
613 // 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 login
login: /bin/login /etc/login.defs /usr/share/man/man1/login.1.gz
$ sudo cp /bin/login /bin/login.bak
$ sudo cp login /bin/
$ whereis getty
getty: /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、开机闪屏不稳定,有时出有时不出。
并运行自己的图形界面程序
(本人接触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 getty
util-linux: /usr/share/doc/util-linux/README.modems-with-getty.gz
util-linux: /usr/share/man/man8/getty.8.gz
util-linux: /sbin/getty
util-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.gz
util-linux_2.12r-11ubuntu2.dsc
util-linux_2.12r.orig.tar.gz
util-linux-2.12r
源代码即在util-linux-2.12r文件夹中。
(注:在9.10中此包更新为2.16版本,显示结果如下:
util-linux_2.16-1ubuntu5.diff.gz
util-linux_2.16-1ubuntu5.dsc
util-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 // else
613 // 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 login
login: /bin/login /etc/login.defs /usr/share/man/man1/login.1.gz
$ sudo cp /bin/login /bin/login.bak
$ sudo cp login /bin/
$ whereis getty
getty: /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、开机闪屏不稳定,有时出有时不出。