[RH124] 16-文件系统

1.分区

在一个分区格式化后,一个分区的结构为一个分区头+若干block的形式。如图:

 其中每个block默认为4K大小,每个block只能存放一个文件的内容,不能同时存放多个文件的内容

我们可以在格式化界面看到:

通过修改分配单元大小,就可以修改每个block的大小。

假设一个文件大小为2K,存放在某个block中,那么该block还剩下2K的空间未使用。但是这2K未使用的空间无法分配给其他文件使用,只能浪费。

上图所示,该文本文件只有225字节,但是占用空间为4KB

注意:当存储的文件都比较大时,Block大小设置大一些,读写效率更高。当存储的文件都是小文件(大部分小于4KB),Block大小设置小一些,这样可以节省存储空间。

2.inode

分区的最前面是一个叫inode的部分,每个文件都有一个inode,inode有一个编号,对应一个文件。相当于目录,记录了文件名、大小、属主、权限、在哪个block等。

如果将15号block的yy.sh复制一份为zz.sh,放在第16个block,那么自然也会生成一个inode来记录这个zz.sh文件的信息。两个文件时不相干的。

 

 ls -i yy.sh 可以查看inode值。

注意:inode只能记录当前分区里block的信息,不能记录其他分区里block的信息。

也就是说:跨分区是不能创建硬链接的。

3.常见文件系统

操作系统不同,使用的文件系统也是不同的。

windows:fat32  ntfs

linux:ext2  ext3  ext4  xfs

 

在Centos7  rhel7下默认的文件系统为xfs

一个文件系统可以理解为一个分区。一个分区格式化后就是一个文件系统。

xfs文件系统可以支持ext4文件系统中所有的功能。文件系统(一个分区)最大可以支持到256EB。单个文件大小可支持8EB。

4.硬链接

硬链接  即文件的别名。

 文件属性中的这个“1”就是代表硬连接的数量。

硬链接可以理解为一个文件的名字,一个文件可能存在多个名字。有点像人有曾用名,现用名和曾用名都代表这个人。有几个硬链接,就理解为存储在block里的文件有几个名字,至少得有一个名字。

如图,inode 9代表block1里的文件,该文件有3个硬链接,表示有3个名字。当最后一个名字被删除时,文件会被从block1中删除。

运行ls -ld /命令,会发现"/"根目录有20多个硬链接:

这是因为,在根目录下,有一个"."是根目录的别名:

然后,根目录下每个文件夹里,例如Desktop文件夹中,".."表示上一级目录,实际上也是根目录的别名。

5.磁盘挂载和卸载

 lsblk :可以查看所有的分区。

 

除了使用lsblk以外,还可以使用df命令查看已挂载的分区信息:

df -hT  # 其中h是human可读(即合适的单位),T表示type,即xfs等文件系统的类型

 

 

使用mount命令进行设备挂载:

mount -o 选项 设备 /挂载点  # 其中的-o表示options,后面跟选项

例如将sda6挂载到/zz:

mount /dev/sda6 /zz

使用umount卸载:

umount /zz
umount sda6

以上两种都可以,使用挂载点或设备都可以卸载(但只能选择其中一个方式)。

 

挂载前与挂载后,挂载点数据归属问题:

例如,我们要在挂载点/zz挂载一个分区sda6,如果/zz中本身有数据,而sda6中没有数据,一旦挂载,/zz中原本的数据就会被隐藏。

我们在使用 lsblk 命令的时候,看到sda1是挂载到根目录"/"下的,所以在sda6挂载到/zz之前,/zz的数据时存储到sda1中的。

而当sda6挂载到/zz后,我们看/zz的内容,实际上看到的是sda6中的数据(即为空)。如下图所示:

 

这个例子说明了,挂载后的空间与挂载前的空间没有任何关系,/zz在挂载sda6以后,我们再查看/zz目录的时候看到的就是sda6的空间,而sda1中属于/zz的内容任然存在,只是看不到了而已,如果我们此时将sda6卸载,则原来的sda1上的数据由可以看到了。

 

挂载的一些选项:

只读挂载:

mount -o ro /dev/sda6 /zz

其中ro表示readonly,即sda6挂载到/zz上,但是是只读的,不能写数据。

不可执行:

mount -o noexec /dev/sda6 /zz

/zz中的所有文件都不可执行(例如一些脚本,或程序)

不卸载的情况下修改选项:

mount -o remount,exec /zz/

将/zz修改为文件可执行状态,但不是通过卸载然后重新挂载的方式。而是修改后自动重新挂载。

 

一个设备挂载到多个挂载点:

当一个设备挂载到多个挂载点时,例如sda6挂载到/zz和/yy。

mount /dev/sda6 /zz
mount /dev/sda6 /yy

