运维经典面试题

运维经典面试题

十月 22, 2018

运维经典面试题

1、docker命令

容器生命周期管理

1
docker [run|start|stop|restart|kill|rm|pause|unpause]

容器操作运维

1
docker [ps|inspect|top|attach|events|logs|wait|export|port]

容器rootfs命令

1
docker [commit|cp|diff]

镜像仓库

1
docker [login|pull|push|search]

本地镜像管理

1
docker [images|rmi|tag|build|history|save|import]

其他命令

1
docker [info|version]

2、docker怎样实现容器件的独立

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1)pid namespace

不同用户的进程就是通过pid namespace 隔离开的,且不同 namespace 中可以有相同pid。所有的LXC进程在docker中的父进程为docker进程,每个lxc进程具有不同的 namespace 。

2) net namespace

有了pid namespace, 每个 namespace 中的pid能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net namespace 实现的,每个 net namespace 有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个 container 的网络就能隔离开来。docker默认采用veth的方式将 container 中的虚拟网卡同 host 上的一个docker bridge: docker0 连接在一起。

3) ipc namespace

container 中进程交互还是采用linux常见的进程间交互方法 (interprocess communication - IPC),包括常见的信号量、消息队列和共享内存。container 的进程间交互实际上还是host 上具有相同pid namespace 中的进程间交互。

4) mnt namespace

类似chroot,将一个进程放到一个特定的目录执行。mnt namespace 允许不同 namespace 的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。在container里头,看到的文件系统,就是一个完整的linux系统,有/etc、/lib等,通过chroot实现。`

5) uts namespace

UTS("UNIX Time-sharing System") namespace 允许每个 container 拥有独立的 hostname和 domain name, 使其在网络上可以被视作一个独立的节点而非 Host 上的一个进程。

6) user namespace

每个 container 可以有不同的 user 和 group id, 也就是说可以在 container 内部用 container 内部的用户执行程序而非 Host 上的用户。

有了以上 6 种 namespace 从进程、网络、IPC、文件系统、UTS和用户角度的隔离,一个 container 就可以对外展现出一个独立计算机的能力,并且不同 container 从 OS 层面实现了隔离。然而不同 namespace 之间资源还是相互竞争的,仍然需要类似ulimit来管理每个 container 所能使用的资源 - -cgroup。

cgroups(Control groups)实现了对资源的配额和度量。

3、Linux如何挂载windows下的共享目录

1
2
3
4

mount.cifs //IP地址/server/mnt/server -o user=administrator,password=123456

linux 下的server需要自己手动建一个 后面的user与pass 是windows主机的账号和密码 注意空格 和逗号

4、查看http的并发请求数与其TCP连接状态

1
netstat -n | awk '/^tcp/ {++b[$NF]}' END {for(a in b) print a,b[a]}'

还有ulimit -n查看linux系统打开最大的文件描述符,这里默认1024,不修改这里web服务器修改再大也没用。若要用就修改很几个办法,这里说其中一个:
修改/etc/security/limits.conf
soft nofile 10240
hard nofile 10240
重启后生效

5、用tcpdump嗅探80端口的访问看看谁最高。

1
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4"."}' | sort |uniq -c | sort -nr | head-5 

6、查看/var/log目录下的文件数

1
ls /var/log/ -1R | grep "-" | wc -l

7、查看当前系统每个ip的连接数

1
netstat -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn

8、shell下32位随机密码生成。

1
cat /dev/urandom | head -1 | md5sum | head -c 32 >> /pass

9、统计出apache的access.log中访问量最多的5个ip。

1
cat access.log | awk '{print $1}' | sort | uniq -c | sort -n -r | head -5

10、如何查看二进制文件的内容

我们一般通过hexdump命令 来查看二进制文件的内容。

hexdump -C XXX(文件名) -C是参数 不同的参数有不同的意义
-C 是比较规范的 十六进制和ASCII码显示
-c 是单字节字符显示
-b 单字节八进制显示
-o 是双字节八进制显示
-d 是双字节十进制显示
-x 是双字节十六进制显示
… …

11、ps aux 中的VSZ代表什么意思,RSS代表什么意思

VSZ:虚拟内存集,进程占用的虚拟内存空间

RSS:物理内存集,进程战用实际物理内存空间

12、Linux 系统的开机启动顺序

加载BIOS–>读取MBR–>Boot Loader–>加载内核–>用户层init一句inittab文件来设定系统运行的等级(一般3或者5,3是多用户命令行,5是界面)–>init进程执行rc.syninit–>启动内核模块–>执行不同级别运行的脚本程序–>执行 /etc/rc .d /rc 、local (本地运行服务)–>执行 /bin/login ,就可以登录了。

13、符号链接与硬链接的区别

我们可以把符号链接,也就是软连接 当做是 windows系统里的 快捷方式。
硬链接 就好像是 又复制了一份.
ln 3.txt 4.txt 这是硬链接,相当于复制,不可以跨分区,但修改3,4会跟着变,若删除3,4不受任何影响。

ln -s 3.txt 4.txt 这是软连接,相当于快捷方式。修改4,3也会跟着变,若删除3,4就坏掉了。不可以用了。

14、保存当前磁盘分区的分区表

dd 命令是以个强大的命令,在复制的同时进行转换

dd if = /dev/sda of=、/mbr .txt bs=1 count=512

15.如何在文本里面进行复制、粘贴,删除行,删除全部,按行查找和按字母查找。

以下操作全部在命令行状态操作,不要在编辑状态操作。

在文本里 移动到想要复制的行 按yy 想复制到哪就移动到哪,然后按P 就黏贴了

删除行 移动到改行 按 dd

删除全部 dG 这里注意G一定要大写

按行查找 :90 这样就是找到第90行

按字母查找 /path 这样就是 找到path这个单词所在的位置,文本里可能存在多个,多次查找会显示在不同的位置。

16、手动安装grub

1
grub-install /dev/sda

17、修改内核参数

vi /etc/sysctl.conf 这里修改参数

sysctl -p 刷新后可用

18、在1-39内取随机数

1
2
3
expr $[RANDOM%39] +1
RANDOM随机数
%39取余数范围0-38

19、限制apache每秒新建连接数为1,峰值为3

每秒新建连接数 一般都是由防火墙来做,apache本身好像无法设置每秒新建连接数,只能设置最大连接:

1
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m limit --limit  1/second -j ACCEPT

20.FTP 的主动模式和被动模式

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT 命令告诉服务器:“我打开了XX端口,你过来连接我”。于是服务器从20端口向客户端的 XX端口发送连接请求,建立一条数据链路来传送数据。

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV 命令告诉客户端:“我打开了XX端口,你过来连接我”。于是客户端向服务器的XX端口 发送连接请求,建立一条数据链路来传送数据。

从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完 全不同。

21、显示/etc/inittab中以#开头,且后面跟了一个或者多个空白字符,而后又跟了任意非空白字符的行。

1
grep "^#\{1,\}[^]" /etc/inittab

22.显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行

1
grep "\:[0-9]\{1\}:" /etc/inittab

23、怎么把脚本添加到系统服务里,即用service来调用

在脚本里加入

1
2
3
#!/bin/bash
# chkconfig: 345 85 15
# description: httpd

然后保存
chkconfig httpd –add 创建系统服务
现在就可以使用servicestart or restart

24、写一个脚本,实现批量添加20个用户,用户名为user01-20,密码为user后面跟5个随机字符

1
2
3
4
5
6
#!/bin/bash
#description: useradd
for i in `seq -f"%02g" 1 20`;do
useradd user$i
echo "user$i-`echo $RANDOM|md5sum|cut -c 1-5`"|passwd –stdinuser$i >/dev/null 2>&1
done

25、写一个脚本,实现判断192.168.1.0/24网络里,当前在线的IP有哪些,能ping通则认为在线

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
for ip in `seq 1 255`
do
ping -c 1 192.168.1.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 192.168.1.$ip UP
else
echo 192.168.1.$ip DOWN
fi
}&
done
wait

26、写一个脚本,判断一个指定的脚本是否是语法错误;如果有错误,则提醒用户键入Q或者q无视错误并退出其它任何键可以通过vim打开这个指定的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost  tmp]# cat checksh.sh
#!/bin/bash
read -p "please input check script-> " file
if [ -f $file ]; then
sh -n $file > /dev/null 2>&1
if [ $? -ne 0 ]; then
read -p "You input $file syntax error,[Type q to exit or Type vim to edit]" answer
case $answer in
q | Q)
exit 0
;;
vim )
vim $file
;;
*)
exit 0
;;
esac
fi
else
echo "$file not exist"
exit 1
fi

27、写一个脚本:(26 包括3个小题)

1、创建一个函数,能接受两个参数:

1)第一个参数为URL,即可下载的文件;第二个参数为目录,即下载后保存的位置;

2)如果用户给的目录不存在,则提示用户是否创建;如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本;

3)如果给的目录存在,则下载文件;下载命令执行结束后测试文件下载成功与否;如果成功,则返回0给调用脚本,否则,返回52给调用脚本;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost tmp]# cat downfile.sh
#!/bin/bash
url=$1
dir=$2
download()
{
cd $dir >> /dev/null 2>&1
if [ $? -ne 0 ];then
read -p "$dir No such file or directory,create?(y/n)" answer
if [ "$answer" == "y" ];then
mkdir -p $dir
cd $dir
wget $url 1> /dev/null 2>&1
else
return "51"
fi
fi
if [ $? -ne 0 ]; then
return "52"
fi
}
download $url $dir
echo $?

28、写一个脚本:(27 包括2个小题)

1、创建一个函数,可以接受一个磁盘设备路径(如/dev/sdb)作为参数;在真正开始后面步骤之前提醒用户有危险,并让用户选择是否继续;而后将此磁盘设备上的所有分区清空(提示,使用命令dd if=/dev/zero of=/dev/sdb bs=512 count=1实现,注意其中的设备路径不要写错了;

如果此步骤失败,返回67给主程序;

接着在此磁盘设备上创建两个主分区,一个大小为100M,一个大小为1G;如果此步骤失败,返回68给主程序;

格式化此两分区,文件系统类型为ext3;如果此步骤失败,返回69给主程序;

如果上述过程都正常,返回0给主程序;

2、调用此函数;并通过接收函数执行的返回值来判断其执行情况,并将信息显示出来;

1
2
3
4
5
6
7
local Darray=(`ls /dev/sd[a-z]`)
for i in ${Darray};do
[[ "$i" == "$1" ]] && Sd=$i &&break
done
else
return66
fi
  • 当匹配成功,进入选择,告诉用户,是否继续,输错的话进入无限循环,当用户选择Y,则清空目标分区,且跳出while循环
1
2
3
4
5
6
7
8
9
10
11
while :;do
read -p "Warning!!!This operation will clean $Sd data.Next=y,Quit=n [y|n]:" Choice
case $Choice in
y)
dd if=/dev/zero of=$Sd bs=512 count=1 &> /dev/null &&break || return 67 ;;
n)
exit 88 ;;
*)
echo "Invalid choice,please choice again." ;;
esac
done
  • 使用echo传递给fdisk进行分区,如果此命令失败,则跳转出去,错误值68,需要注意的是,有时候这个返回值很诡异,笔者之前成功与否都是返回的1,后来重启之后,就好了,如果慎重的话,可以对创建的分区,进行判断,不过就需要使用其他工具截取相关字段了,虽有些小麻烦,但无大碍
1
echo-e "n\np\n1\n\n+100M\nn\np\n2\n\n+1024M\nw\n"|fdisk /dev/sdb&> /dev/null || || return 68

格式化之前,让内核重新读取磁盘分区表,值得注意的是,有的系统版本,使用partprobe无效,譬如笔者的环境是rhel5.8,而rhel6.0以后,这个命令就很危险了,而使用partx -a /dev/sdb则效果更好…此项需慎重,如果格式化失败,则告知把失败的分区定义成变量,且跳出函数,并带出错误值69

1
2
3
4
5
6
7
`partprobe`
Part=`fdisk -l /dev/$Sd|tail -2|cut -d” ” -f1`
for M in ${Part};do
mke2fs -j $M &> /dev/null && ErrorPart=$M &&return 69
done
return 0
}

  • 下面代码,调用函数,接收函数返回值,根据返回值进行判断哪里出错。
    1
    2
    3
    4
    5
    6
    7
    Disk_Mod $1
    Res=$?
    [ $Res-eq 0 ] && exit 0
    [ $Res-eq 66 ] && echo "Error! Invalid input."
    [ $Res-eq 67 ] && echo "Error! Command -> dd <- Faild."
    [ $Res-eq 68 ] && echo "Error! Command -> fdisk <- Faild."
    [ $Res-eq 69 ] && echo "Error! Command -> mke2fs <- Faild."

28、如何让history命令显示具体时间?

1
2
3
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S"
export HISTTIMEFORMAT
重新开机后会还原,可以写/etc/profile
  1. 1. 运维经典面试题
  2. 2. 1、docker命令
  3. 3. 2、docker怎样实现容器件的独立
  4. 4. 3、Linux如何挂载windows下的共享目录
  5. 5. 4、查看http的并发请求数与其TCP连接状态
  6. 6. 5、用tcpdump嗅探80端口的访问看看谁最高。
  7. 7. 6、查看/var/log目录下的文件数
  8. 8. 7、查看当前系统每个ip的连接数
  9. 9. 8、shell下32位随机密码生成。
  10. 10. 9、统计出apache的access.log中访问量最多的5个ip。
  11. 11. 10、如何查看二进制文件的内容
  12. 12. 11、ps aux 中的VSZ代表什么意思,RSS代表什么意思
    1. 12.1. 12、Linux 系统的开机启动顺序
  13. 13. 13、符号链接与硬链接的区别
  14. 14. 14、保存当前磁盘分区的分区表
  15. 15. 15.如何在文本里面进行复制、粘贴,删除行,删除全部,按行查找和按字母查找。
  16. 16. 16、手动安装grub
  17. 17. 17、修改内核参数
  18. 18. 18、在1-39内取随机数
  19. 19. 19、限制apache每秒新建连接数为1,峰值为3
  20. 20. 20.FTP 的主动模式和被动模式
  21. 21. 21、显示/etc/inittab中以#开头,且后面跟了一个或者多个空白字符,而后又跟了任意非空白字符的行。
  22. 22. 22.显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行
  23. 23. 23、怎么把脚本添加到系统服务里,即用service来调用
  24. 24. 24、写一个脚本,实现批量添加20个用户,用户名为user01-20,密码为user后面跟5个随机字符
  25. 25. 25、写一个脚本,实现判断192.168.1.0/24网络里,当前在线的IP有哪些,能ping通则认为在线
  26. 26. 27、写一个脚本:(26 包括3个小题)
  27. 27. 28、写一个脚本:(27 包括2个小题)
  28. 28. 28、如何让history命令显示具体时间?