Как определить размер дескриптора группы блоков файловой системы?

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

Модератор: Bizdelnick

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

Как определить размер дескриптора группы блоков файловой системы?

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

Друзья! У меня ext4, устройство /dev/sda8. Читаем тут.

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:~$
Не ругнулся и на том спасибо. Но ноль. Почему? Смотрим структуру ext2_super_block (файл /usr/include/ext2fs/ext2_fs.h), привожу отрывок.

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

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;
	...
};
Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.

Мне не понять, а без того, чтобы был журнал, нельзя заполнить уже готовое поле? Но как бы то ни было:

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:~$
Вроде EXT2_FEATURE_COMPAT_HAS_JOURNAL есть, (первая настройка has_journal).

Теперь по ссылке смотрим пояснения к полю 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) никак не заполнить. Чёрт его знает, что это такое, но оно должно у меня быть. То ли есть, то ли нет, не понять:
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
...Глянем, что такое s_feature_incompat, по ссылке же:

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:~$
Не установлен у меня флаг INCOMPAT_64BIT, а значит, в том месте, где должен быть размер дескриптора группы, у меня ноль.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

В общем, размер дескриптора группы я, конечно, получил методом научного тыка. Попробовал одну ext4_group_desc, потом другую ext2_group_desc; получилось. Но разве это правильно? Нет, конечно. Я ж сколько мучался-то, пока сообразил, в чём дело. А мог бы просто посмотреть значение нужного поля в суперблоке... Но, оказывается, не мог. Не занесли они почему-то число в нужное поле и придумали такой вот квест.

В общем, друзья, может, я что не так делаю и как посмотреть размер дескриптора группы в соответствуюшем поле. Спасибо, кто откликнется.
Последний раз редактировалось /dev/random 21.01.2020 13:20, всего редактировалось 1 раз.
Причина: добавил слово "блоков" в заголовок
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 5110
ОС: Gentoo

Re: Как определить размер дескриптора группы файловой системы?

Сообщение /dev/random »

жучара писал(а):
21.01.2020 12:19
Не занесли они почему-то число в нужное поле и придумали такой вот квест.

В общем, друзья, может, я что не так делаю и как посмотреть размер дескриптора группы в соответствуюшем поле. Спасибо, кто откликнется.
Помните, я вам говорил, что ext* развивается путём добавления новых опциональных расширений? 64bit - одно из них. До его появления размер дескриптора группы блоков всегда был 32 байта. Расширение 64bit, помимо прочего, ввело возможность указания для него разных размеров в упомянутом поле. Если оно включено, смотрите в это поле. Если выключено, то ответ - 32 байта.
Спасибо сказали:

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

Re: Как определить размер дескриптора группы файловой системы?

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

Да интересный подход. Как изменить константу, даже если поле под неё не выделено? А поднять флаг и поле будет выделено. Ну... так. Как-то. Оно, конечно, автоматически ищется, трудозатраты стремятся к нулю, говорить трудности поиска размера дескриптора групп не приходится (если знаешь, что к чему, конечно). Но я, гад такой, не могу не задать вопрос- а чё сразу-то поля не выделили под размер? Не предполагали, что размер может изменится- с их-то опытом?
Я просто читаю маны.
Спасибо сказали: