在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、开机闪屏不稳定,有时出有时不出。

[分享]在ubuntu9.10下实现开机自动登录并运行自己的图形程序的更多相关文章

  1. Linux开机自动登录(文本模式)

    • Linux系统启动登录过程 以RedHat/CentOS为例,Linux系统Level3模式下从启动到登录的整个过程大致如下: 1> 加载BIOS信息:包含了CPU/显卡/内存/硬盘/网卡等 ...

  2. Windows开机自动登录账户

    如何在Windows设了账户密码的情况下开机自动登录账户,有以下两种方法. 通过Windows设置自动登录 按“Win+R”组合键打开“运行”框内输入“netplwiz”. 打开以下窗口,将“要使用本 ...

  3. Linux设置以root用户开机自动登录桌面

    目录 Ubuntu 18.04系统下设置 Redhat7.6系统下设置 Ubuntu 18.04系统下设置 1. 允许使用root用户登录桌面    Ubuntu默认不允许使用root用户登录桌面的, ...

  4. Windows 设置开机自动登录

    1. 自己一些windows的虚拟机 有时候开机之后 输入用户名密码时间特别长. 需要等待很久, 如果能够设置开机自动登录的话 能够节约很多时间. 2. 最简单的办法  运行输入 control us ...

  5. Windows开机自动登录及取消自动登录的设置

    开机自动登录 1.开始菜单搜索框输入 “netplwiz” 按回车 或“Win+R”组合键打开“运行”框内输入“netplwiz” 或“运行”框内输入“control userpasswords2”( ...

  6. WIN7开机自动登录设置

    WIN7开机自动登录设置 1    执行rundll32 netplwiz.dll,UsersRunDll 开始菜单中找到运行并单击运行:如下图1所示                         ...

  7. Win10如何设置开机自动登录

    原文:Win10如何设置开机自动登录 第一步: 小娜搜索"netplwiz",进入用户账户设置. 第二步: 先勾选选中一次,要使用本计算机,用户必须输入用户名和密码. 第三步: 取 ...

  8. Linux图形界面从登录列表中隐藏用户和开机自动登录

    从GDM-GNOME显示管理器:“ GNOME显示管理器(GDM)是一个管理图形显示服务器并处理图形用户登录的程序.” 显示管理器为X Window System和Wayland用户提供图形登录提示. ...

  9. windows server 开机自动登录并锁定

    这个操作对于广大使用Windows(包括xp/win7/2003/2008 R2 等windows 系统) 的上班族会有点用. 其一:如果是个人吧系统(win7.xp)上班时候打开电脑,自动登录,系统 ...

随机推荐

  1. 【bzoj2959】长跑 LCT+并查集

    题目描述 某校开展了同学们喜闻乐见的阳光长跑活动.为了能“为祖国健康工作五十年”,同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上熙熙攘攘,摩肩接踵,盛况空前.为了 ...

  2. P3153 [CQOI2009]跳舞

    题目描述 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会”单向喜欢“) ...

  3. [CF1000E]We Need More Bosses

    题目大意:给一张无向图,要求找一对$s$和$t$,使得其路径上的割边是最多的,输出其数量. 题解:把边双缩点以后求树的直径. 卡点:无 C++ Code: #include <cstdio> ...

  4. Apache2.4启动时报AH00526错误(Invalid command 'Order')

    在WIN XP下手动配置PHP环境,安装Apache2.4+fastcgi后,重启Apache服务,出现如下提示: AH00526: Syntax error on line 293 of D:/ph ...

  5. js加解密的算法

    //字符串和数字互转 var str="a" var r = str.charCodeAt(0); //97 10进制 console.log(r); var t=String.f ...

  6. linux查看日志的方法

    linux查看日志文件内容命令tail.cat.tac.head.echo tail -f test.log你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, ---------- ...

  7. css垂直居中的几种方式

    1. 对于可以一行处理的 设置 height:apx; line-height:apx; 2.对于一段文字(会多行显示的)            ->2.1如果是可以设置一个固定高度的      ...

  8. 汕头市队赛 SRM13 T2

    这道题很容易想到是二分 但是因为可能会爆LL 所以要加一波特判 #include<cstdio> #include<cstring> #include<algorithm ...

  9. xmlhelper类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xm ...

  10. Linux内核驱动之延时---内核超时处理【转】

    转自:http://blog.chinaunix.net/uid-24219701-id-3288103.html 内核超时处理 jiffies 计数器 定时器中断由系统定时硬件以规律地间隔产生; 这 ...