标签: inode

理解Inodes的概念

我指的是关于Inodes概念的链接

我对部分感到困惑:

  1. 12个直接块指针
  2. 1个单个间接块指针
  3. 1个双重间接块指针
  4. 1个三重间接块指针

现在图表说每个指针都是32/64位.

  • [查询]:为什么以及如何推断这些值?我的意思是为什么只有32或64位指针?

该图表示,每个指针的一个数据块{8 KB} {4字节/ 8字节}

  • [查询]:这实际上是如何实现的?即8*1024字节/ 8字节= 1024字节?为8KB块提供8字节指针的逻辑是什么?

unix filesystems inode

5
推荐指数
2
解决办法
2万
查看次数

如何在保留inode的同时更改符号链接目标

通常,要更改符号链接目标,首先取消链接文件,然后使用新目标路径重新创建符号链接.但是,它将被分配一个新的inode编号.

也许有一个私有的Mac api update_target_for_symlink()功能,所以inode可以保持不变?

如果你想知道我需要它...文件管理器.我怀疑这是否可能.无论如何这就是它的有趣之处.

macos symlink inode unlink

5
推荐指数
1
解决办法
1232
查看次数

如何从给定的 inode 获取路径名或 dentry 或结构文件?

我需要知道如何获取路径名或dentry从struct file给定的索引节点。

我曾经使用从路径名file_open获取struct file但总是给出内核恐慌。我需要一种方法来将我的 inode 列表中的 inode 与路径名中的 inode 进行比较,或者比较磁盘中的所有 inode 以找到相应的路径名,然后与我的 inode 列表进行比较。

kernel inode linux-kernel pathname

5
推荐指数
1
解决办法
3812
查看次数

执行'mv A B':'inode'会被更改吗?

如果我们执行一个命令:

mv A B
Run Code Online (Sandbox Code Playgroud)

那么文件A的inode中的字段会发生什么?它会改变吗?

我不认为它应该只是通过更改文件的名称来改变,但我不确定.

unix inode mv

5
推荐指数
1
解决办法
5862
查看次数

在 Linux 中如何获取 inode 的代号?

摘要:我想i_generation从用户空间获取 Linux(或至少 ext4)中文件的生成号 ( )。或者,“出生时间”(文件创建时间)。

我正在尝试编写一个双向文件同步程序(又名Unison),但没有中央数据库(简单,只需将数据存储在同步根中)并且通过保留文件移动(如果您想支持所有文件移动,则非常非常困难)例如,奇怪的情况,例如将文件移出随后删除的目录)。

拥有一种唯一标识文件的方法将使事情变得容易很多。我知道如何获取 inode 和设备号(通过stat),但由于 inode 可以重复使用(我自己也见过),我想使用更稳定的唯一标识。

我读过 NFS 使用“世代号”来唯一标识文件。在 NFS 中,( st_ino, i_generation) 组合用于在重新启动和服务器崩溃时唯一标识文件句柄(或至少防止重复使用同一文件句柄导致可能的数据损坏)。

不过我还没成功拿到号码。这个 ext4 文档似乎表明可以从 ext4 文件系统获取该数字,但我无法从用户空间获取它(我不会在内核空间中运行这个简单的程序)。看EXT4_IOC_GETVERSION。我在我的系统上找不到合适的头文件(LMDE、Debian 测试)。我可以找到两种选择:

  1. 尝试使用内核中的那个 - 失败说不应该从用户空间使用它。
  2. 尝试使用EXT2_IOC_GETVERSIONin <linux/ext2_fs.h>- 给出EBADF( errno9)。也许是因为我试图从 EXT4 文件系统获取 EXT2 信息?或者也许我做错了什么ioctl,这是我第一次尝试使用它。文件被正确打开,因为open在我的例子中调用返回 3 (这应该是有效的)。

代码:

#include <sys/ioctl.h>
#include <sys/fcntl.h>
#include <linux/ext2_fs.h>
#include <stdio.h>
#include <errno.h>

