操作系统
特性
- 开源免费:基于 GPL 许可证,源代码公开,允许自由修改、分发和商用,避免了闭源系统的垄断限制。
- 多用户、多任务:支持同时多个用户登录,且能并发运行多个进程(任务),通过进程调度实现高效资源分配。
- 稳定性与可靠性:内核设计注重稳定性,适合长时间运行(如服务器常以 "年" 为单位不间断运行),崩溃概率极低。
- 可移植性:内核可在 x86、ARM、RISC-V 等多种架构的硬件上运行,从嵌入式芯片到超级计算机均能适配。
- 安全性:通过用户权限、文件访问控制、防火墙等机制保障系统安全,开源特性也让漏洞能被快速发现和修复。
架构
Linux 采用 "分层架构",内核具有很高的权限,可以控制CPU,内存,硬盘等硬件,而应用程序具有的权限很小,因此大多数操作系统,把内存分成两个区域:核心分为内核空间 和用户空间,两者通过系统调用交互。
- 内核空间,只有内核程序可以访问
- 用户空间:专门给应用程序使用
CPU可以在两种状态下运行:用户态和内核态,在用户态运行时,CPU只能访问用户空间的内存;在内核态运行时,CPU既能访问用户空间也能访问内核空间。
内核空间(核心组件)
内核是 Linux 的 "大脑",运行在最高权限级别(Ring 0),作为应用程序连接硬件硬件设备的桥梁,主要功能包括:
- 进程管理:负责进程的创建、销毁、调度(如 CFS 完全公平调度器),以及进程间通信(IPC)。
- 内存管理:通过虚拟内存机制管理物理内存和磁盘交换区,实现进程地址空间隔离、内存分配与回收。
- 文件系统管理:通过 VFS(虚拟文件系统)抽象不同文件系统(如 ext4、XFS),统一文件操作接口(打开、读写、关闭等)。
- 设备管理:通过进程与硬件交互,将硬件抽象为 "设备文件"(如 /dev/sda 代表硬盘),支持字符设备(如键盘)和块设备(如硬盘)。
- 网络管理:实现 TCP/IP 协议栈,支持网络数据的封装、路由、转发,以及防火墙(netfilter/iptables)等功能。
- 提供系统调用接口:进程可利用内核入口点(也称为系统调用)请求内核去执行各种任务。
用户空间(用户交互层)
用户空间运行在低权限级别(Ring 3),是用户与系统交互的接口,包括:
- Shell:命令行解释器(如 bash、zsh),用户通过输入命令调用内核功能(如 ls 查看文件、mkdir 创建目录)。
- 图形界面(GUI):基于 X Window System 或 Wayland,提供可视化操作(如 GNOME、KDE 桌面环境)。
- 应用程序:用户安装的软件(如浏览器、数据库、开发工具),通过系统调用向内核请求资源(如读写文件需调用 open() 系统调用)。
核心机制
内存管理
- 虚拟内存:每个进程拥有独立的 4GB 虚拟地址空间(32 位系统),通过页表映射到物理内存或磁盘交换区(Swap),实现 "内存隔离" 和 "内存扩展"(即使物理内存不足,也可通过 Swap 临时存储数据)。
- 分页机制:虚拟地址和物理地址按 "页"(通常 4KB)划分,页表记录映射关系,TLB(快表)加速地址转换。
- 内存分配:内核通过 "伙伴系统" 管理物理内存(分配大块连续内存),"slab 分配器" 管理小内存(如内核对象),避免内存碎片。
- OOM 机制:当内存耗尽时,内核的 OOM Killer(Out-of-Memory Killer)会按优先级杀死进程,释放内存以保障系统存活。
进程管理
- 进程概念:进程是程序的运行实例,拥有独立的地址空间、寄存器状态和资源(如文件描述符),通过 PID(进程 ID)唯一标识。
- 进程状态:包括运行(R)、就绪(R)、阻塞(S/D)、停止(T)、僵尸(Z)等,内核通过调度器(如 CFS)决定哪个进程获得 CPU 时间。
- 进程调度:CFS(Completely Fair Scheduler)是 Linux 主流调度器,通过 "虚拟运行时间" 计算进程优先级,确保每个进程公平占用 CPU。
- 进程间通信(IPC):包括管道(Pipe)、信号(Signal)、共享内存(Shared Memory)、消息队列(Message Queue)、信号量(Semaphore)等,用于进程间数据交换或同步。
文件系统
文件系统负责管理存储设备上的数据组织、访问和持久化。与 Windows 等系统的 "多根目录(如 C:、D:)" 不同,Linux 采用单一树形目录结构,并遵循 "一切皆文件" 的设计哲学(包括硬件设备、进程、网络接口等都被抽象为文件)。
- 一切皆文件:Linux 中,硬件设备(如 /dev)、进程信息(如 /proc)、网络套接字(如 /sys)均被抽象为文件,统一通过 open()/read()/write() 等接口操作。
- VFS(虚拟文件系统):内核的中间层,屏蔽不同文件系统(如 ext4、XFS、NFS)的差异,为用户提供统一的文件操作接口。
- 目录结构(标准 FHS 规范)单一树形结构:Linux 以/(根目录)为起点,所有文件和子目录都挂载在根目录下,形成层级结构。
单一树形结构
目录 | 功能说明 |
---|---|
/ | 根目录,所有文件系统的起点 |
/bin | 存放普通用户可执行的基础命令(如ls、cp),系统启动时必须可用 |
/sbin | 存放管理员(root)专用命令(如reboot、fdisk),用于系统管理 |
/user | 存放用户程序和数据,类似 "软件安装目录",包含/usr/bin(用户命令)、/usr/lib(库文件)等 |
/etc | 存放系统配置文件(如/etc/passwd用户信息、/etc/fstab挂载配置) |
/home | 普通用户的主目录(如/home/alice是用户alice的个人目录) |
/root | 管理员(root)的主目录(普通用户无权限访问) |
/var | 存放动态变化的数据(如日志/var/log、缓存/var/cache、数据库文件) |
/tmp | 临时文件目录(所有用户可读写,系统重启后可能清空) |
/dev | 设备文件目录(如/dev/sda1是硬盘分区、/dev/tty1是终端设备) |
/proc | 虚拟文件系统,映射内核和进程实时信息(如/proc/1是 PID=1 的进程信息) |
/sys | 虚拟文件系统,暴露硬件设备和内核子系统信息(如/sys/class/net网络设备) |
/lib | 存放系统核心共享库(如 C 语言库libc.so),支撑/bin和/sbin的命令 |
/mnt | 临时挂载点(用户手动挂载外部设备,如 U 盘、移动硬盘) |
/media | 自动挂载点(系统自动识别的可移动设备,如光盘、U 盘,会自动挂载到此处) |
文件系统类型
- 本地磁盘文件系统(最常用)
- ext 系列 :Linux 传统文件系统,ext4 是目前主流(ext2 无日志,ext3 有基础日志,ext4 支持更大容量和更快速度)。
支持最大文件 16TB,最大分区 1EB,适合普通硬盘和 SSD。 - XFS:高性能日志文件系统,擅长处理大文件和高吞吐量(如服务器日志、数据库),RHEL/CentOS 7 + 默认使用。
- Btrfs:"下一代文件系统",支持快照、动态扩容、数据校验等高级功能,适合需要灵活管理的场景(如虚拟机存储)。
- FAT32/NTFS:兼容 Windows 的文件系统,需通过ntfs-3g工具挂载才能在 Linux 中读写 NTFS。
- 虚拟 / 临时文件系统
- tmpfs:基于内存的临时文件系统,数据存储在 RAM 中(或 swap),速度极快,用于/tmp或/run(进程运行时数据),重启后数据丢失。
- procfs:即/proc目录,不占用磁盘空间,实时映射内核和进程信息。
- sysfs:即/sys目录,用于暴露硬件设备和内核参数的层级结构。
- 网络文件系统
- NFS:网络文件系统,允许远程主机通过网络共享文件(如服务器 A 的/data挂载到客户端 B 的/mnt/nfs)。
- CIFS/SMB:兼容 Windows 的网络共享协议,通过samba服务实现 Linux 与 Windows 文件共享。
VFS(Virtual File System,虚拟文件系统)
它是内核中的一层抽象接口,它并非实际的文件系统,而是通过统一的接口适配各种底层文件系统(如 ext4、xfs、ntfs、NFS 等),让用户和应用程序可以用相同的方式访问不同类型的文件系统。VFS 是 Linux 实现 "一切皆文件" 哲学的核心机制,其本质是 "用统一的抽象屏蔽底层差异"。
VFS关键数据结构
VFS 通过一组抽象的数据结构描述文件系统的核心要素,这些结构是连接用户操作与底层文件系统的 "桥梁"。
- 超级块(super_block)
- 作用 :对应一个 已挂载的文件系统(如一个 ext4 分区、一个 NFS 共享目录),记录该文件系统的全局元数据。
- 核心信息 :
- 文件系统类型(如 ext4、xfs);
- 总大小、块大小、inode 总数等;
- 挂载点、挂载选项(如只读 / 读写);
- 指向该文件系统操作函数集的指针(super_operations)。
- 特点:每个已挂载的文件系统对应一个 super_block,由内核在挂载时创建(通过读取底层文件系统的 "超级块" 元数据初始化)。
- 索引节点(inode)
- 作用 :描述一个 文件的元数据(不包含文件名),对应底层文件系统中一个具体的文件 / 目录 / 设备等("文件" 的抽象)。
- 核心信息 :
- 文件类型(普通文件、目录、设备文件等);
- 权限(owner、group、other 的 rwx);
- 大小、创建 / 修改 / 访问时间;
- 指向数据块的指针(不同文件系统实现不同,如 ext4 用间接块,xfs 用 B+ 树);
- 指向该 inode 操作函数集的指针(inode_operations,如创建文件、删除文件等)。
- 特点 :
- 一个 inode 唯一对应一个文件(但一个文件可被多个文件名链接,即硬链接);
- 文件名不存储在 inode 中,而是由目录项(dentry)管理。
- 目录项(dentry)
- 作用 :实现 "文件名到 inode 的映射",是目录查找的关键(解决 "如何通过文件名找到对应的 inode")。
- 核心信息 :
- 文件名(如 file.txt、docs);
- 指向对应 inode 的指针(d_inode);
- 父目录的 dentry 指针(形成目录树结构);
- 子目录项链表(如目录 docs 的 dentry 包含其下所有文件的 dentry)。
- 特点 :
- dentry 是 VFS 层的抽象,底层文件系统可能没有对应的结构(仅存在于内存中);
- 会被缓存(dentry 缓存)以加速目录查找(例如频繁访问的文件名无需反复从磁盘读取)。
- 文件(file)
- 作用 :描述 进程打开的文件,记录进程与文件的交互状态("打开的文件" 的抽象)。
- 核心信息 :
- 指向对应的 inode(f_inode);
- 当前读写偏移量(f_pos,每个进程打开同一文件的偏移量独立);
- 打开模式(f_mode,如只读、读写);
- 指向该文件操作函数集的指针(file_operations,如 read()、write()、close() 等)。
- 特点 :
- 一个 inode 可对应多个 file 结构(多个进程打开同一文件);
- 进程通过文件描述符(fd)关联到 file 结构(用户空间的 fd 是内核中 file 数组的索引)。
- 文件系统类型(file_system_type)
- 作用:描述一种文件系统的 "类型模板"(如 ext4、ntfs),用于内核识别和加载文件系统。
- 核心信息 :
- 文件系统名称(如 "ext4");
- 挂载函数(mount_fs,用于创建该类型文件系统的 super_block);
- 是否支持磁盘配额、日志等特性。
VFS 的操作函数集(接口抽象的核心)
VFS 的 "统一接口" 通过 函数指针集合(操作表) 实现:底层文件系统只需实现这些函数,VFS 即可通过调用它们完成实际操作。核心操作表包括:
- super_operations:超级块操作(如创建 inode、同步文件系统数据到磁盘)。
- inode_operations:inode 操作(如创建文件、删除文件、重命名、查找目录项)。
- dentry_operations:目录项操作(如验证目录项有效性、释放目录项)。
- file_operations:文件操作(如 read()、write()、lseek()、ioctl())。
例如,当用户调用 read(fd, buf, size) 时:
- 内核通过 fd 找到对应的 file 结构;
- 从 file 中获取 file_operations 函数集;
- 调用该函数集中的 read 方法(底层文件系统实现的具体函数,如 ext4 的 ext4_file_read)。
VFS 的工作流程(以 "访问文件 /home/user/file.txt" 为例)
- 解析路径 :
用户输入路径 /home/user/file.txt,VFS 从根目录(/)开始,逐层解析目录项(home → user → file.txt)。每一步解析都通过当前目录的 dentry 查找子目录的 dentry(依赖 dentry 缓存加速)。 - 定位 inode :
解析到 file.txt 的 dentry 后,通过 dentry->d_inode 找到对应的 inode,获取文件的元数据(如权限、数据块位置)。 - 打开文件 :
调用 open() 系统调用时,VFS 为当前进程创建 file 结构,关联到 inode,并初始化读写偏移量等状态。 - 读写操作 :
用户调用 read() 或 write() 时,VFS 通过 file->f_op(file_operations)调用底层文件系统的具体实现(如 ext4 从磁盘块读取数据,NFS从远程服务器读取数据)。 - 关闭文件 :
调用 close() 时,VFS 释放 file 结构(若最后一个进程关闭文件,可能触发 inode 的延迟写盘)。
indoe与数据块
Linux 文件系统通过inode和数据块管理文件:
-
inode(索引节点) :
每个文件对应一个唯一的 inode,存储文件的元数据(非内容):
- 文件类型(普通文件、目录、链接等);
- 权限(用户、组、其他用户的 rwx 权限);
- 大小、创建 / 修改 / 访问时间;
- 数据块的位置(指向实际存储内容的磁盘块)。
inode 本身有编号(通过ls -i可查看文件的 inode 号),文件名仅作为 inode 的 "别名",存储在目录文件中。
-
数据块 :
存储文件的实际内容(如文本、图片数据),大小通常为 4KB(可配置)。大文件会占用多个数据块,inode 通过指针记录这些块的位置。
具体详细的,前面文章有讲过,感兴趣的的话可以去看看 硬链接与软链接
设备管理
- 设备分类 :
- 字符设备:按字节流顺序读写(如键盘、串口),无缓存;
- 块设备:按块(如 512B)读写(如硬盘、U 盘),有缓存。
- 设备文件:设备通过 "设备文件" 暴露给用户,位于 /dev 目录(如 /dev/tty1 代表终端,/dev/sda1 代表硬盘分区),通过主设备号(标识设备类型)和次设备号(标识同一类型的不同设备)区分。
- udev 机制:动态管理设备节点,当硬件插入 / 移除时,自动创建 / 删除 /dev 下的设备文件,无需手动配置。
网络与安全
- 网络协议栈:内核实现 TCP/IP 协议(包括 IP、TCP、UDP、ICMP 等),支持网卡驱动、路由表、DNS 解析等,通过 socket 接口供应用程序(如浏览器、服务器)使用。
- 防火墙:基于 netfilter 框架,通过 iptables 或 nftables 配置规则,实现数据包过滤、NAT 转换(如端口映射)等。
- 安全机制 :
- 用户与组:通过 UID(用户 ID)和 GID(组 ID)区分权限,root(UID=0)为最高权限用户;
- 文件权限:每个文件有 r(读)、w(写)、x(执行)权限,分属所有者(u)、所属组(g)、其他用户(o),通过 chmod 修改;
- SELinux/AppArmor:强制访问控制(MAC)机制,限制进程的操作范围(如禁止 Web 服务读写 /etc/passwd);
- PAM(可插拔认证模块):统一认证接口,支持密码、指纹、密钥等多种认证方式。
挂载(Mount)机制
Linux 文件系统的挂载(Mount)是将存储设备(如硬盘分区、U 盘、光盘、网络存储等)的文件系统与系统目录树中的某个目录(挂载点)关联起来的过程。通过挂载,用户可以像访问本地目录一样访问这些存储设备中的数据。这一机制是 Linux 实现 "单一树形目录结构" 的核心
- 挂载点:一个空目录(如/mnt/usb),挂载后文件系统的内容会显示在该目录下。
- 临时挂载:通过mount命令手动挂载(如mount /dev/sdb1 /mnt/usb挂载 U 盘)。
- 永久挂载:配置/etc/fstab文件,系统开机时自动挂载(每行记录一个文件系统的设备、挂载点、类型、参数等)。
挂载的核心要素
挂载过程需要明确四个关键要素,缺一不可:
- 待挂载设备:通常是存储设备的标识(如硬盘分区 /dev/sda1、U 盘 /dev/sdb、光盘 /dev/cdrom 或网络存储路径)。
- 挂载点(Mount Point):系统目录树中已存在的空目录(如 /mnt/usb、/media/cdrom)。挂载后,设备文件系统的内容会显示在该目录下(原目录中的内容会被临时隐藏,卸载后恢复)。
- 文件系统类型:设备使用的文件系统格式(如 ext4、xfs、ntfs、vfat 等),内核需通过类型加载对应的驱动。
- 挂载选项:控制文件系统的访问方式(如 rw 读写、ro 只读、noatime 不记录访问时间等)。
基本流程
挂载过程从用户发起请求到内核完成关联,可分为 用户空间操作 和 内核空间处理 两个阶段
- 用户空间:发起挂载请求
用户通过 mount 命令(或图形工具)发起挂载,例如:
bash
mount /dev/sdb1 /mnt/usb -t vfat -o rw,utf8
- 该命令的含义:将设备 /dev/sdb1(U 盘分区)以 vfat 格式挂载到 /mnt/usb,选项为 "读写" 和 "支持 UTF-8 编码"。
此时,mount 命令会通过 系统调用(sys_mount) 将请求传递给内核
- 内核空间:处理挂载请求
内核接收到挂载请求后,由 VFS(虚拟文件系统) 协调处理:
(1)参数校验
- 检查挂载点是否存在且为目录(若不存在或非目录,返回错误)。
- 检查待挂载设备是否有效(如是否存在、是否已被挂载)。
- 检查用户权限(普通用户通常只能挂载允许的设备,root 无限制)。
(2)加载文件系统驱动
- 内核根据用户指定的文件系统类型(如 -t vfat),加载对应的驱动模块(如 vfat.ko)。
- 若未指定类型(-t 省略),内核会自动探测设备的文件系统格式(通过读取设备的超级块信息)。
(3)解析文件系统超级块(Super Block)
- 内核读取设备的 超级块(文件系统的元数据,存储文件系统大小、块大小、inode 数量等核心信息)。
- 为该文件系统创建 超级块对象(super_block 结构体),保存文件系统的关键参数(如类型、大小、状态等),供 VFS 统一管理。
(4)关联挂载点与文件系统
- 内核在 VFS 层创建 挂载对象(vfsmount 结构体),记录挂载点目录、对应的超级块、挂载选项等信息。
- 将挂载点目录的 dentry(目录项)与文件系统的根目录 dentry 关联,使得访问挂载点目录时,实际指向设备文件系统的根目录。
(5)更新挂载信息
- 内核将新挂载的文件系统加入全局挂载列表(vfsmount_list),供后续查找和管理。
- 若挂载选项包含 remount(重新挂载),则更新已有挂载的参数(如从只读改为读写)。
挂载成功后,用户通过访问挂载点目录(如 /mnt/usb)即可读写设备中的文件,所有操作通过 VFS 转发给对应的文件系统驱动,最终由驱动与硬件交互。