Найти в Дзене
BASH DAYS | Linux Factory

Узнаем физическое расположение файла на диске в Linux

Вот и август на носу, еще совсем чуть-чуть и снова новый год. Как говорится — дорогу осилит идущий. Так что не останавливаемся и продолжаем изучать новое.

Сегодня покажу вкусный трюк,
как узнать физическое расположение файла на диске. Нет, не его путь, а именно в какой области жесткого диска этот файл находится. Поехали. 🏃‍♂

Создаём подопытный файл:

printf '%s\n' {a..d} > /tmp/test.txt

либо так:

echo {a..d} > /tmp/test.txt

После создания файла, нужно запустить команду
sync, но можно и не запускать, спустя несколько секунд linux сам всё нужное сделает. Я запускаю, потому что мне важна чистота эксперимента.
sync — утилита Unix, предназначенная для обновления файловых систем и для синхронизации данных на диске с данными в памяти. При этом выполняется системный вызов sync, который вызывает запись всех буферизованных изменений метаданных файлов и данных в базовые файловые системы. Он гарантирует, что все, что хранилось в памяти, будет записано на диск, предотвращая потерю данных, хранящихся в кеше, при аварийном завершении работы.

Так, файл успешно создан, давай посмотрим что внутри:

cat /tmp/test.txt

abcd

Ок. Теперь давай
узнаем физическое расположение файла на диске, для этого запускай команду:

filefrag -b512 -v /tmp/test.txt

Программа filefrag (из пакета e2fsprogs) показывает насколько сильно фрагментирован файл.

После выполнения команды, смотрим результат. Нам важна колонка:
physical_offset в моём случае я получил такие значения:

4612136..4612143

Отлично. Теперь я знаю точное расположение файла на жестком диске.
А давай прочитаем его прям с диска! Для этого стартуем:

sudo dd if=/dev/sda1 skip=4612136 status=none count=8

Важно правильно указать свой диск
/dev/sdX. Ну и в параметр skip подставить первое значение из колонки physical_offset.

По итогу запуска, я получаю ту же картину. Только без применения сторонних утилит вроде
cat и т.п..

abcd

Ну и вишенка. Если я удалю файл
rm /tmp/test.txt и затем выполню предыдущую команду:

sudo dd if=/dev/sda1 skip=4612136 status=none count=8

То получу тот же вывод «
abcd», потому что файл на диске продолжает лежать и занимать место. Это визуально он исчез, чтобы тебе глаза не мозолить. Но зная его physical_offset вполне можно до него дотянутся и восстановить при желании.

Полезно? Полезно! Для чего это можно применить? Нууу не знаю, коллега к примеру таким образом восстанавливал базу данных, которую в пятницу вечером решили случайно удалить. А бэкапы съели мыши. Кстати успешно восстановил. Ну это уже лирика…

Очередную порцию полезных знаний я тебе выдал, ставь лайк, изучай. Увидимся!