Linux之系统启动和内核管理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之系统启动和内核管理相关的知识,希望对你有一定的参考价值。
系统启动常用命令:
runlevel
who -r
/etc/inittab:定义启动级别
/etc/rc.d/init.d/NetworkManager 定义网络管理程序的详细信息
/etc/rc.d/rc.sysinit 系统初始化脚本
/etc/rc.d//rc[0-6].d/定义6个级别对应的服务程序开启或关闭
/etc/rc.d/rc.local 开机最后一步要执行的脚本可以放到此文件中
自定义服务chkconfig --list 查看定义服务程序详情列表
testsrv需要放入/etc/rc.d/init.d/目录下testsrv
内部定义#!/bin/bash
chkconfig: 345 66(s-启动) 44(k-关闭)
description: test service
echo ##########ntsysv可以设置当前级别模式哪些进程启动或不启动,重启生效。*为开机启动项。
chkconfig --add testsrv
chkconfig --del testsrv
chkconfig NetworkManager on|off 不加--level 默认设置2345/boot/grub/grub.conf
grub-md5-crypt或者grub-crypt --md5
grub-crypt 默认采用sha512
grub-crypt --sha-256
主要项有
default=0
timeout=5
hiddenmenu
passwd --md5 $$$$$$$$$$$$$$$$$$$$$$$$$$加密后的密码
passwd --encrypted ########################加密后密码
title centos
kernel (hd0,0)/vmlinuz-2.6.32-754.el6.x86_64 root=UUID-xxxxx
initrd (hd0,0)/initramfs-xxxxxxxxxxx# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda2 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz 该文件为启动选项背景图片,可以自行修改:(ImageMagick包,convert -resize 640*480 -colors 14 centos.jpg centos.xpm) hiddenmenu title CentOS 6 (2.6.32-754.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=a6d8689c-a3ec-415b-a2d2-7fb209c352c9 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-754.el6.x86_64.img
TIPS:
核心驱动文件在/boot/vmlinuz-3.10.0-957.el7.x86_64**内核中
按需加载/usr/lib/modules/3.10.0-957.el7.x86_64中驱动模块
辅助的伪根系统/boot/initramfs-3.10.0-957.el7.x86_64.img**(打包文件,内部放有内核挂载所需识别驱动模块)
cpio -tv < initramfs-3.10.0-957.el7.x86_64.img 查看内部文件。modinfo ext4:查看驱动模块所在位置
lsmod:查看所有加载到内存的驱动模块
模拟故障实验1,initramfs-3.10.0-957.el7.x86_64.img伪根文件丢失
重启后故障图:
方法1:进入光盘救援模式
chroot /mnt/sysimage切根
mkinitrd /boot/initramfs-`uname -r`.img `uname -r` --force(此项如果boot下没有initramfs文件可不加)------重新生成伪根img文件
或者
dracut /boot/initramfs-$(uname -r).img $(uname -r)------重新生成伪根img文件
exit-------退出当前根
reboot--------重启系统
模拟故障实验2,vmlinuz-3.10.0-957.el7.x86_64内核文件丢失
重启后故障图:
方法1:进入光盘救援模式
mount /dev/sr0 /mnt/sysimage/data
cp /mnt/sysimage/data/isolinux/vmlinuz /mnt/sysimage/boot/vmlinuz--$(uname -r)从光盘里把内核文件拷贝到/原boot目录下并加版本信息
reboot--------重启系统
模拟故障实验3,/etc/inittab里,默认启动级别错误定义到0或者1
方法:在开机倒计时时,按任意键调出菜单,下面有提示,按a键进入内核模式,在后面补上启动级别3,即可进入系统。进入系统后再重新修改/etc/inittab内默认启动级别为正常级别即可。
模拟故障实验4,MBR里前446字节被清空,grub,stag1被破坏,导致的无法启动系统。(全部清空的话,没有备份分区表无法恢复,切记)
方法:进入光盘救援模式
chroot /mnt/sysimage切根
grub安装
安装grub:
(1) grub-install 此命令可用于修复/boot/grub/下的所有文件除了grub.conf和*.xmp.gz文件 但是如果使用grub-install修复后,再把除了grub.conf以外的所有文件拷贝走,重启后将无法进入系统,需要进入救援模式切根再执行grub-install /dev/sda命令 操作完后多此执行sync,防止数据在内存中未写入硬盘
安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 DIR/boot目录下
grub-install --root-directory=DIR(boot的上级父目录名称) /dev/DISK
(2) grub
grub> root (hd#,#) 中间有空格
grub> setup (hd#)
模拟故障实验5,MBR里前446字节被清空,/boot目录下被清空。
方法:进入光盘救援模式
chroot /mnt/sysimage切根
grub-install /dev/sda
mount /dev/sr0 /mnt
cp /mnt/isolinux/vmlinuz /boot/vmlinuz-uname -r
dracut /boot/initramfs-uname -r
.imguname -r
最后写grub.cfg文件default=0 timeout=5 hiddenmenu title Centos 6 root (hd0,0) kernel /vmlinuz-2.6.32-754.el6.x86_64 root=UUID=a6d8689c-a3ec-415b-a2d2-7fb209c352c9 initrd /initramfs-2.6.32-754.el6.x86_64.img
模拟故障实验6,MBR里前446字节被清空,/boot目录下被清空。/etc/fstab文件被删除。进行恢复(前提是/和/home还有swap都是逻辑卷创建的文件系统)
方法:进入救援模式
由于分区表没有坏,所以先找分区,写fstab文件
因为所有文件系统都是逻辑卷创建的,默认逻辑卷没有被激活
需要激活用(vgchange -ay)
创建临时根目录,挂载逻辑卷/到临时根目录
然后写fstab文件
需要重启重读fstab配置文件。
之后参照实验5,或者安装光盘里的rpm -ivh /mnt/Package/kernel.... --nodeps --force
最后sync几遍重启
模拟故障实验7,grub.conf文件内,initrd和 kernel上下行颠倒
启动菜单出现后按e编辑菜单,因为两行上下颠倒,所以d删除上面的一行,在剩下行上面o新创一行,然后e取编辑一下,输入initrd /initramfs-xxxxxxx 回车,然后b启动,以上修改为临时性修改。进入程序后再修改grub.conf文件。
模拟故障实验8,开机启动卡在某服务,排错
方法:在开机倒计时时,按任意键调出菜单,下面有提示,按a键进入内核模式,在后面补上启动级别1,进入单用户维护模式。将启动不了的服务临时设置为开机不启动chkconfig testsrv off。然后reboot,开机后再想办法解决。
模拟服务自己写一个testsrv,实现service testsrv start|stop|status|restart
#!/bin/sh
#
#chkconfig: - 66 22
#description:testsvr
service=`basename $0`
. /etc/init.d/functions
start(){
if [ -f /var/lock/subsys/$service ];then
echo "$service has been started"
else
touch /var/lock/subsys/$service
action "Starting $service"
fi
}
stop(){
if [ -f /var/lock/subsys/$service ];then
rm -rf /var/lock/subsys/$service
action "stopping $service"
fi
}
status(){
if [ -f /var/lock/subsys/$service ];then
echo "$service is running"
else
echo "$service is stopped"
fi
}
case $1 in
start)
$1
;;
stop)
$1
;;
restart)
stop
start
;;
status)
$1
;;
*)
echo "Usage service `basename $0`start|stop|status|restart "
esac
Centos6启动流程
网址转载流程图
https://s4.51cto.com/wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg
1.加载Bios的硬件信息,获取第一个启动设备
2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息
3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
4.核心执行init程序,并获取默认的运行信息
5.init程序执行/etc/rc.d/rc.sysinit文件
6.启动核心的外挂模块
7.init执行运行的各个批处理文件(scripts)
8.init执行/etc/rc.d/rc.local
9.执行/bin/login程序,等待用户登录
10.登录之后开始以Shell控制主机
启动流程
POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测
ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定
按次序查找引导设备,第一个有引导程序的设备为本次启动设备bootloader: 引导加载器,引导程序
windows: ntloader,仅是启动OS
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
LILO:LInux LOader
GRUB: GRand Unified Bootloader
GRUB 0.X: GRUB Legacy, GRUB2MBR:第一个扇区
前446字节 bootloader
中间64字节 分区表
最后2字节 55AAGRUB
primary boot loader : 1st stage,1.5 stage
secondary boot loader :2nd stage,分区文件kernel
自身初始化:
探测可识别到的所有硬件设备
加载硬件驱动程序(借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init
以上是关于Linux之系统启动和内核管理的主要内容,如果未能解决你的问题,请参考以下文章
LINUX PID 1和SYSTEMD PID 0 是内核的一部分,主要用于内进换页,内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程(代码片段