学习目标

  • 理解本节涉及的核心主题:Linux 文件系统、/etc/fstab 文件配置、作用与重要性、文件格式与语法。
  • 掌握重点命令或工具:/etc/fstabfstabpstop
  • 能够结合示例完成常见操作,并理解关键参数、使用场景与结果差异。
  • 能够识别本节相关的常见风险、易错点或排查思路。

学习重点

  • 主题范围:Linux 文件系统、/etc/fstab 文件配置、作用与重要性、文件格式与语法、使用 fstab 实现系统启动时自动挂载、故障排除与最佳实践
  • 重点命令:/etc/fstabfstabpstop
  • 学习重点:命令用途、关键参数、典型场景、与相近命令的区别
  • 复习方式:先理解场景,再动手练习,最后对照结果检查

Linux 文件系统

/etc/fstab 文件配置

/etc/fstab 文件用于配置系统启动时自动挂载的文件系统。通过编辑此文件,可以定义设备、挂载点、文件系统类型和挂载选项,从而简化挂载过程。

作用与重要性

  • 自动挂载:系统启动时根据 /etc/fstab 的配置自动挂载文件系统,无需手动操作。
  • 持久性:确保文件系统挂载配置在系统重启后依然有效。
  • 集中管理:集中管理所有挂载点和文件系统的配置,便于系统维护和管理。

文件格式与语法

/etc/fstab 文件的每一行定义了一个文件系统的挂载配置,字段之间使用空格或制表符分隔。每行通常包含六个字段:

  1. 设备:要挂载的设备文件或 UUID。
  2. 挂载点:文件系统将被挂载到的目录。
  3. 文件系统类型:如 ext4ntfsvfat 等。
  4. 挂载选项:如 defaultsronoatime 等。
  5. 转储选项:用于备份程序,通常设置为 01
  6. 文件系统检查顺序:启动时检查文件系统的顺序,根文件系统通常为 1,其他为 2,不需要检查的设置为 0

示例 /etc/fstab 文件内容:

UUID=123e4567-e89b-12d3-a456-426614174000 /           ext4    defaults        0       1
UUID=123e4567-e89b-12d3-a456-426614174001 /home       ext4    defaults        0       2
/dev/cdrom    /mnt/iso       iso9660 ro,loop          0       0

配置示例与说明

示例 1:自动挂载 USB 驱动器

假设 USB 驱动器的 UUID 为 abcd1234-ef56-7890-gh12-ijkl3456mnop,文件系统类型为 vfat,希望在 /mnt/usb 挂载,并以只读方式挂载。

步骤:

  1. 查找设备的 UUID:

    sudo blkid /dev/sdb1
    

    输出示例:

    /dev/sdb1: UUID="abcd1234-ef56-7890-gh12-ijkl3456mnop" TYPE="vfat" PARTUUID="12345678-01"
    
  2. 编辑 /etc/fstab 文件:

    sudo nano /etc/fstab
    
  3. 添加以下行:

    UUID=abcd1234-ef56-7890-gh12-ijkl3456mnop /mnt/usb vfat ro,defaults 0 0
    

解释:

  • UUID=abcd1234-ef56-7890-gh12-ijkl3456mnop:设备的 UUID。
  • /mnt/usb:挂载点。
  • vfat:文件系统类型。
  • ro,defaults:只读挂载,使用默认选项。
  • 0:不参与转储。
  • 0:启动时不进行文件系统检查。

示例 2:自动挂载 NFS 共享

希望在系统启动时自动挂载 NFS 服务器上的共享目录。

假设:

  • NFS 服务器地址:nfsserver
  • 共享路径:/export/data
  • 本地挂载点:/mnt/data

步骤:

  1. 编辑 /etc/fstab 文件:
    sudo nano /etc/fstab
    
  2. 添加以下行:
    nfsserver:/export/data /mnt/data nfs defaults 0 0
    

解释:

  • nfsserver:/export/data:NFS 服务器上的共享路径。
  • /mnt/data:本地挂载点。
  • nfs:文件系统类型。
  • defaults:使用默认挂载选项。
  • 0:不参与转储。
  • 0:启动时不进行文件系统检查。

使用 fstab 实现系统启动时自动挂载

配置完成后,系统启动时会自动根据 /etc/fstab 的配置挂载相应的文件系统。也可以手动应用更改而无需重启系统。

示例操作:

应用 /etc/fstab 的挂载配置:

sudo mount -a

解释:

  • mount -a:根据 /etc/fstab 文件的配置挂载所有未挂载的文件系统。

验证挂载是否成功:

df -h | grep /mnt/usb

输出示例:

/dev/sdb1      7.5G  1.5G  6.0G  20% /mnt/usb

故障排除与最佳实践

故障排除
  • 挂载失败:
    原因: 设备不存在、挂载点目录不存在、文件系统类型错误、权限不足等。
    解决方法:
    • 检查设备是否存在:

      lsblk
      
    • 检查挂载点是否存在:

      ls /mnt/usb
      

      如果挂载点不存在,创建目录:

      sudo mkdir -p /mnt/usb
      
    • 验证文件系统类型:

      sudo blkid /dev/sdb1
      
    • 查看系统日志获取错误信息:

      dmesg | tail
      
  • 文件系统检查错误:
    原因: /etc/fstab 中的 pass 字段设置不正确,导致启动时文件系统检查失败。
    解决方法:
    • 编辑 /etc/fstab,设置正确的 pass 字段:
      • 根文件系统通常为 1
      • 其他需要检查的文件系统设置为 2
      • 不需要检查的文件系统设置为 0
最佳实践
  • 使用 UUID 或 LABEL:避免因设备名称变化导致挂载失败。
    查找 UUID:

    sudo blkid /dev/sdb1
    
  • 备份 /etc/fstab 文件:在修改前备份配置文件,以防配置错误导致系统无法启动。

    sudo cp /etc/fstab /etc/fstab.bak
    
  • 验证配置文件语法:在应用更改前,确保 /etc/fstab 文件语法正确。

    sudo mount -a
    

    如果没有错误输出,说明语法正确。

  • 限制挂载选项:仅启用必要的挂载选项,避免使用不安全的选项如 noexec 除非有特定需求。

总结

Linux 文件系统结构复杂而有序,各个目录承担着不同的功能,确保系统的高效运行和管理。理解文件系统权限和挂载机制,是保障系统安全和优化性能的基础。通过合理配置权限、管理特殊权限,以及正确挂载和卸载文件系统,系统管理员可以有效地维护和管理 Linux 系统。

以下是基于假设目录结构和文件的具体应用总结:

  • 根目录 /
    • 了解各个子目录的功能和用途,确保系统的基本结构清晰。
    • 示例: 查看 /etc 目录下的配置文件。
      ls /etc
      
  • 用户目录 /home
    • 管理用户的个人空间和配置文件,确保用户数据的安全性。
    • 示例: 查看用户 alice 的主目录结构。
      ls -la /home/alice
      
  • 系统目录 /bin, /usr, /etc, /var
    • 维护系统的基本命令、应用程序、配置文件和日志文件。
    • 示例: 查看 /var/log 目录下的日志文件。
      ls /var/log
      
  • 特殊目录 /dev, /proc, /sys
    • 监控和管理系统设备和内核信息,确保系统资源的有效利用。
    • 示例: 查看 CPU 信息。
      cat /proc/cpuinfo
      
  • 文件系统权限管理
    • 通过 chmod, chown, chgrp 等命令设置和修改文件权限,确保数据的安全性。
    • 示例: 为项目目录设置合适的权限和所有者。
      sudo chown -R alice:developers /home/alice/Projects/project_alpha
      chmod -R 755 /home/alice/Projects/project_alpha
      
  • 特殊权限(SUID, SGID, Sticky Bit)
    • 通过设置特殊权限,实现特定的功能需求,同时注意安全性。
    • 示例: 设置 /tmp 目录的 Sticky Bit。
      sudo chmod +t /tmp
      
  • 挂载与卸载文件系统
    • 使用 mountumount 命令挂载和卸载文件系统,确保数据的有效访问和管理。
    • 示例: 挂载 NFS 共享并自动挂载。
      sudo mount -t nfs server:/export/data /mnt/data
      sudo mount -a
      
  • /etc/fstab 文件配置
    • 配置系统启动时自动挂载文件系统,确保文件系统的持久性和稳定性。
    • 示例: 添加 USB 驱动器的挂载配置。
      UUID=abcd1234-ef56-7890-gh12-ijkl3456mnop /mnt/usb vfat ro,defaults 0 0
      

Linux 进程管理

进程概念与生命周期

理解进程的基本概念和生命周期,对于有效地管理和控制系统中的任务至关重要。

什么是进程?

定义与基本概念

进程是操作系统中程序执行的实例。它是系统进行资源分配和调度的基本单位,每个进程都有自己的地址空间、执行代码、数据、文件描述符和其他资源。进程可以看作是一个正在运行的程序,具有独立的执行流和生命周期。

基本特点:

  • 独立性:每个进程独立运行,拥有自己的内存空间。
  • 动态性:进程在生命周期中会经历创建、执行、等待和终止等状态。
  • 并发性:多个进程可以同时在系统中运行,提高资源利用率。
  • 异步性:进程的执行顺序不固定,取决于调度策略和系统资源。
进程与线程的区别

进程线程都是操作系统中执行任务的基本单位,但它们有以下区别:

特性 进程 线程
独立性 高,每个进程有独立的内存空间 低,同一进程的线程共享内存空间
资源消耗 较大,需要独立的资源 较小,共享进程的资源
通信方式 通过进程间通信(IPC)进行 通过共享内存进行
创建与销毁 相对复杂且耗时 简单且快速
崩溃影响 可能影响整个进程 只影响当前线程,不影响同一进程的其他线程

示例:

假设有一个 Web 服务器程序,该程序可以启动多个进程或线程来处理多个客户端请求。

  • 多进程模式:每个客户端请求由一个独立的进程处理,进程之间相互独立,互不干扰。
  • 多线程模式:所有客户端请求由多个线程在同一进程中处理,线程之间共享内存,通信更高效,但一个线程的崩溃可能影响整个进程。
进程的资源与隔离

每个进程在系统中运行时,会占用一定的资源,包括:

  • CPU 时间:用于执行进程的指令。
  • 内存:进程的代码段、数据段和堆栈。
  • 文件描述符:用于访问文件、设备和网络资源。
  • 信号:用于进程间的通信和控制。

资源隔离确保了一个进程无法直接访问或修改另一个进程的资源,增强了系统的稳定性和安全性。操作系统通过内存管理和权限控制来实现资源隔离。

示例:

用户 alice 启动了一个文本编辑器进程 gedit,该进程只能访问和修改用户 alice 的文件,无法直接访问其他用户的文件或系统关键文件。

进程的状态与 PID

进程状态(运行、睡眠、停止、僵尸)

进程在其生命周期中会经历不同的状态:

  • 运行(Running):进程正在使用 CPU 或准备使用 CPU。
  • 可中断睡眠(Interruptible Sleep):进程等待某个事件(如 I/O 完成),可以被信号中断。
  • 不可中断睡眠(Uninterruptible Sleep):进程等待某个事件,无法被信号中断,通常用于等待硬件事件。
  • 停止(Stopped):进程被信号暂停,通常由调试工具或用户发送。
  • 僵尸(Zombie):进程已终止,但其父进程尚未回收其资源。

状态转移示例:

  1. 创建:进程被创建,进入运行状态。
  2. 等待:进程执行过程中需要等待某些事件,进入睡眠状态。
  3. 唤醒:事件发生,进程被唤醒,重新进入运行状态。
  4. 终止:进程完成任务,进入僵尸状态,等待父进程回收资源。
进程标识符(PID)与父进程ID(PPID)

每个进程在系统中都有一个唯一的 进程标识符(PID),用于标识和管理进程。父进程ID(PPID) 是创建该进程的父进程的 PID。

示例:

用户 alice 启动一个终端,终端进程的 PID 为 1000。在该终端中启动一个 gedit 进程,gedit 的 PID 为 1001,其 PPID 为 1000

查看进程的 PID 和 PPID:

ps -ef | grep gedit

输出示例:

alice     1001  1000  0 Apr27 ?        00:00:05 gedit
  • 1001:PID
  • 1000:PPID
查看进程状态的工具(ps, top, htop

1. ps 命令

ps(process status)用于显示当前系统中的进程信息。

基本用法:

ps

常用选项:

  • ps aux:显示所有用户的所有进程,详细信息。
  • ps -ef:类似于 ps aux,使用不同的格式。

示例:

ps aux | grep ssh

输出示例:

root       1320  0.0  0.1  22500  4100 ?        Ss   Apr27   0:01 /usr/sbin/sshd
alice     1450  0.0  0.2  32768  8200 pts/0    Ss   Apr27   0:00 bash
alice     1500  0.0  0.1  35600  4200 pts/0    R+   Apr27   0:00 ps aux
alice     1501  0.0  0.0  10320   840 pts/0    S+   Apr27   0:00 grep ssh

2. top 命令

top 提供实时的进程信息和系统资源使用情况,适用于监控和管理系统性能。

基本用法:

top

3. htop 命令

htoptop 的增强版,提供更友好的界面和更多的交互功能。需要手动安装。

安装 htop

sudo apt-get install htop      # Debian/Ubuntu
sudo yum install htop          # CentOS/RHEL
sudo pacman -S htop            # Arch Linux

基本用法:

htop

界面优势:

  • 彩色显示,易于阅读。
  • 支持鼠标操作。
  • 提供更多的排序和筛选选项。

查看进程信息

查看和分析进程信息是进程管理的基础,帮助系统管理员了解系统状态、资源使用和潜在的问题。

ps - 显示当前进程

ps 命令用于显示系统中的当前进程信息,支持多种选项和格式。

基本用法

命令语法:

ps [options]

示例:

显示当前用户在当前终端中的进程:

ps

输出示例:

  PID TTY          TIME CMD
 1450 pts/0    00:00:00 bash
 1500 pts/0    00:00:00 ps
常用选项(如 ps aux, ps -ef

1. ps aux

显示所有用户的所有进程,包含详细信息。

命令:

ps aux

输出示例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  22500  4100 ?        Ss   Apr27   0:01 /sbin/init
root       1320  0.0  0.1  22500  4100 ?        Ss   Apr27   0:01 /usr/sbin/sshd
alice     1450  0.0  0.2  32768  8200 pts/0    Ss   Apr27   0:00 bash
alice     1500  0.0  0.1  35600  4200 pts/0    R+   Apr27   0:00 ps aux
alice     1501  0.0  0.0  10320   840 pts/0    S+   Apr27   0:00 grep ssh

2. ps -ef

类似于 ps aux,使用不同的格式显示所有进程。

命令:

ps -ef

输出示例:

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Apr27 ?        00:01:00 /sbin/init
root      1320     1  0 Apr27 ?        00:01:00 /usr/sbin/sshd
alice     1450  1320  0 Apr27 pts/0    00:00:00 bash
alice     1500  1450  0 Apr27 pts/0    00:00:00 ps -ef
alice     1501  1500  0 Apr27 pts/0    00:00:00 grep ssh
输出格式与解释

ps auxps -ef 提供的输出包含多个字段,每个字段代表进程的不同属性。

常见字段解释:

  • USER:进程所有者。
  • PID:进程标识符。
  • %CPU:进程使用的 CPU 百分比。
  • %MEM:进程使用的内存百分比。
  • VSZ:进程使用的虚拟内存大小(KB)。
  • RSS:进程使用的实际物理内存大小(KB)。
  • TTY:进程关联的终端。
  • STAT
    :进程状态代码。
    • R:运行
    • S:睡眠
    • D:不可中断睡眠
    • T:停止
    • Z:僵尸
  • START:进程启动时间。
  • TIME:进程使用的累计 CPU 时间。
  • COMMAND:启动进程的命令及参数。

示例:

ps aux | grep nginx

输出示例:

root      2001  0.0  0.1  50000  3000 ?        Ss   Apr27   0:00 nginx: master process /usr/sbin/nginx
www-data 2002  0.0  0.2  60000  4000 ?        S    Apr27   0:00 nginx: worker process
www-data 2003  0.0  0.2  60000  4000 ?        S    Apr27   0:00 nginx: worker process

top - 实时查看系统资源

top 提供实时的系统资源使用情况和进程信息,是监控系统性能的重要工具。

基本用法

命令:

top

启动界面示例:

top - 10:30:15 up 5 days,  3:45,  2 users,  load average: 0.15, 0.10, 0.05
Tasks: 150 total,   1 running, 149 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.0 us,  1.0 sy,  0.0 ni, 96.0 id,  1.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7972.0 total,   1200.0 free,   3000.0 used,   3772.0 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   4000.0 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1500 alice     20   0  35600   4200   840 R   0.0  0.1   0:00.00 ps
 1501 alice     20   0  10320    840    560 S   0.0  0.0   0:00.00 grep
界面与交互操作

top 的交互界面中,可以通过键盘命令执行多种操作:

  • P:按 CPU 使用率排序。
  • M:按内存使用率排序。
  • T:按运行时间排序。
  • k:杀死进程,需要输入 PID。
  • r:改变进程优先级(renice)。
  • q:退出 top

示例操作:

  1. 按内存使用率排序:
    M 键,将进程按内存使用率从高到低排序。
  2. 杀死一个进程:
    k 键,输入目标进程的 PID,例如 1501,并按回车。
  3. 更改进程优先级:
    r 键,输入目标进程的 PID,例如 1500,然后输入新的优先级值(例如 10)。
自定义显示内容(排序、过滤)

top 允许用户自定义显示内容,以更好地监控特定的进程或资源。

常用自定义操作:

  • 添加/移除列:
    f 键,进入字段管理界面,可以添加或移除显示的列。
  • 更改排序列:
    o 键,输入要排序的字段名称,例如 %CPU%MEM
  • 筛选进程:
    / 键,输入要筛选的关键词,例如 ssh,仅显示包含该关键词的进程。

示例操作:

  1. 添加 COMMAND 列:
    f 键,使用箭头键导航到 COMMAND,按 d 键添加该列。
  2. %MEM 排序:
    o 键,输入 %MEM,按回车。
  3. 筛选显示 bash 相关进程:
    / 键,输入 bash,按回车。

本节总结

  • 本节主要围绕 Linux 文件系统、/etc/fstab 文件配置、作用与重要性、文件格式与语法、使用 fstab 实现系统启动时自动挂载 展开。
  • 需要重点掌握的命令或工具包括:/etc/fstabfstabpstop
  • 学习时应优先抓住「命令解决什么问题、在什么场景下使用、执行后会产生什么结果」。
  • 对涉及权限、覆盖、网络、系统服务、删除或安全配置的操作,建议先在测试环境练习。

复习建议

  • 先用自己的话复述本节每个主题或命令的作用,避免只记参数不懂用途。
  • 按原文示例至少手敲一遍典型命令,并观察输出变化。
  • 对高风险操作先确认路径、权限和目标对象,再执行实际命令。
  • 可优先复习这些高频命令:/etc/fstabfstabpstop