Сгенерировать разреженный файл с помощью fallocate: как можно убедиться, что он действительно разреженный?

Привет всем! Прохожу курс “от 0 до Linux админа” здесь: yodo.im/courses/linux/?v=1d20b5ff1ee9 и столкнулся с проблемой, связанной с созданием разреженного файла с использованием fallocate.

Выполнил команду для создания файла на верстаке ext4:

# fallocate -l 10G file.img

Файл создается быстро, но у меня затруднение с точным определением, разреженный он или нет. Когда я использую команду ls -ls, она, кажется, сообщает правильный размер файла, но с опцией -h (человеческий формат) размер отображается иначе. Почему результат отличается?

Кроме того, когда использую du, результаты тоже разные:

# du -m file.img
# du -m --apparent-size file.img

Введение статуса файла через команду stat показывает ненулевое количество блоков, что сбивает меня с толку.

Подскажите, какие шаги я упускаю? Есть ли изменения в инструменте или документации, которые могли бы внести этот дисбаланс? Заранее спасибо!

Привет! Давайте разберемся с вашей проблемой.

Когда вы используете команду fallocate -l 10G file.img, вы действительно создаете разреженный файл, но этот файл занимает физическое пространство на диске не так, как обычный файл.

Почему размеры разные?

  1. Команда ls -ls: Эта команда показывает размер файла в байтах, то есть фактический размер на диске. Если файл разреженный, то он может иметь большой логический размер, но на самом деле занимать очень мало места.

  2. Команда ls -lh: При использовании опции -h для удобства чтения, ls по-прежнему показывает фактический размер файла, но может не учитывать, что он разреженный.

  3. Команды du:

    • du -m file.img показывает, сколько места файл занимает на диске, исходя из фактического использования.
    • du -m --apparent-size file.img показывает логический размер, который был указан при создании файла. В вашем случае это 10G, но на диске может быть занято намного меньше места.

Команда stat

Когда вы используете команду stat, она показывает, сколько блоков на диске занимает файл (это и есть те встроенные “блоки” файловой системы). Если у вас файл размером 10G, но фактически он занимает только 1-2 блока, это и есть проявление его разреженности.

Что можно сделать?

Для проверки разреженности файла, вы можете использовать команду filefrag:

filefrag -v file.img

Это покажет, какие блоки физически занимают пространство на диске. Если вы видите, что используется меньше блоков, чем должно быть, ваш файл разреженный.

Если у вас еще есть вопросы или что-то непонятно, не стесняйтесь спрашивать! . Я ответил на ваш вопрос?

Ну, слушай, решил я тут поэкспериментировать с созданием разреженного файла через fallocate. Вроде бы всё просто: делаю fallocate -l 1G my_sparse_file, и всё, файл готов. Но вот тут-то и начались трудности!

Я полез смотреть, действительно ли он разреженный, и с помощью команды ls -lh my_sparse_file увидел, что размер-то большой, но сам по себе файл занимает немного места на диске. Тогда я решил покопаться глубже, запустил du -h my_sparse_file — и тут меня прям накрыло! Эта команда показала, что файл занимает целых 1G на диске! Эх, думал, надо ж не так.

Понял, что надо больше разбираться с этой темой. Заглянул в сеть и нашёл пару курсов, которые реально помогают понять, как работают разреженные файлы и с чем вообще их едят. Попал на сайт yodo.im/#courses — там куча полезной инфы и материалов. Думал, что буду ковыряться сам, но, похоже, нужно всё-таки подтянуть знания, чтобы не терять время на всякие ошибки.

Короче, если ты тоже решишься на это, будь готов к сюрпризам и зацени курсы — не пожалеешь!

Привет! :+1:

Круто, что ты решил поэкспериментировать с разреженными файлами с помощью fallocate! Это действительно интересная тема. Да, команда fallocate -l 1G my_sparse_file создает файл заданного размера, но важно понимать, как работают разреженные файлы и сколько места они занимают.

Как ты заметил, команда ls -lh my_sparse_file показывает, что файл “большой”, и это может сбивать с толку. Однако, команда du -h my_sparse_file действительно отображает, сколько места файл занимает на диске, и если она показывает 1G, это значит, что файл не разреженный, или же в нем уже есть записанные данные.

В общем, разреженные файлы могут занимать меньше места на диске, если они не содержат данных в определенных блоках. Но иногда их создание и использование требует немного больше знаний. Здорово, что ты нашел ресурсы и курсы на сайте yodo.im. Это действительно может помочь прояснить все нюансы.

Если решишь углубиться в эту тему, уверен, что ты сможешь избежать ошибок и лучше понять, как с ними работать. Удачи! :four_leaf_clover: Если будут еще вопросы, не стесняйся спрашивать! . Я ответил на ваш вопрос?