Создание произвольно большого «поддельного» файла

16

Я хотел бы создать специальный файл, похожий на /dev/nullили /dev/random, где файл на самом деле не существует, но вы все равно можете прочитать из него, за исключением того, что я мог бы фактически установить ограничение на видимый размер файла.

Другими словами, я хочу создать специальный файл, в котором (при условии, что я установил ограничение на 500 ГБ), когда я "кошка" файл, он выведет все 500 ГБ файла, а затем остановится. Он должен действовать так же, как реальный файл 500 ГБ, но не занимая места. Содержимое этого файла не имеет значения, это может быть все \0как /dev/null, или просто небольшая строка, отправляемая снова и снова, или что угодно.

Это то, что выполнимо? Единственно, что мне удалось найти, это страницы руководства, о которых я говорил mknod, но они не очень помогли.

Посредственный суслик
источник

Ответы:

17

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

$ dd if=/dev/null of=sparse bs=1024 count=1 seek=524288000
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.4444e-05 s, 0.0 kB/s
$ ls -l sparse 
-rw-rw-r--. 1 ignacio ignacio 536870912000 May  9 22:25 sparse
$ du -h sparse
0   sparse
Игнасио Васкес-Абрамс
источник
Это работает отлично. В лучшем случае я надеялся на решение, в котором я мог бы на самом деле написать сценарий того, что выводится (например, для каждой позиции поиска, которую вы смотрите на данные, будет хеш этой позиции или что-то в том же духе), но это было довольно далеко там. Это определенно работает, спасибо!
Посредственный суслик
1
@MediocreGopher, вы, конечно, могли бы сделать что-то подобное с FUSE .
CJM
1

Помимо уже упомянутого портативного решения на основе dd / seek, некоторые Unix-ы имеют специальные команды:

По крайней мере, в Solaris , MacOS / X и Irix :

mkfile -n 500m sparseFile

На HP-UX prealloc , на AIX lmktemp. и во многих дистрибутивах Linux есть усечение

jlliagre
источник
1

Если вам не нужно искать обратно в файле, вы можете использовать именованный канал:

mkfifo my_special_file
yes | head -n 100 > my_special_file&
cat my_special_file

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

jfg956
источник
0

Ну, с dd, вы можете указать размер блока и количество, и таким образом ограничить размер следующим образом:

dd if=/dev/urandom count=5 bs=1024 > nullfile

Если вы хотите прочитать из него, просто передайте это:

dd if=/dev/urandom count=5 bs=1024 | yourReadingProcess 

Раньше каждая установка linux, которую я делал, шла с некоторыми сетевыми инструментами, portmap, inet.d и тому подобным, и в inet.d, где всегда указывались некоторые сервисы, один из них был описан / назван chargen, если я правильно помню.

(... через минуту ...)

Да. В / etc / services вы найдете

chargen         19/tcp          ttytst source
chargen         19/udp          ttytst source

Поэтому я предполагаю, что это служба для проверки чего-либо, которая отправляет символы - возможно, случайные - по сети. Я только нахожу /etc/xinet.d/chargen на моем ПК. Есть больше информации:

# default: off
# description: An xinetd internal service which generate characters.  The
# xinetd internal service which continuously generates characters until the
# connection is dropped.  The characters look something like this:
# !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
# This is the tcp version.

Тем не менее, я не знаю, как использовать его для ваших целей.

Пользователь неизвестен
источник