面试问题

一、传统运维与云计算运维

传统运维

传统运维主要针对企业内部的物理服务器、网络设备、存储设备等硬件资源,以及操作系统、数据库、中间件等软件资源进行维护和管理。运维人员需要亲自到机房对设备进行安装、配置、故障排查等工作,同时对软件系统进行部署、更新、备份等操作。

云计算运维

云计算运维则是针对云计算平台上的资源进行管理,包括==虚拟机、容器、存储、网络==等。运维人员通过云平台的管理界面或API进行资源的申请、配置、扩展、监控等操作,无需直接接触物理硬件。

区别

  1. 资源管理方式:传统运维管理物理资源,云计算运维管理虚拟资源。
  2. 工作内容:传统运维更多涉及硬件维护,云计算运维侧重于云资源的调配和管理。
  3. 灵活性:云计算运维更具灵活性,资源可快速扩展和调整。
  4. 成本:传统运维需要大量硬件投资,云计算运维按需付费,成本更低。

不同类型服务器的区别

  1. 刀片服务器:==体积小,可插入刀片机箱,适合高密度部署。==

  2. 机架式服务器:安装在标准机架中,便于管理和扩展。

  3. 机柜服务器:独立机柜形式,集成度高。

  4. 塔式服务器:类似台式机塔式机箱,适合小型办公室。

Linux常见服务端口及作用

  • 22:SSH服务,用于远程登录和管理服务器。

  • 80:HTTP服务,用于网页访问。

  • 443:HTTPS服务,安全的网页访问。

  • 3306:==MySQL数据库服务。==

  • 25:==SMTP邮件发送服务。==

user add 过程

image.png

image.png

软链接和硬链接的定义和区别

定义

  • 软链接:是一个独立的文件,它保存了被链接文件的路径信息,相当于一个“快捷方式”。通过软链接可以访问被链接的文件,但本质上它与被链接文件是两个独立的实体。

  • 硬链接:是对同一个文件的另一种引用方式,与原文件共享同一个 inode 节点。硬链接文件在文件系统中被视为原文件的“别名”,它们是同一个文件的多个入口。

区别

特性 软链接 硬链接
文件独立性 是独立文件,有自己 inode 号 与原文件共享 inode 号,不是独立文件
路径依赖 依赖被链接文件路径,被链接文件删除后失效 不依赖路径,被链接文件删除后仍有效
文件系统限制 可跨越不同文件系统 不能跨越不同文件系统
链接对象 可链接目录或文件 只能链接文件,不能链接目录
文件删除影响 被链接文件删除,软链接失效 原文件删除,硬链接仍有效,数据保留
文件属性 属性独立于被链接文件 属性与原文件相同
文件大小 大小通常不为零(存储路径信息) 大小为零(不存储额外数据)
以下是针对运维工程师岗位面试可能会遇到的问题及对应答案:

项目的结构体设计

在设计项目的结构体时,需要考虑模块化、可维护性、可扩展性以及性能等因素。通常会将不同功能的代码放在不同的模块或包中,以便于管理和维护。例如,对于一个Web应用项目,可能会有以下结构体设计:

1
2
3
4
5
6
7
8
9
10
11
12
13
project/
├── bin/ # 可执行文件或脚本
├── config/ # 配置文件
├── lib/ # 第三方库或依赖
├── src/ # 源代码
│ ├── main/ # 主程序入口
│ ├── models/ # 数据模型定义
│ ├── routes/ # 路由处理
│ ├── services/ # 业务逻辑服务
│ └── utils/ # 工具函数
├── tests/ # 测试代码
├── docs/ # 文档
└── scripts/ # 脚本文件

这样的结构有助于团队协作,每个模块都有明确的职责划分,便于后期的扩展和维护。

文件描述符 句柄

文件描述符(File Descriptor)是计算机科学中的一个术语,用于表示指向文件的引用。在 Unix-like 系统中,文件描述符是一个整数,它是一个索引,指向了文件描述符表中的一个条目,该条目包含了文件的相关信息,如文件的读写位置、文件的状态标志等。

句柄(Handle)在不同的上下文中可能有不同的含义,通常它也是一种抽象的引用,用于标识和操作资源,如文件、网络连接等。在 Windows 系统中,句柄是用于访问系统资源的一个指针。

在编程中,文件描述符和句柄都用于管理和操作文件或其他 I/O 资源,但它们在不同的操作系统或编程环境中可能有不同的实现和使用方式。

disk为16T大小,还有20%空闲空间,但是无法touch空文件,原因

可能的原因包括:

  1. 磁盘空间不足:虽然显示有20%的空闲空间,但可能剩余的空间不足以创建新文件,尤其是在文件系统元数据(如 inode)耗尽的情况下。

  2. 权限问题:当前用户可能没有足够的权限在目标目录下创建文件。

  3. 文件系统损坏:文件系统可能存在错误或损坏,导致无法正常创建文件。

  4. 磁盘配额限制:如果系统设置了磁盘配额,当前用户可能已经达到了其配额限制,无法再创建新文件。

  5. 文件系统类型限制:某些文件系统可能对文件数量或大小有特定的限制。

要排查具体原因,可以使用命令如 df -h 查看磁盘空间使用情况,df -i 查看 inode 使用情况,ls -ld 目录 查看目录权限等。

查看cpu的命令

在 Linux 系统中,可以使用以下命令查看 CPU 信息:

  • lscpu:提供有关 CPU 架构的详细信息,包括 CPU 核心数、线程数、型号等。
  • cat /proc/cpuinfo:显示每个 CPU 核心的详细信息,包括型号、频率等。
  • tophtop:实时查看 CPU 使用情况和其他系统资源信息。
  • nproc:显示系统中可用的 CPU 核心数。

top 中 load average表示的意思

top 命令的输出中,load average 表示系统的平均负载,它反映了系统在特定时间间隔内的工作量。load average 通常显示三个数值,分别表示过去 1 分钟、5 分钟和 15 分钟内的平均负载。

平均负载的计算基于系统中正在运行的进程数和等待 CPU 的进程数。当平均负载小于 CPU 核心数时,表示系统资源相对充足;当平均负载大于 CPU 核心数时,可能表示系统资源紧张,存在性能瓶颈。

查看disk 的命令

在 Linux 系统中,可以使用以下命令查看磁盘信息:

  • df -h:显示文件系统的磁盘空间使用情况,包括挂载点、总容量、已用空间、可用空间等。
  • du -sh 目录:查看指定目录的磁盘使用情况。
  • lsblk:列出块设备(如磁盘、分区等)的信息,包括设备名称、大小、挂载点等。
  • fdisk -l:显示磁盘分区表信息。

查看网卡速率

在 Linux 系统中,可以使用以下命令查看网卡速率:

  • ethtool 网卡名称(例如 ethtool eth0):显示网卡的详细信息,包括速率、 duplex 模式等。
  • ip link show 网卡名称:显示网卡的基本信息,包括速率等。

tcp三次握手,最后第三次握手后的状态

TCP 三次握手的过程如下:

  1. 第一次握手:客户端发送一个带有 SYN(同步序列编号)标志的 TCP 包到服务器,请求建立连接。
  2. 第二次握手:服务器收到客户端的 SYN 包后,回复一个带有 SYN 和 ACK(确认)标志的 TCP 包,确认收到客户端的请求,并同步自己的序列号。
  3. 第三次握手:客户端收到服务器的 SYN+ACK 包后,发送一个带有 ACK 标志的 TCP 包到服务器,确认收到服务器的同步请求。

在第三次握手后,TCP 连接建立,客户端和服务器进入 ESTABLISHED 状态,可以开始进行数据传输。

如何查看established状态

在 Linux 系统中,可以使用以下命令查看处于 ESTABLISHED 状态的 TCP 连接:

  • netstat -nat | grep ESTABLISHED:显示所有处于 ESTABLISHED 状态的 TCP 连接。
  • ss -tunap | grep ESTABLISHEDss 命令也可以用于查看网络连接状态,-t 表示 TCP,-u 表示 UDP,-n 表示显示端口号而不是服务名称,-a 表示显示所有状态的连接,-p 表示显示进程信息。

HTTP

HTTP(超文本传输协议)是用于传输超文本(如 HTML 文件)的应用层协议,是万维网(WWW)的数据通信基础。HTTP 基于请求-响应模型,客户端(如浏览器)发送请求到服务器,服务器处理请求后返回响应。

HTTP 请求由请求方法、请求 URI、HTTP 版本和请求头部组成。常见的请求方法包括 GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。

HTTP 响应包含状态码、响应头部和响应体。状态码表示请求的处理结果,如 200 OK(成功)、404 Not Found(未找到)、500 Internal Server Error(服务器错误)等。

讲讲 nginx:upstream 、对cpu的设置 、IO连接数

  • upstream:在 Nginx 中,upstream 模块用于定义一组后端服务器,实现负载均衡。通过 upstream 块,可以指定多个服务器地址,并设置负载均衡算法(如轮询、权重等)。例如:

    1
    2
    3
    4
    upstream backend {
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
    }
  • 对cpu的设置:Nginx 可以通过配置文件中的 worker_processes 指令来设置工作进程数,通常设置为与 CPU 核心数相同,以充分利用多核 CPU 的性能。例如:

    1
    worker_processes auto; # 自动检测 CPU 核心数
  • IO连接数:Nginx 的连接数处理能力受到多种因素影响,包括操作系统对文件描述符的限制、内存大小等。可以通过调整 Nginx 配置文件中的 worker_connections 指令来设置每个工作进程允许的最大连接数。例如:

    1
    2
    3
    events {
    worker_connections 1024; # 每个工作进程允许的最大连接数
    }

nginx的两个进程

Nginx 在启动后通常会有两个进程:

  1. 主进程(Master Process):负责管理和维护工作进程,包括加载配置文件、绑定端口、启动工作进程等。主进程通常以 root 用户身份运行,具有较高的权限。

  2. 工作进程(Worker Process):实际处理客户端请求的进程。工作进程的数量由 worker_processes 指令设置,通常与 CPU 核心数相同,以充分利用多核 CPU 的性能。工作进程以较低权限的用户(如 nginx)运行,负责接收和处理客户端的请求,与后端服务器通信等。

不熟悉命令

  1. ip addr 现代化查看ip 替换ipconfig
  2. code .\docker-compose.yml vscode 窗口打开编辑文件
  3. rmdir 文件夹
  4. touch命令:在仅需创建空文件或调整时间戳时,效率更高,命令简洁,无需进入编辑器界面。vinano:在需要创建并编辑文件内容时,更为高效,直接在编辑器中完成所有操作。
  5. . 当前路径 .. 上一级路径
  6. ls -lh 显示详细信息和大小
  7. find

基本语法

bash复制

1
find [路径] [表达式] [操作]

常见选项

  • -name:按文件名查找(区分大小写)

  • -iname:按文件名查找(不区分大小写)

  • -type:按文件类型查找(f表示文件,d表示目录)

  • -size:按文件大小查找

  • -mtime:按文件修改时间查找(单位:天)

  • -exec:对找到的文件执行指定命令

示例

  1. 按名称查找文件

    bash复制

    1
    find /home -name "example.txt"

    /home目录下查找名为example.txt的文件。

stat a.txt

显示文件属性

image.png

Access:最后访问时间
Modify:文件内容最后修改时间
Change:文件属性最后修改时间

grep

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
grep '关键字'  文件名
grep 'My' testgrep.txt

# 加上行号
grep -n 'My' testgrep.txt

# 搜索过滤
grep 'apple' ./*
./t1.txt:apple1
./t2.txt:apple2
./t3.txt:apple3

# 结合管道符
yum list | grep nano
# 进程查询
[root@localhost ~]# ps -ef | grep python
root 54422 1479 0 17:25 pts/1 00:00:00 grep --color=auto python
root 77510 1 0 16:22 ? 00:00:00 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
root 90971 1 0 16:23 ? 00:00:01 /usr/bin/python2 -Es /usr/sbin/tuned -l -P

# 结合 wc -l 统计匹配行数
[root@localhost ~]# cat /etc/passwd | wc -l
44

# 结合find 匹配筛选
[root@localhost ~]# find / -name '*.txt' | grep dns
find: ‘/run/user/1000/gvfs’: Permission denied
/usr/lib/python2.7/site-packages/dnspython-1.12.0-py2.7.egg-info/SOURCES.txt
/usr/lib/python2.7/site-packages/dnspython-1.12.0-py2.7.egg-info/dependency_links.txt
/usr/lib/python2.7/site-packages/dnspython-1.12.0-py2.7.egg-info/top_level.txt


xargs

1
2
3
4
5
6
7
8
9
10
# 简单的说 就是把其他命令的给它的数据,传递给它后面的命令作为参数
命令1 | xargs 选项
选项
-i 用 {} 代替传递的数据
类似c中#define a b
# 批量备份tmp下所有脚本
find /tmp/ -name '*.sh' | xargs -i cp {} {}.bak

#

netstat -tunlp 显示当前正在活跃端口。并且显示对应进程信息