AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 421728
Accepted
OJFord
OJFord
Asked: 2018-02-04 16:23:17 +0800 CST2018-02-04 16:23:17 +0800 CST 2018-02-04 16:23:17 +0800 CST

为什么 67108864 是每个 inode 的最大字节数比?为什么有最大值?

  • 772

为纯大型视频文件格式化磁盘,我计算了我认为合适的每 inode 字节值,以最大化可用磁盘空间。

然而,我受到了欢迎:

mkfs.ext4: invalid inode ratio [RATIO] (min 1024/max 67108864)

我假设最小值是从理论上可以使用的东西中得出的——没有比以往任何时候都可以使用的更多的 inode。

但最大值从何而来?mkfs不知道我将放在它创建的文件系统上的文件大小 - 所以除非是这样,否则{disk size} - {1 inode size}我不明白为什么我们有一个最大值,更不用说一个低至 67MB 的文件了。

hard-disk ext4
  • 2 2 个回答
  • 1897 Views

2 个回答

  • Voted
  1. Best Answer
    ilkkachu
    2018-02-05T04:20:57+08:002018-02-05T04:20:57+08:00

    由于文件系统的构建方式。这有点混乱,默认情况下,您甚至不能将比率降至 1/64 MB。

    从kernel.org 上的 Ext4 磁盘布局文档中,我们看到文件系统内部与块大小(默认为 4 kB)相关联,它控制块组的大小和块组中的 inode 数量. 一个块组具有该组中块的一个块大小的位图,以及至少一个 inode 块。

    由于位图,最大块组大小为8 blocks * block size in bytes,因此在具有 4 kB 块的 FS 上,块组大小为 32768 个块或 128 MB。inode 至少占用一个块,因此对于 4 kB 块,每 128 MB 至少(4096 B/block) / (256 B/inode) = 16 inodes/block 或 16 个 inode,或每 8 MB 1 个 inode。

    对于 256 B/inode,即 256 B / 8 MB,或每 32 kB 1 个字节,或约 0,003% 的 inode 总大小。

    减少 inode 的数量无济于事,您只会得到一个部分填充的 inode 块。此外,inode 的大小也并不重要,因为分配是按块完成的。块组大小才是元数据的真正限制。


    增加块大小会有所帮助,理论上,最大块组大小会以块大小的平方增加(除了它似乎上限略低于 64k 块/组)。但是您不能使用大于系统页面大小的块大小,因此在 x86 上,您只能使用 4 kB 块。


    但是,有一个正是您想要的bigalloc功能:

    对于大多数包含大文件的文件系统,希望能够以多个块为单位分配磁盘块,以减少碎片和元数据开销。bigalloc 特性正好提供了这种能力。

    管理员可以在 mkfs 时间设置一个块簇大小(存储在 superblock 的 s_log_cluster_size 字段中);从那时起,块位图跟踪集群,而不是单个块。这意味着块组的大小可以是几 GB(而不仅仅是 128MiB);然而,最小分配单元变成了一个簇,而不是一个块,即使对于目录也是如此。

    您可以使用 启用它mkfs.ext4 -Obigalloc,并使用 设置集群大小-C<bytes>,但mkfs请注意:

    Warning: the bigalloc feature is still under development
    See https://ext4.wiki.kernel.org/index.php/Bigalloc for more information
    

    ext4在该页面和手册页上提到了与延迟分配相结合的问题,并且Bigalloc wiki 页面上也出现了“巨大风险”一词。


    -i这些都与该选项设置的 64 MB / inode 限制无关。它似乎只是在接口级别设置的任意限制。inode 的数量也可以直接使用该-N选项设置,并且在使用时,没有检查。此外,上限是基于文件系统的最大块大小,而不是实际选择作为结构限制的块大小。

    由于 64k 块/组的限制,如果bigalloc没有 64 MB / inode 的比率所暗示的那样少的 inode,则无法获得尽可能少的 inode,并且bigalloc可以将 inode 的数量设置得比它低得多。

    • 3
  2. Patrick Mevzek
    2018-02-04T21:33:12+08:002018-02-04T21:33:12+08:00

    您看到的数字是硬编码的,原因如下。

    mke2fs源代码有:

                com_err(program_name, 0,
                    _("invalid inode ratio %s (min %d/max %d)"),
                    optarg, EXT2_MIN_BLOCK_SIZE,
                    EXT2_MAX_BLOCK_SIZE * 1024);
    

    (发行说明中甚至有一条消息是关于对用户更好,并在抛出错误时显示可能的最小值和最大值,这比以前更好)。

    并且:

    #define EXT2_MIN_BLOCK_SIZE (1 << EXT2_MIN_BLOCK_LOG_SIZE)
    #define EXT2_MAX_BLOCK_SIZE (1 << EXT2_MAX_BLOCK_LOG_SIZE)
    

    最后:

    define EXT2_MIN_BLOCK_LOG_SIZE      10  /* 1024 */
    define EXT2_MAX_BLOCK_LOG_SIZE      16  /* 65536 */
    

    所以这解释了你所看到的。

    根据https://unix.stackexchange.com/a/193140/211833 ,我本来希望自己的比率最多是最大分区大小除以最大 inode 数,但事实并非如此。

    根据其规范,ext4最大卷大小为 1 exbibyte(2 60字节),最大 inode 数为 2 32,最大文件大小为 16 TiB (16 * 2 40 = 2 44 ),4k 块。

    因此,最大分区大小除以 inode 计数将为 2 60-32 = 2 28,这不是源文件中硬编码的内容(67108864 是 2 26)。我不知道有什么区别,但我也不是文件系统开发人员。

    • 2

相关问题

  • 使用 hdparm (APM, Suspend) 的硬盘空闲设置

  • 在 MS-Windows 7 下对外部磁盘进行分区时,ntfs 的版本是什么

  • 我可以远程判断我是否有空闲的 SATA 端口

  • 将局域网硬盘挂载到 linux fedora

  • 以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve