linux运维实战练习-2016年1月19日-2月3日课程作业
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux运维实战练习-2016年1月19日-2月3日课程作业相关的知识,希望对你有一定的参考价值。
1、描述centos6系统开机启动流程; a,POST:开机加电自检,ROM,Bios b,Boot seuquence:按次序查找各引导设备,第一个引导程序的设备即为本次启动用到的设备 c,Boot loader: 引导加载器,程序 MBR主引导记录,GRUB Boot loader 功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本,把用户选定的内核装载到内存中特定空间,解压展开并把系统控制权移交给内核。 d,kernel:自身初始化, 探测可识别到的所有硬件设备 加载硬件驱动程序(有可能借助于ram disk加载驱动) 以只读方式挂载根文件件系统 运行用户空间的第一个应用程序/sbin/init 2、描述/etc/rc.d/sysinit脚本功能; a,设备主机 b,设置欢迎信息 c,激活udev和selinux d,挂载/etc/fstab文件中定义的文件系统 e,检测根文件并以读写方式重新挂载根文件系统 f,设置系统时钟 g,激活swap设备 h,根据/etc/sysctl.conf文件设置内核参数 i,激活lvm及software raid设备 j,加载额外设备的驱动程序 k,清理操作 3、总结文本处理工具sed及awk的用法; sed:编辑器 sed: Stream EDitor,行编辑器: 用法: sed [option]... ‘script‘ inputfile... script: ‘地址命令’ 常用选项 -n: 不输出模式中的内容到屏幕 -e: 多点编辑 -f: /PATH/TO/SCRIPT_FILE:从指定文件中读取编辑脚本 -r: 支持使用扩展正则表达式 -i: 原处编辑 地址定界 (1)不给地址:对全文进行处理 (2)单地址: #:指定的行 /patern/:被此处模式所能够匹配到的每一行 (3) #,# #,+# /pat1/,/pat2/ #,/pat1/ (4)~步进 1~2 2~2 编辑命令 d: 删除 # sed ‘1,4d‘ /etc/fstab p: 显示模式空间中的内容 # sed -n ‘/^UUID/p‘ /etc/fstab a \‘text‘ 在行后面追加文本:支持使用\n实现多行追加 # sed -n ‘/^UUID/p‘ /etc/fstab i \‘text‘: 在行前面追加文本:支持使用\n实现多行插入 # sed ‘/^UUID/i \#hello sde.\nwelcom‘ /etc/fstab c \‘text‘ 替换行为单行或多行文本 # sed ‘/^UUID/c \#hello sde.\nwelcom‘ /etc/fstab w /path/to/somefile:保存模式空间匹配到的行至指定文件中 #sed ‘/^UUID/w /tmp/fstab.txt‘ /etc/fstab r:/path/to/somefile:读到指定文件的文本流至械空间中匹配的行的行后 # sed ‘6r /etc/issue‘ /etc/fstab =: 为模式空间中的行打印行号 # sed ‘/^UUID/=‘ /etc/fstab !:取反条件 # sed ‘/^UUID/!d‘ /etc/fstab s///:查找替换,支持其它分隔符,[email protected]@@,S### 替换标记: g:行内全局替换 # sed ‘[email protected]^[email protected]@‘ /etc/fstab p:显示替换成功的行 # sed -n ‘[email protected]@&[email protected]‘ /etc/passwd w: /PATH/TO/SOMEFILE:将替换成功的结果保存到指定文件中 # sed ‘[email protected]@&[email protected]‘ /etc/passwd 高级编辑命令 h: 把模式空间中的内容覆盖到保持空间中 H:把模式空间中的内容追加至保持空间中 g: 从保持空间取出数据覆盖到模式空间 G:从保持空间取出内容追加到模式空间 x:把模式空间中的内容与保持空间中的内容进行互换 n:读取匹配到的行的下一行到模式空间 N:追加匹配到的行的下一行到模式空间 d:删除模式空间中的行 D:删除多行模式空间中的所有行 # vim test.txt 显示偶数行 # sed -n ‘n;p‘ test.txt 2 4 6 逆向显示文件内容 # sed ‘1!G;h;$!d‘ test.txt 6 5 4 3 2 1 显示文件后两行 # sed ‘$!n;$!D‘ /etc/fstab 取文件最后一行 # sed ‘$!n;$!D‘ /etc/fstab 在每行后面多加空白行 # sed ‘G‘ test.txt 1 2 全部显示空白行 # sed ‘g‘ test.txt # sed ‘/^$/d;G‘ test.txt 显示奇数行 # sed ‘n;d‘ test.txt 逆向显示文件每一行 # sed ‘1!G;h;$p‘ test.txt 显示偶数行 # sed -n ‘2~2p‘ test.txt 显示奇数行 # sed -n ‘2~2p‘ test.txt wak wak:报告生成器,格式化文本输出 AWK: Aho, Weiberger,Kernighan ---New AWK , Nawk GNU awk, gawk gawk - pattern scanning and processing language 基本用法 : gawk [options] ‘program‘ FILE... program: PATTERN{ACTION STATEMENT} 语句之间用分号分隔 print, printf 选项: -F:指明输入时用到的字段分隔符 -v: var=value:自定义变量 1,print print item1,item2,... 要点 : (1)逗号分隔符 # tail -3 /etc/fstab | awk ‘{print $2,$4}‘ (2)输出的各item可以字符串,也可以是数值,当前记录的字段,变量或awk的表达式 # tail -3 /etc/fstab | awk ‘{print "hello" $2,$4,6}‘ (3)如果省略item,相当于print $0; # tail -3 /etc/fstab | awk ‘{print }‘ 2,变量 内建变量 FS:input field seperator,默认为空白字符 # awk -v FS=‘:‘ ‘{print $1}‘ /etc/passwd OFS:output field seperator,默认为空白字符 # awk -v FS=‘:‘ -v OFS=‘:‘ ‘{print $1,$3,$7}‘ /etc/passwd RS:input record seperator:输入时的换行符 # awk -v RS=‘‘ ‘{print}‘ /etc/passwd ORS: output record seperator:输入时的换行符 # awk -v RS=‘‘ -v ORS=‘#‘ ‘{print}‘ /etc/passwd NF: number of field,字段数量 # awk ‘{print NF}‘ /etc/fstab {print NF}, {print $NF} NR:number of record ,行数 # awk ‘{print NR}‘ /etc/fstab FNR:各文件分别计数:行数 # awk ‘{print FNR}‘ /etc/fstab /etc/issue FILENAME: 当前文件名 # awk ‘{print FILENAME}‘ /etc/fstab /etc/issue ARGC:命令参数的个数 # awk ‘BEGIN{print ARGC}‘ /etc/fstab /etc/issue ARGV:数组,保存的是命令行中所给定的各参数 # awk ‘BEGIN{print ARGV[0]}‘ /etc/fstab /etc/issue 自定义变量 (1) -v var=value 变量名区分字符大小写 (2)在program中直接定义 # awk -v test=‘hello gawk‘ ‘BEGIN{print test}‘ /etc/fstab # awk ‘BEGIN{test="hello gawk";print test}‘ 3,printf命令 格式化输出:printf FORMAT, item1,item2,... (1) FORMAT是必须给出 (2)不会自动换行,需要显式给出换行控制符,\n (3)FORMAT中需要分别为后面的每个item指定一个格式化符号 格式符: %c:显示字符的ASCII码 %d,%i:显示十进制整数 %e,%E:科学计数法数值显示 %f:显示为浮点数 %g,%G:以科学计数法或浮点形式显示数值 %s:显示字符串 %u:无符号整数 %%:显示%自身 # awk -F: ‘{printf "Username:%s\n",$1}‘ /etc/passwd # awk -F: ‘{printf "Username:%s,UID:%d\n",$1,$3}‘ /etc/passwd 修饰符: #[.#]:第一个数字控制显示的宽度,第二个#表示小数点后的精度 %3,1f # awk -F: ‘{printf "Username:%15s,UID:%d\n",$1,$3}‘ /etc/passwd -:左对齐 # awk -F: ‘{printf "Username:%-15s,UID:%d\n",$1,$3}‘ /etc/passwd +:显示数值的符号 4,操作符 算数操作符 x+y ,x-y ,x*y ,x/y ,x^y, x%y, -x +x:转换为数值 字符串操作符:没有符号的操作符,字符串连接 赋值操作符 =, +=, -=, *=, /=, %=,^=, ++, --, 比较操作符 >, >=, < , <=, !=, == 模式匹配符: ~:是否匹配 !~:是否不匹配 逻辑操作符 && 与 || 或 ! 非 函数调用: function_name(argu1,argu2,...) 条件表达式 selector?if-ture-exprssion: if-false-expression # awk -F: ‘{$3>=1000?usertype="Common user":usertype="Sysadmin or Sysuser";printf "%15s:%-s\n",$1,usertype}‘ /etc/passwd 5, PATTERN (1)empty:空模式,匹配每一行 (2)/regular expression/:仅处理能够被此处的模式匹配到的行: #awk ‘/^UUID/{print $1}‘ /etc/fstab # awk ‘!/^UUID/{print $1}‘ /etc/fstab (3)relational expression:关系表达式:结果有“真”“假”:结果为“真”才会被处理 真:结果为非0值,非空字符串 # awk -F: ‘$3>=1000{print $1,$3}‘ /etc/passwd # awk -F: ‘$3<1000{print $1,$3}‘ /etc/passwd # awk -F: ‘$NF=="/bin/bash"{print $1,$NF}‘ /etc/passwd (4)line ranges:行范围 startlin,endline /pat1/,/pat2/ 注意:不支持直接给出数字的格式 # awk -F: ‘(NR>=2&&NR<=10){print $1}‘ /etc/passwd (5)BIGIN/END模式 BIGIN{}:仅在开始处理文件中的文本之前执行一次 # 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 # awk -F: ‘{print" username uid \n------------";print $1,$3}‘ /etc/passwd 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 {statments} while (condition) {statments} do {statments} while (condition) for(expr1,expr2,expr3,) {statments} continue delete array[index] delete array exit { statments } 7.1 if-else 语法: if (condition) {statments} [else statement] # awk -F: ‘{if($3>=1000)print $1,$3}‘ /etc/passwd else 语句用法 # awk -F: ‘{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}‘ /etc/passwd # awk -F: ‘{if($NF=="/bin/bash") print $1}‘ /etc/passwd # awk ‘{if(NF>5) print $0}‘ /etc/fstab # df -h | awk -F[%] ‘/^\/dev/{print $1}‘ | awk ‘{if($NF>=20) print $1}‘ 使用场景: 对awk取得的整行或某个字段做条件判断 7.2 while 循环 语法:while (condition) {statments} 条件“真”,进入循环,条件为“假” 退出循环 使用场景:对一行内多个字段逐一类似处理时使用:对数组中的各元素逐一处理时使用 # 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 73 do-while循环 语法:do statement while (condition) 意义:到少执行一次循环体 7.4 for 循环 语法: for(expr1,expr2,expr3,) {statments} for(variable assignment; 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.5 swith 语句 语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/:statement;... default: statement} 7.6 break 和continue break [n] continue 7.7 next 提前结束对本行的处理而直接进入下一行: # awk -F: ‘{if($3%2!=0) next; print $1,$3}‘ /etc/passwd 8 array 数组 关联数组:array [index-expression] index-expression (1)可使用任意字符串,字符串要使用双引号 (2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串” 若要判断数组中是否存在某元素,要wget"index in array"格式进行 weekday[mon]="Monday" # awk ‘BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}‘ 若要遍历数组中的每个元素,要使用for循环 for(var in array) {for-body} # awk ‘BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}‘ 注意:var会遍历array的每个索引 state["LISTEN"]++ state["ESTABLISHED"]++ # netstat -tan | awk ‘/^tcp\>/{state[$NF]++}END{for(i in state) {print i,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) {print i,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(r,s,[t]):以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中方法) #!/bin/bash declare -a rand declare -i max=0 for i in {0..9}; do rand[$i]=$RANDOM [ ${rand[$i]} -gt $max ] && max=${rand[$i]} done echo "Max: $max" 5、在每周二的凌晨1点5分执行脚本/data/get_username.sh,并将脚本的输出至/tmp/get_username.log日志文件中; #crontab -e 5 1 * * 2 /tmp/zuoye/get_username.sh >> /tmp/zuoye/get_username.log 6、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型; #!/bin/bashif ls $1 &> /dev/null ;thenstat $1|head -2else mkdir -p $1fi 7、写一个脚本,打印9X9乘法表; 1, #!/bin/bash declare -i j=1 declare -i i=1 until [ $j -gt 9 ]; do until [ $i -gt $j ]; do echo -n -e "${i}X${j}=$[$i*$j]\t" let i++ done echo let i=1 let j++ done 2, #!/bin/bash for((j=1;j<=9;j++)); do for((i=1;i<=j;i++))do echo -e -n "${i}X${j}=$[$i*$j]\t" done echo done 8、描述dns的工作流程,以及完整搭建一套dns主从服务器,相关域名和ip可自行设定。 DNS Domain Name Service 协议 (c/s, 53/udp, 53/tcp):应用层协议: BIND: Bekerley Internat Name Domain, ISC (www.isc.org) TCP :面向连接的协议 UDP:User Datagram Protocol 无连接协议 本地名称解析配置文件: hosts /etc/hosts %WINDOWS%system32/drives/etc/hosts Top Level Domain: tld com,edu,mil, gov, net, org, int 三类:组织域,国定域(,cn, .iq, .hk, .tw) 反向域 DNS查询类型: 递归查询 迭代查询 名称服务器:域内负责解析本域内的名称的主机 根服务器:13组服务器 解析类型 Name--> IP IP--->Name 注意:正反向解析是两个不同的名称空间,是两棵不同的 DNS服务器类型 主DNS服务器 辅助DNS服务器 缓存DNS服务器 转发器 主DNS服务器:维护所负责解析的域内解析库的服务器:解析库由管理员维护 从DNS服务器:从主DNS服务器或其它的从DNS服务那里“复制”(区域传递)一份解析 序列号:解析库的版本号 ,前提:主服务器解析库内容发生变化,其序列递增 刷新时间间隔 : 从服务器从主服务器请求同步解析的时间间隔 重试时长间隔:从服务器从主服务器请求同步解析库失败时,再次尝试的时间间隔 过期时长: 从服务器使终联系不到主服务器时,多久后放弃从服务器角度,停止提供服务 "通知"机制 区域传递: 全量传送:传送整个解析库 增量传递:传送解析库变化的那部分内容 DNS: Domain: 正向:FQDN -->IP 反射:IP --> FQDN 各需要一个解析库来负责本地域名的正向和反向解析 正向区域 反向区域 FQDN: Full Qulified Domain Name:完全合格域名 一次完整的查询请求经过的流程 Client --> hosts文件 --> DNS Server Local Cache -->DNS Server(recursion) --> Server Cache --> Iteration(迭代) --> 解析答案 肯定答案: 否定答案:请求的条目不存在等原因导致无法返回结果 权威答案 非权威答案 资源记录:Resource Record,RR 有记录类型:A,PTR, SOA, NS, CNAME, MX AAAA SOA:Start Of Authority: 起始授权记录,一个区域解析库有且仅能有一个SOA记录,而必须为解析库的第一条记录 A:internet Address: 作用: FQDN--IP AAAA: FQDN--IPV6 PTR:PoinTeR:指针 IP -- FQDN NS:Name Server: 专用于标明当前区域的DNS服务器 CNAME:Canonical Name:别名记录 MX:Mail eXchanger: 邮件交换器 资源记录定义的格式: 语法: name [TTL] IN rr_type value 注意: (1)TTL可从全局继承 (2)@可用于引用 当前区域的名字 (3)同一个名字可以通过多条记录定义多个不同的值,些时DNS服务器会以轮询方式响应 (4)同一个值 也可以有多个不同的定义名字,通过多个不同的名字指向同一个值进行定义:此仅表示通过多个不同的名字可以找到同一个主机 SOA : name: 当前区域的名字,例如“magedu.com.” value: 有多部分组成 (1)当前区域的主DNS服务器的FQDN, 也可以使用当前区域的名字:@ (2)录前管理员的邮箱地址:介地址中不能使用@符号,一般用.替换,例如:linux.magedu.com (3)(主从服务协调属性的定义以及否定的答案的统一的TTL) 例如: magedu.com. 86400 IN SOA ns.magedu.com. nsadmin.magedu.com. ( 2016011901 ;序列号 2H ;刷新时间 10M ;重试时间 1W ;过期时间 1D ;否定答案的TTL值 ) NS: name: 当前区域的名字 value:当前区域的某DNS服务器的名字,例如:ms.magedu.com.: 注意: 一个区域可以有多个NS记录 例如: magedu.com. IN NS ns1.magedu.com. magedu.com. IN NS ns2.magedu.com. 注意: (1)相邻的两个资源记录的name相同时,后续的可省略 (2) 对NS记录而言,任何一个ns记录后面的服务器名字,都 应该在后续有一个A记录 MX: name: 当前区域的名字 value:当前区域的某邮件服务器(smtp服务器)的主机名 一个区域内,MX记录可有多个,但每个记录的value之前应该有一个数字(0-99),表示 此服务器的优先级,数据越小侁先级越高 例如: magedu.com. IN MX 10 mx1.magedu.com. IN MX 10 mx2.magedu.com. 注意:对MX记录而言,任何一个MX记录后面的服务器名字,都 应该在后续有一个A记录 A: name: 某主机的FQDN,例如: www.magedu.com. value:主机名对应主机的IP地址 例如: www.magedu.com. IN A 1.1.1.1 www.magedu.com. IN A 1.1.1.2 mx1.magedu.com. IN A 1.1.1.3 mx2.magedu.com. IN A 1.1.1.3 注意: (1)*.magedu.com IN A 1.1.1.4 magedu.com IN A 1.1.1.4 避免用户写错名称时给错误答案,可通过泛域名解析进行解析至某特定地址 AAAA : &nbs以上是关于linux运维实战练习-2016年1月19日-2月3日课程作业的主要内容,如果未能解决你的问题,请参考以下文章
linux运维实战练习-2016年1月19日-2月3日课程作业
linux运维实战练习-2016年1月19日-2月3日课程作业
linux运维实战练习-2016年1月19日-2月3日课程作业
linux运维实战练习-2016年3月4日-3月19日课程作业