启动内核管理

rpm -q 查看安装包的版本号
rpm -q kernel 查看内核版本号
uname -r 查看内核版本号
lsmod 列出系统中加载的模块(list modul 列出模块)
cpio 文件打包文件
cpio -tv < initrd-2.6.18-164.el5.img
cpio 文件解压缩 -v预览文件内容
centos 5 驱动模块---initrd
centos 6 q驱动模块--initramfs
gunzip initramfs-2…….img.gz 解压缩
cpio -tv < initrd-……
initramfs-2.6.32-696.el6.x86_64.img 此文件放的是和启动相关的驱动模块
vmlinuz-2.6.32-696.el6.x86_64 此文件放的是linux 的核心功能
核心文件存放位置:
ls /boot
ls /lib/modules/2.6.32-696.el6.x86_64/

核心文件:
/boot/vmlinuz-VERSION-release
ramdisk:辅助的伪根系统
CentOS 5: /boot/initrd-VERSION-release.img CentOS 6,7: /boot/initramfs-VERSION-release.img
模块文件:/lib/modules/VERSION-release
rpm -q grub
grub-0.97-99.el6.x86_64
centos 6 启动流程:

启动先:post 加电自检
---->
MBR 引导
---->
加载grub(ls /boot/grub)
---->
再加载vmlinuz内核文件(ls /boot/vmlinuz-2.6.32-696.el6.x86_64,按此文在发布的光盘里,只是拷贝了过来)
md5sum /boot/vmlinuz-2.6.32-696.el6.x86_64
md5sum vmlinuz
做哈希运算,比较俩文件是否一样
---->
再访问硬盘的根:以只读的方式去挂载根
根的位置存放在配置文件中:/boot/grub/grub.conf
根分区所在文件系统的存放位置:/boot/initrd-2.6.32-696.el6.x86_64.img(虚拟文件系统,以及一些必要的驱动!)(此文件是安装系统的时候临时生成的);通过此文件找到文件系统的驱动;

