13、30个常用快捷键 14、运维实战 a、系统负载查询确认 1>CPU负载情况 1)查看逻辑CPU个数:cat /proc/cpuinfo |grep “processor”|sort -u|wc -l 2)查看物理CPU个数:grep “physical id” /proc/cpuinfo|sort -u|wc -l 3)查看每颗物理CPU核数:cat /proc/cpuinfo |grep “cores”|uniq 每个物理CPU上逻辑CPU个数:grep “siblings” /proc/cpuinfo|uniq 查看是否开启了抄超线程:如多个逻辑CPU的"physical id"和"core id"均相同,说明开启了超线程; 逻辑如下: a.逻辑CPU个数 > 物理CPU个数 * CPU内核数 开启了超线程 b.逻辑CPU个数 = 物理CPU个数 * CPU内核数 没有开启超线程 4)查看CPU的主频:cat /proc/cpuinfo |grep MHz|uniq
#!/bin/bash
定义初始变量
physicalNumber=0
coreNumber=0
logicalNumber=0
HTNumber=0 ##获取系统参数值 logicalNumber=$(grep "processor" /proc/cpuinfo|sort -u|wc -l)
physicalNumber=$(grep "physical id" /proc/cpuinfo|sort -u|wc -l)
coreNumber=(grep "cpu cores" /proc/cpuinfo|uniq|awk -F':' '{print 2}'|xargs)
HTNumber=$((logicalNumber / (physicalNumber * coreNumber)))
cpuHZ=$(cat /proc/cpuinfo |grep MHz|uniq)
echo "****** CPU Information ******"
echo "Logical CPU Number : ${logicalNumber}"
echo "Physical CPU Number : ${physicalNumber}"
echo "CPU Core Number : ${coreNumber}"
echo "HT Number : ${HTNumber}"
echo "Systen cpu MHZ : ${cpuHZ}"
echo "*****************************"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
5)top命令:
其中:load average这三个值,隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值;默认不超过cpu合数的2倍为好,超过2倍说明负载偏高;如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了;经验表明:每单核负载在3-5之间尚可,超过6甚至8,就要立刻排查cpu负载高的问题,否则极易宕机。检查%idle是否过低(比如小于5%); us 用户空间占用CPU百分比; sy 内核空间占用CPU百分比;ni 用户进程空间内改变过优先级的进程占用CPU百分比;id 空闲CPU百分比;wa 等待输入输出的CPU时间百分比;hi 硬中断(Hardware IRQ)占用CPU的百分比;si 软中断(Software Interrupts)占用CPU的百分比;st 用于有虚拟cpu的情况,用来指示被虚拟机偷掉的cpu时间。
输出结果说明: PID:进程编号 USER:进程所属用户 PR/NI:Priority/Nice value进程执行的优先顺序 VIRT:Virtual Image (kb) 虚拟内存使用总额;进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等,即使进程实际使用的远少于改值,但进程运行满载时会达到改值;VIRT=SWAP+RES RES:Resident size (kb) 常驻内存,表进程当前使用的内存大小,包含其他进程的共享但不包括swap out;RES=CODE+DATA SHR:Shared Mem size (kb) 共享内存;除了自身进程的共享内存,也包括其他进程的共享内存,即使进程只使用了几个共享库的函数,但它用了整个共享库的大小来占用**;因此,** 某个进程所占的物理内存大小公式:RES – SHR S:Process Status 进程状态:D不可中断的睡眠状态 R运行态 S睡眠态 T跟踪/停止态 Z僵尸态 %CPU:cpu使用率 %MEM:内存使用率 TIME+:进程开始运行时使用cpu的总时间 COMMAND:进程运行的命令 第三行表示cpu的运行情况,按下1可以显示每个核的运行情况。 top默认排序是%CPU;shift+> 或者shift+< 向右或者向左切换排序基准,共12列,cpu为9列,mem为10列。按x高亮显示,可知道当前是哪一行为排序行。
默认进入top时,各进程是按照CPU的占用量来排序的。在top基本视图中,按键数字“1”可以监控每个逻辑CPU的状况;按键‘b’(打开关闭加亮效果);‘y’来打开或者关闭运行态进程的加亮效果;‘x’(打开/关闭排序列的加亮效果);按”shift+>”或者”shift+<”左右改变排序序列;”f”可进入编辑基本视图中的显示字段;
top -u root //-u:user显示指定用户的进程
top -p 1 //-p:pid显示指定进程
进入top后,按n:设置top屏幕显示的任务数
top -n 5 //top -n num:设置top刷新的次数,指定刷新次数后将退出top,默认一直刷 top -d 5 //delay进入top后,top会定时刷新状态,默认值是5 s,-d参数指定top几秒刷新一次,即刷新频率 top -b -n 60 -d 60 > /tmp/cpu.txt //-b:Batch mode批处理模式,top刷新状态默认是在原数据上刷新,使用-b参数后,会一屏一屏的显示数据。结合重定向功能和计划任务,-b参数在记录服务器运行状态时非常有用。
-M:Memory按照内存使用量排序 -P:CPU按照cpu使用量排序 进入top后按k键:(kill杀死PID的进程) top -H //以线程方式查看top视图,等同于top内的H键
大写的 R 键可以将当前的排序倒转; 6)自动记录cpu一段时间状态: top -b -n 60 -d 60 > /tmp/cpu.txt
7)top -H -p 进程号 //查看异常线程
8)查看占用cpu高的线程 ps -H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 说明:‘H’,显示线程相关;-o指定显示的列; -T 显示线程数
linux下获取占用CPU资源最多的10个进程 ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
9)查看占用内存高的线程: ps aux | head -1;ps aux|sort -k4nr|head -5 linux下获取占用内存资源最多的10个进程: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head cat /proc/pid/status //查看该进程的内存占用情况 10)查看进程按内存、cpu从大到小排序: ps -e -o “%C : %p : %z : %a”|sort -k5 -nr ps -e -o “%C : %p : %z : %a”|sort -nr 11)cat /proc/loadavg # 查看系统负载
2>内存负载情况 1)查看进程内存的状况:pmap PID; //查看进程的内存映像信息
说明: -d:how the deviceformat. 显示设备格式 -q quiet 不显示头尾行 -x extended 显示扩展格式 2)循环显示上述进程的输出的最后1行,间隔2秒: while true; do pmap -d 11957 | tail -1; sleep 2; done;
最后一行的值说明:
mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
writeable/private 表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小
shared 表示进程和其他进程共享的内存大小
3)查看某进程的设备状态下的内存使用 Address: 内存开始地址、Kbytes: 占用内存的字节数(KB) Mode: 内存的权限:read、write、execute、shared、private (写时复制) Offset: 文件偏移 Mapping: 占用内存的文件、或[anon](分配的内存)、或[stack](堆栈) Device: 设备名 (major:minor)
3>进程和线程异常情况 1)查看当前站cpu最高的进程的线程使用情况: top -H -p ps aux|sort -k4nr|head -1|awk '{print $2}'
lsof -p pid(察看该进程所打开端口和文件) 2)如上述输出有异常线程,可利用printf “%x\n” 线程号,将异常线程号转化为16进制,用于后续的java线程跟踪用。 printf “%x\n” 12791 //tid需要使用16进制值
3)查看java进程堆栈信息 jstack 进程号|grep 16进制异常线程号 -A90 //-A90是日志行数;查看运行的 Java 进程下,多线程的运行情况 注意:jstack命令在jdk的bin目录下 jstack -F 12791|grep 31f7 -A90 //-F option can be used when the target process is not responding
线程状态有以下几种: RUNNABLE 线程运行中或 I/O 等待 BLOCKED 线程在等待 monitor 锁( synchronized 关键字) TIMED_WAITING 线程在等待唤醒,但设置了时限 WAITING 线程在无限等待唤醒
如输出结果有GC,说明内存已经用尽;
jstat -gcmetacapacity pid //命令查看内存分布情况及GC情况
jstat -gcutil pid //查看GC情况 jstat -gccapacity pid
4)查看某进程的线程信息: ps -mp pid -o THREAD,tid,time|sort -rn //tid为代码线程ID,time代表这个线程的已运行时间; jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题, 注:其中,LWP为轻量级进程,即线程PID;NLWP为线程数量;WCHAN表当前进程是否正在运行,若为-表示正在运行,若该进程在睡眠,则显示睡眠中的系统函数名;
jps -v //找到java进程相关的pid
jstack -l 12791 >> 123.txt //导出堆栈信息;
5)其他进程管理命令:htop、vmstat、dstat、iostat、glances,pstree、ps、pidof、pgrep、pkill、pmap、kill、killall、job、bg、fg等;
6)当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。
7)可运行进程数目 # vmwtat 1 5 列给出的是可运行进程的数目,检查其是否超过系统逻辑CPU的4倍
top -id 1 //观察是否有异常进程出现 9)vmstat命令: vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计,但不适于对某个具体进程进行深入分析。 #vmstat 5 5 //5秒时间内进行5次采样
输出结果字段说明:
Procs(进程):
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存):
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap:
si: 每秒从交换区写到内存的大小
so: 每秒写入交换区的内存大小
IO:(Linux默认块的大小为1024bytes)
bi: 每秒读取的块数
bo: 每秒写入的块数
系统:
in: 每秒中断数,包括时钟中断。【interrupt】
cs: 每秒上下文切换数。 【count/second】
CPU(以百分比表示):
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
wa: 等待IO时间
指标参考:
如果r经常大于4,id经常少于40,表示cpu的负荷很重。
如果bi,bo长期不等于0,表示内存不足。
如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。
示例: eg1:vmstat -a 2 5 //-a 显示活跃和非活跃内存,所显示的内容将增加inact和active列,对应非活跃和活跃;
eg2:vmstat -f //查看linux下创建进程的系统调用。即fork次数,实际是从/proc/stat中的processes字段里取得的值
eg3:vmstat -s //显示内存相关统计信息,包括已使用内存,活跃内存,实际取值于/proc/meminfo,/proc/stat和/proc/vmstat
eg4:vmstat -d //查看磁盘的读写,实际取之于/proc/diskstats vmstat -p /dev/sda1 //显示指定磁盘分区统计信息 其中,输出结果: reads:来自于这个分区的读的次数。 read sectors:来自于这个分区的读扇区的次数。 writes:来自于这个分区的写的次数。 requested writes:来自于这个分区的写请求次数。
eg5:vmstat -m //查看系统的slab信息,用于存储i节点,目录项等小对象,避免为他们消耗一个内存页(4kb),减少内存分配次数。际取值于/proc/slabinfo
eg6:
10)ps命令:
常用参数:
-A 显示所有进程(等价于-e)(utility) -a 显示一个终端的所有进程,除了会话引线 -N 忽略选择。 -C 通过命令名称搜索进程,后面跟你要找的进程的名字即可 -d 显示所有进程,但省略所有的会话引线(utility) -x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility) -p pid 进程使用cpu的时间 -u uid or username 选择有效的用户id或者是用户名, 如果长度大于8个字符,然后ps将只显示UID,而不是用户名;多个用户名可以提供以逗号分隔。 -g gid or groupname 显示组的所有进程。 U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility) -f -forest全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on. -l 长格式(有F,wchan,C 等字段) -L 查看特定进程的线程 -j 作业格式 -o 用户自定义格式。 v 以虚拟存储器格式显示 s 以信号格式显示 -m 显示所有的线程 -H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility) e 命令之后显示环境(如:ps -d e; ps -a e)(utility) h 不显示第一行 –sort 选项由逗号分隔的多个字段可以用指定,–sort=-pcpu,+pmem(或–sort +pmem,-pcpu),cpu降序排列,内存升序排列。
ps命令参数使用支持以下3种风格:
1)BSD风格: 在 BSD 风格的语法选项前不带连字符。例如: ps aux 2)UNIX/LINUX的风格:在 linux 风格的语法选项前面有一个 “-”。例如: ps -ef 3)混合使用两种 Linux 系统上的语法风格是好事儿。例如:ps ax -f
eg1:# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
其中:VSZ 进程所使用的虚存的大小(Virtual Size);RSS表进程使用的驻留集大小或者是实际内存的大小,Kbytes字节。STAT即进程的状态:使用不通字符表示(STAT的状态码),主要15种状态码如下:
R 运行 Runnable (on run queue) //正在运行或在运行队列中等待。 S 睡眠 Sleeping //休眠中, 受阻, 在等待某个条件的形成或接受到信号。 I 空闲 Idle Z 僵死 Zombie(a defunct process) //进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。 D 不可中断 Uninterruptible sleep (ususally IO) //收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。 T 终止 Terminate //进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。 P //等待交换页 W 无驻留页 has no resident pages // 没有足够的记忆体分页可分配。 X //死掉的进程 < 高优先级进程 //高优先序的进程 N 低优先级进程 //低优先序的进程 L 内存锁页 Lock // 有记忆体分页分配并缩在记忆体内 s //进程的领导者(在它之下有子进程) l //多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
- //位于后台的进程组
WCHAN 表进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。
eg2:自定义输出结果并按需排序
ps -eo pid,stat,pri,uid –sort uid //查看当前系统进程的uid,pid,stat,pri, 以uid号排序.
ps -eo user,pid,stat,rss,args –sort rss //查看当前系统进程的user,pid,stat,rss,args, 以rss排序.
eg3:结合 watch命令实时显示进程运行情况
#watch -n 1 ‘ps -aux --sort -pmem,-pcpu’ //1s刷新一次,按cpu和内存排序
watch -n 1 ‘ps -aux --sort -pmem,-pcpu|head -10’ //动态显示前10行
11)优先级命令nice:
用法: nice <优先值> <进程名> //通过给定的优先值启动一个程序
通过以上命令用户就可以设置和改变进程的优先级。提高一个进程的优先级,内核会分配更多CPU时间片给这个进程。默认情况下,进程以 0 的优先级启动。进程优先级可以通过 top 命令显示的 NI(nice value)列查看。进程优先级值的范围从-20到19。值越低,优先级越高。
类似命令renice: renice 命令类似 nice 命令,但它可以改变正在运行的进程优先值且用户只能改变属于他们自己的进程的优先值。
renice -n -p //改变指定进程的优先值
renice -u -g //通过指定用户和组来改变进程优先值
12)ipcs命令 :
ipcs 命令报告进程间通信设施状态。(包括共享内存,信号量和消息队列)
eg1:# ipcs -p -m //查看当前共享内存情况,-s查看信号量集合,-a等同于-msq
eg2:# ipcs -p -q //查看当前活动消息队列
b、系统安全检查 1)检查系统中是否有其他特权用户: awk -F: ‘3==0 {print 1}’ /etc/passwd //检查是否存在其他特权账户,默认只有root cat /etc/passwd;stat /etc/passwd //检查是否异常用户,及用户和密码文件状态及修改的日期 awk -F: ‘length(2)==0 {print 1}’ /etc/shadow检查是否存在空口令账户. awk -F: ‘length(2)==0 {print 1}’ /etc/shadow检查是否存在空口令账户. last|head;lastb;w less /var/log/secure //查看ssh的登录日志 2)ps -p PID -o lstart 检查上一次syslog启动时间是否正常
3)检查是否有以rhosts或者以forward结尾的后门文件,判断是否遭到入侵 find / -name “.rhosts” -print find / -name “.forward” -print ls /var/spool/cron/ less /etc/rc.d/rc.local ls /etc/rc.d ls /etc/rc.d find / -type f -perm 4000 lsmod 4)检查/var/log日志是否被清理 ls -al /var/log/* //尤其wtmp和utmp 检查 sshd 服务配置文件 /etc/ssh/sshd_config 和系统认证日志 auth、message,判断是否为口令破解攻击。 /etc/ssh/sshd_config 文件确认认证方式。 确认日志是否被删除或者清理过的可能(大小判断)。 5) 查看/var/log/secure日志文件,查看是否有入侵者的信息 cat /var/log/secure | grep -i “accepted password” 检查日志报错:grep -i error或fail /var/log/messages
6) 检查守护进程 ps -ajx //所有的守护进程都是以超级用户启动的(UID为0);没有控制终端(TTY为?);终端进程组ID为-1(TPGID表示终端进程组ID,该值表示与控制终端相关的前台进程组,如果未和任何终端相关,其值为-1;
参数说明: -a: 显示所有 -x:显示没有控制终端的进程 -j:显示与作业有关的信息(显示的列):会话期ID(SID),进程组ID(PGID),控制终端(TTY),终端进程组ID(TRGID) 7)查找隐藏进程: ps -ef|awk ‘{print }’|sort -n|uniq>1 ls /proc/|sort -n|uniq >2 8)检查权限过开文件 find / -uid 0 -perm -4000 -print find / -size +10000k -print //注意SUID文件,可疑大于10M和空格文件 find / -name “…” -print find / -name " " -print find / -name “.” -print 9)检查系统中的core文件 find / -name core -exec ls -l {} ; 10)检查系统文件完整性 rpm -qf /bin/ls rpm -qf /bin/login md5sum -b 关键文件名 md5sum -t 关键文件名 日常运维时,可将一些重要的文件的md5值保存,作为之后变化的参照
#!/bin/bash export path=$PATH:/root md5sum /etc/passwd >>/etc/md5db md5sum /etc/shadow >>/etc/md5db md5sum /etc/group >>/etc/md5db md5sum /usr/bin/passwd >>/etc/md5db md5sum /sbin/portmap>>/etc/md5db md5sum /bin/login >>/etc/md5db md5sum /bin/ls >>/etc/md5db md5sum /bin/ps >>/etc/md5db md5sum /usr/bin/top >>/etc/md5db 1 2 3 4 5 6 7 8 9 10 11 11)检查RPM:rpm -Va //列出当前系统中安装后,所有变化过的包文件,可以以此来检查文件包的完整性,安全性等 其中: S – File size M – Mode不同权限 5 – MD5 sum D – Device number
c表示文件为配置文件。其他标志有: d %doc 说明文档;g %ghost 不应包含的文档,有可能有问题;l %license 授权文件;r %readme readme说明文件。
注意相关的 /sbin, /bin, /usr/sbin, and /usr/bin
12)检查文件的变化:
ls -Xal --time-style=+%D | grep ‘date +%D’ //只列出当前目录当天修改的文件,-X 标志来按字母顺序对结果排序,-S 标志来基于大小(由大到小)来排序 find . -maxdepth 1 -newermt “2020-09-13” find . -maxdepth 1 -newermt “09/13/2020” 或者# find . -maxdepth 1 -newermt “2020/09/13”
13)查看网络连接
netstat -atlpv //看正在网络通讯的进程和socket连接状态
iftop //看活跃的网络通讯以及流量
抓包分析:tcpdump -w tcpdump.log //将tcpdump.log保存成 pcap 格式导入到 wireshark tcpdump -c 10000 -i eth0 -n dst port 80 > /root/pkts
查看http的并发请求数及其TCP连接状态: netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
查看cache里的URL grep -r -a jpg /var/cache/* | strings | grep “http:” | awk -F’http:’ ‘{print “http:”$2;}’
查看网络负载: # sar -n DEV //检查网络流量(rxbyt/s, txbyt/s)是否过高 网络错误 # netstat -i //检查是否有网络错误(drop fifo colls carrier) 也可以用命令:# cat /proc/net/dev
14)文件被黑的常见形式: /bin (替换基本工具为恶意木马等,比如netstat,ps等) /sbin (替换基本工具为恶意木马等,比如sshd,lsof,ss等) /usr/bin(替换基本工具为恶意木马等,比如sshd,lsof,ss等) /usr/sbin (替换基本工具为恶意木马等,比如sshd,lsof,ss等) /etc/init.d (修改开机启动任务,添加恶意脚本开机启动) /etc/ /etc/cront.d (修改计划任务,添加恶意脚本定时执行) /etc/crontab (修改计划任务,添加恶意脚本定时执行) ~/.ssh/目录 (注入公钥) /etc/sysconfig (修改iptables配置等,开放网络限制) /etc/ssh/ (修改ssh配置) web目录 (修改网站) 需定时检查上述目录下文件被替换或者添加非法文件。
#find /usr/bin -m -1 //查看一天内/usr/bin目录下变化过的文件 #find /var -type f -mtime -1 -exec ls -al {} ;
15)杀掉进程 示例如下: ps aux |grep p_name |grep -v grep |awk ‘{print $2}’ |xargs kill -9 (从中了解到awk的用途) killall -TERM 服务名 kill -9 cat /usr/local/apache2/logs/httpd.pid 试试查杀进程PID 16)显示运行3级别开启的服务 ls /etc/rc3.d/S* |cut -c 15- //注意cut截取字符 17).打开文件数目 # lsof | wc -l //检查打开文件总数是否过多
c、系统启动异常处理及备份 1>Linux系统启动引到过程(BRGKi)
●开机自检:检测出第一个能够引导系统的设备,比如硬盘或者光驱。 服务器主机开机以后,将根据主板BIOS中的设置对CPU、内存、显卡、键盘等硬件设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权,大多时候会移交给本机硬盘,因为操作系统一般都是装在硬盘内。 ●MBR 引导:运行放在MBR扇区里的启动GRUB引导程序。 当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中MBR(主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据MBR记录中的引导信息调用启动菜单。例如:GRUB等 ●GRUB 菜单:GRUB引导程序通过读取GRUB配置文件**/boot/grub2/grub.cfg**,来获取内核和镜像文件系统的设置以及路径位置。对于Linux操作系统来说,GRUB(统一启动加载器)是使用最为广泛的多系统引导器程序,系统控制权传递给GRUB以后,将会显示启动菜单给用户选择,并根据所选项(或采用默认值)加载Linux内核文件,然后将系统控制权转交给内核。(CentOS 7采用的是GRUB2启动引导器) ●加载Linux内核:把内核和镜像文件系统加载到内存中。 Linux内核是一个预先编译好的特殊二进制文件,介于各自硬件资源与系统程序之间,复制资源分配与调度,内核接过系统控制权以后,将完全掌控整个Linux操作系统的运行过程。(CentOS 7系统中,默认的内核文件位于“/boot/vmlinuz-3.10.0-514.e17.x86_64”) ●init 进程初始化:加载硬件驱动程序,内核把init进程加载到内存中运行。 为了完成进一步的系统引导过程,Linux内核首先将系统中的“/sbin/init”程序加载到内存中运行(运行中的程序称为进程),init进程(systemd)负责完成整个系统的初始化,最后等待用户进行登录。
2> 为避免因引导扇区的损坏或丢失导致系统无法启动,需提前备份MBR扇区信息
MBR位于第一块硬盘的第一个物理扇区处,总共512字节;故我们可使用dd命令将MBR所在硬盘的第一个512字节的块保存即可,假设MBR在sda(第一块硬盘上),创建的备份目录为sdb上的/mbrbak/,执行命令:
可执行以下命令模式损坏MBR块区:
恢复时,重启系统,使用救援模式,用dd命令将MBR备份写回系统MBR第一个扇区即可:
3>Grub引到程序异常导致的系统启动失败
比如:MBR中的GRUB引导程序(1-446字节)遭到破坏;或grub.cfg文件丢失,引导配置有误,文件位置/boot/grub2/grup.cfg。
故障现象:系统引导卡死到grub >提示符,无法继续进入
解决思路:
1.尝试手动输入引导命令修复(不推荐)
grub> insmod xfs grub> linux16 /vmlinuz-0-rescue-73d7ede256a74b0e975e69f22d862090 root=UUID=d069b243-6623-4983-8d61-3ec6956a4f2b ro rhgb quiet grub> initrd16 /initramfs-0-rescue-73d7ede256a74b0e975e69f22d862090.img grub> boot 1 2 3 4 2.进入急救模式,重写或者从备份中恢复grub.cfg
然后挂载系统CD盘,从CD盘恢复GRUB数据。
3.急救模式向MBR扇区中重建grub程序 MBR位于第一块硬盘( /dev/sda)的第一个物理扇区处,总共512字节, 前446字节是主引导记录,分区表保存在MBR扇区中的第447-510字节中。修复方法跟MBR基本一致,只是备份的数据只需要446字节就可以,将bs=512修改为bs=446即可。过程如下:
a、创建新目录用以挂载备份磁盘,备份GRUB引导程序 #mkdir /bak #mount /dev/sdb1 /bak/ #dd if=/dev/sda of=/bak/grup.bak bs=446 count=1
b、模拟对MBR中的GRUB引导程序的破坏,但不破坏分区表 #dd if=/dev/zero of=/dev/sda bs=446 count=1
c、引导界面进入急救模式,从备份文件中恢复GRUB引导程序 sh-4.2# mkdir /backupdir sh-4.2# mount /dev/sdb1 /backupdir sh-4.2# dd if=backupdir/grup.bak of=/dev/sda bs=446 count=1 sh-4.2# exit
附录:系统启动时服务自启动管理工具ntsysv
ntsysv命令提供了一个基于文本界面的菜单操作方式,集中管理系统不同的运行等级下的系统服务启动状态。在RedHat各个发行版,CentOS各个版本,都自带这个工具。它具有互动式操作界面,您可以轻易地利用方向键和空格键等,开启,关闭操作系统在每个执行等级中,所要执行的系统服务。
输入ntsysv命令后,出现一个交互式的管理菜单,如下:
备份 dump -0aj -f /tmp/home0.bak /home 制作一个 ‘/home’ 目录的完整备份 dump -1aj -f /tmp/home0.bak /home 制作一个 ‘/home’ 目录的交互式备份 restore -if /tmp/home0.bak 还原一个交互式备份 rsync -rogpav --delete /home /tmp 同步两边的目录 rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录 rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录 dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr ‘dd of=hda.gz’ 通过ssh在远程主机上执行一次备份本地磁盘的操作 dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件 tar -Puf backup.tar /home/user 执行一次对 ‘/home/user’ 目录的交互式备份操作 ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr ‘cd /home/share/ && tar x -p’ 通过ssh在远程目录中复制一个目录内容 ( tar c /home ) | ssh -C user@ip_addr ‘cd /home/backup-home && tar x -p’ 通过ssh在远程目录中复制一个本地目录 tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接 find /home/user1 -name ‘.txt’ | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 ‘.txt’ 结尾的文件到另一个目录 find /var/log -name '.log’ | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 ‘.log’ 结尾的文件并做成一个bzip包 dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作 dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容