操作系统题库(三)

16.如何选择 Linux 操作系统版本?

作答

优先选择熟悉的操作系统,然后选择仍然在官方支持的版本。优先选择熟悉的系统可以更好更快的开发业务,选择官方支持的版本能够保持软件源的更新和及时同步安全补丁,同时有更好的社区支持。

按我来说就是CentOS 7。

答案

一般来讲,桌面用户首选 Ubuntu ;服务器首选 RHEL 或 CentOS ,两者中首选 CentOS 。

根据具体要求:

  • 安全性要求较高,则选择 Debian 或者 FreeBSD 。
  • 需要使用数据库高级服务和电子邮件网络应用的用户可以选择 SUSE 。
  • 想要新技术新功能可以选择 Feddora ,Feddora 是 RHEL 和 CentOS 的一个测试版和预发布版本。
  • 【重点】根据现有状况,绝大多数互联网公司选择 CentOS 。现在比较常用的是 7 系列,现在市场占有大概一半左右。另外的原因是 CentOS 更侧重服务器领域,并且无版权约束

17. 如何规划一台 Linux 主机,步骤是怎样?

作答

1、确定机器是做什么用的,比如是做 WEB 、DB、还是游戏服务器。

不同的用途,机器的配置会有所不同。

  • 2、确定好之后,就要定系统需要怎么安装,默认安装哪些系统、分区怎么做。
  • 3、需要优化系统的哪些参数,需要创建哪些用户等等的。

答案

1、确定机器是做什么用的,比如是做 WEB 、DB、还是游戏服务器。

不同的用途,机器的配置会有所不同。

  • 2、确定好之后,就要定系统需要怎么安装,默认安装哪些系统、分区怎么做。
  • 3、需要优化系统的哪些参数,需要创建哪些用户等等的。

⭐❤️😘✨18.请问当用户反馈网站访问慢,你会如何处理?

作答

问题排查:

  1. 排查物理资源是否足够,前提是有资源监控(通常我的服务器都会在业务场景上部署资源监控程序),检查带宽、CPU负载、内存、磁盘空间和读写速度这些资源是否足够。
  2. 排查web反代程序(如Nginx、Caddy、Traefik)配置是否正确。
  3. 排查web程序并发是否达到上线前的压测(QPS、TPS)均值,合理的上线流程需要做好压测,估计并发量。
  4. 做CDN测试,通常网络质量也是影响用户体验的关键数值。
  5. 检测是否有洪水攻击、DDoS、CC,可能存在竞业攻击或者恶意攻击。

性能优化:

  1. 套CDN,做静态资源的多节点缓存。
  2. nginx做前端静态资源的压缩(gzip、brotli压缩算法支持)
  3. 前后端分离,前端静态资源设计localstore缓存,减少不必要的网络请求
  4. 后端做合并请求,减少请求数
  5. 增加缓存中间件的设计,使用内存数据库(如redis),将一些频繁请求又不常变化的数据缓存,提升IO性能。
  6. 增加硬件资源(带宽、CPU、服务器集群等)
  7. 前端做异步加载,一些数据量比较大的请求,使用Ajax
  8. 后端将一些频繁查询数据库的接口,做数据缓存
  9. 后端将一些计算量比较大却不会变动的聚合数据,做磁盘缓存

答案

有哪些方面的因素会导致网站网站访问慢?

  • 1、服务器出口带宽不够用

    • 本身服务器购买的出口带宽比较小。一旦并发量大的话,就会造成分给每个用户的出口带宽就小,访问速度自然就会慢。
    • 跨运营商网络导致带宽缩减。例如,公司网站放在电信的网络上,那么客户这边对接是长城宽带或联通,这也可能导致带宽的缩减。
  • 2、服务器负载过大,导致响应不过来

    可以从两个方面入手分析:

    • 分析系统负载,使用 w 命令或者 uptime 命令查看系统负载。如果负载很高,则使用 top 命令查看 CPU ,MEM 等占用情况,要么是 CPU 繁忙,要么是内存不够。
    • 如果这二者都正常,再去使用 sar 命令分析网卡流量,分析是不是遭到了攻击。一旦分析出问题的原因,采取对应的措施解决,如决定要不要杀死一些进程,或者禁止一些访问等。
  • 3、数据库瓶颈

    • 如果慢查询比较多。那么就要开发人员或 DBA 协助进行 SQL 语句的优化。
    • 如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等。然后,也可以搭建 MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。
  • 4、网站开发代码没有优化好

    • 例如 SQL 语句没有优化,导致数据库读写相当耗时。

    针对网站访问慢,怎么去排查?

  • 1、首先要确定是用户端还是服务端的问题。当接到用户反馈访问慢,那边自己立即访问网站看看,如果自己这边访问快,基本断定是用户端问题,就需要耐心跟客户解释,协助客户解决问题。

    不要上来就看服务端的问题。一定要从源头开始,逐步逐步往下。

  • 2、如果访问也慢,那么可以利用浏览器的调试功能,看看加载那一项数据消耗时间过多,是图片加载慢,还是某些数据加载慢。

  • 3、针对服务器负载情况。查看服务器硬件(网络、CPU、内存)的消耗情况。如果是购买的云主机,比如阿里云,可以登录阿里云平台提供各方面的监控,比如 CPU、内存、带宽的使用情况。

  • 4、如果发现硬件资源消耗都不高,那么就需要通过查日志,比如看看 MySQL慢查询的日志,看看是不是某条 SQL 语句查询慢,导致网站访问慢。

怎么去解决?

  • 1、如果是出口带宽问题,那么久申请加大出口带宽。
  • 2、如果慢查询比较多,那么就要开发人员或 DBA 协助进行 SQL 语句的优化。
  • 3、如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等等。然后也可以搭建MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。
  • 4、申请购买 CDN 服务,加载用户的访问。
  • 5、如果访问还比较慢,那就需要从整体架构上进行优化咯。做到专角色专用,多台服务器提供同一个服务。

19.如何排查 CPU load 过高问题?

作答

  1. top查看cpu avg,通常三个数值要低于CPU的核数才能确保资源满足,最佳状态不超过cpu核数*0.75
  2. top/htop查看cpu占用资源最高的进程
  3. 最后检查程序设计是否合理(例如递归问题)

答案

1. 首先排查哪些进程cpu占用率高。 通过命令 ps ux

image

2. 查看对应java进程的每个线程的CPU占用率。通过命令:ps -Lp 15047 cu

image

3. 追踪线程内部,查看load过高原因。通过命令:jstack 15047。

或者打印线程 jstack pidof java > stack.out

查找到对应的threadid, 再反查代码。

20.Linux 性能调优都有哪几种方法?

作答

  1. 设置swap缓存

我觉得都问这个问题了,你服务器买好点吧。。。。。。low炮,linux开源系统经过长期考验,有什么好调?

答案

1、Disabling daemons (关闭 daemons)。

2、Shutting down the GUI (关闭 GUI)。

3、Changing kernel parameters (改变内核参数)。

4、Kernel parameters (内核参数)。

5、Tuning the processor subsystem (处理器子系统调优)。

6、Tuning the memory subsystem (内存子系统调优)。

7、Tuning the file system (文件系统子系统调优)。

8、Tuning the network subsystem(网络子系统调优)。

21.Shell 脚本是什么?

作答

Linux内置bash支持shell脚本语言,这是一种解释型编程语言。shell脚本实际上是集成了一些Linux命令和流程控制的代码程序,可以直接在Linux系统中运行,不需要额外安装编译器或者解释器。

答案

一个 Shell 脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell 脚本)来完成这些日常工作任务。

22.什么是默认登录 Shell ?

作答

Linux系统最基本的控制方式是通过CLI,而要操控Linux都是默认通过Bash Shell程序,进行命令行的交互式控制,所以Linux默认登录shell,才提供了交互式操控系统的功能。

答案

在 Linux 操作系统,""/bin/bash"" 是默认登录 Shell,是在创建用户时分配的。

使用 chsh 命令可以改变默认的 Shell 。示例如下所示:

1
2
$ chsh <用户名> -s <新shell>
$ chsh linuxtechi -s /bin/sh

23.在 Shell 脚本中,如何写入注释?

作答

使用#号做注释符合,#所在行后面的字符将作为注释。

答案

注释可以用来描述一个脚本可以做什么和它是如何工作的。每一行注释以 # 开头。例子如下:

1
2
3
#!/bin/bash
# This is a command
echo "I am logged in as $USER"

24.可以在 Shell 脚本中使用哪些类型的变量?

作答

  1. 数字类型
  2. 字符类型

答案

在 Shell 脚本,我们可以使用两种类型的变量:

  • 系统定义变量

    系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过 set 命令查看。

  • 用户定义变量

    用户变量由系统用户来生成和定义,变量的值可以通过命令 ""echo $<变量名>"" 查看。

25.Shell脚本中 $? 标记的用途是什么?

作答

$?能够获取上一个逻辑判断语句的结果。

答案

在写一个 Shell 脚本时,如果你想要检查前一命令是否执行成功,在 if 条件中使用 $? 可以来检查前一命令的结束状态。

  • 如果结束状态是 0 ,说明前一个命令执行成功。例如:

    1
    2
    3
    4
    root@localhost:~# ls /usr/bin/shar
    /usr/bin/shar
    root@localhost:~# echo $?
    0
  • 如果结束状态不是0,说明命令执行失败。例如:

    1
    2
    3
    4
    root@localhost:~# ls /usr/bin/share
    ls: cannot access /usr/bin/share: No such file or directory
    root@localhost:~# echo $?
    2

26. Bourne Shell(bash) 中有哪些特殊的变量?

作答

答案

下面的表列出了 Bourne Shell 为命令行设置的特殊变量。

1
2
3
4
5
6
7
8
内建变量    解释
$0 命令行中的脚本名字
$1 第一个命令行参数
$2 第二个命令行参数
….. …….
$9 第九个命令行参数
$# 命令行参数的数量
$* 所有命令行参数,以空格隔开

27.如何取消变量或取消变量赋值?

作答

答案

unset 命令用于取消变量或取消变量赋值。语法如下所示:

1
# unset <变量名>

28.Shell 脚本中 if 语法如何嵌套?

作答

1
2
3
4
if [''=''];then
if [];then
if
fi

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if [ 条件 ]
then
命令1
命令2
……
else
if [ 条件 ]
then
命令1
命令2
….
else
命令1
命令2
……
fi
fi

29.在 Shell 脚本中如何比较两个数字?

作答

1
2
3
if [ 1 < 2];then
echo "1比2小"
fi

答案

if-then 中使用测试命令( -gt 等)来比较两个数字。例如:

1
2
3
4
5
6
7
8
9
#!/bin/bash
x=10
y=20
if [ $x -gt $y ]
then
echo "x is greater than y"
else
echo "y is greater than x"
fi

30.Shell 脚本中 case 语句的语法?

作答

答案

基础语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac

31. Shell 脚本中 for 循环语法?

作答

答案

与其他编程语言类似,Shell支持for循环。

for循环一般格式为:

1
2
3
4
5
6
7
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

写成一行:

1
for var in item1 item2 ... itemN; do command1; command2… done;

当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。

in列表是可选的,如果不用它,for循环使用命令行的位置参数。

例如,顺序输出当前列表中的数字:

实例

1
2
3
4
for loop i 1 2 3 4 5
do
echo "The value is: $loop"
done

输出结果:

1
2
3
4
5
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

顺序输出字符串中的字符:

1
2
3
4
5
6
#!/bin/bash

for str in This is a string
do
echo $str
done

输出结果:

1
2
3
4
This
is
a
string

32.Shell 脚本中 while 循环语法?

作答

答案

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:

1
2
3
4
while condition
do
command
done

33. do-while 语句的基本格式?

作答

答案

do-while 语句类似于 while 语句,但检查条件语句之前先执行命令(LCTT 译注:意即至少执行一次。)。下面是用 do-while 语句的语法:

1
2
3
4
do
{
命令
} while (条件)

34.Shell 脚本中 break 命令的作用?

作答

退出循环、退出流程控制

答案

break 命令一个简单的用途是退出执行中的循环。我们可以在 whileuntil 循环中使用 break 命令跳出循环。

35.Shell 脚本中 continue 命令的作用?

作答

答案

continue 命令不同于 break 命令,它只跳出当前循环的迭代,而不是整个循环。continue 命令很多时候是很有用的,例如错误发生,但我们依然希望继续执行大循环的时候。

36.如何使脚本可执行?

作答

chmod +x 文件路径添加可执行权限,或者使用bash 脚本文件直接执行

答案

37. #!/bin/bash 的作用?

作答

脚本首行添加,指定执行脚本的程序。同样适用于python。

使用chmod添加可执行权限,可以直接通过./文件名执行脚本。

答案

#!/bin/bash 是 Shell 脚本的第一行,称为释伴(shebang)行。

  • 这里 # 符号叫做 hash ,而 ! 叫做 bang。
  • 它的意思是命令通过 /bin/bash 来执行。

38.如何调试 Shell脚本?

作答

答案

  • 使用 -x' 数(sh -x myscript.sh)可以调试 Shell脚本。

  • 另一个种方法是使用 -nv 参数(sh -nv myscript.sh)。

⭐39.如何将标准输出和错误输出同时重定向到同一位置?

作答

bash xxx.sh 2>&1 >> xxx.log

答案

  • 方法一:2>&1 (如# ls /usr/share/doc > out.txt 2>&1 )

  • 方法二:&> (如# ls /usr/share/doc &> out.txt )

40.在 Shell 脚本中,如何测试文件?

作答

答案

test 命令可以用来测试文件。基础用法如下表格:

1
2
3
4
5
6
7
8
Test         用法
-d 文件名 如果文件存在并且是目录,返回true
-e 文件名 如果文件存在,返回true
-f 文件名 如果文件存在并且是普通文件,返回true
-r 文件名 如果文件存在并可读,返回true
-s 文件名 如果文件存在并且不为空,返回true
-w 文件名 如果文件存在并可写,返回true
-x 文件名 如果文件存在并可执行,返回true

41. 在 Shell 脚本如何定义函数呢?

作答

1
2
3
函数名(){
echo ''
}

答案

函数是拥有名字的代码块。当我们定义代码块,我们就可以在我们的脚本调用函数名字,该块就会被执行。示例如下所示:

1
2
3
4
5
6
7
$ diskusage () { df -h ; }
译注:下面是我给的shell函数语法,原文没有
[ function ] 函数名 [()]
{
命令;
[return int;]
}

⭐42. 如何让 Shell 就脚本得到来自终端的输入?

作答

read命令

答案

read 命令可以读取来自终端(使用键盘)的数据。read 命令得到用户的输入并置于你给出的变量中。例子如下:

1
2
3
4
5
6
7
8
9
# vi /tmp/test.sh
#!/bin/bash
echo 'Please enter your name'
read name
echo "My Name is $name"
# ./test.sh
Please enter your name
LinuxTechi
My Name is LinuxTechi

⭐43.如何执行算术运算?

作答

+ - * / %

答案

有两种方法来执行算术运算:

  • 1、使用 expr 命令:# expr 5 + 2
  • 2、用一个美元符号和方括号($[ 表达式 ]):test=$[16 + 4] ; test=$[16 + 4]

⭐44.一台 Linux 系统初始化环境后需要做一些什么安全工作?

作答

配置防火墙iptablesfirewalld

答案

  • 1、添加普通用户登陆,禁止 root 用户登陆,更改 SSH 端口号。

  • 2、服务器使用密钥登陆,禁止密码登陆。

  • 3、开启防火墙,关闭 SElinux ,根据业务需求设置相应的防火墙规则。

  • 4、装 fail2ban 这种防止 SSH 暴力破击的软件。

  • 5、设置只允许公司办公网出口 IP 能登陆服务器(看公司实际需要)

  • 6、修改历史命令记录的条数为 10 条。

  • 7、只允许有需要的服务器可以访问外网,其它全部禁止。

  • 8、做好软件层面的防护。

    • 8.1 设置 nginx_waf 模块防止 SQL 注入。

    • 8.2 把 Web 服务使用 www 用户启动,更改网站目录的所有者和所属组为 www 。

45.什么叫 CC 攻击?什么叫 DDOS 攻击?

作答

答案

  • CC 攻击,主要是用来攻击页面的,模拟多个用户不停的对你的页面进行访问,从而使你的系统资源消耗殆尽。
  • DDOS 攻击,中文名叫分布式拒绝服务攻击,指借助服务器技术将多个计算机联合起来作为攻击平台,来对一个或多个目标发动 DDOS 攻击。

⭐46.怎么预防 CC 攻击和 DDOS 攻击?

作答

  1. 使用高防IP服务,购买ISP的防御流量。
  2. 配置CDN资源分发。
  3. iptables在链路层做一些IP封禁的定时脚本(可能误杀用户,控制可接受的范围即可)。
  4. cloudflare的DNS自带cdn真实IP隐藏
  5. waf(听说过,不了解)

答案

防 CC、DDOS 攻击,这些只能是用硬件防火墙做流量清洗,将攻击流量引入黑洞。

流量清洗这一块,主要是买 ISP 服务商的防攻击的服务就可以,机房一般有空余流量,我们一般是买服务,毕竟攻击不会是持续长时间。

例如说,《阿里云 —— DDoS 高防IP》

⭐47.什么是网站数据库注入?

作答

SQL注入,一种网站攻击。还有XSS攻击

通过web网站的前端输入框或者api接口传入SQL语句,直接操作数据库,达到攻击行为。

预防方案:

  1. 使用成熟的ORM框架,防注入。
  2. 在前端进行正则审计,过滤sql语句。
  3. 后端不通过传入的字符直接构造sql语句,使用预先构造并编译的sql语句,预防注入。

答案

  • 由于程序员的水平及经验参差不齐,大部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断。
  • 应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的 SQL 注入。
  • SQL注入,是从正常的 WWW 端口访问,而且表面看起来跟一般的 Web 页面访问没什么区别,如果管理员没查看日志的习惯,可能被入侵很长时间都不会发觉。

48.如何过滤与预防?

作答

参考 37

答案

数据库网页端注入这种,可以考虑使用 nginx_waf 做过滤与预防。

49.如何配置静态 IP ?

作答

答案

1
2
测试服务器OS: Centos 6.5 x64
本机OS: Ubuntu 14.04 x64

由于Virtualbox当时安装Centos 6.5的时候设置的是自动获取的IP,所以局域网内每次启动,IP有时候会变化
如果本地测试最好固定静态IP

1
2
#用户root登陆到服务器,编辑配置信息
vi /etc/sysconfig/network-scripts/ifcfg-eth0

设置如下内容,有则改之,无则添加

1
2
3
4
5
6
DEVICE=eth0
BOOTPROT=static
IPADDR=192.168.1.200
GATEWAY=192.168.1.1
NETMASK=255.255.255.0
ONBOOT=yes

之后保存
然后重启网卡即可

1
service network restart

现在试试吧,IP已经变为192.168.1.200
直接远程登陆

1
ssh [email protected]

50.设置 DNS 需要修改哪个配置文件?

作答

/etc/hosts

答案

全局的配置,可以在 /etc/resolv.conf 文件中配置。

指定网卡的配置,可以在 /etc/sysconfig/network-scripts/ifcfg-eth0 文件中配置。

一般来说,肯定是全局配置即可。

51./etc/hosts 文件什么做用?

作答

配置本地的域名和IP的映射关系,当网络请求,需要dns解析域名的时候,会优先使用该配置的IP地址。

答案

/etc/hosts 文中,我们可以配置指定域名和 IP 的映射关系。详细的,可以看看 《Linux环境下 /etc/hosts 文件详解》 文章。

52. 在 Linux 下如何指定dns服务器,来解析某个域名?

作答

答案

使用 dig 命令:dig @DNSip http://domain.com 。例如:

1
dig @8.8.8.8 www.baidu.com # 使用谷歌 DNS 解析百度

53.iptables 命令?

作答

答案

iptables ,是一个配置 Linux 内核防火墙的命令行工具。功能非常强大,对于我们开发来说,主要掌握如何开放端口即可。例如:

  • 把来源 IP 为 192.168.1.101 访问本机 80 端口的包直接拒绝:iptables -I INPUT -s 192.168.1.101 -p tcp --dport 80 -j REJECT

  • 开启 80 端口,因为web对外都是这个端口

    1
    iptables -A INPUT -p tcp --dport 80 -j ACCEP
  • 另外,要注意使用 iptables save 命令,进行保存。否则,服务器重启后,配置的规则将丢失。

54.route 命令?

作答

答案

route命令用来显示并设置Linux内核中的网络路由表,route命令设置的路由主要是静态路由。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。

在Linux系统中设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的ip地址设置为Linux机器的默认路由。要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;可以在/etc/rc.local中添加route命令来保证该路由设置永久有效。

55.添加一条到 192.168.3.0/24 的路由,网关为 192.168.1.254 ?

作答

答案

输入命令 route add -net 192.168.3.0/24 netmask 255.255.255.0 gw 192.168.1.254

56.查看本机路由的三种方式?

作答

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@centos6 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.220.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0

[root@centos6 ~]# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.220.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0

[root@centos6 ~]# ip route
192.168.220.0/24 dev eth1 proto kernel scope link src 192.168.220.157 metric 1
169.254.0.0/16 dev eth0 scope link metric 1002
172.16.0.0/16 dev eth0 proto kernel scope link src 172.16.251.6
default via 172.16.0.1 dev eth0 proto static

57.tcpdump 命令?

作答

答案

tcpdump命令是一款sniffer工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析。

58. 在 Linux 系统下如何按照下面要求抓包:只过滤出访问 HTTP 服务的,目标 IP 为 192.168.0.111 ,一共抓 1000 个包,并且保存到 1.cap 文件中??

作答

答案

1
tcpdump -nn -s0 host 192.168.0.111 and port 80 -c 1000 -w 1.cap