识别文件系统和设备
目标
完成本节后,您能够识别文件系统层次结构中的目录以及将其存储在哪个设备上。
储存管理概念
Linux服务器上的文件通过文件系统层次结构(目录的单个倒置树)进行访问。 该文件系统层次结构是由系统可用存储设备提供的文件系统组装而成的。 每个文件系统都是一个已格式化以存储文件的存储设备。
从某种意义上说,Linux的文件系统层次结构展示了一个独立的存储设备上的文件系统集合,就好像是一个巨大的存储设备上的一组文件,你可以在一个巨大的存储设备上浏览。很多时候,你不需要知道特定的文件在哪个存储设备上,你只需要知道该文件所在的目录。
但是,有时它可能很重要。 您可能需要确定存储设备的容量以及文件系统层次结构中的哪些目录受到影响。 存储设备的日志中可能存在错误,并且您需要知道哪些文件系统受到威胁。 您可能只想在两个文件之间创建硬链接,并且需要知道它们是否在同一文件系统上,以确定是否可能。
但是,有时候,这可能是很重要的。你可能需要确定一个存储设备有多满,以及文件系统层次结构中的哪些目录受到影响。存储设备的日志中可能会有错误,你需要知道哪些文件系统有风险。你可能只是想在两个文件之间建立一个硬连接,你需要知道它们是否在同一个文件系统中,以确定是否有可能。
文件系统和挂载点
要使文件系统的内容在文件系统层次结构中可用,必须将其挂载在一个空目录上。这个目录被称为挂载点。挂载后,如果使用ls来列出该目录,就会看到挂载的文件系统的内容,可以正常访问和使用这些文件。许多文件系统是在启动过程中自动挂载的。
如果你只使用过Microsoft Windows的驱动器字母,这是个本质上不同的概念。它有点类似于NTFS挂载文件夹的功能。
文件系统、存储和块设备
在Linux中,对存储设备的低级访问是由一种称为块设备的特殊类型的文件提供的。这些块设备必须用文件系统格式化,然后才能挂载。
块设备文件和其他设备文件一起存储在/dev目录下。设备文件是由操作系统自动创建的。在Red Hat Enterprise Linux中,检测到的第一个SATA/PATA、SAS、SAS、SCSI或USB硬盘驱动器被称为/dev/sda,第二个是/dev/sdb,以此类推。这些名称代表了整个硬盘驱动器。
其他类型的存储会有其他形式的命名。
块设备命名
TYPE OF DEVICE | DEVICE NAMING PATTERN |
---|---|
SATA/SAS/USB-attached storage | /dev/sda, /dev/sdb ... |
virtio-blk paravirtualized storage (some virtual machines) | /dev/vda, /dev/vdb ... |
NVMe-attached storage (many SSDs) | /dev/nvme0, /dev/nvme1 ... |
SD/MMC/eMMC storage (SD cards) | /dev/mmcblk0, /dev/mmcblk1 ... |
磁盘分区
通常情况下,你不会把整个存储设备做成一个文件系统,将存储设备分为称为分区的较小块。
分区允许您对磁盘进行分区:不同的分区可以被格式化为不同的文件系统或用于不同的目的。例如,一个分区可以包含用户主目录,而另一个分区可以包含系统数据和日志。如果用户用数据填满了主目录分区,系统分区可能仍有可用空间。
分区本身就是块设备。在SATA连接的存储上,第一个磁盘上的第一个分区是/dev/sda1。第二个磁盘上的第三个分区是/dev/sdb3,依此类推。半虚拟化存储设备具有类似的命名系统。
连接NVMe的SSD设备以不同的方式命名其分区。在这种情况下,第一个磁盘上的第一个分区是/dev/nvme0p1。第二个磁盘上的第三个分区是/dev/nvme1p3,依此类推。SD卡或MMC卡有类似的命名系统。
主机上的/ dev / sda1设备文件的一长串列出了其特殊的文件类型b,表示块设备:
[user@host ~]$ ls -l /dev/sda1
brw-rw----. 1 root disk 8, 1 Feb 22 08:00 /dev/sda1
逻辑卷
另一种组织磁盘和分区的方法是使用逻辑卷管理(LVM)。使用LVM,一个或多个块设备可以聚合到称为卷组的存储池中。然后,卷组中的磁盘空间被分配到一个或多个逻辑卷,这些逻辑卷的功能相当于物理磁盘上的一个分区。
LVM系统在创建时为卷组和逻辑卷分配名称。LVM会在/dev中创建一个与组名相匹配的目录,然后在这个新目录中创建一个与逻辑卷同名的符号链接。然后这个逻辑卷文件就可以被挂载。例如,如果一个卷组被称为myvg,而其中的逻辑卷被称为mylv,那么逻辑卷设备文件的完整路径名就是/dev/myvg/mylv。
检查文件系统
要了解本地和远程文件系统设备的概况以及可用空间的数量,请运行 df 命令。当运行 df 命令没有参数时,它会报告总的磁盘空间、已使用的磁盘空间、可用的磁盘空间,以及所有挂载的常规文件系统上使用的总磁盘空间的百分比。它可以报告本地和远程文件系统。下面的例子显示了主机上的文件系统和挂载点。
[user@host ~]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 912584 0 912584 0% /dev
tmpfs 936516 0 936516 0% /dev/shm
tmpfs 936516 16812 919704 2% /run
tmpfs 936516 0 936516 0% /sys/fs/cgroup
/dev/vda3 8377344 1411332 6966012 17% /
/dev/vda1 1038336 169896 868440 17% /boot
tmpfs 187300 0 187300 0% /run/user/1000
主机系统上的分区显示两个物理文件系统,分别挂载在/和/boot上。这在虚拟机中很常见。tmpfs和devtmpfs设备是系统内存中的文件系统。所有写入tmpfs或devtmpfs的文件都会在系统重启后消失。
为了提高输出尺寸的可读性,有两个不同的可读选项。-h 或 -H。这两个选项之间的区别在于 -h 以 KiB、MiB 或 GiB为单位,而 -H 选项则以SI单位报告:KB、MB 或 GB。硬盘制造商在宣传其产品时通常使用SI单位。
显示主机系统上的文件系统报告,并将所有单位转换为人类可读格式:
[user@host ~]$ df -h
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/vda3 8.0G 1.4G 6.7G 17% /
/dev/vda1 1014M 166M 849M 17% /boot
tmpfs 183M 0 183M 0% /run/user/1000
要了解某个目录树所使用的空间的更多详细信息,请使用du命令。du命令有-h和-H选项,可以将输出转换为人类可读的格式。du命令可以递归显示当前目录树中所有文件的大小。
显示主机上的/usr/share目录的磁盘使用情况报告:
[root@host ~]# du /usr/share
...output omitted...
176 /usr/share/smartmontools
184 /usr/share/nano
8 /usr/share/cmake/bash-completion
8 /usr/share/cmake
356676 /usr/share
以人类可读格式显示主机上的/usr/share目录的磁盘使用情况报告:
[root@host ~]# du -h /var/log
...output omitted...
176K /usr/share/smartmontools
184K /usr/share/nano
8.0K /usr/share/cmake/bash-completion
8.0K /usr/share/cmake
369M /usr/share
挂载和卸载文件系统
目标
完成此部分后,您能够通过在文件系统层次结构中添加和删除文件系统来访问文件系统的内容。
手动挂载文件系统
要访问可移动存储设备上的文件系统,需要安装该文件系统。mount命令允许根用户手动挂载文件系统。mount命令的第一个参数指定要装入的文件系统。第二个参数指定了要在文件系统层次结构中使用的目录作为挂载点。
有两种常用方法可以将磁盘分区上的文件系统指定给mount命令:
- 在/ dev中包含文件系统的设备文件名。
- 将UUID写入文件系统,是一个通用的唯一标识符。
挂载设备相对简单。您需要确定您要安装的设备,确保安装点的存在,并将设备安装到安装点上。
识别块设备
热插拔式存储设备,无论是硬盘驱动器(HDD)还是服务器盒中的固态设备(SSD),或者是USB存储设备,每次连接到系统时,都可能会被插入不同的端口。
使用 lsblk 命令可以列出指定块设备或所有可用设备的详细信息。
[root@host ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 12G 0 disk ├─vda1 253:1 0 1G 0 part /boot
├─vda2 253:2 0 1G 0 part [SWAP]
└─vda3 253:3 0 11G 0 part /
vdb 253:16 0 64G 0 disk
└─vdb1 253:17 0 64G 0 part
如果你知道你刚刚添加了一个64GB的存储设备和一个分区,那么你可以从前面的输出中猜到/dev/vdb1就是你要挂载的分区。
通过块设备名称挂载
下面的示例将文件系统/dev/vdb1分区挂载在目录/mnt/ data上。
[root@host ~]# mount /dev/vdb1 /mnt/data
要挂载一个文件系统,目标目录必须已经存在。默认情况下,/mnt目录已经存在,是作为临时挂载点使用的。
你可以使用 /mnt 目录,或者最好是创建一个 /mnt 的子目录作为临时挂载点,除非你有很好的理由将其挂载在文件系统层次结构中的特定位置。
这种方法在短期内效果不错。但是,如果设备被添加到系统中或从系统中删除,操作系统检测磁盘的顺序就会改变。这将改变与该存储设备相关的设备名称。更好的方法是通过文件系统中的一些特性来加载。
按文件系统UUID挂载
与文件系统相关联的一个稳定的标识符是其UUID,这是一个非常长的十六进制数字,作为一个通用的唯一标识符。这个UUID是文件系统的一部分,只要文件系统没有被重新创建,这个UUID就会保持不变。
lsblk -fp 命令列出了设备的完整路径、UUUID 和挂载点,以及分区中的文件系统类型。如果文件系统没有挂载,挂载点将是空白。
[root@host ~]# lsblk -fp
NAME FSTYPE LABEL UUID MOUNTPOINT
/dev/vda
├─/dev/vda1 xfs 23ea8803-a396-494a-8e95-1538a53b821c /boot
├─/dev/vda2 swap cdf61ded-534c-4bd6-b458-cab18b1a72ea [SWAP]
└─/dev/vda3 xfs 44330f15-2f9d-4745-ae2e-20844f22762d /
/dev/vdb
└─/dev/vdb1 xfs 46f543fd-78c9-4526-a857-244811be2d88
通过文件系统的UUID挂载文件系统:
[root@host ~]# mount UUID="46f543fd-78c9-4526-a857-244811be2d88" /mnt/data
可移动存储设备的自动挂载
如果你登录并使用图形化桌面环境,当插入任何可移动存储介质时,它将自动挂载任何可移动存储介质。
可移动存储设备被挂载在/run/media/USERNAME/LABEL,其中USERNAME是登录到图形环境的用户名称,LABEL是一个标识符,通常是创建文件系统时给文件系统的名称,如果有的话,通常是给文件系统的名称。
移除设备前,应先手动卸载设备。
卸载文件系统
关机和重启程序会自动解除所有文件系统的挂载。作为这个过程的一部分,任何缓存在内存中的文件系统数据都会被刷新到存储设备上,从而确保文件系统不会发生数据损坏。
要解除文件系统的挂载,umount命令需要挂载点作为参数。
[root@host ~]# umount /mnt/data
如果挂载的文件系统正在使用中,则无法解除挂载。为了使umount命令成功,所有进程需要停止访问挂载点下的数据。
在下面的例子中,umount失败的原因是文件系统正在使用中(shell使用的是/mnt/data作为当前的工作目录),产生了一个错误消息。
[root@host ~]# cd /mnt/data
[root@host data]# umount /mnt/data
umount: /mnt/data: target is busy.
lsof命令会列出所有打开的文件以及在提供的目录中访问这些文件的进程。这对于识别当前阻止文件系统成功卸载的进程是非常有用的。
[root@host data]# lsof /mnt/data
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1593 root cwd DIR 253,17 6 128 /mnt/data
lsof 2532 root cwd DIR 253,17 19 128 /mnt/data
lsof 2533 root cwd DIR 253,17 19 128 /mnt/data
一旦确定了进程,就可以采取相应的行动,比如等待进程完成,或者向进程发送SIGTERM或SIGKILL信号。在这种情况下,只需将当前工作目录改为挂载点以外的目录即可。
[root@host data]# cd
[root@host ~]# umount /mnt/data
在系统上定位文件
目标
完成这一部分后,你能够使用find和locate定位来搜索挂载文件系统中的文件。
查找文件
系统管理员需要工具来搜索文件系统中符合特定条件的文件。本节将讨论两个可以搜索文件系统层次结构中的文件的命令。
- locate命令可以在预生成的索引中搜索文件名或文件路径,并立即返回结果。
- find命令通过遍历文件系统层次结构来实时搜索文件。
按名称查找文件
locate命令根据文件的名称或路径来查找文件。它的速度很快,因为它可以从mlocate数据库中查找这些信息。但是,这个数据库不是实时更新的,必须经常更新才能保证结果的准确性。这也意味着locate 将无法找到上次数据库更新后创建的文件。
locate数据库每天都会自动更新。但是,根用户可以随时发出updatedb命令来强制立即更新。
[root@host ~]# updatedb
locate命令限制了非权限用户的搜索结果。为了查看结果的文件名,用户必须拥有文件所在目录的搜索权限。
在主机上的用户可读的目录树中搜索目录名或路径中带有passwd的文件。
[user@host ~]$ locate passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
/usr/bin/grub2-mkpasswd-pbkdf2
/usr/bin/lppasswd
/usr/bin/passwd
...output omitted...
即使文件名或路径仅与搜索查询部分匹配,也将返回结果。
[root@host ~]# locate image
/etc/selinux/targeted/contexts/virtual_image_context
/usr/bin/grub2-mkimage
/usr/lib/sysimage
/usr/lib/dracut/dracut.conf.d/02-generic-image.conf
/usr/lib/firewalld/services/ovirt-imageio.xml
/usr/lib/grub/i386-pc/lnxboot.image
...output omitted...
-i 选项执行不区分大小写的搜索。使用该选项,所有可能的大写和小写字母的组合都可以匹配搜索。
[user@host ~]$ locate -i messages
...output omitted...
/usr/share/vim/vim80/lang/zh_TW/LC_MESSAGES
/usr/share/vim/vim80/lang/zh_TW/LC_MESSAGES/vim.mo
/usr/share/vim/vim80/lang/zh_TW.UTF-8/LC_MESSAGES
/usr/share/vim/vim80/lang/zh_TW.UTF-8/LC_MESSAGES/vim.mo
/usr/share/vim/vim80/syntax/messages.vim
/usr/share/vim/vim80/syntax/msmessages.vim
/var/log/messages
选项 -n 限制了 locate 命令返回的搜索结果的数量。下面的例子将locate命令返回的搜索结果限制在前五个匹配的结果。
[user@host ~]$ locate -n 5 snow.png
/usr/share/icons/HighContrast/16x16/status/weather-snow.png
/usr/share/icons/HighContrast/22x22/status/weather-snow.png
/usr/share/icons/HighContrast/24x24/status/weather-snow.png
/usr/share/icons/HighContrast/256x256/status/weather-snow.png
/usr/share/icons/HighContrast/32x32/status/weather-snow.png
实时搜索文件
find命令通过在文件系统层次结构中进行实时搜索来定位文件。它比locate慢,但更准确。它还可以根据文件名以外的标准来搜索文件,例如文件的权限、文件类型、文件大小、修改时间等。
find命令使用执行搜索的用户帐户来查看文件系统中的文件。调用查找命令的用户必须具有读取和执行目录的权限,才能检查其内容。
find命令的第一个参数是要搜索的目录。如果省略了目录参数,find将在当前目录中开始搜索,并在任何子目录中寻找匹配的目录。
要通过文件名搜索文件,请使用 -name FILENAME 选项。使用这个选项,find会返回与FILENAME匹配的文件路径。例如,要搜索从 / 目录开始的名为 sshd_config 的文件,请运行以下命令。
[root@host ~]# find / -name sshd_config
/etc/ssh/sshd_config
通配符可用于搜索文件名,并返回所有部分匹配的结果。使用通配符时,一定要引用要查找的文件名,以防止终端解释通配符。
在下面的例子中,搜索以/目录中以.txt结尾的文件。
[root@host ~]# find / -name '*.txt'
/etc/pki/nssdb/pkcs11.txt
/etc/brltty/brl-lt-all.txt
/etc/brltty/brl-mb-all.txt
/etc/brltty/brl-md-all.txt
/etc/brltty/brl-mn-all.txt
...output omitted...
要搜索/etc/目录中包含单词 "pass"的文件,请运行以下命令。
[root@host ~]# find /etc -name '*pass*'
/etc/security/opasswd
/etc/pam.d/passwd
/etc/pam.d/password-auth
/etc/passwd-
/etc/passwd
/etc/authselect/password-auth
要对指定的文件名进行大小写敏感的搜索,请使用 -iname 选项,后面是要搜索的文件名。要搜索主机上的/目录中的文件名中的大小写敏感文本 messages,请运行以下命令。
[root@host ~]# find / -iname '*messages*'
...output omitted...
/usr/share/vim/vim80/lang/zh_CN.UTF-8/LC_MESSAGES
/usr/share/vim/vim80/lang/zh_CN.cp936/LC_MESSAGES
/usr/share/vim/vim80/lang/zh_TW/LC_MESSAGES
/usr/share/vim/vim80/lang/zh_TW.UTF-8/LC_MESSAGES
/usr/share/vim/vim80/syntax/messages.vim
/usr/share/vim/vim80/syntax/msmessages.vim
根据所有权或权限搜索文件
find命令可以根据文件的所有权或权限来搜索文件。按所有者搜索时,有用的选项是 -user 和 -group,按名称搜索,以及 -uid 和 -gid,按 ID 搜索。
在主机上的/home/user目录下搜索用户拥有的文件。
[user@host ~]$ find -user user
.
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history
在主机上的/home/user目录下搜索组用户所拥有的文件。
[user@host ~]$ find -group user .
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history
在主机上的/home/user目录下搜索用户ID 1000拥有的文件。
[user@host ~]$ find -uid 1000 .
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history
在主机的/ home / user目录中搜索组ID 1000拥有的文件。
[user@host ~]$ find -gid 1000 .
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history
当文件所有者和群组所有者不同时, -user 和 -group 选项可以一起使用,以搜索文件所有者和群组所有者不同的文件。下面的例子列出了由用户根目录下的文件和群组邮件所属的文件。
[root@host ~]# find / -user root -group mail
/var/spool/mail
...output omitted...
-perm 选项用于查找具有特定权限的文件。权限可以用八进制值来描述,读取、写入和执行的权限可以是4、2和1的组合。权限可以用/或-符号表示。
以/为前缀的数字权限可以匹配至少有一个用户、组或其他权限集的文件。一个权限为r--r--r--r--的文件不匹配/222,但一个权限为rw--r--r--的文件匹配。权限前的-号意味着该位的三个实例都必须是开启的,所以前面的例子都不匹配,但是像rw-rw-rw->这样的文件会匹配。
用一个更复杂的例子,下面的命令可以匹配任何用户有读写和执行权限的文件,组内成员有读写权限,其他成员有只读权限。
[root@host ~]# find /home -perm 764
要匹配用户至少有写权限和执行权限的文件,组内至少有写权限,其他人至少有读权限的文件。
[root@host ~]# find /home -perm -324
要匹配用户有读取权限的文件,或者组至少有读取权限,或者其他人至少有写入权限的文件。
[root@host ~]# find /home -perm /442
当与/或-一起使用时,值为0就像通配符一样,因为它意味着至少没有什么权限。
要匹配/home/user目录中的任何文件,而其他人至少在主机上有读取权限,请运行:
[user@host ~]$ find -perm -004
在/home/user目录中找到所有在主机上有写权限的文件。
[user@host ~]$ find -perm -002
根据大小搜索文件
find 命令可以查找与 -size 选项指定的大小相匹配的文件,后面是一个数值和单位。使用下面的列表作为 -size 选项的单位。
- k,代表千字节
- M,表示兆字节
- G,代表千兆字节
下面的例子显示了如何搜索大小为10兆字节的文件,四舍五入。
[user@host ~]$ find -size 10M
要搜索大小超过10GB的文件。
[user@host ~]$ find -size +10G
要列出所有大小小于10KB的文件。
[user@host ~]$ find -size -10k
根据修改时间搜索文件
-mmin选项,后面的时间(以分钟为单位)可以搜索所有在过去n分钟前内容发生变化的文件。文件的时间戳总是四舍五入。当使用范围(+n和-n)时,它也支持小数值。
要查找120分钟前主机上所有文件内容发生变化的文件,请运行。
[root@host ~]# find / -mmin 120
分钟数前面的+修改器可以查找所有在/中被修改超过n分钟的文件。在这个例子中,超过200分钟前被修改的文件被列出。
[root@host ~]# find / -mmin +200
修改器会改变搜索方式,将/目录中所有被修改过的文件都在n分钟以内。在这个例子中,被修改过的文件在150分钟内被列出。
[root@host ~]# find / -mmin -150
根据文件类型搜索文件
find命令中的-type选项将搜索范围限制在指定的文件类型。使用下面的列表传递所需的标志来限制搜索范围。
- f,用于普通文件
- d,用于目录
- l,用于软链接
- b,用于块状装置
搜索主机上/etc目录中的所有目录。
[root@host ~]# find /etc -type d
/etc
/etc/tmpfiles.d
/etc/systemd
/etc/systemd/system
/etc/systemd/system/getty.target.wants
...output omitted...
搜索主机上的所有软链接。
[root@host ~]# find / -type l
生成主机上/dev目录中所有块设备的列表。
[root@host ~]# find /dev -type b
/dev/vda1
/dev/vda
-links选项后面的数字可以查找所有具有一定的硬链接数的文件。这个数字前面可以用+修改器来查找硬链接数大于给定的硬链接数的文件。如果数字前面有-修饰符,搜索将被限制在所有硬链接数小于给定数字的文件。
在主机上搜索所有一个以上硬链接的常规文件。
[root@host ~]# find / -type f -links +1
总结
存储设备用一种特殊的文件类型来表示,称为块设备。
df命令报告所有挂载的常规文件系统的总磁盘空间、已使用的磁盘空间和可用的磁盘空间。
mount命令允许root用户手动挂载文件系统。
所有进程需要停止访问挂载点,才能成功卸载设备。
使用图形环境时,可移动存储设备被安装在/run/media目录下。
find 命令在本地文件系统中执行实时搜索,根据搜索条件查找文件。
网友评论