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
    • 最新
    • 标签
主页 / computer / 问题 / 1555764
Accepted
Artalus
Artalus
Asked: 2020-05-28 23:45:36 +0800 CST2020-05-28 23:45:36 +0800 CST 2020-05-28 23:45:36 +0800 CST

如何计算分区的确切大小和写入目录的 inode 数量

  • 772

我需要将一个包含文件(特别是 Linux chroot)的目录写入一个带有 LVM 映像的文件。任务的背景很愚蠢,但我想了解现在发生了什么。我计算目录的大小du:

# du -s --block-size=1 chroot
3762733056  chroot

我将它四舍五入并创建一个足够大的文件来包含它:

# fallocate -l 4294967296 image.lvm
# ls -lah
drwxr-xr-x 23 root    root    4.0K мая 27 20:59 chroot
-rw-r--r--  1 root    root    4.0G мая 28 09:59 image.lvm

我将文件挂载(抱歉,不确定术语是否正确)作为循环设备并在其上创建一个 LVM 分区。我会使用 ext4 fs,我知道 ext4 为 root 保留 5% 的空间(我可以调整它)和 inode 表的一些空间,所以我创建了一个比我的实际目录大 10% 左右的分区(4139006362 字节)并将其四舍五入,使其成为 512 的倍数(4139006464 字节)以满足 LVM 需求:

# losetup -f --show image.lvm
/dev/loop0
# pvcreate /dev/loop0
  Physical volume "/dev/loop0" successfully created.
# vgcreate IMAGE /dev/loop0
  Volume group "IMAGE" successfully created
# lvcreate --size 4139006464B -n CHROOT IMAGE
  Rounding up size to full physical extent <3.86 GiB
  Logical volume "CHROOT" created.

然后我在这个 LV 上创建一个 ext4 文件系统:

# mkfs.ext4 /dev/IMAGE/CHROOT
mke2fs 1.45.6 (20-Mar-2020)
Discarding device blocks: done                            
Creating filesystem with 1010688 4k blocks and 252960 inodes
Filesystem UUID: fb3775ff-8380-4f97-920d-6092ae0cd454
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 

# mount /dev/IMAGE/CHROOT mnt
# df --block-size=1 mnt
Filesystem                   1B-blocks         Used    Available Use% Mounted on
/dev/mapper/IMAGE-CHROOT    4007591936     16179200   3767648256   1% /mnt

虽然 3767648256 大于我从中得到的 3762733056 ,但du我仍然将其调高一个档次:

# tune2fs -m 0 /dev/IMAGE/CHROOT
tune2fs 1.45.6 (20-Mar-2020)
Setting reserved blocks percentage to 0% (0 blocks)
# df --block-size=1 mnt
Filesystem                1B-blocks     Used  Available Use% Mounted on
/dev/mapper/IMAGE-CHROOT 4007591936 16179200 3974635520   1% /mnt

到目前为止一切顺利,让我们向它写入一些数据:

# cp -a chroot/. mnt/
...
cp: cannot create regular file 'mnt/./usr/portage/profiles/hardened/linux/powerpc/ppc64/32bit-userland/use.mask': No space left on device

砰。让我们看看df显示了什么:

# df --block-size=1 mnt
Filesystem                1B-blocks       Used Available Use% Mounted on
/dev/mapper/IMAGE-CHROOT 4007591936 3587997696 402817024  90% /mnt

所以实际上有可用的空间。在谷歌搜索了一下之后,我发现你的分区上的 inode 可能会用完,这看起来和我的情况一模一样:

# df -i mnt
Filesystem               Inodes IUsed IFree IUse% Mounted on
/dev/mapper/IMAGE-CHROOT   248K  248K     0  100% /mnt

现在,问题!我可以轻松地使用更大的文件大小,创建 1.5 倍大的分区,在那里写我的文件,它会工作的。但是作为一个想要保留空间的迂腐开发人员:我如何准确计算要写入目录需要多少字节和 inode?我也相当肯定我--block-size=1在路上的某个地方也搞砸了。

“为什么选择 LVM”上下文:它用于其快照功能。所以基本上其他脚本从所说的 4G chroot 创建一个 20G 快照,在这个快照中做一些事情,然后删除它,保持 chroot 的原始内容不变。所以基本文件系统可能被认为是只读的。“简单”愚蠢的 docker 容器早在 Docker 之前就发明了,不能轻易地用 Docker 本身或其 overlayfs 替换。

