Концепция файла - efanov/mephi GitHub Wiki
Типы файлов
- Типы файлов (обычные, каталоги, символьные, блочные, 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 байт.
-
Вывод атрибутов файлов (
ll
,stat
,debugfs
).
Структура файловой системы с точки зрения процесса
- Файловая система ОС 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
.
Лабораторная работа
- Лабораторная работа "Работа в командной строке"
- Лабораторная работа "Управление файловыми системами"