https://www.kernel.org/doc/html/latest/filesystems/ext4/globals.html#block-group-descriptors
Найдём размер дескриптора группы.On an ext4 filesystem with the 64bit feature enabled, the block group descriptor expands to at least the 64 bytes described below; the size is stored in the superblock.
Код: Выделить всё
//main.c
#include "/usr/include/ext2fs/ext2_fs.h"
#include <stdio.h>
int main ()
{
//Это суперблок. Другого нет
struct ext2_super_block spb;
//Получим суперблок
FILE * fp = fopen ("/dev/sda8", "rb");
if (fp == NULL)
return 1;
fseek (fp, 1024, SEEK_SET);
if (fread (&spb, 1, 1024, fp) < 1024)
return 1;
//Получим в суперблоке размер дескриптора группы.
printf ("размер дескриптора группы суть %d\n", spb.s_desc_size);
printf ("конец\n");
fclose (fp);
return 0;
}
Shell
user@astra:~$ gcc main.c
user@astra:~$ sudo ./a.out
размер дескриптора группы суть 0
конец
user@astra:~$
Код: Выделить всё
struct ext2_super_block {
...
__u16 s_reserved_gdt_blocks; /* Per group table for online growth */
/*
* Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
*/
__u8 s_journal_uuid[16]; /* uuid of journal superblock */
__u32 s_journal_inum; /* inode number of journal file */
__u32 s_journal_dev; /* device number of journal file */
__u32 s_last_orphan; /* start of list of inodes to delete */
__u32 s_hash_seed[4]; /* HTREE hash seed */
__u8 s_def_hash_version; /* Default hash version to use */
__u8 s_jnl_backup_type; /* Default type of journal backup */
__u16 s_desc_size; /* Group desc. size: INCOMPAT_64BIT */
__u32 s_default_mount_opts;
...
};
Мне не понять, а без того, чтобы был журнал, нельзя заполнить уже готовое поле? Но как бы то ни было:
Shell
user@astra:~$ sudo dumpe2fs -h /dev/sda8 | grep "Filesystem features:"
dumpe2fs 1.42.5 (29-Jul-2012)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
user@astra:~$
Теперь по ссылке смотрим пояснения к полю s_desc_size
https://www.kernel.org/doc/html/latest/filesystems/ext4/globals.html#block-group-descriptors
0xFE | __le16 | s_desc_size | Size of group descriptors, in bytes, if the 64bit incompat feature flag is set. |
Size of group descriptors, in bytes, if the 64bit incompat feature flag is set.
И опять позволю себе недоумение: без того, чтобы этот флаг был поднять, размер-то никак не прописать в нужное поле? Может, я недопонимаю чё?
...Надо смотреть флаг INCOMPAT_64BIT. По ссылке же смотрим:
0x60 | __le32 | s_feature_incompat | Incompatible feature set. If the kernel or fsck doesn’t understand one of these bits, it should stop. See the super_incompat table for more info. |
То есть сейчас я полезу в поле s_feature_incompat и посмотрю, есть там у меня флаг INCOMPAT_64BIT соответствующий или нет. Кстати, для этого поля такое пояснение (там же по ссылке):
These fields are for EXT4_DYNAMIC_REV superblocks only
тут я пас. Хрен его знает, что за флаг такой. Но я верю, да, что без него поле s_feature_incompat (и, как следствие, s_desc_size) никак не заполнить. Чёрт его знает, что это такое, но оно должно у меня быть. То ли есть, то ли нет, не понять:
...Глянем, что такое s_feature_incompat, по ссылке же:Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
The superblock incompatible features field is a combination of any of the following:
...
0x80 | Enable a filesystem size of 2^64 blocks (INCOMPAT_64BIT). |
Наперёд скажу, что у меня INCOMPAT_64BIT не определено, поэтому оперировать буду числом 0X80.
Код: Выделить всё
//main_0.c
#include "/usr/include/ext2fs/ext2_fs.h"
#include <stdio.h>
int main ()
{
//Это суперблок. Другого нет
struct ext2_super_block spb;
//Получим суперблок
FILE * fp = fopen ("/dev/sda8", "rb");
if (fp == NULL)
return 1;
fseek (fp, 1024, SEEK_SET);
if (fread (&spb, 1, 1024, fp) < 1024)
return 1;
if ((spb.s_feature_incompat & 0X80 ) == 0X80)
printf ("INCOMPAT_64BIT установлен\n");
printf ("конец\n");
fclose (fp);
return 0;
}
Shell
user@astra:~$ gcc main_0.c
user@astra:~$ sudo ./a.out
конец
user@astra:~$
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
В общем, размер дескриптора группы я, конечно, получил методом научного тыка. Попробовал одну ext4_group_desc, потом другую ext2_group_desc; получилось. Но разве это правильно? Нет, конечно. Я ж сколько мучался-то, пока сообразил, в чём дело. А мог бы просто посмотреть значение нужного поля в суперблоке... Но, оказывается, не мог. Не занесли они почему-то число в нужное поле и придумали такой вот квест.
В общем, друзья, может, я что не так делаю и как посмотреть размер дескриптора группы в соответствуюшем поле. Спасибо, кто откликнется.