在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. 【CF Edu 28 C. Four Segments】

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  2. Codeforces 934.B A Prosperous Lot

    B. A Prosperous Lot time limit per test 1 second memory limit per test 256 megabytes input standard ...

  3. js中哪些语句在if语句中默认为真

    结论:js中有一个函数是:Boolean(value)这个函数把一个value值转换成相应的boolean值. 当value为以下值是为true:1.任意的非空字符串 .2.任意的非0数字 而当val ...

  4. 知问前端——对话框UI(二)

    dialog()方法的事件 除了属性设置外,dialog()方法也提供了大量的事件,这些事件可以给各种不同状态时的对话框提供回调函数,这些回调函数中的this值等于对话框内容的div对象,不是整个对话 ...

  5. Linux Mint---fcitx中文,日语输入法

    安装中文输入法,我这边选了小企鹅,先前用过scim,稍微比较了下,效果还是这个好 安装可一步即可搞定 apt-get install fcitx fcitx-table-wubi-large fcit ...

  6. 【GDI+】MFC画图- 消除锯齿(转)

    原文转自 https://wenku.baidu.com/view/b5460979700abb68a982fbcf.html 在常规条件下,MFC画出来的图形.文字都是有锯齿的.如下图所示: 怎样才 ...

  7. 【原创】Linux环境下的图形系统和AMD R600显卡编程(8)——AMD显卡DRM驱动初始化过程

    前面几个blog对DRM驱动.显卡的显存管理机制.中断机制都进行了一些描述,现在阅读AMD drm驱动的初始化过程应该会轻松许多. 下面是一AMD的开发人员编写的文章(先暂时放在这里,后续有时间再添加 ...

  8. 基于Xen实现一种domain0和domainU的应用层数据交互高效机制 - 3

    继续 上一篇 的研究,结合 xen4.2.3 的代码分析,发现 xen4.2.3 的应用层工具库 tools 包含一个工具叫 libvchan ,其头文件描述如下: * This is a libra ...

  9. C程序编译过程浅析【转】

    转自:http://blog.csdn.net/koudaidai/article/details/8092647 前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接” ...

  10. (九)经典_STM32_ADC多通道采样的例子

    STM32 ADC多通道转换描述:用ADC连续采集11路模拟信号,并由DMA传输到内存.ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ.在每次转换结束后,由DMA循环将转换的数据传输到 ...