1、Linux 组成
kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等等
rootfs: 程序和glibc
内核设计流派:
单内核(monolithic kernel)-Linux-把所有功能集成于同一个程序
微内核(micro kernel)-Windows, Solaris-每种功能使用一个单独子系统实现
1)、Linux内核特点:
支持模块化(.ko内核模块文件)如文件系统,硬件驱动,网络协议等
支持内核模块的动态装载和卸载
2)、内核组成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk辅助的伪根系统(工具程序mkinitrd):
CentOS 5: /boot/initrd-VERSION-release.img
CentOS6,7: /boot/initramfs-VERSION-release.img
/boot/initramfs-2.6.32-642.el6.x86_64.img
$ mkinitrd initramfs-`uname -r`.img `uname -r`可以恢复丢失的ramdisk系统
模块文件:/lib/modules/VERSION-release
/lib/modules/2.6.32-642.el6.x86_64
2、centos6 启动流程
1).加载BIOS 的硬件信息,获取第一个启动设备
2).读取第一个启动设备MBR的引导加载程序(grub)的启动信息
3).加载核心操作系统信息,核心开始解压缩,并尝试驱动所有的硬件设备
4).核心执行init 程序并获取运行信息
5).Init执行/etc/rc.d/rc.sysinit 文件
6).启动核心的外挂模块(/etc/modprobe.conf)
7).Init执行运行各个批处理文件(scripts)
8).Init执行/etc/rc.d/rc.local
9).执行/bin/login 程序,等待用户登录
10).登录之后开始以Shell控制主机
启动流程:
POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测;
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,GRUB2
MBR(446-bootloader,64-分区表,2-55aa)
GRUB:
primary boot loader: 1st stage,1.5 stage
secondary boot loader:2nd stage,分区文件
stage1: mbr
stage1_5: mbr之后27扇区,让stage1中bootloader能识别stage2所在的分区上的文件系统
stage2:磁盘分区(/boot/grub/)
kernel-自身初始化:探测可识别到的所有硬件设备,加载硬件驱动程序(可能借助于ramdisk 加载驱动),以只读方式挂载根文件系统,运行用户空间的第一个应用程序/sbin/init
启动流程(到/etc/rc.d/rc.sysinit的任何步骤出现问题,系统均不能正常启动):
POST(BIOS)加电自检–>
BootSequence(BIOS)选取确定引导设备(磁盘、优盘、光盘等等)–>
Bootloader(MBR)第一阶段读取引导设备mbr的446字节即是bootloader, 在5/6上是grub程序,目的是在未来引导boot分区;一点五阶段读取mbr的后续27个扇区的数据,识别boot所在的分区,进而加载boot分区驱动等;第二阶段读取grub文件夹文件–>kernel(ramdisk)–>
rootfs识别根系统(只读)–> switchroot
启动第一个进程init(systemd)–>(/etc/inittab)–>设置默认运行级别–>
运行系统初始脚本/etc/rc.d/rc.sysinit完成系统初始化–>
关闭对应级别下需要关闭的服务,启动需要启动的服务–>设置登录终端
3、init 程序的类型及配置文件:
SysV: init,CentOS5之前
配置文件/etc/inittab
Upstart: init,CentOS6
配置文件/etc/inittab
/etc/init/*.conf
Systemd:systemd,CentOS7
配置文件/usr/lib/systemd/system
/etc/systemd/system
4、/sbin/init (CentOS6之前)
运行级别:为系统运行或维护等目的而设定0-6共7个级别
0:关机
1:单用户模式(root自动登录),single,维护模式
2: 多用户模式,启动网络功能,但不会启动NFS,维护模式
3:多用户模式,正常模式,文本界面
4:预留级别,可同3 级别
5:多用户模式,正常模式,图形界面
6:重启
默认级别:3, 5
切换级别:init #
查看级别:runlevel; who -r
Init的初始化即是读取其配置文件:/etc/inittab
[root@localhost ~]# runlevel
N 5
[root@localhost ~]# init 3
[root@localhost ~]# runlevel
5 3
[root@localhost ~]# who -r
run-level 3 2016-09-08 21:44 last=5
[root@localhost ~]# init 6 重启系统
[root@localhost ~]# init 0 关闭系统
5、inittab和相关文件
1)、CentOS5的inittab文件
配置文件:/etc/inittab
每一行定义一种action以及与之对应的process,格式如下:
id:runlevel:action:process
action:
wait: 切换至此级别运行一次
respawn:此process 终止,就重新启动之
initdefault:设定默认运行级别,process省略
sysinit:设定系统初始化方式,此处一般为指定系统初始化脚本/etc/rc.d/rc.sysinit
ca::ctrlaltdel:/sbin/shutdown -t3 -r now,为了防止重启误操作,可把此行注释掉
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc0.d
l1:1:wait:/etc/rc.d/rc1.d
……
l6:6:wait:/etc/rc.d/rc6.d
说明:rcN –>意味着读取/etc/rc.d/rcN.d/,其中的文件都是软链接,指向/etc/init.d中的文件
K##*:##运行次序,数字越小,越先运行,并且数字越小的服务,通常依赖到别的服务
S##*:##运行次序,数字越小,越先运行,数字越小的服务,通常为被依赖到的服务
关于K##*与S##*文件的开机处理,可参看#cat /etc/rc.d/rc文件:
for srv in /etc/rc.d/rcN.d/K*;do
$srv stop
done
for srv in /etc/rc.d/rcN.d/S*;do
$srv start
Done
2)、CentOS6的inittab和相关文件
/etc/inittab
设置系统默认的运行级别id:3:initdefault:
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf
6、系统初始化脚本/etc/rc.d/rc.sysinit-开机执行
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev 和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm 及software raid设备
(10)加载额外设备的驱动程序
(11)清理操作
7、chkconfig命令
查看服务在所有级别的启动或关闭设定情形:
#chkconfig [–list] [name]
[root@localhost ~]# chkconfig –list atd
atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
如果要添加服务在系统启动时于特定级别下自动运行,可以进行如下步骤:
首先添加的自定义服务SysV脚本放置于/etc/rc.d/init.d (/etc/init.d)
然后执行如下命令加载服务进入级别列表#chkconfig –add name
服务脚本的格式如下:
#!/bin/bash
#LLLL表示初始在哪个级别下启动,-表示都不启动
# chkconfig: LLLL n1 n2
#description:
示例如下
[root@localhost init.d]# pwd
/etc/init.d
[root@localhost init.d]# vim testsvr.sh
#1/bin/bash
#chkconfig: 35 88 26 意思是在启动级别3和5下启动,S*编号为88,K*编号为26
#description:testsvr scription
case $1 in
start)
echo testsvr start
;;
stop)
echo testsvr stop
;;
status)
echo testsvr status
;;
*)
echo xxx
;;
esac
[root@localhost init.d]# chmod +x testsvr.sh
[root@localhost init.d]# chkconfig –add testsvr.sh
[root@localhost init.d]# chkconfig –list testsvr.sh
testsvr.sh 0:off 1:off 2:off 3:on 4:off 5:on 6:off
[root@localhost init.d]# ls /etc/rc.d/rc3.d
S88testsvr.sh
[root@localhost init.d]# ls /etc/rc.d/rc2.d
K26testsvr.sh
[root@localhost init.d]# service testsvr.sh start
testsvr start
[root@localhost init.d]# service testsvr.sh status
testsvr status
[root@localhost init.d]# service testsvr.sh stop
testsvr stop
删除服务于级别列表:
#chkconfig –del name
修改指定服务的级别类型:
#chkconfig [–level levels] name <on|off|reset>
–level LLLL: 指定要设置的级别,省略时表示2345
[root@localhost init.d]# chkconfig –list testsvr.sh
testsvr.sh 0:off 1:off 2:off 3:on 4:off 5:on 6:off
[root@localhost init.d]# chkconfig testsvr.sh on
[root@localhost init.d]# chkconfig –list testsvr.sh
testsvr.sh 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@localhost init.d]# chkconfig –level 24 testsvr.sh off
[root@localhost init.d]# chkconfig –list testsvr.sh
testsvr.sh 0:off 1:off 2:off 3:on 4:off 5:on 6:off
#ntsysv –level=2 修改2级别下的服务开机是否启动
#ntsyav 修改当前级别下服务开机是否启动
8、xinetd管理的服务
service命令:手动管理服务
瞬态(Transient)服务被xinetd 进程所管理,进入的请求首先被xinetd代理
配置文件:/etc/xinetd.conf 、/etc/xinetd.d/<service>
可用chkconfig 控制的瞬态服务启动关闭:
chkconfig tftp on
chkconfig tftp off
9、正常级别(2345级别)下S99local
注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/rc.d/init.d下的服务脚本,而是指向了/etc/rc.d/rc.local 脚本
不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local 文件中,/etc/rc.d/rc.local 在指定运行级别脚本后运行
10、破解root口令
在启动过程中,在菜单页按下任意键,然后选择a选项,输入1、s、S、single任意可进入单用户模式,可进行口令的修复
11、grub legacy
stage1: mbr
stage1_5: mbr之后27扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
stage2:磁盘分区(/boot/grub/)
配置文件:/boot/grub/grub.conf <– /etc/grub.conf
其中default=#设定默认启动第几个title对应的操作系统,单项(title) 编号从0开始
timeout=#超时时间-菜单项等待选择时长,超时时间过后自动启动默认的操作系统
splashimage=(hd#,#)/PATH/TO/XPM_FILE 菜单背景图片文件路径
[root@centos6-8 ~]# cp /boot/grub/splash.xpm.gz /root
[root@centos6-8 ~]# gzip -d splash.xpm.gz
[root@centos6-8 ~]# more splash.xpm
#yum install ImageMagick
#covret -resize 640×480 -colors 14 win.jig win.xpm
#gzip win.xpm
#vim /ect/grub.conf
hiddenmenu启动时默认菜单是不可见的,启动中按任意键后可见
password [–md5] STRING:启动菜单编辑时认证
示例passwd centos 设置启动菜单编辑时要输入密码centos
示例加密密码passwd –md5 加密密码字符串
生成加密密码#grub-md5-crypt
#openssl passwd -salt “xxx” -1
title TITLE:定义菜单项“标题”
root (hd#,#):grub查找stage2及kernel文件所在设备分区,为grub“根”
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件
password [–md5] STRING:启动选定的内核或操作系统时进行认证
stage2及内核等通常放置于一个基本磁盘分区
功用:
(1)提供启动菜单、并提供交互式接口
a:编辑内核参数,不能够编辑kernel和initrd核心数据
内核参数不影响正常启动
参数rhgb定义图形界面启动
参数quite定义启动时不显示内核加载过程信息
参数init=/PATH/TO/xxx定义系统启动时的第一个程序(例如init=/bin/bash,启动后直接进入bash程序,此时可以进行简单的操作,但是因网络服务还没有启动,没有网络,而且根系统为只读,执行命令#mount -o remount,rw /后,根系统就可以读写操作,可以进行系统的基本修复作业)
此外还有max_loop=#、selinux=0/1、net.ifnames=0等等
e: 编辑模式,用于编辑菜单
c: 命令模式编辑菜单,交互式接口
(2)加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏启动菜单
(3)为菜单提供了保护机制
为编辑启动菜单进行认证
为启用内核或操作系统进行认证
#cat /var/log/boot.log可以查看启动过程日志信息
#cat /proc/cmdline 查看内核参数
内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt
grub 的命令行接口
help:获取帮助列表
help KEYWORD:详细帮助信息
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE root=/dev/DEVICE:设定本次启动时用到的内核文件,额外还可添加内核支持使用的cmdline参数,例如max_loop=100 selinux=0 init=/path/to/init(init=/bin/bash)
initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk
boot:引导启动选定的内核
识别硬盘设备:
(hd#,#)
hd#:磁盘编号,用数字表示,从0开始编号
#:分区编号,用数字表示,从0开始编号
(hd0,0)第一块硬盘,第一个分区
(hd0,1)第一块硬盘,第二个分区
手动在grub命令行接口《启动系统》示例:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
12、grub安装(修复范围)
(1) grub-install命令(救援模式下修复)
能够安装grub stage1和stage1_5到/dev/DISK 磁盘上,并复制GRUB的相关文件(不包括grub.conf文件)到 DIR/boot目录下
#grub-install –root-directory=DIR /dev/DISK
(2)grub命令(交互式修复)-修复时依赖/boot/grub下的*1_5文件
grub> root (hd#,#) 指定根所在位置
grub> setup (hd#) 指定安装磁盘位置
grub>quit
13、自制linux系统示例
新建磁盘/dev/sdb
#fdisk分出/dev/sdb1和/dev/sdb2
#mkfs.ext4 /dev/sdb1
#mkfs.ext4 /dev/sdb2
#mkdir /mnt/boot
#mkdir /mnt/sdb2
#mount /dev/sdb1 /mnt/boot
#mount /dev/sdb2 /mnt/sdb2
#cd /mnt/boot
#cp /boot/initramfs-2.6.32-642.el6.x86_64.img /boot/vmlinuz-2.6.32-642.el6.x86_64 .
#grub-install –root-directory=/mnt /dev/sdb
# cd /mnt/boot/grub
#vim grub.conf 写入如下:
default=0
timeout=5
title custom-centos
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-642.el6.x86_64.img
#cd /mnt/sdb2
#mkdir {etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
#cd
#mkdir bin
#cd bin
#vim cpcmd.sh 复制命令的脚本
#cd
#vim .bash_profile 写入如下:
PATH=$PATH:$HOME/bin:/root/bin
#. .bash_profile
#cd bin
#cpcmd.sh 复制命令bash、ls、df、mount、umount、blkid、lsblk、rpm等等
#cd
#vim /mnt/sdb2/etc/fstab 写入如下:
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
14、救援恢复/etc/inittb文件
从光盘引导(boot.iso或者安装光盘#1)
从USB盘引导(由boot.iso制作)
系统在引导期间,很重要的一个过程就是通过init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动,此时,只有通过救援模式才可以解决此类问题
• 有备份文件的恢复方法
• 没有备份文件的恢复办法
有备份文件的恢复办法:
进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可;如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复;
假设有备份文件/etc/inittab.bak,则在救援模式下执行:
sh-3.1# chroot /mnt/sysimage
sh-3.1# cp /etc/inittab.bak /etc/inittab
没有备份文件的恢复办法:
如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复
首先查找到/etc/inittab 属于哪一个RPM包
# chroot /mnt/sysimage
# rpm -qf /etc/inittab
initscripts-9.03.49-1.el6.centos.x86_64
挂载存放RPM 包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下)
# mount /dev/sr0 /mnt/source
CentOS6系统的RPM包存放在光盘Packages目录下
要修复的硬盘系统的根目录是/mnt/sysimage
若当前目录不是/mnt/sysimage,那么需要使用–root选项指定其为根目录来覆盖安装/etc/inittab文件所在的RPM包
# rpm -ivh /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm –replacepkgs|force
其中的rpm 命令选项“–replacepkgs”表示覆盖安装,执行完成后即已经恢复了此文件
如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,执行命令:
# rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm|cpio
-idv ./etc/inittab
命令中./etc/inittab的.表示提取PRM包中/etc/inittab到当前目录
# cp etc/inittab /mnt/sysimage/etc
注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的路径,提取文件成功后,将其复制到根分区所在/mnt/sysimage目录下相应位置即可
练习(救援模式的根与硬盘系统的根):
1、/boot/grub/grub.conf中的kernel和initrd核心信息破坏,启动中按如下步骤临时修复:
在错误界面,按照提示按任意键进入启动菜单页;
读下面的提示信息,选择按e键进入编辑模式;
读下面的提示信息,选择e键编辑选择的命令;
读上面的提示信息,进行相应的操作,例如修改后按enter键保存修改等等
然后按照提示启动即可
当然也可以进行救援修复,只不过较为复杂
2、破坏第一阶段,救援恢复启动步骤如下:
#dd if=/dev/zero of=/dev/sda bs=1 count=1
进入救援模式;
$chroot /mnt/sysimage
$grub-install /dev/sda
然后退出重启即可
或者如下修复
grub命令-交互式修复;
grub> root (hd0,0)
grub> setup (hd0)
grub>quit
然后重启即可
3、删除/boot目录下的grub后,救援恢复启动步骤如下:
进入救援模式;
$chroot /mnt/sysimage
$grub-install /dev/sda
然后切换至/boot/grub下,$vim grub.conf参考写入以下内容:
default=0
timeout=5
title centos6.8-shan
kernel (hd0,0) /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/sda2
initrd (hd0,0)/initramfs-2.6.32-642.el6.x86_64.img
然后退出重启即可
4、删除/boot目录下的vmlinuz-2.6.32-642.el6.x86_64、initramfs-2.6.32-642.el6.x86_64.img,
救援恢复启动步骤如下(使用光盘恢复):
进入救援模式;
$chroot /mnt/sysimage
$mount /dev/sr0 /mnt/cdrom
$cd /mnt/cdrom
$cd isolinux/
$cp vmlinuz /boot
$cd /boot
$mv vmlinuz vmlinuz-`uname -r`
$mkinitrd initramfs-`uname -r`.img `uname -r`
然后退出重启即可
5、删除/boot目录下的vmlinuz-2.6.32-642.el6.x86_64,救援恢复启动步骤如下(使用网络恢复):
进入救援模式中选择建立网络;
$chroot /mnt/sysimage
$scp 192.168.1.109:/boot/vmlinuz* /boot
然后退出重启即可
6、删除/boot目录,救援恢复启动步骤如下:
进入救援模式;
$chroot /mnt/sysimage
$rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-642.el6.x86_64.rpm –force
只需在根目录下或者指定根目录,就会自动安装到/boot下
$grub-install /dev/sda
然后切换至/boot/grub下,$vim grub.conf参考写入以下内容:
default=0
timeout=5
title centos6.8-shan
kernel (hd0,0) /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/sda2
initrd (hd0,0)/initramfs-2.6.32-642.el6.x86_64.img
然后退出重启即可
或者进入救援模式直接执行:
$mount /dev/sr0 /mnt/cdrom
$rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-642.el6.x86_64.rpm
–root=/mnt/sysimage –force
此处使用–root=/mnt/sysimage指定根目录,而且—force选项可用—replacepkgs替代
$chroot /mnt/sysimage
$grub-install /dev/sda
然后切换至/boot/grub下,$vim grub.conf参考写入以下内容:
default=0
timeout=5
title centos6.8-shan
kernel (hd0,0) /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/sda2
initrd (hd0,0)/initramfs-2.6.32-642.el6.x86_64.img
然后退出重启即可
7、删除/etc/fstab 和/boot目录的所有文件,救援恢复启动步骤如下:
/etc/fstab文件中最重要的挂载,也是能够影响系统启动的挂载是/和/boot,其它的挂载都可以在系统启动后再行挂载
修复顺序:先修复/etc/fstab,再修复/boot,因为修复/boot需要根的挂载
进入救援模式;
#df 查看挂载情况
#blkid或者#fdisk -l 查看分区情况
#mkdir /mnt/tmp
#mount /dev/sda* /mnt/tmp
临时挂载试查找哪个分区是boot分区和根分区
假如查找结果/dev/sda1是boot分区,/dev/sda2是根分区
#mount /dev/sda2 /mnt/tmp
临时挂载根分区,并在根分区中手动建立/etc/fstab文件
#cd /mnt/tmp/etc
#vi /etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
重新启动,再次进入救援模式
$chroot /mnt/sysimage
$rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-642.el6.x86_64.rpm –force
$grub-install /dev/sda
然后切换至/boot/grub下,$vim grub.conf参考写入以下内容:
default=0
timeout=5
title centos6.8-shan
kernel (hd0,0) /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/sda2
initrd (hd0,0)/initramfs-2.6.32-642.el6.x86_64.img
然后退出重启即可
原创文章,作者:18612763863,如若转载,请注明出处:http://www.178linux.com/45927