Linux面试题及详细答案 120道(1-15)-- 基础概念

发布于:2025-08-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。

前后端面试题-专栏总目录

在这里插入图片描述

一、本文面试题目录

1. 什么是Linux?它与Unix有什么关系和区别?

定义:Linux是一个开源的类Unix操作系统内核,由Linus Torvalds于1991年首次发布。它本身只是内核,通常与GNU项目的工具和其他软件结合,形成完整的操作系统。

与Unix的关系

  • Linux受Unix设计思想启发,实现了Unix的大部分功能和接口
  • 两者都遵循"一切皆文件"的理念,拥有相似的命令行界面和编程接口
  • Linux可以看作是Unix的现代开源实现

区别

特性 Linux Unix
许可证 开源(GPL) 多数为商业授权
起源 1991年,Linus Torvalds 1969年,贝尔实验室
硬件支持 广泛支持各种硬件 主要支持服务器和工作站
价格 免费或低成本 通常需要商业许可费用
扩展性 高度可定制 定制性受限

2. Linux的内核版本和发行版有什么区别?列举常见的Linux发行版。

内核版本

  • 指Linux操作系统的核心程序版本
  • 由Linus Torvalds及其团队维护
  • 版本号格式通常为:主版本.次版本.修订号(如5.15.0)
  • 只包含操作系统最核心的功能:进程管理、内存管理、设备驱动等

发行版

  • 基于Linux内核,整合了各种软件和工具的完整操作系统
  • 由不同组织或公司维护
  • 除内核外,还包含桌面环境、应用程序、包管理系统等

常见发行版

  1. Debian系列:Debian、Ubuntu、Linux Mint
  2. Red Hat系列:Red Hat Enterprise Linux (RHEL)、CentOS、Fedora
  3. SUSE系列:openSUSE、SUSE Linux Enterprise
  4. 独立发行版:Arch Linux、Gentoo、Slackware
  5. 特殊用途:Kali Linux(安全测试)、Raspbian(树莓派)

示例:查看内核版本命令

uname -r  # 输出示例:5.4.0-91-generic

3. 什么是GNU?GNU/Linux的关系是什么?

GNU

  • 是"GNU’s Not Unix"的递归缩写
  • 由Richard Stallman于1983年发起的自由软件项目
  • 目标是创建一个完全自由的类Unix操作系统
  • 开发了大量基础工具:gcc编译器、bash shell、glibc库等

GNU/Linux关系

  • Linux内核与GNU项目的软件结合形成了完整的操作系统
  • 严格来说,我们使用的"Linux"系统实际上是"GNU/Linux"
  • Linux提供内核,GNU提供了用户空间的大部分工具和库
  • 两者互补,共同构成了功能完整的操作系统

历史背景
GNU项目已经开发了操作系统的大部分组件,但缺乏一个有效的内核。1991年Linux内核的出现填补了这一空白,与GNU软件结合形成了今天广泛使用的操作系统。

4. Linux系统的主要组成部分有哪些?

Linux系统由以下主要部分组成:

  1. 内核(Kernel)

    • 系统的核心,管理硬件资源
    • 负责进程管理、内存管理、文件系统、设备驱动等
    • 是操作系统与硬件之间的接口
  2. Shell(外壳)

    • 命令解释器,用户与内核交互的接口
    • 常见的有bash、zsh、sh等
    • 接收用户命令并传递给内核执行
  3. 文件系统

    • 组织和存储文件的方式
    • 常见的有ext4、xfs、btrfs等
    • 采用树形目录结构
  4. 应用程序和工具

    • 用户使用的各种软件和工具
    • 包括文本编辑器、编译器、办公软件等
    • 许多来自GNU项目
  5. 系统库(Libraries)

    • 提供程序运行所需的函数和资源
    • 如glibc(GNU C库)
    • 简化应用程序开发
  6. 服务(Services)

    • 在后台运行的程序
    • 如网络服务、打印服务等
    • 由systemd或其他初始化系统管理

结构示意图

用户 → Shell → 系统调用 → 内核 → 硬件
        ↓
      应用程序 → 系统库 → 内核

5. 简述Linux的启动过程。

Linux启动过程可分为以下几个主要阶段:

  1. BIOS/UEFI初始化

    • 计算机通电后首先运行基本输入输出系统(BIOS)或统一可扩展固件接口(UEFI)
    • 进行硬件自检(POST),检测CPU、内存、硬盘等设备
    • 确定启动设备(通常是硬盘)
  2. 引导加载程序(Boot Loader)

    • 从启动设备加载引导程序(如GRUB)
    • GRUB显示启动菜单,允许用户选择操作系统
    • 加载并启动Linux内核
  3. 内核初始化

    • 内核解压并加载到内存
    • 初始化硬件设备,建立内存管理
    • 挂载临时根文件系统(initramfs/initrd)
  4. 启动初始化系统

    • 内核启动初始化进程(如systemd、upstart或传统的init)
    • 这是系统启动的第一个用户空间进程(PID=1)
  5. 系统初始化

    • 初始化系统负责启动各种服务和进程
    • 挂载/etc/fstab中定义的文件系统
    • 设置网络、时钟等系统参数
  6. 用户登录

    • 启动图形界面或命令行登录界面
    • 用户输入用户名和密码进行身份验证
    • 加载用户环境,完成启动过程

简化流程

电源启动 → BIOS/UEFI → GRUB → 内核 → systemd/init → 服务启动 → 登录界面

6. BIOS、GRUB在Linux启动中分别起到什么作用?

BIOS(Basic Input/Output System)

  • 作用:是计算机启动时运行的固件程序,负责硬件初始化和启动引导
  • 具体功能
    1. 执行POST(Power-On Self-Test,加电自检),检查硬件是否正常
    2. 初始化硬件设备,如CPU、内存、硬盘等
    3. 确定启动顺序和启动设备(通过BIOS设置)
    4. 从启动设备的MBR(主引导记录)加载引导程序

GRUB(Grand Unified Bootloader)

  • 作用:是Linux系统中常用的引导加载程序,负责加载操作系统内核
  • 具体功能
    1. 提供启动菜单,允许用户选择要启动的操作系统
    2. 加载并解压Linux内核到内存
    3. 向内核传递启动参数
    4. 支持多种文件系统和操作系统
    5. 可以在启动前修改内核参数

两者关系
BIOS完成硬件初始化后,从启动设备加载GRUB,GRUB再负责加载Linux内核。在现代系统中,UEFI正在逐渐取代BIOS,而GRUB也有对应的UEFI版本。

GRUB配置文件
主要配置文件位于/boot/grub/grub.cfg/boot/grub2/grub2.cfg

7. 什么是运行级别(Runlevel)?不同运行级别的含义是什么?

运行级别
是Linux系统在启动时或运行中的不同操作模式,定义了系统启动哪些服务和进程。

传统运行级别(0-6)

  • 0:关机(halt)- 系统关闭
  • 1:单用户模式(single user mode)- 仅root用户可登录,无网络
  • 2:多用户模式,无网络服务(Debian系)
  • 3:多用户模式,命令行界面(Red Hat系)
  • 4:未使用(自定义)
  • 5:多用户模式,图形界面
  • 6:重启(reboot)- 系统重启

查看当前运行级别

runlevel       # 传统命令
systemctl get-default  # systemd系统

切换运行级别

init 3         # 切换到运行级别3
systemctl isolate multi-user.target  # systemd系统对应级别3

systemd中的目标(Targets)
systemd使用目标(targets)替代了传统的运行级别:

  • poweroff.target → 运行级别0
  • rescue.target → 运行级别1
  • multi-user.target → 运行级别3
  • graphical.target → 运行级别5
  • reboot.target → 运行级别6

8. systemd和init有什么区别?为什么systemd被广泛采用?

init

  • 传统的系统初始化程序,采用串行启动方式
  • 基于Shell脚本,按顺序启动服务
  • 启动速度慢,依赖管理简单
  • 配置文件复杂,分布在多个目录

systemd

  • 新一代系统和服务管理器,采用并行启动方式
  • 基于C语言编写,支持并行启动服务
  • 启动速度快,有更强大的依赖管理
  • 集成了多种系统管理功能

主要区别

特性 init systemd
启动方式 串行 并行
配置方式 Shell脚本 单元文件(.service等)
依赖管理 简单 复杂且精确
启动速度 较慢 较快
功能范围 仅初始化 集成日志、电源管理等
服务控制 service命令 systemctl命令

systemd被广泛采用的原因

  1. 启动速度快:并行启动服务,减少启动时间
  2. 强大的依赖管理:精确控制服务启动顺序
  3. 统一的管理接口:通过systemctl管理所有系统功能
  4. 更好的日志支持:集成journald日志系统
  5. 按需启动服务:只有在需要时才启动某些服务
  6. 支持快照和恢复:可以保存和恢复系统状态
  7. 更好的硬件支持:对现代硬件和技术有更好的支持

