zoukankan      html  css  js  c++  java
  • 系统启动和内核管理

    1.centos6的启动管理

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

    ·rootfs包括程序和glibc库

    程序:二进制执行文件

    库:函数集合,function,调用接口(头文件负责描述)

     1.加载bios的硬件信息,获取第一个启动设备

    2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息

    3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

    4.核心执行init程序,并获取默认的运行信息

    5.init程序执行/etc/re.d/rc.sysinit文件,重新挂载根文件系统

    6启动核心的外挂模块

    7init执行运行的各个批处理文件

    8init执行/etc/rc.d/rc.local

    9执行/bin/login程序,等待用户登录

    10.登录之后开始shell控制主机

    2.硬件启动POST

    POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU,主板,内存,硬盘子系统,显示子系统,串并行接口,键盘等硬件情况的检测

    主板的ROM:BIOS,Basic Input and Output system,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置,开机加电自检程序和系统启动自举程序等

    主板的RAM:CMOS互补金属氧化物半导体,保存各项参数的设定,按次序查找引导设备,第一个有引导程序的设备为本次启动设备

    3.启动加载器bootloader

    grub功能和组成

    bootloader:引导加载器,引导程序

    ·windows:ntloader,仅是启动os

    ·linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压,展开,并把系列控制权移交给内核

    Linux的bootloader

    ·LILO:linux loader,早期的bootloader,功能单一

    ·GRUB:GRand Unified Bootloader,Centos 5,6  ,Centos7以后使用GRUB 2.02

    GRUB启动阶段

    ·primary boot loader:

    1st stage:MBR的前446个字节

    1.5stage:mbr之后的扇区,让stage1中的bootloader能识别到stage2所在的分区上的文件系统

    ·seconday boot loader :2nd stage,分区文件/boot/grub/

     4.利用grub命令修复grub

    [19:13:37 root@centos7 ~]$dd if=/dev/zero of=/dev/sda bs=1 count=446
    446+0 records in
    446+0 records out
    446 bytes (446 B) copied, 0.00103883 s, 429 kB/s
    破坏grub第一阶段
    [19:14:38 root@centos7 ~]$hexdump -C -n 512 /dev/sda
    00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
    *
    000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 20 |............... |
    000001c0 21 00 83 aa 28 82 00 08 00 00 00 00 20 00 00 aa |!...(....... ...|
    000001d0 29 82 8e fe ff ff 00 08 20 00 00 f8 df 18 00 00 |)....... .......|
    000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
    000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
    00000200
    
    [19:16:24 root@centos7 ~]$reboot
    
    无法重启,出现下面提示
    
    
    
    
    
     光盘启动,进入rescue模式
    
    chroot /mnt/sysimage
    grub2-install /dev/sda  centos6是grub-install /dev/sda
    sync
    exit
    exit
    reboot
    
    修复grub的第1.5阶段故障
    [19:30:24 root@centos7 ~]$dd if=/dev/zero of=/dev/sda bs=521 count=25 seek=1
    [19:16:24 root@centos7 ~]$reboot
    无法重启,出现下面提示
    chroot /mnt/sysimage
    grub2-install /dev/sda  centos6是grub-install /dev/sda
    sync
    exit
    exit
    reboot


    centos6修复方法

     rm -rf /boot/*
    用光盘进入救援模式
    chroot /mnt/sysimage
    切根
    mount /dev/sr0 /mnt/
    挂载光盘
    rpm -ivh /mnt/Packages/kernel.xxx.rpm --force
    安装内核包
    centos 7方法
    grub2-mkconfig -o /boot/grub2/grub.cfg
    centos6方法
    grub-install /dev/sda
    vim /boot/grub/grub.conf
    default=0
    timeout=5
    title centos
    kernel /vmlinuz root=/dev/sda2
    initrd /initramfs.img

    exit
    reboot

     对/etc/fatab进行恢复
    用光盘进入救援模式
    找到/所在分区并恢复/etc/fstab
    fdisk -l
    mkdir /mnt/rootdir
    mount /dev/sdaN /mnt/rootdir
    挂在看是否为/
    ls /mnt/rootdir
    查看底下的文件确定为跟分区
    mount /dev/sda2 /mnt/rootdir
     vi /mnt/rootdir/etc/fstab
    /dev/sda1 /boot ext4 defaults 0 0
    /dev/sda2 / ext4 defaults 0 0
    reboot

     5.init初始化

    POST-->BootSqruence(BIOS)-->Bootloader(MBR)-->kernel(ramdisk)-->rootfs(只读)-->init(systemd)

    init程序的类型:

    SysV:init,centos 5之前

    配置文件:/etc/inittab

    Upstart:init,centos6

    配置文件:/etc/inittab,/etc/init/*.conf

    Systemd:systemd,Centos 7

    配置文件:/uer/lib/systemd/system,/etc/systemd/system

    运行级别

    运行级别:为系统运行或维护等目的而设定;0-6:7个级别,一般使用3,5做默认级别

    0:关机

    1:单用户模式(root自动登录),single,维护模式

    2:多用户模式,启动网络功能,但不会启动NFS:维护模式

    3:多用户模式,正常模式:文本界面

    4:预留级别:可同3级别

    5:多用户模式,正常模式;图形界面

    6:重启

    6.centos6服务管理

    centos6服务管理
    service 服务 start|stop|restart service --status-all

    /etc/rc.d/rc控制服务脚本的开机自动运行

    for i in /etc/rc$runlevel.d/K* ; do
    $i stop
    done
    for i in /etc/rc$runlevel.d/S* ; do
    $i start
    done

    说明:rc N -->意味着读取/etc/rc.d/rcN/d/

    k:k##:运行次序;数字越小,越先运行,数字越小的服务,通常为依赖到别的服务

    s:s##:运行次序;数字越小,越先运行,数字越小的服务,通常为依赖到别的服务

    配置服务开机启动

    chkconfig命令

    chkconfig命令管理服务

    [18:50:59 root@centos6-1 rc3.d]$chkconfig --level 3 iptables off
    设定iptables在级别为3的情况下开机不自起
    [18:51:51 root@centos6-1 rc3.d]$ls
    K10saslauthd    K89netconsole  S02lvm2-monitor  S10network  S13iscsi             S25netfs      S80postfix
    K87multipathd   K89rdisc       S07iscsid        S11auditd   S15mdmonitor         S26udev-post  S90crond
    K87restorecond  K92iptables    S08ip6tables     S12rsyslog  S25blk-availability  S55sshd       S99local
    [18:55:15 root@centos6-1 rc3.d]$chkconfig --del iptables
    删除服务
    [18:56:38 root@centos6-1 rc4.d]$chkconfig --add iptables
    添加服务

    [18:57:02 root@centos6-1 rc4.d]$chkconfig --list iptables
    iptables 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭

    查看服务

    开机启动文件rc.local

    /etc/rc.local

    /etc/rc.d/rc.local

    最后启动一个服务s99local没有连接至/etc/rc.d/init/d一个服务脚本,而是指向了/etc/rc.d/local脚本

    想开机自动运行的,可直接放置于/etc/rc.d/rc.local

    7.centos启动过程总结

    centos6

    1.post加电自检

    这个过程是开机后,BIOS或UEFI进行硬件检查的阶段

    2.MBR引导

    自检硬件没有问题时候,这里以BIOS为例,BIOS将会直接去找硬盘的第一个扇区,找到前446字节,将MBR加载到内存中,MBR将告诉程序下一阶段去哪里找系统grub引导。此阶段属于grub的第一阶段。grub还有1.5阶段和2阶段。

    3.GRUB引导

    grub第1.5和2阶段,信息默认存放在扇区中,如果使用grub-install生成的2阶段的文件是存放在/boot分区中的。
    为了加载内核系统,不得不加载/boot分区,而加载/boot分区,需要有/boot分区的驱动,/boot分区驱动是放在/boot分区中的,啊,我们好像进入了死循环了,Linux是怎么解决的呢?就是靠放在1.5阶段中的数据,是放在第一个扇区后的后续扇区中,具体占用多少字节,不太清楚,只知道1.5阶段和2阶段总共27个扇区。

    stage1.5

    mbr之后的扇区,识别stage2所在的分区上的文件系统

    stage2

    开机启动的时候看到的Grub选项、信息,还有修改GRUB背景等功能都是stage2提供的,stage2会去读入/boot/grub/grub.conf或者menu.lst等配置文件

    4.读取grub.conf文件

    读取grub.conf文件以确定内核启动的参数,准备启动内核

    5.启动内核

    加载内核,核心开始解压缩,启动一些最核心的程序。
    因为为了让内核足够轻小,硬件驱动并没有放在内核文件里面,我们可以看到内核很小,才4M左右,我们可以想象Windows中的驱动,安装系统时候还需要使用驱动软件下载好长时间呢
    因此需要使用/initramfs-2.6.32-696.el6.x86_64.img来驱动硬件

    6.启动init进程

    grub中默认指定init=/sbin/init程序,可以在grub.conf中kernel行自定义执行程序init=/bin/bash,此时可以绕过下面步骤直接进入bash界面。
    内核源代码文件中显示996行左右,规定了init启动的顺序,/sbin/init->/etc/init->/bin/init->/bin/sh,/bin/bash没有写,应该是和/bin/sh一样吧

    1)读取/etc/inittab文件

    inittab文件里面定义了系统默认运行级别

    2)执行/etc/rc.d/rc.sysinit程序

    系统初始化一些脚本

    3)/etc/rc#.d/文件(各种服务)

    里面定义的是各种服务的启动脚本

    4)/etc/rc.d/rc.local文件

    这里面可以自定义开机启动的命令。

    8.执行/bin/login

    执行/bin/login程序,等待用户登录

     

    参看:http://s4.51cto.com/wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg

    
    

    1.uefi或BIOS初始化,开始post开机自检

    2.加载mbr到内存

    3.GRUB阶段

    4.加载内核和inintamfs模块

    5.内核开始初始化,使用systemd来代替centos6以前的init程序

    (1)执行initrd.target

    包括挂载/etc/fstab文件中的系统,此时挂载后,就可以切换到根目录了

    (2)从initramfs根文件系统切换到磁盘根目录

    (3)systemd执行默认target配置

    centos7表面是有“运行级别”这个概念,实际上是为了兼容以前的系统,每个所谓的“运行级别”都有对应的软连接指向,默认的启动级别时/etc/systemd/system/default.target,根据它的指向可以找到系统要进入哪个模式
    模式:

    • 0 ==> runlevel0.target, poweroff.target
    • 1 ==> runlevel1.target, rescue.target
    • 2 ==> runlevel2.target, multi-user.target
    • 3 ==> runlevel3.target, multi-user.target
    • 4 ==> runlevel4.target, multi-user.target
    • 5 ==> runlevel5.target, graphical.target
    • 6 ==> runlevel6.target, reboot.target

    (4)systemd执行sysinit.target

    有没有很眼熟?是的,在CentOS6上是被叫做rc.sysint程序,初始化系统及basic.target准备操作系统

    (5)systemd启动multi-user.target下的本机与服务器服务

    (6)systemd执行multi-user.target下的/etc/rc.d/rc.local

    6.Systemd执行multi-user.target下的getty.target及登录服务

    getty.target我们也眼熟,它是启动终端的systemd对象。如果到此步骤,系统没有被指定启动图形桌面,到此就可以结束了,如果要启动图形界面,需要在此基础上启动桌面程序



    8.linux系统所需文件

     1.分区并创建文件系统

    2挂载boot

    3安装grub

    4准备内核和initramfs文件

    5建立grub.conf

    6.准备根下面相关程序和库

    复制bash等命令和相关库文件

    准备网卡驱动

    7准备新的虚拟机

    将前一虚拟机sdb硬盘对应的vmdk文件增加进去,删除原有磁盘,开机启动

    9.systemd

    system特性

    systemd:从Centos7版本之后开始用systemd实现init进程,系统启动和服务器守护进程管理器负责在系统启动或运行时,激活系统资源,服务器进程和其它进程

    新特性

    ·系统引导时实现服务并行启动

    ·按需启动守护进程

    ·自动化的服务依赖关系管理

    ·同时采用socket式与D-Bus总线式激活服务

    ·socket与服务程序分离

    ·向后兼容sysv init脚本

    ·使用systemctl命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务,systemctl无法与之通信和控制

    ·系统状态快照

    systemctl管理系统服务service unit

    systemctl command name.service

    启动:相当于service name start

    systemctl start name.service

    停止:相当于service name restart

    systemctl stop name.service

    重启:相当于service name restart

    systemctl restart name.service

    查看状态:相当于service name status

    systemctl status name.service

    禁止自动和手动启动:

    systemctl mask name.service

    取消禁止

    systemctl unmask name.service

    设定某服务开机自启,相当于chkconfig name on

    systemctl enable name.service

    设定某服务开机禁止启动:相当于chkconfig name off

    systemctl disable name.service

    开机并立即启动或停止

    systemctl enable –now postfix

    systemctl disable –now postfix

     10.Centos7,8修改密码

    在GRUB2启动屏下按e进入编辑模式

    找到linux16那段,添加内核参数rd.break

    按ctrl-x启动

    mount -o remount,rw /sysroot

    chroot /sysroot

    echo 123|passwd --stdin root

    exit

    reboot

    添加grub密码

    grub2-setpassword

    清空grub密码

    cat /dev/null > /boot/grub2/user.cfg

  • 相关阅读:
    AtCoder Beginner Contest 089 D
    AtCoder Beginner Contest 088 D Grid Repainting
    [odb-users] query results not being cached?
    cmake使用示例与整理总结
    CMake使用总结
    Create schema error (unknown database schema '')
    [odb-users] Create schema error (unknown database schema '')
    ODB(C++ ORM)用Mingw的完整编译过程
    odb_sqlite_demo
    ODB——基于c++的ORM映射框架尝试(使用)
  • 原文地址:https://www.cnblogs.com/aiyoubucuo/p/14247853.html
Copyright © 2011-2022 走看看