此时,我们使用lsblk或df -hT都无法同时看到sda6挂载的两个挂载点(都只能看到一个,/zz或是/yy)。

我们可以使用mount命令来查看所有挂载的详细信息:

 

 

开机自动挂载:

我们使用mount挂载的设备都是临时挂载的,当重新启动机器后,设备是不会自动挂载的。我们使用以下步骤来设置开机自动挂载:

编辑 /etc/fstab 配置文件,添加如下内容:

/dev/sda6    /zz    xfs    defaults     0 0

如果要添加noexec或ro等选项:

/dev/sda6    /zz    xfs    defaults,noexec     0 0

配置完后,如果有需要马上挂载的,可以执行:

mount -a   # automount自动挂载fstab中执行的分区

 

6.文件查找命令

1)which命令,用于查找命令所对应执行文件位置:

which vim
which ifconfig

2)whereis命令,类似which,但可以查询更多与名字相关的文件位置:

whereis vim

3)locate命令,从文件索引数据库中去查询文件。但是这个数据库每一周才更新一次,所以我们新创建的文件可能查询不到,需要手工更新一下数据库:

updatedb  # 更新数据库
locate filename  # 查询文件

这个命令类似于windows中的everything搜索工具,会对db进行自定更新。

 

4)locate命令一定要和locale命令区分开,locale命令是设置系统编码的:

[root@centos7 ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
...

或者使用:

[root@centos7 ~]# echo $LANG
en_US.UTF-8

如果要修改系统编码,则修改 /etc/locale.conf 配置文件。

当确定编码后,在打开所有应用程序的时候都以当前编码打开。一般我们就使用en_US.UTF-8即可。

 

5)find命令

find命令可以按以下类型内容来查找文件:

name
iname
user
group
uid
gid
size
mtime
mmin
type
perm
...

按文件名查找:

find /usr/lib -name sendmail  # name表示按文件名查找
find /usr/lib -iname sendmail  # iname表示按名字查找不分大小写

默认在本目录查找,则不写目录:

find -name sendmail  # 在本目录下查找sendmail

 

按文件所属user查找:

find -user tom

也可以使用uid查找:

find -uid 1000  # 例如1000就是tom用户

查找没有所属用户的:

find -nouser

 

按文件所属组查找:

find -group root

也可以使用gid查找:

find -gid 1000

查找没有用户组的:

find -nogroup

 

组合查找:

find -user tom -group bob  # 查找当前目录下,所有属于tom,属于bob组的文件

实际有个隐藏的选项,叫and,即-a:

find -user tom -a -group bob 

如果要查找"或"的关系,使用-o:

find -user tom -o -group bob 

 

按文件大小查找:

find -size 4M  # 等于4M
find -size +4M  # 大于4M
find -size -4M  # 小于4M
find -size 4M -o +4M  # 大于等于4M
find -size +2M -a -4M  # 大于2M,小于4M

 

按创建时间查找:

find -mtime +1  # 大于1天的
find -mtime -1  # 小于1天的
find -mmin +10  # 大于10分钟
find -mmin -10  # 小于10分钟

 

按文件类型查找:

find -type f  # 普通文件
find -type d  # 目录
find -type l  # 软连接

 

按权限查找:

find -perm 644   # 查找权限为644的、
find -perm /644  # 6 4 4中有一个匹配就行
find -perm +644  # 在RHEL7中,同上。在RHEL6中,同/644
find -perm -644  # 比这个权限多的,例如755

 

使用通配符查找:

find -name "file*"  # 查找以file开头的文件,尽量加上双引号,因为查找有些名字不加双引号会报错

 

如果要删除查找到的文件:

find -name "file*" -exec rm -rf {} \;  # "-exec"是连接符,"{}"用于接收前面的结果,"\;" 是固定格式。

 

查看查找到的文件的属性:

[root@centos7 bin]# find /usr/lib -name "log*" | xargs ls -l
-rwxr-xr-x. 1 root root  584 Sep 12  2013 /usr/lib/dracut/modules.d/99base/loginit.sh
-rw-r--r--. 1 root root 3835 Mar 22  2019 /usr/lib/python2.7/site-packages/tuned/logs.py
-rw-r--r--. 1 root root 5732 Sep 14  2019 /usr/lib/python2.7/site-packages/tuned/logs.pyc
-rw-r--r--. 1 root root 5691 Sep 14  2019 /usr/lib/python2.7/site-packages/tuned/logs.pyo
-rwxr-xr-x. 1 root root 8094 Aug  8  2019 /usr/lib/python2.7/site-packages/yum/logginglevels.py
-rw-r--r--. 1 root root 6667 Aug  8  2019 /usr/lib/python2.7/site-packages/yum/logginglevels.pyc

 

===

posted @ 2020-03-20 15:11  风间悠香  阅读(219)  评论(0编辑  收藏  举报