Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
жучара
Сообщения: 1085
ОС: астралинукс

Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение жучара »

Друзья! Я не мог хидеры с такими структурами найти 5 лет назад, не могу и сейчас. Описание-то само есть, но не руками же их кропать. Вот тут мне сказали:

Что надо задействовать пакет libext2fs-dev. Он у меня стоит. Его описание:

Shell

$ apt-cache search ext4 dev
...
libext2fs-dev - библиотеки для работы с файловыми системами ext2/ext3/ext4 - заголовки и статичные библиотеки
...
$
А вот его хидеры (ковырял *.deb файл):

Shell

$ dpkg -c libext2fs-dev_1.47.0-2_amd64.deb | grep "^-" | grep ".h$" | awk '{ print $6 }' | cut -c 2-
/usr/include/e2p/e2p.h
/usr/include/ext2fs/bitops.h
/usr/include/ext2fs/ext2_err.h
/usr/include/ext2fs/ext2_ext_attr.h
/usr/include/ext2fs/ext2_fs.h
/usr/include/ext2fs/ext2_io.h
/usr/include/ext2fs/ext2_types.h
/usr/include/ext2fs/ext2fs.h
/usr/include/ext2fs/ext3_extents.h
/usr/include/ext2fs/hashmap.h
/usr/include/ext2fs/qcow2.h
/usr/include/ext2fs/tdb.h
$
Проверяем хидеры на предмет ext4_inode

Shell

$ grep ext4_inode $(dpkg -c libext2fs-dev_1.47.0-2_amd64.deb | grep "^-" | grep ".h$" | awk '{ print $6 }' | cut -c 2-)
$
Зато ext2_inode хоть отбавляй, а на дворе уже 25-ый год:
$ grep ext2_inode $(dpkg -c libext2fs-dev_1.47.0-2_amd64.deb | grep "^-" | grep ".h$" | awk '{ print $6 }' | cut -c 2-)
/usr/include/ext2fs/ext2_fs.h:struct ext2_inode {
/usr/include/ext2fs/ext2_fs.h:struct ext2_inode_large {
/usr/include/ext2fs/ext2_fs.h: (offsetof(struct ext2_inode_large, i_checksum_hi) + sizeof(__u16) - \
/usr/include/ext2fs/ext2_fs.h: (size >= (sizeof(((struct ext2_inode_large *)0)->field) + \
/usr/include/ext2fs/ext2_fs.h: offsetof(struct ext2_inode_large, field)))
/usr/include/ext2fs/ext2_fs.h:struct ext2_inode *EXT2_INODE(struct ext2_inode_large *large_inode)
/usr/include/ext2fs/ext2_fs.h: return (struct ext2_inode *) large_inode;
/usr/include/ext2fs/ext2_fs.h:static inline int ext4_hash_in_dirent(const struct ext2_inode *inode)
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode_cache *icache;
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode;
/usr/include/ext2fs/ext2fs.h:typedef struct ext2_struct_inode_scan *ext2_inode_scan;
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode, blk64_t lblk);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h: const struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode, blk64_t blk);
/usr/include/ext2fs/ext2fs.h:extern errcode_t ext2fs_inode_size_set(ext2_filsys fs, struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode, blk64_t lblk,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode_large *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode_large *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode_large *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode_large *inode);
/usr/include/ext2fs/ext2fs.h:extern __u32 ext2fs_get_ea_inode_hash(struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h:extern void ext2fs_set_ea_inode_hash(struct ext2_inode *inode, __u32 hash);
/usr/include/ext2fs/ext2fs.h:extern __u64 ext2fs_get_ea_inode_ref(struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h:extern void ext2fs_set_ea_inode_ref(struct ext2_inode *inode, __u64 ref_count);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode, blk64_t *ret_count);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode, blk64_t goal,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h:struct ext2_inode *ext2fs_file_get_inode(ext2_file_t file);
/usr/include/ext2fs/ext2fs.h:errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h:errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h:errcode_t ext2fs_iblk_set(ext2_filsys fs, struct ext2_inode *inode, blk64_t b);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h:extern void ext2fs_free_inode_cache(struct ext2_inode_cache *icache);
/usr/include/ext2fs/ext2fs.h:extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h: ext2_inode_scan *ret_scan);
/usr/include/ext2fs/ext2fs.h:extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
/usr/include/ext2fs/ext2fs.h:extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h:extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
/usr/include/ext2fs/ext2fs.h: (ext2_inode_scan scan,
/usr/include/ext2fs/ext2fs.h: ext2_inode_scan scan,
/usr/include/ext2fs/ext2fs.h:extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode * inode,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode * inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode * inode,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode * inode,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode * inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode * inode,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode * inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode,
/usr/include/ext2fs/ext2fs.h:int ext2fs_is_fast_symlink(struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h:extern void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode_large *f, int hostorder,
/usr/include/ext2fs/ext2fs.h:extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *f, int hostorder);
/usr/include/ext2fs/ext2fs.h:extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode);
/usr/include/ext2fs/ext2fs.h:extern struct ext2_inode *ext2fs_inode(struct ext2_inode_large * large_inode);
/usr/include/ext2fs/ext2fs.h:extern const struct ext2_inode *ext2fs_const_inode(const struct ext2_inode_large * large_inode);
/usr/include/ext2fs/ext2fs.h: struct ext2_inode *inode)
/usr/include/ext2fs/ext2fs.h:_INLINE_ struct ext2_inode *ext2fs_inode(struct ext2_inode_large * large_inode)
/usr/include/ext2fs/ext2fs.h: return (struct ext2_inode *) large_inode;
/usr/include/ext2fs/ext2fs.h:_INLINE_ const struct ext2_inode *
/usr/include/ext2fs/ext2fs.h:ext2fs_const_inode(const struct ext2_inode_large * large_inode)
/usr/include/ext2fs/ext2fs.h: return (const struct ext2_inode *) large_inode;
$
А потому сабж. Спасибо, кто откликнется. Debian 12.11 Надеюсь, хидеры есть не левые какие-нибудь, а из родных репозиториев, просто я почему-то не могу их пока найти.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21242
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение Bizdelnick »

Есть какие-то основания полагать, что структура должна называться именно ext4_inode и чем-то отличаться от ext2_inode?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1085
ОС: астралинукс

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение жучара »

Bizdelnick писал:
10.07.2025 22:27
Есть какие-то основания полагать, что структура должна называться именно ext4_inode и чем-то отличаться от ext2_inode?
ну основание такое, что если бы это было одно и тоже, то оно так бы и было здесь написано, типа это одно и то же. Ведь не дураки же они, описывать заново уже имеющуюся структуру, у которой кроме названия, ничего не изменено. Ну и да, я не верю, что они вдруг забыли в хидерах написать:

Код: Выделить всё

typedef ext2_inode ext4_inode;
просто не верю. А если бы одно было одно и тоже, то эта запись всё бы и решила- объявляй себе переменную типа ext4_inode, а за справкой обращайся по ссыли. Всё лаконично и логично.

И размеры у структур разные
https://docs.kernel.org/filesystems/ext4/dynamic.html#inode-size
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21242
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение Bizdelnick »

Вы же, вроде, не первый год в профессии. Надо бы знать, что префиксы в идентификаторах из сишных библиотек обычно обозначают просто принадлежность к этой библиотеке, а-ля неймспейс. Не более того.
Добавлено (07:46):
А зачем Вы в доку по коду ядра смотрите? Вы ядерный модуль писать собрались? Тогда в заголовках ядра ищите этот ext4_inode (пакет linux-headers-* для Вашей версии ядра). Если же работаете в юзерспейсе, Вам от того, как что реализовано в ядре, толку никакого. Ну разве что для общего развития.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1085
ОС: астралинукс

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение жучара »

Bizdelnick писал:
11.07.2025 07:43
Вы же, вроде, не первый год в профессии. Надо бы знать, что префиксы в идентификаторах из сишных библиотек обычно обозначают просто принадлежность к этой библиотеке, а-ля неймспейс. Не более того.
честно ничё не понял. Осторожно замечу, что пусть они там что угодно обозначают, мне бы хидер правильный.
Bizdelnick писал:
11.07.2025 07:43
А зачем Вы в доку по коду ядра смотрите? Вы ядерный модуль писать собрались? Тогда в заголовках ядра ищите этот ext4_inode (пакет linux-headers-* для Вашей версии ядра). Если же работаете в юзерспейсе, Вам от того, как что реализовано в ядре, толку никакого. Ну разве что для общего развития.
чё есть то и смотрю. Прошерстил все linux-headers-*, их у меня 13, а хидеров в них 32464. Мелькает только ext4_inode_info, а ext4_inode, увы, нет.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3051
ОС: Gentoo

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение ormorph »

жучара писал(а):
11.07.2025 20:24
чё есть то и смотрю. Прошерстил все linux-headers-*, их у меня 13, а хидеров в них 32464. Мелькает только ext4_inode_info, а ext4_inode, увы, нет.
Ну так он и говорит что вам конкретно нужно. Если модуль ядра то смотреть именно в исходниках ядра. В исходниках ядра есть эта структура в fs/ext4/ext4.h. Но я сомневаюсь что это будет ещё где то кроме самого ядра.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21242
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение Bizdelnick »

жучара писал(а):
11.07.2025 20:24
мне бы хидер правильный
А какой для Вас правильный? Что Вы с ним делать-то собираетесь?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1085
ОС: астралинукс

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение жучара »

ormorph писал(а):
11.07.2025 21:35
Ну так он и говорит что вам конкретно нужно. Если модуль ядра то смотреть именно в исходниках ядра. В исходниках ядра есть эта структура в fs/ext4/ext4.h. Но я сомневаюсь что это будет ещё где то кроме самого ядра.
спасибо, реально помогли. Только хотелось бы, чтобы это хидер был частью системы, ну то есть чтобы я установил какой-нибудь там пакет и всё автоматом по своим местам установилось. Я, конечно, и по-простому его могу подключить:

Код: Выделить всё

#include "ext4.h"
И даже чё-нибудь может у меня получиться, но это до поры до времени. Если же хидер будет частью устанавливаемого пакета, будет хоть какая-то гарантия, что никаких конфликтов не произойдёт.
Bizdelnick писал:
11.07.2025 22:52
А какой для Вас правильный? Что Вы с ним делать-то собираетесь?
который устанавливается в систему автоматом при установке какого-нибудь пакета (хоть какая-то гарантия что ничто ни с чем конфликтовать не будет). Собираюсь я объявлять переменные типа ext4_inode и ковыряться с инодами.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21242
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение Bizdelnick »

:doh:
Как Вы с ними ковыряться планируете? Для этого библиотека нужна, которая будет запись десереализовать в структуру и сериализовать из неё. Если Вы это самостоятельно реализовывать планируете, то и структуру сами объявляйте, на фига Вам заголовок.
Или Вы наивно полагаете, что представление иноды на диске ничем не отличается от представления структуры в памяти?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 3051
ОС: Gentoo

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение ormorph »

Bizdelnick писал:
12.07.2025 20:14
на фига Вам заголовок.
Ну тут и я могу догадаться, просто получение адресов. Раз уж ковыряется, то видно легче усваивается изучение на практике, кому как легче. Это можно увидеть по документации что он выложил. Тут как раз библиотеки не нужны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1085
ОС: астралинукс

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение жучара »

Bizdelnick писал:
12.07.2025 20:14
:doh:
Как Вы с ними ковыряться планируете? Для этого библиотека нужна, которая будет запись десереализовать в структуру и сериализовать из неё. Если Вы это самостоятельно реализовывать планируете, то и структуру сами объявляйте, на фига Вам заголовок.
Или Вы наивно полагаете, что представление иноды на диске ничем не отличается от представления структуры в памяти?
вы зачем на термины переходите без надобности- я про "сериализовывать"?

...Получаю сперва начало ext4, как-то так:

Код: Выделить всё

FILE* fp = fopen ("dev/sda1", "rb")
Дальше дело техники. Получаю суперблок. Получаю номер группы, где находится нужный инод. Получаю его индекс в таблице инодов. Получаю саму таблицу инодов. Получаю смещение инода внутри таблицы. Получаю сам инод. Дампирую, ковыряюсь, как-то так.

Я эту штуку проделывал несколько лет назад, без сериализации вроде обходился. Но там была структура ext2_inode. Теперь снова возникла в этом надобность, не хочется использовать заведомо неправильный код (структура ext2_inode, а файловая система ext4)
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21242
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение Bizdelnick »

Ну, то есть Вы таки
Bizdelnick писал:
12.07.2025 20:14
наивно полагаете, что представление иноды на диске ничем не отличается от представления структуры в памяти
Это в общем случае невозможно. Хотя бы потому что то, как структура выглядит в памяти, архитектуроспецифично. Порядок битов в big/little endian, выравнивание, вот это всё. А на диск инода записывается в переносимом виде, потому что ФС должна работать, если накопитель переставят в машину с совершенно другой архитектурой.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1085
ОС: астралинукс

Re: Где взять структуры для ext4? (ext4_inode и другие; должен же хидер какой-то быть)

Сообщение жучара »

Bizdelnick писал:
14.07.2025 20:47
Ну, то есть Вы таки
Bizdelnick писал:
12.07.2025 20:14
наивно полагаете, что представление иноды на диске ничем не отличается от представления структуры в памяти
Это в общем случае невозможно. Хотя бы потому что то, как структура выглядит в памяти, архитектуроспецифично. Порядок битов в big/little endian, выравнивание, вот это всё. А на диск инода записывается в переносимом виде, потому что ФС должна работать, если накопитель переставят в машину с совершенно другой архитектурой.
не понял. Да и мне не нужно это пока.
Я просто читаю маны.
Спасибо сказали: