码迷,mamicode.com
首页 > 系统相关 > 详细

linux-系统启动流程-7

时间:2019-10-04 00:00:00      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:兼容   实验   rap   for   wap   自制   shared   目录   救援模式   

技术图片

1,BIOS开机自检,检查cpu硬件及开机启动顺序,查找第一个磁盘磁头的MBR信息并加载BOOtloader,然后将控制权交与bootloader
2, GRUB
GRUB(Grand Unified Bootloader),多系统启动程序

stage1 : 查找加载stage 1.5

stage1.5: 可以识别文件系统, 即识别 /boot/ 磁盘第一个分区

stage 2: grub 识别/boot/grub/grub.conf ,根据配置文件,读取Kernel 信息,然后加载kernel 同时stage2也将initrd (Initial RAM Disk) 包含了磁盘的驱动程序,) 拷贝到内存,内核解压后,从该临时文件系统中加载驱动,识别根文件系统,根据 /etc/fstab 挂载文件系统 ,然后内核切根,随后执行第一个进程 init

技术图片

内核解压后同时解压initramfs微型文件系统,通过此文件系统,内核获取磁盘的驱动程序,并驱动所有的硬件外设,读取磁盘后将文件系统根
切换到该磁盘文件系统下,通过/etc/fstab挂载所有文件系统。然后执行核心init 程序,根据/etc/inittab,执行脚本

技术图片

系统进程

在内核加载完毕,并完成硬件检测与驱动程序加载后,主机硬件已经准备完毕,内核会主动呼叫第一个进程,也就是 /sbin/init

?CentOS 5.x 系统相比也有较大变化。在 CentOS 5.x 系统中,主要通过 init 进程的配置文件 /etc/inittab 来设定系统,并启动?Linux。但是在 CentOS 6.x 系统中,由于用 Upstart 启动服务来替换以前的 init,所以在 /etc/inittab 配置文件中只能定义系统的默认运行级别,而其他的功能是靠 /etc/init/ 目录中的其他配置文件实现的

技术图片

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.加载伪文件系统(ramdisk),
内核已将启动起来了,再调用ramdisk文件,尝试驱动所有的硬件设备,到这一步,内核起来了,所有驱动也装上了,因此后面的启动就可以交给程序了

7.启动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文件里面定义了系统默认运行级别,这一步做了一些工作如下:

a)初始运行级别(RUN LEVEL)
b)系统初始化脚本
c)对应运行级别的脚本目录
d)定义UPS电源终端/恢复脚本
e)在虚拟控制台生成getty,以生成终端
f)在运行级别5初始化X
(2)执行/etc/rc.d/rc.sysinit程序
系统初始化一些脚本,主要完成以下工作

a)设置主机名
b)设置欢迎信息
c)激活udev和selinux可以在grub.conf中,kernel行添加selinux=0以关闭selinux
d)挂载/etc/fstab文件中定义的文件系统
e)检测根文件系统,并以读写方式重新挂载根文件系统
f)设置系统时钟
g)激活swap设备
h)根据/etc/sysctl.conf文件设置内核参数
i)激活lvm及software raid设备
j)加载额外设备的驱动程序
k)清理操作
(3)/etc/rc#.d/文件(各种服务)
里面定义的是各种服务的启动脚本,可以ls查看,S开头代表开机启动的服务,K开头的是关机要执行的任务。#代表数字,一个数字代表一个运行级别,共7个运行级别,这里就不多说了

(4)/etc/rc.d/rc.local文件
这里面可以自定义开机启动的命令。

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

CentOS7启动流程
CentOS7和CentOS6启动流程差不多,只不过到init程序时候,改为了systemd,因此详细解释一下systemd后的启动流程

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对象。如果到此步骤,系统没有被指定启动图形桌面,到此就可以结束了,如果要启动图形界面,需要在此基础上启动桌面程序

7.systemd执行graphical需要的服务
CentOS6,7启动区别
系统启动和服务器守护进程管理器,它不同于centos5的Sysv init,centos6的Upstart(Ubuntu制作出来),systemd是由Redhat的一个员工首先提出来的,它在内核启动后,服务什么的全都被systemd接管,kernel只是用来管理硬件资源,相当于内核被架空了,因此linus很不满意Redhat这种做法。

