Часть 6 из 8
Типы файлов, inode и ссылки
В этой части рассмотрим типы объектов файловой системы, устройство inode и два вида ссылок: жёсткие и символические.
6.1 Типы объектов файловой системы
Каталоги, устройства и ссылки в Linux тоже являются объектами файловой системы, но разных типов. Тип обозначается первым символом строки в выводе ls -l.
| Символ | Тип объекта |
|---|---|
- | обычный файл |
d | каталог |
l | символическая ссылка |
c, b | символьное и блочное устройство |
s | сокет — файл для обмена данными между программами |
Тип объекта не говорит о содержимом обычного файла: и текстовый документ, и исполняемая программа имеют тип -. Содержимое определяет команда file, которая анализирует сами данные. Расширение имени в Linux на тип и содержимое файла не влияет.
Строка подробного вывода ls -l состоит из нескольких полей. Разберём строку -rw-rw-r-- 1 ubuntu ubuntu 17 Sep 14 18:52 data/info.txt:
| Поле | Значение |
|---|---|
- | тип объекта: обычный файл |
rw-rw-r-- | права доступа: кто может читать, изменять и запускать файл |
1 | число жёстких ссылок на файл |
ubuntu ubuntu | владелец файла и группа |
17 | размер в байтах |
Sep 14 18:52 | дата и время последнего изменения |
data/info.txt | имя файла |
cd ~/linux-fhs-labчто делает
Что делает команда. Переходит в рабочий каталог урока linux-fhs-lab.
По частям:
cd- сменить текущий каталог
~/linux-fhs-lab- куда перейти (путь от домашнего каталога)
file data/info.txt /usr/bin/python3 /dev/null# анализ содержимогочто делает
Что делает команда. Определяет, что находится в трёх объектах: текст, ссылка и устройство.
По частям:
file- определить, что находится в файле
data/info.txt- какой файл проверить (путь относительно текущего каталога)
/usr/bin/python3- какой файл проверить (абсолютный путь)
/dev/null- какой файл проверить (абсолютный путь)
file -L /usr/bin/python3# содержимое файла, на который указывает ссылкачто делает
Что делает команда. Проходит по ссылке python3 и определяет тип самой программы.
По частям:
file- определить, что находится в файле
-L- если это ссылка, проверить файл, на который она указывает
/usr/bin/python3- какой файл проверить (абсолютный путь)
ls -ld data data/info.txt /bin /dev/null# четыре объекта разных типовчто делает
Что делает команда. Показывает четыре объекта разных типов, чтобы сравнить первые буквы строк: d, -, l, c.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
-d- показать сам каталог, а не его содержимое
data- что показать
data/info.txt- что показать (путь относительно текущего каталога)
/bin- что показать (абсолютный путь)
/dev/null- что показать (абсолютный путь)
- 1file определил содержимое как текст
- 2символы типа: l, c, d, -
Весь снимок ↗Объекты разных типов и результат команды file.
Что показывает снимок. Команда file определяет содержимое файлов, а первая буква в выводе ls -ld — тип объекта: l, c, d и -.
Где это пригодится. Если файл не открывается, file подскажет, что в нём на самом деле: текст, архив или программа, — независимо от расширения.
6.2 inode и жёсткие ссылки
Сведения о файле и его имя хранятся в разных местах. Тип, права доступа, владелец, размер, время изменения и расположение данных на диске записаны в структуре, которая называется inode. У каждого inode есть номер. Имени в inode нет: имена хранятся в каталогах. Каталог — это список соответствий «имя — номер inode».
Для сравнения подойдёт записная книжка с телефонами. В книжке записаны имя и номер, а сам человек существует отдельно от записи. Каталог устроен так же: в нём хранится имя файла и номер inode. Сам inode — это сведения о файле и ссылка на его данные.
Поскольку имя отделено от inode, на один inode могут указывать несколько имён. Дополнительное имя называется жёсткой ссылкой и создаётся командой ln. Все имена равноправны. В inode хранится счётчик ссылок; данные файла удаляются, только когда удалено последнее имя.
В той же аналогии жёсткая ссылка — это вторая запись в книжке с другим именем, но с тем же номером телефона. Если удалить одну запись, до человека всё равно можно дозвониться по второй.
Когда программа открывает файл data/info.txt, система выполняет три шага. Сначала в каталоге data находит имя info.txt и номер inode. Затем по номеру читает inode и проверяет, есть ли у пользователя право на чтение. После этого по сведениям из inode находит на диске блоки с данными и читает их.
cd ~/linux-fhs-labчто делает
Что делает команда. Переходит в рабочий каталог урока linux-fhs-lab.
По частям:
cd- сменить текущий каталог
~/linux-fhs-lab- куда перейти (путь от домашнего каталога)
stat data/info.txt# сведения из inodeчто делает
Что делает команда. Выводит все сведения о файле из inode: размер, номер inode, число ссылок, права и даты.
По частям:
stat- вывести сведения о файле из inode
data/info.txt- о каком файле (путь относительно текущего каталога)
ls -li data/info.txt# номер inode и число ссылокчто делает
Что делает команда. Показывает файл вместе с номером inode и числом ссылок.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
-i- добавить номер inode в начало строки
data/info.txt- что показать (путь относительно текущего каталога)
ln data/info.txt data/info-hard.txt# создать второе имячто делает
Что делает команда. Создаёт жёсткую ссылку — второе имя info-hard.txt для того же файла.
По частям:
ln- создать ссылку на файл
data/info.txt- файл, на который делается ссылка (путь относительно текущего каталога)
data/info-hard.txt- имя новой ссылки (путь относительно текущего каталога)
ls -li data/info*# сравнить два именичто делает
Что делает команда. Показывает все файлы, чьи имена начинаются с info, вместе с номерами inode.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
-i- добавить номер inode в начало строки
data/info*- что показать (путь относительно текущего каталога; звёздочка заменяет любые символы)
- 1номер inode
- 2число ссылок до ln
- 3одинаковый номер inode у двух имён
- 4число ссылок после ln
Весь снимок ↗Два имени указывают на один inode.
Что показывает снимок. stat показывает сведения из inode, а после ln у двух имён одинаковый номер inode и счётчик ссылок равен 2.
Где это пригодится. Жёсткие ссылки позволяют сделать один файл доступным под двумя именами без копирования. Этим пользуются программы резервного копирования: неизменённые файлы в новой копии не дублируются, а связываются жёсткими ссылками.
6.3 Символические ссылки
Символическая ссылка устроена иначе. Это отдельный объект со своим inode, в котором записан путь к другому файлу. При обращении к ссылке система переходит по записанному пути. Символическая ссылка может указывать на каталог или на файл в другой файловой системе, например /bin указывает на /usr/bin. Если файл по записанному пути удалить, ссылка перестанет работать.
Символическая ссылка работает как ярлык на рабочем столе Windows. Ярлык хранит только адрес программы. Если программу удалить или перенести, ярлык останется на месте, но открыть через него уже ничего не получится.
cd ~/linux-fhs-labчто делает
Что делает команда. Переходит в рабочий каталог урока linux-fhs-lab.
По частям:
cd- сменить текущий каталог
~/linux-fhs-lab- куда перейти (путь от домашнего каталога)
ln -s data/info.txt info-link.txt# создать ссылкучто делает
Что делает команда. Создаёт символическую ссылку info-link.txt, которая хранит путь data/info.txt.
По частям:
ln- создать ссылку на файл
-s- создать символическую ссылку; без -s создаётся жёсткая
data/info.txt- файл, на который делается ссылка (путь относительно текущего каталога)
info-link.txt- имя новой ссылки (путь относительно текущего каталога)
ls -l info-link.txtчто делает
Что делает команда. Показывает ссылку и путь, на который она указывает.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
info-link.txt- что показать (путь относительно текущего каталога)
cat info-link.txt# чтение через ссылкучто делает
Что делает команда. Читает файл через ссылку: выводит содержимое файла, на который она указывает.
По частям:
cat- вывести содержимое файла на экран
info-link.txt- какой файл вывести (путь относительно текущего каталога)
readlink info-link.txt# путь, записанный в ссылкечто делает
Что делает команда. Выводит путь, записанный внутри ссылки.
По частям:
readlink- показать, куда указывает символическая ссылка
info-link.txt- какую ссылку проверить (путь относительно текущего каталога)
readlink -f info-link.txt# полный путь целичто делает
Что делает команда. Выводит полный путь к файлу, на который указывает ссылка.
По частям:
readlink- показать, куда указывает символическая ссылка
-f- вывести полный путь цели, пройдя все ссылки
info-link.txt- какую ссылку проверить (путь относительно текущего каталога)
- 1тип l
- 2записанный в ссылке путь
- 3текст целевого файла
Весь снимок ↗Символическая ссылка хранит путь к файлу.
Что показывает снимок. Ссылка info-link.txt хранит путь data/info.txt, а cat читает содержимое целевого файла.
Где это пригодится. Символическими ссылками переключают версии программ и настроек: ссылка указывает на текущую версию, а при обновлении её перенаправляют на новую.
Разница между двумя видами ссылок видна, если удалить исходное имя data/info.txt. Жёсткая ссылка указывает на тот же inode, поэтому данные остаются доступны. Символическая ссылка хранит путь к удалённому имени и перестаёт работать. После повторного создания имени командой ln она снова работает.
cd ~/linux-fhs-labчто делает
Что делает команда. Переходит в рабочий каталог урока linux-fhs-lab.
По частям:
cd- сменить текущий каталог
~/linux-fhs-lab- куда перейти (путь от домашнего каталога)
ls -li data/info.txt data/info-hard.txt info-link.txt# исходное состояниечто делает
Что делает команда. Показывает оба имени файла и ссылку с номерами inode перед опытом.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
-i- добавить номер inode в начало строки
data/info.txt- что показать (путь относительно текущего каталога)
data/info-hard.txt- что показать (путь относительно текущего каталога)
info-link.txt- что показать (путь относительно текущего каталога)
rm data/info.txt# удалить одно имячто делает
Что делает команда. Удаляет имя info.txt. Данные остаются, пока есть второе имя info-hard.txt.
По частям:
rm- удалить файл
data/info.txt- какой файл удалить (путь относительно текущего каталога)
ls -li data/info-hard.txt info-link.txt# после удаления именичто делает
Что делает команда. Показывает, что у файла осталось одно имя, а ссылка стала битой.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
-i- добавить номер inode в начало строки
data/info-hard.txt- что показать (путь относительно текущего каталога)
info-link.txt- что показать (путь относительно текущего каталога)
cat info-link.txt# чтение через символическую ссылкучто делает
Что делает команда. Читает файл через ссылку: выводит содержимое файла, на который она указывает.
По частям:
cat- вывести содержимое файла на экран
info-link.txt- какой файл вывести (путь относительно текущего каталога)
cat data/info-hard.txt# чтение через жёсткую ссылкучто делает
Что делает команда. Читает данные через оставшееся жёсткое имя — текст на месте.
По частям:
cat- вывести содержимое файла на экран
data/info-hard.txt- какой файл вывести (путь относительно текущего каталога)
ln data/info-hard.txt data/info.txt# вернуть имячто делает
Что делает команда. Возвращает имя info.txt тому же файлу, после чего символическая ссылка снова работает.
По частям:
ln- создать ссылку на файл
data/info-hard.txt- файл, на который делается ссылка (путь относительно текущего каталога)
data/info.txt- имя новой ссылки (путь относительно текущего каталога)
cat info-link.txtчто делает
Что делает команда. Читает файл через ссылку: выводит содержимое файла, на который она указывает.
По частям:
cat- вывести содержимое файла на экран
info-link.txt- какой файл вывести (путь относительно текущего каталога)
ls -li data/info.txt data/info-hard.txt# имён снова двачто делает
Что делает команда. Показывает, что у файла снова два имени с одним номером inode.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
-i- добавить номер inode в начало строки
data/info.txt- что показать (путь относительно текущего каталога)
data/info-hard.txt- что показать (путь относительно текущего каталога)
- 1у файла осталось одно имя
- 2ссылка указывает на несуществующий путь
- 3ошибка при чтении через символическую ссылку
- 4данные доступны через жёсткую ссылку
Весь снимок ↗После удаления имени жёсткая ссылка сохранила доступ к данным, символическая перестала работать.
Что показывает снимок. После удаления имени данные остались доступны через жёсткую ссылку, а символическая ссылка перестала работать.
Где это пригодится. Так появляются «битые» ссылки после удаления или переноса файлов. Команда ls выделяет такие ссылки красным цветом.
Итоги части 6
- Тип объекта обозначается первым символом в
ls -l; содержимое определяетfile. - Сведения о файле хранятся в inode, имя — в каталоге.
- Жёсткая ссылка — дополнительное имя того же inode; данные удаляются вместе с последним именем.
- Символическая ссылка хранит путь и перестаёт работать, если по этому пути нет файла.
В отчётСнимки ls -li с одинаковыми номерами inode и опыта с удалением имени.