linux partitioning
  • 1 1 个回答
  • 1926 Views

1 个回答

  • Voted
  1. Best Answer
    Attie
    2020-05-29T00:11:28+08:002020-05-29T00:11:28+08:00

    mkfs.ext4为您提供了三个有趣的选项(有关详细信息,请参见手册页)。

    • -i bytes-per-inode

      • 指定字节/inode 比率。
      • mke2fs 为磁盘上每字节空间的每个字节创建一个 inode。
      • 每个 inode 的字节数比率越大,创建的 inode 就越少。
    • -I inode-size

      • 以字节为单位指定每个 inode 的大小。
      • 默认 inode 大小由 mke2fs.conf(5) 文件控制。在 e2fsprogs 附带的 mke2fs.conf 文件中
        • 大多数文件系统的默认 inode 大小为 256 字节,
        • 除了 inode 大小为 128 字节的小型文件系统。
    • -N number-of-inodes

      • 覆盖应为文件系统保留的 inode 数量的默认计算(基于块数和每个 inode 的字节数比率)。
      • 这允许用户直接指定所需的 inode 数量。

    使用这些的组合,您可以精确地塑造文件系统。如果您确信您永远不需要创建任何其他文件或将文件系统安装为只读,那么理论上您可以提供-N ${number-of-entities}.

    $ truncate -s 10M ino.img
    $ mkfs.ext4 -N 5 ino.img
    mke2fs 1.44.1 (24-Mar-2018)
    Discarding device blocks: done
    Creating filesystem with 10240 1k blocks and 16 inodes
    Filesystem UUID: 164876f1-bbfa-405f-8b2d-704830d7c165
    Superblock backups stored on blocks:
            8193
    
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (1024 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    $ mount -o loop ino.img ./mnt
    $ df -i mnt
    Filesystem     Inodes IUsed IFree IUse% Mounted on
    /dev/loop0         16    11     5   69% /home/attie/box/mnt
    $ touch ./mnt/1
    $ touch ./mnt/2
    $ touch ./mnt/3
    $ touch ./mnt/4
    $ touch ./mnt/5
    $ touch ./mnt/6
    touch: cannot touch './mnt/6': No space left on device
    $ df -B1 mnt
    Filesystem     1B-blocks   Used Available Use% Mounted on
    /dev/loop0       9425920 176128   8516608   3% /home/attie/box/mnt
    $ df -i mnt
    Filesystem     Inodes IUsed IFree IUse% Mounted on
    /dev/loop0         16    16     0  100% /home/attie/box/mnt
    

    请记住,目录也将采用 inode:

    $ mkfs.ext4 -N 5 ino.img
    mke2fs 1.44.1 (24-Mar-2018)
    ino.img contains a ext4 filesystem
            last mounted on /home/attie/box/mnt on Thu May 28 09:08:41 2020
    Proceed anyway? (y/N) y
    Discarding device blocks: done
    Creating filesystem with 10240 1k blocks and 16 inodes
    Filesystem UUID: a36efc6c-8638-4750-ae6f-a900ada4330f
    Superblock backups stored on blocks:
            8193
    
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (1024 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    $ mount -o loop ino.img ./mnt
    $ mkdir mnt/1
    $ mkdir mnt/2
    $ touch mnt/a
    $ touch mnt/b
    $ touch mnt/1/c
    $ touch mnt/2/d
    touch: cannot touch 'mnt/2/d': No space left on device
    

    您可以获得使用find或类似的实体的计数,记住也要计算目录!(即:不要使用-type for -not -type d)。

    find "${source_dir}" | wc -l
    

    现在您也知道(或可以指定)inode 大小,您可以更准确地确定需要分配多少空间,并且可以避免在未使用的 inode 上“浪费”空间。


    如果您使用只读文件系统,那么另一种选择可能是查看 squashfs 而不是 ext4,它将专门根据输入文件分配一个连续(和压缩)块......而不是创建一个您希望的容器足够大并填充它。

    除非你真的在追求 LVM 的某些东西,否则你可以轻松摆脱它,如上所示(我建议不要也使用它)。您可能喜欢/想要一个 MBR,这取决于您将如何部署映像。

    • 2

相关问题

  • 如何让我的 Linux 机器看起来像是在运行 Windows?

  • 对于 cp 或 mv,是否有等同于 cd - 的东西?

  • 以 root 身份运行 docker 容器

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 如何在CentOS 7 中将Ctrl+C 永久更改为Ctrl+K?

Sidebar

Stats

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

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve