zoukankan      html  css  js  c++  java
  • [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

    ===

  • 相关阅读:
    react 全局监听报错,监听白屏
    【Python】(八)Python中的set集合(每个人都是唯一的个体)
    【Python】(六)Python数据类型-列表和元组,九浅一深,用得到
    mybatis-spring多数据源配置
    自己动手实现springboot运行时新增/更新外部接口
    自己动手实现springboot运行时执行java源码(运行时编译、加载、注册bean、调用)
    自己动手实现java断点/单步调试(一)
    自己动手实现java断点/单步调试(二)
    Swift 模式下面LLDB 输出对象
    Understanding Swift’s value type thread safety
  • 原文地址:https://www.cnblogs.com/leokale-zz/p/12531897.html
Copyright © 2011-2022 走看看