Linux运维 第二阶段 (十)启动管理
启动管理:
1、 POST(power on selftesting)-->BIOS(boot sequence)-->bootloader(MBR)->kernel(initramfs,root fs)-->init(/sbin/init,redhat6是upstart另一版本的init,ubuntu开发,并行启动进程,d-bus配置event-driven事件驱动,而传统风格redhat5是串行启动进程),/etc/inittab,/etc/init/*.conf)
/boot/vmlinuz-VERSION(核心)
/lib/modules/VERSION/*(内核模块.ko,装载模块insmod、modprobe)
2.6内核之前(例如2.4、2.5奇数表示测试版,偶数表示稳定版);2.6内核之后(分成两条线,一部分2.6.17-->2.6.18.rc1-->.rc2—>.rc3(release candidate发行候选),另一部分2.6.17-->2.6.17.1-->.2-->.3)
2、内核设计风格:
单内核(linux,所有功能靠一个进程,工作逻辑简单,lwp(line weight process));
微内核(windows,solaris,有子系统,需要用时调用子系统,支持线程)。
3、 内核初始化:硬件探测;装载驱动(可能会从initramfs文件中装载驱动模块);以只读方式挂载根文件系统rootfs;启动用户空间中的第一个进程init
4、redhat5中/etc/inittab文件:id:RUNLEVEL:action:process(例如:id:3:initdefault:、si::sysinit:/etc/rc.d/rc.sysinit)
id(标识);
RUNLEVEL(在哪个级别运行此行);
action(在什么情况下执行此行,initdefault表示设定默认运行级别,sysinit表示系统初始化,wait表示等待级别切换至此级别时执行(可能会执行多次),ctrlaltdel,powerfail有UPS电源才有意义,powerokwait,respawn表示一旦程序终止会重新启动(6个虚拟终端及进入5级别时启动图形界面#mingetty tty1也可手动执行));
process(要运行的程序)。
/etc/inittab文件的任务(redhat5):
设定默认运行级别;
运行系统初始化脚本;
运行指定运行级别对应目录下的脚本(/etc/rc.d/init.d/*、/etc/rc.d/rc#.d/*);
设定ctrl+alt+del组合键的动作;
定义UPS电源在故障|恢复时的动作;
启动虚拟终端(2345级别);
启动图形终端(仅5级别);
5、#runlevel(outputprevious and current runlevel,查看上一次和当前运行级别)
#who -r(--runlevel,print current runlevel)
#uname -a(--all,print all information)
#uname -r(--kernel-release)
6、#file /etc/rc.d/rc.sysinit(Bourne-Againshell script text executable)
#wc -l /etc/rc.d/rc.sysinit(668行,系统初始化脚本完成的任务如下,至关重要)
激活udev和selinux;
根据/etc/sysctl.conf文件,设定内核参数;
设定实时时钟;
装载键盘映射;
启用交换分区;
设置主机名;
根文件系统检测,并以读写方式重新挂载;
激活RAID和LVM设备;
启用磁盘配额;
检查并挂载其它FS(/etc/fstab);
清理过期的锁和PID文件。
7、#ls /etc/rc3.d/{K##,S##}(关闭或启动的优先次序,数字越小,优先被选定,先关闭以K开头的文件再开启S开头的文件)
#ls /etc/rc.d/init.d/(服务类脚本:sysv(/etc/rc.d/init.d/下的所有文件,start|stop|restart|status最起码有这四个参数,另reload|configtest))
脚本内容中靠两行来实现管理系统服务的(#chkconfig和#description),如下:
# chkconfig: RUNLEVELS SS KK(顶格必须有井号,其中RUNLEVELS默认运行级别,在哪些级别下启动,-表示没有级别,默认创建为S*开头的链接,除此之外的级别默认创建为K开头的链接,SS与KK的和为99)
# description:(用于说明此脚本的简单功能,\可续行,最多不要超过80个字符)
例如:
#vim /etc/rc.d/init.d/test
#!/bin/bash
#
# chkconfig: 2345 85 14
#description: Test service
case $1 in
start)
echo "service is running..."
;;
stop)
echo "service is stop..."
;;
restart)
echo "service is stop..."
echo "service is running..."
;;
*)
echo "unknow."
;;
esac
#chmod 755 /etc/rc.d/init.d/test
#chkconfig --list [SERVICE_NAME](查看所有独立守护进程相关服务,也可指定查看某服务)
#chkconfig --add|--del SERVICE_NAME(创建或移除链接文件,K开头或S开头的文件)
#chkconfig --add test
#chkconfig --list test
#chkconfig [--level RUNLEVELS] SERVICE_NAME on|off(若不指定级别,默认为2345)
#chkconfig --level 35 test on
#/etc/init.d/test start
#/etc/init.d/test restart
#service test restart
8、用户空间访问,监测内核的方式:可在伪文件系统/proc、/sys下修改内核特性(/sys/下某些文件可写,/proc/sys/下的大多数文件可写)
设定内核参数值的方式:
方式一:#echo VALUE > /proc/sys/TO/SOMEFILE
方式二:#sysctl -w kernel.FILENAME=”VALUE”( configurekernel parameters at runtime,/proc/sys/kernel/下的文件,注意/proc/sys下的路径用点隔开)
以上方式可立即生效但不能永久有效
例1:
#free -m
#echo 1 > /proc/sys/vm/drop_caches(清空缓存)
#free -m
#echo “www.magedu.com” > /proc/sys/kernel/hostname
例2:
#sysctl -w vm.drop_caches=”1”
#sysctl -w kernel.hostname=www.magedu.com
配置文件:/etc/sysctl.conf(修改此文件能永久有效,但无法立即生效)
#vim /etc/sysctl.conf
net.ipv4.ip_forward = 0改为1
#sysctl -p(Load in sysctl settings from the file specified or /etc/sysctl.conf,执行此句可立即生效)
#sysctl -a(显示所有内核参数值,688项,并非每个都能改)
9、内核模块管理:
#lsmod(program to show thestatus of modules in the Linux Kernel,列出模块)
#modinfo MOD_NAME(program to show information about a Linux Kernel module)
#modprobe MOD_NAME(装载模块,指定模块名)
#insmod /PATH/TO/MODULE_FILE(装载模块,需指定路径)
#modprobe -r MOD_NAME(--remove卸载模块)
#rmmod MOD_NAME(卸载模块)
#depmod /PATH/TO/MODULES_DIR(program to generate modules.dep and map files生成模块依赖表)
注:内核中的功能除了核心功能之外,在编译时大多功能都有三种选择:不使用此功能;编译成内核模块;编译进内核
10、boot loader(在MBR中):
LILO(linux loader,不支持>8G分区,应用于嵌入式系统中)
GRUB(grand unified bootloader,stage1(MBR),stage1.5(常见的不同类型的FS),stage2(/boot/grub))
#rpm -q grub
#cat /etc/grub.conf(此文件链接到/boot/grub/grub.conf)
default=0(设置默认启动的title编号,从0开始)
timeout=5(等待用户选择的超时时长,单位秒)
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz(grub的背景图片)
hiddenmenu(隐藏菜单)
password --md5 加密的字符串(有此句开机编辑grub菜单需输入密码,如设置密码为redhat生成的加密字符串#openssl passwd -1 -salt 12345678 redhat)
title Red Hat Enterprise Linux(2.6.32-358.el6.x86_64)(内核标题或OS名称,字符串,可自由修改)
root (hd0,0)(内核文件所在的设备,对grub而言,所有硬盘类型均为hd)
kernel/vmlinuz-2.6.32-358.el6.x86_64 ro……(内核文件路径及传送给内核的参数,#cat /proc/cmdline发起进程的命令)
initrd/initramfs-2.6.32-358.el6.x86_64.img(完整的linux系统的文件路径,注意/boot单独分区与不单独分区路径是不同的)
#dd if=/dev/zero of=/dev/sda bs=400 count=1(模拟损坏grub,注意bs不要超过446否则会损坏分区表)
#sync
修复步骤:
用光盘进入修复模式rescue installed system
#grub
>root (hd0,0)
>setup (hd0)
>quit
重启即可
制作grub启动图片:
#yum -y install gimp
#gimp &(在图形界面下打开此软件)
p_w_picpath-->scale p_w_picpath(大小调整为640*480,仅支持14色,否则不会正常显示,将图片保存为xpm格式)
#gzip -9 linux.xpm(最大限度压缩图片为linux.xpm.gz格式,并放至/boot/grub/下)
#vim /etc/grub.conf(更改配置文件中图片路径)
splashp_w_picpath=(hd0,0)/grub/linux.xpm.gz
制作一块虚拟磁盘,使得可在新建的虚拟机上启动:
在一有系统的正常的虚拟机上新建一块虚拟磁盘,注意store virtual disk as a single file,浏览保存至其它路径(本例添加的是IDE类型)
#fdisk /dev/sda(sda1(20M),sda2(512M))
#partx /dev/sda
#mke2fs -j /dev/sda1
#mke2fs -j /dev/sda2
#mkdir /mnt/{boot,sysroot}
#mount /dev/sda1 /mnt/boot
#mount /dev/sda2 /mnt/sysroot
#ls /mnt/boot
#grub-install --root-directory=/mnt /dev/sda(install GRUB on yourdrive,/mnt是boot的父目录,会自动查找)
#sync;sync
#ls /mnt/boot/grub
#vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title mylinux
root (hd0,0)
kernel /vmlinuz
initrd /initramfs
#sync;sync
suspend挂起这台正常的虚拟机,新建一虚拟机,将此例新建的那块虚拟盘作为新虚拟机的唯一盘,启动看能否正常引导
若grub配置文件破坏后启动系统,操作如下:
>find
>root (hd#,N)
>kernel /PATH/TO/KERNEL_FILE
>initrd /PATH/TO/INITRD_FILE
>boot(尝试启动系统)
以上是学习《马哥网络视频》做的笔记。
一、1、启动流程:
》加载BIOS的硬件信息进行自我测试,并依据BIOS设置取得第一个可启动的设备;
》读取每一个启动设备的MBR,加载MBR中的BOOTLOADER(grub或spfdisk);
》依据BOOTLOADER的设置加载kernel,kernel会再进行系统检测,并采用kernel检测到的硬件信息,同时kernel会通过加载动态模块的形式加载硬件驱动;
》内核启动系统的第一个进程/sbin/init;
》进程/sbin/init调用/etc/init/rcS.conf,再通过这个配置文件调用/etc/rc.d/rc.sysinit,从而进行系统初始化及软件执行的操作环境;
》/etc/init/rcS.conf调用/etc/inittab,从而确定系统默认运行级别,接着/etc/inittab调用/etc/init.rc.conf继而调用并执行/etc/rc.d/rc脚本文件并传入运行级别参数;
》/etc/rc.d/rc确认传入的运行级别,运行相应的运行级别目录/etc/rc[0-6].d/中的脚本,从而依据设定好的优先级别依次启动和关闭;
》最后执行/etc/rc.d/rc.local中的程序,设定系统启动就运行的工作;
》若是字符界面就已启动完毕,若图形界面调用x-windows接口。
2、MBR位于硬盘的0磁道、0柱面、1扇区,主要记录BOOTLOADER启动引导程序和分区表,其中启动引导程序占446byte,分区表占64byte,另2byte作结束标记,所以分区表共64byte,每个分区要占16byte,仅能划分4个主分区。
BOOTLOADER的作用:最主要功能加载操作系统内核;提供菜单,来选择启动哪个操作系统;调用其它的BOOTLOADER,这是多系统启动的关键,注意windows的bootloader不能调用linux的bootloader。
3、常见的USB、SATA、SCSI等硬盘设备驱动,特殊文件系统LVM、RAID等的驱动,都以模块形式保存在/lib/modules/下;使用initramfs虚拟文件系统解决操作系统安装在SCSI硬盘上或采用LVM的文件系统的问题。
4、#runlevel (查看系统运行级别,0:关机;1:single单用户模式,用于系统修复;2:不完全的命令行模式,不含NFS服务;3:完全的命令行模式,标准字符界面;4:系统保留;5:图形模式;6:重启
#init 0|1|2|3|5|6 (切换系统运行级别
5、grub:支持更多的文件系统;grub的主程序可直接在文件系统中查找内核文件;系统启动时利用grub的交互界面编辑和修改启动选项;可动态修改grub的配置文件,重新启动即生效,而不用重新安装grub。
》grub的主程序分三个阶段来执行:
stage1:执行主程序(主程序位于bootloader中)用来启动stage1.5和stage2;
stage1.5:识别不同文件系统,它位于MBR之后的32K的空间中,这一段硬盘空间是空白无用的,而且是没有文件系统的,所以stage1能直接读取stage1.5,从而能识别不能的文件系统;
stage2:加载grub的配置文件(/boot/grub/grub.conf),然后根据配置文件中的定义,加载kernel和initramfs,继而kernel接管启动过程,继续自检加载硬件模块。
》系统中没grub,手工安装步骤:
#grub-install --root-directory=/tdisk /dev/sdb1
#vi /boot/grub/gurb.conf
title centos tdisk
root (hd1,0)
chainloader +1 (使用当前分区的启动扇区启动系统
#grub
grub>root(hd0,0) (设定grub的主目录,这里只能是(hd0,0),因为内核和文件系统安装在/dev/sda1中
grub>find /boot/grub/stage1
grub>find /grub/stage1
grub>find vmlinuz-2.6.32-279.3l6.i686
grub>set (hd1,0) (在tdisk分区的启动扇区安装grub
grub>quit
注:#grub-install 选项 设备文件名
--root-directory=DIR (DIR是实际目录,手工指定grub相关文件的安装目录
》MBR中的grub被覆盖,需重新安装grub
光盘修复模式:
sh-4.1#grub
grub>root (hd0,0)
grub>setup (hd0,0)
grub>quit
》grub加密
#grub-md5-crypt (输两次密码生成加密字串
#vi /boot/grub/grub.conf
timeout=5
password --md5 此处放加密字串 (必须要将加密字串放在timeout与splashp_w_picpath之间,此项仅在开机启动编辑grub时生效,有此项可以正常启动进入系统
splashp_w_picpath=……
title centos (2.6……)
lock (在title字段下一行加lock代表锁死,必须输入正确的密码才能正常启动
三、内核模块管理
内核模块保存位置:/lib/modules/$(uname -r)/kernel/
depmod命令会扫描系统中所有的内核模块,然后把结果放入modules.dep文件,后续的模块安装和删除都依赖这个文件中的内容,如模块所在位置的绝对路径,模块的依赖性。
#depmod -a|-A|-n
-a 扫描所有模块
-A 扫描新模块,才更新modules.dep
-n 仅输出到屏幕,不写入modules.dep
#lsmod (内核模块查看
#modprobe 选项 模块名
-l 列出所有模块
-f 强制加载模块
-r 删除模块
例:#depmod -a
#modprobe vfat
#lsmod |grep vfat
#modprobe -r vfat
四、系统修复模式:
1、单用户模式:遗忘root密码;修改系统默认运行级别。
2、光盘修复模式:多系统并存,grub被覆盖;重要系统文件丢失,导致系统无法启动。
#chroot /mnt/sysp_w_picpath (光盘模式下默认根目录是光盘的模拟根目录,系统根目录被当作外来设备放在/mnt/sysp_w_picpath
注:本文由互联网收集整理(51CTO、360DOC、chinaunix、百度百科、兄弟连免费视频等)。