linux系统启动流程

本文详细介绍了Linux系统的启动过程,从BIOS到内核初始化,再到系统服务的启动。包括GRUB引导加载器的工作原理,内核参数的传递,以及init进程如何通过inittab文件控制系统的运行级别和服务启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PC:OS(Linux)

POST-->BIOS(BootSequence)-->MBR(bootloader,446)-->Kernel-->initrd-->(ROOTFS)/sbin/init(/etc/inittab)

内核设计风格:

RedHat,SUSE

核心::动态加载内核模块

内核:/lib/modules/内核版本号命名的目录/

vmlinuz-2.6.32

/lib/modules/2.6.32/




RedHats: ramdisk-->initrd

RedHats: ramfs-->initramfs

单内核:Linux(LWP)

  核心:ko(kernel object)

  外围模块

微内核:Windows,Solaris(线程)

chroot: chroot /PATH/TO/TEMPROOT[COMMAND.....]

  chroot /test/virrrot /bin/bash

ldd /PATH/TO/BINARY_FILE:显示二进制文件所依赖的共享库

文件系统,进程管理,内存管理,网络管理,安全功能,驱动程序

/ rootfs

/usr,/boot,/home

启动的服务不同:
    运行级别:0-6
        0:halt
        1: single user mode, 直接以管理员身份切入, s,S,single
        2:multi user mode, no NFS
        3: multi user mode, text mode
        4:reserved
        5: multi user mode, graphic mode
        6: reboot

vim /etc/inittab


详解启动过程

         bootloader(MBR)

                   LILO:LInux LOader

                   GRUB:GRand Unified Bootloader

                            Stage1:MBR

                            Stage1_5:用来识别不同的文件系统

                            Stage2:/boot/grub/


rpm -q grub

grub.conf                  

default=0 # 设定默认启动的title的编号,从0开始

timeout=5 # 等待用户选择的超时时长,单位是秒

splashimage=(hd0,0)/grub/splash.xpm.gz  # grub的背景图片

hiddenmenu # 隐藏菜单

password redhat

password --md5$1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG.

title Red Hat Enterprise Linux Server(2.6.18-308.el5)  # 内核标题,或操作系统名称,字符串,可自由修改

         root(hd0,0)  # 内核文件所在的设备;对grub而言,所有类型硬盘一律hd,格式为(hd#,N);hd#, #表示第几个磁盘;最后的N表示对应磁盘的分区;

         kernel/vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet   # 内核文件路径,及传递给内核的参数

         initrd/initrd-2.6.18-308.el5.img # ramdisk文件路径

         password--md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG.

title Install Red Hat Enterprise Linux 5

         root(hd0,0)

         kernel/vmlinuz-5 ks=http://172.16.0.1/workstation.cfg ksdevice=eth0 noipv6

         initrd/initrd-5

         password--md5 $1$FSUEU/$uhUUc8USBK5QAXc.BfW4m.


vim /etc/grub.conf


生成密码md5

grub-md5-crypt

查看运行级别

runlevel

who -r

查看内核release号:

  uname -r

破坏grub

dd if=/dev/zero of=/dev/sda count=1 bs=400

sync

 

安装grub stage1:

# grub

grub> root (hd0,0)  指定内核所在分区

grub> set (hd0)


安装grub第二种方式:

# grub-install--root-directory=/path/to/boot's_parent_dir /PATH/TO/DEVICE

grub> find

grub> root (hd#,N)

grub> kernel /PATH/TO/KERNEL_FILE

grub> initrd /PATH/TO/INITRD_FILE

grub> boot



mke2fs -j /dev/hda1

mkdir /mnt/boot

mkdir /dev/hda1 /mnt/boot

grub-install --root-directory=/mnt /dev/hda

sync

vim /mnt/boot/grub/grub.conf


sync

重新安装另一台虚拟机

将此磁盘挂载上

配置文件损坏,如何启动系统?

mv /boot/grub/grub.conf /root

sync

shutdown -r now



Kernel初始化的过程:

1、设备探测

2、驱动初始化(可能会从initrd(initramfs)文件中装载驱动模块)

3、以只读挂载根文件系统;

4、装载第一个进程init(PID:1)

/sbin/init:(/etc/inittab)

         upstart:ubuntu, d-bus, event-driven

         systemd:

 

cat /etc/inittab

id:runlevels:action:process

id: 标识符

runlevels: 在哪个级别运行此行;

action: 在什么情况下执行此行;

process: 要运行程序;

id:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit 


ACTION:

initdefault: 设定默认运行级别

sysinit: 系统初始化

wait: 等待级别切换至此级别时执行

respawn: 一旦程序终止,会重新启动



/etc/rc.d/rc.sysinit完成的任务:

1、激活udev和selinux;

2、根据/etc/sysctl.conf文件,来设定内核参数;

3、设定时钟时钟;

4、装载键盘映射;

5、启用交换分区;

6、设置主机名;

7、根文件系统检测,并以读写方式重新挂载;

8、激活RAID和LVM设备;

9、启用磁盘配额;

10、根据/etc/fstab,检查并挂载其它文件系统;

11、清理过期的锁和PID文件;

for I in /etc/rc3.d/K*; do

  $Istop

done

 

for I in /etc/rc3.d/S*; do

  $Istart

done

##: 关闭或启动的优先次序,数据越小越优先被选定

先关闭以K开头的服务,后启动以S开头的服务;

vim test.sh
#!/bin/bash
for I in /etc/rc3.d/K*; do
 echo $I
done
bash test.sh


bash脚本编程,SysV服务脚本

MBR(bootloader)-->Kernel --> initrd(initramfs) --> (ROOTFS) --> /sbin/init(/etc/inittab)

         /etc/inittab,/etc/init/*.conf

         upstart     

init /etc/inittab

id:runlevels:action:process

id:5:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit

OS初始化

l0:0:wait:/etc/rc.d/rc 0

         rc0.d/

                   K*

                            stop

                  S*

                            start

                           

/etc/rc.d/init.d, /etc/init.d

服务类脚本:

         start

         SysV:/etc/rc.d/init.d

                   start|stop|restart|status

                   reload|configtest

chkconfig                               

# chkconfig: runlevels SS KK                         

     当chkconfig命令来为此脚本在rc#.d目录创建链接时,runlevels表示默认创建为S*开头的链接,-表示没有级别默认为S*开头的链接;除此之外的级别默认创建为K*开头的链接;

         S后面的启动优先级为SS所表示的数字;K后面关闭优先次序为KK所表示的数字;

# description: 用于说明此脚本的简单功能;\, 续行

vim mystart.sh

样例脚本:

#!/bin/bash
#
# chkconfig: 2345 77 22
# description: Test Service
#
LOCKFILE=/var/lock/subsys/myservice
status() {
  if[ -e $LOCKFILE ]; then
   echo "Running..."
 else
   echo "Stopped."
  fi
}
usage() {
 echo "`basename $0` {start|stop|restart|status}"
}
case $1 in
start)
 echo "Starting..."
 touch $LOCKFILE ;;
stop)
 echo "Stopping..."
  rm-f $LOCKFILE &> /dev/null
  ;;
restart)
 echo "Restarting..." ;;
status
 status ;;
*)
 usage ;;
esac

cp myservice.sh /etc/rc.d/init.d/myservice

chkconfig --list: 查看所有独立守护服务的启动设定;独立守护进程!

         chkconfig--list SERVICE_NAME

   chkconfig --list network  

chkconfig --add SERVICE_NAME

chkconfig --addmyservice

find ./ -name “*myservice*”

chkconfig --del SERVICE_NAME

chkconfig [--level RUNLEVELS] SERVICE_NAME{on|off}

         如果省略级别指定,默认为2345级别;

   chkconfig --level 24 myservice off

/etc/rc.d/rc.local:系统最后启动的一个服务,准确说,应该执行的一个脚本;

/etc/inittab的任务:

1、设定默认运行级别;

2、运行系统初始化脚本;

3、运行指定运行级别对应的目录下的脚本;

4、设定Ctrl+Alt+Del组合键的操作;

5、定义UPS电源在电源故障/恢复时执行的操作;

6、启动虚拟终端(2345级别);

7、启动图形终端(5级别);

mingetty tty1

守护进程的类型:

         独立守护进程

         xinetd:超级守护进程,代理人

                   瞬时守护进程:不需要关联至运行级别

yum install xinetd -y

chkconfig --list xinetd

service xinetd start

chkconfig --list

chkconfig rsync on





























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值