How do I create a file with a specific inode number?
Asked Answered
G

3

15

How can I create a file in ext3 filesystem with a specific inode number? (ex: I want to create a file with inode-number = 12253)

Grime answered 22/4, 2011 at 6:23 Comment(2)
What if that inode number is taken?Thimbleful
Related question: linux - Link to a specific inode - Stack OverflowTother
P
10

I don't think there's any programmatic way to request a specific inode number when creating a file from userspace. Other than being visible in stat() results, inode numbers have no significance in userspace; they're part of the filesystem's internal bookkeeping data, just like the block numbers where the file contents are allocated.

You could probably use debugfs to "change" an existing file's inode number, by copying the contents of one inode to another, then updating any directory entries to point to the new inode and deallocating the old one. So you could create your file with any inode number, then "change" it to the desired one. This would have to be done with extreme care, however, since mistakes are likely to result in filesystem corruption and data loss. You'd also have to account for the possibility that your desired inode number is already in use by another file.

Payer answered 22/4, 2011 at 6:49 Comment(3)
What I did to create a file with inode 5 (boot file): 0) unmount the volume 1) open the volume with debugfs, specify -w to open it as writable 2) clri <5> 3) seti <5> 4) sif <5> mode 0x81FF 5) ln <5> BootFile 6) sif <5> links_count 1 (ln does not change this field) 7) close debugfs 8) mount the volume 9) edit BootFile :)Heliotropin
I hope you made sure that inode 5 didn't contain some other important file before you cleared it...Payer
Inode 5 is reserved, and is also known as EXT2_BOOT_LOADER_INO. Also, I did this in a controlled environment (non-critical SD card).Heliotropin
L
2

That's a pretty low number, so chances are it's already in use; if not, you could run a Bash script to create a few thousand files: something like for i in $(seq 1 12000); do touch $i.txt; done. Then find the one you want: find / -inum 12253, and rename it to whatever you want, and put in it what you want. If you don't overwrite the allocated space, in which case a new inode will most likely be created, that should do it. It's a sloppy solution, though, and there must be a better way.

Lunch answered 22/4, 2011 at 6:41 Comment(0)
F
1

The inode number is assigned by the system. User code cannot specify it when creating a file.

Fleeta answered 22/4, 2011 at 6:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.