阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux基础教程之Linux系统高阶知识详探

124次阅读
没有评论

共计 26928 个字符,预计需要花费 68 分钟才能阅读完成。

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 系统高阶知识详探
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

l0Linux 基础教程之 Linux 系统高阶知识详探wait:/etc/rc.d/rc 0

l6Linux 基础教程之 Linux 系统高阶知识详探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

1Linux 基础教程之 Linux 系统高阶知识详探respawn:/sbin/mingetty tty1

6Linux 基础教程之 Linux 系统高阶知识详探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 系统高阶知识详探
使用空格键选择或者取消选项!

系统初始化脚本:/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 仅包含一下内容
设置系统默认的运行级别
idLinux 基础教程之 Linux 系统高阶知识详探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 系统高阶知识详探
(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 系统高阶知识详探

手动在 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 系统高阶知识详探

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 

1
modinfo –n exportfs

lnsmod 

1
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-

1
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 系统高阶知识详探
注意:* 号代表编译进内核;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 系统高阶知识详探
以上操作请注意工作目录
详细说明
编译内核
(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 系统高阶知识详探

生成加密密码

[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 系统高阶知识详探
注意:启动对应内核密码可以选择 c(grub 命令行模式)
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 系统高阶知识详探
4、破坏本机 grub stage1_5,而后在救援模式下修复之
模拟损坏:dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1
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-
    1
    uname -r

    .img 

    1
    uname -r
  • exit;exit;reboot
    Linux 基础教程之 Linux 系统高阶知识详探
    Linux 基础教程之 Linux 系统高阶知识详探
    Linux 基础教程之 Linux 系统高阶知识详探
    Linux 基础教程之 Linux 系统高阶知识详探

6、修复内核启动参数
Linux 基础教程之 Linux 系统高阶知识详探
Linux 基础教程之 Linux 系统高阶知识详探
Linux 基础教程之 Linux 系统高阶知识详探
Linux 基础教程之 Linux 系统高阶知识详探
Linux 基础教程之 Linux 系统高阶知识详探
Linux 基础教程之 Linux 系统高阶知识详探
然后按 b 启动
Linux 基础教程之 Linux 系统高阶知识详探

7、grub.conf 文件丢失损坏
启动后在直接进入 grub 命令行模式(grub stage1 stage1_5 完好的情况下)
Linux 基础教程之 Linux 系统高阶知识详探
b 键启动等待修复并自动重启
再输入一遍上图操作,进入系统后重新建立如下 grub.conf 文件
Linux 基础教程之 Linux 系统高阶知识详探

5、删除 vmlinuz 和 initramfs 文件后无法启动, 两种方法恢复之
方法一(有光盘进救援模式):
Linux 基础教程之 Linux 系统高阶知识详探
Linux 基础教程之 Linux 系统高阶知识详探
Linux 基础教程之 Linux 系统高阶知识详探
注意:新生成的 vmlinuz、initramfs 的文件名称要与 grub.conf 中的文件名一直!!!本人在生成 initramfs 文件时少一个“-”即:initramfs-

1
uanme -r

而失误打成 initramfs

1
uanme -r

与 grub 文件中原 initramfs 行名称不符
重启等待修复完成
方法二(无光盘,利用网络模式或者其它介质如 U 盘的进入救援模式也可):
网络中要做好有网络引导启动的服务,ftp 服务或 http 服务等(在之后的课程我们可以学到)此次为用光盘救援模式模拟
Linux 基础教程之 Linux 系统高阶知识详探
Linux 基础教程之 Linux 系统高阶知识详探
Linux 基础教程之 Linux 系统高阶知识详探
在本次试验中我的环境有 dhcp 服务所以无需手动配置 ip,而没有则需要我们收到配置
Linux 基础教程之 Linux 系统高阶知识详探
Linux 基础教程之 Linux 系统高阶知识详探
完成后依然进入一路默认 ok,进 shell
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 系统高阶知识详探
rm -rf /boot /etc/fstab
光盘启动,进入 rescue 模式
Linux 基础教程之 Linux 系统高阶知识详探
检查 /
blkid;fdisk -l
mkdir /mnt/sda2
mount /dev/sda2 /mnt/sda2
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 系统高阶知识详探
vim /boot/grub/grub.conf
default=0
timeout=3
title wangLinux
root (hd0,0)
kernel /vmlinuz…. root=/dev/sda2
initrd /initramfs
Linux 基础教程之 Linux 系统高阶知识详探
重启系统等待修复,进入系统后重新编辑 fstab

9、逻辑卷情况下,删除 /boot 和 /etc/fstab,恢复之
Linux 基础教程之 Linux 系统高阶知识详探
rm -rf /boot /etc/fstab
光盘启动,进入 rescue 模式
检查
lvscan
vgchange -ay
mount /dev/vg0/root /mnt/sysimage
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 系统高阶知识详探
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 系统高阶知识详探
vim /boot/grub/grub.conf
default=0
timeout=3
title CentOS6
root (hd0,0)
kernel /vmlinuz…. root=/dev/vg0/root
initrd /initramfs
Linux 基础教程之 Linux 系统高阶知识详探

10、自制 Linux 系统:
添加硬盘(虚拟机需要扫描)
echo‘- – -‘> /sys/class/scsi_host/host2/scan
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 系统高阶知识详探
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 系统高阶知识详探

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 系统高阶知识详探
7)、vim /mnt/sysroot/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
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 系统高阶知识详探
关机,新建一个虚拟机并把刚才的新添加的磁盘文件拷到其目录下指定为自:我又失误了,内核参数不对,需要手动去掉 /mnt/boot/; 同时添加 fstab 当中的一个 default 少些一个字母,修改后即可进入系统,但是此系统只是一个流程如果需要正常使用需要使用手工编译安装需要的软件

11、在 U 盘上定制 Linux,使其可启动系统和 swap 分区
与 10 类似,只是一般需要 FAT32 格式 U 盘然后
新建虚拟机识别 u 盘直接重启即可
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

1
Linux’ -&gt;

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

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-12-03发表,共计26928字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中