您的位置:首页 > 运维架构 > Linux

linux运维实战练习案例-2016年2月3日(第二次)

2016-02-27 22:43 1606 查看

一、实战案例(练习)内容

1、描述centos6系统开机启动流程;第一步:POST(加电自检)POST:Power On Self Test 加电自检。指计算机系统接通电源,是BIOS功能的一个主要部分,包括对CPU、系统主板、基本内存、扩展内存、系统ROM BIOS等器件的测试。如发现错误,给操作者提示或警告。简化或加快该过程,可使系统能够快速启动。第二步:启动BOIS,加载BIOS中的BootSequence(设备加载次序)启动BIOS的设置界面,然后根据按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备第三步:根据BootSequence找到第一个具有Bootloader(MBR)的设备找到操作系统所在的磁盘分区,把内核从操作系统所在的磁盘分区中加载到内存中。内核加载完成后,还可以把控制权转交给内核。第四步:加载kernel(ramdisk)探测可识别到的所有硬件设备;加载硬件驱动程序;以只读方式挂载根文件系统;运行用户空间的第一个应用程序:/sbin/init第五步:装载rootfs(只读)装载根文件系统第六步:启动init程序 2、描述/etc/rc.d/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 [option]... 'script' inputfile... script: '地址命令' 常用选项:-n:不输出模式空间中的内容至屏幕;-e: 多点编辑;-f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本;-r: 支持使用扩展正则表达式;-i: 原处编辑;(将文件修改后,将修改后的内容保存到文件中。谨慎使用!!!) 地址定界:(1) 不给地址:对全文中的每一行都进行处理;(2) 单地址:#: 指定第#行;/pattern/:被此处模式所能够匹配到的每一行;(3) 地址范围:#,#:开始行,结束行#,+#:开始行,追加的行数/pat1/,/pat2/#,/pat1/(4) ~:步进1~22~2 编辑命令: d: 删除p: 显示模式空间中的内容a \text:在行后面追加文本;支持使用\n实现多行追加;i \text:在行前面插入文本;支持使用\n实现多行插入;c \text:替换行为单行或多行文本;w /path/to/somefile: 保存模式空间匹配到的行至指定文件中;r /path/from/somefile:读取指定文件的文本流至模式空间中匹配到的行的行后;=: 为模式空间中的行打印行号;!: 取反条件; &:后向引用s///:支持使用其它分隔符, s@@@ ,s###; #s/要查找的内容/替换后的内容/替换标记:g: 行内全局替换;p: 显示替换成功的行;w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;注意:g,p,w放置在 s///的最后面,如: s///g 1.[root@localhost ~]#sed '1,8d' /etc/fstab #删除fstab中的第一行到第8行

2.[root@localhost ~]# sed '/^UUID/a \abcdef \n123456' /etc/fstab #在匹配到的行后面追加两行内容 abcdef 和 123456

3.[root@localhost ~]# sed '/^UUID/i \abcdef \n123456' /etc/fstab #在匹配到的行前面添加两行内容 abcdef 和 123456

4.[root@localhost ~]# sed '/^UUID/c \abcdef \n123456' /etc/fstab #将匹配到的替换为指定的两行内容 abcdef 和 123456

5.[root@localhost ~]# sed '/^UUID/w /etc/fstab-test.txt' /etc/fstab #将从/etc/fstab中匹配到的行存入到 /etc/fstab-test.txt中



6.[root@localhost ~]# sed '/^UUID/=' /etc/fstab #为匹配到的行打印出行号

7.[root@localhost ~]# sed '6r /etc/crontab' /etc/fstab #读取/etc/crontab文件中的内容插入到 /etc/fstab(模式空间中)中的第6行后面(不改变原文件)



8.[root@localhost ~]# sed '/^UUID/!d' /etc/fstab #删除/etc/fstab文件中没有被UUID匹配到的行

9.[root@localhost ~]# sed 's/^UUID/uuid/' /etc/fstab #将/etc/fstab中行首为UUID的字符串更改为uuid

awk用法:awk是报告生成器,用来格式化文本输出。基本用法:gawk [options] 'program' FILE ...program: PATTERN{ACTION STATEMENTS}语句之间用分号分隔 子命令:print,printf选项:-F:指明输入时用到的字段分隔符;(缺省时,以空白作为分隔符)-v var=value: 自定义变量;1、printprint item1, item2, ...要点:(1) 逗号分隔符;(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式;(3) 如省略item,相当于print $0; 示例:

2、变量2.1 内建变量FS:input field seperator(输入时的字段分隔符),默认为空白字符;OFS:output field seperator(输出时的字段分隔符),默认为空白字符;RS:input record seperator,输入时进行分割的换行符;ORS:output record seperator,输出时分割显示的换行符;NF:number of field,字段数量(统计每行的字段数){print NF}, {print $NF}NR:number of record, 行数; 文件的总行数,也可以显示单个文件的行号FNR:各文件分别计数;行数;FILENAME:当前文件名;ARGC:命令行中参数的个数;ARGV:是数组,保存的是命令行所给定的各参数; 示例:以冒号为分隔符对字符串进行分割,并显示第一字段

3、printf命令 格式化输出:printf FORMAT, item1, item2, ... (1) FORMAT必须给出; (2) 不会自动换行,需要显式给出换行控制符,\n (newline)(3) FORMAT中需要分别为后面的每个item指定一个格式化符号; 格式符:%c: 显示字符的ASCII码;%d, %i: 显示十进制整数;%e, %E: 科学计数法数值显示;%f:显示为浮点数;%g, %G:以科学计数法或浮点形式显示数值;%s:显示字符串;%u:无符号整数;%%: 显示%自身; 修饰符:(用来修饰格式符)#[.#]:第一个数字控制字符串显示的长度;第二个#表示小数点后的精度;%3.1f (右对齐)-: 左对齐+:显示数值的符号示例:

示例:

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示例:

5、PATTERN (1) empty:空模式,匹配每一行;(2) /regular expression/:仅处理能够被此处的模式匹配到的行;(3) relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;真:结果为非0值,非空字符串;(4) line ranges:行范围,startline,endline:/pat1/,/pat2/ 注意: 不支持直接给出数字的格式~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd(5) BEGIN/END模式BEGIN{}: 仅在开始处理文件中的文本之前执行一次;(可以用来打印表头信息等)END{}:仅在文本处理完成之后执行一次; 示例:

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}breakcontinuedelete array[index]delete arrayexit { statements } 7.1 if-else 语法:if(condition) statement [else statement]示例:

示例:以冒号为分隔符,打印出行尾最后一个字段为/bin/bash的行

示例:以默认的空白符作为分隔符,打印出字段数为6的行

示例:打印出文件系统使用率大于等于20% 的文件系统的名称和使用比例

7.2 while循环语法:while(condition) statement条件“真”,进入循环;条件“假”,退出循环; 使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;示例:

7.3 do-while循环语法:do statement while(condition)意义:至少执行一次循环体 7.4 for循环语法:for(expr1;expr2;expr3) statementfor(variable assignment;condition;iteration process) {for-body} 示例:

特殊用法:能够遍历数组中的元素;语法:for(var in array) {for-body} 7.5 switch语句语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; ...; default: statement} 7.6 break和continuebreak
continue 7.7 next 提前结束对本行的处理而直接进入下一行;(用于awk的内生循环) ~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd #打印出用户uid为偶数的用户的用户名和uid

