Понимание разреженных файлов, dd, seek, структуры блоков inode

Выполните следующие действия:

uname -a

затем используйте номер версии, полученный из uname -a , чтобы установить правильный kernel-devel т.е.

yum install kernel-devel-3.10.0-514.2.2.el7.x86_64
6
26.05.2016, 17:41
1 ответ

Несколько быстрых ответов: во-первых, вы не создали разреженный файл. Попробуйте выполнить эти дополнительные команды

dd if=/tmp/BIL of=/tmp/sparse seek=1000
ls -ls /tmp/sparse

Вы увидите, что размер составляет 512003 байта, но занимает только 8 блоков. Нулевые байты должны занимать целый блок и находиться на границе блока, чтобы они могли быть разреженными в файловой системе.

  1. Почему второе вхождение "BIL" появляется не по порядку?

    Потому что вы находитесь в системе с little-endian и пишете вывод в шортах. Используйте байты, как это делает cat.

  2. Откуда cat и другие программы знают, что нужно печатать в правильном порядке?

    Они работают с байтами.

  3. Как программы типа ls различают "предполагаемый" размер и выделенный размер?

    ls и т.д. используют системный вызов stat(2), который возвращает 2 значения:

    st_size; /* общий размер, в байтах */ 
    blkcnt_t st_blocks; /* количество выделенных 512B блоков */
    
  4. Какие инструменты я могу использовать для опроса информации о inode?

    stat - это хорошо.

  5. Есть ли инструмент, позволяющий просматривать прямые и косвенные блоки?

    На ext2/3/4 вы можете использовать hdparm --fibmap с именем файла:

    $ sudo hdparm --fibmap ~/sparse 
    Размер блока файловой системы 4096, начинается с LBA 25167872; предполагается, что секторы по 512 байт.
    byte_offset begin_LBA end_LBA sectors
     512000 226080744 226080751 8
    

    Вы также можете использовать debugfs:

    $ sudo debugfs /dev/sda3
    debugfs: stat <1040667>
    Inode: 1040667 Тип: regular Режим: 0644 Флаги: 0x0
    Генерация: 1161905167 Версия: 0x000000
    Пользователь: 127 Группа: 500 Размер: 335360
    ACL файлов: 0 ACL каталогов: 0
    Ссылки: 1 Blockcount: 664
    Фрагмент: Адрес: 0 Номер: 0 Размер: 0
    ctime: 0x4dd61e6c -- Fri May 20 09:55:24 2011
    atime: 0x4dd61e29 -- Fri May 20 09:54:17 2011
    mtime: 0x4dd61e6c -- Fri May 20 09:55:24 2011
    Размер дополнительных полей inode: 4
    БЛОКИ:
    (0-11):4182714-4182725, (IND):4182726, (12-81):4182727-4182796
    ИТОГО: 83
    
  6. Почему dd усекает мой файл и может ли dd или другой инструмент записывать в середину файла?

    Да, dd может записывать в середину. Add conv=notrunc.

  7. Существуют ли механизмы, предотвращающие сжатие/увеличение разреженных файлов? И если нет, то почему разреженные файлы полезны?

    Нет. Потому что они занимают меньше места.

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

Некоторые утилиты копирования имеют опции для сохранения разреженности, например tar --sparse, rsync --sparse.

Обратите внимание, что вы можете явно преобразовать выровненные нулевые блоки в файле в разреженность с помощью cp --sparse=always и наоборот, преобразовать разреженное пространство в реальные нули с помощью cp --sparse=never.

8
27.01.2020, 20:23

Теги

Похожие вопросы