示例命令对比

# 启动服务
service httpd start   # init
systemctl start httpd  # systemd

# 设置开机自启
chkconfig httpd on    # init
systemctl enable httpd # systemd

9. Linux的文件系统层级结构(FHS)是怎样的?各主要目录的作用是什么?

Linux采用树形文件系统层级结构(FHS,Filesystem Hierarchy Standard),主要目录及其作用如下:

  1. /(根目录)

    • 文件系统的起点,所有目录都源于此
  2. /bin

    • 存放基本命令(二进制文件),如ls、cp、mv等
    • 所有用户都可使用,在单用户模式下也能访问
  3. /sbin

    • 存放系统管理命令,如reboot、ifconfig等
    • 通常只有root用户可使用
  4. /etc

    • 存放系统配置文件,如网络配置、用户配置等
    • 重要文件:/etc/passwd、/etc/fstab、/etc/hostname
  5. /home

    • 普通用户的主目录
    • 通常每个用户有一个以用户名命名的子目录
  6. /root

    • 超级用户(root)的主目录
  7. /usr

    • 存放用户应用程序和文件
    • 子目录包括:/usr/bin(用户命令)、/usr/sbin(系统命令)、/usr/lib(库文件)、/usr/share(共享数据)
  8. /var

    • 存放经常变化的文件
    • 子目录包括:/var/log(日志文件)、/var/spool(邮件、打印队列)、/var/www(网页文件)
  9. /tmp

    • 临时文件目录
    • 系统重启后通常会清空
  10. /dev

    • 设备文件目录,所有硬件设备以文件形式存在于此
    • 如:/dev/sda(第一块硬盘)、/dev/null(空设备)
  11. /proc

    • 虚拟文件系统,包含系统进程和内核信息
    • 如:/proc/cpuinfo(CPU信息)、/proc/meminfo(内存信息)
  12. /sys

    • 虚拟文件系统,用于访问硬件设备和内核设置
  13. /mnt/media

    • 临时挂载点,用于挂载外部设备
  14. /lib/lib64

    • 系统库文件,供二进制程序使用

10. 什么是Shell?常见的Shell有哪些?

Shell
是用户与Linux内核之间的接口程序,负责解释用户输入的命令并传递给内核执行。它是一种命令行解释器,也可以作为脚本语言使用。

工作原理

  1. 用户输入命令
  2. Shell解析命令
  3. Shell将命令转换为内核可理解的指令
  4. 内核执行指令并返回结果
  5. Shell将结果展示给用户

常见的Shell

  1. Bash(Bourne Again SHell)

    • 最常用的Shell,大多数Linux发行版的默认Shell
    • 兼容Bourne Shell,增加了许多新特性
    • 支持命令历史、命令补全、管道等功能
  2. Sh(Bourne Shell)

    • 早期的Unix Shell,由Stephen Bourne开发
    • 功能简单,兼容性好
    • 许多系统中sh是bash的符号链接
  3. Csh(C Shell)

    • 语法类似C语言,适合编程
    • 引入了命令历史、别名等功能
    • 在BSD系统中较常见
  4. Tcsh

    • Csh的增强版,增加了命令补全等功能
  5. Zsh(Z Shell)

    • 功能强大,结合了bash、csh等的优点
    • 支持更多扩展和自定义选项
    • 具有更强大的自动补全功能
  6. Ksh(Korn Shell)

    • 结合了Bourne Shell和C Shell的特性
    • 适合脚本编程,功能丰富

查看和切换Shell

# 查看当前使用的Shell
echo $SHELL

# 查看系统安装的Shell
cat /etc/shells

# 切换Shell(需注销后生效)
chsh -s /bin/zsh

11. Bash和Zsh的主要区别是什么?

Bash和Zsh都是流行的Shell,但Zsh在功能和用户体验上有更多增强:

