Linux运维常见面试题

LINUX系统软件安装和卸载的常见方法

  • RHEL/CentOS系列

    • rpm -e "软件包名字"

    • yum remove "软件包名字",此操作会卸载相关的依赖

  • Debian/Ubuntu系列

    • apt-get remove "软件包名字",不删除依赖,保留配置文件
    • apt-get autoremove "软件包名字",删除依赖,保留配置文件
    • apt-get purge "软件包名字",不删除依赖,删除配置文件
  • 源代码安装的,可以使用make uninstall,或者直接删掉软件目录

修改LINUX的主机名

  • RHEL/CentOS系列
    • hostnamectl set-hostname "主机名"
    • 修改/etc/sysconfig/network里面的HOSTNAME
  • Debian/Ubuntu系列
    • 修改/etc/hosts/etc/hostname的主机名,然后运行/etc/init.d/hostname.sh start
  • 临时有效
    • hostname "主机名"

自动切割压缩备份日志脚本

  • 每天凌晨5点执行,带日期后缀
  • 以Nginx日志为例
  • 切割打包压缩前一天的日志之后,将压缩包上传到FTP服务器192.168.1.2账号aaa密码bbb
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
#!/bin/bash
LOG_PATH='/path/to/nginx_log/'
DATE=`date +%F`

# 让Nginx切割日志
cd ${LOG_PATH}
for file in `ls | grep *log`;do
mv ${file} ${file}.${DATE}
done
nginx -s reopen

# 打包文件
tar nginx_log_${DATE}.tar.gz `ls *${DATE}`

# 清理日志文件
rm -rf *${DATE}

# 上传文件
ftp -n <<- EOF
open 192.168.1.2
user aaa bbb
put nginx_log_${DATE}.tar.gz
bye
EOF

# 删除过期文件
find ${LOG_PATH} -type f -mtime +60 -exec rm -rf {} \;
1
0 5 * * * /bin/bash /path/to/logrotate.sh

iptables

允许来自127.0.0.1端口1234访问114.114.114.114端口80

1
iptables -A INPUT -s 127.0.0.1 --sport 1234 -d 114.114.114.114 --dport 80 -j ACCPET

禁用从lo进入的流量

1
iptables -A INPUT -i lo -j REJECT

允许外部访问22端口

1
iptables -A INPUT -p tcp --dport 22 -j ACCPET

在postrouting链上,把源地址192.168.2.0/24的数据包源地址修改为192.168.1.2

1
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.2

删除INPUT链上第八条规则

1
2
iptables -Ln --line-numbers
iptables -D INPUT 8

eth0的数据包转发到eth1

1
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

iptables匹配参数

  • -A:在chain里追加规则
  • -D:删除chain里的规则
  • -I:将规则插入到chain
  • -t:指定表
  • -s:匹配源地址
  • -d:匹配目的地址
  • -p:协议匹配
  • -i:入口匹配
  • -o:出口匹配
  • --sport:源端口匹配
  • --dport:出口端口匹配
  • -j:数据包处理动作
  • !:取反

iptables基本概念

table

  • raw 用于配置数据包,raw 中的数据包不会被系统跟踪
  • filter 是用于存放所有与防火墙相关操作的默认表
  • nat 用于 网络地址转换(例如:端口转发)
  • mangle 用于对特定数据包的修改
  • security 用于 强制访问控制网络规则(例如: SELinux)

处理流程

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
28
29
30
31
32
33
34
                               XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
+
|
v
+-------------+ +------------------+
|table: filter| <---+ | table: nat |
|chain: INPUT | | | chain: PREROUTING|
+-----+-------+ | +--------+---------+
| | |
v | v
[local process] | **************** +--------------+
| +---------+ Routing decision +------> |table: filter |
v **************** |chain: FORWARD|
**************** +------+-------+
Routing decision |
**************** |
| |
v **************** |
+-------------+ +------> Routing decision <---------------+
|table: nat | | ****************
|chain: OUTPUT| | +
+-----+-------+ | |
| | v
v | +-------------------+
+--------------+ | | table: nat |
|table: filter | +----+ | chain: POSTROUTING|
|chain: OUTPUT | +--------+----------+
+--------------+ |
v
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX

统计TCP连接状态

1
netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c

列出每个IP的TCP连接数

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

生成随机字符串

1
openssl rand -hex 20
1
dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64 | tr -d "=+/[:space:]" | dd bs=32 count=1 2>/dev/null

描述tcp三次握手的过程

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。

内核参数的含义

  • net.ipv4.tcp_tw_recycle=1
    • 启用此功能可以加快TIME-WAIT状态的TCP连接回收
    • 内核会记录最后一个报文的时间戳,如果新的TCP报文时间戳小于最后一个报文的时间戳,则会drop包,导致无法建立TCP连接
  • net.ipv4.tcp_tw_reuse=1
    • 允许将处于TIME-WAIT状态的socket用于新的TCP连接
  • net.ipv4.tcp_timestamps=1
    • 发送TCP时间戳
  • vm.swappiness=0
    • 最大限度使用物理内存,物理内存耗尽才启用swap

Linux开机启动顺序

BIOS-basedRHEL/CentOS-7为例

  • 硬件加电
  • 加载BIOS
  • 硬件自检
  • BIOS按照启动顺序读取存储设备的MBR
  • 根据MBR找到并加载bootloader
  • bootloader从/boot目录加载vmlinuz内核镜像,提取initramfs的内容并存放在tmpfs
  • 操作系统内核从initramfs中加载必要的驱动和挂载根文件系统,启动systemd作为第一个系统进程
  • systemd读取配置文件,读取default-target文件,引导至default-target定义的状态
    • 初始化网络
    • 设置主机名
    • 基于内核参数初始化硬件设备
    • 加载文件系统
    • 启动systemd服务
  • 启动完成

ps aux中VSZ和RSS的含义

  • VSZ:虚拟内存集,代表进程占用的虚拟内存空间
  • RSS:物理内存集,代表进程实际占用的物理内存空间

top命令中字段的含义

  • PID:进程ID
  • USER:进程所有者的用户名
  • PR:进程优先级
  • NI:nice值,数值越小,优先级越高
  • VIRT:虚拟内存集,代表进程占用的虚拟内存空间
  • RES:物理内存集,代表进程实际占用的物理内存空间
  • SHR:共享内存大小
  • S:进程状态
  • %CPU:CPU时间占比
  • %MEM:物理内存占比
  • TIME+:进程使用的CPU时间总量
  • COMMAND:进程命令

load average含义

1
load average: 0.00, 0.00, 0.00
  • 分别代表1分钟内、5分钟内、15分钟内系统的平均负载
  • 系统负载指的是运行队列的长度,即等待CPU的平均进程数
  • 因此load average的值=CPU核数是最理想的状态