forked from mizabrik/acos-notes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfs.tex
More file actions
169 lines (147 loc) · 14.2 KB
/
fs.tex
File metadata and controls
169 lines (147 loc) · 14.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
\documentclass[main]{subfiles}
\begin{document}
\chapter{Файловая система}
\section{Права на файлы}
Помимо прав на чтение, запись и запуск, настолько очевидных, что их даже не
обсудили на лекции, есть следующие свойства файла:
setuid-бит (s): если у запускаемого исполняемоего файла установлен этот бит, то процессу
будут выданы права не запускающего пользователя, а владельца файла.
sticky-бит (t): удалять файлы может только их владелец.
\section{Виды ФС}
\begin{enumerate}
\item Псевдо-ФС: они хранятся только в оперативной памяти. Например, для хранения
initrd.
\item На надёжных носителях
\item На ненадёжных носителях (жёсткий диск, flash, магнитна лента)
\item Сетевые (например, NFS, CIFS): предназначены для доступа к файлам, которые
хранятся на другом устройстве, доступном по сети.
\item Распределённые файловые системы (AFS, GPFS, Lustre): данные хранятся
распределённо на нескольких ПК (в отличии от одного сервера для сетевых ФС).
\end{enumerate}
С точки зрения работы с данными:
\begin{description}
\item[Простые] Изменения выполняются в лоб, откатить их очень сложно или
невозможно.
\item[Журналируемые] Используется "журнал", который позволяет сохранять
ФС в консистентом состоянии. Сложные операции складываются в журнал и стираются
из него после завершения, что позволяет определить их успешность даже после
серьёзного сбоя.
\item[Транзакционные] Хранятся почти все изменения, как в системе контроля
версий, что позволяет сделать срез состояния ФС на любую дату: журнал не
очищается. Конечно, это требует дополнительного пространства.
\end{description}
\section{Устройство ФС}
Тут следует вернуться к истории. Изначально файлы хранились на магнитных
лентах, и для доступа к данным их треовалось затратно перематывать.
Если бы данные о файлах в каждом каталоге хранились в разных местах, то,
возможно, пришлось бы часто перематывать ленту для доступа к файлу с высоким
уровнем вложенностью.
Именно поэтому, заводился один каталог (он обычно дублировался в целях
отказоустойчивости), где хранилась информакция о всех файлах.
Их имя, смещение на ленте, размер, даты доступа, права на файл.
Главный недостаток таких ФС --- это проблема внешней фрагментации.
Даже если суммарно свободного места достаточно, может быть, что мы не
сможем записать большой файл последовательно, если все участки свободного места
имеют недостаточный размер в отдельности.
Типичным примером такой ФС является tar, который изначально создавался
для записи файлов на магнитную ленту. Сюда же относятся ФС для оптических
дисков: UDF, ISO 9660 (и различные модификации).
На оптических дисках поддерживается механизм сессии: за раз записывается только
часть дорожек, они образуют полноценную ФС. Таким образом можно удалять и менять
файлы даже на дисках с одноразовой записью, добавляя к изначальной сессии
специальные сессии-патчи, которые содержат новые версии каталога файлов, но
могут использовать данные прошлых сессий. Именно так поступает UDF.
Обычно ФС используют LBA, когда диск разбивается на блоки фиксированного размера,
который задаёт наименьший объём данных, которые можно считать или записать.
Каждый файл разбивается на блоки и записывается в таком виде, возможно,
не подряд. Такой подход решает проблему внешней фрагментации: если суммарно
достаточно свободного места, мы можем записать новый файл без перемещения
старых.
Однако, появляется проблема внутренней фрагментации. В зависимости от размера
файлов эффективными являются разные размеры блоков: если файлы меньше размеров
блоков, то оставшееся пространство в блоках будет неиспользованным.
Обычно в самом начале ФС находится суперблок со служебной информацией.
\section{FAT}
Суперблок начинается с двукратного повторения слова FAT.
Все блоки разбиваются на типы: данных (D), своп (S), испорченые (B)
и свободные (F).
Сразу после суперблока находится корневой каталог.
Файлы разбиваются на блоки, в конце которого находится номер следующего
блока (и 0 для последнего). Соответственно, доступ к середине файла
всё равно потребует обращения ко всем блокам файла.
В более новых ФС используется следующий подход. Блоки разбиты на следующие
типы:
\begin{enumerate}
\item Суперблок. Один общий для диска и по одному на группу (совокупность
блоков индексов и данных). Общий, зачастую дублируется.
Содержит тип ФС, количество свободных и занятх блоков, дата создания,
дата монтирования и адрес, число индексных дескрипторов и смонтирована
ли она (позволяет проврить, завершилась ли работа с ней корректно).
\item Индексные блоки. У каждой группы есть область индексных дескрипторов,
обычно после суперблока группы. Индексный дескриптор --- это запись, которая
указывает на некоторый объект файловой системы, имеет фиксированный размер
и уникальный номер. Там хранится тип объекта (кодируется числом, обычно есть
каталог, символическая ссылка, файл, для UNIX --- FIFO, сокеты семейства
AF\_UNIX, файлы устройств (см. mknoede)), права, владелец + группа,
даты доступа и изменения, счётчик жёстких ссылок (фактически, количество имён).
Есть также параметры, которые зависят от файловой системы, обычно хранится
только ссылка на прочие атрибуты в отдельном блоке. Кроме того,
дополнительная информация может быть сохранена в xattr.
Наконец, там находится массив блоков этого объекта. Он достаточно короткий,
в ext2 --- всего четырнадцать элементов.
\item Блоки данных
\end{enumerate}
Обычно, ФС поддерживают следующие типы индексных дескрипторов:
\begin{description}
\item[Файл, каталог] Данные хранятся в отдельных блоках. Их номера хранятся в
самом дескрипторе, обычно этот массив достаточно короткий (14 элементов в ext2).
Первые несколько блоков --- блоки прямой адресации, позволяют хранить
небольшие файлы (в зависимости от размера блока) без дополнительных издержек
(12 в ext2).
Для файлов большего размера остальные блоки (ещё 1) ссылаются на блоки данных со
ссылками на другие блоки данных, которые ссылаются на сами данные.
Последний же элемент, ссылается на список блоков уже трёх уровней вложенности.
\item[Символичесские ссылки] Не обрабатывается самой ФС, но указывает операционной
системе имя файла, по которому нужно обратиться к файлу (если не слишком длинный,
то путь сохранится в самом дескрипторе, иначе --- в блоке данных). Могут стать
некорректными, если, например, удалить файл-цель.
\item[FIFO]
\item[PF\_UNIX]
\item[Устройства] Ассоциируются с драйвером с помощью major и minor number.
См. mknode.
\end{description}
Каталог содержит записи со следующими данными: номер ИД, смещение до следующей
записи, тип файла и имя файла, это и есть жёсткие ссылки.
Таким образом, имена файлов хранятся только в
каталогах. Кроме того, зарезервированы следующие имена файлов: "." --- тот же
каталог и ".." --- на каталог уровнем выше (на себя для корневого).
\section{Файловая системы с дырками}
Обычно на каждый сегмент данных должна существовать только одна ссылка.
Это правило нарушается, если ФС поддерживает "дырки". Например, если
есть большой файл, целиком состоящий из нулей, можно все блоки сохранить
в одном. Блок этот доступен для чтения, и при попытке записи он
будет отображён в новый блок.
\section{Проблемы}
\begin{description}
\item[Исчерпание места для индексных дескрипторов] Драйвер автоматически
выделит больше блоков для таблиц ИД за счёт места для данных.
\item[Некорректное завершение работы] Все сложные действия вносятся в
файл журнала (и принудительно записываются), потом выполняются и удалаются
из журнала. Если будут обнаружены незавершённые действия при монтировании,
они будут откачены.
\item[Внешние изменения] Если данные повреждаются по внешним причинам,
то мы можем отследить это только в некоторых типах RAID.
Кроме того, могут нарушится данные самой ФС:
\begin{itemize}
\item Испорченный суперблок или разница в суперблоке и копии.
\item Повреждение индексного дескриптора
\item Повреждение информации о занятости блока.
\end{itemize}
\item[Износ] SMART --- это технология, которая позволяет запросить у жёсткого диска
информацию о состоянии диска (колическо запусков, максимальная температура и
т. д.). Так же можно получить realllocation sectors count --- количество
переадресованных блоков. При ошибки чтения/записи блок будет скопирован
в другое место и далее чтение этого блока будет происходить оттуда.
По увеличению этого параметра можно понять, что диск приходит в негодность.
\end{description}
\end{document}