系统启动流程实验

centos   6    grub.conf 

grub/grub.conf 
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
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=f2230c8f-30fb-4c8a-b7c9-a08f0e42bf7b 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

1,/boot/grub.conf 被破环的显示图
技术图片

内核及initrd 后 tab出来的选项
技术图片
root(hd0,0) 指boot分区,root=/dev/sda2 指根分区
技术图片

进入后创建/boot/grub/grub.conf

default=0
timeout=5
title CentOS 6 (2.6.32-754.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/sda2
initrd /initramfs-2.6.32-754.el6.x86_64.img

没有配置 root =/dev/sda2时报错如下
技术图片
进入救援模式后
技术图片

chroot /mnt/sysimage

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

创建/boot/grub/grub.conf

default=0
timeout=3
title centos6
root (hd0,0)
kernel /vmlinuz-------- root=/dev/sda2
initrd /initramfs ----

2,破环了mbr 446 字节
dd if=/dev/zero of=/dev/sda bs=1 count=446
现象
技术图片
还可以看见分区表 且可以挂载到 /mnt/sysimage

技术图片
chroot /mnt/sysimage

grub-install /dev/sda

sync
sync 数据写入磁盘

退出重启

3,删除掉 /boot/initramfs-·内核版本号·
现象

可以显示grub内核列表,但是回车后无法进入下一项,光标在左上角一直闪烁,不能进入centoes 6logo 界面

救援光盘进入bash
切根 chroot /mnt/sysimage

生成 initramfs.img
mkinitrd /boot/initramfs-uname -r.img uname -r

mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

/boot/vmlinuz--

可以看到grub可以识别grub.conf
但是不能正常载入内核,
技术图片

无法载入内核报错
技术图片

救援模式进入系统,挂载光盘
进入镜像目录,复制vmlinuz 为 vmlinuz-uname -r 与/boot/grub/grub.conf 里kernel 保持一致

或者通过挂载光盘使用rpm强制安装内核生成
 rpm -ivh --force kernel-2.6.32-71.el6.x86_64.rpm 


https://www.ibm.com/developerworks/cn/linux/l-cn-disa-recov/

CentOS6启动流程

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控制主机

内核

核心文件
未压缩的内核镜像 :/boot/vmlinuz-version-release
内核镜像可以挂载光盘,在iso中获取

RAMDISK 辅助的伪根系统
在stage-2阶段被读取进内存,被内核解压释放后暂时挂载,
内核读取硬件驱动文件后,识别系统磁盘,进而挂载真实文件系统,然后切换根到
真实的根上。

CentOS 5 /boot/initrd-VERSION-release.img
CentOS 6,7 /boot/initramfs-VERSION-release.img

可以使用工具生成
mkinitrd
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

CentOS 5 的inittab文件

init 初始化

init读取其初始化文件:/etc/inittab
初始运行级别(RUN LEVEL)
系统初始化脚本对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X

CentOS 6 的inittab文件

/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) 清理操作

技术图片

centos 7

CentOS 7
引导顺序UEFi或BIOS初始化,运行POST开机自检
选择启动设备
引导装载程序, centos7是grub2
加载装载程序的配置文件:
/etc/grub.d/
/etc/default/grub
/boot/grub2/grub.cfg
加载initramfs驱动模块
加载内核选项
内核初始化,centos7使用systemd代替init
执行initrd.target所有单元,包括挂载/etc/fstab
从initramfs根文件系统切换到磁盘根目录
systemd执行默认target配置,配置文件/etc/systemd/system/default.target
systemd执行sysinit.target初始化系统及basic.target准备操作系
systemd启动multi-user.target下的本机与服务器服务
systemd执行multi-user.target下的/etc/rc.d/rc.local
Systemd执行multi-user.target下的getty.target及登录服务
systemd执行graphical需要的

6破解

grub 菜单------e ------修改内核 加 1 进入单用户模式

7破解口令

启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux16开始的行,添加内核参数rd.break
按ctrl-x启动
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabe
lexit
reboot