主要区别

  1. 命令补全

    • Bash:基本的命令和文件名补全
    • Zsh:更智能的补全,支持:
      • 命令选项补全(无需记住完整选项)
      • 目录浏览补全(按Tab键可浏览目录)
      • 插件扩展补全(如git命令补全)
  2. 主题和外观

    • Bash:外观定制有限
    • Zsh:高度可定制,支持丰富的主题
    • 可显示Git分支、虚拟环境等信息
  3. 历史记录

    • Bash:基本的命令历史功能
    • Zsh:更强大的历史管理:
      • 跨会话共享历史
      • 按部分命令搜索历史
      • 历史记录去重
  4. 插件支持

    • Bash:插件支持有限
    • Zsh:有丰富的插件生态系统(如Oh My Zsh)
    • 常用插件:git、autojump、syntax-highlighting等
  5. ** globbing(模式匹配)**

    • Zsh提供更强大的模式匹配功能
    • 支持递归匹配(**)、扩展通配符等
  6. 拼写纠正

    • Zsh可以自动纠正命令拼写错误
    • Bash无此功能
  7. 启动速度

    • Bash:启动较快
    • Zsh:由于功能丰富,启动可能较慢,尤其是加载多个插件时

示例对比

  1. Zsh的递归目录匹配:
# 列出所有子目录中的.md文件
ls **/*.md  # Zsh支持,Bash默认不支持
  1. Zsh的拼写纠正:
# 如果输入了错误命令
ech hello

# Zsh会提示
zsh: correct 'ech' to 'echo' [nyae]? 
  1. 安装Oh My Zsh增强Zsh功能:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

12. 绝对路径和相对路径的区别是什么?如何表示当前目录和父目录?

绝对路径

  • 从根目录(/)开始的完整路径
  • 无论当前工作目录是什么,都能准确定位文件
  • 示例:/home/user/documents/file.txt/etc/nginx/nginx.conf

相对路径

  • 相对于当前工作目录的路径
  • 不包含根目录,依赖于当前位置
  • 示例:documents/file.txt../images/photo.jpg

表示方法

  • 当前目录:用.表示
    • 示例:./script.sh(执行当前目录下的script.sh)
  • 父目录:用..表示
    • 示例:cd ..(切换到上一级目录)

区别对比

特性 绝对路径 相对路径
起点 根目录(/) 当前工作目录
长度 通常较长 通常较短
稳定性 不随当前目录变化 随当前目录变化
使用场景 脚本中引用固定位置文件 手动操作或相对位置固定的文件

示例
假设当前目录是/home/user

# 使用绝对路径访问文件
cat /home/user/documents/report.txt

# 使用相对路径访问同一文件
cat documents/report.txt

# 从当前目录访问父目录下的文件
cat ../shared/file.txt

# 从当前目录访问当前目录下的文件(两种方式)
cat ./downloads/image.jpg
cat downloads/image.jpg

查看当前目录的绝对路径

pwd  # 输出示例:/home/user

13. 什么是inode?它包含哪些信息?与文件有什么关系?

inode(索引节点)
是Linux文件系统中的一个数据结构,用于存储文件的元数据(描述信息)。每个文件都对应一个唯一的inode。

inode包含的信息

  1. 文件类型(普通文件、目录、链接等)
  2. 文件权限(读、写、执行权限)
  3. 文件所有者和所属组
  4. 文件大小
  5. 最后访问时间(atime)
  6. 最后修改时间(mtime)
  7. 最后元数据修改时间(ctime)
  8. 链接数(指向该inode的硬链接数量)
  9. 文件数据块的位置指针

inode与文件的关系

  • 每个文件对应一个inode,但一个inode可以被多个文件名(硬链接)指向
  • 文件名不存储在inode中,而是存储在目录文件中
  • 目录是一种特殊文件,包含文件名与inode号的映射关系
  • 当访问文件时,系统先通过文件名找到对应的inode号,再通过inode找到文件数据

重要特性

  • inode号在同一文件系统中是唯一的
  • inode也会消耗磁盘空间(通常在格式化时分配)
  • 当inode耗尽时,即使有磁盘空间也无法创建新文件

相关命令

# 查看文件的inode号
ls -i filename  # 示例输出:12345 filename

# 查看inode详细信息
stat filename

# 查看文件系统的inode使用情况
df -i

示例

# 创建文件并查看其inode信息
touch testfile
stat testfile

# 输出结果包含inode号、权限、大小、时间等信息
  File: testfile
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 801h/2049d	Inode: 1048605     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   user)   Gid: ( 1000/   user)
Access: 2023-07-15 10:30:00.000000000 +0800
Modify: 2023-07-15 10:30:00.000000000 +0800
Change: 2023-07-15 10:30:00.000000000 +0800
 Birth: -

14. 硬链接和软链接(符号链接)的区别是什么?

硬链接(Hard Link)和软链接(Symbolic Link,简称symlink)是Linux中两种创建链接文件的方式,主要区别如下:

定义

  • 硬链接:指向文件inode的另一个文件名,与原文件共享同一个inode
  • 软链接:一个特殊的文件,包含指向另一个文件的路径名

主要区别

特性 硬链接 软链接
inode 与原文件相同 有自己独立的inode
存储内容 不存储内容,与原文件共享数据 存储指向原文件的路径
跨文件系统 不支持 支持
指向目录 通常不允许(部分系统支持) 允许
原文件删除 仍可访问文件内容 链接失效,变为"悬空链接"
大小 与原文件相同(实际上不占用额外空间) 取决于路径长度
权限 与原文件共享权限设置 权限不影响访问(实际取决于原文件)

创建命令

# 创建硬链接
ln 原文件 硬链接名

# 创建软链接
ln -s 原文件 软链接名

示例

# 创建测试文件
echo "Hello World" > original.txt

# 创建硬链接
ln original.txt hardlink.txt

# 创建软链接
ln -s original.txt symlink.txt

# 查看文件信息
ls -li

# 输出示例(注意inode号)
12345 -rw-r--r-- 2 user user 12 Jul 15 11:00 original.txt
12345 -rw-r--r-- 2 user user 12 Jul 15 11:00 hardlink.txt
67890 lrwxrwxrwx 1 user user 12 Jul 15 11:01 symlink.txt -> original.txt

使用场景

  • 硬链接:适用于需要在不同位置访问同一文件,且不希望原文件删除后链接失效的场景
  • 软链接:适用于需要链接到目录、跨文件系统链接,或需要明确标识为链接的场景

注意事项

  • 删除原文件后,硬链接仍可正常访问内容,而软链接会变成无效链接
  • 修改硬链接或原文件的内容会相互影响(因为它们指向同一数据)
  • 软链接可以指向相对路径或绝对路径,建议使用绝对路径避免链接失效

15. 什么是虚拟文件系统(VFS)?它的作用是什么?

虚拟文件系统(VFS,Virtual File System)
是Linux内核中的一个抽象层,提供了一个统一的接口来访问不同类型的文件系统。它隐藏了各种具体文件系统的实现细节,使得用户空间程序可以用相同的方式访问不同的文件系统。

主要作用

  1. 提供统一接口:为所有文件系统提供一致的操作接口(如open、read、write等)
  2. 屏蔽实现差异:隐藏不同文件系统的底层实现细节
  3. 支持多种文件系统:允许同时使用多种不同类型的文件系统(如ext4、xfs、NTFS等)
  4. 简化应用程序开发:应用程序无需关心底层文件系统类型
  5. 管理文件系统挂载:负责文件系统的挂载和卸载

VFS的核心对象

  1. 超级块(superblock):每个已挂载的文件系统对应一个超级块对象,存储文件系统的整体信息
  2. 索引节点(inode):表示一个文件,存储文件的元数据
  3. 目录项(dentry):表示目录项,维护文件名与inode的映射关系
  4. 文件对象(file):表示进程打开的文件,包含文件指针位置等信息

工作流程

  1. 应用程序调用文件操作函数(如open())
  2. 系统调用将请求传递给VFS
  3. VFS根据文件路径确定对应的文件系统
  4. VFS调用该文件系统的具体实现函数
  5. 文件系统与底层存储设备交互
  6. 结果通过VFS返回给应用程序

优势

  • 灵活性:可以同时使用多种文件系统
  • 可扩展性:便于添加新的文件系统类型
  • 兼容性:可以访问其他操作系统的文件系统
  • 一致性:用户和应用程序使用统一的方式操作文件

支持的文件系统类型

  • 磁盘文件系统:ext4、xfs、btrfs、NTFS、FAT32等
  • 网络文件系统:NFS、CIFS等
  • 虚拟文件系统:proc、sysfs、tmpfs等

查看系统已挂载的文件系统

mount  # 显示所有已挂载的文件系统及其类型
df -T  # 显示文件系统类型和磁盘使用情况

二、120道Linux面试题目录列表

文章序号 Linux面试题120道
1 Linux面试题及详细答案120道(01-15)
2 Linux面试题及详细答案120道(16-30)
3 Linux面试题及详细答案120道(31-45)
4 Linux面试题及详细答案120道(46-60)
5 Linux面试题及详细答案120道(61-75)
6 Linux面试题及详细答案120道(76-95)
7 Linux面试题及详细答案120道(96-110)
8 Linux面试题及详细答案120道(111-120)

网站公告

今日签到

点亮在社区的每一天
去签到