Chinaunix首页 | 论坛 | 博客
  • 博客访问: 514653
  • 博文数量: 77
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 689
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-12 08:40
文章分类

全部博文(77)

文章存档

2018年(1)

2016年(3)

2015年(24)

2014年(49)

我的朋友

分类: 嵌入式

2015-01-08 15:59:32

前言
linux有自己一套完整的启动 体系,抓住了linux启动 的脉络,linux的启动 过程将不再神秘。
阅读之前建议先看一下附图。
本文中假设inittab中设置的init tree为:
/etc/rc0.d
/etc/rc1.d
/etc/rc2.d
/etc/rc3.d
/etc/rc4.d
/etc/rc5.d
/etc/rc6.d
/etc/init.d
目录 
1. 关于linux的启动 
2. 关于rc?.d
3. 启动 脚本 示例
4. 关于rc.local
5. 关于bash启动 脚本 
6. 关于开机程序的自动启动 
1. 关于linux的启动 
init是所有进程之父 
init读取/etc/inittab
inittab是一个不可执行的文本文件,它有若干行指令所组成,告诉 init 要进入什么运行级别,以及在哪里可以找到该运行级别的配置文件。
id:5:initdefault:  ###表示当前缺省运行级别为5(initdefault);
si::sysinit:/etc/init.d/rcS
###init进程首先会执行etc/init.d/rcS脚本
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
###当运行级别为5时,以5为参数运行/etc/init.d/rc脚本,init将等待其返回(wait)
它接受5作为参数,去执行/etc/rc5.d/目录下的所有的rc启动脚本
,链接在/etc/init.d/目录
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

T0:134:respawn:/sbin/getty -L ttyS0 115200 vt100 ###init接下来会打开终端,以便用户登录系统
linux是多用户系统,getty是多用户与单用户的分水岭
在getty之前运行的是系统脚本 
2. 关于rc?.d 
所有启动 脚本 放置在 /etc/init.d下 
rc?.d中放置的是init.d中脚本 的链接,命名格式是:
S{number}{name}
K{number}{name}
S开始的文件向脚本 传递start参数
K开始的文件向脚本 传递stop参数
number决定执行的顺序
3. 启动 脚本 示例 
这是一个用来启动 httpd的 /etc/init.d/apache 脚本 :
CODE:
#!/bin/bash
source /etc/sysconfig/rc
source $rc_functions
case "$1" in
start)
echo "Starting Apache daemon..."
/usr/local/apache2/bin/apachectl -k start
evaluate_retval
;;
stop)
echo "Stopping Apache daemon..."
/usr/local/apache2/bin/apachectl -k stop
evaluate_retval
;;
restart)
echo "Restarting Apache daemon..."
/usr/local/apache2/bin/apachectl -k restart
evaluate_retval
;;
status)
statusproc /usr/local/apache2/bin/httpd
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac

可以看出他接受start,stop,restart,status参数

然后可以这样建立rc?.d的链接:

CODE:

cd /etc/rc.d/init.d &&
ln -sf ../init.d/apache ../rc0.d/K28apache &&
ln -sf ../init.d/apache ../rc1.d/K28apache &&
ln -sf ../init.d/apache ../rc2.d/K28apache &&
ln -sf ../init.d/apache ../rc3.d/S32apache &&
ln -sf ../init.d/apache ../rc4.d/S32apache &&
ln -sf ../init.d/apache ../rc5.d/S32apache &&
ln -sf ../init.d/apache ../rc6.d/K28apache


4. 关于rc.local
经常使用的 rc.local 则完全是习惯问题,不是标准。
各个发行版有不同的实现方法,可以这样实现:

CODE:

touch /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc1.d/S999rc.local &&
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc2.d/S999rc.local &&
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc3.d/S999rc.local &&
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc4.d/S999rc.local &&
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc5.d/S999rc.local &&
ln -sf /etc/rc.d/rc.local /etc/rc.d/rc6.d/S999rc.local


5. 关于bash启动 脚本 
/etc/profile 
/etc/bashrc
~/.bash_profile
~/.bashrc
是bash的启动 脚本 
一般用来设置单用户的启动 环境,也可以实现开机单用户的程序,但要明确他们都是属于bash范畴而不是系统范畴。
他们的具体作用介绍如下:
/bin/bash这个命令解释程序(后面简称shell)使用了一系列启动 文件来建立一个运行环境:

/etc/profile 
/etc/bashrc
~/.bash_profile
~/.bashrc
~/.bash_logout
 
每一个文件都有特殊的功用并对登陆和交互环境有不同的影响。
/etc/profile 和 ~/.bash_profile 是在启动 一个交互登陆shell的时候 被调用。
/etc/bashrc 和 ~/.bashrc 是在一个交互的非登陆shell启动 的时候 被调用。
~/.bash_logout 在用户注销登陆的时候 被读取
一 个交互的登陆shell会在 /bin/login 成功登陆之后运行。一个交互的非登陆shell是通过命令行来运行的,如[prompt]$/bin/bash。一般一个非交互的shell出现在运行 shell脚本 的时候 。之所以叫非交互的shell,是因为它不在命令行上等待输入而只是执行脚本 程序。
6. 关于开机程序的自动启动 
系统脚本 可以放置在/etc/init.d中并建立/etc/rc?.d链接,也可以直接放置在/etc/rc.local中。
init.d脚本 包含完整的start,stop,status,reload等参数,是标准做法,推荐使用。 
为特定用户使用的程序(如有的用户需要使用中文输入法而有的不需要)放置在~/中的bash启动 脚本 中。

密码验证登录系统:

    Linux的帐号验证程序是login,login会接收getty传来的用户名作为用户名参数。然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

    在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置帐户的其它信息,比如:主目录是什么、使用何种shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为/bin/bash。

    
用户信息保存在/etc/passwd下用户密码信息保存在 /etc/shadow 但是密码是以散列加的。
   
Linux的密码文件原来采用/etc/passwd,共有7个字段。用户的密码加密后放在每一行的第二个字段里,这个 /etc/passwd文件在一般情况下是所有用户可读,只有root用户可写的,这样不良用户就可能读取加密后的密码字串来取得密码。因为这个安全原因,设置一个/etc/shadow文件专门用于保存密码且它的权限一般是root可读,没有其他权限。这样加密后的密码文件就不能被普通用户读取。做法是把/etc/passwd对应的密码字段用*号表示,在/etc/shadow里对应的一行,有用户名和真正的密码加密字串,其他的字段一般留空。
    原始建立起来的系统,只有/etc/passwd文件,使用useradd,passwd命令也只能把密码写入/etc/passwd
/etc/passwd中
root:x:0:0:root:/home/root:/bin/sh
/etc/shadow
root:bsSOxGbNG1DdM:15881:0:99999:7:::
第二个参数为加密过的密码

c语言实现加密密码转换:

点击(此处)折叠或打开

  1. #define _XOPEN_SOURCE

  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>

  6. //gcc crypt.c -o crypt -lcrypt
  7. int main()
  8. {
  9.     char key[] = "sc200";
  10.     printf("encrypted password is: %s\n",crypt(key,"bs"));
  11.     return 0;
  12. }
参考:http://blog.163.com/hanye_online/blog/static/1922171732011814572215/
http://blog.csdn.net/cl11010/article/details/24484979    
       
阅读(4224) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~