方法2
启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh
按ctrl-x启动
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot

修复grub2

GRUB“the Grand Unified Bootloader”
引导提示时可以使用命令行界面可从文件系统引导
主要配置文件 /boot/grub2/grub.cfg
修复配置文件grub2-mkconfig -o /boot/grub2/grub.cfg
修复grub
grub2-install /dev/sda BIOS环境
grub2-install UEFI环境
调整默认启动内核
vim /etc/default/grub
GRUB_DEFAULT=0
或者
grub2-set-default "CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)"
查看是否修改成功
grub2-editenv list

自制Linux系统

添加新硬盘,扫描新增磁盘

echo "- - -" /sys/

1,创建分区文件系统

fdisk /dev/sdb分两个必要的分区
/dev/sdb1对应/boot /dev/sdb2对应根/

mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2

挂载boot
mkdir /mnt/boot 子目录必须为boot
mount /dev/sdb1 /mnt/boot
然后安装grub

grub-install --root-directory=/mnt /dev/sdb

确定busybox 复制在/dev/sdb1 中而不是/dev/sdb2

2,恢复内核及initramfs

cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot

建立grub.conf

vim /mnt/boot/grub/grub.conf

title wanglinux
root (hd0,0)kernel
/vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash initrd
/initramfs-2.6.32-642.el6.x86_64.img

配置文件内核名称与目录中文件保持一致

3,创建一级目录,复制相关命令至指定目录

mkdir /mnt/sysroot
mount /dev/sdb2 /mnt/sysroot
mkdir –pv
/mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}

复制相关命令及库文件

ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid

ldd which swapon
判断链接库文件,复制到相应目录

如果需要使用网路功能,还需要复制驱动程序e1000
cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/

查看网卡驱动
ethtool -i eth0
modinfo e1000 查看驱动位置,复制网卡驱动
insmod e1000.ko 加载驱动模块
开机启动具有加载模块功能

使用脚本复制动态链接库文件至相关目录中,驱动模块一并复制进去

复制动态链接库脚本
如果有该命令就且存在目标目录,复制命令和动态链接库至指定目录
which --skip-alias mv 跳过别名


#!/bin/bash
bincopy(){
 if which $1 &> /dev/null ;then
 local bin_cmd=`which --skip-alias $1`
 local dir_cmd=`dirname $bin_cmd `
 [ -d ${chroot}${dir_cmd} ] || mkdir -pv ${chroot}${dir_cmd}
 [ -f ${chroot}${bin_cmd} ] || { cp $bin_cmd ${chroot}${dir_cmd}; action
"cp $bin_cmd ${chroot}${dir_cmd}" ; }
 return 0
 else
 echo "$1 is not found"
 return 1
 fi
}
libcopy(){
 ldd $(which --skip-alias $1)|grep -Eo "/[^[:space:]]+" |while read line ;do
 local lib_dir=`dirname $line`
 [ -d ${chroot}${lib_dir} ] || mkdir -pv ${chroot}${lib_dir}
 [ -f ${chroot}${line} ] || { cp $line ${chroot}${lib_dir}; action "cp
$line ${chroot}${lib_dir}" ; }
 done
}
source /etc/init.d/functions
chroot=/mnt/sysroot
[ -d $chroot ] || mkdir -pv $chroot
while : ;do
 read -p "please input a command you want to copy:" cmd
 [[ $cmd =~ ^q(uit)?$ ]] && break
 bincopy $cmd
 if [ $? -eq 0 ]; then
     libcopy $cmd
  fi
done

内核模块编译


lsmod        |  grep  xfs
显示由核心装载的模块 内容来自  /proc/modules
需要写模块路径,不能解决依赖关系
depmod  
insmod  指定模块文件,不自动解决依赖模块

insmod `modinfo –n exportfs`

modprobe   -r   装载模块

modinfo [ -k kernel ] [ modulename|filename... ]
-n:只显示模块文件路径
-p:显示模块参数-
a:作者
-d:描述


编译内核

前提:获取目标主机硬件设备信息,系统信息,开发环境准备
目标主机硬件设备相关信息
cpu  
cat /proc/cpuinfo
x86info -a
lscpu
硬件设备
lspci 
-v 
-vv
lsusb
-v
-vv
lsblk 
hal-device:CentOS 6
编译系统


安装开发包组
下载源码文件
.config:准备文本配置文件
make menuconfig:配置内核选项
make [-j #]    (选择相应的功能)
make modules_install:安装模块
make install :安装内核相关文件
    安装bzImage为/boot/vmlinuz-VERSION-RELEASE
    生成initramfs文件
    编辑grub的配置文件

部分编译内核
?编译内核的一部分功能:
(a) 只编译某子目录中的相关代码
    cd /usr/src/linux
    make dir/
(b) 只编译一个特定的模块
    cd /usr/src/linux
    make dir/file.ko
示例:只为e1000编译驱动:
    make drivers/net/ethernet/intel/e1000/e1000.ko



示例
?tar xf linux-3.10.67.tar.xz -C /usr/src
?cd /usr/src
?ln -sv linux-3.10.67 linux
?cd /usr/src/linux
?cp /boot/config-$(uname -r) ./.config
?make help
?make menuconfig
?make -j 2
?make modules_install
?make install
?reboot 


busybox 编译

centos 6 没有编译成功 centos7 成功,可以在6 中使用

编译安装busybox
环境
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel libmcrypt-devel glibc-static ncurses-devel

下载源代码

wget https://busybox.net/downloads/busybox-1.30.0.tar.bz2

make menuconfig
按下面选择,把busybox编译也静态二进制、不用共享库
Busybox Settings -->Build Options -->[*] Build BusyBox as a static binary (no shared libs)

make && make install 如果出错,执行make clean后,重新执行上面命令
mkdir /mnt/sysroot/
cp -a _install/* /mnt/sysroot/

_install 目录文件中存放有软连接

面试

查看加载模块
lsmod          modinfo      modprobe 

开机启动文件 /etc/rc.d/

引导加载程序   LILO  GRUB

开机启动流程

查看BIOS版本   biosdecode
查看服务器型号: dmidecode | grep 'Product Name' 
查看主板的序列号: dmidecode |grep 'Serial Number'
ethtool  -i    eth0

内核参数处理
sysctl -a 显示当前所有可用的内核参数
sysctl kernel.hostname 读特定的内核参数,比如kernel.hostname
sysctl -w kernel.hostname=abc 把hostname改为abc


linux 系统运行级别

0: 系统停机(关机)模式,系统默认运行级别不能设置为0,否则不能正常启动,一开机就自动关机。
1:单用户模式,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登录。
2:多用户模式,没有NFS网络支持。
3:完整的多用户文本模式,有NFS,登陆后进入控制台命令行模式。
4:系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
5:图形化模式,登陆后进入图形GUI模式或GNOME、KDE图形化界面,如X Window系统。
6:重启模式,默认运行级别不能设为6,否则不能正常启动,就会一直开机重启开机重启。


/etc/rc.d/rc.local   写入此文件的命令登陆前自动执行

系统关机及重启
shutdown    -h    10 自动关机 
                   -r    10  自动重启



centos  6  设置grub密码
vim   /boot/grub.conf  
default=0
timeout=8
password  centos  
........

###############
破坏的文件是需要命令进行恢复,即切根后可以执行完整的命令
如果没有命令,需要从光盘进行安装软件

#######
1,破坏stage-1    :mbr破坏掉
切换跟使用grub-install      /dev/sda  

2,删除vmlinuz和initramfs文件后无法启动
切跟后
mkinitrd /boot/initramfs-`uname -r`.img `uname -r `
cp /mnt/cdrom/isolinux/vmlinuz /boot/vmlinuz-`uname -r`
sync
sync     
或 

rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-696.e16.x86_64.rpm --root=/mnt/sysimage/    --force



centos 7 编译安装的服务配置service 服务脚本

linux-系统启动流程-7

标签:兼容   实验   rap   for   wap   自制   shared   目录   救援模式   

原文地址:https://www.cnblogs.com/g2thend/p/11621103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!