Вопрос или проблема
Я установил Linux в феврале этого года. Теперь, когда я перечислил домашний каталог с помощью ls -la
, почему время отображается так:
drwx------ 20 chuck_user chuck_user 4096 Jul 5 2024 .
Почему время Jul 5 2024
и почему оно отличается от других дат?
Вопрос отличается от Что делает ‘ls -la’?
потому что там спрашивалось только о том, что делает ls -la
. Но я хочу знать причину, почему временная метка для каталога .
не совпадает с временем, когда я установил Linux. Временная метка Jul 4 2024
, хотя я установил в феврале 2025 года.
Временная метка каталога (в данном случае .
, который является текущим каталогом) будет иметь временную метку последнего измененного файла внутри этого каталога.
В случае домашнего каталога (~
), если вы не изменяли файлы, временная метка будет из прошлого.
Однако, обычно файл .bash_history
внутри ~
изменяется каждый раз, когда вы выполняете команду в терминале, поэтому, скорее всего, временная метка вашего домашнего каталога ~
будет обновлена в следующий раз, когда вы войдете в систему (по крайней мере, так это происходит у меня).
Время, отображаемое с помощью ls -l
, не отображает дату создания файла или каталога, вместо этого отображается время последней модификации (mtime).
Посмотрите документацию:
‘-l’
‘–format=long’
‘–format=verbose’Вывести в длинном формате. Помимо имени каждого файла, выводится тип файла, биты режима файла, количество жестких ссылок, имя владельца, имя группы, размер и временная метка (см. Форматирование временных меток файлов), обычно это временная метка модификации (mtime, см. Временные метки файлов).
Если вы хотите увидеть временную метку создания, вы можете использовать команду stat
:
~$ stat ~
File: /home/mook
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 8,34 Inode: 1444610 Links: 16
Access: (0750/drwxr-x---) Uid: ( 1000/ mook) Gid: ( 1000/ mook)
Access: 2025-02-11 12:56:52.096895764 +0700
Modify: 2025-02-11 15:15:16.625465657 +0700
Change: 2025-02-11 15:15:16.625465657 +0700
Birth: 2024-08-04 01:25:23.591294430 +0700
Дата, указанная командой ls
, это конкретно время модификации, сокращенно ‘mtime’ на системах, подобных UNIX, таких как Linux, файла или каталога. Эта временная метка обновляется, когда изменяются данные объекта файловой системы.
Для файла значение этого утверждения относительно очевидно: mtime изменяется на текущее время всякий раз, когда файл записывается.
Для каталога же значение ‘данных’ менее очевидно. ‘Данные’ каталога — это набор записей каталога для этого каталога, который функционально является списком объектов файловой системы (и их имен), которые находятся в этом каталоге. Это означает, что создание, удаление или переименование файла в каталоге обновит mtime каталога (однако изменение разрешений на такой файл этого не сделает, так как разрешения являются частью объекта файловой системы, а не частью записи каталога).
‘Время создания’ — это другая концепция на системах, подобных UNIX, и она на самом деле довольно сложная. Все файловые системы Linux предоставляют две дополнительные временные метки помимо mtime:
- ctime (‘время изменения’), которое отслеживает последнюю модификацию определенных метаданных файла. Это включает разрешения, метки безопасности, ACL, xattr и особенно все другие временные метки. ctime обычно не является весьма полезной для обычных пользователей, но может быть очень полезна для системных администраторов для аудита времени, когда происходили изменения.
- atime (‘время доступа’), которое отслеживает последнее время, когда файл был открыт. Эта метка обновляется всякий раз, когда mtime будет обновляться, но также и всякий раз, когда данные считываются из файла. Эта метка также ведет себя немного неожиданно с каталогами, в том смысле, что проход по каталогу (доступ к файлу в этом каталоге) не обновляет её, но просмотр содержимого каталога — да. Очень немногие вещи фактически используют atime в наши дни, потому что её легко подделать, и все больше нормальным становится фактически отключать отслеживание её при монтировании файловых систем, чтобы сократить запись на диск.
Кроме того, некоторые файловые системы предоставляют четвертую временную метку, называемую ‘btime’ или ‘время рождения’ объекта файловой системы, и она устанавливается только при первом создании объекта файловой системы. Это самое близкое, что вы можете получить к времени создания объекта файловой системы, но она также ведет себя непредсказуемо из-за того, как сама система работает. В частности, многие вещи на Linux не перезаписывают файлы на месте, а вместо этого записывают временный файл с любыми изменениями, а затем переименовывают его поверх существующего файла (это делается для того, чтобы все изменения либо произошли, либо не произошли вовсе). Однако это создает новый объект файловой системы, который заменяет старый, поэтому неудивительно, что btime файлов иногда совпадает с mtime.
Вы имеете в виду, что находитесь в /home
, а не в своем собственном домашнем каталоге пользователя, который находится под каталогом home? Ярлык для вашего собственного домашнего каталога пользователя — это ~
.
/home
обычно обновляется только при добавлении нового пользователя в систему, потому что содержимое /home
— это просто каталоги пользователей. Так что ваша дата “July 5 2024” вероятно является датой, когда ваш загрузочный файл дистрибутива был создан, поскольку /home
будет распакован и установлен оттуда.
У меня это выглядит так:
paul: /home $ ls -la
total 44
drwxr-xr-x 4 root root 4096 Nov 23 17:12 .
drwxr-xr-x 22 root root 4096 Feb 1 15:59 ..
drwx------ 2 root root 16384 Mar 16 2017 lost+found
drwxr-x--- 59 paul paul 20480 Feb 11 11:16 paul
paul: /home $
Каждый каталог в Linux имеет родительский ..
, и ваши разрешения в вашем “домашнем” выглядят очень необычно. Поэтому я подозреваю, что вы не показываете весь вывод вашего ls -la
. Вывод pwd
также будет полезным.
Времена файлов могут быть включены в tarball или пакет. Основное содержимое пользовательского каталога придет в пакете или архиве, как этот, и обычно создается инструментами с правами root, которые могут устанавливать эти даты. Проверьте дату на /etc/skel (каталог, который клонируется для новых пользовательских home’ов), и я уверен, она будет довольно близкой.
.
Ответ или решение
Конечно, давайте разберем данную ситуацию с вашим вопросом в контексте временных меток на файловой системе Linux.
Теория
Начнем с основ. В файловой системе UNIX-подобных систем, таких как Linux, каждая директория или файл обладают несколькими временными метками. Среди них:
-
Modification time (mtime) — это время последнего изменения содержимого файла или директории. Эта метка изменяется, когда данные файла или содержимое директории модифицируют.
-
Change time (ctime) — время последнего изменения метаданных файла, таких как права доступа, атрибуты, и, что интересно, обновление самих временных меток mtime и atime.
-
Access time (atime) — время последнего доступа к файлу. Она обновляется, когда файл читают или модифицируют.
-
Birth time (btime) — время создания файлового объекта, однако не все файловые системы в Linux позволяют отслеживать этот параметр.
Давайте более подробно объясним, как это может влиять на вашу ситуацию.
Пример
Вы описали ситуацию, где временная метка директории .
(текущей директории) в вашем домашнем каталоге (/home/chuck_user
) показывает "Jul 5 2024", несмотря на то, что установка Linux была выполнена в феврале 2025 года. Это вызывает недоумение.
Когда вы выполняете команду ls -la
, она отображает mtime, то есть время последнего изменения самой директории, а не создание или изменение файлов внутри ее. Для директории это означает, что mtime будет обновлен в любом случае, если изменяется один из файлов внутри директории — добавление нового файла, удаление, или переименование любого файла или поддиректории.
На самом деле, возможно несколько сценариев, которые могут вызвали данное различие:
-
Содержимое директории могло быть пересоздано: Например, если вы загрузили архив с разрешением
tar
, где было указано конкретное время модификации для распакованных файлов и директорий, либо же, если вы воспользовались утилитами для капитуляции файлов и директорий, которые поддерживают указание временных меток. -
Программа или скрипт могли изменить временные метки: Некоторые системные утилиты, или даже оболочки и пользовательские скрипты, могут изменять временные значения для определённых целей ведения журнала или других задач.
-
Переустановка системы: При переустановке системы или восстановлении из образа некоторые временные метки могут остаться прежними, как они указаны в исходных файлах.
Применение
Чтобы получить точное время создания вашего домашнего каталога, воспользуйтесь командой stat
, которая даст более обширную информацию о файловом объекте. Например:
stat /home/chuck_user
В выводе stat
вы найдете информацию о временных метках, о которых шла речь выше, включая "Birth" (если поддерживается вашей файловой системой).
Также, если интересует конкретно, что могло произойти с вашим домашним каталогом, рекомендуем:
- Проверить логи системы на признаки копирования или восстановления данных (например,
/var/log
). - Выполнить аудиты безопасности, если есть подозрения, что кто-то мог вмешаться в систему.
- Использовать
find
с различными флагами временных меток, чтобы определить, какие изменения были внесены в каталоге.
С использованием этих методов, вы сможете выяснить, почему временная метка показывает эту дату, и следить за изменениями в вашей файловой системе.