【Notes6】iNode,文件查找与读取,iptables,hash
发布日期:2021-04-30 21:03:52 浏览次数:102 分类:精选文章

本文共 2296 字,大约阅读时间需要 7 分钟。

iNode:磁盘中块和扇区

在Linux文件系统中,iNode用于存储文件的元数据信息,而不是文件内容本身。iNode的元数据包括以下几个方面:

  • 类型:这是一个目录还是普通文件
  • 拥有者:是属于owner还是group owner
  • 时间
    • ctime:上次iNode变动的时间
    • atime:上次文件被访问的时间
    • mtime:上次文件内容发生变动的时间
  • 连接数:同时指向这个iNode的文件名数量
  • 文件内容所在位置:文件实际内容所在磁盘块的标号
  • 文件系统在格式化后,iNode以数组形式存储,每个iNode的大小根据文件系统的大小和磁盘大小决定,通常为128或256字节。

    此外,文件系统会生成一个Map映射关系表,存储文件名与iNode索引的对应关系。读取文件时,首先通过文件名查找Map表获取iNode索引,然后从iNode数组中获取相应的iNode信息,接着找到文件内容所在磁盘块的位置,最后读取磁盘块内容。

    扇区与块

    磁盘在生产时会划分为扇区,每个扇区的大小通常为512字节(传统系统),现在则是4K字节。文件系统从硬件的角度抽象了扇区,使用块作为文件存储的最小单元。一个块可以由1、2或4个扇区组成,以平衡磁盘空间浪费和读写效率。

    选择块大小需要权衡:过小的块会导致每个文件占用多个块,增加iNode存储的负担;过大的块则可能导致空间浪费。因此,块大小通常是根据文件系统的实际需求和磁盘总容量来确定的。

    iNode数组的限制

    尽管iNode数组的大小可以在格式化时指定,但一旦iNode数组用完,文件系统即使还有剩余空间也无法存储新的文件。这通常会导致 inode exhausted的问题,尤其是在有大量零碎文件或大量文件时。早期的Docker使用overlay文件存储格式时常常面临这个问题,而Overlay2格式则在一定程度上解决了这个问题。

    文件查找与读取命令

    在C语言中,字符串的终结字符'\0'对应的ASCII码值为0。

    find:找文件

    find命令用于搜索文件系统中的文件,可以根据路径、文件名、大小、权限、修改时间等条件筛选。

    例如:

    find . -name '*.txt' -size +1M -type f

    这个命令会在当前目录和子目录中搜索大小超过1MB的文本文件。

    -print0选项会将匹配结果以'\0'分隔输出,xargs -0则可以正确处理这种终结符分隔的文件名。

    为了快速搜索,可以使用索引文件加快搜索速度。例如,/usr/bin目录下有很多系统程序,使用find /usr/bin -x可以快速找到可执行程序。

    grep:找文件内容

    grep命令用于在文本文件中查找特定模式。常见用法包括:

    grep "异常信息" /path/to/log/file.log

    可以使用-r选项进行递归搜索,-n选项显示匹配行号。

    cat/more:查看文件内容

    cat命令用于读取文件内容,每次读取整个文件可能导致高负载,可以通过-I选项每次读取一行,-s选项一次性读取整个文件。

    more命令同样用于分页查看文件内容,可以使用<键向前翻页,>键向后翻页,空格键跳到下一行开始。

    head/tail:查看文件部分内容

    head命令显示文件的前几行,可以使用-n指定显示行数,tail命令显示文件的后几行,可以使用-f实时监控。

    iptables:网络数据包过滤

    iptables用于管理Linux系统的网络过滤规则,主要包括filternatmanglearpip五个表。

    filter表:默认策略

    filter表默认情况下会对进入和离开系统的数据包进行过滤。可以通过配置规则来允许或拒绝特定类型的数据包。

    例如,防火墙规则可以这样配置:

    iptables -A filter -j ACCEPT --dport 8081 -p tcp

    这条规则会允许进入系统的TCP端口8081的数据包。

    net表:转发数据包

    net表用于实现网络数据包转发,可以实现网络地址转换(NAT)和端口转发。

    例如,要在0.12.0.0机器上将来自0.12.0.0:7788的TCP连接转发到0.11.0.0:7799,可以执行以下命令:

    iptables -t nat -A PREROUTING -d 0.12.0.0 -p tcp --dport 7788 -j DNAT --to-destination 0.11.0.0:7799iptables -t nat -A POSTROUTING -j MASQUERADE

    这样设置后,通过0.12.0.0访问0.11.0.0:7799的请求会被正确转发。

    一致性哈希:取余法

    一致性哈希是一种分布式缓存算法,用于解决缓存服务器动态增加或减少时,如何均匀分配缓存压力的问题。常用的方法是对缓存键(如图片序号)进行哈希计算,取模运算确定目标缓存服务器。

    例如,假设有三台缓存服务器S0、S1、S2,图片序号为key,哈希函数输出一个整数hash值,通过hash值对服务器数量取模,确定图片存储的服务器。

    这种方法有以下优点:

  • 负载均衡:相同的key会映射到相同的服务器,新增服务器可以直接接入,不会影响已有映射关系。
  • 容错性:如果某台服务器不可用,请求会自动转发到其他服务器。
  • 然而,传统的取模方法可能存在hash偏斜问题,即多个服务器集中在模运算的某个区域,导致负载不均。解决方法是增加虚拟节点,使实际服务器与模运算结果的分布更加均匀。

    例如,使用虚拟节点分散服务器在模运算结果空间中,使得每个服务器处理的请求量更均衡。

    上一篇:线程-安全发布对象(六)
    下一篇:JAVA 基于注解的报表映射

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2026年06月22日 13时04分40秒