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 / 问题 / 498495
Accepted
Philip Couling
Philip Couling
Asked: 2019-02-04 13:55:53 +0800 CST2019-02-04 13:55:53 +0800 CST 2019-02-04 13:55:53 +0800 CST

ls -i 中的 inode 编号如何与磁盘上的 inode 相关

  • 772

我试图了解 inode 编号(由 显示ls -i)如何与 ext4 分区一起使用。

我试图了解它们是否是 linux 内核的构造并映射到磁盘上的 inode,或者它们是否实际上是存储在磁盘上的相同数字。

问题:

  1. 重新启动计算机时,inode 编号是否会更改?
  2. ls -i挂载两个分区时,只要两个不同的文件在不同的分区上,就可以为它们生成相同的 inode 号。
  3. 可以在不重新启动或重新挂载分区的情况下回收 inode 编号吗?

为什么我要问...

我想在具有 1.5TB 数据和大约 2000 万个文件(文件名)的 USB 硬盘上创建二级索引。文件范围从 10s 字节到 100s GB。其中许多是多次硬链接,因此单个文件(磁盘上的 blob)可能有多达 200 个文件名。

我的任务是通过检测重复并用更多的硬链接替换重复来节省磁盘空间。

现在作为一个单独的练习,我想我可以为磁盘上的每个文件创建一个数据库,它是 shasum、权限等......一旦建立,检测重复应该是微不足道的。位我需要确定我使用的是正确的唯一键。由于存在大量硬链接,文件名不合适。我希望我可以使用 inode 编号。

我想了解的是,当我下次重新启动机器时,我们的 inode 编号是否会改变。或者如果它们更加不稳定(在我构建数据库时它们会改变吗?)

我阅读的所有文档都模糊了内核提供的 inode 编号和磁盘上的 inode 之间的区别。根据我已经阅读过的文章,这些是否相同尚不清楚。

linux filesystems
  • 2 2 个回答
  • 1839 Views

2 个回答

  • Voted
  1. Best Answer
    Sergiy Kolodyazhnyy
    2019-02-04T15:34:13+08:002019-02-04T15:34:13+08:00

    我试图了解 inode 编号(由 ls -i 显示)如何与 ext4 分区一起使用。

    从本质上讲,inode 是文件系统(!)的引用,是磁盘上实际数据(位和字节)和与该数据关联的名称(/etc/passwd例如)之间的桥梁。文件名被组织到目录中,其中目录条目是带有相应 inode 的文件名。

    然后 inode 包含实际信息 - 权限,磁盘上占用的块、所有者、组等。在 UNIX 文件系统中的目录结构如何存储中,有一个非常好的图表,它更好地解释了文件和 inode 之间的关系:

    在此处输入图像描述

    当你在另一个目录中有一个文件指向相同的 inode 号时,你就有了所谓的硬链接。

    现在,请注意我已经强调了 inode 是特定于文件系统的引用,这就是要注意这一点的原因:

    任何给定文件的 inode 编号对于文件系统来说是唯一的,但对于安装在给定主机上的所有文件系统不一定是唯一的。当您有多个文件系统时,您会看到文件系统之间的 inode 编号重复,这是正常的。

    这与设备相反。您可能在同一设备上有多个文件系统,例如/varfilesystem 和/,但它们位于同一驱动器上。

    现在,inode 号可以改变吗?有点。文件系统负责管理 inode,因此除非文件系统存在潜在问题,否则 inode 编号不应更改。在某些棘手的情况下,例如vim 文本编辑器,

    重命名旧文件,然后用原始名称写入一个新文件,如果它认为它可以重新创建原始文件的属性。如果您想重用现有的 inode(因此有丢失数据的风险,或者浪费更多时间制作备份副本),请将 set backupcopy yes 添加到您的 .vimrc。

    要记住的关键点是,数据对用户来说可能是相同的,实际上它被写入磁盘上的新位置,因此 inode 编号发生了变化。

    因此,简而言之:

    1. 重新启动计算机时,inode 编号是否会更改?

    除非重启后文件系统有问题

    2.挂载两个分区时,ls -i 可以为两个不同的文件生成相同的inode号,只要它们在不同的分区上即可。

    是的,因为两个不同的分区会有不同的文件系统。我对LVM了解不多,但是在这种类型的存储管理下,两个物理卷可以组合成一个逻辑卷,在我的理论猜测中,ls -每个文件都会产生一个 inode

    1. 可以在不重新启动或重新挂载分区的情况下回收 inode 编号吗?

    文件系统在删除文件时执行此操作(即,当所有指向文件的链接都被删除,并且没有任何内容指向该 inode 时)。


    我的任务是通过检测重复并用更多的硬链接替换重复来节省磁盘空间。

    好吧,检测重复可以通过md5sum或其他校验和命令完成。在这种情况下,您正在检查实际数据,这些数据可能存在也可能不存在于磁盘上的不同 inode 下。一个例子来自heemayls 的回答:

    find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD
    
    • 7
  2. Stephen Kitt
    2019-02-04T14:03:14+08:002019-02-04T14:03:14+08:00
    1. 不,当计算机重新启动时,inode 编号不会改变,至少ext4对于 inode 存储在磁盘上的 POSIX 文件系统(例如 )不会改变。

    2. 是的,不同分区上的两个不同文件可以具有相同的 inode 编号。请参阅两个独立文件系统上的两个文件可以共享相同的 inode 号吗?为什么目录 /home 、/usr、/var 等都具有相同的 inode 编号 (2)?详情。(在给定系统中,唯一的是设备号-inode 对。)

    3. 是的,如果你删除一个文件,它的 inode 可以重新使用,而无需重新启动或重新挂载。

    • 3

相关问题

  • du/df 和 ls 报告不同的磁盘使用情况

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • Linux 内核开发人员如何处理数百万行代码的工作?他们是一种方法吗?[关闭]

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • 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
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +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

热门标签

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