
Я пытаюсь создать разреженный файл на Android. Для этого я использую Android Terminal Emulator. Я установил Busybox, поэтому могу использовать команду dd. Другие команды, такие как truncate, не установлены. Мой вопрос: кто-нибудь знает, как создать разреженный файл с помощью Android Terminal?
Я попробовал несколько команд, которые нашел в интернете:
dd if=/dev/zero of=/sdcard/file.img bs=1 count=0 seek="wanted size"
Но файл не создавался. Я также пробовал:
dd if=/dev/zero of=/sdcard/file.img bs="wanted size" count=1.
Но я получаю следующую ошибку:
dd "path of if" invalid argument
Кто-нибудь знает, как это сделать правильно?
решение1
Я уже нашел ответ сам.
dd if=/dev/zero of=/sdcard/file.img bs=1 count=0 seek="wanted size"
Не создаст файл, так как размер на диске определяется размером блока и счетчиком. Если установить счетчик на 0, файл будет размером 0 байт, и, таким образом, он не будет существовать.
dd if=/dev/zero of=/sdcard/file.img bs="wanted size" count=1
Выдаст следующую ошибку:
dd "path of if" invalid argument
Проблема здесь в том, что есть ограничение на размер блока. Его нельзя сделать таким большим. Мне нужно было рассчитать количество для нужного размера блока. Я выбрал 64k. Вот рабочая команда для создания разреженного файла размером 512 МБ:
dd if=/dev/zero of=/sdcard/file.img bs=64k count=8192
Использование поиска необязательно.
решение2
Следующая команда создаст на моем устройстве разреженный файл размером 5 гигабайт
dd of=sparse.img bs=1 count=0 seek=5G
dd — программа для копирования блоков байтов.
if=
используется для указания входного файла. Здесь не требуется.
of=
требуется для указания выходного файла.
bs=
требуется для указания размера блока, то есть байт на чтение или запись.
seek=
требуется для указания количества пропускаемых выходных блоков.
count=
используется для указания количества копируемых блоков.
Поведение по умолчанию, если count
не указано, — копировать весь входной файл (по умолчанию это stdin). bs
обычно следует устанавливать на оптимальный размер чтения/записи устройств, но в этом случае установка его на 1
позволяет нам использовать понятные человеку числа для seek
. Оба seek
и count
принимают свои значения блоками, как определено bs
таким образом, что bytes=bs*(count+seek)
.
Разреженный файл создается с помощью count=0
и вместо использования seek
для установки размера файла. Принятый ответ вообще не создает разреженный файл, а заполняет файл нулями.