文件系统与磁盘管理

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/vdb       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/vdb        100G   56G   45G  56% /etc/hosts
    

    好多了,对吧?现在大小以 GB 和 MB 显示,更容易理解。

  4. 如果你想检查特定文件系统的空间,可以指定它:

    df -h /dev/vdb
    

    这将仅显示 /dev/vdb 文件系统的信息。

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. 文件系统:可以将文件系统想象成文件和文件夹在磁盘上的组织方式。它就像办公室里的文件归档系统——决定了数据如何存储和检索。常见的 Linux 文件系统包括 ext4(我们将使用的)、XFS 和 btrfs。

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

    • 插入一个 U 盘(物理连接)。
    • 然后告诉电脑在哪里显示它的内容(挂载点)。
  3. 分区:分区(Partition)是磁盘中被视为独立单元的一个部分。可以把它想象成将一个大硬盘分割成较小的、独立的部分。分区的原因包括:

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

让我们来创建并操作一个虚拟磁盘:

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

    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 个块(从而产生一个 256MB 的文件)。

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

  2. 验证文件大小:

    ls -lh virtual.img
    

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

  3. 现在,让我们用 ext4 文件系统格式化这个虚拟磁盘:

    sudo mkfs.ext4 virtual.img
    

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

    • 在我们的虚拟磁盘文件内部创建了一个新的 ext4 文件系统。
    • 建立了存储文件和目录所需的基础结构。
    • 类似于在第一次使用前格式化一个新的 U 盘。

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

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

    sudo mkdir /mnt/virtualdisk
    

    把挂载点想象成进入虚拟磁盘的「窗口」。挂载后,当你查看这个目录时,你实际上看到的是虚拟磁盘的内容。

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

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

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

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

    这与你插入 U 盘时自动发生的情况类似,只不过我们是在对虚拟磁盘文件进行手动操作。

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

    mount | grep virtualdisk
    

    你应该看到一行信息,表明 virtual.img 已挂载到 /mnt/virtualdisk

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

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

    你应该能看到列出的 testfile

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

    sudo umount /mnt/virtualdisk
    

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

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

挂载文件系统意味着将其附加到指定的目录,以便操作系统可以访问文件系统内部的数据。在本实验中,虚拟磁盘镜像文件被视为物理磁盘,挂载使其内容在特定目录(例如 /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 系统管理的学习旅程中取得更大进步!