Но, если каталог не защищен от записи, пользователи могут удалять файлы, несмотря на отсутствие права доступа к файлу. Если вы хотите быть уверенным в том, что ни вы, ни ваши друзья никогда не удалят файлы из каталога, отмените право на запись для каталога:
$ cd
$ date > temp
$ chmod -w .
Закрыть каталог по записи
$ ls -ld .
dr-xr-xr-x 3 you 80 Sep 27 11:48 .
$ rm temp
rm: temp not removed
Нельзя
удалить файл
$ chmod 775 .
Восстановление прав доступа
$ ls -ld .
drwxrwxr-x 3 you 80 Sep 27 11:48 .
$ rm temp
Теперь можно
$
Файл
temp
теперь удален. Обратите внимание на то, что изменение прав доступа к каталогу не меняет дату последней модификации файла. Дата модификации отражает изменение содержимого файла, а не прав доступа к нему. Права доступа и даты хранятся не в самом файле, а в системной структуре данных, называемой индексным дескриптором (речь о нем пойдет в следующем разделе).
Упражнение 2.5
Поэкспериментируйте с командой
chmod
. Попробуйте разные простые варианты типа 0 или 1. Будьте осторожны, чтобы не испортить свой начальный каталог.
2.5 Индексные дескрипторы
Файл имеет несколько атрибутов: имя, содержимое и служебную информацию (права доступа и даты модификации). Служебная информация размещается в индексном дескрипторе вместе с важной системной информацией, такой, как размер файла, место хранения его на диске и т.д. [8] В индексном дескрипторе хранятся три даты: время последнего изменения файла (записи в него), время последнего использования файла (чтение или выполнение), время последнего изменения самого индексного дескриптора, например изменения прав доступа.
8
Индексный дескриптор обозначается как inode ("index node") или i-node. — Прим. перев.
$ date
Tue Sep 27 12:07:24 EDT 1983 $ date > junk
$ ls -l junk
– rw-rw-rw 1 you 29 Sep 27 12:07 junk
$ ls -lu junk
– rw-rw-rw 1 you 29 Sep 27 06:11 junk
$ ls -lc junk
– rw-rw-rw 1 you 29 Sep 27 12:07 junk
$
Как видно из результата действия команды
ls -lu
, изменение содержимого файла не влияет на дату последнего использования, а с изменением прав доступа связана только дата изменения индексного дескриптора, о чем выдается сообщение командой
ls -lc
:
$ chmod 444 junk
$ ls -lu junk
– r--r--r-- 1 you 29 Sep 27 06:11 junk
$ ls -lc junk
– r--r--r-- 1 you 29 Sep 27 12:11 junk
$ chmod 666 junk $
Можно использовать флаг
– t
команды
ls
, который применяется для сортировки файлов по времени (по умолчанию принимается время последней модификации), совместно с флагами
–
с
или
– r
, чтобы узнать порядок, в котором изменились индексные дескрипторы или читались файлы:
$ ls recipes
apple
pie
$ ls -lut total 2
drwxrwxrwx 4 you 64 Sep 27 12:11 recipes
– rw-rw-rw- 1 you 29 Sep 27 06:11 junk
У каталога
recipes
, как вы видите, более позднее время использования, поскольку мы только что просмотрели его содержимое.
Очень важное понять значение индексного дескриптора, причем не для того, чтобы оценить действие флагов команды
ls
. По существу, индексные дескрипторы и есть файлы. Иерархия каталогов предоставляет только удобный способ именования файлов. Внутреннее системное имя файла или индекс файла — это номер индексного дескриптора, содержащего информацию о файле. Команда
ls -i
выдает индекс файла в десятичной форме:
$ date > x
$ ls -i
15768 junk
15274 recipes
15852 x
$
Именно индекс файла хранится в первых двух байтах каталога, предшествующих имени. Команда
od -d
выдает информацию не в восьмеричной форме по байтам, а в десятичной, объединив по два байта в одно целое, и поэтому мы увидим на экране индекс файла:
Первые два байта в каждой строке каталога являются единственной связью между именем файла и его содержимым. Именно поэтому имя файла в каталоге называется связью: оно связывает имя в иерархии каталогов с индексным дескриптором и, тем самым, с информацией. Один и тот же индекс файла может появиться в нескольких каталогах. Команда
rm
в действительности удаляет не индексный дескриптор, а строку каталога или связь. Только когда последняя связь файла исчезает, система удаляет индексный дескриптор, а значит, и сам файл.
Если индекс файла в строке каталога равен нулю, это означает, что связь удалена, но сам файл не обязательно удален — могут существовать связи где-нибудь еще. Можно убедиться в том, что индекс файла становится равным нулю при удалении файла: