[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
===