tgoop.com/bashdays/48
Create:
Last Update:
Last Update:
Вот и август на носу, еще совсем чуть-чуть и снова новый год. Как говорится — дорогу осилит идущий. Так что не останавливаемся и продолжаем изучать новое.
Сегодня покажу вкусный трюк, как узнать физическое расположение файла на диске. Нет, не его путь, а именно в какой области жесткого диска этот файл находится. Поехали.
Создаём подопытный файл:
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 вполне можно до него дотянутся и восстановить при желании.
Полезно? Полезно! Для чего это можно применить? Нууу не знаю, коллега к примеру таким образом восстанавливал базу данных, которую в пятницу вечером решили случайно удалить. А бэкапы съели мыши.
Очередную порцию полезных знаний я тебе выдал, ставь лайк, изучай. Увидимся!
tags: #linux #bash
—