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, 根据它的指向可以找到系统要进入哪个模式
模式:
- ==> runlevel0.target, poweroff.target
- ==> runlevel1.target, rescue.target
- ==> runlevel2.target, multi-user.target
- ==> runlevel3.target, multi-user.target
- ==> runlevel4.target, multi-user.target
- ==> runlevel5.target, graphical.target
- ==> 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
- 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 Windows 系统.
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 服务脚本
来源: http://www.bubuko.com/infodetail-3224381.html