面试必备(背)-Linux八股文系列!
Linux 概述
什么是Linux
Linux 是免费可自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。
Unix 操作系统和 Linux 操作系统有什么区别?
Linux 和Unix 都是功能强大的操作系统,都是应用广泛的服务器操作系统,两者的区别:
-
开源性
Linux 一款开源操作系统;Unix 是一款对源码实行知识产权保护的传统商业软件,需要付费授权使用。 -
跨平台性
Linux 具有良好的跨平台性能,可运行在多种硬件平台上;Unix 跨平台性能较弱,大多需与硬件配套使用。 -
可视化界面
Linux 除了进行命令行操作,还有窗体管理系统;Unix 只是命令行下的系统。 -
硬件环境
Linux 对硬件的要求较低,安装方法更易掌握;Unix 对硬件要求比较苛刻,安装难度较大。 -
用户群体
Linux的用户群体很广泛,个人和企业均可使用;Unix的用户群体比较窄,多是安全性要求高的大型企业使用,如银行、电信部门等,或者Unix硬件厂商使用,如Sun等。
相比于 Unix,Linux 操作系统更受广大计算机爱好者的喜爱,主要原因是Linux 具有Unix 的全部功能,并且能够在普通 PC 计算机上实现全部的 Unix 特性,开源免费的特性,更容易普及使用!
什么是 Linux 内核?
Linux 系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。
- 系统内存管理
- 应用程序管理
- 硬件设备管理
- 文件系统管理
Linux的基本组件是什么?
Linux 组件:内核,shell和GUI,系统实用程序和应用程序。
Linux 比其他操作系统更具优势的是每个方面都附带其他功能,所有代码都可以免费下载。
什么是 CLI?GUI?
CLI:命令行界面(command-line interface,简称 CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面。
GUI:图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
- 用户空间(User Space) :用户空间又包括用户的应用程序(User Applications)、C 库(C Library) 。
- 内核空间(Kernel Space) :内核空间又包括系统调用接口(System Call Interface)、内核(Kernel)、平台架构相关的代码(Architecture-Dependent Kernel Code) 。
为什么 Linux 体系结构要分为用户空间和内核空间的原因?
- 现代 CPU 实现了不同的工作模式,不同模式下 CPU 可以执行的指令和访问的寄存器不同。
- Linux 从 CPU 的角度出发,为了保护内核的安全,把系统分成了两部分。
用户空间和内核空间是程序执行的两种不同的状态,我们可以通过两种方式完成用户空间到内核空间的转移:1)系统调用;2)硬件中断。
Linux 开机启动过程?
- 主机加电自检,加载 BIOS 硬件信息。
- 读取 MBR 的引导文件(GRUB、LILO)。
- 引导 Linux 内核。
- 运行第一个进程 init (进程号永远为 1 )。
- 进入相应的运行级别。
- 运行终端,输入用户名和密码。
Linux 使用的进程间通信方式有哪些?
- 管道(pipe)、流管道(s_pipe)、有名管道(FIFO)。
- 信号(signal) 。
- 消息队列。
- 共享内存。
- 信号量。
- 套接字(socket) 。
Linux 有哪些系统日志文件?
比较重要的是 /var/log/messages 日志文件。
该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。另外,如果系统里有 ELK 日志集中收集,它也会被收集进去。
什么是交换空间?
交换空间是 Linux 使用的一定空间,用于临时保存一些并发运行的程序。当 RAM 没有足够的内存来容纳正在执行的所有程序时,就会发生这种情况。
什么是 root帐户
root 帐户就像一个系统管理员帐户,允许你完全控制系统。你可以在此处创建和维护用户帐户,为每个帐户分配不同的权限。每次安装 Linux 时都是默认帐户。
什么是 LILO?
LILO 是 Linux 的引导加载程序。它主要用于将 Linux 操作系统加载到主内存中,以便它可以开始运行。
Linux 的目录结构是怎样的?
这个问题,一般不会问。更多是实际使用时,需要知道。
Linux 文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录:
/bin:存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里; /etc:存放系统管理和配置文件; /home:存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示; **/usr **:用于存放系统应用程序/opt:额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里; /proc:虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息; /root:超级用户(系统管理员)的主目录(特权阶级o); /sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等; /dev:用于存放设备文件; /mnt:系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统; /boot:存放用于系统引导时使用的各种文件; **/lib **:存放着和系统运行相关的库文件 ; /tmp:用于存放各种临时文件,是公用的临时文件存储点; /var:用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等; /lost+found:这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里。
什么是 inode ?
Sector:文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
block:操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector 组成一个 block。
inode:文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做 inode,中文译名为"索引节点"。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
什么是硬链接和软链接?
- 硬链接
由于 Linux 下的文件是通过索引节点(inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配 inode 。每添加一个一个硬链接,文件的链接数就加 1 。
不足:1)不可以在不同文件系统的文件间建立链接;2)只有超级用户才可以为目录创建硬链接。
- 软链接
软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
不足:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。
实际场景下,基本是使用软链接。总结区别如下:
- 硬链接不可以跨分区,软件链可以跨分区。
- 硬链接指向一个 inode 节点,而软链接则是创建一个新的 inode 节点。
- 删除硬链接文件,不会删除原文件,删除软链接文件,会把原文件删除。
常用操作
快捷方式
在开始学习 Linux 命令之前,有一些快捷方式,是必须要提前掌握的,它将贯穿整个 Linux 使用生涯。
+ 通过上下方向键 ↑ ↓ 来调取过往执行过的 Linux 命令; + 命令或参数仅需输入前几位就可以用 Tab 键补全; + Ctrl + R :用于查找使用过的命令(history 命令用于列出之前使用过的所有命令,然后输入 ! 命令加上编号( !2 )就可以直接执行该历史命令); + Ctrl + L:清除屏幕并将当前行移到页面顶部; + Ctrl + C:中止当前正在执行的命令; + Ctrl + U:从光标位置剪切到行首; + Ctrl + K:从光标位置剪切到行尾; + Ctrl + W:剪切光标左侧的一个单词; + Ctrl + Y:粘贴 Ctrl + U | K | Y 剪切的命令; + Ctrl + A:光标跳到命令行的开头; + Ctrl + E:光标跳到命令行的结尾; + Ctrl + D:关闭 Shell 会话;
常用命令
- 目录相关: cd mkdir rmdir pwd Is ll=ls-l mv cp
- 文件相关: rm-rf cat more tail head vi du find
- 网络相关: ping ifconfig netstat
- 用户相关: groupadd useradd passwd su
- 权限相关: chmod chgrp chown
- 系统相关: reboot shutdown mount free df
- 进程相关: top ps kill
- 压缩相关: tar zip unzip gzip
- 其它: grep echo sh init(0-- 6)
+ 改变文件的所属群组:chgrp + 改变文件拥有者:chown + 改变文件的权限:chmod + 查看版本信息等 + uname -r + lsb_release -a + 变换目录:cd + 显示当前所在目录:pwd + 建立新目录:mkdir + 删除『空』的目录:rmdir + 档案与目录的显示:ls + 复制档案或目录:cp + 移除档案或目录:rm + 移动档案与目录,或更名:mv + 取得路径的文件名与目录名:basename,dirname + 由第一行开始显示档案内容:cat + 从最后一行开始显示:tac(可以看出 tac 是 cat 的倒着写) + 显示的时候,顺道输出行号:nl + 一页一页的显示档案内容:more + 与 more 类似,但是比 more 更好的是,他可以往前翻页:less + 只看头几行:head + 只看尾几行:tail + 修改档案时间或新建档案:touch + 档案预设权限:umask + 配置文件档案隐藏属性:chattr + 显示档案隐藏属性:lsattr + 观察文件类型:file + 寻找【执行挡】:which + 寻找特定档案:whereis + 寻找特定档案:locate + 寻找特定档案:find + 压缩文件和读取压缩文件:gzip,zcat + 压缩文件和读取压缩文件:bzip2,bzcat + 压缩文件和读取压缩文件:tar
终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?
- 终端 /dev/tty
- 黑洞文件 /dev/null
Linux 下命令有哪几种可使用的通配符?分别代表什么含义?
- ?:可替代单个字符。
- *:可替代任意多个字符。
- 方括号“[charset]”可替代 charset 集中的任何单个字符,如[a-z],[abABC]
用什么命令对一个文件的内容进行统计?(行号、单词数、字节数)
- wc 命令 - c 统计字节数 - l 统计行数 - w 统计单词数。
Linux 中进程有哪几种状态?在 ps 显示出来的信息中,分别用什么符号表示的?
- 不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的。不可中断, 指进程不响应异步信号。
- 暂停状态/跟踪状态:向进程发送一个 SIGSTOP 信号,它就会因响应该信号 而进入 TASK_STOPPED 状态;当进程正在被跟踪时,它处于 TASK_TRACED 这个特殊的状态。
- “正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。
- 就绪状态:在 run_queue 队列里的状态
- 运行状态:在 run_queue 队列里的状态
- 可中断睡眠状态:处于这个状态的进程因为等待某某事件的发生(比如等待 socket 连接、等待信号量),而被挂起
- zombie 状态(僵尸):父亲没有通过 wait 系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉
- 退出状态
D 不可中断 Uninterruptible(usually IO) R 正在运行,或在队列中的进程 S 处于休眠状态 T 停止或被追踪 Z 僵尸进程 W 进入内存交换(从内核 2.6 开始无效) X 死掉的进程
ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息?
- ps -aux :bsd 格式显示;ps -ef :标准格式显示
- ps -ef | grep pid
du 和 df 的定义,以及区别?
- du 显示目录或文件的大小
- df 显示每个<文件>所在的文件系统的信息,默认是显示所有文件系统。
进阶实战
CPU 负载和 CPU 利用率的区别是什么?
首先,我们可以通过`uptime`,`w` 或者 `top` 命令看到 CPU 的平均负载
-
Load Average :负载的3个数字,分别代表系统在过去的1分钟,5分钟,15分钟内的系统平均负载。他代表的是当前系统正在运行的和处于等待运行的进程数之和。也指的是处于可运行状态和不可中断状态的平均进程数。
-
CPU 利用率:和负载不同,CPU利用率指的是当前正在运行的进程实时占用CPU的百分比,它是对一段时间内CPU使用状况的统计。
CPU 负载很高,利用率却很低该怎么办?
CPU 负载很高,利用率却很低,说明处于等待状态的任务很多,负载越高,代表可能很多僵死的进程。通常这种情况是IO密集型的任务,大量请求在请求相同的IO,导致任务队列堆积。
同样,可以先通过top命令观察(截图只是示意,不代表真实情况),假设发现现在确实是高负载低使用率。
然后,再通过命令ps -axjf查看是否存在状态为D+状态的进程,这个状态指的就是不可中断的睡眠状态的进程。处于这个状态的进程无法终止,也无法自行退出,只能通过恢复其依赖的资源或者重启系统来解决。
CPU 负载很低,利用率却很高该怎么办?
这表示 CPU 的任务并不多,但是任务执行的时间很长,通常是计算密集型任务,生成了大量耗时短的计算任务。
直接 top 命令找到使用率最高的任务,定位到去看看就行了。如果代码没有问题,那么过段时间CPU使用率就会下降的。
一台 Linux 系统初始化环境后需要做一些什么安全工作?
- 添加普通用户登录,禁止 root 用户登录,更改 SSH 端口号。
- 修改 SSH 端口不一定绝对哈。如果要暴露在外网,建议改下。
- 服务器使用密钥登录,禁止密码登录。
- 开启***,关闭 SElinux ,根据业务需求设置相应的***规则。
- 装 fail2ban 这种防止 SSH 暴力破击的软件。
- 设置只允许公司办公网出口 IP 能登录服务器(看公司实际需要) 也可以安装 *** 等软件,只允许连接 *** 到服务器上。
- 修改历史命令记录的条数为 10 条。
- 只允许有需要的服务器可以访问外网,其它全部禁止。
- 做好软件层面的防护。
- 设置 nginx_waf 模块防止 SQL 注入。
- 把 Web 服务使用 www 用户启动,更改网站目录的所有者和所属组为 www 。
什么叫 CC 攻击?什么叫 DDOS 攻击?
- CC 攻击,主要是用来攻击页面的,模拟多个用户不停的对你的页面进行访问,从而使系统资源消耗殆尽。
- DDOS 攻击,中文名叫分布式拒绝服务攻击,指借助服务器技术将多个计算机联合起来作为攻击平台,来对一个或多个目标发动 DDOS 攻击。
攻击,即是通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的。
怎么预防 CC 攻击和 DDOS 攻击?
- 防 CC、DDOS 攻击,这些只能是用硬件***做流量清洗,将攻击流量引入黑洞。
- 流量清洗这一块,主要是买 ISP 服务商的防攻击的服务就可以,机房一般有空余流量,我们一般是买服务,毕竟攻击不会是持续长时间。
请问当用户反馈网站访问慢,如何处理?
-
有哪些方面的因素会导致网站网站访问慢?
- 分析系统负载,使用 w 命令或者 uptime 命令查看系统负载。如果负载很高,则使用 top 命令查看 CPU ,MEM 等占用情况,要么是 CPU 繁忙,要么是内存不够。
- 如果这二者都正常,再去使用 sar 命令分析网卡流量,分析是不是遭到了攻击。一旦分析出问题的原因,采取对应的措施解决,如决定要不要杀死一些进程,或者禁止一些访问等。
- 数据库瓶颈
- 网站开发代码没有优化好
- 服务器出口带宽不够用
- 服务器负载过大,导致响应不过来
-
针对网站访问慢,怎么去排查?
- 首先要确定是用户端还是服务端的问题。当接到用户反馈访问慢,那边自己立即访问网站看看,如果自己这边访问快,基本断定是用户端问题,就需要耐心跟客户解释,协助客户解决问题。
- 如果访问也慢,那么可以利用浏览器的调试功能,看看加载那一项数据消耗时间过多,是图片加载慢,还是某些数据加载慢。
- 针对服务器负载情况。查看服务器硬件(网络、CPU、内存)的消耗情况。如果是购买的云主机,比如阿里云,可以登录阿里云平台提供各方面的监控,比如 CPU、内存、带宽的使用情况。
- 如果发现硬件资源消耗都不高,那么就需要通过查日志,比如看看 MySQL慢查询的日志,看看是不是某条 SQL 语句查询慢,导致网站访问慢。
-
怎么去解决?
- 如果是出口带宽问题,那么就申请加大出口带宽。
- 如果慢查询比较多,那么就要开发人员或 DBA 协助进行 SQL 语句的优化。
- 如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等等。然后也可以搭建MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。
- 申请购买 CDN 服务,加载用户的访问。
- 如果访问还比较慢,那就需要从整体架构上进行优化咯。做到专角色专用,多台服务器提供同一个服务。