int main () {
    int fileno = open("generation.c", O_RDONLY); …
Run Code Online (Sandbox Code Playgroud)

linux inode ioctl stat

5
推荐指数
1
解决办法
2365
查看次数

Xfs 文件大小、inode 大小和块大小

ll /srv/node/dcodxx/test.sh
-rw-r--r--. 1 root root 7 Nov  5 11:18 /srv/node/dcodxx/test.sh
Run Code Online (Sandbox Code Playgroud)

文件的大小以字节为单位显示。此文件存储在块大小为 4096 字节的 xfs 文件系统中。

xfs_info /srv/node/sdaxx/
meta-data=/dev/sda               isize=256    agcount=32, agsize=7630958 blks
         =                       sectsz=4096  attr=2, projid32bit=0
data     =                       bsize=4096   blocks=244190646, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal               bsize=4096   blocks=119233, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Run Code Online (Sandbox Code Playgroud)

这是否意味着一个块可以容纳多个文件,否则剩余字节 (4096-7) 会发生什么?另外,为 inode 保留的 256 字节存储在哪里,如果它与文件存储在同一块中,文件大小不应该更大(256 + 7)吗?

filesystems inode xfs

5
推荐指数
2
解决办法
2万
查看次数

有没有办法计算目录的索引节点?

有人能告诉我如何计算目录中文件的 inode 数量吗?

谢谢。

unix linux filesystems inode

5
推荐指数
1
解决办法
5830
查看次数

Unix readdir (3) 和 stat (2) 给出不同的 inode

我是我大学系统编程课的助教。最近,学生们正在完成一项涉及复制该程序的作业pwd。

一些学生注意到了似乎不一致的地方。当他们从 readdir 条目中读取 ino 时,它会给出与统计同一目录时不同的 inode。他们中的许多人都在问为什么。目录项的索引节点不应该指向目标目录所在的索引节点吗?如果是这样,为什么 stat 给出不同的 inode?

这是一些示例代码来演示:

#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>

#define DIR_NAME "~redacted~"

int getReaddirInode(char* entName)
{
   DIR* directory;
   struct dirent* entry;
   ino_t result;
   if ((directory = opendir(".")) == NULL)
   {
      perror("opendir");
      exit(1);
   }
   while ((entry = readdir(directory)) != NULL)
   {
      if (strcmp(entName, entry->d_name) == 0)
      {
         result = entry->d_ino;
         break;
      }
   }
   if (entry == NULL)
   {
      fprintf(stderr, "No such directory: %s.\n", …
Run Code Online (Sandbox Code Playgroud)

c unix inode stat readdir

5
推荐指数
1
解决办法
714
查看次数

复制和移动命令对inode的影响

我将 inode 解释为指向文件实际存储位置的指针。

但我的理解有问题:

  1. 如果我在已经存在的cp file1 file2地方使用,inode 不会改变。如果最初存在指向 file2 的硬链接,那么它们现在都指向刚刚复制到此处的新文件。file2

    • 我能想到的唯一原因是Linux将此解释为修改 文件而不是删除并创建新文件。我不明白为什么要这样设计?
  2. 但是当我使用时mv file1 file2,inode 变成了 的 inode file1。

linux operating-system inode

5
推荐指数
1
解决办法
4453
查看次数

文件写入期间的竞争条件

假设两个不同的进程独立打开同一个文件,因此在打开文件表(系统范围)中具有不同的条目。但它们引用相同的 i 节点条目。

由于文件描述符引用打开文件表(系统范围)中的不同条目,因此它们可能具有不同的文件偏移量。write由于文件偏移量不同,是否会出现竞争条件?内核又是如何避免这种情况的呢?

书籍:Linux 编程接口;页码 95;第 5 章(文件 I/O:更多详细信息);第 5.4 节

c linux inode file unistd.h

5
推荐指数
2
解决办法
2982
查看次数

标签 统计

inode ×10

linux ×4

unix ×4

filesystems ×3

c ×2

stat ×2

file ×1

ioctl ×1

kernel ×1

linux-kernel ×1

macos ×1

mv ×1

operating-system ×1

pathname ×1

readdir ×1

symlink ×1

unistd.h ×1

unlink ×1

xfs ×1