1、描述centos6系统开机启动流程;
(1):首先按下开机按钮,POST:电源加电,计算机通过BIOS来调用CMOS中各个硬件设备的配置信息。
CMOS:CMOS是集成在主板上的一块可读写的RAM芯片,主要是用来保存当前系统硬件配置和操作人员对某些参数的设定,由于主板给CMOS提供也一块单独供电的电池,所以无论系统是关机还是突然断电,CMOS的设定是不会丢失的。
BIOS:由于CMOS芯片只是一块存储器,只具有保存数据的功能,所以计算机厂商把CMOS设置程序做到了BIOS里面,开机按下特定的按钮就能进入其中进行查看和设置,所以CMOS设置人们也叫做BIOS设置。
(2):BIOS会执行开机自检,然后开始执行硬件检测和初始化,之后BIOS根据boot Sequence按次序查找各引导设备有没有MBR,第一个找到MBR的设备即为本次启动要用到的设备
MBR:MBR即主引导记录,硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT和分区有效标志。在总共512字节的主引导扇区里主引导程序(boot loader)占446个字节,第二部分是分区表,即DPT,占64个字节。第三部分是magicnumber,占2个字节。
(3):读取并执行第一个启动设备内MBR的bootLoader(即grub等程序)。
GRUB:他的作用提供一个菜单,允许用户选择要启动系统或不同的内核版本,把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核;
GRUB分为三个阶段:stage 1,stage1.5, stage 2
当进入系统秒读的时候,按下任意键就能进入GRUB选择菜单界面,如下图
提示按下e健可以进入编辑模式,如下图
方框内第一行代表boot目录所在的位置,此处为第一个磁盘第一个分区,
方框内第二行表示内核所在位置以及版本号
方框内第三行是一个虚拟文件系统,可通过这个文件系统可找到根分区位置 以方便内 核找到根分区、init程序、以及必要的驱动程序、库文件
在这个见面中,选择一个选项按下e健,表示对你选择的选项进行修改,比如选择第一 行如下图:
在图一和图二界面中直接按下c健可以直接进入GRUB命令行界面,这里可以手动指定内核和initrd。
(4)GRUB通过GRUB2找到内核,GRUB将CPU的控制权交给内核,CPU将控制器转交给内核,内核首先进行自身初始化,包括探测可识别到的所有硬件设备;加载硬件驱动程序;(有可能会借助于ramdisk加载驱动);以只读方式挂载根文件系统;运行用户空间的第一个应用程序:/sbin/init;
因为kernel无法识别磁盘,所以要借助ramdisk(虚拟文件系统)的获取磁盘的驱动程序。CentOS 6中的虚拟文件系统是initramfs,内核通过该程序加载启动过程中所需要的内核模块,也就是USB,RAID,LVM。SCSI等文件系统与硬盘接口的驱动程序,等加载完成之后,内核就会调用/sbin/init来开始后续的正常启动流程
(5)调用/sbin/init程序
/sbin/init最主要的功能就是主板软件执行的环境,其配置文件是/etc/inittab和/etc/init/*.conf
/etc/inittab:这里面定义了系统启动的执行等级,系统初始化流程的文件,七个运行等级需要启动的服务路径;
run level 运行等级:
init 0:表示关机
init 1:单用户模式(root, 无须登录),系统出问题时的维护
init 2:多用户模式,会启动网络功能,但不会启动NFS
init 3:多用户模式,纯文本界面;
init 4:预留级别;
init 5:多用户模式,图形界面;
init6:表示重启
id:3:initdefault: 表示默认开机级别为3,自动进入命令行界面
si::sysinit:/etc/rc.d/rc.sysinit 系统初始化环境执行的脚本文件路径
七个不同级别要启动的script路径
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
(6)系统初始化
(a) 设置主机名
(b) 设置欢迎界面
(c) 激活udev和selinux
(d) 挂载/etc/fstab文件中定义的文件系统
(e) 检测根文件系统,并以读写方式重新挂载根文件系统
(f) 设置系统时钟
(g) 激活swap设备
(h) 根据/etc/sysctl.conf文件设置内核参数
(i) 激活lvm及software raid设备(硬raid是在开机时启动的)
(j) 加载额外设备驱动程序
(k) 清理操作
(7)执行 /etc/rc.d/rc 脚本
此脚本用来来控制系统启动的时候启动或者关闭那些服务,这些脚本是否开机自启动,可由 chkconfig 命令来管理。
(8)最后会执行 /bin/login 登录用户。至此系统启动过程完成。
2、描述/etc/rc.d/rc.sysinit脚本功能;
(1)、获取主机名,读取/etc/sysconfig/network配置文件,获取主机的默认网关的网络环境
(2)、测试与挂在内核设备/proc记忆USB设备/sys,如果有USB设备则会主动加载USB设备的驱动程序,并且挂在USB的文件系统
(3)、是否启动SELinux
(4)、启动系统的随机数生成器,随机数生成器可以帮助系统进行一些密码演算的功能,在此需要启动两次随机数生成器。
(5)、设置屏幕的默认字体
(6)、设置启动是的欢迎界面
(7)、设置系统时间和时区
(8)、设备接口的检测
(9)、用户自定义模块的加载
用户可在/etc/sysconfi.modules/*.modules中加入自定义的模块
(10)、加载内核相关信息
系统会主动读取/etc/sysctl.conf配置文件里面的设置值
(11)、设置主机名和初始化电源管理模块
(12)、初始化软件磁盘阵列,主要通过/etc/mdadm.conf来设置
(13)、初始化LVM的文件系统功能
(14)、以fsck检测磁盘文件系统
(15)、重新以可读写模式挂载系统磁盘
(16)、启动quota(显示磁盘使用情况和配额)功能,
(17)、启动系统伪随机数生成器
(18)、清楚系统启动过程的临时文件
(19)、将启动相关信息加载/va/log/dmesg文件中
3、总结文本处理工具sed及awk的用法;(必须附带示例)
这里以/data/sed.test文件为例
cat /data/sed.test
Hello word!
My name is LouIS
Never forget to say “thanks”.
Believe in yourself.
I can because i think i can.
Never say die.
sed:
sed是一个行编辑器,他不会编辑原文件,而是一次读取一行到sed自己的缓存空间,这个缓存空间叫做模式空间,sed在模式空间完成编辑之后,将编辑之后的内容打印至屏幕或者指向目标文件,他不做原地编辑。如果不是删除命令,大多数编辑的内容都会打印至屏幕。
sed还有一个保持空间,前一个sed编辑没有完成要处理下一个sed编辑,把之前一个保存在sed的保持空间里。
语法格式:sed [OPTION]... ‘sed脚本’ inputfile...
[OPTION]: 常用选项
-n:静默模式,默认sed会输出模式空间里面的内容,-n是不输出模式空间类容至屏幕,除非单独指定的类容
-e:多点编辑功能,在一个sed命令实现过个编辑操作
-f:-f/path/to/script_file:从指定文件中读取编辑脚本
-r:支持使用扩展的正则表达式
-i:原处编辑,就是修改原文件
地址定界原理:
1、不给地址:对全文进行处理
如果不给指定的行,或者范围,sed命令将对全文进行处理
2、只给一个地址:单地址
#:数字,指定的行
这个地方指数字,代表行
/pattern/:被此处模式所能够匹配到的每一行
这里表示匹配的字符串所在的行
3、地址范围:
#,#
指定行之间,例如1,5 表示第一行到第五行
#,+#
例如:1,+3表示第一行到加上3的行数之间
4、~步进
1~2,显示基数行
2~2,显示偶数行
sed脚本的编辑子命令
1、d:表示删除给定的行
示例:
删除/data/sed.test文件中以Never开头的行
[root@localhost data]# sed'/^Never/d' /data/sed.test Helloword! Myname is LouIS Believein yourself. I can because i think i can.
删除/data/sed.test文件中第2行
[root@localhostdata]# sed '2d' /data/sed.test Helloword! Neverforget to say “thanks”. Believein yourself. Ican because i think i can. Never say die.
删除/data/sed.test文件中第2-5行
[root@localhostdata]# sed '2,5d' /data/sed.test Helloword! Never say die.
2、p:显示模式空间中匹配到的行的内容
示例:
sed '/^root/p' /data/sed.test [root@localhostdata]# sed '/^Never/p' /data/sed.test Helloword! Myname is LouIS Neverforget to say “thanks”. Neverforget to say “thanks”. Believein yourself. Ican because i think i can. Neversay die. Never say die.
这个命令显示文件所有内容,并且把匹配到的行打印两遍,因为他是打印命令,不过不知名需要打印内容,默认全部显示,所以p命令一般跟-n参数一起使用
[root@localhostdata]# sed -n '/^Never/p' /data/sed.test Neverforget to say “thanks”. Never say die.
3、a :追加文本之符合条件行的下一行,支持多行追加 格式:a \text
示例:
在/data/sed.test文件中Never开头的行下面追加Long live China
[root@localhostdata]# sed '/^Never/a \Long live China' /data/sed.test Helloword! Myname is LouIS Neverforget to say “thanks”. Longlive China Believein yourself. Ican because i think i can. Neversay die. Long live China
4、i:在符合条件行的上一行添加一行,支持多行添加 格式:i \text
示例
在/data/sed.test文件中Never开头的行上面面追加Long live China
sed '/^Never/i \Long live China' /data/sed.test [root@localhost~]# sed '/^Never/i \Long live China' /data/sed.test Helloword! Myname is LouIS Longlive China Neverforget to say “thanks”. Believein yourself. Ican because i think i can. Longlive China Never say die.
5、c:把符合条件的行替换成指定的行,支持多行替换 格式:c \text
示例:
把/data/sed.test文件中以Never开头的行替换成Long live China
[root@localhost~]# sed '/^Never/c \Long live China' /data/sed.test Helloword! Myname is LouIS Longlive China Believein yourself. Ican because i think i can. Long live China
6、w:把符合条件内容的行另存为指定文件中 格式:w /path/to/some
示例:
把/data/sed.test文件以Never开头的行另存为/data/sed.test1里面
[root@localhost data]# sed -n '/^Never/w /data/sed.test1'/data/sed.test [root@localhostdata]# cat /data/sed.test1 Neverforget to say “thanks”. Never say die.
7、r:读取指文件的内容,放置符合条件行的后面 格式:r /path/to/some
示例:
把/etc/sysconfig/network-scripts/ifcfg-eth0文件内容放置/data/sed.test文件中以Never开头行的后面
[root@localhostdata]# sed '/^Never/r /etc/sysconfig/network-scripts/ifcfg-eth0' /data/sed.test Helloword! Myname is LouIS Neverforget to say “thanks”. DEVICE=eth0 HWADDR=00:0C:29:E7:CA:5F TYPE=Ethernet UUID=5004c3f9-33d7-42e9-9e6d-5a947988174d ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=dhcp Believein yourself. Ican because i think i can. Neversay die. DEVICE=eth0 HWADDR=00:0C:29:E7:CA:5F TYPE=Ethernet UUID=5004c3f9-33d7-42e9-9e6d-5a947988174d ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=dhcp
8、=:显示符合条件行的行号
显示/data/sed.test文件有Never字符串行的行号
[root@localhostdata]# sed '/Never/=' /data/sed.test Helloword! Myname is LouIS 3 Neverforget to say “thanks”. Believein yourself. Ican because i think i can. 6 Never say die.
只显示行号则可以加上-n参数
9、!:取反条件,他是对地址定界去反
示例:
删除/data/sed.test文件中不是以Never开头的所有行
[root@localhostdata]# sed '/^Never/!d' /data/sed.test Neverforget to say “thanks”. Never say die.
10、s:查找和替换
格式:s/原内容/替换后的内容/ 也可以是用其他分隔符@@@,###等
把/data/sed.test内容中Never字符删了
[root@localhostdata]# sed 's#Never##' /data/sed.test Helloword! Myname is LouIS forget to say “thanks”. Believein yourself. Ican because i think i can. saydie.
把/data/sed.test内容中name改为大写
[root@localhostdata]# sed 's@name@NAME@' /data/sed.test Helloword! MyNAME is LouIS Neverforget to say “thanks”. Believein yourself. Ican because i think i can. Never say die.
把/data/sed.test内容Never字符串后面加空格和China
[root@localhostdata]# sed 's/Never/& China/' sed.test Helloword! Myname is LouIS NeverChina forget to say “thanks”. Believein yourself. Ican because i think i can. Never China say die.
&表示原内容
sed高级编辑命令:
h:把模式空间中的内容行覆盖至保持空间中,保持空间的内容行会丢失
H:把模式空间中的内容行追加至保持空间中,保持空间的内容行不会丢失
g:从保持空间取出内容行覆盖至模式空间
G:从保持空间取出内容行追加至模式空间
x:把模式空间的内容行与保持空间的内容行进行互换
n:读取匹配到行的下一行至模式空间
N:追加匹配到行的下一行至模式空间
d:删除模式空间中的行,
D:删除多行模式空间中的所有行
一些表达式
sed-n 'n;p' /etc/passwd 显示偶数行
sed '1!G;h;$!d' /etc/passwd 逆向显示文件内容
sed'$!N;$!D' /etc/passwd 显示文件后两行
sed '$!d' /etc/passwd想・ 显示文件最后一行
sed 'G' /etc/passwd 在每一行后面添加空白行
sed 'g' /etc/passwd 所有行都用空白代替
sed '/^$/d;G' /etc/passwd 在每一行添加一个空白行,多个空白行合并成一个空白行
sed 'n;d' /etc/passwd 显示基数行
sed -n '1!G;h;$p' /etc/passwd 逆向显示文件内容
awk:
awk是一个强大的文本分析工具, 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理.
awk有三个版本,一般未做说明的默认是gawk,也就是GNU版本的awk,在linux上使用awk默认就是gawk,awk是个符号连接,指向gawk。
基本用法:awk [option] 'program' FILE...
option:选项
-F:指明分隔符,如果不知名默认分隔符是空白字符
-v:var=value自定义变量
program:awk语句
pattern:模式,(后面再说)
action:动作
print:打印
printf:格式化打印
输出命令:
1、print:打印
格式:print item1,itme2...
print后面接字段item,这些item可以是数值也可以是字符串,变量或awk的表达式,多个字段要用都好隔开,如果不指定字段,默认全文打印。
示例:
打印/etc/passwd文件中第一字段和第四字段
awk -F: '{print $1,$4}' /etc/passwd root0 bin1 daemon2 adm3 lp 4 ...
2、变量
2.1、内建变量
FS:input field seperator 默认为空白字符
输入时使用的字段分隔符,也就是文件中要使用什么作为字段分隔的字符
显示/etc/passwd中第一字段和第六字段
awk -v FS=':' '{print $1,$6}' /etc/passwd,和-F的意思差不多 root/root bin/bin daemon/sbin adm/var/adm lp /var/spool/lpd
OFS:output field seperator 默认为空白字符
输出时使用的字段分隔符,输入至屏幕时用什么分隔符来分隔字段
显示/etc/passwd中第一字段和第六字段,并且用冒号分割输出内容
awk -v FS=':' -v OFS=':' '{print $1,$6}' /etc/passwd root:/root bin:/bin daemon:/sbin adm:/var/adm lp:/var/spool/lpd
RS:input record seperator
输入时的换行符
ORS:output record seperator
输出时的换行符
NF:number of field 默认分隔符为空白
每一行的字段数量
查看/etc/passwd每一行的字段数量
awk -F: '{print NF}' /etc/passwd cord 7 7 7 7 7 NR:number of record
文件中的行数
awk '{print NR}' /etc/passwd 1 2 3 4 5 6 ....
FNR:各文件分别计数,后面可以接不同文件
FILENAME:当前正在处理的文件的文件名
awk -F: '{print FILENAME }' /etc/passwd
ARGC:命令行参数的个数
awk -F: '{print ARGC}' /etc/passwd
ARGV:数组,保存的是命令行所给定的各参数,
查看你输入命令中参数,要用ARGV[0|1|2...]来实现
awk '{print ARGV[0]}' /etc/passwd awk awk ....
2.2、自定义变量
2.2.1、-v var=value变量名区分字符大小写
(2)在program中直接定义
3、printf命令
安装给定的格式输出匹配到的字段内容
格式:printf FORMAT,item1,item2...
3.1、FORMAT必须给出
3.2、printf不会自动换行,需要显示给出换行控制符:\n
3.4、FORMAT中需要分别给后面的每个item指定一个格式化符号
格式符:
%c:显示字符的ASCII码
%d,%i:显示十进制整数
%e,%E:科学计数法数值显示
%f,显示浮点数
%g,%G:以科学计数法或浮点形式显示数值
%s: 显示字符串
%u:无符号整数
%%:显示%自身
修饰符:是来修饰格式符的
#[.#]: 第一个数字用来控制显示的宽度,第二个字符表示小数点后的精度
3.1f
-: 左对齐
+:显示数值的符号
示例:
1、awk -F ':' '{printf "Username: %s\n",$1}' /etc/passwd Username:root Username: bin Username: daemon Username: adm ... 如果不给换行符:\n,显示内容如下: Username: rootUsername: binUsername: daemonUsername:admUsername: lpUsername: syncUsername: shutdownUsername: haltUsername:mailUsername: uucpUsername: operatorUsername: gamesUsername: gopherUsername:ftpUsername: nobodyUsername: dbusUsername: usbmuxdUsername: vcsaUsername: rpcUsername:rtkitUsername: avahi-autoipdUsername: abrtUsername: rpcuserUsername: nfsnobodyUsername: haldaemonUsername:gdmUsername: ntpUsername: apacheUsername: saslauthUsername: postfixUsername:mysqlUsername: pulseUsername: sshdUsername: tcpdump
默认是不带换行的,所以必要的时候一定要加换行符
2、awk -F ':' '{printf"Username: %15s, UID: %d\n",$1,$3}' /etc/passwd Username: root, UID: 0 Username: bin, UID: 1 Username: daemon, UID: 2 Username: adm, UID: 3 默认是做对齐,如果要由对齐,如下 awk -F ':' '{printf"Username: %-15s, UID: %d\n",$1,$3}' /etc/passwd Username: root , UID: 0 Username: bin , UID: 1 Username: daemon , UID: 2 Username: adm , UID: 3 Username: lp , UID: 4
4、操作符
算术操作符:
x+y,x-y,x*y,x/y,x^y,x%y
-x
+x: 转换为数值
字符串操作符:没有符号操作符,表示字符串连接
赋值操作符:
=,+=,-=,*=,/=,%=,^=
++,--
比较操作符:
>,>=,<,<=,!=,==
模式匹配符:
~:左侧字符串是否能被右侧模式匹配
!~:相反
逻辑操作符:
&&:与
||:或
!:非
函数调用:
function_name(argu1,argu2...)
条件表达式:
selector?if-true-expression:if-flse-expression
示例:
判断是否是系统用户
awk -F ':''{$3>=500?usertype="Common User":usertype="Sysadmin orSysUser";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
5、PATTERN
5.1、empty:空模式,匹配每一行,以上示例用的都是这个模式
5.2、/regular expression/: 仅处理能够被此处模式匹配到的行
示例:仅处理root开头的行
awk '/^root/{print $1}'/etc/passwd root:x:0:0:root:/root:/bin/bash
还可以取反
awk '!/^root/{print $1}'/etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync ....
5.3、relational expression:关系表达式,结果有真有假
结果为真才被处理,结果为假被过滤掉
真:结果为非0值,非空字符串
假:1,空字符串
示例:
判断用户是否是系统用户
awk -F: '$3>=500{print$1,$3}' /etc/passwd nfsnobody 65534 user1 500 user2 501 user3 502 user4 503 user5 504 user6 505 user7 506 user8 507 user9 508 user10 509
显示shell为/bin/bash的用户名
awk -F: '$NF=="/bin/bash"{print$1,$NF}' /etc/passwd 或 awk -F: '$NF~/bash$/{print$1,$NF}' /etc/passwd root /bin/bash mysql /bin/bash user1 /bin/bash user2 /bin/bash user3 /bin/bash user4 /bin/bash user5 /bin/bash user6 /bin/bash user7 /bin/bash user8 /bin/bash user9 /bin/bash user10 /bin/bash
5.4、line ranges:行范围
/pat1/,/pat2/ 只支持字符串格式,
注意:不支持直接给出数字的格式
示例:
以root开头行开始到以tcp开头的行结束
awk -F: '/^root/,/^tcp/{print $1}'/etc/passwd或 awk -F: '(NR>=2&&NR<=10){print$1}' /etc/passwd
5.5、BEGIN/DEN模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次
在执行我们处理之前给出一个模式,他只执行一次,后面跟着执行的内容
示例
awk -F: 'BEGIN{print " username uid \n--------------------"}{print $1,$3}' /etc/passwd
END{}:仅在文件处理完成之后执行一次
awk -F: 'BEGIN{print " username uid \n--------------------"}{print $1,$3}END{print"==================\n end "}' /etc/passwd
这个有点自定义格式的意思
6、常用的action
6.1、Expressions
6.2、Control statements:if,while等
6.3、Conpound statements:组合语句:
6.4、input statements 输入语句
6.5、output statements 输出语句
4、写一个脚本,生成10个随机数,并按从小到大进行排序(要求至少使用2中方法);
[root@localhost data]# vim paixu1.sh #!/bin/bash for ((for i=1; i<=10; i++)); do echo $RANDOM done | sort -n [root@localhost data]# bash -n paixu1.sh [root@localhost data]# bash paixu1.sh 2771 5516 10587 14848 17526 22253 22798 23120 27576 32670
5、在每周二的凌晨1点5分执行脚本/data/get_username.sh,并将脚本的输出至/tmp/get_username.log日志文件中;
[root@localhost data] 5 1 * * 2 /data/get_username.sh >>/tmp/get_username.log
6、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;
[root@localhost data]# vim directroy .sh #!/bin/bash read -p 'Enter a directroy:' directroy if [ !-e "$directroy" ]; then mkdir -r $directroy else echo "$directroy is existence"\n ll -d $directroy \n ls fi [root@localhost data]# bash -n directroy.sh [root@localhost data]# bash directroy.sh Enter a directroy: /data /data is existencen drwxr-xr-x. 2 root root 4096 1月 2922:00 /data 99for.sh cjuser.sh ml.txt passwd passwd.sed ping.sh sed.test text.txt 99while.sh directroy.sh o ai menglei passwdlist ping2.sh plt.txt sed.test1 userlist [root@localhost data]# [root@localhost data]# bash directroy.sh Enter a directroy: /panlitao/LouIs /panlitao/LouIs create success [root@localhost data]# ls / bin data etc lib lost+found misc net panlitao root selinux sys usr boot dev home lib64 media mnt opt proc sbin srv tmp var [root@localhost data]# ls /panlitao LouIs
7、写一个脚本,打印9X9乘法表;
[root@localhost data]#vim 99for.sh #!/bin/bash for j in [1..9]; do for i in $(seq 1 $j); do echo -e -n "${i}X${j}=$[$i*$j]\t" done echo done [root@localhost data]#bash -n 99for.sh [root@localhost data]#bash 99for.sh 1X1=1 1X2=2 2X2=4 1X3=3 2X3=6 3X3=9 1X4=4 2X4=8 3X4=12 4X4=16 1X5=5 2X5=10 3X5=15 4X5=20 5X5=25 1X6=6 2X6=12 3X6=18 4X6=24 5X6=30 6X6=36 1X7=7 2X7=14 3X7=21 4X7=28 5X7=35 6X7=42 7X7=49 1X8=8 2X8=16 3X8=24 4X8=32 5X8=40 6X8=48 7X8=56 8X8=64 1X9=9 2X9=18 3X9=27 4X9=36 5X9=45 6X9=54 7X9=63 8X9=72 9X9=81
8、描述dns的工作流程,以及完整搭建一套dns主从服务器,相关域名和ip可自行设定。
工作流程:
Client(请求) --> hosts文件 --> DNS Server(recursion)
Local Cache(本地缓存) --> DNS Server(递归)--> Server Cache(服务缓存) --> iteration(迭代)--> 根 --> 顶级域 --> 二级域 --> 三级域 --> ......
首先无论是Linux或者Windows,客户端发起请求,系统不会第一个请求DNS服务器,而是查找hosts文件,如果hosts文件没有请求的内容,他就会请求DNS服务器,DNS服务器首先会去查找本地DNS服务器的缓存,缓存也没有结果就会请求自己定义的主DNS服务器,而主DNS服务器也不会直接立即把请求转发出去,而是转给Server自己的缓存,如果里面还没有的话才会把请求转发出,做迭代处理。
服务器搭建
正向解析
1、配置缓存名称服务器
主要是修改主配置文件:/etc/named.conf
[root@CentOS6 named]#cp /etc/named.conf /etc/named.conf.bat [root@CentOS6 named]#vim /etc/named.conf options { listen-on port 53 { 127.0.0.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; }; recursion yes; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
更改内容:
第一部分:
listen-on port 53 { 127.0.0.1; };
listen-on port 53 { 192.168.0.105; 127.0.0.1; };
第二部分:
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
这些内容注释掉
第三部分:
allow-query { localhost; };
allow-query { any; }; 或者注释掉
2、配置主DNS服务器
(1)、在缓存名称服务器中添加自定义zone
[root@CentOS6 named]#vim /etc/named.rfc1912.zone zone "hongying.com" IN { type master; file "hongying.com.zone" };
检查语法:named-checkconf
(2)、定义区域解析库文件
[root@CentOS6 named]#cd /var/named [root@CentOS6 named]#vim hongying.com.zone 创建一个文件 $TTL 86400 $ORIGIN hongying.com. @INSOAns1.hongying.com. admin.hongying.com ( 201602052200 1H 5M 7D 1D ) INNSns1 INNSns2 INMX 10 mx1 IN MX 20 mx2 ns1INA192.168.0.105 ns2 IN A 192.168.0.106 mx1 IN A 192.168.0.107 mx2 IN A 192.168.0.108 www IN A 192.168.0.105
检查语法:
[root@CentOS6 named]# named-checkzone "hongying.com" /var/named/hongying.com.zone zone hongying.com/IN: loaded serial 4033556584 OK 更改权限,不允许其他用户访问解析库文件: [root@CentOS6 named]# chmod 640 hongying.com.zone 在把属组改回来: [root@CentOS6 named]# chown :named hongying.com.zone 重启服务: [root@CentOS6 named]# service named restart 停止 named: [确定] 启动 named: [确定]
测试解析:
[root@CentOS6 named]#dig -t A www.hongying.com @192.168.0.105 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.6 <<>> -t A www.hongying.com @192.168.0.105 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16832 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;www.hongying.com.INA ;; ANSWER SECTION: www.hongying.com.86400INA192.168.0.105 ;; AUTHORITY SECTION: hongying.com.86400INNSns1.hongying.com. hongying.com.86400INNSns2.hongying.com. ;; ADDITIONAL SECTION: ns1.hongying.com.86400INA192.168.0.105 ns2.hongying.com.86400INA192.168.0.106 ;; Query time: 0 msec ;; SERVER: 192.168.0.105#53(192.168.0.105) ;; WHEN: Fri Feb 5 05:22:47 2016 ;; MSG SIZE rcvd: 118
反向解析
第一步:添加自定义zone
[root@CentOS6 named]#vim /etc/named.rfc1912.zone zone "0.168.192.in-addr.arpa" IN { type master; file "192.168.0.zone"; };
检查语法:named-checkconf
第二步:创建反向区域解析库
[root@CentOS6 named]#cd /var/named [root@CentOS6 named]#vim -o hongying.com.zone 192.168.0.zone 根据正向解析库内容创建一个反向解析库文件192.168.0.zone $TTL 86400 $ORIGIN 0.168.192.in-addr.arpa. @INSOAns1.hongying.com. admin.hongying.com. ( 201602052200 1H 5M 7D 1D ) INNSns1.hongying.com. INNSna2.hongying.com. 11INPTRns1.hongying.com. 11INPTRwww.hongying.com. 12INPTRmx1.hongying.com. 12INPTRwww.hongying.com. 13INPTRmx2.hongying.com. 检查语法是否有错 [root@CentOS6 named]# named-checkzone "0.168.192.in-addr.arpa" 192.168.0.zone zone 0.168.192.in-addr.arpa/IN: loaded serial 4033556584 OK 重新载入 [root@CentOS6 named]# service named reload 停止 named: [确定] 启动 named: [确定]