整理之前做的笔记。
猿课笔记
第一篇下 linux 启动。
以附件图为参照。
开机通电--->BIOS自检--->BIOS设置启动介质--->MBR磁盘0柱面0磁头1扇区,55AA结尾。里面存储系统分区表,系统引导程序,bootloader。
此处拿grub做例子。grub主要由四部分组成。stage1,stage1-5,stage2以及/boot/grub其它文件。就像一个mini os,它拥有自己的shell,支持script。这其中安装过后,会把stage1汇编成一个512字节的文件拷贝到MBR。
系统启动后,运行到MBR后,就由GRUB的stage1文件接管,它会调用BIOS中断方式INT 13h把stage1-5调入内存,这是文件系统解释代码,就是描述操作系统格式如何去读取。一般会在磁盘前面的扇区存放。这个时候,stage1,就可以识别系统盘,读取系统文件。然后调入stage2文件。而stage2是grub最核心的部分。它将系统由实模式转换为保护模式,设置好c运行环境,然后寻找menulist启动菜单,并把控制权交给启动菜单中的ROOT。如果没有找到,就执行一个shell,等待输入命令。
我们来看menulist菜单:
# ls -l menu.lst
lrwxrwxrwx. 1 root root 11 7月 18 11:44 menu.lst -> ./grub.conf
#指向了grub.conf
#vi grub.conf
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-504.el6.i686)
root (hd0,0)
kernel /vmlinuz-2.6.32-504.el6.i686 ro root=UUID=c087c97b-9129-4557-805e-d6f42c6dcf03 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-504.el6.i686.img
grub.conf 主要起的作用是加载内核 kernel /vmlinuz.....,装载内核镜像 /initramfs.....,并执行 initrd进程 ,这里面包含了各种可执行程序和驱动程序,最后使用 chroot filesystem转换到真正的linux系统。调用/sbin/init进程,控制权转交操作系统。
这其中 splashimage=(hd0,0)/grub/splash.xpm.gz 是背景图片。
title 标题。root (hd0,0) 启动磁盘分区。
init 进程的配置文件是存放于/etc/inittab. 它定义了,系统初始化,电源故障的操作、以及在Ctrl-Alt-Delete 键反应信息。
# vi /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
最后一行是配置文件。通用格式 id:runlevels:action:process。
这里启动级别是3,Full multiuser mode,多用户模式,文本命令模式。
这里可以看到系统首先会执行,/etc/init/rcS.conf这个配置文件,然后呢是/etc/init/rc.conf。
1
# vi /etc/init/rcS.conf
#查看这个文件,提醒 vi显示行号命令 :set nu
。。。。。。
28 exec /etc/rc.d/rc.sysinit
。。。。。。
#看到这里执行 /etc/rc.d/rc.sysinit命令。
#vi /etc/rc.d/rc.sysinit
#这下面配置主机名,网络,配置内核参数、挂载root文件系统、检查文件系统、设置系统时钟、配置机器、开启交换空间等。那么返回继续查看 /etc/init/rcS.conf,发现第39行有最后一个执行命令。
39 exec telinit $runlevel
# 这里看到后面是运行级别,即 /etc/inittab中设的3.我们再查这个命令。
#which telinit
/sbin/telinit
#ls -l /sbin/telinit
-rwxr-xr-x. 1 root root 50728 3月 12 2014 /sbin/telinit
# man telinit
NAME
telinit - change system runlevel
SYNOPSIS
telinit [OPTION]... RUNLEVEL
DESCRIPTION
telinit may be used to change the system runlevel.
..........
#这里发现,这不是更改用户级别的init 命令嘛。也就是切换到用户$runlevel.这里是3.
到这里,/etc/init/rcS.conf任务已经完成,下面该 /etc/init/rc.conf了。
2
继续查看。
#ls -l /etc/init/rc.conf
-rw-r--r--. 1 root root 417 7月 22 2014 /etc/init/rc.conf
#vi /etc/init/rc.conf
。。。。
17 exec /etc/rc.d/rc $RUNLEVEL
#这里发现仅执行一条命令:命令参数是运行级别3.
#vi /etc/rc.d/rc
#前面是判断运行级别,然后runlevel判断运行级别,设置。
28 . /etc/init.d/functions
#运行一些脚本。
59 # First, run the KILL scripts.
60 for i in /etc/rc$runlevel.d/K* ; do
61
62 # Check if the subsystem is already up.
63 subsys=${i#/etc/rc$runlevel.d/K??}
64 [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] || continue
65 check_runlevel "$i" || continue
66
67 # Bring the subsystem down.
68 [ -n "$UPSTART" ] && initctl emit --quiet stopping JOB=$subsys
69 $i stop
70 [ -n "$UPSTART" ] && initctl emit --quiet stopped JOB=$subsys
71 done
72
73 # Now run the START scripts.
74 for i in /etc/rc$runlevel.d/S* ; do
75
76 # Check if the subsystem is already up.
77 subsys=${i#/etc/rc$runlevel.d/S??}
78 [ -f /var/lock/subsys/$subsys ] && continue
79 [ -f /var/lock/subsys/$subsys.init ] && continue
80 check_runlevel "$i" || continue
81
82 # If we're in confirmation mode, get user confirmation
83 if [ "$do_confirm" = "yes" ]; then
84 confirm $subsys
85 rc=$?
86 if [ "$rc" = "1" ]; then
87 continue
88 elif [ "$rc" = "2" ]; then
89 do_confirm="no"
90 fi
91 fi
#59~91 这里比较重要。是按顺序关闭和运行服务,/etc/rc3.d/K开头的服务关闭,S开头的服务开启。
注查看系统服务命令:chkconfig --list
3 这里比较重要的是 /etc/rc3.d/S99local.这是最后一个开启的服务,我们看看。
# ls -l S99local
lrwxrwxrwx. 1 root root 11 7月 18 11:35 S99local -> ../rc.local
#这是个软链接文件,指向了/etc/rc.local.我们看看这个文件:
#
# ls -l /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 220 10月 16 2014 /etc/rc.d/rc.local
#vi /etc/rc.d/rc.local
。。。。。
touch /var/lock/subsys/local
。。。。。
只有一条命令,创建文件。其实呢,这个rc.local文件比较重要,这里呢,我们可以添加自己的初始化命令。
----------------------------------------------------------------
到这里呢,我们系统的设置就差不多了,下一次就是开启TTY终端。
在/etc/inittab 配置文件中,下个执行的是 /etc/init/tty.conf和/etc/init/serial.conf.我们来看
# vi /etc/init/tty.conf
11 instance $TTY
12 exec /sbin/mingetty $TTY
13 usage 'tty TTY=/dev/ttyX - where X is console id'
首先在11行运行创建TTY命令。
在/etc/init/下有个start-tty.conf首先调用/etc/sysconfig/init设置系统环境,然后创建1-6,总共6个TTY终端。第16行 启动TTY.
# vi /etc/init/start-ttys.conf
13 . /etc/sysconfig/init
14 for tty in $(echo $ACTIVE_CONSOLES) ; do
15 [ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue
16 initctl start tty TTY=$tty
17 done
。
这个时候,再去看/etc/init/tty.conf 第12行。启动mingetty,这个是精减版的getty,用户登入程序。