почему ls сообщает об огромном файле, и du не делает?

8-го декабря 2012 новый проект был запущен - Любимый.

http://www.darlinghq.org/

7
24.11.2013, 02:42
1 ответ

Я предполагаю это add.bin редкий файл.

Большинство файловых систем Unix поддерживает редкие файлы (почти произвольных размеров). В основном можно искать на произвольное смещение прежде, чем начать писать, и блоки, через которые Вы перескакиваете, не будут на самом деле отображены на диске. При попытке считать их, то они будут полны 0s. Если Вы запишете в них, то они волшебно возникнут (но только те Вы пишете в).

Вот пример:

$ dd of=sparse obs=1K seek=1M if=<(echo foo)
0+1 records in
0+1 records out
4 bytes (4 B) copied, 0.000411909 s, 9.7 kB/s
$ ls -lh sparse
-rw-r--r-- 1 rici rici 1.1G Nov 23 17:22 sparse
$ du -h sparse
4.0K    sparse

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

На Linux, du обычно может сообщить об использовании фактической дисковой емкости редкого файла. Можно сказать этому сообщать об "очевидном размере" (который будет более подобен какой ls -l отчеты) путем передачи его -b опция. Это - расширение Гну; Posix не требует du быть точным в его создании отчетов редких размеров файла. ("Это до реализации для определения точно, насколько точный ее методы".)

По-видимому, arm-none-eabi-objcopy делает что-то довольно подобное dd пример выше, в котором это разворачивает отформатированный ELF exe в изображение RAM, и заполняет изображение путем поиска вместо того, чтобы заполнить файл нулями. Это - на самом деле, классический вариант использования для редких файлов, которые могут быть с отображенной памятью (mmap) не подвергаясь стоимости для неиспользованных блоков.

9
27.01.2020, 20:17
  • 1
    В ссылках, на которые я сослался, в основном говорилось это. –  slm♦ 24.11.2013, 00:21
  • 2
    @slm: Я только вижу одну ссылку; я скользил через первые два screenfulls, но не видел ничего соответствующего. наутилус –  rici 24.11.2013, 00:25
  • 3
    Да вот почему я сказал, что это "в основном" говорило это. Вы сказали это более кратко, но строки как это: "Я предположил бы, что Вы запросили файл мусорного ведра содержать обе области RAM и FLASH". по существу говорят, что файл загружается редкими данными. Существует это, ТАК свяжите это, я еще не сослался здесь ни на одного: stackoverflow.com/questions/9725268 / …. Ваш ответ, "что", но мы все еще отсутствуем "почему". –  slm♦ 24.11.2013, 00:31
  • 4
    Ну, я зафиксировал его. Проблемой был сценарий компоновщика. Эффективно, objcopy заполнял add.bin нулями от адреса 0x0000002c к 0xa000000. Благодаря всем. –  David Martínez 24.11.2013, 01:19
  • 5
    @MichaelKjörling: персидский король искал партнера для своего дочернего элемента. Применяются три истца. Король взял их к своей апельсиновой роще, где они находились со стороны его озера. Гигантское апельсиновое дерево выгнуто наверху. Король смотрел искоса на озеро и спросил, "что это пускает в ход в тени дерева?". "Да ведь Это - апельсин", сказал первый истец. Второе посмотрело тщательно на фрукты и ответило, "Нет, это - лимон". Третий истец пробрался к фруктам и взял их. "Это - половина лимона", сообщил он... Иногда лучше не быть слишком уверенным в том, что Вы думаете, что видите. –  rici 24.11.2013, 01:35

Теги

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