1、描述centos6系统开机启动流程;
1)加载 BIOS 的硬件信息与进行自我测试,并依据配置取得第一个可启动的装置;
2)读取并运行第一个启动装置内 MBR 的 boot Loader ( grub, spfdisk
等程序);
3)依据 boot loader 的配置加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序;
4)在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 等级;
5)init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行的作业环境
(如网络、时区等);
6)init 运行 run-level 下的各个服务使之启动 (script 方式);
7)init 运行 /etc/rc.d/rc.local 文件;
8)init 运行终端机模拟程序 mingetty 来启动 login
程序,最后就等待使用者登陆;
2、描述/etc/rc.d/rc.sysinit脚本功能;
1)取得网络环境与主机信息:
读取网络配置档 /etc/sysconfig/network ,取得主机名称与默认网关等网络环境。
2)测试与挂载内存装置 /proc 及 U盘 装置 /sys:
除挂载内存装置 /proc 之外,还会主动侦测系统上是否具有 usb 的装置, 若有则会主动加载 usb的驱动程序,并且尝试挂载 usb 的文件系统。
3)决定是否启动 SELinux :
4)启动系统的随机数产生器
5)配置终端字体:
6)配置显示於启动过程中的欢迎信息;
7)配置系统时间 (clock) 与时区配置:需读入 /etc/sysconfig/clock 配置值
8)周边设备的侦测与 Plug and Play (PnP) 参数的测试:
根据核心在启动时侦测的结果 (/proc/sys/kernel/modprobe ) 开始进行 ide / scsi / 网络 / 音效 等周边设备的侦测,以及利用以加载的核心模块进行 PnP 装置的参数测试。
9)使用者自定义模块的加载
使用者可以在 /etc/sysconfig/modules/*.modules 加入自定义的模块,则此时会被加载到系统当中
10)加载核心的相关配置:
系统会主动去读取 /etc/sysctl.conf 这个文件的配置值。
11)配置主机名称与初始化电源管理模块 (ACPI)
12)初始化软件磁盘阵列:主要是透过 /etc/mdadm.conf 来配置好的。
13)初始化 LVM 的文件系统功能
14)以 fsck 检验磁碟文件系统:会进行 filesystem check
15)进行磁碟配额 quota 的转换 (非必要):
16)重新以可读写模式挂载系统磁碟:
17)启动 quota 功能:所以我们不需要自订 quotaon 的动作
18)启动系统虚拟随机数产生器 (pseudo-random):
19)清除启动过程当中的缓存文件:
20)将启动相关资讯加载 /var/log/dmesg 文件中。
3、总结文本处理工具sed及awk的用法;(必须附带示例)
1)sed
逐行处理文本并将处理后的文本标准输出,但并不改变原文本内容。
①sed使用格式及选项
[root@a ~]# [OPTION] 'n1,n2]fun' [input-file]
OPTION
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN
的数据一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过
sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的
sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是由萤幕输出。
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作
是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
fun
[root@a ~]# cat sed //被编辑的文件
1
2
3
4
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
[root@a ~]# sed '3ad' sed //在指定范围后添加字符串
1
2
3
d
4
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
[root@a ~]# sed '2,3cno' sed //替换指定范围的行为no
1
no
4
d :删除,因为是删除,所以 d 后面通常不接任何字符串;
[root@a ~]# sed '3d' sed //删除指定范围的行
1
2
4
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
[root@a ~]# sed '3iok' sed //在第3行前插入ok
1
2
ok
3
4
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
[root@a ~]# sed -n '2,3p' sed //在静默下输出选择的文本
2
3
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!
例如 1,20s/old/new/g 就是啦!
[root@a ~]# sed '1,4s/3/ok/g' sed //将3替换成ok
1
2
ok
4
2)awk
逐行处理文本,默认以空格分隔字段并按指定要求标准输出。
①awk使用格式
[hi@a ~]$awk [options] 'PATTERN { action }' file1 file2, ...
②awk之print
print输出字段,以$n,指定字段;[root@a ~]# cat awk
drwxr-xr-x. 2 hi hi 6 Jan 26 23:18 Desktop
drwxr-xr-x. 2 hi hi 6 Jan 26 23:18 Documents
drwxr-xr-x. 2 hi hi 6 Jan 26 23:18 Downloads
drwxr-xr-x. 2 hi hi 6 Jan 26 23:18 Music
[root@a ~]# awk '{print $1 $9}' awk
drwxr-xr-x.Desktop
drwxr-xr-x.Documents
drwxr-xr-x.Downloads
drwxr-xr-x.Music
③awk之内置变量
BEGIN:从文件的第一行开始;
END{}:处理文本完成后的动作;[root@a ~]# awk '{print $1 "\t"$9}END{print"done"}' awk
drwxr-xr-x. Desktop
drwxr-xr-x. Documents
drwxr-xr-x. Downloads
drwxr-xr-x. Music
done
FS 字段分隔符(默认是任何空格)。[root@a ~]# cat awk1
q.w.e.r.t.y
a.s.d.f.g.h
z.x.c.v.b.b
[root@a ~]# awk 'BEGIN {FS="."}{print $1 $3}' awk1
qe
ad
zc
NF 表示字段数,在执行过程中对应于当前的字段数。[root@a ~]# awk '{print "line" NR "\t" NF }' awk
line1 9
line2 9
line3 9
line4 9
NR 表示记录数,在执行过程中对应于当前的行号。[root@a ~]# awk '{print "line" NR "\t" $1 $9}' awk
line1 drwxr-xr-x.Desktop
line2 drwxr-xr-x.Documents
line3 drwxr-xr-x.Downloads
line4 drwxr-xr-x.Music
OFS 输出字段分隔符(默认值是一个空格)。[root@a ~]# awk 'BEGIN {OFS="--"} {print $1 $9}' awk
drwxr-xr-x.--Desktop
drwxr-xr-x.--Documents
drwxr-xr-x.--Downloads
drwxr-xr-x.--Music
RS 记录分隔符(默认是一个换行符)。[root@a ~]# cat awk2
a s d.f g h.j k l.
[root@a ~]# awk 'BEGIN {RS="."}{print}' awk2
a s d
f g h
j k l
ORS 输出记录分隔符(默认值是一个换行符)。[root@a ~]# awk 'BEGIN{RS="."} {ORS="\n\n"}{print}' awk2
a s d
f g h
j k l
④awk之逻辑运算符[root@a ~]# awk '{FS=":"} $3
root:x:0:0:root:/root:/bin/bash
bin 1
daemon 2
4、写一个脚本,生成10个随机数,并按从小到大进行排序(要求至少使用2中方法);#!/bin/bash
##生成随机数
int=0
while(($int<10))
do
arr[$int]=$RANDOM
let "int++"
done
##冒泡排序法
#for (( i=0 ; i
#do
# for (( j=${#arr[@]} - 1 ; j>i ; j-- ))
# do
# #echo $j
# if [[ ${arr[j]} -lt ${arr[j-1]} ]]
# then
# t=${arr[j]}
# arr[j]=${arr[j-1]}
# arr[j-1]=$t
# fi
# done
#done
##快速排序算法
temp=
buff=
#交换函数
swap()
{
buff=${arr[$1]}
arr[$1]=${arr[$2]}
arr[$2]=$buff
}
fun()
{
i=$(($1-1))
j=$1
temp=${arr[$2]}
if test $1 -ge $2 ;then
return 2
fi
while [ $j -le $2 ];do
[ $j -lt $2 ] && while [[ ${arr[$j]} -gt $temp ]] ;do
j=$(($j+1))
done
i=$(($i+1))
swap $i $j
j=$(($j+1))
done
}
##打印输出排序结果
echo ${arr[*]}
5、在每周二的凌晨1点5分执行脚本/data/get_username.sh,并将脚本的输出至/tmp/get_username.log日志文件中;[root@a ~]# crontab -e
5 1 * * 2 /data/get_username.sh >> /tmp/get_username.log
[root@a ~]# crontab -l
5 1 * * 2 /data/get_username.sh >> /tmp/get_username.log
6、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;#!/bin/bash
path="/j"
if [ ! -d "${path}" ];then
mkdir "${path}"
fi
if [ -d "$path" ];then
ls $path
fi
7、写一个脚本,打印9X9乘法表;#!/bin/bash
for((i=1;${i}<=9;i++))
do
for((j=1;${j}<=${i};j++))
do
echo -e "${i}X${j}=$((i*j))\t\c"
done
echo -e "\n"
done
8、描述dns的工作流程,以及完整搭建一套dns主从服务器,相关域名和ip可自行设定。
DNS工作流程
接到客户端请求www.a.com,先查询本机DNS缓存,若有则返回结果;若无则查询本机DNS解析库,若有则返回结果;若无则查询DNS root,获取顶级域,然后查询顶级域,获取www.a.com结果返回给客户端。
用bind搭建DNS主从服务器[root@a ~]# yum install bind //主从安装bind
[root@a ~]# vim /etc/named.conf //主从注释或关闭
31 # dnssec-enable yes;
32 # dnssec-validation yes;
//主服务器配置
[root@a named]# vi /etc/named.rfc1912.zones //添加
zone "a.cn" IN {
type master;
file "a.cn.zone"; ## 存储文件名,放在 /var/named ##
allow-update { none; };
allow-transfer {10.0.0.2; }; ## 允许辅域名服务器进行传输 ##
};
[root@a named]# vi /var/named/a.cn.zone
$TTL 144444
@ IN SOA ns.a.cn. m.a.com. (
20160127
1D
1H
1W
3H )
IN NS ns.a.cn.
ns IN A 10.0.0.1
www IN A 10.0.0.1
//从服务器配置
[root@a named]# vi /etc/named.rfc1912.zones //添加
zone "1.16.172.in-addr.arpa" IN {
type slave; ## 该主机被定义为辅域名服务器 ##
file "a.cn.zone"; ## 这个文件会被自动创建 ##
allow-update { none; };
allow-transfer {10.0.0.1 }; ## 定义主域名服务器 ##
masters {10.0.0.1; };
};