Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

Linux系统启动流程、内核及模块管理

Linux系统的组成部分组成:内核+根文件系统(kernel+rootfs)
内核(kernel): 进程管理(创建、调度、销毁等)、内存管理、网络管理(网络协议栈)、驱动程序、文件系统、安全功能
IPC:Inter Process Communication机制
本地进程间通信机制:消息队列、semerphor、shm(共享内存)
跨主机进程间通信机制:socket等
运行中的系统环境可分为两层:内核空间、用户空间
内核空间(模式):内核代码(特权级操作–>系统调用)
用户空间(模式):应用程序(进程或线程)

rootfs:程序和glibc
库:函数集合, function, 调用接口(头文件负责描述)
过程调用: procedure,无返回值
函数调用: function
程序:二进制执行文件

内核设计流派:
单内核(monolithic kernel):把所有功能集成于同一个程序
例如:Linux
微内核(micro kernel):每种功能使用一个单独子系统实现
例如:Windows, Solaris

Linux内核特点:
1、支持模块化: .ko(kernel object 内核对象)如:文件系统,硬件驱动,网络协议等
2、支持内核模块的动态装载和卸载

内核组成部分:
核心文件: /boot/vmlinuz-VERSION-release(本地版本号)
ramdisk(基于内存的磁盘设备(将内存当磁盘用)):辅助的伪根系统
CentOS 5: /boot/initrd-VERSION-release.img
基于ramdisk磁盘
CentOS6,7: /boot/initramfs-VERSION-release.img
基于ramddisk文件系统
img:磁盘镜像文件
模块文件:/lib/modules/VERSION-release
例如:/lib/modules/3.10.0-327.el7.x86_64/

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

CentOS系统启动流程:
POST: Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、 串并行接口、键盘、 CD-ROM光驱等硬件情况的检测。
ROM: BIOS, Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、 开机加电自检程序和系统启动自举程序等。
RAM: CMOS互补金属氧化物半导体,保存各项参数的设定
Boot Sequence:按次序查找引导设备,第一个有引导程序的设备为本次启动设备
bootloader: 引导加载器,引导程序
windows: ntloader,仅是启动OS
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
LILO: LInux LOader
GRUB: GRand Unified Bootloader
GRUB 0.X: GRUB Legacy
GRUB 1.X:GRUB2

功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本;把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核;

MBR:Master Boot Record (512bytes)
446bytes: bootloader(引导加载程序)
64bytes:fat 分区表(文件系统分配表)
2bytes: 55AA(魔数)非55AA为无效
GRUB:
primary boot loader : 1st stage, 1.5 stage
secondary boot loader : 2nd stage,分区文件

kernel:自身初始化
1、探测可识别到的所有硬件设备
2、加载硬件驱动程序(可能借助于ramdisk加载驱动)
3、以只读方式挂载根文件系统
4、运行用户空间的第一个应用程序:/sbin/init

init程序的类型:
CentOS 5之前:SysV init,
配置文件: /etc/inittab
CentOS 6:Upstart init
配置文件: /etc/inittab(基本没用了),
/etc/init/*.conf–>决定系统运行级别
CentOS 7:Systemd systemd
配置文件: /usr/lib/systemd/system/
/etc/systemd/system/

ramdisk:
linux内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
ramdisk –> ramfs 提高速度
CentOS 5: initrd, 工具程序: mkinitrd
CentOS 6: initramfs, 工具程序: mkinitrd, dracut
系统初始化流程(内核级别):
POST –> BootSequence (BIOS) –>Bootloader(MBR) –> kernel(ramdisk) –> rootfs(只读) –> init(systemd)

/sbin/init CentOS6之前
运行级别:为系统运行或维护等目的而设定; 0-6: 7个级别
0:关机(shutdown)
1:单用户模式(无须认证,root自动登录),(single user), 维护模式
2: 多用户模式(multi user),启动网络功能,但不会启动NFS(网络文件系统);维护模式
3:多用户模式(multi user),正常完全功能模式;文本界面
4:预留级别;目前无特别使用目的,但可同3级别
5:多用户模式(multi user),正常完全功能模式;图形界面
6:重启
默认级别: 3, 5
切换级别: init #
查看级别: runlevel ; who -r
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
runlevel
第一位:前一个级别
第二位:后一个级别

init初始化

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

CentOS 5的inittab文件
配置文件: /etc/inittab
每一行定义一种action以及与之对应的process

[root@station1 ~]# vim /etc/inittab 
#
# inittab   This file describes how the INIT process should set up
#   the system in a certain run-level.
#
# Author:   Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#   Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:5:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon

格式:
id:runlevel :action :process
字段含义:
id:一个任务的标识符
runlevel:在那些级别启动此任务;#,###,也可以为空,表示所有级别;
action:在什么条件下启动此任务;
process:任务;
action类型:
wait: 等待切换至此任务所在的级别时运行一次
respawn:此process终止时,就自动重新启动之
initdefault:设定默认运行级别;此时process省略(0,6不可以)
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本;

例如:
设置系统默认运行级别
id:3 : initdefault:
设置系统初始化
si:: sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0

l6:6:wait:/etc/rc.d/rc 6
/etc/rc.d/rc脚本:接受一个运行级别数字为参数
说明: rc N –> 意味着读取/etc/rc.d/rcN.d/
K:要停止的服务;
K##
:##运行次序优先级;数字越小,越先关闭对应服务,关闭服务通常为依赖到别的服务的服务先关闭,后关闭被依赖的服务
S:要启动的服务;
S##
: ##运行次优先级序;数字越小,越先运行对应服务,运行服务通常为被依赖到的服务先运行,依赖到别的服务的服务后运行
脚本框架:
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

示例:手动编写服务脚本框架

[root@CentOS6 ~]# vim /etc/init.d/testsrv
#/bin/bash
#testsrv  service testing script
#
#chkconfig: 2345 50 60
#description:testing service
#
prog=$(basename $0)
if [ $# -lt 1 ];then
echo "Usage:$prog {start|stop|status|restart}"
exit 1
fi
if [ "$1" == "start" ];then
  echo "start $prog finished."
elif [ "$1" == "stop" ];then
  echo "Stop $prog finished."
elif [ "$1" == "restart" ];then
  echo "Restart $prog finished."
elif [ "$1" == "status" ];then
  if pidof $prog &> /dev/null;then
 echo "$prog is running."
  else
 echo "$prog is stopped."
  fi
else
 echo "Usage:$prog {start|stop|status|restart}"
 exit 2
fi

其中
#chkconfig: 2345 50 60
存在此行chkconfig命令才能管理此服务脚本,并且第一组数字:2345为对应运行级别下运行此脚本服务;第二组数字50为开启运行服务脚本的优先级;第三组数字60为关闭停止服务脚本的优先级;
#description:testing service
注释解释必须存在

注意:以上两行必须存在;

chkconfig命令

chkconfig命令管控/etc/init.d/每个服务脚本在各个级别下的启动或关闭状态
查看服务在所有级别的启动或关闭设定情形:
chkconfig [–list] [name]
示例:

[root@CentOS6 ~]# chkconfig --list httpd
httpd      0:off    1:off    2:off    3:off    4:off    5:off    6:off

添加:
SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
chkconfig –add name
能被添加的服务的脚本定义格式之一
#!/bin/bash
# chkconfig: LLLL NN NN
注意:LLLL 表示初始在哪个级别下启动, -表示都不启动 前NN表示启动优先级;后NN表示关闭优先级
#description:

删除:
chkconfig –del name

修改指定的链接类型
chkconfig [–level LEVELS] name
–level LEVELS: 指定要设置的级别;省略时表示2345

注意:正常级别下,最后启动的一个服务s99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。

xinetd管理的服务
service 命令:手动管理服务
service 服务 start|stop|restart|status

显示所服务的状态
service –status-all
瞬态( Transient)服务被xinetd进程所管理
进入的请求首先被xinetd代理
配置文件: /etc/xinetd.conf、 /etc/xinetd.d/
控制/etc/init.d目录下的脚本文件
与libwrap.so文件链接
用chkconfig控制的服务:
例如:chkconfig tftp on

1:2345:respawn:/sbin/mingetty tty1

6:2345:respawn:/sbin/mingetty tty6
这里是定义了6个虚拟终端

  1. mingetty会调用login程序;
  2. 打开虚拟终端的程序除了mingetty之外,还有诸如getty等;

ntsysv命令

ntsysv命令提供了一个基于文本界面的菜单操作方式,集中管理系统不同的运行等级下的系统服务启动状态。在RedHat各个发行版,CentOS各个版本,都自带这个工具。它具有互动式操作界面,您可以轻易地利用方向键和空格键等,开启,关闭操作系统在每个执行等级中,所要执行的系统服务
语法:
ntsysv [–back][–level <等级代号>]
参数:
–back  在互动式界面里,显示Back钮,而非Cancel钮。
–level <等级代号>  在指定的执行等级中,决定要开启或关闭哪些系统服务。

实例
输入ntsysv命令后,出现一个交互式的管理菜单,如下:
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
使用空格键选择或者取消选项!

系统初始化脚本:/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) 清理操作

总结(用户空间的启动流程):/sbin/init(/etc/inittab)
设置默认运行级别–>运行系统初始化脚本,完成系统初始化–>关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务–>设置登陆终端[–>启动图形终端]

CentOS 6 /etc/inittab和相关文件
init程序为upstart风格,但依然为/sbin/init
其配置文件:/etc/init/.conf,/etc/inittab(仅用于定义默认运行级别)
注意:
.conf为upstart风格的配置文件;
其中/etc/inittab仅包含一下内容
设置系统默认的运行级别
id:3:initdefault:

之后执行以下配置文件
/etc/init/rcS.conf
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf

总结:
CentOS6启动流程
POST–>Boot Sequence(BIOS)–>Boot Loader(MBR)–>Kernel(ramdisk)–>rootfs–>switchroot–>/sbin/init–>(/etc/inittab,/etc/init/*.conf)–>设置默认运行级别–>运行系统初始化脚本,完成系统初始化–>关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务–>设置登陆终端[–>启动图形终端]

CentOS7
init程序:systemd,配置文件:/usr/lib/systemd/system/,/etc/systemd/system/
注意:systemd没有级别概念
完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl命令来控制服务;
#systemctl {start|stop|restart|status} name[.service]

grub legacy

grub: GRand Unified Bootloader
grub 0.97: grub legacy
grub 2.x: grub2

stage1: mbr
stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
stage2:磁盘分区(/boot/grub/)

配置文件: /boot/grub/grub.conf <– /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区
功用:
(1) 提供启动菜单、并提供交互式接口
a:内核参数
e: 编辑模式,用于编辑菜单
c: 命令模式,交互式接口
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
(2)
加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏启动菜单
(3)
为菜单提供了保护机制
为编辑启动菜单进行认证
为启用内核或操作系统进行认证

识别硬盘设备:
(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
(hd0,0) 第一块硬盘,第一个分区

grub的命令行接口
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可添加许多内核支持使用的cmdline参数
例如:init=/PATH/TO/init,selinux=0
initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk
注意:initrd的版本号必须和内核完全匹配
boot:引导启动选定的内核
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

手动在grub命令行接口启动系统:
c: 命令模式,交互式接口
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot

例如: max_loop=100 selinux=0 init=/path/to/init
initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk
boot: 引导启动选定的内核
cat /proc/cmdline 内核参数
内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

grub legacy配置文件
配置文件: /boot/grub/grub.conf
default=#: 设定默认启动的菜单项;落单项(title)编号从0开始
timeout=#:指定菜单项等待选项选择的时长
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:菜单背景图片文件路径
hiddenmenu:隐藏菜单
password [–md5] STRING: 启动菜单编辑认证
title TITLE:定义菜单项“标题” , 可出现多次
root (hd#,#): grub查找stage2及kernel文件所在设备分区;为grub“根”
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件
password [–md5] STRING: 启动选定的内核或操作系统时进行认证
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

grub加密
grub-md5-crypt命令
破解root口令:
启动系统时,设置其运行级别1
进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
(2) 在选定的kernel后附加1, s, S或single都可以;
(3) 在kernel所在行,键入“ b”命令

grub安装
安装grub:
(1) grub-install
安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 ROOT/boot目录下
grub-install –root-directory=ROOT /dev/DISK
例如:
当/dev/sdb1挂载到/mnt/boot的情况下安装grub
grub-install –root-directory=/mnt /dev/sdb

(2) grub(注意:hd#,#必须存在grub目录及其文件)
grub > root (hd#,#)
grub > setup (hd#)

自制linux系统
分区并创建文件系统
fdisk /dev/sdb
分两个必要的分区
/dev/sdb1对应/boot /dev/sdb2对应根 /
mkfs.ext4 /dev/sdb1
挂载boot
mkdir /mnt/boot
mount /dev/sdb1 /mnt/boot
安装grub
grub-install –root-directory=/mnt /dev/sdb

恢复内核和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.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
chroot /mnt/sysroot

创建一级目录
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}
复制bash和相关库文件
复制相关命令及相关库文件
如: ls,cat, vim,reboot,hostname等

救援环境
在根文件系统无法使用时需要,如/bin/mount删除
对系统没有特殊要求
从光盘引导( boot.iso或者安装光盘#1)
从USB盘(由boot.iso制作)引导
文件系统重组
Anaconda将会询问是否应该挂载文件系统
/mnt/sysimage/*
/mnt/stage2
$PATH包括硬盘的目录
文件系统节点
提供系统特定的设备文件
mknod了解major/minor #’s

系统配置文件丢失修复
系统在引导期间,很重要的一个过程就是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
退出chroot模式:
# exit
挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在
/mnt/source目录下):
# mount /dev/sr0 /mnt/source
CentOS6系统的RPM包存放在光盘Package目录下,要修复的
硬盘系统的根目录在/mnt/sysimage下,需要使用–root选项
指定其位置。覆盖安装/etc/inittab文件所在的RPM包:
# rpm -ivh –replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
其中的rpm命令选项“ –replacepkgs”表示覆盖安装,执行完成
后,即已经恢复了此文件
如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进
入救援模式后,执行命令:
# rpm2cpio /mnt/source/Packages/initscripts-9.03.49-
1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittab
# cp etc/inittab /mnt/sysimage/etc
注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到
当前目录下,且恢复的文件名称所在路径要写完整的路径。提取
文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相
应位置即可

内核编译

单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。
内核组成部分:
1)、kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE;
2)、kernel object: 内核对象,即内核模块,一般放置于/lib/modules/VERSION-RELEASE/
注意:内核模块与内核核心版本一定要严格匹配;
编译内核模块时按一下方式定义

注意:有些功能要不编译进内核,要不不编译
3)、辅助性文件,并非必须,这取决于内核是否能直接驱动roofs所在的设备;
ramdisk:是一个简装版的根文件系统系统;
initrd
initramfs
目标设备驱动,例如SCSI设备的驱动;
逻辑设备驱动,例如LVM设备的驱动;
文件系统,例如xfs文件系统

内核版本
运行中的内核:
uname命令:
uname – print system information
uname [OPTION]…
-n: 显示主机名称;
-r: 显示VERSION-RELEASE;
-a: 显示所有信息
-v:显示编译版本

[root@station1 ~]# uname -n
station1.example.com
[root@station1 ~]# hostname
station1.example.com
[root@station1 ~]# uname -r
2.6.18-164.el5
[root@station1 ~]# uname -v
#1 SMP Tue Aug 18 15:51:54 EDT 2009
[root@station1 ~]# uname -a
Linux station1.example.com 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux

内核模块命令
lsmod命令:
显示由核心已经装载的内核模块
显示的内容来自于: /proc/modules文件
modinfo命令:
显示模块的详细描述信息
modinfo [ -k kernel ] [ modulename|filename… ]
-n: 只显示模块文件路径
-p: 显示模块参数
-a: author
-d: description
-l: license
-k: 显示指定的内核版本模块
-F: 只显示指定字段(filename、depengds)的信息

[root@station1 ~]# modinfo ext4
filename:   /lib/modules/2.6.18-164.el5/kernel/fs/ext4/ext4.ko
license:GPL
description:Fourth Extended Filesystem
author: Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
alias:  ext4dev
srcversion: 5F3DBC78955B31FC1E07EB1
depends:jbd2,crc16
vermagic:   2.6.18-164.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
module_sig:    883f3504a8b7a0d18758d6145e112de9009c98197d6c75e9511e0f4cdd64f9c1cefe6d41e6209f5e596869bc565ba9a6edbb27a294e906936c4a
[root@station1 ~]# modinfo -F alias ext4
ext4dev
[root@station1 ~]# modinfo -n ext4
/lib/modules/2.6.18-164.el5/kernel/fs/ext4/ext4.ko

lsmod |grep xfs ; modinfo xfs

内核模块管理
modprobe命令:
语法:
modprobe [ -C config-file ] [ modulename ] [ module
parame-ters… ]
配置文件: /etc/modprobe.conf,/etc/modprobe.d/*.conf
内核模块动态装载或卸载
modprobe [ -r ] modulename…
注意:对正在使用的模块不要轻易卸载
此命令自动解决依赖关系

depmod命令:
内核模块依赖关系文件及系统信息映射文件的生成工具
装载或卸载内核模块:

insmod命令
指定模块文件(绝对路径),不自动解决依赖模块
insmod [ filename ] [ module options… ]
insmod modinfo –n exportfs
lnsmod modinfo –n xfs

rmmod命令
rmmod [ modulename ]
rmmod xfs
rmmod exportfs

ramdisk管理
ramdisk文件的制作:
(1) mkinitrd命令
为当前正在使用的内核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
–with=:除了默认的模块之外需啊哟装载至initramfs
–preload=:initramfs所提供的模块需要预先装载的模块;
(2) dracut命令
为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)

内核信息输出的伪文件系统:/proc、/sys
/proc目录
内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出;同时,还提供一个配置接口,proc/sys;
参数:
只读:输出信息;例如/proc/#/
可写:可接受用户指定“新值”来实现对内核某功能或特性的配置:/proc/sys/(仅管理员有写权限)
查看:
cat /proc/sys/PATH/TO/SOME_KERNEL_FLIE
修改设定/proc/sys目录下的
(1) sysctl命令用于查看或设定此目录中诸多参数
*sysctl -w PATH.TO.SOME_KERNEL_FLIE=VALUE

例如:
sysctl -w kernel.hostname=mail.magedu.com
示例:

[root@localhost ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

(2) echo命令通过重定向方式也可以修改大多数参数的值
echo “VALUE” > /proc/sys/PATH/TO/SOME_KERNEL_FLIE
例如:
echo “websrv” > /proc/sys/kernel/hostname

注意:上述两种方式的设定仅当前运行内核有效;
配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf
并使用
sysctl -p [/path/to/conf_file]
重新加载内核参数设置即可永久有效

sysctl命令
sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。
语法
sysctl [options] [variable[=value]] […]
sysctl -p [file or regexp] […]
选项
-n:打印值时不打印关键字;
-e:忽略未知关键字错误;
-N:仅打印名称;
-w:当改变sysctl设置时使用此项;
-p:从配置文件“/etc/sysctl.conf”加载内核参数设置;
-a:打印当前所有可用的内核参数变量和值;
-A:以表格方式打印当前所有可用的内核参数变量和值。
参数
变量=值:设置内核参数对应的变量值
注意:可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。sysctl.conf看起来很像rc.conf。它用variable=value的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。 sysctl变量的设置通常是字符串、数字或者布尔型。(布尔型用 1 来表示’yes’,用 0 来表示’no’)。
默认配置文件: /etc/sysctl.conf
(1) 设置某参数
sysctl -w parameter=VALUE
(2) 通过读取配置文件设置参数
sysctl -p [/path/to/conf_file]
内核中的路由转发:
/proc/sys/net/ipv4/ip_forward
常用的几个参数:
net.ipv4.ip_forward:核心转发功能
net.ipv4.icmp_echo_ignore_all:忽略所有ping本机操作
vm.drop_caches:手动回收内存功能(值为:0、1、2)
kernel.hostname:当前生效的主机名
示例:

[root@localhost ~]# sysctl -a
abi.vsyscall32 = 1
crypto.fips_enabled = 0
debug.exception-trace = 1
debug.kprobes-optimization = 1
dev.cdrom.autoclose = 1
dev.cdrom.autoeject = 0
dev.cdrom.check_media = 0
dev.cdrom.debug = 0
...
[root@localhost ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
1

注意:sysctl命令处理的是/proc/sys目录下配置文件值,因此/proc/sys目录下的 net/ipv4/ip_forward相当于net.ipv4.ip_forward

/sys目录
sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性。
udev通过读取/sys此路径下的硬件设备信息(输出的信息动态)为各硬件设备创建文件
udev是运行在用户空间的程序
专用工具: udevadmin, hotplug
udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d/及/usr/lib/udev/rules.d/目录下

编译内核

程序包的编译安装:
./configure:检查编译环境的依赖关系,并设定编译参数
make:执行编译过程(调用工具不是编译工具)
make install:安装

编译内核前提:
(1) 准备好开发环境(开发工具编译器、开发编译库)头文件:/usr/include
(2) 获取目标主机上硬件设备的相关信息
(3) 获取目标主机系统功能的相关信息,例如要启用的文件系统
例如:需要启用相应的文件系统
(4) 获取内核源代码包:www.kernel.org

开发环境准备
包组(CentOS 6):
Server Platform Development(服务器平台开发)
Development Tools(开发工具)
注意:还要有ncurses.x86_64包
yum groupinstall Server Platform Development
yum groupinstall Development Tools
yum -y install ncurses…
目标主机硬件设备相关信息
CPU:
#cat /proc/cpuinfo
#lscpu
主要查看信息为vendor_id、model name
#x86info -a
PCI设备:
lspci
-v
-vv
lsusb
-v
-vv
lsblk 块设备
了解全部硬件设备信息
hal-device

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

编译安装内核实例
1、解压缩内核源码包到/usr/src目录
tar xf linux-4.4.21.tar.xz -C /usr/src
cd /usr/src(跳转到/usr/src目录下)
2、生成linux-4.4.21的符号链接linux
ln -sv linux-linux-4.4.21 linux(注意:编译内核时和涉及到驱动问题,而驱动查找文件时默认查找/usr/src/linux,所有做链接处理,即标准化又可以支持回滚)
cd /usr/src/linux(运行make命令需要此目录为当前目录)
3、复制当前内核配置模板文件
cp /boot/config-$(uname -r) ./.config
注意:在红帽发行版中存在/boot/config-uanme -r文件,而有些发行版存在/proc/config.gz文件,这些文件为当前使用内核配置文件的模板文件
make help(查看make帮助文档主要是挑选相应的命令工具)

为了保证编译安装过程中(比如远程连接中断而导致编译安装失败)稳定,可以使用screen命令开启屏幕会话的方式运行一下命令

screen命令
打开screen:~]#screen
拆除screen:Ctrl+a,d
列出screen:~]#screen -ls
连接至screen:~]#screen -r SCREEN_ID
关闭screen(在screen内部):~]#exit

4、配置编译内核自定义的选项
方法一:
make menuconfig(打开文本菜点界面需要ncurses包以及ncurses-devel包支持,同时显示空间有一定要求注意最大化显示框体就好
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
注意:*号代表编译进内核;M代表编辑成模块;[]代表不编译
也可以使用
方法二:(图像化界面需要系统安装图形界面并且安装桌面平台开发包租Desktop Platform Development)
GONE桌面配合GKT开发环境使用make gconfig
KDE桌面配合QT开发环境使用make xconfig

5、编译(-j #表示启动多个线程编译)默认一个
make -j 2
6、安装内核模块
make modules_install
7、安装内核核心(自动生成grub选项)
make install
8、重启选择新内核
reboot

示例:

[root@CentOS6 ~]# tar -xf linux-4.4.21.tar.xz -C /usr/src/
[root@CentOS6 ~]# cd /usr/src/
[root@CentOS6 src]# ls
debug  kernels  linux-4.4.21
[root@CentOS6 src]# ln -sv linux-4.4.21 linux
`linux' -> `linux-4.4.21'
[root@CentOS6 src]# ls
debug  kernels  linux  linux-4.4.21
[root@CentOS6 src]# cd /usr/src/linux
[root@CentOS6 linux]# cp /boot/config-2.6.32-642.el6.x86_64  ./.config 
cp: overwrite `./.config'? Y
[root@CentOS6 linux]# make menuconfig  
[root@CentOS6 linux]# make
...(等吧!)
[root@CentOS6 linux]# make modules_install
...(继续等吧!)
[root@CentOS6 linux]# make install
...
[root@CentOS6 linux]# reboot

Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
以上操作请注意工作目录
详细说明
编译内核
(1) 配置内核选项
支持“更新”模式进行配置: make help
(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
(b) make menuconfig:基于curses的文本窗口界面
(c) make gconfig:基于GTK (GNOME)环境窗口界面
(d) make xconfig:基于QT(KDE)环境的窗口界面
支持“全新配置”模式进行配置
(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置
(b) make allyesconfig: 所有选项均回答为“yes“
(c) make allnoconfig: 所有选项均回答为”no“
(2) 编译
全编译:make [-j #]多少线程进行编译
编译内核的一部分功能:
(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
(c)如何交叉编译内核:
编译的目标平台与当前平台不相同;
# make ARCH=arch_name
要获取特定目标平台的使用帮助
# make ARCH=arch_name help
# make ARCH=arm help

(3)在已经执行过编译操作的内核源码树做重新编译:
需要事先清理操作:
# make clean:清理大多数编译生成的文件,但会保留config文件等
# make mrproper: 清理所有编译生成的文件、config及某些备份文件;
# make distclean:相当于mrproper,额外清理各种patches以及编辑器备份文件;

卸载内核

首先我们需要查看一下当前使用的是哪个内核:
uname -r
该命令会告诉你当前使用的内核版本,在登录时候,不能卸载当前的内核,以免造成无法启动的悲剧~~
接下来,如果你是自己动手编译的内核的话,请删除以下文件和文件夹
一、卸载自己编译的内核:

  1. 删除掉/lib/modules/目录下过时的内核库文件
  2. 删除掉/usr/src/kernels/目录下过时的内核源代码
  3. 删除掉/boot目录下启动的核心档案以及内核映像
  4. 更改/boot/grub/menu.lst,删除掉不用的启动列表
    KERNEL-VERSION代表你想卸载的内核的版本号

    二、卸载发行版自带的内核。

1、查找内核文件 :dpkg –get-selections|grep linux 。带有image的就是内核文件。
如:linux-image-3.16-amd64 install
2、卸载:sudo apt-get remove linux-image-(接内核版本)

最后必须更新grub :update-grub

练习:
1、破解root口令,并为grub设置保护功能
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

生成加密密码

[root@CentOS6 ~]# grub-md5-crypt
Password: 
Retype password: 
$1$YS0sz$S214NTNpQKGanvodNDegK/

或者

[root@CentOS6 ~]# openssl passwd -1 -salt "YS0sz"
Password: 
$1$YS0sz$S214NTNpQKGanvodNDegK/

注意:此命令可以自定义“盐”
重启后
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
注意:启动对应内核密码可以选择c(grub命令行模式)
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
绕开菜单内核启动项,而自己设定一个启动
但是设置内核参数的密码绕不开,只能用救援模式删掉上面加密行才可

2、编写centos5,6的服务脚本
#!/bin/bash
#chkconfig:35 88 22
#description:test service
chkconfig –add testsrv
chkconfig –list testsrv
chkconfig –del testsrv

[root@CentOS6 rc.d]# vim /etc/rc.d/init.d/testsrv

#!/bin/bash
#chkconfig:35 80 20
#description:test service
case $1 in
start)
  echo testsrv starting
;;
stop)
  echo testsrv stop
;;
status)
  echo testsrv status
;;
*)
  echo "testsrv start|stop|status"
;;
esac
[root@CentOS6 rc.d]# cd ./init.d
[root@CentOS6 init.d]# chkconfig --add testsrv
[root@CentOS6 init.d]# chkconfig --list testsrv
testsrv    0:off    1:off    2:off    3:on    4:off    5:on    6:off
[root@CentOS6 init.d]# ll /etc/rc.d/rc*.d/*testsrv*
lrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc0.d/K20testsrv -> ../init.d/testsrv
lrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc1.d/K20testsrv -> ../init.d/testsrv
lrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc2.d/K20testsrv -> ../init.d/testsrv
lrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc3.d/S80testsrv -> ../init.d/testsrv
lrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc4.d/K20testsrv -> ../init.d/testsrv
lrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc5.d/S80testsrv -> ../init.d/testsrv
lrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc6.d/K20testsrv -> ../init.d/testsrv

删除服务

[root@CentOS6 init.d]# chkconfig --del testsrv  
[root@CentOS6 init.d]# ll /etc/rc.d/rc*.d/*testsrv*
ls: cannot access /etc/rc.d/rc*.d/*testsrv*: No such file or directory

或者
[root@CentOS6 init.d]# ntsysv –level=3 #去掉testsrv前的*号

3、破坏本机grub stage1,而后在救援模式下修复之
模拟损坏:dd if=/dev/zero of=/dev/sda bs=1 count=446
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
重启自动修复
方法二:
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
4、破坏本机grub stage1_5,而后在救援模式下修复之
模拟损坏:dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
方法二:
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
注意:方法二修复需要依赖/boot/grub目录下的stage相关文件,如果这些文件有问题则修复无效,所以建议用grub-install修复,若损坏后没重启机器可以直接运行相关命令修复,而不用救援模式
如果grub目录不存在的情况下,grub-install修复,但是需要手动编辑grub.conf(修复之后再输入一次),完全重启重新编辑grub.conf

5、破环本机initrm文件,而后在救援模式下修复之

  • 救援模式
  • chroot /mnt/sysimage
  • mkinitrd /boot/initramfs-uname -r.img uname -r
  • exit;exit;reboot
    Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
    Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
    Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
    Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

6、修复内核启动参数
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
然后按b启动
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

7、grub.conf文件丢失损坏
启动后在直接进入grub命令行模式(grub stage1 stage1_5完好的情况下)
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
b键启动等待修复并自动重启
再输入一遍上图操作,进入系统后重新建立如下grub.conf文件
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

5、删除vmlinuz和initramfs文件后无法启动,两种方法恢复之
方法一(有光盘进救援模式):
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
注意:新生成的vmlinuz、initramfs的文件名称要与grub.conf中的文件名一直!!!本人在生成initramfs文件时少一个“-”即:initramfs-uanme -r而失误打成initramfsuanme -r与grub文件中原initramfs行名称不符
重启等待修复完成
方法二(无光盘,利用网络模式或者其它介质如U盘的进入救援模式也可):
网络中要做好有网络引导启动的服务,ftp服务或http服务等(在之后的课程我们可以学到)此次为用光盘救援模式模拟
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
在本次试验中我的环境有dhcp服务所以无需手动配置ip,而没有则需要我们收到配置
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
完成后依然进入一路默认ok,进shell
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

6、增加新硬盘,在其上制作能单独运行kernel和bash的系统

7、(1)实验:删除/boot,恢复
rm -rf /boot
光盘启动,进入rescue模式
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm –root=/mnt/sysimage –replacepkgs|force
chroot /mnt/sysimage
grub-install /dev/sda
vim /boot/grub/grub.conf

8、分区情况下,删除/boot 和/etc/fstab,恢复之
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
rm -rf /boot /etc/fstab
光盘启动,进入rescue模式
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
检查/
blkid;fdisk -l
mkdir /mnt/sda2
mount /dev/sda2 /mnt/sda2
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
vi /mnt/sda2/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
reboot
光盘启动,进入rescue模式,挂载/mnt/sysimage
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
chroot /mnt/sysimage
rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm –replacepkgs|force
grub-install /dev/sda
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
vim /boot/grub/grub.conf
default=0
timeout=3
title wanglinux
root (hd0,0)
kernel /vmlinuz…. root=/dev/sda2
initrd /initramfs
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
重启系统等待修复,进入系统后重新编辑fstab

9、逻辑卷情况下,删除/boot 和/etc/fstab,恢复之
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
rm -rf /boot /etc/fstab
光盘启动,进入rescue模式
检查
lvscan
vgchange -ay
mount /dev/vg0/root /mnt/sysimage
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
vi /mnt/sysimage/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/vg0/root / ext4 defaults 1 2
/dev/vg0/usr /usr ext4 defaults 0 0
/dev/vg0/var /var ext4 defaults 0 0
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
reboot
光盘启动,进入rescue模式,挂载/mnt/sysimage
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
chroot /mnt/sysimage
rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm –replacepkgs|force
grub-install /dev/sda
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
vim /boot/grub/grub.conf
default=0
timeout=3
title CentOS6
root (hd0,0)
kernel /vmlinuz…. root=/dev/vg0/root
initrd /initramfs
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

10、自制Linux系统:
添加硬盘(虚拟机需要扫描)
echo ‘- – -‘ > /sys/class/scsi_host/host2/scan
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
1)、分区并创建文件系统
fdisk/dev/sdb
分两个必要的分区
/dev/sdb1对应/boot /dev/sdb2对应根/
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
2)、挂载boot
mkdir/mnt/boot
mount /dev/sdb1 /mnt/boot
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
3)、安装grub
grub-install –root-directory=/mnt/ dev/sdb

4)、建立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
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

5)、恢复内核和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

6)、创建一级目录
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}
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
7)、vim /mnt/sysroot/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
8)、复制bash和相关库文件
9)、复制相关命令及相关库文件
如:ls,cat,vim,reboot,hostname等

[root@CentOS6 sysroot]# vim /root/bin/copycmd.sh
#!/bin/bash
ch_root="/mnt/sysroot"
[ ! -d $ch_root ] && mkdir $ch_root

bincopy() {
if which $1 &>/dev/null; then

local cmd_path=`which --skip-alias $1`
local bin_dir=`dirname $cmd_path`
[ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}
[ -f ${ch_root}${cmd_path} ] || cp $cmd_path ${ch_root}${bin_dir}
return 0
else
echo "Command not found."
return 1
fi
}

libcopy() {
local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')
for loop in $lib_list;do
local lib_dir=`dirname $loop`
[ -d ${ch_root}${lib_dir} ] || mkdir -p  ${ch_root}${lib_dir}
[ -f ${ch_root}${loop} ] || cp $loop ${ch_root}${lib_dir}
done
}


read -p "Please input a command: " command

while [ "$command" != "quit" ];do
if bincopy $command ;then
libcopy $command
fi
read -p "Please input a command or quit: " command
done

Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux
关机,新建一个虚拟机并把刚才的新添加的磁盘文件拷到其目录下指定为自:我又失误了,内核参数不对,需要手动去掉/mnt/boot/;同时添加fstab当中的一个default少些一个字母,修改后即可进入系统,但是此系统只是一个流程如果需要正常使用需要使用手工编译安装需要的软件

11、在U盘上定制linux,使其可启动系统和swap分区
与10类似,只是一般需要FAT32格式U盘然后
新建虚拟机识别u盘直接重启即可
Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

12、编译安装kernel,启用支持ntfs文件系统功能
[root@CentOS6 ~]# tar -xf linux-4.4.21.tar.xz -C /usr/src/
[root@CentOS6 ~]# cd /usr/src/
[root@CentOS6 src]# ls
debug kernels linux-4.4.21
[root@CentOS6 src]# ln -sv linux-4.4.21 linux
linux' ->linux-4.4.21′
[root@CentOS6 src]# ls
debug kernels linux linux-4.4.21
[root@CentOS6 src]# cd /usr/src/linux
[root@CentOS6 linux]# cp /boot/config-2.6.32-642.el6.x86_64 ./.config
cp: overwrite `./.config’? Y
[root@CentOS6 linux]# make menuconfig
选择ntfs功能
[root@CentOS6 linux]# make

[root@CentOS6 linux]# make modules_install

[root@CentOS6 linux]# make install

[root@CentOS6 linux]# reboot

若/sbin/init损坏则修复方法
临时应急启动
进入启动菜单,a编辑内核参数kernel par后添加init=/sbin/bash以bash进程暂时代替init进程作为第一个启动的进程(可以进行操作,否者操作不了)
注意:以上操作是会涉及一些服务的selinux的变更所以需要
如:

[root@CentOS6 ~]# ll -Z /sbin/init
-rwxr-xr-x. root root system_u:object_r:admin_home_t:s0 /sbin/init
[root@CentOS6 ~]# chcon -t init_exec_t /sbin/init
[root@CentOS6 ~]# ll -Z /sbin/init
-rwxr-xr-x. root root system_u:object_r:init_exec_t:s0 /sbin/init

有光盘,则可以进入救援模式
分别安装对应版本的init程序包
CentOS5:SysVinit-2.86-15.el5
CentOS6:upstart-0.6.5-16.el6.x86_64
CentOS7:systemd-219-19.el7.x86_64

 

原创文章,作者:NameLess,如若转载,请注明出处:http://www.178linux.com/49705

(5)
NameLessNameLess
上一篇 2016-09-29
下一篇 2016-09-30

相关推荐

  • 基于rsync+inotify实现数据实时同步传输

    前言 与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,但随着文件数量的增大和实时同步的要求,rsync已不能满足需求,随之rsync+inotify便应运而生。本文将讲解rsync的基础知识和如何基于rsync+inotify实现数据实时同步传输。 rsync相关介…

    Linux干货 2015-04-27
  • 登峰需有造极之心

    年轻武僧与高僧间一小段对话 年轻武僧:大师,我怎么才能达到您这种层次…… 高僧:如果你没有像我那样的习练,我说什么你又怎能明白。     不管是就业形势、性格或者爱好,还是其他的种种因素。自己已经选择Linux系统运维这条路,就应该脚踏实地,刻苦练习。将Linux运维作为自己的事业不断地做的越来越好。  &n…

    Linux干货 2016-10-27
  • raid介绍

    raid介绍 在生产环境中,服务器所需的存储容量比较大,一般都会选择磁盘阵列来走存储。 阵列的优点 多个磁盘合成一个“阵列”来提供更好的性能、冗余,或者两者都提供 首先在I/O能力上,多个磁盘并行读写,可以提高读写的速度。 阵列所提供的磁盘冗余,提升存储设配的耐用性。 RAID实现的 外接式磁盘阵列:通过扩展卡提供适配能力 内接式RAID:主板集成RAID控…

    2017-06-24
  • ifconfig命令学习

    ifconfig命令 网络配置 ifconfig命令被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。 语法 ifconfig(参数) 参数 add<地址>:设置网络设备IPv6的ip地址; del&lt…

    Linux干货 2017-07-02
  • 从Linux小白到大牛——与狼共舞的日子5

    马哥教育网络班21期+第5周课程练习 1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行。 [root@localhost ~]# grep '^[[:space:]]\+' /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以…

    Linux干货 2016-08-31
  • N25-第六周

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#;      cp /etc/rc.d/rc.sysinit /tmp     &nbsp…

    Linux干货 2017-03-08