Skip to content

Концепция файла

Dmitry Efanov edited this page Oct 15, 2020 · 1 revision

Типы файлов

  • Типы файлов (обычные, каталоги, символьные, блочные, FIFO, сокеты, символьные ссылки).
  • Ext4 directory file types
#define EXT4_FT_UNKNOWN		0
#define EXT4_FT_REG_FILE	1
#define EXT4_FT_DIR		2
#define EXT4_FT_CHRDEV		3
#define EXT4_FT_BLKDEV		4
#define EXT4_FT_FIFO		5
#define EXT4_FT_SOCK		6
#define EXT4_FT_SYMLINK		7
  • Концепция всё есть файл.

Структура файловой системы на диске

  • Структура файловой системы UNIX. Файловая система Ext4 появилась в ядре Linux 2.6.28.

Индексный дескриптор файла (inode)

Специальные номера inode - Special inode numbers

#define	EXT4_BAD_INO		 1	/* Bad blocks inode */
#define EXT4_ROOT_INO		 2	/* Root inode */
#define EXT4_USR_QUOTA_INO	 3	/* User quota inode */
#define EXT4_GRP_QUOTA_INO	 4	/* Group quota inode */
#define EXT4_BOOT_LOADER_INO	 5	/* Boot loader inode */
#define EXT4_UNDEL_DIR_INO	 6	/* Undelete directory inode */
#define EXT4_RESIZE_INO		 7	/* Reserved group descriptors inode */
#define EXT4_JOURNAL_INO	 8	/* Journal inode */

Максимальное количество ссылок на файл - Maximal count of links to a file

#define EXT4_LINK_MAX 65000

Структура дискового inode - Structure of an inode on the disk

  • Свойства файла. Имя файла. Метаданные. Данные файла (содержимое файла).
#define	EXT4_NDIR_BLOCKS		12
#define	EXT4_IND_BLOCK			EXT4_NDIR_BLOCKS
#define	EXT4_DIND_BLOCK			(EXT4_IND_BLOCK + 1)
#define	EXT4_TIND_BLOCK			(EXT4_DIND_BLOCK + 1)
#define	EXT4_N_BLOCKS			(EXT4_TIND_BLOCK + 1)

Основные поля struct ext4_inode

struct ext4_inode {
	__le16	i_mode;		/* File mode */
	__le16	i_uid;		/* Low 16 bits of Owner Uid */
	__le16	i_gid;		/* Low 16 bits of Group Id */
	__le32	i_size_lo;	/* Size in bytes */
	__le32	i_atime;	/* Access time */
	__le32	i_ctime;	/* Inode Change time */
	__le32	i_mtime;	/* Modification time */
	__le32	i_dtime;	/* Deletion Time */
	__le32  i_crtime;       /* File Creation time */
	__le16	i_links_count;	/* Links count */
	__le32	i_blocks_lo;	/* Blocks count */
	__le32	i_flags;	/* File flags */
	__le32	i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
	__le32	i_file_acl_lo;	/* File ACL */
};

Расширенные атрибуты

struct ext4_inode {
...
	__le32	i_file_acl_lo;	/* File ACL */
	__le16	l_i_file_acl_high;
	__le16	i_extra_isize;
...
};

struct ext4_xattr_header {
	__le32	h_magic;	/* magic number for identification */
	__le32	h_refcount;	/* reference count */
	__le32	h_blocks;	/* number of disk blocks used */
	__le32	h_hash;		/* hash value of all attributes */
	__le32	h_checksum;	/* crc32c(uuid+id+xattrblock) */
				/* id = inum if refcount=1, blknum otherwise */
	__u32	h_reserved[3];	/* zero right now */
};

struct ext4_xattr_ibody_header {
	__le32	h_magic;	/* magic number for identification */
};

