文件系统与磁盘管理

LinuxBeginner
立即练习

介绍

欢迎来到 Linux 文件系统与磁盘管理实验!本实验专为刚开始探索 Linux 系统管理世界的初学者设计。我们将引导你学习与管理磁盘空间、创建虚拟磁盘以及维护文件系统相关的核心命令和概念。通过本实验,你将获得 Linux 磁盘管理基础工具的实践经验。

使用 df 查看磁盘使用情况

df (disk free) 命令是你检查 Linux 系统磁盘空间使用情况的首选工具。让我们探索如何使用它:

  1. 打开终端。你应该位于 /home/labex/project 目录下。如果不确定,可以使用 pwd 命令随时查看当前目录。

  2. 运行以下命令查看磁盘使用情况:

    df
    

    你将看到类似以下的输出:

    Filesystem     1K-blocks      Used Available Use% Mounted on
    overlay         20971520    128744  20842776   1% /
    tmpfs              65536         0     65536   0% /dev
    tmpfs            3995004         0   3995004   0% /sys/fs/cgroup
    shm                65536         0     65536   0% /dev/shm
    /dev/nvme1n1  104806400  57754052  47052348  56% /etc/hosts
    

    如果起初看起来有些困惑,别担心!让我们拆解一下:

    • Filesystem:此列显示磁盘或分区的名称。
    • 1K-blocks:这是以 1 KB 为单位的文件系统总大小。
    • Used:显示当前已使用的空间。
    • Available:显示剩余的可用空间。
    • Use%:显示文件系统的使用百分比。
    • Mounted on:显示文件系统挂载在目录树中的位置。
  3. 现在,让我们让输出更易于阅读。运行:

    df -h
    

    -h 选项代表「human-readable」(人类可读)。你将看到如下输出:

    Filesystem      Size  Used Avail Use% Mounted on
    overlay          20G  126M   20G   1% /
    tmpfs            64M     0   64M   0% /dev
    tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
    shm              64M     0   64M   0% /dev/shm
    /dev/nvme1n1   100G   56G   45G  56% /etc/hosts
    

    这样好多了,对吧?现在大小以 GB 和 MB 为单位,更容易理解。

  4. 如果你想检查包含特定文件或目录的文件系统所占用的空间,可以将路径传递给 df

    df -h /etc/hosts
    

    这将仅显示包含 /etc/hosts 的文件系统信息。在此环境中,该文件系统通常是 /dev/nvme1n1

df 命令对于快速检查剩余磁盘空间非常有用。如果你遇到系统提示空间不足的情况,df 通常是你进行调查时使用的第一个命令。

使用 du 检查目录大小

虽然 df 给出了磁盘使用情况的概览,但有时我们需要深入挖掘。这时就需要用到 du (disk usage) 命令。它能帮助我们了解哪些目录和文件占用了最多的空间。

  1. 首先,以最简单的形式使用 du。运行:

    du ~
    

    你将看到一长串数字和目录名称。每个数字代表该目录的大小(以 KB 为单位)。这可能会让人眼花缭乱,所以让我们让它更易于管理。

  2. 为了获得更易读的输出,请使用 -h 选项:

    du -h ~
    

    df 一样,-h 选项使输出变得易于阅读。你将看到以 KB、MB 或 GB 为单位的大小。

  3. 通常,我们只想知道目录的总大小。为此,请使用:

    du -sh ~
    

    这里,-s 表示「summarize」(汇总),~ 代表你的家目录。此命令将显示你家目录中所有内容的总大小。

  4. 要查看家目录下直接子目录的大小,请使用:

    du -h --max-depth=1 ~
    

    这显示了每一级子目录的大小。--max-depth=1 选项限制了 du 进入子目录递归的深度。

  5. 让我们检查家目录下各项的大小:

    du -sh ~/*
    

    这将显示家目录下每个非隐藏文件和目录的大小。

  6. 这是一个查找家目录下最大项目的强大命令:

    du -h ~ | sort -rh | head -n 10
    

    让我们拆解一下:

    • du -h ~ 列出家目录下所有文件和目录及其大小
    • sort -rh 以逆序(从大到小)并按人类可读格式对列表进行排序
    • head -n 10 仅显示输出的前 10 行
    • | 是管道符,它将一个命令的输出作为下一个命令的输入

    此命令很好地展示了如何组合简单的 Linux 命令来执行更复杂的操作。

当你试图释放磁盘空间时,du 命令非常宝贵。它能帮你识别哪些目录或文件占用了最多的空间,从而让你知道清理工作的重点在哪里。

创建和管理虚拟磁盘

在深入之前,让我们先了解什么是虚拟磁盘。虚拟磁盘就是一个充当物理磁盘驱动器的文件。可以把它想象成创建一个容器文件,操作系统可以像对待真实的硬盘一样对待它。这类似于虚拟机使用虚拟磁盘文件来存储数据的方式。

为什么要这样做呢?虚拟磁盘在以下场景中非常有用:

  • 在不冒损坏真实硬件风险的情况下安全地测试磁盘操作
  • 创建隔离的存储空间
  • 在无需额外物理硬件的情况下学习磁盘管理
  • 创建真实磁盘的备份镜像

理解关键概念

在进行实践操作之前,让我们了解一些重要概念:

  1. **文件系统 (Filesystem)**:可以将文件系统视为磁盘上文件和文件夹的组织方式。它就像办公室里的归档系统——决定了数据如何存储和检索。常见的 Linux 文件系统包括 ext4(我们将使用)、XFS 和 btrfs。

  2. **挂载 (Mounting)**:挂载是将文件系统提供给操作系统访问的过程。当你挂载一个文件系统时,你是在告诉 Linux:「让这个磁盘的内容在特定的目录下可用。」这类似于:

    • 插入 USB 驱动器(物理连接)
    • 然后告诉计算机在哪里显示其内容(挂载点)
  3. **分区 (Partitions)**:分区是磁盘中被视为独立单元的部分。可以把它想象成将大硬盘划分为更小的、独立的区域。分区的理由包括:

    • 将系统文件与用户文件分开
    • 为不同目的使用不同的文件系统
    • 使备份更容易
    • 限制磁盘故障的影响

让我们创建并使用一个虚拟磁盘:

  1. 首先,使用 dd 命令创建一个 256 MB 的虚拟磁盘:

    dd if=/dev/zero of=virtual.img bs=1M count=256
    

    让我们拆解这个命令:

    • dd 是一个用于复制和转换文件的工具
    • if=/dev/zero 表示「输入文件是 /dev/zero」(一个提供无限零的特殊文件)
    • of=virtual.img 表示「输出文件是 virtual.img」(我们的新虚拟磁盘文件)
    • bs=1M 将块大小设置为 1 MB(一次复制多少数据)
    • count=256 表示复制 256 个块(生成一个 256 MB 的文件)

    这创建了一个充满零的空文件,我们将把它用作虚拟磁盘。

  2. 验证文件大小:

    ls -lh virtual.img
    

    你应该看到 virtual.img 正好是 256 MB。

  3. 现在,使用 ext4 文件系统格式化此虚拟磁盘:

    sudo mkfs.ext4 virtual.img
    

    这里发生了什么?此命令:

    • 在我们的虚拟磁盘文件中创建一个新的 ext4 文件系统
    • 设置存储文件和目录所需的基本结构
    • 类似于在首次使用前格式化新的 USB 驱动器

    ext4 文件系统是许多 Linux 发行版的默认选择,因为它可靠且经过充分测试。

  4. 接下来,我们需要创建一个挂载点。这是虚拟磁盘内容将出现的目录:

    sudo mkdir /mnt/virtualdisk
    

    将挂载点视为进入虚拟磁盘的「窗口」。挂载后,当你查看此目录时,实际上看到的是虚拟磁盘的内容。

  5. 现在我们可以挂载虚拟磁盘了:

    sudo mount -o loop virtual.img /mnt/virtualdisk
    

    让我们拆解一下发生了什么:

    • -o loop 选项告诉 Linux 将我们的文件视为真实的磁盘设备
    • virtual.img 是我们的源(我们创建的虚拟磁盘)
    • /mnt/virtualdisk 是我们希望内容出现的位置

    这类似于插入 USB 驱动器时自动发生的情况,只是我们手动对虚拟磁盘文件执行了此操作。

  6. 让我们验证磁盘是否已挂载:

    mount | grep virtualdisk
    

    你应该看到一行显示 virtual.img 已挂载到 /mnt/virtualdisk

  7. 现在它已挂载,我们可以像使用任何其他目录一样使用它。让我们创建一个文件:

    sudo touch /mnt/virtualdisk/testfile
    ls /mnt/virtualdisk
    

    你应该能看到 testfile 被列出。

  8. 当你使用完虚拟磁盘后,应该卸载它:

    sudo umount /mnt/virtualdisk
    

    卸载会从该目录中移除文件系统,确保操作系统在断开连接前完成所有挂载的读写操作。未能正确卸载可能导致数据损坏。虽然命令语法侧重于卸载目录,但在底层,操作系统知道该目录对应于已挂载的磁盘镜像。

创建、格式化和挂载虚拟磁盘的过程与插入新硬盘或 USB 闪存盘时发生的情况非常相似。主要区别在于我们是用文件而不是物理设备来完成所有操作。

挂载文件系统意味着将其附加到指定的目录,以便操作系统可以访问文件系统内的数据。在本实验中,虚拟磁盘镜像文件被视为物理磁盘,挂载使其内容在特定目录(例如 /mnt/virtualdisk)下可用。

使用 fdisk 管理磁盘分区

在真实系统中,在创建文件系统之前,通常需要创建分区。虽然我们无法在此虚拟环境中修改实际的磁盘分区,但我们可以探索如何使用 fdisk 查看分区信息。

  1. 首先,查看所有磁盘分区的信息:

    sudo fdisk -l
    

    这将显示有关所有磁盘设备及其分区的信息。你将看到有关磁盘大小、扇区数和分区表的详细信息。

  2. 现在,查看我们虚拟磁盘的分区信息:

    sudo fdisk -l virtual.img
    

    这将显示虚拟磁盘的分区表。由于我们直接在磁盘镜像上创建了文件系统而没有进行分区,你可能会看到一条消息,提示它不包含有效的分区表。

在真实系统中,你会交互式地使用 fdisk 来创建、删除或修改分区。以下是其工作原理的简要概述:

  • 使用 sudo fdisk /dev/sdX 启动 fdisk(将 X 替换为要分区的磁盘对应的字母)
  • 使用命令 n 创建新分区
  • d 删除分区
  • t 更改分区的系统 ID(指示分区的预期用途)
  • w 写入更改并退出

请记住,修改分区可能导致数据丢失,因此在对磁盘分区进行更改之前,请务必小心并备份重要数据。

Fdisk 不仅限于显示分区信息。它还可以交互式地创建、删除和修改磁盘分区。虽然它是磁盘分区的必备工具,但在使用 fdisk 修改包含关键数据的系统分区时要谨慎;不当的更改可能导致数据丢失。

总结

恭喜!在本实验中,你学习了如何:

  1. 使用 df 查看磁盘使用情况
  2. 使用 du 检查目录大小
  3. 创建、格式化、挂载和卸载虚拟磁盘
  4. 使用 fdisk 查看分区信息

这些技能构成了更高级 Linux 系统管理任务的基础。它们对于管理存储、排查磁盘空间问题以及维护 Linux 系统中的文件系统健康至关重要。

作为额外挑战,尝试编写一个 shell 脚本,找出家目录下最大的 10 个文件或目录,并以人类可读的格式显示它们的大小。这将结合你在本实验中学到的多个命令。

请记住,实践是掌握这些概念的关键。不要犹豫,在安全的环境中尝试这些命令,以加深你的理解。祝你在 Linux 系统管理的学习之旅中一切顺利!