CentOS6启动流程 1.加载BIOS的硬件信息,获取第一个启动设备 2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息 3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备 4.核心执行init程序,并获取默认的运行信息 5.init程序执行/etc/rc.d/rc.sysinit文件 6.启动核心的外挂模块 7.init执行运行的各个批处理文件(scripts) 8.init执行/etc/rc.d/rc.local 9.执行/bin/login程序,等待用户登录 10.登录之后开始以Shell控制主机 制作centos6系统的ramdisk文件 目的 掌握centos6系统中的启动顺序中/boot目录的作用,制作启动时所需的文件ramdisk文件。 前提 可用的centos6系统。 /boot目录作用 在系统启动以后,/boot整目录内容就没什么用了,甚至可以把boot目录删除,只要不重启,系统仍然能正常运行。 利用mkinitrd命令创建ramdisk文件 为当前正在使用的内核重新制作ramdisk文件,使用mkinitrd命令。 【例1】制作ramdisk文件 为了证明制作一个ramdisk文件而且启动正常,则先删除ramdisk文件。 [root@magedu ~]# ls /boot/initramfs-2.6.32-696.el6.x86_64.img /boot/initramfs-2.6.32-696.el6.x86_64.img [root@magedu boot]# rm -f initramfs-2.6.32-696.el6.x86_64.img 注意,该文件名不能随意定义,因为在启动文件中是已经定义好的了: [root@magedu boot]# tail -5 /boot/grub/grub.conf hiddenmenu title CentOS 6 (2.6.32-696.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/mapper/vg_magedu-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_magedu/lv_swap rd_NO_MD rd_LVM_LV=vg_magedu/lv_root SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-696.el6.x86_64.img 最后一行,initrd指明了该文件的完整名称,这就是之所以为什么不能随意指定文件名的原因。 制作ramdisk文件: [root@magedu boot]# mkinitrd /boot/initramfs-2.6.32-696.el6.x86_64.img $(uname -r) 时间可能会稍长一些,之后,就可在/boot目录中新创建了initramfs-2.6.32-696.el6.x86_64.img文件。可以查看该文件: [root@magedu boot]# cp initramfs-2.6.32-696.el6.x86_64.img /tmp/ 解压该文件: [root@magedu tmp]# zcat initramfs-2.6.32-696.el6.x86_64.img |cpio -id 152872 blocks 可以使用ls命令查看其结果。现在系统上的ramdisk文件已经被删除,而且手动创建了一个ramdisk文件,此时重启系统使用reboot命令,仍然可以正常启动。 配置centos6系统各服务的启动运行级别 目的 掌握centos6系统中配置开机启动时服务的运行级别。 前提 可用的centos6系统。 实验步骤 1、runlevel命令:查看上一次及当前系统启动的运行级别 [root@magedu ~]# runlevel N 5 N表示上一次切换级别是无切换过。 5表示当前运行级别是有图形化的完整的多用户模式。 2、chkconfig命令:查看当前系统启动时服务的运行级别 [root@magedu ~]# chkconfig --list NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off abrt-ccpp     0:off 1:off 2:off 3:on 4:off 5:on 6:off abrtd         0:off 1:off 2:off 3:on 4:off 5:on 6:off acpid         0:off 1:off 2:on 3:on 4:on 5:on 6:off atd           0:off 1:off 2:off 3:on 4:on 5:on 6:off ... 以crond服务为例,查看开机启动时在各运行级别中是否开机启动: [root@magedu ~]# chkconfig --list|grep crond crond         0:off 1:off 2:on 3:on 4:on 5:on 6:off 从结果看crond服务分别在0-6的运行级别中开机分别为: 在0级别关机模式中是关闭的; 在1级别单用户模式中开机自动关闭; 在2级别没有网络的多用户模式中开机自动启动; 在3级别完整的多用户模式中的开机自动启动; 在4级别自定义模式中开机自动启动; 在5级别有图形化的完整的多用户模式中开机自动启动; 在6级别重启模式中开机自动关闭。 [root@magedu ~]# ll /etc/rc.d/rc?.d/???crond lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc0.d/K60crond -> ../init.d/crond lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc1.d/K60crond -> ../init.d/crond lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc2.d/S90crond -> ../init.d/crond lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc3.d/S90crond -> ../init.d/crond lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc4.d/S90crond -> ../init.d/crond lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc5.d/S90crond -> ../init.d/crond lrwxrwxrwx. 1 root root 15 May 16 17:47 /etc/rc.d/rc6.d/K60crond -> ../init.d/crond 此结果说明rc0.d-rc6.d分别是设置各个启动运行级别时需要启动和停止的服务,而在其目录下K开头的文件都是开机自动关闭的服务,S开头的文件都是开机自动启动的服务。 列出指定crond服务开机启动各级别是否是自动关闭还是自动开启: [root@magedu ~]# chkconfig --list crond crond         0:off 1:off 2:on 3:on 4:on 5:on 6:off 3、指定crond服务,在2、3、4、5运行级别时自动启动 [root@magedu ~]# chkconfig crond on 默认是在2、3、4、5级别进行设置,或单独指定3和5级别开机时自动启动: [root@magedu ~]# chkconfig --level 35 crond on 当然,也可设置crond服务在2/3/4/5运行级别自动关闭,默认也是在2、3、4、5级别进行设置: [root@magedu ~]# chkconfig crond off 或单独指定2和4运行级别的自动关闭: [root@magedu ~]# chkconfig --level 24 crond off 4、自定义服务启动脚本,并添加到启动项中 编写mageserv服务启动样例脚本: [root@magedu ~]# vim /etc/init.d/mageserv #!/bin/bash

