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 1 2 3 4 5 6 7 8 9 10
d 删除指定范围的行,示例中删除4到9行
[root@centos tmp]# sed '4,9d' a.txt 1 2 3 10
p 显示指指定的行,示例中显示4到7行
[root@centos tmp]# sed -n '4,7p' a.txt 4 5 6 7
a 在行后面追加文本,示例在第一行后加一行字符串centos
[root@centos tmp]# sed '1a\centos' a.txt 1 centos 2 3 4 5 6 7 8 9 10
i 在行前面插入文本,示例在第一行前加一行字符串centos
[root@centos tmp]# sed '1i\centos' a.txt centos 1 2 3 4 5 6 7 8 9 10
一次插入多行用\n分隔
[root@centos tmp]# sed '2a\centos\ncentos' a.txt 1 2 centos centos 3 4 5 6 7 8 9 10
c 替换行为单行或多行文本,示例中将3-7行都替换为字符串drop line和no line
[root@centos tmp]# sed '3,7c drop line \nno line' a.txt 1 2 drop line no line 8 9 10
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 3 4 5 6
r 读取文件到符合匹配条件的每一行后,示例中读取b.txt中内容插入到a.txt文件中第4行后
[root@centos tmp]# cat b.txt centos [root@centos tmp]# sed '4r b.txt' a.txt 1 2 3 4 centos 5 6 7 8 9 10
! 对匹配的条件取反
显示1到5行内容
[root@centos tmp]# sed -n '1,5p' a.txt 1 2 3 4 5
显示1到5行之外行的内容
[root@centos tmp]# sed -n '1,5!p' a.txt 6 7 8 9 10
s/// 替换,可将///换成@@@ ###;示例中把a.txt中第7行内容替换为seven
[root@centos tmp]# sed 's/7/seven/g' a.txt 1 2 3 4 5 6 seven 8 9 10
练习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/sda default=0 timeout=5 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz hiddenmenu title 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/sda default=0 timeout=5 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz hiddenmenu title 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
练习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 1 UUID=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 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 LABEL='TEST' /testingext4defaults,acl0 0 LABEL='HUGE'/mogdataext3defaults0 0
[root@centos ~]# sed 's/^#[[:space:]]\+//' /etc/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 1 UUID=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 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 LABEL='TEST' /testing ext4 defaults,acl 0 0 LABEL='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 #显示偶数行 2 4 6 8 10 [root@centos tmp]# sed '1!G;h;$!d' a.txt #逆向显示文件内容 10 9 8 7 6 5 4 3 2 1 [root@centos tmp]# sed '$!N;$!D' a.txt #取出文件后两行 9 10 [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 #显示奇数行 1 3 5 7 9
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/bash bin 1 /sbin/nologin daemon 2 /sbin/nologin adm 3 /sbin/nologin lp 4 /sbin/nologin sync 5 /bin/sync shutdown 6 /sbin/shutdown halt 7 /sbin/halt mail 8 /sbin/nologin uucp 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/nologin saslauth|499|/sbin/nologin postfix|89|/sbin/nologin sshd|74|/sbin/nologin named|25|/sbin/nologin
例:把/etc/passwd中第一行记录中的每一列放入一列中(行转列)
[root@localhost ~]# head -1 /etc/passwd root:x:0:0:root:/root:/bin/bash [root@localhost ~]# head -1 /etc/passwd |awk 'BEGIN{RS=":";ORS="\n"}{print}' root x 0 0 root /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 head root 0 /bin/bash bin 1 /sbin/nologin daemon 2 /sbin/nologin adm 3 /sbin/nologin lp 4 /sbin/nologin the 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/passwd bin daemon adm lp sync shutdown halt mail uucp
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/passwd root or Sysuser: root root or Sysuser: bin root or Sysuser: daemon root or Sysuser: adm root or Sysuser: lp root or Sysuser: sync root or Sysuser: shutdown root or Sysuser: halt root or Sysuser: mail root or Sysuser: uucp root or Sysuser: operator root or Sysuser: games root or Sysuser: gopher root or Sysuser: ftp root or Sysuser: nobody root or Sysuser: vcsa root or Sysuser: saslauth root or Sysuser: postfix root or Sysuser: sshd root or Sysuser: named Common user: user11 [root@localhost ~]# awk -F:'{if($NF=="/bin/bash") print $1}' /etc/passwd root user11 [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 1 UUID=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 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /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++)) do echo "$RANDOM" done | sort -n [root@centos tmp]# bash random.sh #执行效果 287 8594 10708 12135 14590 16275 16969 23126 23782 24945 [root@centos tmp]# cat random1.sh #冒泡法 #/bin/bash # declare -a rand for((i=0;i<10;i++)) do rand[$i]=$RANDOM #echo ${rand[$i]} done echo "生成10个随机数:" echo ${rand[*]} for((i=0;i<9;i++));do for((j=9;j>i;j--));do if [ ${rand[j]} -lt ${rand[j-1]} ];then tmp=${rand[j]} rand[j]=${rand[j-1]} rand[j-1]=$tmp fi done done echo "对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/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # 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 "请输入一个路径:" lujing if [ -f $lujing ] then echo $lujing is exist ls -l $lujing elif [ -d $lujing ] then echo $lujing is exist ls -dl $lujing else mkdir -p $lujing echo "路径$lujing已创建完成" ls -dl $lujing fi [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 exist drwxr-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 echo done [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.5 ns2 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 status version: 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.6 CPUs found: 1 worker threads: 1 number of zones: 16 debug level: 0 xfers running: 0 xfers deferred: 0 soa queries in progress: 0 query logging is OFF recursive clients: 0/0/1000 tcp clients: 0/100 server is up and running named (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.5 ns2.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.5 ns2.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/messages Feb 3 17:13:31 centos named[11163]: zone test.com/IN: loaded serial 2016012501 Feb 3 17:13:31 centos named[11163]: managed-keys-zone ./IN: loaded serial 2 Feb 3 17:13:31 centos named[11163]: running Feb 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 started Feb 3 17:13:46 centos named[11163]: client 192.168.20.6#43894: transfer of '20.168.192.in-addr.arpa/IN': AXFR ended Feb 3 17:13:47 centos named[11163]: client 192.168.20.6#51481: transfer of 'test.com/IN': AXFR started Feb 3 17:13:47 centos named[11163]: client 192.168.20.6#51481: transfer of 'test.com/IN': AXFR ended Feb 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.5 ns2.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.5 ns2.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 #版本号修改为02 1H 3M 1D 1W ) INNSns1.test.com. INNSns2.test.com. ns1INA192.168.20.5 ns2INA192.168.20.6 wwwINA192.168.20.5 *INA192.168.20.3 #新增记录 [root@centos named]# rndc reload server 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: +cmd test.com.86400INSOAwww.test.com. admin.test.com.test.com. 2016012502 3600 180 86400 604800 test.com.86400INNSns1.test.com. test.com.86400INNSns2.test.com. *.test.com.86400INA192.168.20.3 ns1.test.com.86400INA192.168.20.5 ns2.test.com.86400INA192.168.20.6 www.test.com.86400INA192.168.20.5 test.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 ended Feb 4 10:44:21 centos named[11644]: client 192.168.20.5#50110: zone transfer 'test.com/AXFR/IN' denied Feb 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 zones Feb 4 10:44:42 centos named[11644]: Warning: 'empty-zones-enable/disable-empty-zone' not set: disabling RFC 1918 empty zones Feb 4 10:44:42 centos named[11644]: reloading configuration succeeded Feb 4 10:44:42 centos named[11644]: reloading zones succeeded Feb 4 10:44:42 centos named[11644]: zone test.com/IN: loaded serial 2016012502 Feb 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 started Feb 4 10:44:42 centos named[11644]: client 192.168.20.6#45760: transfer of 'test.com/IN': AXFR-style IXFR ended Feb 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/messages Feb 4 10:44:00 centos named[8866]: client 192.168.20.5#51758: transfer of 'test.com/IN': AXFR started Feb 4 10:44:00 centos named[8866]: client 192.168.20.5#51758: transfer of 'test.com/IN': AXFR ended Feb 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#45760 Feb 4 10:44:37 centos named[8866]: zone test.com/IN: transferred serial 2016012502 Feb 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 started Feb 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]# ls 20.168.192.arpa test.com.zone [root@centos slaves]# cat test.com.zone $ORIGIN . $TTL 86400; 1 day test.comIN SOAwww.test.com. admin.test.com.test.com. ( 2016012502 ; serial 3600 ; 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.3 ns1A192.168.20.5 ns2A192.168.20.6 wwwA192.168.20.5
到此DNS主从服务器配置完成