1、描述centos6系统开机启动流程;
按下电源开关的时候计算机会做以下操作:
1.POST 加电自检,检测所有硬件的信息,自检通过后会读取主板上的ROM芯片上的bios程序。
2.Bios程序根据启动顺序Boot Sequence的设置找到第一个有BootLoder程序的硬件设备,并启动这个设备进而读取引导加载程序BootLoder。
3.以磁盘为例,BootLoder程序位于磁盘的第一个磁道的第一个扇区我们称之为MBR(master boot record),此扇区共512个字节,前446个字节存放的是BootLoder引导程序,后 64 个字节存放的是分区信息,最后 2 个字节是校验信息。在centos6中bootloader程序就是grub,grub会根据grub.conf配置文件找到kernel,initramfs的存放位置并加载kernel镜像,initramfs到内存中。
4.Kernel镜像在内存中通过自解压、展开,借助ramdisk解压后的虚拟文件系统(rootfs)提供的相关驱动程序,可以访问当前的磁盘设备找到根文件系统,并做根切换(switchroot)以只读的方式挂载根文件系统。
5.此时Kernel会运行第一个程序/sbin/init ,init程序会读取(/etc/inittab, /etc/init/*.conf)等配置文件,根据/etc/inittab配置文件设定默认运行级别,运行、/etc/rc.d/rc.sysinit脚本进行系统初始化来准备软件运行的作业环境 (如挂载设备准备网络、时区等),运行/etc/rc.d/rc脚本关闭或启动对应级别下的服务,运行/etc/rc.d/rc.local启动用户设置的程序,执行/bin/login程序,进入登录状态。
注解:grub程序的工作分为两个阶段stage1和stage2,stage1是放在mbr中的,stage2是放在磁盘分区中的,stage1需要加载stage2完成之后才能知道内核在哪里,此时grub程序是识别不了stage2所在分区的文件系统格式的,所以需要一个桥梁来识别文件系统,linux系统在第一次安装完成后grub程序会根据当前stage2所在分区的文件系统格式在mbr扇区之后的第一个扇区安装一个stage1.5,这个程序的作用就是帮助stage1识别stage2所在分区的文件系统格式,此时就能顺利加载stage2了,stage2会读取grub.conf配置文件并找到kernel和initramfs加载到内存中去
2、描述/etc/rc.d/sysinit脚本功能;
/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) 清理操作;
3、总结文本处理工具sed及awk的用法;(必须附带示例)
sed 总结
sed 是一种行编辑器,默认不编辑原有文件,一次处理一行内容,处理时把当前处理的行存储在一个临时缓冲区,称为“模式空间”(pattern space),接着用sed命令处理模式空间中的内容,处理完成后把模式空间中的内容打印到屏幕上,完成一行的编辑。
用法:
sed [option]... 'script' inputfile...
script:
'地址命令'
常用选项:
-n:不输出模式中的内容至屏幕;
-e: 多点编辑;
-f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本;
-r: 支持使用扩展正则表达式;
-i: 原处编辑;修改原有文件
地址定界:
(1) 不给地址:对全文进行处理;
(2) 单地址:
#: 指定的行;
/pattern/:被此处模式所能够匹配到的每一行;
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2
2~2
编辑命令:
d: 删除
p: 显示模式空间中的内容
a \text:在行后面追加文本;支持使用\n实现多行追加;
i \text:在行前面插入文本;支持使用\n实现多行插入;
c \text:替换行为单行或多行文本;
w /path/to/somefile: 保存模式空间匹配到的行至指定文件中;
r /path/from/somefile:读取指定文件的文本流至模式空间中匹配到的行的行后;
=: 为模式空间中的行打印行号;
!: 取反条件;
s///:支持使用其它分隔符,s@@@,s###;
替换标记:
g: 行内全局替换;
p: 显示替换成功的行;
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
高级编辑命令:
h: 把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g: 从保持空间取出数据覆盖至模式空间;
G:从保持空间取出内容追加至模式空间;
x: 把模式空间中的内容与保持空间中的内容进行互换;
n: 读取匹配到的行的下一行至模式空间;
N:追加匹配到的行的下一行至模式空间;
d: 删除模式空间中的行;
D:删除多行模式空间中的所有行;
例子:
[root@centos tmp]# cat a.txt 12345678910
d 删除指定范围的行,示例中删除4到9行
[root@centos tmp]# sed '4,9d' a.txt 12310
p 显示指指定的行,示例中显示4到7行
[root@centos tmp]# sed -n '4,7p' a.txt 4567
a 在行后面追加文本,示例在第一行后加一行字符串centos
[root@centos tmp]# sed '1a\centos' a.txt 1centos2345678910
i 在行前面插入文本,示例在第一行前加一行字符串centos
[root@centos tmp]# sed '1i\centos' a.txt centos12345678910
一次插入多行用\n分隔
[root@centos tmp]# sed '2a\centos\ncentos' a.txt 12centoscentos345678910
c 替换行为单行或多行文本,示例中将3-7行都替换为字符串drop line和no line
[root@centos tmp]# sed '3,7c drop line \nno line' a.txt 12drop line no line8910
w 保存模式空间匹配到的行至指定文件中,示例将a.txt文件中3到6行保存到a1.txt文件中
[root@centos tmp]# sed -n '3,6 w a1.txt' a.txt [root@centos tmp]# ll总用量 64-rwxr--r--. 1 root root 121 1月 12 16:45 9x9-rw-r--r--. 1 root root 8 2月 2 15:22 a1.txt-rw-r--r--. 1 root root 22 1月 29 10:12 a.txt[root@centos tmp]# cat a1.txt 3456
r 读取文件到符合匹配条件的每一行后,示例中读取b.txt中内容插入到a.txt文件中第4行后
[root@centos tmp]# cat b.txt centos[root@centos tmp]# sed '4r b.txt' a.txt 1234centos5678910
! 对匹配的条件取反
显示1到5行内容
[root@centos tmp]# sed -n '1,5p' a.txt 12345
显示1到5行之外行的内容
[root@centos tmp]# sed -n '1,5!p' a.txt 678910
s/// 替换,可将///换成@@@ ###;示例中把a.txt中第7行内容替换为seven
[root@centos tmp]# sed 's/7/seven/g' a.txt 123456seven8910
练习1:删除/boot/grub/grub.conf文件中所有以空白开头的行行首的空白字符;
[root@centos tmp]# cat grub.conf # grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE: You have a /boot partition. This means that# all kernel and initrd paths are relative to /boot/, eg.# root (hd0,0)# kernel /vmlinuz-version ro root=/dev/mapper/vg_centos-lv_root# initrd /initrd-[generic-]version.img#boot=/dev/sdadefault=0timeout=5splashp_w_picpath=(hd0,0)/grub/splash.xpm.gzhiddenmenutitle CentOS 6 (2.6.32-573.el6.i686) root (hd0,0) kernel /vmlinuz-2.6.32-573.el6.i686 ro root=/dev/mapper/vg_centos-lv_root rd_NO_LUKS rd_LVM_LV=vg_centos/lv_swap rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=vg_centos/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-573.el6.i686.img
[root@centos tmp]# sed 's/^[[:space:]]//' grub.conf # grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE: You have a /boot partition. This means that# all kernel and initrd paths are relative to /boot/, eg.# root (hd0,0)# kernel /vmlinuz-version ro root=/dev/mapper/vg_centos-lv_root# initrd /initrd-[generic-]version.img#boot=/dev/sdadefault=0timeout=5splashp_w_picpath=(hd0,0)/grub/splash.xpm.gzhiddenmenutitle CentOS 6 (2.6.32-573.el6.i686)root (hd0,0)kernel /vmlinuz-2.6.32-573.el6.i686 ro root=/dev/mapper/vg_centos-lv_root rd_NO_LUKS rd_LVM_LV=vg_centos/lv_swap rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=vg_centos/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quietinitrd /initramfs-2.6.32-573.el6.i686.img
练习2:删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符;
[root@centos tmp]# cat fstab ## /etc/fstab# Created by anaconda on Sat Dec 12 19:19:59 2015## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#/dev/mapper/vg_centos-lv_root / ext4 defaults 1 1UUID=bbaac0f5-de08-4d09-8b02-b9b2d776b062 /boot ext4 defaults 1 2/dev/mapper/vg_centos-lv_home /home ext4 defaults 1 2/dev/mapper/vg_centos-lv_swap swap swap defaults 0 0tmpfs /dev/shm tmpfs defaults 0 0devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0LABEL='TEST' /testingext4defaults,acl0 0LABEL='HUGE'/mogdataext3defaults0 0
[root@centos ~]# sed 's/^#[[:space:]]\+//' /etc/fstab#/etc/fstabCreated by anaconda on Sat Dec 12 19:19:59 2015#Accessible filesystems, by reference, are maintained under '/dev/disk'See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#/dev/mapper/vg_centos-lv_root / ext4 defaults 1 1UUID=bbaac0f5-de08-4d09-8b02-b9b2d776b062 /boot ext4 defaults 1 2/dev/mapper/vg_centos-lv_home /home ext4 defaults 1 2/dev/mapper/vg_centos-lv_swap swap swap defaults 0 0tmpfs /dev/shm tmpfs defaults 0 0devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0LABEL='TEST' /testing ext4 defaults,acl 0 0LABEL='HUGE' /mogdata ext3 defaults 0 0
练习3:echo一个绝对路径给sed命令,取出其基名;取出其目录名;
[root@centos tmp]# echo '/etc/init/rc.conf' | sed 's#/.*/##'rc.conf[root@centos tmp]# echo '/etc/init/rc.conf' | sed 's#[^/]\+/\?$##'/etc/init/
特殊示例:
[root@centos tmp]# sed -n 'n;p' a.txt #显示偶数行246810[root@centos tmp]# sed '1!G;h;$!d' a.txt #逆向显示文件内容10987654321[root@centos tmp]# sed '$!N;$!D' a.txt #取出文件后两行910[root@centos tmp]# sed '$!d' a.txt #取出文件最后一行10[root@centos tmp]# sed 'G' a.txt #每一行后面加一个空行1 2 3 4 5 6 7 8 9 10 [root@centos tmp]# sed '/^$/d;G' a.txt #删除所有空行并在每一行后面加一个空行1 2 3 4 5 6 7 8 9 10 [root@centos tmp]# sed 'n;d' a.txt #显示奇数行13579
awk 总结
awk:报告生成器,格式化文本输出;
AWK:Aho, Weinberger, Kernighan --> New AWK, NAWK
GNUawk, gawk
gawk- pattern scanning and processing language
基本用法:gawk [options]'program' FILE ...
program:PATTERN{ACTION STATEMENTS}
语句之间用分号分隔
print,printf
选项:
-F:指明输入时用到的字段分隔符;
-vvar=value: 自定义变量;
1、print
printitem1, item2, ...
要点:
(1)逗号分隔符;
(2)输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式;
(3)如省略item,相当于print $0;
例子:显示/etc/passwd中的第1,3,7列字段
[root@localhost ~]# head -10 /etc/passwd |awk -F: '{print $1,$3,$7}'root 0 /bin/bashbin 1 /sbin/nologindaemon 2 /sbin/nologinadm 3 /sbin/nologinlp 4 /sbin/nologinsync 5 /bin/syncshutdown 6 /sbin/shutdownhalt 7 /sbin/haltmail 8 /sbin/nologinuucp 10 /sbin/nologin
2、变量
2.1内建变量
FS:input field seperator,默认为空白字符;
OFS:output field seperator,默认为空白字符;
RS:input record seperator,输入时的换行符;
ORS:output record seperator,输出时的换行符;
NF:number of field,字段数量
{printNF}, {print $NF}
NR:number of record, 行数;
FNR:各文件分别计数;行数;
FILENAME:当前文件名;
ARGC:命令行参数的个数;
ARGV:数组,保存的是命令行所给定的各参数;
例:统计/etc/passwd文件最后一行有几个字段
[root@localhost ~]# tail -1 /etc/passwd |awk -F: '{print NF}'7
例:显示/etc/passwd文件后5行的第1,3,7字段并把“:”替换成“|”
[root@localhost ~]# tail -5 /etc/passwd |awk 'BEGIN{FS=":";OFS="|"}{print $1,$3,$7}'vcsa|69|/sbin/nologinsaslauth|499|/sbin/nologinpostfix|89|/sbin/nologinsshd|74|/sbin/nologinnamed|25|/sbin/nologin
例:把/etc/passwd中第一行记录中的每一列放入一列中(行转列)
[root@localhost ~]# head -1 /etc/passwdroot:x:0:0:root:/root:/bin/bash[root@localhost ~]# head -1 /etc/passwd |awk 'BEGIN{RS=":";ORS="\n"}{print}'rootx00root/root/bin/bash
2.2自定义变量
(1)-v var=value
变量名区分字符大小写;
(2)在program中直接定义
3、printf命令
格式化输出:printf FORMAT,item1, item2, ...
(1)FORMAT必须给出;
(2)不会自动换行,需要显式给出换行控制符,\n
(3)FORMAT中需要分别为后面的每个item指定一个格式化符号;
格式符:
%c:显示字符的ASCII码;
%d,%i: 显示十进制整数;
%e,%E: 科学计数法数值显示;
%f:显示为浮点数;
%g,%G:以科学计数法或浮点形式显示数值;
%s:显示字符串;
%u:无符号整数;
%%:显示%自身;
修饰符:
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;
%3.1f
-:左对齐
+:显示数值的符号
例:格式化输出,并打印头和尾
[root@localhost ~]# head -5/etc/passwd|awk -F: 'BEGIN{print "the head"}{printf"%-10s%-3s%+20s\n",$1,$3,$7}END{print "the end"}'the headroot 0 /bin/bashbin 1 /sbin/nologindaemon 2 /sbin/nologinadm 3 /sbin/nologinlp 4 /sbin/nologinthe end
4、操作符
算术操作符:
x+y,x-y, x*y, x/y, x^y, x%y
-x
+x:转换为数值;
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
=,+=, -=, *=, /=, %=, ^=
++,--
比较操作符:
>,>=, <, <=, !=, ==
模式匹配符:
~:是否匹配
!~:是否不匹配
逻辑操作符:
&&
||
!
函数调用:
function_name(argu1,argu2, ...)
条件表达式:
selector?if-true-expression:if-false-expression
例:根据用户uid是否大于1000,显示系统用户和普通用户
[root@localhost ~]# awk -F: '{$3>=1000?usertype="CommonUser":usertype="Sysadmin or SysUser";printf"%15s:%-s\n",$1,usertype}' /etc/passwd root:Sysadmin or SysUser bin:Sysadmin or SysUser daemon:Sysadmin or SysUser adm:Sysadmin or SysUser lp:Sysadmin or SysUser sync:Sysadmin or SysUser shutdown:Sysadmin or SysUser halt:Sysadmin or SysUser mail:Sysadmin or SysUser uucp:Sysadmin or SysUser operator:Sysadmin or SysUser games:Sysadmin or SysUser gopher:Sysadmin or SysUser ftp:Sysadmin or SysUser nobody:Sysadmin or SysUser vcsa:Sysadmin or SysUser saslauth:Sysadmin or SysUser postfix:Sysadmin or SysUser sshd:Sysadmin or SysUser named:Sysadmin or SysUser user11:Common User
5、PATTERN
(1)empty:空模式,匹配每一行;
(2)/regular expression/:仅处理能够被此处的模式匹配到的行;
(3)relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;
真:结果为非0值,非空字符串;
(4)line ranges:行范围,
startline,endline:/pat1/,/pat2/
注意: 不支持直接给出数字的格式
(5)BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次;
END{}:仅在文本处理完成之后执行一次;
例:显示/etc/passwd中2到10行的第一列
[root@localhost ~]# awk -F:'(NR>=2&&NR<=10){print $1}' /etc/passwdbindaemonadmlpsyncshutdownhaltmailuucp
6、常用的action
(1)Expressions
(2)Control statements:if,while等;
(3)Compound statements:组合语句;
(4)input statements
(5)output statements
7、控制语句
if(condition){statments}
if(condition){statments} else {statements}
while(conditon){statments}
do{statements} while(condition)
for(expr1;expr2;expr3){statements}
break
continue
deletearray[index]
deletearray
exit
{statements }
7.1if-else
语法:if(condition)statement [else statement]
示例:
[root@localhost ~]# awk -F: '{if($3>=1000) {printf"Common user: %s\n",$1} else {printf "root or Sysuser:%s\n",$1}}' /etc/passwdroot or Sysuser: rootroot or Sysuser: binroot or Sysuser: daemonroot or Sysuser: admroot or Sysuser: lproot or Sysuser: syncroot or Sysuser: shutdownroot or Sysuser: haltroot or Sysuser: mailroot or Sysuser: uucproot or Sysuser: operatorroot or Sysuser: gamesroot or Sysuser: gopherroot or Sysuser: ftproot or Sysuser: nobodyroot or Sysuser: vcsaroot or Sysuser: saslauthroot or Sysuser: postfixroot or Sysuser: sshdroot or Sysuser: namedCommon user: user11[root@localhost ~]# awk -F:'{if($NF=="/bin/bash") print $1}' /etc/passwdrootuser11 [root@localhost ~]# awk '{if(NF>5)print $0}' /etc/fstab# Created by anaconda on Fri Dec 1106:54:18 2015# Accessible filesystems, by reference,are maintained under '/dev/disk'# See man pages fstab(5), findfs(8),mount(8) and/or blkid(8) for more info/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1UUID=16af712f-74e9-4b25-b08f-6c22e0923a1f/boot ext4 defaults 1 2/dev/mapper/VolGroup-lv_home /home ext4 defaults 1 2/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0tmpfs /dev/shm tmpfs defaults 0 0devpts /dev/pts devpts gid=5,mode=620 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0/dev/md0 /backup ext4 defaults 0 0[root@localhost ~]# df -h | awk -F[%]'/^\/dev/{print $1}' | awk '{if($NF>=5) print $1}'/dev/sda1
使用场景:对awk取得的整行或某个字段做条件判断;
7.2while循环
语法:while(condition)statement
条件“真”,进入循环;条件“假”,退出循环;
使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;
~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}'/etc/grub2.cfg
~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print$i,length($i)}; i++}}' /etc/grub2.cfg
7.3do-while循环
语法:do statementwhile(condition)
意义:至少执行一次循环体
7.4for循环
语法:for(expr1;expr2;expr3)statement
for(variableassignment;condition;iteration process) {for-body}
~]#awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}'/etc/grub2.cfg
特殊用法:
能够遍历数组中的元素;
语法:for(var in array){for-body}
7.5switch语句
语法:switch(expression){case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; ...;default: statement}
7.6break和continue
break[n]
continue
7.7next
提前结束对本行的处理而直接进入下一行;
~]#awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
8、array
关联数组:array[index-expression]
index-expression:
(1)可使用任意字符串;字符串要使用双引号;
(2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”;
若要判断数组中是否存在某元素,要使用"indexin array"格式进行;
weekdays[mon]="Monday"
若要遍历数组中的每个元素,要使用for循环;
for(varin array) {for-body}
~]#awk'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(iin weekdays) {print weekdays[i]}}'
注意:var会遍历array的每个索引;
state["LISTEN"]++
state["ESTABLISHED"]++
~]#netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { printi,state[i]}}'
~]#awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
练习1:统计/etc/fstab文件中每个文件系统类型出现的次数;
~]#awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
练习2:统计指定文件中每个单词出现的次数;
~]#awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {printi,count[i]}}' /etc/fstab
9、函数
9.1内置函数
数值处理:
rand():返回0和1之间一个随机数;
字符串处理:
length([s]):返回指定字符串的长度;
sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;
gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容;
split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;
~]#netstat -tan | awk'/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count){print i,count[i]}}'
4、写一个脚本,生成10个随机数,并按从小到大进行排序(要求至少使用2中方法);
[root@centos tmp]# cat random.sh #!/bin/bash#for ((i=1;i<=10;i++))doecho "$RANDOM"done | sort -n[root@centos tmp]# bash random.sh #执行效果28785941070812135145901627516969231262378224945[root@centos tmp]# cat random1.sh #冒泡法#/bin/bash#declare -a randfor((i=0;i<10;i++))dorand[$i]=$RANDOM#echo ${rand[$i]}doneecho "生成10个随机数:"echo ${rand[*]} for((i=0;i<9;i++));dofor((j=9;j>i;j--));do if [ ${rand[j]} -lt ${rand[j-1]} ];thentmp=${rand[j]}rand[j]=${rand[j-1]}rand[j-1]=$tmpfidonedoneecho "对10个随机数从小到大排序:"[root@centos tmp]# bash random1.sh echo ${rand[*]}生成10个随机数:5907 6363 30863 31727 10896 1791 21264 19662 3219 11804对10个随机数从小到大排序:1791 3219 5907 6363 10896 11804 19662 21264 30863 31727
5、在每周二的凌晨1点5分执行脚本/data/get_username.sh,并将脚本的输出至/tmp/get_username.log日志文件中;
[root@centos etc]# cat crontab SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/ # For details see man 4 crontabs # Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed 5 1 * * 2 root /data/get_username.sh >> /tmp/get_username.log
6、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;
#/bin/bash#read -p "请输入一个路径:" lujingif [ -f $lujing ]then echo $lujing is exist ls -l $lujingelif [ -d $lujing ]then echo $lujing is exist ls -dl $lujingelse mkdir -p $lujing echo "路径$lujing已创建完成" ls -dl $lujingfi [root@centos tmp]# bash aa.sh 请输入一个路径:/tmp/a路径/tmp/a已创建完成drwxr-xr-x. 2 root root 4096 2月 3 09:50 /tmp/a[root@centos tmp]# bash aa.sh 请输入一个路径:/tmp/a/tmp/a is existdrwxr-xr-x. 2 root root 4096 2月 3 09:50 /tmp/a
7、写一个脚本,打印9X9乘法表;
[root@centos tmp]# cat 9x9 #!/bin/bash#for((j=1;j<=9;j++));do for((i=1;i<=j;i++));do echo -e -n "$i*$j=$[$i*$j]\t" done echodone[root@centos tmp]# bash 9x9 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
8、描述dns的工作流程,以及完整搭建一套dns主从服务器,相关域名和ip可自行设定。
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析),从域名解析成IP地址为正向解析,从IP地址解析成域名为反向解析。
DNS工作流程:
当我们访问一个网站输入网址www.test.com的时候,浏览器会检查本地户缓存查看是否有对应这个域名的IP地址,若有就通过这个IP地址访问此网站,若没有则把解析请求发送到本机设置的代理DNS服务器上,代理DNS服务器会先查询本地的缓存查找是否有对应此域名的IP地址,如果有则把该域名解析的IP地址返回给客户端,客户端通过DNS服务返回的IP地址访问网站,如果没有则给发出请求的客户端做递归查询,最终返回一个对应该域名的IP地址返回给客户端,此时代理DNS服务器首先查找自己的资源记录找到全球13组根服务器IP地址,向其中的一组发出解析请求,跟服务器收到解析请求后会查询自己的资源记录发现这个域名是.com域管理的,就返回代理DNS服务器.com域服务器的IP地址,代理DNS服务器收到返回的IP地址后在把解析请求发送至.com这台服务器,.com服务器重复上面步骤返回.test域服务器的IP地址给代理DNS服务器,代理DNS在发解析请求给.test服务器,接着.test服务器返回了www这台主机的IP地址给代理DNS服务器。代理服务器解析此域名IP地址的过程中发生的查询称为迭代查询,最后代理DNS把解析出来的IP地址返回给客户端,客户端通过解析出来的IP地址访问www.test.com这个网站。
DNS查询类型 递归查询:一次查询就能得到最终结果
迭代查询:一次查询需要发起多次查询请求
搭建DNS主从服务器
主DNS服务器IP地址192.168.20.5
从DNS服务器IP地址192.168.20.6
系统环境:centos6.6 测试时要要关闭防火墙和selinux
软件环境:bind 提供服务,bind-libs 提供函数库, bind-utils 提供测试工具
dns服务默认监听tcp和udp的53号端口
主服务器的区域解析库文件中必须有一条NS记录是指向从服务器
软件包安装的版本主和从服务器最好保持一致,如不能保持一致则从服务器版本高于主服务器版本
bind-9.8.2-0.37.rc1.el6_7.6.i686.rpm
bind-libs-9.8.2-0.37.rc1.el6_7.6.i686.rpm
bind-utils-9.8.2-0.37.rc1.el6_7.6.i686.rpm
安装软件包
在主和从DNS服务器上安装上面软件包
[root@centos ~]# yum install bind -y[root@centos ~]# yum install bind-libs -y[root@centos ~]# yum install bind-utils -y
配置主DNS服务器
[root@centos ~]# cp /etc/named.conf /etc/named.conf.bak #备份
编辑主服务器配置文件/etc/named.conf
[root@centos ~]# vim /etc/named.conf options { listen-on port 53 { 192.168.20.5;127.0.0.1; }; //配置监听的IPv4地址 listen-on-v6 port 53 { ::1; }; //监听的IPv6地址 directory "/var/named"; //区域解析库文件位置 allow-query { any; }; //允许所有客户机查询 allow-transfer { 192.168.20.6; }; //允许那些IP做区域传送 recursion yes; //允许递归查询}; logging { channel default_debug { file "data/named.run"; severity dynamic; };}; zone "." IN { type hint; file "named.ca";}; zone "www.test.com" IN { //增加正向区域 type master; //类型是master file "test.com.zone"; //正向解析库文件名}; zone "20.168.192.in-addr.arpa" IN { //增加反向区域 type master; //类型是master file "20.168.192.arpa"; //反向解析库文件名};//include "/etc/named.rfc1912.zones"; //注释掉样例include "/etc/named.root.key";
编辑正向解析库文件vim /var/named/test.com.zone
[root@centos named]# cat test.com.zone $TTL 86400$ORIGIN test.com.@ IN SOA www.test.com. admin.test.com ( 2016012501 #版本号 1H #刷新时间 3M #重试时间 1D #过期时间 1W ) #否定答案的TTL值 IN NS ns1.test.com. IN NS ns2.test.com.ns1 IN A 192.168.20.5ns2 IN A 192.168.20.6 www IN A 192.168.20.5
编辑反向解析库文件vim /var/named/20.168.192.arpa
[root@centos named]# cat 20.168.192.arpa $TTL 86400$ORIGIN 20.168.192.in-addr.arpa.@ IN SOA www.test.com. admin.test.com ( 2016012501 1H 3M 1D 1W ) IN NS ns1.test.com. IN NS ns2.test.com.5 IN PTR www.test.com.6 IN PTR www.test.com.
修改属组
[root@centos named]# chown :named test.com.zone [root@centos named]# chown :named 20.168.192.arpa
启动服务
[root@centos ~]# service named start启动 named: 查看服务状态 [确定][root@centos ~]# service named statusversion: 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.6CPUs found: 1worker threads: 1number of zones: 16debug level: 0xfers running: 0xfers deferred: 0soa queries in progress: 0query logging is OFFrecursive clients: 0/0/1000tcp clients: 0/100server is up and runningnamed (pid 10147) 正在运行...
查看端口是否监听
[root@centos ~]# ss -tulan |grep ":53"udp UNCONN 0 0 192.168.20.5:53 *:* udp UNCONN 0 0 127.0.0.1:53 *:* udp UNCONN 0 0 ::1:53 :::* tcp LISTEN 0 3 ::1:53 :::* tcp LISTEN 0 3 192.168.20.5:53 *:* tcp LISTEN 0 3 127.0.0.1:53 *:* [root@centos ~]# service iptables stop #关闭防火墙iptables:将链设置为政策 ACCEPT:filter [确定]iptables:清除防火墙规则: [确定]iptables:正在卸载模块: [确定]
测试解析一下
正解
[root@centos ~]# dig -t A www.test.com @192.168.20.5 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.6 <<>> -t A www.test.com @192.168.20.5;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51365;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION:;www.test.com.INA ;; ANSWER SECTION:www.test.com.86400INA192.168.20.5 ;; AUTHORITY SECTION:test.com.86400INNSns1.test.com.test.com.86400INNSns2.test.com. ;; ADDITIONAL SECTION:ns1.test.com.86400INA192.168.20.5ns2.test.com.86400INA192.168.20.6 ;; Query time: 3 msec;; SERVER: 192.168.20.5#53(192.168.20.5);; WHEN: Wed Feb 3 16:59:56 2016;; MSG SIZE rcvd: 114
反解
[root@centos ~]# dig -x 192.168.20.5 @192.168.20.5 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.6 <<>> -x 192.168.20.5 @192.168.20.5;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8879;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION:;5.20.168.192.in-addr.arpa.INPTR ;; ANSWER SECTION:5.20.168.192.in-addr.arpa. 86400 INPTRwww.test.com. ;; AUTHORITY SECTION:20.168.192.in-addr.arpa. 86400INNSns2.test.com.20.168.192.in-addr.arpa. 86400INNSns1.test.com. ;; ADDITIONAL SECTION:ns1.test.com.86400INA192.168.20.5ns2.test.com.86400INA192.168.20.6 ;; Query time: 4 msec;; SERVER: 192.168.20.5#53(192.168.20.5);; WHEN: Wed Feb 3 17:00:24 2016;; MSG SIZE rcvd: 137
至此主DNS服务器配置完毕
配置从DNS服务器
[root@centos ~]# cp /etc/named.conf /etc/named.conf.bak #备份
编辑从服务器配置文件/etc/named.conf
[root@centos ~]# vim /etc/named.conf options { listen-on port 53 { 192.168.20.6;127.0.0.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; allow-query { any; }; recursion yes;}; logging { channel default_debug { file "data/named.run"; severity dynamic; };}; zone "." IN { type hint; file "named.ca";}; zone "test.com" IN { #增加正向区域 type slave; #类型是slave file "slaves/test.com.zone"; #存放位置为/var/named/slaves masters { 192.168.20.5; }; #同步的主DNS服务器地址}; zone "20.168.192.in-addr.arpa" IN { #增加反向区域 type slave; file "slaves/20.168.192.arpa"; masters { 192.168.20.5; };}; //include "/etc/named.rfc1912.zones"; #注释掉include "/etc/named.root.key";
从DNS服务器都是从主DNS服务器上同步区域解析库文件,因此不用在从服务器上创建区域解析库文件。至此从DNS服务器也配置完毕
启动从DNS服务器的服务
[root@centos slaves]# service named start启动 named:named:正在运行 [确定]
主DNS服务器重启服务从DNS服务器会到主服务器上同步区域解析库文件
查看一下主DNS服务器的日志
[root@centos ~]# service named restart停止 named:. [确定]启动 named: [确定][root@centos ~]# tail /var/log/messagesFeb 3 17:13:31 centos named[11163]: zone test.com/IN: loaded serial 2016012501Feb 3 17:13:31 centos named[11163]: managed-keys-zone ./IN: loaded serial 2Feb 3 17:13:31 centos named[11163]: runningFeb 3 17:13:31 centos named[11163]: zone 20.168.192.in-addr.arpa/IN: sending notifies (serial 2016012501)Feb 3 17:13:31 centos named[11163]: zone test.com/IN: sending notifies (serial 2016012501)Feb 3 17:13:46 centos named[11163]: client 192.168.20.6#43894: transfer of '20.168.192.in-addr.arpa/IN': AXFR startedFeb 3 17:13:46 centos named[11163]: client 192.168.20.6#43894: transfer of '20.168.192.in-addr.arpa/IN': AXFR endedFeb 3 17:13:47 centos named[11163]: client 192.168.20.6#51481: transfer of 'test.com/IN': AXFR startedFeb 3 17:13:47 centos named[11163]: client 192.168.20.6#51481: transfer of 'test.com/IN': AXFR endedFeb 3 17:13:47 centos named[11163]: client 192.168.20.6#25451: received notify for zone 'test.com'
查看从DNS的解析库存放目录
[root@centos ~]# ls /var/named/slaves/20.168.192.arpa test.com.zone
用从DNS服务器做一下解析测试
[root@centos ~]# ifconfig eth1 Link encap:Ethernet HWaddr 00:0C:29:5B:C5:87 inet addr:192.168.20.6 Bcast:192.168.20.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe5b:c587/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:911232 errors:0 dropped:0 overruns:0 frame:0 TX packets:20046 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:89448459 (85.3 MiB) TX bytes:2183673 (2.0 MiB) Interrupt:19 Base address:0x2000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:260 errors:0 dropped:0 overruns:0 frame:0 TX packets:260 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:28332 (27.6 KiB) TX bytes:28332 (27.6 KiB)
正解
[root@centos ~]# dig -t A www.test.com @192.168.20.6 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.6 <<>> -t A www.test.com @192.168.20.6;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23711;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION:;www.test.com.INA ;; ANSWER SECTION:www.test.com.86400INA192.168.20.5 ;; AUTHORITY SECTION:test.com.86400INNSns1.test.com.test.com.86400INNSns2.test.com. ;; ADDITIONAL SECTION:ns1.test.com.86400INA192.168.20.5ns2.test.com.86400INA192.168.20.6 ;; Query time: 1 msec;; SERVER: 192.168.20.6#53(192.168.20.6);; WHEN: Wed Feb 3 17:28:22 2016;; MSG SIZE rcvd: 114
反解
[root@centos ~]# dig -x 192.168.20.5 @192.168.20.6 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.6 <<>> -x 192.168.20.5 @192.168.20.6;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10798;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION:;5.20.168.192.in-addr.arpa.INPTR ;; ANSWER SECTION:5.20.168.192.in-addr.arpa. 86400 INPTRwww.test.com. ;; AUTHORITY SECTION:20.168.192.in-addr.arpa. 86400INNSns1.test.com.20.168.192.in-addr.arpa. 86400INNSns2.test.com. ;; ADDITIONAL SECTION:ns1.test.com.86400INA192.168.20.5ns2.test.com.86400INA192.168.20.6 ;; Query time: 3 msec;; SERVER: 192.168.20.6#53(192.168.20.6);; WHEN: Wed Feb 3 17:27:01 2016;; MSG SIZE rcvd: 137
主NDS更新test.com.zone内容,通知从DNS服务器更新
[root@centos named]# cat test.com.zone $TTL 86400$ORIGIN test.com.@INSOAwww.test.com.admin.test.com (2016012502 #版本号修改为021H3M1D1W )INNSns1.test.com.INNSns2.test.com.ns1INA192.168.20.5ns2INA192.168.20.6wwwINA192.168.20.5*INA192.168.20.3 #新增记录[root@centos named]# rndc reloadserver reload successful[root@centos named]# dig -t axfr test.com @192.168.20.6 #通知从DNS更新; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.6 <<>> -t axfr test.com @192.168.20.6;; global options: +cmdtest.com.86400INSOAwww.test.com. admin.test.com.test.com. 2016012502 3600 180 86400 604800test.com.86400INNSns1.test.com.test.com.86400INNSns2.test.com.*.test.com.86400INA192.168.20.3ns1.test.com.86400INA192.168.20.5ns2.test.com.86400INA192.168.20.6www.test.com.86400INA192.168.20.5test.com.86400INSOAwww.test.com. admin.test.com.test.com. 2016012502 3600 180 86400 604800;; Query time: 9 msec;; SERVER: 192.168.20.6#53(192.168.20.6);; WHEN: Thu Feb 4 10:44:49 2016;; XFR size: 8 records (messages 1, bytes 219)[root@centos named]# tail -15 /var/log/messages #查看主DNS日志Feb 4 10:43:02 centos named[11644]: client 192.168.20.6#39514: transfer of 'test.com/IN': AXFR endedFeb 4 10:44:21 centos named[11644]: client 192.168.20.5#50110: zone transfer 'test.com/AXFR/IN' deniedFeb 4 10:44:42 centos named[11644]: received control channel command 'reload'Feb 4 10:44:42 centos named[11644]: loading configuration from '/etc/named.conf'Feb 4 10:44:42 centos named[11644]: using default UDP/IPv4 port range: [1024, 65535]Feb 4 10:44:42 centos named[11644]: using default UDP/IPv6 port range: [1024, 65535]Feb 4 10:44:42 centos named[11644]: sizing zone task pool based on 3 zonesFeb 4 10:44:42 centos named[11644]: Warning: 'empty-zones-enable/disable-empty-zone' not set: disabling RFC 1918 empty zonesFeb 4 10:44:42 centos named[11644]: reloading configuration succeededFeb 4 10:44:42 centos named[11644]: reloading zones succeededFeb 4 10:44:42 centos named[11644]: zone test.com/IN: loaded serial 2016012502Feb 4 10:44:42 centos named[11644]: zone test.com/IN: sending notifies (serial 2016012502)Feb 4 10:44:42 centos named[11644]: client 192.168.20.6#45760: transfer of 'test.com/IN': AXFR-style IXFR startedFeb 4 10:44:42 centos named[11644]: client 192.168.20.6#45760: transfer of 'test.com/IN': AXFR-style IXFR endedFeb 4 10:44:43 centos named[11644]: client 192.168.20.6#30065: received notify for zone 'test.com'
查看从DNS日志
[root@centos slaves]# tail /var/log/messagesFeb 4 10:44:00 centos named[8866]: client 192.168.20.5#51758: transfer of 'test.com/IN': AXFR startedFeb 4 10:44:00 centos named[8866]: client 192.168.20.5#51758: transfer of 'test.com/IN': AXFR endedFeb 4 10:44:37 centos named[8866]: client 192.168.20.5#55779: received notify for zone 'test.com'Feb 4 10:44:37 centos named[8866]: zone test.com/IN: Transfer started.Feb 4 10:44:37 centos named[8866]: transfer of 'test.com/IN' from 192.168.20.5#53: connected using 192.168.20.6#45760Feb 4 10:44:37 centos named[8866]: zone test.com/IN: transferred serial 2016012502Feb 4 10:44:37 centos named[8866]: transfer of 'test.com/IN' from 192.168.20.5#53: Transfer completed: 1 messages, 8 records, 219 bytes, 0.006 secs (36500 bytes/sec)Feb 4 10:44:37 centos named[8866]: zone test.com/IN: sending notifies (serial 2016012502)Feb 4 10:44:43 centos named[8866]: client 192.168.20.5#45240: transfer of 'test.com/IN': AXFR startedFeb 4 10:44:43 centos named[8866]: client 192.168.20.5#45240: transfer of 'test.com/IN': AXFR ended[root@centos slaves]# pwd/var/named/slaves[root@centos slaves]# ls20.168.192.arpa test.com.zone[root@centos slaves]# cat test.com.zone $ORIGIN .$TTL 86400; 1 daytest.comIN SOAwww.test.com. admin.test.com.test.com. (2016012502 ; serial3600 ; refresh (1 hour)180 ; retry (3 minutes)86400 ; expire (1 day)604800 ; minimum (1 week))NSns1.test.com.NSns2.test.com.$ORIGIN test.com.*A192.168.20.3ns1A192.168.20.5ns2A192.168.20.6wwwA192.168.20.5
到此DNS主从服务器配置完成