Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


понедельник, 6 июня 2016 г.

[no][dir]atime в Windows

Файловые системы хранят массу информации про файлы. В том числе и как минимум три временных отметки: дата-время создания файла (когда была создана запись файловой системы), дата-время последнего изменения (когда последний раз менялось содержимое файла) и дата-время последнего обращения к файлу.


Что происходит, когда выполняется команда dir или ls? Читается содержимое соответствующего каталога, возможно с подкаталогами. То есть, выполняется обращение к записи файловой системы об этом каталоге. Необходимо обновить отметку последнего обращения (далее по тексту: last access timestamp - LAT), а это обозначает, что надо что-то записать на физический носитель.

Теперь уйдем в GUI. Открываем тот же каталог в "проводнике", будь это explorer.exe или Thunar или Nautilus и т.п. Видим окошко с красивыми (или не очень) иконочками. А откуда иконочки? А иконочки, по мере возможности, вытаскиваются из самих файлов. Как узнать, есть ли в файле иконочка, или, если это графика либо видео, можно ли показать его содержимое в виде эскиза (thumbnail)? Разумеется, обращением к этому файлу.
То есть, при каждом обновлении окна "проводника" надо выполнить запись на диск уже не только для просматриваемого каталога, но и для каждого файла в нём. Или почти для каждого, если "проводник" достаточно умён, чтобы не трогать файлы, не попадающие в область отображения.
NB! для NTFS время последнего обращения сохраняется на носителе в пределах часа с момента этого обращения.

Для магнитных дисков это не очень критично: пока пластины не начнут шелушиться, домен может менять свою намагниченность очень много раз. Но как быть с SSD и флешками, где деградация ячеек памяти (по сути - электрически-стираемого ППЗУ) наступает гораздо быстрее? Вряд ли будет очень приятно обнаружить, что флешка "умерла", хотя на нее ничего не записывалось после помещения на нее изначальной информации. Точнее говоря, ничего не записывалось пользователем, а вот система писала так, "что аж шуба заворачивалась" при каждом просмотре. Особенно это "весело", если на флешке хранится множество мелких файлов, в которых регулярно осуществляется поиск...

Конечно, я немного утрирую, да и современные ППЗУ куда надежнее и долговечнее чем те, что были, скажем, лет 10-15 назад (впрочем, 15 лет назад мне в руки впервые попала флешка аж на целых 32 МЕГАбайта, на которую я установил ДОС и Win3.11, и с которой неплохо грузилась бездисковая рабочая станция). Но всё же, так ли уж необходимо "царапать поверхность" флешки при каждом ее ЧТЕНИИ? Может без этого можно обойтись?

Можно!

В *nix существуют два разных параметра, контролирующих подключение (монтирование) файловых систем. Параметры эти указываются в fstab либо непосредственно во время монтирования в разделе опций (после ключа -o)
(на самом деле этих параметров чуть больше двух, но это уже лишние подробности. Желающие welcome to man mount)

[no]atime: [не] сохранять время последнего обращения к файлу
[no]diratime: [не] сохранять время последнего обращения к каталогу

Все мои загрузочные флешки монтируют свои разделы именно с "no-" версиями этих параметров.

До недавнего времени я был уверен, что с Windows всё намного печальнее. Реальность оказалась не такой страшной.

Одна из моих любимых команд в Linux - команда apropos, которая ищет ключевое слово в локальной базе манов. И если, например, мне надо узнать, что у меня есть из утилит работы с ФС NTFS, я выполняю apropos ntfs, получая некий список имеющихся команд (и имеющих маны), от которого могу отталкиваться. В Windows подобной команды нет, хотя есть поиск в гуёвом хелпе. (не буду говорить об "удобстве" такого подхода в win7+ и winserver2008+, где встроенный хелп суть набор гиперссылок на mskb, что особенно выручит, если нету интернету)

Так вот, из-за отсутствия аналога apropos, я только недавно узнал о штатной команде fsutil, одна из функций которой - включение отключение LAT для томов с NTFS. Поскольку у разработчиков утилит для Windows примерно дохера лишнего времени на ввод километровых команд, то все параметры командной строки надо набирать полностью, никаких ключей или сокращенных параметров:

Узнать состояние этого параметра:
fsutil behavior query disablelastaccess том:\





Изменить:
fsutil behavior set disablelastaccess {1 | 0} том:\

Судя по описанию, этот параметр влияет как на файлы, так и на каталоги, то есть не столь гибок, как [*]atime в *nix.

Любители извращений могут также поковыряться в реестре:

HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate.

Спасибо, я кончил.

Комментариев нет:

Отправить комментарий

Пожалуйста, воздержитесь от грубостей и персональных нападок.
Я не против матерщины, но она должна быть уместной и использоваться для выражения эмоций, а не в качестве основного средства выражения мыслей.