chkconfig: 2345 80 30

description: This is a service script

. /etc/init.d/functions

check_num(){ if [ ! $1 -eq 1 ];then echo "Usage:$0 [start|stop|restart|status]" exit 1 fi }

check_argument(){ if [[ ! $1 =~ ^(start)|(stop)|(restart)|(status)$ ]];then echo "Usage:$0 [start|stop|restart|status]" exit 1 fi }

main(){ script_name=mageserv if [[ $2 = start ]];then if [ ! -e /var/lock/subsys/${script_name} ];then touch /var/lock/subsys/${script_name} action "启动成功" true else echo "启动成功" fi elif [[ $2 = stop ]];then if [ -e /var/lock/subsys/${script_name} ];then rm -rf /var/lock/subsys/${script_name} action "停止完成" true else action "停止完成" false fi elif [[ $2 = restart ]];then if [ -e /var/lock/subsys/${script_name} ];then rm -rf /var/lock/subsys/${script_name} action "停止完成" true touch /var/lock/subsys/${script_name} action "启动成功" true else action "停止完成" false touch /var/lock/subsys/${script_name} action "启动成功" true fi elif [[ $2 = status ]];then if [ -e /var/lock/subsys/${script_name} ];then echo "$script_name is runing..." else echo "mageserv is dead!" fi fi }

check_num $# check_argument $1 main $0 $1 添加执行权限: [root@magedu ~]# chmod +x /etc/init.d/mageserv 把mageserv服务加入系统服务管里中: [root@magedu ~]# chkconfig --add mageserv 添加mageserv服务开机自启动: ​ [root@magedu ~]# chkconfig mageserv on 或指定35启动级别时自动启动: [root@magedu ~]# chkconfig mageserv off [root@magedu ~]# chkconfig mageserv on --level 35 注意:改变启动级别,先关闭启动运行时的开机自动启动。 ​ 查看mageserv服务设置的默认启动级别: [root@magedu ~]# chkconfig --list mageserv mageserv 0:off 1:off 2:off 3:on 4:off 5:on 6:off 查看: [root@magedu ~]# ll /etc/rc?.d/???mageserv lrwxrwxrwx 1 root root 18 Jul 28 06:31 /etc/rc0.d/K30mageserv -> ../init.d/mageserv lrwxrwxrwx 1 root root 18 Jul 28 06:31 /etc/rc1.d/K30mageserv -> ../init.d/mageserv lrwxrwxrwx 1 root root 18 Jul 28 06:34 /etc/rc2.d/K30mageserv -> ../init.d/mageserv lrwxrwxrwx 1 root root 18 Jul 28 06:35 /etc/rc3.d/S80mageserv -> ../init.d/mageserv lrwxrwxrwx 1 root root 18 Jul 28 06:34 /etc/rc4.d/K30mageserv -> ../init.d/mageserv lrwxrwxrwx 1 root root 18 Jul 28 06:35 /etc/rc5.d/S80mageserv -> ../init.d/mageserv lrwxrwxrwx 1 root root 18 Jul 28 06:31 /etc/rc6.d/K30mageserv -> ../init.d/mageserv 使用系统服务管理service命令管理mageserv服务: [root@magedu ~]# service mageserv start 启动成功 [ OK ]

[root@magedu ~]# service mageserv restart 停止完成 [ OK ] 启动成功 [ OK ]

[root@magedu ~]# service mageserv status mageserv is runing...

[root@magedu ~]# service mageserv stop 停止完成 [ OK ]

[root@magedu ~]# service mageserv status mageserv is dead! 当然,也可以直接使用该服务脚本文件直接运行: [root@magedu ~]# /etc/init.d/mageserv Usage:/etc/init.d/mageserv [start|stop|restart|status]

[root@magedu ~]# /etc/init.d/mageserv start 启动成功 [ OK ]

[root@magedu ~]# /etc/init.d/mageserv restart 停止完成 [ OK ] 启动成功 [ OK ]

[root@magedu ~]# /etc/init.d/mageserv status mageserv is runing...

[root@magedu ~]# /etc/init.d/mageserv stop 停止完成 [ OK ]

[root@magedu ~]# /etc/init.d/mageserv status mageserv is dead! 注意: 正常级别下,最后启动一个服务/etc/rc5.d/S99local没有链接至/etc/rc.d/init.d目录下的一个服务脚本,而是指向了/etc/rc.d/rc.local脚本。不便或不需要写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.loal文件中。/etc/rc.d/rc.local在指定运行级别脚本后运行。 该文件是一个软连接: [root@magedu ~]# ll /etc/rc5.d/S99local lrwxrwxrwx. 1 root root 11 May 16 17:45 /etc/rc5.d/S99local -> ../rc.local rc.local文件也是一个软连接: [root@magedu ~]# ll /etc/rc.local lrwxrwxrwx. 1 root root 13 May 16 17:45 /etc/rc.local -> rc.d/rc.local 所以,最终用户自定义的一个启动脚本文件位置是/etc/rc.d/rc.local。 ​ [root@magedu ~]# cat /etc/rc.d/rc.local #!/bin/sh # # This script will be executed after all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local

AWK部分 awk变量 变量:内置和自定义变量 FS:输入字段分隔符,默认为空白字符awk -v FS=':' '{print $1,FS,$3}’ /etc/passwdawk –F: '{print $1,$3,$7}’ /etc/passwd OFS:输出字段分隔符,默认为空白字符awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd RS:输入记录分隔符,指定输入时的换行符awk -v RS=' ' ‘{print }’ /etc/passwd ORS:输出记录分隔符,输出时用指定符号代替换行符awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd NF:字段数量awk -F:‘{print NF}’ /etc/fstab 引用变量时,变量前不需加$awk -F:‘{print $(NF-1)}' /etc/passwd NR:记录号 awk ‘{print NR}’ /etc/fstab ; awk END‘{print NR}’ /etc/fstab FNR:各文件分别计数,记录号 awk '{print FNR}' /etc/fstab /etc/inittab FILENAME:当前文件名 awk '{print FILENAME}’ /etc/fstab ARGC:命令行参数的个数 awk '{print ARGC}’ /etc/fstab /etc/inittab awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab ARGV:数组,保存的是命令行所给定的各参数 awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab awk -F: -f awkscript script=“awk” /etc/passwd Printf命令 格式符:与item一一对应 %c:显示字符的ASCII码 %d, %i:显示十进制整数 %e, %E:显示科学计数法数值 %f:显示为浮点数 %g, %G:以科学计数法或浮点形式显示数值 %s:显示字符串 %u:无符号整数 %%:显示%自身  修饰符 #[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f

  • 左对齐(默认右对齐) %-15s + 显示数值的正负符号 %+d 赋值操作符: =, +=, -=, =, /=, %=, ^=,++, -- 下面两语句有何不同 • awk ‘BEGIN{i=0;print ++i,i}’ • awk ‘BEGIN{i=0;print i++,i}’ 比较操作符: ==, !=, >, >=, <, <= 模式匹配符: ~:左边是否和右边匹配,包含 !~:是否不匹配 示例: awk -F: '$0 ~ /root/{print $1}‘ /etc/passwd awk '$0~“^root"' /etc/passwd awk '$0 !~ /root/‘ /etc/passwd awk -F: ‘$3==0’ /etc/passwd 逻辑操作符:与&&,或||,非! 示例: • awk -F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd • awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd • awk -F: ‘!($3==0) {print $1}' /etc/passwd • awk -F: ‘!($3>=500) {print $3}’ /etc/passwd 条件表达式(三目表达式) selector?if-true-expression:if-false-expression • 示例: awk -F: '{$3>=1000?usertype="Common User":usertype=" SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd awk PATTERN PATTERN:根据pattern条件,过滤匹配的行,再做处理 (1)如果未指定:空模式,匹配每一行 (2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来 awk '/^UUID/{print $1}' /etc/fstab awk '!/^UUID/{print $1}' /etc/fstab (3) relational expression: 关系表达式,结果为“真”才会被处理 真:结果为非0值,非空字符串 假:结果为空字符串或0值 BEGIN/END模式 BEGIN{}:仅在开始处理文件中的文本之前执行一次 END{}:仅在文本处理完成之后执行一次 面试题 取连接主机的ip数量 ss -nt|awk '/^ESTAB/{print $5}' |awk -F: '{print $1}' ss -nt|awk -F"([[:space:]]+|:)" '/^ESTAB/{print $6}' ss -nt|awk -F"([[:space:]]+|:)" '/^ESTAB/{print $(NF-2)}' 下面的命令是要取出链接主机次数最多的ip ss -nt|awk -F"([[:space:]]+|:)" '/^ESTAB/{print $(NF-2)}'|sort |uniq -c| sort -nr|awk '{print $2}'|head 而下面这条命令是要取出所有的ip包括他们的连接数: ss -nt|awk -F"([[:space:]]+|:)" '/^ESTAB/{print $(NF-2)}'|sort |uniq -c Sed 命令取出b开头的段至f开头的段 sed -n '/^b/,/^f/p' /etc/passwd awk '/^b/,/^f/' /etc/passwd 取分区利用率 df |awk -F"([[:space:]]+|%)" '/^/dev//{if($5<10){print $5,"great" }else if($5<80){print $5,"warning"}else{print $5,"error"}}' Shell部分 取100以内的和 1、seq -s+ 100|bc 2、i=1;sum=0;while [ $i -le 100 ];do let sum+=i;let i++;done;echo $sum 3、for((sum=0,i=1;i<=100;i++));do let sum+=i ;done;echo $sum
    awk 部分 取100以内的和 1、awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}'
    2、awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}' 取最大值 最小值: for i in {1..20};do if [ $i -lt 20 ];then echo -n "$RANDOM", ; else echo "$RANDOM" ;fi ;done > num.txt 此处已经得出20个以,隔开的整数了,本来此处为纵向数列,在第一个echo后加上 -n,就变为横向数列 Awk-F, '{for(i=1;i<=NF;i++){if(i==1){max=$i;min=$i}else{if($i>max)max=$i;if($i<min)min=$i}};print "max="max,"min="min}' num.txt 此处即可打印出max与min的值 面试题:解决DOS攻击生产案例:根据web日志或网络连接数,监控当某个ip并发连接数或者短时间内pv达到100,即调用防火墙命令封掉对应的ip,监控频率每隔5分钟;防火墙命令为iptables -A INPUT -s IP -j REJECT? for ip in ss -nt|awk -F"[[:space:]]+|:" '/^ESTAB/{print $6}'|sort |uniq -c|awk '$1>=3{print $2}';do iptables -A INPUT -s $ip -j REJECT;done 改写awk 调用iptables 参考 awk 'BEGIN{ip="192.168.35.6";system("iptables -A INPUT -s "ip" -j REJECT")}' for ip in awk '{print $1}' /var/log/httpd/access_log |sort |uniq -c|sort -nr|head|awk '{print $2}';do iptables -A INPUT -s $ip -j REJECT;done 三种方式取值: awk -F"/" '{print $3}' url.txt cut -d/ -f3 url.txt sed -rn 's@.
    //([^/]+)/.*@\1@p' url.txt

Awk部分加{}与不加{}的区别: [root@centos7 ~]#awk '!line[$0]++{print $0,line[$0]}' f1.txt aa 1 bb 1 cc 1 aaaa 1 bbb 1 dd 1 [root@centos7 ~]#awk '{!line[$0]++;print $0,line[$0]}' f1.txt aa 1 bb 1 cc 1 aaaa 1 bbb 1 aa 2 cc 2 dd 1 bb 2 cc 3 aaaa 2 取TCP状态出现的次数: [root@centos7 ~]#ss -nta > state.log
[root@centos7 ~]#awk 'NR!=1{state[$1]++}END{for(i in state){print i,state[i]}}' state.log SYN-RECV 1 LISTEN 59 ESTAB 44 FIN-WAIT-2 1 TIME-WAIT 3593 取男生和女生的平均成绩:(两种不同的方法) 1.'NR!=1{if($2=="m"){m_sum+=$3;m_num++}else{f_sum+=$3;f_num++}}END{print "male:"m_sum/m_num,"female:"f_sum/f_num}' score.txt 2.'NR!=1{sum[$2]+=$3;num[$2]++}END{for(i in sum){print i":"sum[i]/num[i]}}' score.txt
m:89.5 f:92.5 统计ip地址出现的次数: awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log

split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…: netstat -tn | awk '/^tcp>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'