/* Name indexes */
#define EXT4_XATTR_INDEX_USER			1
#define EXT4_XATTR_INDEX_POSIX_ACL_ACCESS	2
#define EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT	3
#define EXT4_XATTR_INDEX_TRUSTED		4
#define	EXT4_XATTR_INDEX_LUSTRE			5
#define EXT4_XATTR_INDEX_SECURITY	        6
#define EXT4_XATTR_INDEX_SYSTEM			7
#define EXT4_XATTR_INDEX_RICHACL		8
#define EXT4_XATTR_INDEX_ENCRYPTION		9

struct ext4_xattr_entry {
	__u8	e_name_len;	/* length of name */
	__u8	e_name_index;	/* attribute name index */
	__le16	e_value_offs;	/* offset in disk block of value */
	__le32	e_value_inum;	/* inode in which the value is stored */
	__le32	e_value_size;	/* size of attribute value */
	__le32	e_hash;		/* hash value of name and value */
	char	e_name[0];	/* attribute name */
};

typedef struct {
	__le16		e_tag;
	__le16		e_perm;
	__le32		e_id;
} ext4_acl_entry;

Если inode.i_extra_isize = 28 и sb.inode_size = 256, тогда для расширеннных атрибутов в иноде будет 256 - (128 + 28) = 100 байт.

Структура файловой системы с точки зрения процесса

  • Файловая система ОС GNU/Linux с точки зрения процесса (пользователя). Монтирование файловой системы.
  • Структура каталогов. hier(7). Путь к файлу (абсолютный и относительный). Текущий рабочий каталог. Домашний каталог пользователя. Имя файла. glob(7).
  • Структура каталога. Жёсткая ссылка (hard link). Номер inode корневого каталога. Записи . и ... Количество жёстких ссылок на обычный файл и на каталог после создания.

Структура записи каталога - Structure of a directory entry

#define EXT4_NAME_LEN 255

struct ext4_dir_entry_2 {
	__le32	inode;			/* Inode number */
	__le16	rec_len;		/* Directory entry length */
	__u8	name_len;		/* Name length */
	__u8	file_type;
	char	name[EXT4_NAME_LEN];	/* File name */
};

Алгоритм поиска файла в файловой системе (разрешение путевого имени)

Управление каталогами

  • Создание, копирование, перемещение и удаление каталогов (mkdir, cp -r, mv, rmdir, rm -r).

Обычный файл

  • Системные вызовы для работы с файлом (open-read-write-lseek-close). Пример copy.c/copy.c)
  • Командный интерфейс для создания, вывода содержимого, копирования, перемещения и удаления файла (touch, cat, cp, mv, rm). Создание жёстких ссылок на файл (ln). Пакет coreutils.
  • Дескриптор открытого файла. Перенаправление ввода/вывода. Конвейер.
  • Команды фильтры.
  • Поиск файлов по атрибутам (find, xargs). Пакет findutils.
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
   Find  files  named core in or below the directory /tmp and delete them,
   processing filenames in such a way that file or  directory  names  con‐
   taining spaces or newlines are correctly handled.
  • Поиск по содержимому файла по заданному шаблону (grep). regex(7). Пакет grep.

Другие файлы

  • Символьные ссылки (ln -s).
  • Каналы (mkfifo).

Командный интерфейс

Обычный файл Каталог FIFO
Создание >, touch, cp, mv mkdir mkfifo mknod
Чтение cat, head, tail, grep ls, find
Запись (модификация) > >, ln, cp, mv, rm
Удаление rm rmdir, rm -r

Команды

  • Команды для работы с файлами: file, stat, touch, cp, mv, ln, rm, find, mknod, mkfifo.
  • Команды для работы с каталогами: pwd, cd, ls, mkdir, rmdir.
  • Команды для работы с содержимым файлов: cat, split, more, less, od, cut, grep, sort, wc, tr, uniq, head, tail, fold.

Лабораторная работа

  1. Лабораторная работа "Работа в командной строке"
  2. Лабораторная работа "Управление файловыми системами"

Ссылки

  1. Inode Table
  2. struct ext4_inode
  3. struct ext4_xattr_entry
  4. ext4_acl_entry
Clone this wiki locally