linux系统启动流程相关题目

一. 面试考核理论题

1.linux系统启动流程:

linux系统启动流程分四个阶段:硬件引导启动、GRUB引导启动、内核引导启动、init引导启动。

  1. 首先,是硬件自检,检查外围硬件设备是否正常,然后加载BIOS信息,包含硬件、设备启动项等信息、读取完BIOS信息,查找BIOS所指定的硬盘MBR引导扇区(硬盘第一扇区0头0道1扇区)

    接着通过MBR运行GRUB引导程序(在Bootloader中),进入GRUB引导阶段。

  2. GRUB引导有三个阶段。依次加载Stage_1,Stage_1_5,Stage_2。stage1用于定位stage1_5,stage1_5用来连接stage1和stage2,通过找到/boot所在分区的文件系统定位stage_2,Stage_2找到内核位置并加载,stage2会去读入/boot/grub/grub.conf中存放linux的启动参数。然后控制权转交给操作系统(linux)。

  3. 内核文件首先必须从压缩格式解压自身。内核自解压完成后,解压后的内核放置在内存之中,然后切换到真正的根文件系统/sbin/init进程,切换过程需要initramfs,initramfs是一个临时的文件系统,内核运行initramfs中的init程序,该程序将探测硬件设备、加载驱动,挂载真正的文件系统,然后执行文件系统上的/sbin/init。

  4. 启动操作系统第一个守护进程init,读取配置文件 /etc/inittab找到系统的启动等级, 读取完运行级别,读取文件/etc/rc.d/rc.sysinit,该文件功能包括:设置内核参数、启动swap分区、系统函数、配置Selinux等。

    根据之前读取的运行级别,操作系统会运行rc0.d到rc6.d中的相应的脚本程序,里面的文件都是软连接文件,执行来完成相应的初始化工作和启动相应的服务。

    系统初始化后,读取执行/etc/rc.local找到系统自动启动程序。

    最后是用户登录验证,执行/bin/login程序,验证用户输入用户名和密码,即可登录到Shell终端,最后加载相关的配置文件,进入shell,至此Linux操作系统完整流程启动完毕。

2.grub中的bootloader损坏如何修复,步骤是什么

进入救援模式,安装grub

  1. 导入一张光盘

  2. 进入rescue模式

  3. 登入shell程序

  4. 切换自己的根

    chroot /mnt/sysimage
    
  5. 安装grub程序,退出到救援模式

    grub-install --root-directory=/ /dev/sda
    
    exit
    
 reboot

3.initramfs文件的作用

​ initramfs是一个临时的文件系统,为了解决在内核程序还没有加载到磁盘就要读取系统上的内核文件的问题,采用的伪根系统

​ 内核运行initramfs中的init程序,该程序将探测硬件设备、加载驱动,挂载真正的文件系统,执行文件系统上的/sbin/init,进而切换到真正的用户空间。

4.grub的各个阶段功能

  1. stage1:用于定位stage1_5。

  2. stage1_5:用来连接stage1和stage2,通过识别/boot所在分区的文件系统定位stage_2。

  3. Stage_2:作用是加载各种环境和加载内核,stage2会去读入/boot/grub/grub.conf中存放linux的启动参数。然后控制权转交给操作系统(linux)。

5.grub2的引导过程简述

阶段1

加载MBR找到的第一个引导记录中到内存中,并执行。这个阶段 1 的 文件通常被叫做引导镜像(boot.img),阶段 1 的唯一功能就是定位并加载阶段 1.5 的代码。在加载阶段 1.5 代码进入内存后,控制权将由阶段 1 转移到阶段 1.5。

阶段 1.5

阶段 1.5 的代码必须位于引导记录与设备第一个分区之间的位置。该空间存储阶段 1.5 的代码镜像 core.img 文件。

阶段 1.5 的功能是开始执行存放阶段 2 文件的 /boot 文件系统的驱动程序,并加载相关的驱动程序。

阶段 2

GRUB 阶段 2 的主要功能是定位和加载 Linux 内核到内存中,并转移控制权到内核。内核的相关文件位于 /boot 目录下。

GRUB2 跟 GRUB1 类似,支持从 Linux 内核选择之一引导启动。

6.grub和grub2的区别

  1. 配置文件有一个新名称(grub.cfg而不是menu.lst或grub.conf),新语法和许多新命令

  2. grub2配置文件现在是用更接近完整脚本语言的东西编写的:变量、条件和循环是可用的。

  3. GRUB2设备名称中的分区号现在从1开始,而不是0。

  4. GRUB 2有更可靠的方法可以在多磁盘系统上找到自己的文件和目标内核的文件,并且有命令使用文件系统标签或通用唯一标识符(UUID)查找设备。

  5. 支持更多的文件系统,包括但不限于ext 4、HFS+和NTFS。

  6. GRUB 2可以直接从LVM和RAID设备读取文件。

  7. GRUB 2将许多功能放在动态加载的模块中,使核心映像更小,并允许以更灵活的方式构建核心映像。

7.内核的功能是什么,如何修改内核的参数

内核功能:

进程管理、内存管理、网络管理、文件系统管理、驱动模块管理。

修改内核参数:

修改配置文件 /etc/sysctl.conf,如果希望不重启机器而立即生效,可以执行命令:sysctl –p

8.简述centos7的systemd初始化过程

systemd使用并行的方法启动服务(参考

  1. 首先, systemd执行的第一个目标是default.target,决定 Linux 系统应该启动达到哪个状态或目标态target(相当于init的运行级别)。

  2. 在这个阶段,会启动multi-user.target而这个target将自己的子单元放在目录“/etc/systemd/system/multi-user.target.wants”里。这个target为多用户支持设定系统环境。非root用户会在这个阶段的引导过程中启用。防火墙相关的服务也会在这个阶段启动。

  3. "multi-user.target"会将控制权交给另一层“basic.target”。

  4. "basic.target"单元用于启动普通服务特别是图形管理服务。它通过/etc/systemd/system/basic.target.wants目录来决定哪些服务会被启动,basic.target之后将控制权交给sysinit.target.

  5. "sysinit.target"会启动重要的系统服务例如系统挂载,内存交换空间和设备,内核补充选项等等。sysinit.target在启动过程中会传递给local-fs.target。这个target单元的内容如下面截图里所展示。

  6. local-fs.target,这个target单元不会启动用户相关的服务,它只处理底层核心服务。这个target会根据/etc/fstab和/etc/inittab来执行相关操作。

二. 实操题

1.删除grub.conf,然后重启恢复

1.备份grub.conf,且通过df查看root分区路径为/dev/sda2

2.删除grub.conf

3.reboot自动进入grub模式,依次输入参数

root (hd0,0)

kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2

initrd /initramfs-2.6.32-696.el6.x86_64.img

boot

在这里插入图片描述

4.重新登陆成功,还原/boot/grub/grub.conf文件

2.进单用户模式恢复密码

(单用户模式不需要密码即可登录)

1.进入GRUB 菜单界面: Linux开机引导的时候,按shift键,按键盘上的e 就可以进入进入GRUB菜单界面。

2.在出现GRUB引导画面时,按字母e键,进入GRUB编辑状态。

在这里插入图片描述
3.在kernel 一行的最后加上+空格+single,回车。

在这里插入图片描述

4.敲入“b”,启动系统,即进入单用户模式。

用passwd命令改密码
在这里插入图片描述

3.给grub加密

1.生成一个密码的md5值

grub-md5-crypt

2.将生成的md5值写入grub.conf(写在title前一行)

3.重启测试

再想进入grub编辑模式需要敲p,然后输入密码

在这里插入图片描述

4.编写nginx服务器控制脚本,并使用chkconfig管理

  • 在centos6系统中完成

  • 编译安装nginx

    wget http://nginx.org/download/nginx-1.14.0.tar.gz
    
    tar xf nginx-1.14.0.tar.gz
    
    切换到解压后的nginx目录中执行:
    
    ./configure --prefix=/usr/local/nginx --with-http_ssl_module
    
    make
    
    make install
    
  • 编写nginx控制脚本(脚本部分参考)

    1.创建文件

    # touch /etc/init.d/nginx
    # chmod +x /etc/init.d/nginx
    

    脚本内容:

#!/bin/bash
#chkconfig: - 85 15
#description: Nginx server control script
#processname: nginx
#config file: /usr/local/nginx/conf/nginx.conf
#pid file: /usr/local/nginx/logs/nginx.pid
#eastmoney public tools
#version: v1.0.0
# 
#source function library

. /etc/rc.d/init.d/functions

NGINX_NAME="nginx"
NGINX_PROG="/usr/local/sbin/nginx"
NGINX_PID_FILE="/usr/local/nginx/logs/nginx.pid"
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
NGINX_LOCK_FILE="/var/lock/subsys/nginx.lock"

#check current user

[ "$USER" != "root" ] && exit 1

start() {
    status
        if [[ $? -eq 0 ]]; then
            echo $"Nginx (PID $(cat $NGINX_PID_FILE)) already started."
            return 1
        fi
    echo -n $"Starting $NGINX_NAME: "
        daemon $NGINX_PROG -c $NGINX_CONF_FILE
        retval=$?
        echo
    [ $retval -eq 0 ] && touch $NGINX_LOCK_FILE
    return $retval
}

stop() {
    status
        if [[ $? -eq 1 ]]; then
            echo "Nginx server already stopped."
            return 1
        fi
    echo -n $"Stoping $NGINX_NAME: "
        killproc $NGINX_PROG
        retval=$?
        echo
    [ $retval -eq 0 ] && rm -f $NGINX_LOCK_FILE
    return $retval
}

restart() {
    stop
        sleep 1
    start
    retval=$?
    return $retval
}

reload() {
    echo -n $"Reloading $NGINX_NAME: "
        killproc $NGINX_PROG -HUP
        retval=$?
        echo
    return $retval
}

status() {
    netstat -anpt | grep "/nginx" | awk '{print $6}' &> /dev/null
        if [[ $? -eq 0 ]]; then
            if [[ -f $NGINX_LOCK_FILE ]]; then
                return 0
            else
                return 1
            fi
        fi
    return 1
}

_status() {
    status
        if [[ $? -eq 0 ]]; then
            state=`netstat -anpt | grep "/nginx" | awk '{ print $6 }'`
            echo $"Nginx server status is: $state"
        else
            echo "Nginx server is not running"
        fi
}

test() {
    $NGINX_PROG -t -c $NGINX_CONF_FILE
        retval=$?
    return $retval
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    reload)
        reload
        ;;
    restart)
        restart
        ;;
    status)
        _status
        ;;
    test)
        test
        ;;
    *)
        echo "Usage: { start | stop | reload | restart | status | test }"
        exit 1
esac

2、将脚本添加到系统服务并设置开机启动

chkconfig --add nginx

chkconfig --level 2345 nginx on

执行完可用chkconfig --list查看

3.运行测试:

/etc/init.d/nginx start
在这里插入图片描述
/etc/init.d/nginx restart
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值