Linux 运维面试题整理

1.如何查看http的并发请求数与其TCP连接状态?

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

2.如何查看/var/log目录下的文件数?

文件是-开头的权限,目录是d开头
ls /var/log/ -1R |grep "-"|wc -l

3.如何查看Linux系统每个ip的连接数?

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

4.shell下生成32位随机数

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n1

5.如何查看二进制文件的内容?

进制查看工具
hexdump、xxd与od

hexdump -C XXX(文件名) 

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

6.介绍下Linux系统的开机启动顺序

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

7.符号链接与硬链接的区别

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

8.保存当前磁盘分区的分区表

dd 命令是以个强大的命令,在复制的同时进行转换
dd if=/dev/sda of=./mbr.txt bs=1 count=512

9.修改内核参数

vi /etc/sysctl.conf 这里修改参数
sysctl -p 刷新后可用

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

#每秒新建连接数 一般都是由防火墙来做,apache本身好像无法设置每秒新建连接数,只能设置最大连接:
iptables -A INPUT -d 172.16.100.1 -p tcp –d port 80 -m limit –limit 1/second -j ACCEPT

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

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

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

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

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

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

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

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

grep "\:[0-9]\{1\}:" a.txt 

13.怎么把脚本添加到系统服务里,即用service来调用?

vi /etc/init.d/servicename
#!/bin/bash
# chkconfig: 345 85 15
# description: httpd
然后保存
在chkconfig工具服务列表中增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了;
chkconfig --add servicename 创建系统服务
现在就可以使用service 来 start or restart

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

#!/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 --stdin user$i >/dev/null 2>&1

done

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

#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
for ip in `seq 1 255`
do
ping -c 1 10.0.0.$ip &>/dev/null 
if [ $? -eq 0 ];then
        action "10.0.0.$ip " /bin/true
else
        action "10.0.0.$ip" /bin/false
fi
done

16.写一个脚本,要求如何:

创建一个函数,能接受两个参数:
1)第一个参数为URL,即可下载的文件;第二个参数为目录,即下载后保存的位置;
2)如果用户给的目录不存在,则提示用户是否创建;如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本;
3)如果给的目录存在,则下载文件;下载命令执行结束后测试文件下载成功与否;如果成功,则返回0给调用脚本,否则,返回52给调用脚本;

#bin/bash
url=$1
dir=$2
download(){
        cd $dir &>/dev/null
        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 &>/dev/null
        else
        return "51"
        fi
        else
        wget $url &>/dev/null
fi
if [ $? -ne 0 ];then
        return "52"
fi
}
download

17.如何让history命令显示具体时间?

HISTTIMEFORMAT=”%Y-%m-%d %H:%M:%S”
export HISTTIMEFORMAT
重新开机后会还原,可以写/etc/profile

18.如何过滤出已知当前目录下oldboy中的所有一级目录(不包含子目录,即只能是一级目录)

方法1:find ./ -type d -maxdepth 1
方法2:ls -F
方法3:ls -l  | grep ^d

19.一个目录中有很多文件(ls查看时好多屏),想最快速度查看到最近更新的文件,如何看?

ls -lrt  /etc #最底部的就是最新更新的文件

参数说明:
-r, –reverse #翻转排序
-t #按照修改时间排序

20.服务的访问日志按天记录在服务器本地目录/app/logs下,由于磁盘空间紧张,现在要求只能保留最近7天访问日志!请问如何解决?

find /app/logs/* -mtime +7 -type f -name “*.log” -exec rm -f {} \; #查找7天以前的日志并删除之

21.打印配置文件nginx.conf内容的行号及内容,该如何做?

方法1:cat -n nginx.conf
方法2:less -N nginx.conf
方法3:grep -n . nginx.conf #此处的.(点)号,表示任意单个字符,-n是给过滤出的每一行加行号

22.如何查看/etc/services文件有多少行?

方法1:直接使用命令wc
wc -l  /etc/services

方法2:给文件内容加行号
cat -n  /etc/services | tail -1

方法3:使用sed命令

sed  -n  ‘$=’  /etc/services

方法4:使用grep命令

grep -n $ /etc/services | tail -1

23.请过滤出ifconfig中的ip地址?

方法1:ifconfig eth1|grep “inet add”|cut -d’:’ -f2|cut -d’ ‘ -f1
方法2:ifconfig eth1|grep “inet addr”|awk -F: ‘{print $2}’|awk ‘{print $1}’
方法3:ifconfig eth0|awk -F '[ :]+' 'NR==2{print $3}'
方法4:ifconfig eth0|sed -n ‘2p’|sed ‘s#^.*addr:##g’|sed ‘s# Bc.*$##g’

24.打印出kaka文件中除掉空行的内容

方法1:grep -v “^$” kaka
方法2:sed  ‘/^$/d’ kaka

25.打印3天前的日期,格式如:2016-05-06

方法1:date “+%F” -d “3 day ago”
方法2:date “+%F” -d “-3 day”

26.编写脚本实现以下功能

每天早上5点开始做备份
要备份的是/var/mylog里所有文件和目录可以压缩进行备份
备份可以保存到别一台器上192、168、1、2 FTP帐号 aaa 密码 bbb
要示每天
的备份文件要带有当天的日期标记

#!/bin/bash
bakdir=mylog
date=`date +%F`
cd /var
tar zcf ${bakdir}_${date}.tar.gz ${bakdir}
sleep 1
ftp -n <<- EOF
open 192.168.142.129    #远程ftp服务器IP
user aaa bbb
put mylog_*.tar.gz
bye
EOF  

#添加crontab:
crontab -e
00 05 * * * /bin/bash /root/mylogbak.sh     #每天早上5点开始执行备份脚本

27.避免从互联网访问MySQL数据库,确保特定主机才拥有访问特权

  > GRANT ALL ON *.* TO 'root'@'%';
  这其实是完全放开了对root的访问。所以,把重要的操作限制给特定主机非常重要:

  > GRANT ALL ON *.* TO 'root'@'localhost';
  > GRANT ALL ON *.* TO 'root'@'IP'
  > FLUSH PRIVILEGES
  此时,你仍有完全的访问,但只有指定的IP(不管其是否静态)可以访问。

  创建用户
  CREATE USER 'user1'@'%' IDENTIFIED BY 'yourpasswd';

28.MySQL设置root用户的口令并改变其登录名

在MySQL控制台中执行:
> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
> UPDATE user SET user="another_username" WHERE user="root";

$ mysqladmin -u root password new_password

29.MySQL移除匿名账户和废弃的账户

DROP USER "";
或
DELETE FROM user WHERE user="";

30.mysql 主从复制原理

从库生成两个线程,一个I/O线程,一个SQL线程;

i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;

SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

31.将文件/etc/a 下中除了 b文件外的所有文件压缩打包放到/home/a下,名字为a.gz

tar -zvcf a.gz /etc/a –exclude=/etc/a/b

32.如何查看test进程所打开的所有文件

lsof -u test

33.请用iptables控制来自192.168.1.2主机的80端口请求

iptables -A INPUT -p tcp -s 192.168.1.2 –dport 80 -j ACCEPT

34.请用shell脚本创建一个组class、一组用户,用户名为stdX X从01-30,并归属class组

groupadd class&&for a in {1..30};do useradd std$a -g class;done

35.把文件file1和file2连在一起,然后输出到屏幕上。

cat -n file1file2

36.patch命令是什么?如何使用?

顾名思义,patch命令就是用来将修改(或补丁)写进文本文件里。patch命令通常是接收diff的输出并把文件的旧版本转换为新版本。举个例子,Linux内核源代码由百万行代码文件构成,所以无论何时,任何代码贡献者贡献出代码,
只需发送改动的部分而不是整个源代码,然后接收者用patch命令将改动写进原始的源代码里。

创建一个diff文件给patch使用,
# diff -Naur old_file new_file > diff_file
旧文件和新文件要么都是单个的文件要么都是包含文件的目录,-r参数支持目录树递归。

一旦diff文件创建好,我们就能在旧的文件上打上补丁,把它变成新文件:
# patch < diff_file

37.cpio命令是什么?

cpio就是复制入和复制出的意思。cpio可以向一个归档文件(或单个文件)复制文件、列表,还可以从中提取文件。

38.linux系统中的/proc文件系统有什么用?

/proc文件系统是一个基于内存的文件系统,其维护着关于当前正在运行的内核状态信息,其中包括CPU、内存、分区划分、I/O地址、直接内存访问通道和正在运行的进程。
这个文件系统所代表的并不是各种实际存储信息的文件,它们指向的是内存里的信息。/proc文件系统是由系统自动维护的。

39.find操作

如何在/usr目录下找出大小超过10MB的文件?
find /usr -size +10M

如何在/home目录下找出120天之前被修改过的文件?
find /home -mtime +120

如何在/var目录下找出90天之内未被访问过的文件?
find /var \! -atime -90

将/usr/local/test目录下大于100K 的文件转移到/tmp 目录下。
find /usr/local/test -type f -size +100k -exec mv {} /tmp \;

40.tee 过滤器有什么作用 ?

tee 过滤器用来向多个目标发送输出内容。如果用于管道的话,它可以将输出复制一份到一个文件,并复制另外一份到屏幕上(或一些其它程序)。

linuxtechi@localhost:~$ ll /etc | nl | tee /tmp/ll.out
在以上例子中,从ll输出可以捕获到 /tmp/ll.out 文件中,并且同样在屏幕上显示了出来。

41.Linux文件系统变成只读的解决方法

1、重启看是否可以修复(很多机器可以的)。
2、以光盘启动进入救援模式(linux rescue),执行"fsck.ext3 -y /dev/sda2" (假如只读的分区类型为ext3,分区为/dev/sda2)

42.在这个月内,每天的早上 6 点到 12 点中,每隔 2 小时创建一个test.txt文件,内容为ok,如何实现?

a、crontab -e 进入编辑模式
b、添加以下内容 0 6-12/2 * 4 * /bin/echo "ok" > test.txt (以4月为例)
c、启动服务 service crontab start;chkconfig crontab on

43.Linux下nfs在客户端无法挂载,请写出排查步骤?

a、检查是否是防火墙或selinux的影响
b、检查语法与服务器地址是否错误(只能挂载目录,不能挂载文件)
c、在服务端检查配置文件是否正确及客户端是否有权限访问

44.swaSp交换分区是干什么的,如何设置它的大小,500G的内存,swap应设为多少

SWAP交换分区,就是我们课本说讲过的虚拟内存的概念。

当Linux系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。

一般来说可以按照如下规则设置swap大小:
4G以内的物理内存,SWAP 设置为内存的2倍。
4-8G的物理内存,SWAP 等于内存大小。
8-64G 的物理内存,SWAP 设置为8G。
64-256G物理内存,SWAP 设置为16G。

实际上,系统中交换分区的大小并不取决于物理内存的量,而是取决于系统中内存的负荷,所以在安装系统时要根据具体的业务来设置SWAP的值。

系统在什么情况下才会使用SWAP?
实际上,并不是等所有的物理内存都消耗完毕之后,才去使用swap的空间,什么时候使用是由swappiness 参数值控制。

cat /proc/sys/vm/swappiness
60
该值默认值是60.

swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,

swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。

现在服务器的内存动不动就是上百G,所以我们可以把这个参数值设置的低一些,让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高系统的性能。

如何修改swappiness参数?
临时性修改:
sysctl vm.swappiness=10
cat /proc/sys/vm/swappiness
这里我们的修改已经生效,但是如果我们重启了系统,又会变成60.

永久修改:
在/etc/sysctl.conf 文件里添加如下参数:
vm.swappiness=10

45.查看某个进程是否使用了swap空间

awk '/^Swap:/ {SWAP+=$2}END{print SWAP" KB"}' /proc/$(pid)/smaps

查看swap空间都被哪些进程使用
#!/bin/bash

function getswap {
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
do
let SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"
let OVERALL=$OVERALL+$SUM
SUM=0
 
done
echo "Overall swap used: $OVERALL"
}
 
getswap
#getswap|egrep -v "Swap used: 0"

46.raidOl 和 raidlO 的区别

RAID 1+0 (RAID 0 over RAID 1)即先组建RAID 1,然后把组建好的RAID 1 再组建成 RAID 0

RAID 0+1 (RAID 1 over RAID 0)即先组建RAID 0,然后把组建好的RAID 0 再组建成 RAID 1

由于RAID 0+1时,先做RAID 0,没有数据备份,因此数据可靠性来说比RAID 1+0要更差。

由于数据库对磁盘的读写性能和可靠性都有很高的要求,因此采用RAID 1+0 更为合适。

47.查看磁盘io的几种方法

第一种:用 top 命令 中的cpu 信息观察
wa 的百分比可以大致的体现出当前的磁盘io请求是否频繁。如果 wa的数量比较大,说明等待输入输出的的io比较多。
第二种:用vmstat
vmstat 命令报告关于线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。
vmstat 2 5
IO
如果发现等待的进程和处在非中断睡眠状态的进程数非常多,并且发送到块设备的块数和从块设备接收到的块数非常大,那就说明磁盘io比较多。
第三种:用iostat
 iostat -dx

r/s 和 w/s 分别是每秒的读操作和写操作,而rKB/s 和wKB/s 列以每秒千字节为单位显示了读和写的数据量
如果这两对数据值都很高的话说明磁盘io操作是很频繁。

48.系统负载,1,5,15,参数的合理范围

什么样的Load Average值得警惕(单核)?
Load < 0.7时:系统很闲,马路上没什么车,要考虑多部署一些服务
0.7 < Load < 1时:系统状态不错,马路可以轻松应对
Load == 1时:系统马上要处理不多来了,赶紧找一下原因
Load > 1时:马路已经非常繁忙了,进入马路的每辆汽车都要无法很快的运行

三种Load Average值,应该看哪个(单核)?
通常我们先看15分钟load,如果load很高,再看1分钟和5分钟负载,查看是否有下降趋势。


,"load average"一共返回三个平均值:1分钟系统负荷、5分钟系统负荷,15分钟系统负荷;

如果只有1分钟的系统负荷大于1.0,其他两个时间段都小于1.0,这表明只是暂时现象,问题不大。

如果15分钟内,平均系统负荷大于1.0(调整CPU核心数之后),表明问题持续存在,不是暂时现象。所以,你应该主要观察"15分钟系统负荷",将它作为电脑正常运行的指标。

49.redis单线程为什么效率高

Redis采用的是基于内存的采用的是单进程单线程模型的key/value数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);

2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;

3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

4、使用多路I/O复用模型,非阻塞IO;

5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现的。

redis的io模型主要是基于epoll实现的,不过它也提供了 select和kqueue的实现,默认采用epoll。
epoll到底是个什么东西呢? 其实只是众多i/o多路复用技术当中的一种而已,但是相比其他io多路复用技术(select, poll等等),epoll有诸多优点:
  1. epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大  ,具体数目可以 cat /proc/sys/fs/file-max 察看。
  2. 效率提升, Epoll 最大的优点就在于它只管你“活跃”的连接 ,而跟连接总数无关,因此在实际的网络环境中, Epoll 的效率就会远远高于 select 和 poll 。
  3. 内存拷贝, Epoll 在这点上使用了“共享内存 ”,这个内存拷贝也省略了。

epoll与select/poll的区别
     select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪,能够通知程序进行相应的操作。
     select的本质是采用32个整数的32位,即32*32= 1024来标识,fd值为1-1024。当fd的值超过1024限制时,就必须修改FD_SETSIZE的大小。这个时候就可以标识32*max值范围的fd。
     poll与select不同,通过一个pollfd数组向内核传递需要关注的事件,故没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次。
     epoll还是poll的一种优化,返回后不需要对所有的fd进行遍历,在内核中维持了fd的列表。select和poll是将这个内核列表维持在用户态,然后传递到内核中。与poll/select不同,epoll不再是一个单独的系统调用,而是由epoll_create/epoll_ctl/epoll_wait三个系统调用组成,后面将会看到这样做的好处。epoll在2.6以后的内核才支持。

select/poll的几大缺点:
1、每次调用select/poll,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
2、同时每次调用select/poll都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
3、针对select支持的文件描述符数量太小了,默认是1024
4.select返回的是含有整个句柄的数组,应用程序需要遍历整个数组才能发现哪些句柄发生了事件;
5.select的触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符进行IO操作,那么之后每次select调用还是会将这些文件描述符通知进程。
相比select模型,poll使用链表保存文件描述符,因此没有了监视文件数量的限制,但其他三个缺点依然存在。

50.运维填空题整理

  1. 在Linux 系统 中,以文件方式访问设备 。
  2. Linux 内核引导时,从文件/etc/fstab中读取要加载的文件系统 。
  3. Linux 文件系统中每个文件用indoe节点来标识。
  4. 全部磁盘块由四个部分组成,分别为引导块 、专用块 、 i 节点表块 和 数据存储块
  5. 链接分为:硬链接符号链接
  6. 超级块包含了i 节点表空闲块表 等重要的文件系统信息。
  7. 系统管理的任务之一是能够在分布式 环境中实现对程序和数据的安全保护、备份、恢复和更新
  8. 系统交换分区是作为系统虚拟存储器 的一块区域 。
  9. 内核分为进程管理系统 、 内存管理系统 、 I/O 管理系统 和 文件管理系统 等四个子系统。
  10. 在Linux 系统中所有内容都被表示为文件,组织文件的各种方法称为文件系统
  11. 硬连接只能建立对文件 链接。符号链接可以跨不同文件系统创建。
  12. 进程的运行有两种方式,即 独立运行使用父进程运行
  13. 在shell 编程时,使用方括号表示测试条件的规则是:方括号两边必须有空格
  14. 路由选择 协议(RIP)的跳数表示到达目的地之前必须通过的网关 数,RIP 接受的最长距离是 15 跳 。
  15. /sbin 目录用来存放系统管理员使用的管理程序。
  16. ping 命令用于测试网络的连通性,ping 命令通过 ICMP 协议(internet 控制信息协议)来实现。

转载并修改自

https://www.cnblogs.com/benjamin77/category/1117956.html
https://www.cnblogs.com/byfboke/articles/8992049.html
https://blog.csdn.net/weixin_41846313/article/details/85199364
https://blog.csdn.net/jiajiren11/article/details/90381703
https://blog.csdn.net/wxy941011/article/details/80274233