8、array 关联数组:array[index-expression] index-expression:(1) 可使用任意字符串;字符串要使用双引号;(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”;如果将空元素以数值的形式打印出,则值为0; 若要判断数组中是否存在某元素,要使用"index in array"格式进行; weekdays[mon]="Monday" 若要遍历数组中的每个元素,要使用for循环;for(var in array) {for-body} 示例:#遍历输出weekdays数组中的所有值[root@bogon ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'TuesdayMonday注意:var会遍历array的每个索引;state["LISTEN"]++state["ESTABLISHED"]++示例:[root@bogon ~]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}'LISTEN 3 示例:统计/etc/fstab文件中每个文件系统类型出现的次数;[root@bogon ~]# awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstabxfs 1 示例:统计指定文件中每个单词出现的次数;[root@bogon ~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab20:19:48 1Dec 1man 1and/or 1maintained 1xfs 3/dev/mapper/centos-root 1Accessible 1# 7…………………… 9、函数 9.1 内置函数数值处理:rand():返回0和1之间一个随机数;示例:# awk 'BEGIN{print rand()}'0.237788 字符串处理:length([s]):返回指定字符串的长度;sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容; split(s,a,r):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中; 示例:[root@bogon ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'0.0.0.0 3 4、写一个脚本,生成10个随机数,并按从小到大进行排序(要求至少使用2种方法); #!/bin/bashfor((i=0;i<10;i++)){ array[$i]=$RANDOM}#自己定义一个数组temp=for((i=0;i<10;i++)){ for((j=i;j<10;j++)) { x=${array[$i]} if test $x -ge ${array[$j]} then temp=${array[$i]} array[$i]=${array[$j]} array[$j]=$temp fi }}echo ${array[@]} 5、在每周二的凌晨1点5分执行脚本/data/get_username.sh,并将脚本的输出至/tmp/get_username.log日志文件中;

6、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;#!/bin/bashecho -n "Enter a path:"read pathecho "Input path is:$path"if [ -z $path ];then echo "Please enter a path" exit 0fiif [ -e $path ];then filetype=$(file -b $path) echo "the file type is:${filetype}" Elseecho "${path} is not exists" mkdir -pv $path;fiexit 0;示例:



7、写一个脚本,打印9X9乘法表;#!/bin/bashfor j in {1..9};do for i in $(seq 1 $j);do echo -e -n "${i}X${j}=$[$j*$i]\t" done echo done

8、描述dns的工作流程,以及完整搭建一套dns主从服务器,相关域名和ip可自行设定。 一.配置从服务器 1.配置为缓存名称服务器
listen-on port 53 {192.168.1.110; 127.0.0.1; };allow-query { any; };
//listen-on-v6 port 53 { ::1; };//关闭dnssec(建议)
recursion yes;//dnssec-enable yes;//dnssec-validation yes;//bindkeys-file "/etc/named.iscdlv.key";//managed-keys-directory "/var/named/dynamic";2.配置主DNS服务器 在缓存名称服务器的基础上,在/etc/named.rfc1912.zones中添加zones,即配置成为了主DNS服务器。[root@bogon ~]# vim /etc/named.rfc1912.zones 添加域 taogsau.comzone "taogsau.com" IN { type master; //DNS服务器类型 file "taogsau.com.zone"; //区域解析库文件名称};然后在/var/named/下建立taogsau.com.zone区域解析库文件。并写入内容:$TTL 86400@ IN SOA ns1.taogsau.com. admin.taogsau.com( 20160219 1H 5M 7D 1D ) IN NS ns1.taogsau.com. IN NS ns2.taogsau.com. IN MX 10 mx1 IN MX 20 mx2ns1 IN A 192.168.1.11ns2 IN A 192.168.1.12mx1 IN A 192.168.1.13mx2 IN A 192.168.1.14www IN A 192.168.1.11 更改区域解析库/var/named/taogsau.com.zone权限[root@bogon ~]# chmod 640 /var/named/taogsau.com.zone更改属组:[root@bogon ~]# chown :named /var/named/taogsau.com.zone 3.重启named进程[root@bogon ~]# service named restart停止 named:. [确定]启动 named: [确定]============主DNS服务器配置完成========== 二.配置从服务器1.首先将服务器配置为缓存名称服务器[root@bogon ~]# vim /etc/named.conf listen-on port 53 {192.168.1.111; 127.0.0.1; };allow-query { any; };
//listen-on-v6 port 53 { ::1; };//关闭dnssec(建议)
recursion yes;//dnssec-enable yes;//dnssec-validation yes;//bindkeys-file "/etc/named.iscdlv.key";//managed-keys-directory "/var/named/dynamic"; 2.编辑[root@bogon ~]# vim /etc/named.rfc1912.zones 加入:zone "taogsau.com" IN {type slave; //DNS服务器类型 masters { 192.168.1.110; };file "slaves/taogsau.com.zone"; //从名称服务器的区域解析库文件名称及路径 ==============从服务器配置完成============

本文出自 “小步前进” 博客,请务必保留此出处http://lxk008.blog.51cto.com/5061207/1745662
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: