简介
在本实验中,你将获得在 Red Hat Enterprise Linux (RHEL) 系统上管理 Linux 文件系统的实践经验。你将学习识别文件系统和块设备,使用 df 和 du 命令检查磁盘使用情况,并练习手动挂载和卸载文件系统。
此外,本实验还将指导你使用 locate 和 find 等命令高效地定位文件,使你能够根据名称、所有权、权限、大小、时间和文件类型等各种条件搜索文件。
识别文件系统和块设备
在这一步中,你将学习如何识别 Red Hat Enterprise Linux 系统上的文件系统和块设备。了解存储的组织方式是系统管理的基础。我们将探索各种命令来列出和检查块设备及其关联的文件系统。
首先,让我们了解一些核心概念:
- **块设备 (Block Device)**:块设备是一种提供对存储设备进行底层访问的文件。例如硬盘、固态硬盘 (SSD) 和 USB 驱动器。在 Linux 中,这些设备通常位于
/dev目录下。 - **分区 (Partition)**:分区是物理存储设备的逻辑划分。单个硬盘可以有多个分区,每个分区可以格式化为不同的文件系统或用于不同的目的。
- **文件系统 (File System)**:文件系统是操作系统用于控制数据存储和检索的方法及数据结构。它将数据组织成文件和目录。常见的 Linux 文件系统包括 XFS 和 ext4。
- **挂载点 (Mount Point)**:挂载点是文件系统层次结构中的一个空目录,文件系统通过在此处“挂载”来使其内容可被访问。
让我们首先使用 lsblk 命令列出系统上可用的块设备。该命令提供了所有块设备及其分区的树状概览。
lsblk
你应该会看到类似以下的输出。你的虚拟机可能会使用 vda 和 vdb 这样的名称,或者使用 nvme0n1 和 nvme1n1 这样的 NVMe 名称:
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:块设备(例如vda、vdb、nvme0n1或nvme1n1)或分区(例如vda1、vda2或nvme0n1p2)的名称。MAJ:MIN:主设备号和次设备号。RM:是否为可移动设备(1 表示可移动,0 表示不可移动)。SIZE:设备或分区的大小。RO:是否为只读(1 表示只读,0 表示可读写)。TYPE:设备类型(例如disk表示磁盘,part表示分区)。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 等配置文件中。
在进入下一步之前,将一份简短的报告保存到你的项目目录中,以便稍后回顾块设备和文件系统信息。
{
lsblk
echo
df -h
echo
lsblk -fp
} > ~/project/filesystem_overview.txt
你可以通过以下命令确认报告已创建:
cat ~/project/filesystem_overview.txt
使用 df 和 du 检查文件系统使用情况
在这一步中,你将深入了解如何使用 df 和 du 命令检查文件系统使用情况。虽然 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),你可以对 du 使用 -h 选项。
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(摘要)选项与 -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 虚拟机环境中可用的额外未挂载磁盘。根据虚拟机的不同,该磁盘可能被命名为 /dev/vdb、/dev/nvme1n1 或类似名称,因此我们将检测它,而不是硬编码设备名称。
首先,让我们识别根磁盘和你要格式化并挂载的额外磁盘。
ROOT_PARTITION=$(findmnt -n -o SOURCE /)
ROOT_DISK="/dev/$(lsblk -no PKNAME \"$ROOT_PARTITION\")"
DATA_DISK=$(lsblk -dnpo NAME,TYPE | awk '$2 == "disk" {print $1}' | grep -vx "$ROOT_DISK" | head -n 1)
echo "$DATA_DISK"
该命令应该会打印出额外磁盘的路径,例如 /dev/vdb 或 /dev/nvme1n1。
/dev/nvme1n1
在挂载文件系统之前,你需要一个挂载点,即一个空目录。通常的做法是使用 /mnt 进行临时挂载,或者在其中创建一个子目录。让我们在 ~/project 目录下创建一个名为 mydata 的新目录作为我们的挂载点。
mkdir ~/project/mydata
现在,我们需要使用文件系统格式化存储在 $DATA_DISK 中的额外磁盘。我们将使用 XFS 文件系统,这是 Red Hat Enterprise Linux 的默认文件系统。请谨慎使用此命令,因为它会擦除指定设备上的所有数据。
sudo mkfs.xfs "$DATA_DISK"
你将看到指示创建 XFS 文件系统的输出。输出中的设备名称将与你的虚拟机匹配:
meta-data=/dev/nvme1n1 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
现在 $DATA_DISK 已经有了 XFS 文件系统,你可以将其挂载到 ~/project/mydata 挂载点。mount 命令需要 sudo 权限。
sudo mount "$DATA_DISK" ~/project/mydata
要验证文件系统是否已成功挂载,请再次使用 df -h 命令。你应该会看到你检测到的磁盘列出,且挂载点为 /home/labex/project/mydata。
df -h
在输出中查找你检测到的磁盘:
Filesystem Size Used Avail Use% Mounted on
...
/dev/nvme1n1 40G 318M 40G 1% /home/labex/project/mydata
现在,你可以在 ~/project/mydata 中创建文件和目录,它们将存储在 $DATA_DISK 的磁盘上。让我们创建一个测试文件:
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
如果卸载命令失败并出现“目标忙 (target is busy)”错误,则意味着某些进程仍在访问该挂载点。如果你的当前工作目录位于挂载的文件系统中,通常会发生这种情况。要解决此问题,请将当前目录更改为挂载点之外的位置,例如你的主目录 (~)。
cd ~
然后,再次尝试卸载:
sudo umount ~/project/mydata
卸载后,通过再次检查 df -h 来验证你检测到的磁盘是否已不再挂载。
df -h
你应该不会再看到你检测到的磁盘挂载在 /home/labex/project/mydata 上。
Filesystem Size Used Avail Use% Mounted on
...
## 你的额外磁盘不应再列在这里。
至此,手动挂载和卸载文件系统的过程完成。
使用 locate 和 find 按名称定位文件
在这一步中,你将学习如何使用两个强大的命令定位系统上的文件:locate 和 find。这两个命令都可以帮助你搜索文件,但它们的运行方式不同,适用于不同的场景。
使用 locate 命令
locate 命令非常快,因为它搜索预先构建的文件名和路径数据库。然而,这意味着它可能找不到自上次数据库更新以来创建或删除的文件。数据库通常由 cron 作业每天更新,但你可以强制更新。
在此镜像中,locate 命令已经可用。在更新数据库之前,请确认该命令存在。
command -v locate
你应该会看到类似以下的输出:
/usr/bin/locate
安装后,你需要更新 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 选项限制结果数量。让我们查找前 5 个 "passwd" 的出现位置。
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 [路径] [表达式]。如果未指定路径,它将搜索当前目录。
让我们从根目录 (/) 开始搜索 sshd_config 文件。
find / -name sshd_config
你应该会看到配置文件的路径:
/etc/ssh/sshd_config
在搜索部分名称或使用通配符时,引用文件名模式非常重要,以防止 shell 过早地展开它。让我们查找 ~/project 目录中所有以 .txt 结尾的文件。
find ~/project -name '*.txt'
如果你在上一步中创建了 file1.txt、file2.txt 和 file3.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 命令非常通用,可以与其他条件结合使用,你将在接下来的步骤中探索这些内容。
在继续之前,保存关键的 locate 和 find 结果,以便稍后进行比较。
{
locate -n 5 passwd
echo "---"
find ~/project -name '*.txt'
} > ~/project/search-results.txt
你可以通过以下命令查看保存的结果:
cat ~/project/search-results.txt
按所有权、权限、大小和时间查找文件
在这一步中,你将学习如何使用强大的 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=r 或 004) 的文件。
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.txt 和 file2.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.txt 以及如果你最近创建了 test_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 ~/project -perm 644 > ~/project/find-perm-results.txt
find ~/project/test_data -size +5k > ~/project/find-size-results.txt
根据文件类型搜索文件
在最后一步中,你将学习如何使用 find 命令根据文件类型搜索文件。当你需要定位特定路径下的所有目录、常规文件、符号链接或设备文件时,这特别有用。
find 命令使用 -type 选项后跟一个字符来指定文件类型。以下是一些你可以搜索的常见文件类型:
f:常规文件d:目录l:符号链接 (symlink)b:块设备c:字符设备p:命名管道 (FIFO)s:套接字 (socket)
让我们首先搜索 ~/project 目录下的所有目录。
find ~/project -type d
你应该会看到类似以下的输出,列出所有目录和子目录:
/home/labex/project
/home/labex/project/test_data
接下来,让我们搜索 ~/project 目录下的所有常规文件。
find ~/project -type f
这将列出你之前创建的 file1.txt、file2.txt 和 file3.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
这将列出 vda、vda1、vda2 等块设备:
/dev/nvme0n1
/dev/nvme0n1p1
/dev/nvme0n1p2
/dev/nvme0n1p3
/dev/nvme1n1
你可以将 -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...
在完成实验之前,保存符号链接搜索结果。
find ~/project -type l > ~/project/find-type-results.txt
至此,关于访问 Linux 文件系统和定位文件的实验结束。你已经学习了如何识别设备、检查磁盘使用情况、手动挂载和卸载文件系统,以及如何使用各种条件使用 locate 和 find。
总结
在本实验中,我们获得了在 Red Hat Enterprise Linux 系统上管理 Linux 文件系统的实践经验。我们首先学习了使用 lsblk 等命令识别文件系统和块设备,理解了块设备、分区、文件系统和挂载点等核心概念。随后,我们探索了如何使用 df 和 du 检查文件系统使用情况,区分了它们在报告磁盘空间方面的功能。本实验还涵盖了手动挂载和卸载文件系统的基本技能,演示了如何使文件系统内容可访问,然后将其分离。
此外,我们深入研究了如何使用各种条件高效地定位文件。我们学习了如何使用 locate 和 find 按名称查找文件,理解了每种工具的区别和适用场景。本实验进一步教授了如何根据所有权、权限、大小和时间属性搜索文件,为系统管理和故障排除提供了强大的工具。最后,我们练习了根据特定文件类型搜索文件,完成了对文件系统管理和文件定位技术的全面概述。



