在 Red Hat Enterprise Linux 中访问文件系统

红帽企业 LinuxBeginner
立即练习

介绍

在这个实验中,你将获得在 Red Hat Enterprise Linux (RHEL) 系统上管理 Linux 文件系统的实践经验。你将学习识别文件系统和块设备,使用 dfdu 命令检查磁盘使用情况,并练习手动挂载和卸载文件系统。

此外,这个实验将指导你使用 locatefind 等命令高效地定位文件,使你能够根据各种条件(例如名称、所有者、权限、大小、时间以及文件类型)搜索文件。

识别文件系统和块设备

在这一步中,你将学习如何在 Red Hat Enterprise Linux 系统上识别文件系统和块设备。理解存储的组织方式是系统管理的基础。我们将探索各种命令来列出和检查块设备及其相关的文件系统。

首先,让我们了解一些核心概念:

  • 块设备(Block Device):块设备是一个文件,它提供对存储设备的低级访问。例如硬盘、固态硬盘(SSD)和 USB 驱动器。在 Linux 中,这些通常位于 /dev 目录中。
  • 分区(Partition):分区是物理存储设备的逻辑划分。单个硬盘可以有多个分区,每个分区都使用不同的文件系统格式化或用于不同的目的。
  • 文件系统(File System):文件系统是操作系统用来控制数据存储和检索的方法和数据结构。它将数据组织成文件和目录。常见的 Linux 文件系统包括 XFS 和 ext4。
  • 挂载点(Mount Point):挂载点是文件系统层次结构中的一个空目录,文件系统附加或“挂载”到该目录,以使其内容可访问。

让我们首先使用 lsblk 命令列出系统上可用的块设备。此命令提供所有块设备及其分区的树状视图。

lsblk

你应该看到类似这样的输出,显示像 vdavdb 等设备,它们代表你的容器环境中的虚拟磁盘设备:

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda    253:0    0   40G  0 disk
├─vda1 253:1    0    1M  0 part
├─vda2 253:2    0  100M  0 part /boot/efi
└─vda3 253:3    0 39.9G  0 part /
vdb    253:16   0   40G  0 disk

在输出中:

  • NAME:块设备的名称(例如,vdavdb)或分区的名称(例如,vda1vda2)。
  • MAJ:MIN:主设备号和次设备号。
  • RM:可移动设备(如果是可移动设备则为 1,否则为 0)。
  • SIZE:设备或分区的大小。
  • RO:只读(如果是只读则为 1,否则为 0)。
  • TYPE:设备的类型(例如,diskpart 代表分区)。
  • MOUNTPOINTS:设备或分区当前挂载的位置。

接下来,让我们使用 df 命令检查文件系统及其使用情况。df 命令报告文件系统磁盘空间使用情况。

df

输出将显示各种文件系统、它们的总大小、已用空间、可用空间和挂载点:

Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs            4096       0      4096   0% /dev
tmpfs            1822216       0   1822216   0% /dev/shm
tmpfs             728888     616    728272   1% /run
efivarfs             256       9       243   4% /sys/firmware/efi/efivars
/dev/vda3       41773036 3628732  38144304   9% /
/dev/vda2         102156    7198     94958   8% /boot/efi
tmpfs             364440       0    364440   0% /run/user/1000

为了使输出更具可读性,尤其是在显示大小时,你可以使用 -h 选项以人类可读的格式显示(例如,M 代表 MiB,G 代表 GiB)。

df -h

你将看到更易于理解的格式的大小:

Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           1.8G     0  1.8G   0% /dev/shm
tmpfs           712M  616K  712M   1% /run
efivarfs        256K  8.5K  243K   4% /sys/firmware/efi/efivars
/dev/vda3        40G  3.5G   37G   9% /
/dev/vda2       100M  7.1M   93M   8% /boot/efi
tmpfs           356M     0  356M   0% /run/user/1000

最后,让我们使用 lsblk -fp 命令列出设备的全路径、它们的 UUID(通用唯一标识符)和文件系统类型。即使设备名称发生更改,UUID 也是保持不变的稳定标识符,这使得它们对于一致的挂载非常有用。

lsblk -fp

输出将包括 UUID 和文件系统类型:

NAME        FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
/dev/vda
├─/dev/vda1
├─/dev/vda2 vfat   FAT16       E52E-0564                              92.7M     7% /boot/efi
└─/dev/vda3 xfs          root  4c234c8b-4f67-4d65-abb5-06753b1ec236   36.4G     9% /
/dev/vdb

注意 UUID 列,它为每个文件系统提供一个唯一的标识符。这对于可靠地挂载文件系统至关重要,尤其是在 /etc/fstab 等配置文件中。

使用 df 和 du 命令检查文件系统使用情况

在这一步中,你将深入研究使用 dfdu 命令检查文件系统使用情况。虽然 df 提供了已挂载文件系统的磁盘空间使用情况的概览,但 du(磁盘使用情况)用于估算特定文件或目录的文件空间使用情况。了解两者之间的区别以及何时使用每个命令对于有效的磁盘空间管理至关重要。

让我们从重新审视带有其人类可读选项的 df 命令开始。此命令非常适合快速总结所有已挂载文件系统上已使用和可用的空间量。

df -h

输出将以易于阅读的格式显示磁盘使用情况(例如,G 代表千兆字节,M 代表兆字节):

Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        892M     0  892M   0% /dev
tmpfs           915M     0  915M   0% /dev/shm
tmpfs           915M   17M  899M   2% /run
tmpfs           915M     0  915M   0% /sys/fs/cgroup
/dev/vda4       8.0G  1.4G  6.7G  17% /
/dev/vda3      1014M  166M  849M  17% /boot
tmpfs           183M     0  183M   0% /run/user/1000

现在,让我们探索 du 命令。与 df 不同,du 计算指定路径内文件和目录使用的磁盘空间。当你想要找出哪些目录或文件占用了最多的空间时,这特别有用。

要查看当前目录 (~/project) 的磁盘使用情况,请使用不带任何参数的 du。这将列出 ~/project 内每个文件和子目录的大小。

du

输出可能很长,默认情况下以千字节为单位显示大小:

4       ./.config/xfce4/xfconf/xfce-perchannel-xml
8       ./.config/xfce4/xfconf
12      ./.config/xfce4
16      ./.config
4       ./.local/share/nano
8       ./.local/share
12      ./.local
28      .

为了使输出更具可读性,类似于 df -h,你可以将 -h 选项与 du 一起使用。

du -h

这将以人类可读的单位显示大小:

4.0K    ./.config/xfce4/xfconf/xfce-perchannel-xml
8.0K    ./.config/xfce4/xfconf
12K     ./.config/xfce4
16K     ./.config
4.0K    ./.local/share/nano
8.0K    ./.local/share
12K     ./.local
28K     .

通常,你对目录的总大小感兴趣,而不是每个单独文件和子目录的大小。为此,你可以将 -s(summary,摘要)选项与 -h 一起使用。让我们检查你的主目录 (~) 的总大小。

du -sh ~

此命令将输出你的主目录的总大小:

48K     /home/labex

让我们创建一些文件来查看 du 如何报告它们的大小。我们将创建一个名为 test_data 的目录,然后在其中创建几个文件。

首先,创建目录:

mkdir ~/project/test_data

现在,进入 test_data 目录:

cd ~/project/test_data

接下来,创建一些包含内容的文件。我们将使用 head 命令生成特定大小的文件。

head -c 1K < /dev/urandom > file1.txt
head -c 5K < /dev/urandom > file2.txt
head -c 10K < /dev/urandom > file3.txt

现在,使用 du -h 查看这些新文件和 test_data 目录的大小。

du -h

你应该看到类似这样的输出:

1.0K    ./file1.txt
5.0K    ./file2.txt
10K     ./file3.txt
24K     .

最后一行 (24K .) 显示当前目录 (.,即 ~/project/test_data) 的总大小。

最后,让我们回到你的 ~/project 目录,并使用 du -sh 检查 test_data 的总大小。

cd ~/project
du -sh test_data

这将显示 test_data 目录的摘要大小:

24K     test_data

这演示了如何使用 du 来查明特定目录内的磁盘空间消耗,从而帮助你有效地管理存储。

手动挂载和卸载文件系统

在这一步中,你将学习如何手动挂载和卸载文件系统。挂载文件系统使其内容可以通过文件系统层次结构中的特定目录(挂载点)访问。卸载将文件系统与其挂载点分离,使其内容无法访问,直到再次挂载。这是管理可移动介质、临时存储或新磁盘分区的关键技能。

对于此练习,我们将使用实验环境(LabEx VM)中可用的一个未挂载的块设备。从上一步中,你应该已经看到了当前未挂载的 /dev/vdb 设备。我们将在此步骤中使用 /dev/vdb

首先,让我们使用 lsblk 确认可用的未挂载块设备。

lsblk

你应该看到 /dev/vdb 被列出,没有任何挂载点。

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda    253:0    0   40G  0 disk
├─vda1 253:1    0    1M  0 part
├─vda2 253:2    0  100M  0 part /boot/efi
└─vda3 253:3    0 39.9G  0 part /
vdb    253:16   0   40G  0 disk

在挂载文件系统之前,你需要一个挂载点,它是一个空目录。通常的做法是使用 /mnt 进行临时挂载,或在其中创建一个子目录。让我们在你的 ~/project 目录中创建一个名为 mydata 的新目录,作为我们的挂载点。

mkdir ~/project/mydata

现在,我们需要使用文件系统格式化 /dev/vdb 设备。我们将使用 XFS 文件系统,这是 Red Hat Enterprise Linux 的默认设置。请小心使用此命令,因为它将擦除指定设备上的所有数据。

sudo mkfs.xfs /dev/vdb

你将看到输出,指示 XFS 文件系统的创建:

meta-data=/dev/vdb               isize=512    agcount=4, agsize=2621440 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1 nrext64=0
data     =                       bsize=4096   blocks=10485760, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=16384, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

现在 /dev/vdb 具有 XFS 文件系统,你可以将其挂载到你的 ~/project/mydata 挂载点。mount 命令需要 sudo 权限。

sudo mount /dev/vdb ~/project/mydata

要验证文件系统是否已成功挂载,请再次使用 df -h 命令。你应该看到 /dev/vdb 被列出,并以 /home/labex/project/mydata 作为其挂载点。

df -h

在输出中查找 /dev/vdb

Filesystem      Size  Used Avail Use% Mounted on
...
/dev/vdb         40G  318M   40G   1% /home/labex/project/mydata

现在,你可以在 ~/project/mydata 中创建文件和目录,它们将存储在 /dev/vdb 设备上。让我们创建一个测试文件:

sudo touch ~/project/mydata/testfile.txt

你可以列出 ~/project/mydata 的内容以确认文件的创建:

ls -l ~/project/mydata

你应该看到 testfile.txt 被列出:

total 0
-rw-r--r--. 1 root root 0 Jun 16 11:09 testfile.txt

当你完成使用已挂载的文件系统时,卸载它很重要,以防止数据损坏,尤其是在移除物理设备之前。使用 umount 命令卸载文件系统。

sudo umount ~/project/mydata

如果卸载命令失败并出现“目标正忙”错误,则表示某些进程仍在访问挂载点。如果你的当前工作目录位于已挂载的文件系统内,则通常会发生这种情况。要解决此问题,请将你的当前目录更改到挂载点之外的位置,例如你的主目录 (~)。

cd ~

然后,再次尝试卸载:

sudo umount ~/project/mydata

卸载后,再次检查 df -h,验证 /dev/vdb 是否不再挂载。

df -h

你应该不再看到 /dev/vdb 挂载在 /home/labex/project/mydata 上。

Filesystem      Size  Used Avail Use% Mounted on
...
## /dev/vdb should not be listed here anymore

这完成了手动挂载和卸载文件系统的过程。

使用 locate 和 find 命令按文件名查找文件

在这一步中,你将学习如何使用两个强大的命令在你的系统上定位文件:locatefind。这两个命令都可以帮助你搜索文件,但它们的操作方式不同,并且适用于不同的场景。

使用 locate 命令

locate 命令非常快,因为它搜索预先构建的文件名和路径数据库。但是,这意味着它可能找不到自上次数据库更新以来创建或删除的文件。数据库通常由 cron 作业每天更新,但你可以强制更新。

首先,让我们确保安装了提供 locate 命令的 mlocate 包。

sudo dnf install -y mlocate

在安装过程中,你将看到类似这样的输出:

Last metadata expiration check: 0:00:01 ago on Mon 15 May 2023 08:00:00 AM UTC.
Dependencies resolved.
================================================================================
 Package        Architecture  Version             Repository               Size
================================================================================
Installing:
 mlocate        x86_64        0.26-28.el9         rhel-9-for-x86_64-appstream-rpms 100 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 100 k
Installed size: 230 k
Downloading Packages:
mlocate-0.26-28.el9.x86_64.rpm     100 kB/s | 100 kB     00:01
--------------------------------------------------------------------------------
Total                                            100 kB/s | 100 kB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : mlocate-0.26-28.el9.x86_64                             1/1
  Running scriptlet: mlocate-0.26-28.el9.x86_64                             1/1
  Verifying        : mlocate-0.26-28.el9.x86_64                             1/1
Installed:
  mlocate-0.26-28.el9.x86_64

Complete!

安装后,你需要更新 locate 数据库。此命令需要 sudo 权限。

sudo updatedb

此命令将静默运行,并且可能需要几分钟,具体取决于你的文件系统的大小。

现在,让我们搜索一个常见的系统文件,例如 passwd

locate passwd

你将看到一个包含 "passwd" 的路径列表:

/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/usr/share/man/man1/passwd.1.gz
/usr/share/man/man5/passwd.5.gz
...output omitted...

要执行不区分大小写的搜索,请使用 -i 选项。让我们搜索包含 "messages" 的文件,而不必担心大小写。

locate -i messages

你将看到类似这样的结果:

/usr/share/locale/zza/LC_MESSAGES
/usr/share/makedumpfile/eppic_scripts/ap_messages_3_10_to_4_8.c
/usr/share/vim/vim82/ftplugin/msmessages.vim
...output omitted...

你还可以使用 -n 选项限制结果的数量。让我们找到 "passwd" 的前 5 个匹配项。

locate -n 5 passwd

这将仅显示前 5 个匹配项:

/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/usr/share/man/man1/passwd.1.gz
/usr/share/man/man5/passwd.5.gz

使用 find 命令

find 命令实时搜索文件系统,这使得它比 locate 慢,但确保它找到所有符合你条件的文件,包括最近创建的文件。它还提供了更强大的搜索选项。

find 的基本语法是 find [path] [expression]。如果未指定路径,它将搜索当前目录。

让我们从根目录 (/) 开始搜索 sshd_config 文件。

find / -name sshd_config

你应该看到配置文件的路径:

/etc/ssh/sshd_config

当搜索部分名称或使用通配符时,用引号引起来文件名模式很重要,以防止 shell 提前扩展它。让我们在你的 ~/project 目录中查找所有以 .txt 结尾的文件。

find ~/project -name '*.txt'

如果你在上一步中创建了 file1.txtfile2.txtfile3.txt,你应该看到它们被列出:

/home/labex/project/test_data/file1.txt
/home/labex/project/test_data/file2.txt
/home/labex/project/test_data/file3.txt

要使用 find 执行不区分大小写的搜索,请使用 -iname 选项。让我们在 /usr/share/doc 目录中搜索包含 "README"(不区分大小写)的文件。

find /usr/share/doc -iname '*readme*'

你将看到很多结果,例如:

/usr/share/doc/libselinux/README
/usr/share/doc/libsepol/README
/usr/share/doc/libsemanage/README
...output omitted...

find 命令非常通用,可以与其他条件结合使用,你将在后续步骤中探索。

按所有者、权限、大小和时间查找文件

在这一步中,你将学习如何使用强大的 find 命令,根据各种条件(不仅仅是文件名)来定位文件。这包括按所有者、权限、大小和修改时间进行搜索。这些高级搜索功能对于系统管理任务(如审计、清理和故障排除)至关重要。

按所有者查找文件

你可以分别使用 -user-group 选项搜索由特定用户或组拥有的文件。你可以指定用户名/组名或其数字 ID。

让我们在你的主目录 (~) 中查找所有由 labex 用户拥有的文件。

find ~ -user labex

这将列出许多文件,包括你的配置文件:

/home/labex
/home/labex/.bash_logout
/home/labex/.bash_profile
/home/labex/.bashrc
/home/labex/.config
/home/labex/.config/xfce4
/home/labex/.config/xfce4/xfconf
/home/labex/.config/xfce4/xfconf/xfce-perchannel-xml
/home/labex/.local
/home/labex/.local/share
/home/labex/.local/share/nano
/home/labex/project
/home/labex/project/test_data
/home/labex/project/test_data/file1.txt
/home/labex/project/test_data/file2.txt
/home/labex/project/test_data/file3.txt
...output omitted...

类似地,要查找由 labex 组拥有的文件:

find ~ -group labex

输出将类似,因为 labex 通常是 labex 用户的主要组。

你还可以按用户 ID (UID) 或组 ID (GID) 搜索。labex 用户通常具有 UID 和 GID 1000

find ~ -uid 1000
find ~ -gid 1000

按权限查找文件

find 命令的 -perm 选项允许你搜索具有特定权限的文件。权限可以用八进制(例如,755)或符号(例如,u=rwx,g=rx,o=rx)模式指定。

让我们在你的 ~/project 目录中创建一个具有特定权限的测试文件。

touch ~/project/permission_test.txt
chmod 644 ~/project/permission_test.txt

现在,让我们在 ~/project 中查找具有完全 644 权限的文件。

find ~/project -perm 644

你应该看到 permission_test.txt 被列出:

/home/labex/project/permission_test.txt

你也可以使用前导 /- 与八进制权限:

  • /: 如果设置了任何指定的权限位,则匹配。
  • -: 如果设置了所有指定的权限位,则匹配。

让我们在 ~/project 中查找其他人至少具有读取权限 (o=r004) 的文件。

find ~/project -perm -004

这将列出 permission_test.txt 和其他向其他人授予读取访问权限的文件。

/home/labex/project/permission_test.txt
...output omitted...

按大小查找文件

-size 选项允许你根据文件大小搜索文件。你可以使用单位指定大小(例如,k 表示千字节,M 表示兆字节,G 表示千兆字节)。你还可以使用 + 表示“大于”,- 表示“小于”。

让我们在你的 ~/project/test_data 目录中查找大小正好为 1 千字节的文件。

find ~/project/test_data -size 1k

你应该看到 file1.txt

/home/labex/project/test_data/file1.txt

现在,查找大于 5 千字节的文件。

find ~/project/test_data -size +5k

这应该列出 file3.txt

/home/labex/project/test_data/file3.txt

以及小于 10 千字节的文件。

find ~/project/test_data -size -10k

这应该列出 file1.txtfile2.txt

/home/labex/project/test_data/file1.txt
/home/labex/project/test_data/file2.txt

按修改时间查找文件

你可以使用 -mmin(修改了多少分钟前)或 -mtime(修改了多少天前)等选项,根据文件的修改时间进行搜索。

让我们在你的 ~/project 目录中查找在过去 60 分钟内修改的文件。

find ~/project -mmin -60

这很可能包括 permission_test.txttest_data 中的文件(如果你最近创建了它们):

/home/labex/project
/home/labex/project/permission_test.txt
/home/labex/project/test_data
/home/labex/project/test_data/file1.txt
/home/labex/project/test_data/file2.txt
/home/labex/project/test_data/file3.txt

要查找 1 天前(24 小时)以上修改的文件,你可以将 +1-mtime 一起使用。

find ~/project -mtime +1

如果你的所有 ~/project 文件都是最近创建或修改的,则此命令可能不会返回任何文件。

这些选项可以组合起来创建非常具体的搜索查询,从而让你有效地管理系统上的文件。

根据文件类型搜索文件

在最后一步中,你将学习如何使用 find 命令根据文件类型搜索文件。当你需要在特定路径中定位所有目录、常规文件、符号链接或设备文件时,这特别有用。

find 命令使用 -type 选项,后跟一个字符来指定文件类型。以下是一些你可以搜索的常见文件类型:

  • f: 常规文件
  • d: 目录
  • l: 符号链接 (symlink)
  • b: 块设备
  • c: 字符设备
  • p: 命名管道 (FIFO)
  • s: 套接字

让我们从搜索你的 ~/project 目录中的所有目录开始。

find ~/project -type d

你应该看到类似这样的输出,列出所有目录和子目录:

/home/labex/project
/home/labex/project/test_data

接下来,让我们搜索你的 ~/project 目录中的所有常规文件。

find ~/project -type f

这将列出你之前创建的文件,如 file1.txtfile2.txtfile3.txt

/home/labex/project/test_data/file1.txt
/home/labex/project/test_data/file2.txt
/home/labex/project/test_data/file3.txt

现在,让我们创建一个符号链接来演示搜索符号链接。我们将在你的 ~/project 目录中创建一个指向 file1.txt 的符号链接。

ln -s ~/project/test_data/file1.txt ~/project/link_to_file1.txt

使用 ls -l 验证符号链接是否已创建:

ls -l ~/project/link_to_file1.txt

你应该看到输出表明它是一个符号链接:

lrwxrwxrwx. 1 labex labex 32 May 15 08:00 /home/labex/project/link_to_file1.txt -> /home/labex/project/test_data/file1.txt

现在,搜索你的 ~/project 目录中的所有符号链接。

find ~/project -type l

你应该看到你新创建的符号链接:

/home/labex/project/link_to_file1.txt

最后,让我们搜索块设备。块设备通常位于 /dev 目录中。

find /dev -type b

这将列出块设备,如 vdavda1vda2 等:

/dev/vda1
/dev/vda2
/dev/vda3
/dev/vda
/dev/vdb

你可以将 -type 选项与你在前面步骤中学习的其他 find 选项结合使用。例如,要查找 /etc 中由 root 用户拥有的所有目录:

find /etc -type d -user root

这将产生一个很长的目录列表:

/etc
/etc/selinux
/etc/selinux/targeted
/etc/selinux/targeted/active
/etc/selinux/targeted/active/modules
...output omitted...

这结束了关于访问 Linux 文件系统和定位文件的实验。你已经学习了如何识别设备、检查磁盘使用情况、手动挂载和卸载文件系统,以及使用 locatefind 以及各种条件。

总结

在这个实验中,我们获得了在 Red Hat Enterprise Linux 系统上管理 Linux 文件系统的实践经验。我们首先学习了使用 lsblk 等命令来识别文件系统和块设备,了解了块设备、分区、文件系统和挂载点等核心概念。随后,我们探讨了如何使用 dfdu 检查文件系统使用情况,区分了它们报告磁盘空间的功用。该实验还涵盖了手动挂载和卸载文件系统的基本技能,演示了如何使文件系统内容可访问,然后将其分离。

此外,我们深入研究了如何使用各种标准有效地定位文件。我们学习了如何使用 locatefind 按名称查找文件,了解了它们之间的区别以及每个命令的适当用例。该实验通过教授如何根据所有者、权限、大小和时间属性搜索文件来扩展此内容,为系统管理和故障排除提供了强大的工具。最后,我们练习了根据其特定文件类型搜索文件,完成了对文件系统管理和文件定位技术的全面概述。