Linux面试题及详细答案 120道(1-15)-- 基础概念
《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。
文章目录
- 一、本文面试题目录
- 1. 什么是Linux?它与Unix有什么关系和区别?
- 2. Linux的内核版本和发行版有什么区别?列举常见的Linux发行版。
- 3. 什么是GNU?GNU/Linux的关系是什么?
- 4. Linux系统的主要组成部分有哪些?
- 5. 简述Linux的启动过程。
- 6. BIOS、GRUB在Linux启动中分别起到什么作用?
- 7. 什么是运行级别(Runlevel)?不同运行级别的含义是什么?
- 8. systemd和init有什么区别?为什么systemd被广泛采用?
- 9. Linux的文件系统层级结构(FHS)是怎样的?各主要目录的作用是什么?
- 10. 什么是Shell?常见的Shell有哪些?
- 11. Bash和Zsh的主要区别是什么?
- 12. 绝对路径和相对路径的区别是什么?如何表示当前目录和父目录?
- 13. 什么是inode?它包含哪些信息?与文件有什么关系?
- 14. 硬链接和软链接(符号链接)的区别是什么?
- 15. 什么是虚拟文件系统(VFS)?它的作用是什么?
- 二、120道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内核,整合了各种软件和工具的完整操作系统
- 由不同组织或公司维护
- 除内核外,还包含桌面环境、应用程序、包管理系统等
常见发行版:
- Debian系列:Debian、Ubuntu、Linux Mint
- Red Hat系列:Red Hat Enterprise Linux (RHEL)、CentOS、Fedora
- SUSE系列:openSUSE、SUSE Linux Enterprise
- 独立发行版:Arch Linux、Gentoo、Slackware
- 特殊用途: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系统由以下主要部分组成:
-
内核(Kernel)
- 系统的核心,管理硬件资源
- 负责进程管理、内存管理、文件系统、设备驱动等
- 是操作系统与硬件之间的接口
-
Shell(外壳)
- 命令解释器,用户与内核交互的接口
- 常见的有bash、zsh、sh等
- 接收用户命令并传递给内核执行
-
文件系统
- 组织和存储文件的方式
- 常见的有ext4、xfs、btrfs等
- 采用树形目录结构
-
应用程序和工具
- 用户使用的各种软件和工具
- 包括文本编辑器、编译器、办公软件等
- 许多来自GNU项目
-
系统库(Libraries)
- 提供程序运行所需的函数和资源
- 如glibc(GNU C库)
- 简化应用程序开发
-
服务(Services)
- 在后台运行的程序
- 如网络服务、打印服务等
- 由systemd或其他初始化系统管理
结构示意图:
用户 → Shell → 系统调用 → 内核 → 硬件↓应用程序 → 系统库 → 内核
5. 简述Linux的启动过程。
Linux启动过程可分为以下几个主要阶段:
-
BIOS/UEFI初始化
- 计算机通电后首先运行基本输入输出系统(BIOS)或统一可扩展固件接口(UEFI)
- 进行硬件自检(POST),检测CPU、内存、硬盘等设备
- 确定启动设备(通常是硬盘)
-
引导加载程序(Boot Loader)
- 从启动设备加载引导程序(如GRUB)
- GRUB显示启动菜单,允许用户选择操作系统
- 加载并启动Linux内核
-
内核初始化
- 内核解压并加载到内存
- 初始化硬件设备,建立内存管理
- 挂载临时根文件系统(initramfs/initrd)
-
启动初始化系统
- 内核启动初始化进程(如systemd、upstart或传统的init)
- 这是系统启动的第一个用户空间进程(PID=1)
-
系统初始化
- 初始化系统负责启动各种服务和进程
- 挂载/etc/fstab中定义的文件系统
- 设置网络、时钟等系统参数
-
用户登录
- 启动图形界面或命令行登录界面
- 用户输入用户名和密码进行身份验证
- 加载用户环境,完成启动过程
简化流程:
电源启动 → BIOS/UEFI → GRUB → 内核 → systemd/init → 服务启动 → 登录界面
6. BIOS、GRUB在Linux启动中分别起到什么作用?
BIOS(Basic Input/Output System):
- 作用:是计算机启动时运行的固件程序,负责硬件初始化和启动引导
- 具体功能:
- 执行POST(Power-On Self-Test,加电自检),检查硬件是否正常
- 初始化硬件设备,如CPU、内存、硬盘等
- 确定启动顺序和启动设备(通过BIOS设置)
- 从启动设备的MBR(主引导记录)加载引导程序
GRUB(Grand Unified Bootloader):
- 作用:是Linux系统中常用的引导加载程序,负责加载操作系统内核
- 具体功能:
- 提供启动菜单,允许用户选择要启动的操作系统
- 加载并解压Linux内核到内存
- 向内核传递启动参数
- 支持多种文件系统和操作系统
- 可以在启动前修改内核参数
两者关系:
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
→ 运行级别0rescue.target
→ 运行级别1multi-user.target
→ 运行级别3graphical.target
→ 运行级别5reboot.target
→ 运行级别6
8. systemd和init有什么区别?为什么systemd被广泛采用?
init:
- 传统的系统初始化程序,采用串行启动方式
- 基于Shell脚本,按顺序启动服务
- 启动速度慢,依赖管理简单
- 配置文件复杂,分布在多个目录
systemd:
- 新一代系统和服务管理器,采用并行启动方式
- 基于C语言编写,支持并行启动服务
- 启动速度快,有更强大的依赖管理
- 集成了多种系统管理功能
主要区别:
特性 | init | systemd |
---|---|---|
启动方式 | 串行 | 并行 |
配置方式 | Shell脚本 | 单元文件(.service等) |
依赖管理 | 简单 | 复杂且精确 |
启动速度 | 较慢 | 较快 |
功能范围 | 仅初始化 | 集成日志、电源管理等 |
服务控制 | service命令 | systemctl命令 |
systemd被广泛采用的原因:
- 启动速度快:并行启动服务,减少启动时间
- 强大的依赖管理:精确控制服务启动顺序
- 统一的管理接口:通过systemctl管理所有系统功能
- 更好的日志支持:集成journald日志系统
- 按需启动服务:只有在需要时才启动某些服务
- 支持快照和恢复:可以保存和恢复系统状态
- 更好的硬件支持:对现代硬件和技术有更好的支持
示例命令对比:
# 启动服务
service httpd start # init
systemctl start httpd # systemd# 设置开机自启
chkconfig httpd on # init
systemctl enable httpd # systemd
9. Linux的文件系统层级结构(FHS)是怎样的?各主要目录的作用是什么?
Linux采用树形文件系统层级结构(FHS,Filesystem Hierarchy Standard),主要目录及其作用如下:
-
/(根目录)
- 文件系统的起点,所有目录都源于此
-
/bin
- 存放基本命令(二进制文件),如ls、cp、mv等
- 所有用户都可使用,在单用户模式下也能访问
-
/sbin
- 存放系统管理命令,如reboot、ifconfig等
- 通常只有root用户可使用
-
/etc
- 存放系统配置文件,如网络配置、用户配置等
- 重要文件:/etc/passwd、/etc/fstab、/etc/hostname
-
/home
- 普通用户的主目录
- 通常每个用户有一个以用户名命名的子目录
-
/root
- 超级用户(root)的主目录
-
/usr
- 存放用户应用程序和文件
- 子目录包括:/usr/bin(用户命令)、/usr/sbin(系统命令)、/usr/lib(库文件)、/usr/share(共享数据)
-
/var
- 存放经常变化的文件
- 子目录包括:/var/log(日志文件)、/var/spool(邮件、打印队列)、/var/www(网页文件)
-
/tmp
- 临时文件目录
- 系统重启后通常会清空
-
/dev
- 设备文件目录,所有硬件设备以文件形式存在于此
- 如:/dev/sda(第一块硬盘)、/dev/null(空设备)
-
/proc
- 虚拟文件系统,包含系统进程和内核信息
- 如:/proc/cpuinfo(CPU信息)、/proc/meminfo(内存信息)
-
/sys
- 虚拟文件系统,用于访问硬件设备和内核设置
-
/mnt 和 /media
- 临时挂载点,用于挂载外部设备
-
/lib 和 /lib64
- 系统库文件,供二进制程序使用
10. 什么是Shell?常见的Shell有哪些?
Shell:
是用户与Linux内核之间的接口程序,负责解释用户输入的命令并传递给内核执行。它是一种命令行解释器,也可以作为脚本语言使用。
工作原理:
- 用户输入命令
- Shell解析命令
- Shell将命令转换为内核可理解的指令
- 内核执行指令并返回结果
- Shell将结果展示给用户
常见的Shell:
-
Bash(Bourne Again SHell)
- 最常用的Shell,大多数Linux发行版的默认Shell
- 兼容Bourne Shell,增加了许多新特性
- 支持命令历史、命令补全、管道等功能
-
Sh(Bourne Shell)
- 早期的Unix Shell,由Stephen Bourne开发
- 功能简单,兼容性好
- 许多系统中sh是bash的符号链接
-
Csh(C Shell)
- 语法类似C语言,适合编程
- 引入了命令历史、别名等功能
- 在BSD系统中较常见
-
Tcsh
- Csh的增强版,增加了命令补全等功能
-
Zsh(Z Shell)
- 功能强大,结合了bash、csh等的优点
- 支持更多扩展和自定义选项
- 具有更强大的自动补全功能
-
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在功能和用户体验上有更多增强:
主要区别:
-
命令补全
- Bash:基本的命令和文件名补全
- Zsh:更智能的补全,支持:
- 命令选项补全(无需记住完整选项)
- 目录浏览补全(按Tab键可浏览目录)
- 插件扩展补全(如git命令补全)
-
主题和外观
- Bash:外观定制有限
- Zsh:高度可定制,支持丰富的主题
- 可显示Git分支、虚拟环境等信息
-
历史记录
- Bash:基本的命令历史功能
- Zsh:更强大的历史管理:
- 跨会话共享历史
- 按部分命令搜索历史
- 历史记录去重
-
插件支持
- Bash:插件支持有限
- Zsh:有丰富的插件生态系统(如Oh My Zsh)
- 常用插件:git、autojump、syntax-highlighting等
-
** globbing(模式匹配)**
- Zsh提供更强大的模式匹配功能
- 支持递归匹配(**)、扩展通配符等
-
拼写纠正
- Zsh可以自动纠正命令拼写错误
- Bash无此功能
-
启动速度
- Bash:启动较快
- Zsh:由于功能丰富,启动可能较慢,尤其是加载多个插件时
示例对比:
- Zsh的递归目录匹配:
# 列出所有子目录中的.md文件
ls **/*.md # Zsh支持,Bash默认不支持
- Zsh的拼写纠正:
# 如果输入了错误命令
ech hello# Zsh会提示
zsh: correct 'ech' to 'echo' [nyae]?
- 安装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包含的信息:
- 文件类型(普通文件、目录、链接等)
- 文件权限(读、写、执行权限)
- 文件所有者和所属组
- 文件大小
- 最后访问时间(atime)
- 最后修改时间(mtime)
- 最后元数据修改时间(ctime)
- 链接数(指向该inode的硬链接数量)
- 文件数据块的位置指针
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: testfileSize: 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 +0800Birth: -
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内核中的一个抽象层,提供了一个统一的接口来访问不同类型的文件系统。它隐藏了各种具体文件系统的实现细节,使得用户空间程序可以用相同的方式访问不同的文件系统。
主要作用:
- 提供统一接口:为所有文件系统提供一致的操作接口(如open、read、write等)
- 屏蔽实现差异:隐藏不同文件系统的底层实现细节
- 支持多种文件系统:允许同时使用多种不同类型的文件系统(如ext4、xfs、NTFS等)
- 简化应用程序开发:应用程序无需关心底层文件系统类型
- 管理文件系统挂载:负责文件系统的挂载和卸载
VFS的核心对象:
- 超级块(superblock):每个已挂载的文件系统对应一个超级块对象,存储文件系统的整体信息
- 索引节点(inode):表示一个文件,存储文件的元数据
- 目录项(dentry):表示目录项,维护文件名与inode的映射关系
- 文件对象(file):表示进程打开的文件,包含文件指针位置等信息
工作流程:
- 应用程序调用文件操作函数(如open())
- 系统调用将请求传递给VFS
- VFS根据文件路径确定对应的文件系统
- VFS调用该文件系统的具体实现函数
- 文件系统与底层存储设备交互
- 结果通过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) |