如果此文件被破坏了咋办?
可以用:mkinitrd、重新生成此文件
当initrd(initramfs)文件被删了后:mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 可以生成该文件!
但如果删了未修复重启咋办?
此故障是经过grub之后才会出现问题;
光盘引导,进救援模式!
首先切换根:chroot /mnt/sysimage/
# mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
sync
sync 强制写到磁盘
exit 退出
exit 退出
reboot 重启
------------------------------------------------------------------
实验:删除/boot/所有文件,不包括目录
rm -f /boot/*

---->
找到启动程序:启动init进程(位置:/sbin/init)(centos7叫:systemd)
---->
读取软件的相关配置文件:/etc/inittab 此文件定义了必要的内容,比如开机进入什么模式等等; /etc/init/*.conf
---->
调用大堆的初始化脚本,并最终进入登陆界面;
---->
-------------------------------------------------------------------
1.加载BIOS的硬件信息,获取第一个启动设备
主板内置的程序:
Power-On-Self-Test,加电自检
bootloader:引导加载器,引导程序
windows:ntloader,仅是启动OS
Linux: 兼容于windows;最好先装windows,再装Linux,然后linux的bootloader会覆盖windows的bootloader
grub:grand unifiled bootloader
rpm -q grub
grub-0.97-99.el6.x86_64

2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息
MBR:
446:bootloader
--->此处只存放了bootloader的第一阶段
--->446字节引导完成之后,她开始找/boot分区,和内核相关的文件(前提进入文件系统);前面446字节会告诉我们去哪里找/boot分区的驱动
--->相当于grub的第1.5阶段,表现为/boot分区下的文件;1.5阶段:加载/boot的驱动存放在MBR后面的扇区
64:分区表,2:55AA

grub:
primary boot loader:1st stage,1.5stage

secondary boot loader:2nd stage,分区文件

存放根分区的文件系统的驱动在:/boot/initrd-2.6.32-696.el6.x86_64.img
file initrd-2.6.32-696.el6.x86_64.img (gzip 压缩文件)
解压缩:gzip -d initrd-2.6.32-696.el6.x86_64.img.gz (重命名)
fiel initrd-2.6.32-696.el6.x86_64.img (cpio 打包文件)
cpio -tv initrd-2.6.32-696.el6.x86_64.img |grep ext4 (查找文件系统的驱动)
---------------------------------------------------------------------
详细查看:grub (MBR 前446字节)
破坏实验一:
fisrt、备份 dd if=/dev/sda of=/data/mbr bs=1 count=512
sz /data/mbr
secend、破坏
dd if=/dev/zero of=/dev/sda bs=1 count=446 清空
hexdump -C -n 512 /dev/sda -v 查看是否清空
reboot 重启-(硬盘不具有启动功能)直接跳到光盘启动
幸运的是分区表没有被破坏,它还能找到挂载的根:/mnt/sysimage/
ls /mnt/sysimage/data 查看备份的文件是否还在
dd if=/mnt/sysimage/data/mbr of=/dev/sda bs=1 count=446 恢复mbr前446个字节
sync
sync (确认强行写入硬盘)
hexdump -C - n 512 /dev/sda -v 查看是否恢复
破坏实验二:
如果没有备份
dd if=/dev/zero of=/dev/sda bs=1 count=446
grub-install /dev/sda 重新安装grub修复(可以修复grub的1阶段、1.5阶段、2阶段)
如果机器重启了,咋办?
# reboot
# chroot /mnt/sysimage/
# grub-install /dev/sda
# sync
# sync同步写磁盘
# reboot 重启

修复方法三:
# grub
# root (hd0,0) (此处root就是boot的意思)指定/boot的分区,在第一个硬盘的第一个分区,表示为:(hd0,0)
# setup (hd0) 安装第一阶段,但第一阶段mbr不属于任何分区,所以表示为:(hd0)
# quit 成功修复并退出
# hexdump -C -n 512 /dev/sda -v
此命令的问题是它依赖于目录/boot/grub 下的特定文件
移除/boot/grub 下的所有文件,除了grub.conf(menu.lst)、splash.xpm.gz
# reboot
刚刚那些文件对启动没有影响,用grub命令去修复得依赖于那些文件
所有如果此时破坏了mbr,还得用grub-install /dev/sda 来修复该文件

破坏实验三:破环1.5阶段
# dd if=/dev/zero of=/dev/sda bs=1 count=10000 skip=512 seek=512
# reboot
破坏后的表现:重启后不会进入光盘,它认为硬盘是有启动能力的
救援模式,光盘引导
修复方法一:
# grub
# root (hd0,0) (前提是得知道/boot 分区,在哪块硬盘的第几分区)
# setup (hd0)
# quit
# exit
备注:!!!
如果没有用grub修复过,那么前面那些文件删了也不会影响启动
但是如果已经用grub修复过,那么前面的文件如果被删了,则会导致机器起不来

修复方法二:
# grub-install /dev/sda
# sync
# sync
# exit
# exit
--------------------------------------------------------------------
详细分析此文件 /boot/grub/grub.conf
vim /boot/grub/grub.conf
#default=0 表示以第一个title 作为默认启动选项
#timeout=5 5秒钟的可选时间
#splashimage=(hd0,0)/grub/splash.xpm.gz 此界面的图片
---------------------------------------------------------------------
#passwd magedu 添加一行,即使用户进入单用户模式,也会被要求输入口令的

如何生成加密口令:
# grub-md5-crypt
# Password: magedu
# Retype password: magedu
# $1$TVC9r/$HLO5Jf8oP8rqD0neqwLVu1

#passwd --md5 $1$TVC9r/$HLO5Jf8oP8rqD0neqwLVu1

加密算法二:
# grub-crypt
# Password: magedu
# Retype password: magedu
# $6$aDGyUYUQqgUjaF7L$WUby3diijIlS8D9gDUF4u.ou6Tjx8ZBjHEThpozNFIkcfZP1PhuzPey234K8yYpZr87JACNxlmP9MkcB2jxdk. (sha512 加密算法)
# passwd --encrypted $6$aDGyUYUQqgUjaF7L$WUby3diijIlS8D9gDUF4u.ou6Tjx8ZBjHEThpozNFIkcfZP1PhuzPey234K8yYpZr87JACNxlmP9MkcB2jxdk.

---------------------------------------------------------------------
#hiddenmenu 默认下边的菜单是隐藏的
#title CentOS 6 (2.6.32-696.el6.x86_64)
#root (hd0,0) 表示/boot 分区的位置位于第一块硬盘的第一个扇区
#kernel /vmlinuz-2.6.32-696.el6.x86_64 root=UUID=6107ec3f-828f-4a3f-98b1-d10911c8dc13(等价于/dev/sda2)…… (rhgb quiet 取消这俩个,会详细的显示启动的过程)
#initrd /initramfs-2.6.32-696.el6.x86_64.img
上面俩个文件的位置顺序不能调换!
---------------------------------------------------------------------修改一张开机启动选项处的图片:/boot/grub/splash.xpm.gz
yum install ImageMagick
rpm -ql ImageMagick
/usr/bin/convert 图片类型转换工具
convert -resize 640x480 -colors 14 win.jpg win.xpm
head win.xpm 查看此文件的头部信息
gzip win.xpm
mv win.xpm.gz /boot/grub/



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


4.核心执行init程序,并获取默认的运行信息
which init
rpm -qf /sbin/init
配置文件:
centos5/centos6:/etc/inittab
cat /etc/inittab
id:5:initdefault 默认以5模式启动;定义开机模式

如果定义成6模式:则会不停的重启,如何修复之?
进入启动菜单项,输a键
然后输1/single/S/s:让系统临时切换到单用户模式下,然后去修改相关文件!
或者直接输5,直接进入图形界面,不去让她读取配置文件,进入系统后再去修改相关文件!
扩展,破解口令:
开机进入1模式:单用户模式,根本不需要输入密码!
启动后直接修改root的密码!
系统启动之后跑的第一个初始化脚本:
/etc/rc.d/rc.sysinit
chkconfig --list

然后开始跑模式对应的服务脚本:
ntsysv 可以用来定义或者查看:当前模式下,某个服务的启动状态
有[*]代表开机启动
没有的[ ]代表开机不启动

ls /etc/rc5.d/
Linux开机启动不启动实现的机制就是看:是以K打头,不启动;还是以S打头,启动

不用命令ntsysv来改,直接手动更改服务是否启动:
mv K05atd S95atd
本质:ntsysv就是该的软连接名
ntsysv --lever=3 用来更改3模式,以及更改其他模式的开机启动服务
ntsysv淘汰了,更新替代的工具:chkconfig
chkconfig --list atd 可以列出某个服务的所有模式下开机启动的状态
chkconfig --list 35 atd off 可以同时改3和5模式,atd服务都改为开机不启动
chkconfig --list atd on 默认改的是2、3、4、5模式
ls /var/lock/subsys 查看处于启动状态的服务,当然只是服务的文件名
service atd status 查看服务当前的运行状态
service atd start 开启服务
service atd stop 关闭服务
service atd restart 重启服务

{
which service;/sbin/service
cat /sbin/service 是个脚本
}
chkconfig --list 列出所有的独立服务

创建一个自定义的服务:
first:创建一个服务脚本/etc/init.d/
格式要求,关键几行:
#!/bin/bash
# chkcongfig: 345 95 5 (chkconfig:- 代表所有模式都是on的状态)
默认什么模式下是on的状态,开启时:S95开头,关闭后:K5开头
cd /etc/init.d/
vim testsrv
#!/bin/bash
#chkconfig: 35 96 3
#description
source /etc/init.d/functions
case $1 in
start)
[ -f /var/lock/subsys/testsrv ] && action "testsrv is started"
touch /var/lock/subsys/testsrv
action i"testsrv is starting"
;;

stop)
rm -f /var/lock/subsys/testsrv
action "testsrv is stopped"
;;
status)
[ -f /var/lock/subsys/testsrv ] && echo "testsrv is starting" || echo "testsrv is stoopped"
;;
*)
echo "Usage: service testsrv start|stop|status"
;;
esac
chmod +x testsrv
第二步:
把脚本变成服务:chkconfig --add testsrv(确保脚本在目录里:/etc/init.d/ 且带执行权限的)
查看:
chkconfig --list testsrv
ls /etc/rc3.d/
ls /etc/rc5.d/
chkconfig --level 5 testsrv off 把5模式的testsrv服务设置为开机不启动
chkconfig --level 5 testsrv on 把5模式的testsrv服务设置为开机启动
chkconfig testsrv on 把所有模式的testsrv服务设置为开机启动
service testsrv status 查看testsrv服务当前的状态
service --status-all 显示所有服务当前的状态
chkconfig --del testsrv 删除testsrv服务,然后手动删除脚本testsrv
chkconfig --list 表示开机的时侯,进入到某种模式先,启动还是不启动,并不是当前的状态

模拟故障:假设这个服务出故障了,比如脚本写得有问题。比如有条命令是:sleep 100000 !重启后,服务就卡在这里,系统起不来,怎么办?
重启进入1模式:
chkconfig testsrv off
chkconfig --list testsrv
------------------------
上面的都是独立服务,还有一种是非独立服务
超级守护进程:xinetd(独立服务)
telent:提供远程管理,类似于ssh
yum install telent-server
chkconfig --list
vim /etc/xinetd.d/telnet 修改此文件也可以启用或者停止telnet服务:disable = yes /disable = no
当然修改了配置文件也得重启xinetd服务:service xinetd restart
telent监听的端口是TCP的23端口,现在xinetd代替telnet服务来监听23端口
service xinetd status
service xinetd stop
service xinted start
ss -ntl 查看23端口的状态
ss -ntlpe 查看谁在监听23端口
当有人访问的时候,真正提供服务的不是xinetd,而是:telnet,此时它会被唤醒
yum install telnet 安装客户端
telent 192.168.30.6
-------------------
开机
读取文件启动文件:看以何种模式启动
先跑一个初始化脚本:/etc/rc.d/rc.sysinit
在运行启动脚本:/etc/rc.d/rc {0,1,2,3,4,5,6}

vim /etc/init/control-alt-delete.conf ……centos6 三个强制关机键,建议注释掉
vim /etc/inittab ……centos5 开机执行的脚本

---------------------------------------------------------------------

5.init程序执行/etc/rc.d/rc.sysinit文件


6.启动核心的外挂模块


7.init执行运行的各个批处理文件(scripts)


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


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


10.登录之后开始以Shell控制主机
--------------------------------------------------------------------

mkdir /mnt/boot
mount /dev/sdb1 /mnt/boot

ls /mnt/boot/grub
vim /boot/grub/grub.conf

-------------------------
破坏性实验四:
删除/boot/下的所有文件 rm -rf /boot/
reboot
chroot /mnt/sysimage/
mount /dev/sr0 /mnt 挂载光盘
cp /mnt/isolinux/vmlinuz /boot/
mkinitrd initramfs.img `uname -r`
grub-install /dev/sda
vim grub.conf
default=0
timeout=5
title wanglinux
kernel /vmlinuz root=/dev/sda2
initrd /initramfs.img
---------------------
(Error 15)修复方法二:
mkdir /mnt/cdrom
mount /dev/sr0
rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-696.el6.x86_64.rpm --root=/mnt/sysimage/ --force
chroot /mnt/sysimage/
grub-install /dev/sda
vim /boot/grub/grub.conf
default=0
timeout=5
tilte linux
kernel /vmlinuz-2.6.32-696.el6.x86_64 root=/dev/sda2 quit rhgb selinux=0
initrd /initramfs-2.6.32-696.el6.x86_64.img
但是/boot不是一个独立的分区,那么:
kernel /boot/vmlinuz-2.6.32-696.el6.x86_64 root=/dev/sda2
initrd /boot/initramfs-2.6.32-696.el6.x86_64.img
此处的根/ 指的是/boot 这个目录所在的分区
---------------------------------------
破坏性实验三:删除/etc/fstab
rm -rf /etc/fstab
rm -rf /boot/*
reboot
fdisk -l 查看硬盘的分区情况
mkdir /mnt/rootfs 创建文件夹
mount /dev/sda1 /mnt/rootfs 把硬盘分区/dev/sda1挂载到/mnt/rootfs上
ls 查看:什么也没有,发现它不是根分区(很可能是/boot)
umount /mnt/rootfs
mount /dev/sda2 /mnt/rootfs 把硬盘分区/dev/sda2挂载到/mnt/rootfs上
ls 查看:有根下的文件夹,发现它就是根分区
blkid 查看分区的文件系统
vim /mnt/rootfs/etc/fstab
/dev/sda2 / ext4 default 0 0
/dev/sda1 /boot ext4 default 0 0
/dev/sda5 swap awap default 0 0
/dev/sda3 /data/ ext4 /default 0 0
reboot
-------------------------------------------------------------------
后续修复详解……
(Error 15)修复:
mkdir /mnt/cdrom
mount /dev/sr0
rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-696.el6.x86_64.rpm --root=/mnt/sysimage/ --force
chroot /mnt/sysimage/
grub-install /dev/sda
vim /boot/grub/grub.conf
default=0
timeout=5
tilte linux
kernel /vmlinuz-2.6.32-696.el6.x86_64 root=/dev/sda2 quit rhgb selinux=0
initrd /initramfs-2.6.32-696.el6.x86_64.img
-------------------------------------------------------------------

你可能感兴趣的:(启动内核管理)