Linux组成
-
Linux:kernel+rootfs
- kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
-
rootfs:程序和glibc
-
库:函数集合,function,调用接口(头文件负责描述)
- 过程调用:procedure,无返回值;
- 函数调用:function;有返回值,可以赋值于变量中;
- 程序:二进制执行文件
-
库:函数集合,function,调用接口(头文件负责描述)
包括根目录以及包含/ boot,/ dev,/ etc,/ bin,/ sbin和some / tmp(用于临时文件)的最小的子目录和文件集。
-
内核设计流派
-
单内核(monoli kernel):Linux
把所有功能集成于同一个程序 -
微内核:(micro kernel):Windows,Solaris
每种功能使用一个单独的子系统实现
-
单内核(monoli kernel):Linux
-
Linux内核特点:
-
支持模块化:.ko(内核对象)
如:文件系统,硬件驱动,网络协议等 - 支持内核模块的动态装载和卸载
-
组成部分:
-
核心文件:/boot/vmlinuz-VERSION-release
-
ramdisk:辅助的临时根系统;并非是必须的;
CentOS 5: /boot/initrd-VERSION-release.img
CentOS 6,7: /boot/initramfs-VERSION-release.img
-
ramdisk:辅助的临时根系统;并非是必须的;
- 模块文件:/lib/modules/VERSION-release
-
核心文件:/boot/vmlinuz-VERSION-release
-
支持模块化:.ko(内核对象)
CentOS 5和6的启动流程
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;当时针对于的硬盘较小,故现在PC机上大多不适用,手机上使用较多;
-
GRUB: GRand Unified Bootloader
- GRUB 0.X: GRUB Legacy;
- GRUB 1.X:GRUB2;
bootloader代码量很小,为了简化;使得其无法驱动软设备,也就无法访问设备上的文件;
故内核文件不能放在逻辑卷上,只能放在基本的磁盘分区
-
-
MBR
512bytes-
446: bootloader;
64: 分区表;
2: 55AA;
查看二进制文件:hexdump -C /dev/sda -n 512
-
446: bootloader;
-
GRUB:
- stage 1:mbr
-
stage 1.5:mbr之后的扇区,
让stage 1中的bootloader能识别stage2所在的分区上的文件系统 -
stage 2:磁盘分区(/etc/grub/)
配置文件:/boot/grub/grub.conf <– /etc/grub.conf
-
kernel:
自身初始化:
- 探测可识别到的所有硬件设备;
- 加载硬件驱动程序(借助于ramdisk加载真正的根文件系统);
-
以只读方式挂载根文件系统(rootfs);
避免内核和操作系统有bug,故采用只读模式;
当完成挂载后根所在的设备的bin、sbin、boot…;就是/bin、/sbin、/boot… - 运行用户空间的第一个应用程序:/sbin/init
-
ramdisk:加载真正的根文件设备驱动程序
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱动- ramdisk –> ramfs 一种提速机制
-
CentOS 5: initrd
工具程序:mkinitrd
CentOS 6,7: initramfs
工具程序:mkinitrd, dracut -
ramdisk文件的制作:
-
mkinitrd命令;为当前正在使用的内核重新制作ramdisk文件
- –with=:除了默认的模块之外需要装载至initramfs中的模块;
- –preload=:initramfs所提供的的模块需要预先装载的模块;
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
-
dracut命令;为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
-
-
init程序的类型:运行的第一个应用程序
-
SysV: init, CentOS 5之前
配置文件:/etc/inittab -
Upstart: init,CentOS 6
配置文件:/etc/inittab;为了兼容centos5
/etc/init/*.conf -
Systemd:systemd, CentOS 7
配置文件:/usr/lib/systemd/system
/etc/systemd/system
-
系统初始化(内核级别):
- POST –> 读取BIOS中的BootSequence,确定引导加载设备–>读取此设备的Bootloader(MBR中) –> kernel(ramdisk) –> rootfs(只读) –> /sbin/init(systemd)
CentOS 5:SysV init
-
运行级别:为系统运行或维护等目的而设定;0-6:7个级别
0:关机;init 0;不能设置为默认级别
1:单用户模式(root自动登录), single, 维护模式
2: 多用户模式,启动网络功能,但不会启动NFS(网络文件系统);维护模式
3:多用户模式,完全功能模式;文本界面;
4:预留级别;目前无特别使用目的,可同3级别
5:多用户模式,完全功能模式;图形界面
6:重启;init 6;不能设置为默认级别-
默认级别: 3, 5
切换级别:init #
查看级别:runlevel ; who -r
-
默认级别: 3, 5
-
配置文件:/etc/inittab
每一行定义一种action以及与之对应的process
id : runlevel : action : process- id:一个任务的标识符
- runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别;
-
action:在什么条件下启动此任务
-
wait: 等待切换至此任务所在的级别时运行一次;
respawn:一旦此process终止,就重新启动之;
initdefault:设定默认运行级别;process省略
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit(centos 7 没有此脚本);
-
wait: 等待切换至此任务所在的级别时运行一次;
- process:任务
init启动流程
-
设定默认级别:/etc/inittab
id:3:initdefault:
-
设定系统初始化脚本:CentOS 5中是在/etc/inittab,CentOS 6中没有此信息,但脚本依旧在/etc/rc.d/rc.sysinit;
si::sysinit:/etc/rc.d/rc.sysinit
-
设置主机名;
[root@centos6 rc.d]# grep network /etc/rc.d/rc.sysinit if [ -f /etc/sysconfig/network ]; then . /etc/sysconfig/network # In theory there should be no more than one network interface active # Use the network address to set the hostname of the client. This if [ -x /usr/sbin/system-config-network-tui ]; then /usr/sbin/system-config-network-tui # Reread in network configuration data. if [ -f /etc/sysconfig/network ]; then . /etc/sysconfig/network if [ -x /usr/sbin/system-config-network-cmd ]; then /usr/sbin/system-config-network-cmd --profile ${arg##netprofile=} [root@centos6 rc.d]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=centos6.8
- 设置欢迎信息;
- 激活udev和selinux;
-
挂载/etc/fstab文件中定义的所有文件系统;
[root@centos6 rc.d]# grep /etc/fstab /etc/rc.d/rc.sysinit # First try to mount scratch storage from /etc/fstab, then any # First try to mount persistent data from /etc/fstab, then any restorecon $(awk '!/^#/ && $4 !~ /noauto/ && $2 ~ /^\// { print $2 }' /etc/fstab) >/dev/null 2>&1 action $"Enabling /etc/fstab swaps: " swapon -a -e
-
检测根文件系统,并以读写方式重新挂载根文件系统
[root@centos6 rc.d]# grep rw /etc/rc.d/rc.sysinit rw_mount_dev=$(blkid -t LABEL="$RW_LABEL" -l -o device) elif [ x$rw_mount_dev != x ] && mount $rw_mount_dev $mountopts "$RW_MOUNT" > /dev/null 2>&1; then for file in /etc/rwtab /etc/rwtab.d/* /dev/.initramfs/rwtab ; do mount -t nfs $CLIENTSTATE/$HOSTNAME $STATE_MOUNT -o rw,nolock if [ "$opt" = "rw" ]; then action $"Remounting root filesystem in read-write mode: " mount -n -o remount,rw / 其中:mount -n -o remount,rw
- 设置时钟;
- 根据/etc/sysctl.conf文件来设置内核参数;
-
激活lvm及软raid设备;
[root@centos6 rc.d]# grep change /etc/rc.d/rc.sysinit action $"Setting up Logical Volume Management:" /sbin/lvm vgchange -a ay --sysinit --ignoreskippedcluster
- 激活swap设备;
- 加载额外设备的驱动程序;
- 清理操作;
-
-
启动对应级别的服务:
在CentOS 5中的/etc/inittab文件中 l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 ... ... l6:6:wait:/etc/rc.d/rc 6 rc N -->意味着读取/etc/rc.d/rcN.d
-
/etc/rc.d/rcN.d/目录下的服务脚本控制服务(守护进程);
这些目录下的K*或S*是/etc/rc.d/init.d/下对应的脚本的链接;CentOS 5或6:都在/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
运行时:先执行K,再执行S; K*:要停止的服务; K##*:##运行次序;数字越小,越先关闭;数字越小的服务,通常为依赖别的服务的服务; S*:要启动的服务; S##*:##运行次序;数字越小,越先启动;数字越小的服务,通常为被依赖的服务
-
/etc/rc.d/init.d/*(/etc/init.d/*)服务脚本
-
/etc/rc.d/init.d/*(/etc/init.d/*)服务脚本编写
最好学习/etc/rc.d/init.d/*(/etc/init.d/*)系统脚本
示例:#!/bin/bash # #chkconfig:35 98 01 #description:test service case $1 in start) echo testsrv is stsrting touch /root/testsrv ;; stop) echo testsrv is stop rm -f /root/testsrv ;; status) [ -f /root/testsrv ] && echo testsrv is starting || echo testsrv is stoped ;; *) echo "testsrv usage:start|stop|status" esac
-
/etc/rc.d/init.d/*(/etc/init.d/*)服务脚本执行方式
/etc/init.d/SRV_SCRIPT{start|stop|restart|status} or service SRV_SCRIPT{start|stop|restart|status} [root@centos6 rc.d]# ll /etc/init.d /etc/rc.d/init.d -d lrwxrwxrwx. 1 root root 11 May 10 22:57 /etc/init.d -> rc.d/init.d drwxr-xr-x. 2 root root 4096 May 11 07:36 /etc/rc.d/init.d 直接运行/etc/init.d下的脚本 == service 例如:/etc/init.d/httpd status == service httpd status
-
/etc/rc.d/init.d/*(/etc/init.d/*)服务脚本的删除
chkconfig –del name
rm -rf name
chkconfig –list:查看是否删除
-
/etc/rc.d/init.d/*(/etc/init.d/*)服务脚本编写
-
chkconfig命令:管控/etc/rc.d/init.d(/etc/init.d/)每个服务脚本在各级别下的启动或关闭状态;
-
查看服务在所有级别的启动或关闭设定情形:
chkconfig [–list] [name] -
添加:
SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
chkconfig –add name-
能被添加的服务的脚本定义格式之一:
#!/bin/bash #LLLL 表示初始在哪个级别下启动,-表示都不启动 # chkconfig: LLLL nn nn # description:
-
能被添加的服务的脚本定义格式之二:
查看/etc/init.d/crond
-
能被添加的服务的脚本定义格式之一:
-
删除:
chkconfig –del name -
修改指定的链接类型
chkconfig [–level levels] name <on|off|reset>
–level LLLL: 指定要设置的级别;省略时默认为2345
仅下次开机时改变,目前不改变;
-
查看服务在所有级别的启动或关闭设定情形:
- ntsysv命令:图形界面管理服务
-
service命令:手动管理服务
- service 服务 start|stoprestart
- service –status-all 查看当前所有服务状态
-
瞬态(Transient)服务被xinetd进程所管理
-
进入的请求首先被xinetd代理
配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
与libwrap.so文件链接
用chkconfig控制的服务:chkconfig tftp on
-
进入的请求首先被xinetd代理
-
注意:
- 正常级别下,最后启动一个服务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在指定运行级别脚本后运行
- 可以根据情况,进行自定义修改
-
当某个服务无法启动,导致系统无法启动,进入单用户模式下进行修改模,进行修复;
但是,当单用户模式也无法启动时,进入菜单(a);- 可将启动模式修改:init=/bin/bash;进入命令行操作
- 因为当第一次挂载根文件系统时是只读模式,修改为读写模式;mount -o remount,rm /
- 进行修复
-
-
打印各启动终端:
tty1:2345:respawn:/usr/sbin/mingetty tty1 tty2:2345:respawn:/usr/sbin/mingetty tty2 ... tty6:2345:respawn:/usr/sbin/mingetty tty6
- mingetty会自动调用login程序
- 打开虚拟终端的程序除了mingetty之外,还有诸如getty等
-
如果默认级别是5级别的话会运行图形界面的启动:
x:5:respawn:/etc/X11/prefdm -nodaemon
启动流程(用户空间):/sbin/init(/etc/inittab)
- 设置默认运行级别 –> 运行系统初始化脚本,完成系统初始化 –> 关闭对应级别下需要关闭的服务,启动对应级别下需要启动服务 –> 设置登录终端 [–>启动图形终端]
启动流程(内核空间+用户空间):
- POST –> Boot Sequence(BIOS) –> Boot Loader –>Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init –>(/etc/inittab, /etc/init/*.conf) –> 设定默认运行级别 –> 系统初始化脚本rc.sysinit –> 关闭或启动对应级别的服务 –> 启动终端(先是启动字符终端;如果运行级别是5,则启动图形界面)
CentOS 6
-
init程序:upstart,但依然为/sbin/init,其配置文件:
-
/etc/inittab(仅用于定义默认运行级别)
-
/etc/init/*.conf (其他的在这些文件中)
*.conf遵循upstart风格的配置文件;
-
CentOS 7
-
init程序:systemd,配置文件:
-
/usr/lib/systemd/system/*
/etc/systemd/system/*
-
/usr/lib/systemd/system/*
-
完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl命令来控制服务;
- systmctl {start|stop|restart|status} name[.service]
Grub
-
grub:GRand Unified Bootloader
- grub 0.x:grub legacy
- grub 1.x:grub2
-
grub legacy:
- stage 1:mbr;不属于任何分区,是硬盘的mbr的前446字节;
- stage 1.5:mbr之后的扇区,让stage 1中的bootloader能识别stage2所在的分区上的文件系统;
-
stage 2:磁盘分区(/etc/grub/)
配置文件:/boot/grub/grub.conf <– /etc/grub.conf
/boot/grub/中的 -
stage2及内核等通常放置于一个基本磁盘分区;
-
功用:
-
提供菜单、并提供交互式接口
- a:内核参数;
- e:编辑模式,用于编辑菜单;
- c:命令模式,交互式接口
-
加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单 -
为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
-
提供菜单、并提供交互式接口
-
功用:
-
如何识别设备:
(hd#,#)- hd#:磁盘编号,用数字表示;从0开始编号
- #:分区编号boot分区所在,用数字表示;从0开始编号
-
cat /proc/cmdline 内核参数
内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt -
grub的命令行接口
-
help:获取帮助信息
help KEYWORD:详细帮助信息 - find (hd#,#)/PATH/TO/SOMEFILE;
- root (hd#,#)
-
kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的命令行参数;
如:init=/path/to/init , selinux=0 - initrd /PATH/TO/KERNEL_FILE:设定为选定的内核提供额外文件的ramdisk;
-
boot:引导启动的内核;
-
手动在grub命令行接口启动系统:
- grub> root (hd#,#)
- grub> ketnel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
- grub> initrd /initramfs-VERSION-RELEASE.img
- grub> boot
-
help:获取帮助信息
-
配置文件:/boot/grub/grub.conf
-
配置项:
- default=#:设定默认启动的菜单项;菜单项(title)编号从0开始;
- timeout=#:指定菜单项等待选项选择的时长;
-
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:Z指明菜单背景图片文件路径;
- yum searrch ImageMagick
- 生成.xpm:convert -resize 640×480 -colors 14 win.png win.xpm
- more win.xpm
- gzip win.xpm
- 修改grub.conf中splashimage选项
- hiddenmenu:隐藏菜单;
- password [–md5|–encrypted] STRING:菜单编辑认证;
-
title TITLE:定义菜单项“标题”
- root (hd#,#):boot所在分区;grub查找stage2及ketnel文件所在设备分区;为grub的“根”;
-
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=472a74aa-d91e-4b79-844b-90415bdfb7c8 rhgb(启动时的图标) quiet(静默,不显示启动过程)
- initrd /PATH/TO/INITRAMFS_FILE:与内核匹配的ramfs文件;
- password [–md5|–encrypted] STRING:启动选定的内核或操作系统时进行认证;
-
配置项:
-
生成grub口令
- grub-md5-crypt :生成md5口令
- grub-crypt :生成sha512口令
-
破解root口令:
启动系统时,设置其运行级别1;进入单用户模式 -
进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令)
(2) 在选定的kernel后附加
1, s, S或single都可以
(3) 在kernel所在行,键入“b”命令 -
安装grub:
-
grub-install:二进制类的文件可以恢复,图片、grub.conf的文件不会恢复。
安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 DIR/boot目录下
grub-install –root-directory=DIR /dev/DISK -
grub:依赖于/boot/grub/中的除grub.conf之外的文件;
grub> root (hd#,#)
grub> setup (hd#) - sync:强制写入硬盘
-
grub-install:二进制类的文件可以恢复,图片、grub.conf的文件不会恢复。
-
在/boot/grub/目录下除grub.conf之外的其他文件都是备份文件,(/boot/grub/stage1内没有分区表):
- 初始状态下grub使用的文件在硬盘的一个位置,而并非使用grub下的文件;系统启动使用的是grub.conf文件;
- 但是在后期如果做过修复工作后,grub使用的是grub目录下的文件,所以此时grub不可使用
实验:
-
破坏stage1:
- 备份:dd if=/dev/sda of=/app/mbr bs=1 count=512
- 破坏:dd if=/dev/zero of=/dev/sda bs=1 count=446;;
- 表现:stage1破坏后系统会直接进行光盘引导
- 修复1:使用grub-install –root-directory=/ /dev/DISK
-
修复2:不启动且此时/boot/grub/下的文件没有任何改动,可以使用grub修复;
- grub(hd0,0)
- setup(hd0)
-
破坏stage1.5:
- 破坏:dd if=/dev/zero of=/dev/sda bs=1 count=2048 skip=512 seek=512
- 表现:跳过光盘引导,菜单不显示,说明破坏成功;
-
修复:使用grub依赖于配置文件stage1、stage1.5、stage2
- grub>root (hd0,0)
- grub>setup (hd0)
-
破坏stage2:
- 破坏:把/boot/grub/下的所有文件都移除;
-
修复:使用grub-install /dev/sda
- 修复完成后/boot/grub/中的文件会恢复,grub.conf不会恢复;要么copy、要么手写一份;
自制Linux
-
分区并创建文件系统
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 -
恢复内核和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.conftitle newlinux 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和相关库文件
- ldd查看程序所使用的的库文件
-
复制相关命令及相关库文件
如:ls,cat,vim,reboot,hostname等
救援模式
-
在根文件系统无法使用时需要,如/bin/mount删除
对系统没有特殊要求
从光盘引导(boot.iso或者安装光盘#1)
从USB盘(由boot.iso制作)引导 -
文件系统重组
Anaconda将会询问是否应该挂载文件系统
/mnt/sysimage/*
/mnt/stage2
$PATH包括硬盘的目录 -
文件系统节点
提供系统特定的设备文件
mknod了解major/minor
系统配置文件丢失修复
-
系统在引导期间,很重要的一个过程就是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
-
sh-3.1# chroot /mnt/sysimage
-
进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:
-
没有备份文件的恢复办法
-
如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包
-
~]# chroot /mnt/sysimage
~]# rpm -qf /etc/inittab
initscripts-9.03.49-1.el6.centos.x86_64
~]# exit 退出chroot模式
-
~]# chroot /mnt/sysimage
-
挂载存放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目录下相应位置即可
-
/proc目录
-
/proc目录:
内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出,还提供了一个配置接口,/proc/sys;-
参数:
- 只读:输出信息
-
可写:可接受用户指定“新值”来实现对内核某功能或特性的配置;/proc/sys,大多数只有root可写;
/proc/sys:net/ipv4/ip_forward 相当于 net.ipv4.ip_forward-
sysctl命令:专用于查看或设定/proc/sys目录下参数的值;
-
设置某参数
sysctl -w parameter=VALUE
sysctl -w path.to.parameter=VALUE
sysctl -w kernel.hostname=mail.magedu.com -
查看所有生效参数
sysctl -a
-
设置某参数
-
文件系统命令(cat、echo):命令通过重定向方式也可以修改大多数参数的值
-
查看:cat /proc/sys/PATH/TO/SOME_KERNEL_FILE
-
设定:echo “VALUE” > /proc/sys/PATH/TO/SOME_KERNEL_FILE
echo “VALUE” > /proc/sys/path/to/parameter
echo “websrv” > /proc/sys/kernel/hostname
-
-
配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf
通过重读取配置文件设置参数
sysctl -p [/path/to/conf_file]
注:上述两种方式的设定仅当前运行内核有效; -
常用的几个参数:
net.ipv4.ip_forward:核心转发功能;
net.ipv4.icmp_echo_ignore_all
vm.drop_caches :强制系统释放缓存
kernel.hoestname:主机名
net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;
-
-
/sys目录
-
/sys目录:
-
sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性。
-
udev:通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序,不能直接跟硬件打交道;专用工具:udevadmin, hotplug
-
udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下
-
编译安装内核
-
Linux:单内核体系设计,但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
-
内核组成部分:
-
kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE;
-
kernel object: 内核对象,一般放置于/lib/modules/VERSION-RELEASE/
-
cat config-2.6.32-642.el6.x86_64内核模块与内核核心版本一定要严格匹配;
[ ]: N,不设计成内核模块;
[M]: M,Module;编译为内核模块
[*]: Y,编译进内核核心
-
cat config-2.6.32-642.el6.x86_64内核模块与内核核心版本一定要严格匹配;
-
ramdisk:辅助性文件,并非必须,者取决于内核是否能直接驱动rootfs所在的设备;
ranmdisk:是一个简装版的根文件系统;如果不需要进行根文件系统切换的话ramdisk也可使用;但是只能临时保存;-
借助ramdisk能够加载的内容:
- 目标设备驱动,如;SCSI设备的驱动;
- 逻辑设备驱动,如LVM设备的驱动;
- 文件系统,如xfs文件系统;
-
借助ramdisk能够加载的内容:
-
-
内核信息获取
uname命令:
uname – print system information
uname [OPTION]…-
-n: 显示节点名称,主机名;
-r: 显示VERSION-RELEASE;
-a:显示所有信息
-v:显示版本号,编译版本;
文件:/boot/vmlinuz-VERSION-RELEASE
-
-n: 显示节点名称,主机名;
-
模块信息获取
-
lsmod命令:
显示由核心已经装载的内核模块
显示的内容来自于: /proc/modules文件- 显示模块名称
- 显示模块大小
- 模块被引用次数
- 被什么模块所引用
-
modinfo命令:
显示模块文件的详细描述信息;
读取/lib/modules文件;
不指明显示当前已安装的内核中的模块信息;
modinfo [ -k kernel ] [ modulename|filename… ]-
-n: 只显示模块文件路径
-p: 显示模块参数
-a: author
-d: description
-l: license
-F field: 仅显示指定字段的信息
-
-n: 只显示模块文件路径
-
lsmod命令:
-
内核模块管理
-
modprobe命令:动态装载或卸载内核模块
- modprobe [ -C config-file ] [ modulename ] [ moduleparame-ters… ]
-
配置文件:
- -C:指明配置文件
- 默认是此文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf
- modprobe [ -r ] modulename…
-
depmod命令:
内核模块依赖关系文件及系统信息映射文件的生成工具 -
装载或卸载内核模块:
-
insmod命令:指定模块文件,不自动解决依赖模块
insmod [ filename ] [ module options… ]
filename:模块文件的文件路径insmod modinfo –n exportfs
lnsmod modinfo –n xfs -
rmmod命令:卸载模块
rmmod [ module_name ]rmmod xfs
rmmod exportfsinsmod、rmmod组合使用
-
insmod命令:指定模块文件,不自动解决依赖模块
-
-
编译内核
-
前提:
- 准备好开发环境
- 获取目标主机上硬件设备的相关信息
- 获取目标主机系统功能的相关信息,例如:需要启用相应的文件系统
- 获取内核源代码包,www.kernel.org
-
开发环境准备
-
包组(CentOS 6):
开发库:Server Platform Development
开发工具:Development Tools -
目标主机硬件设备相关信息:
CPU:
#cat /proc/cpuinfo
#x86info -a
#lscpu
-
包组(CentOS 6):
-
硬件设备
-
PCI设备:
-
lspci
-v
-vv -
lsusb
-v
-vv - lsblk 块设备
-
lspci
-
了解全部硬件设备信息
hal-device:CentOS6
-
PCI设备:
-
内核编译安装系统
-
安装开发包组
下载源码文件
.config:准备文本配置文件
make menuconfig:配置内核选项
make [-j #]
make modules_install:安装模块
make install :安装内核相关文件-
安装bzImage为/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
编辑grub的配置文件
-
安装bzImage为/boot/vmlinuz-VERSION-RELEASE
编译安装内核示例:
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 -
安装开发包组
-
前提:
-
编译内核
-
配置内核选项
-
支持“更新”模式进行配置: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“
-
-
编译
全编译: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
-
如何交叉编译内核:
-
编译的目标平台与当前平台不相同
# make ARCH=arch_name
-
编译的目标平台与当前平台不相同
-
要获取特定目标平台的使用帮助
-
# make ARCH=arch_name help
# make ARCH=arm help
-
# make ARCH=arch_name help
-
在已经执行过编译操作的内核源码树做重新编译需要事先清理操作:
make clean:清理大多数编译生成的文件,但会保留config文件等
make mrproper: 清理所有编译生成的文件、config及某些备份文件
make distclean:mrproper、patches以及编辑器备份文件 -
卸载内核
-
删除/lib/modules/目录下不需要的内核库文件
删除/usr/src/linux/目录下不需要的内核源码
删除/boot目录下启动的内核和内核映像文件
更改grub的配置文件,删除不需要的内核启动列表
-
删除/lib/modules/目录下不需要的内核库文件
-
原创文章,作者:s,如若转载,请注明出处:http://www.178linux.com/75506