Я пытаюсь создать большой случайный файл на ramdisk, чтобы провести некоторые тесты. Я создал ramdisk и свой начальный файл (из / dev / urandom) без особых проблем, но у меня возникли проблемы с увеличением его размера (я надеялся, что смогу просто вложить его в себя, чтобы удвоить его, пока диск не будет заполнен ), и я не знаю почему. Я надеюсь, что кто-нибудь скажет мне, что я упускаю из виду.
Во-первых, файл определенно там:
$ ls -la /mnt/ramdisk/ramfile
-rw-r--r-- 1 root root 163840 Nov 22 11:07 /mnt/ramdisk/ramfile
Во-вторых, я пытаюсь использовать cat, чтобы удвоить его размер, но это не удалось:
$ sudo -s "cat /mnt/ramdisk/ramfile >> /mnt/ramdisk/ramfile"
/bin/bash: cat /mnt/ramdisk/ramfile >> /mnt/ramdisk/ramfile: No such file or directory
Так что, я думаю, я что-то неправильно понимаю, потому что ожидал, что это сработает. Я также дважды пытался перенести начальный файл в другой файл, но получил аналогичную ошибку.
На случай, если это уместно, я создал файл следующим образом:
sudo dd if=/dev/urandom of=/mnt/ramdisk/ramfile bs=16384 count=10
Причина, по которой я хочу это сделать, - я обнаружил, что urandom довольно медленно читается (даже на сильно перегруженном сервере), и я хочу убедиться, что скорость чтения из этого случайного файла не является узким местом.
РЕДАКТИРОВАТЬ:
Версии-
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
cat (GNU coreutils) 8.21
Ubuntu 14.04 x86_64
Есть две различные проблемы с командой, которую вы попытались:
Во-первых, вы можете передать только простую команду в sudo
через -s
] вариант. Чтобы запустить командную строку с перенаправлением ввода-вывода, вы должны явно вызвать оболочку, например:
sudo bash -c "cat /mnt/ramdisk/ramfile >> /mnt/ramdisk/ramfile"
Это исправит сообщение об ошибке, о котором вы сообщили, но приведет к другому:
cat: /mnt/ramdisk/ramfile: input file is output file
Что обнажает вторую проблему: cat
запрограммирован так, чтобы предотвращать именно то, что вы его просите, а именно присоединение файла к самому себе. Вы можете обмануть его, вставив в конвейер второго cat
, убрав первого с трека:
sudo bash -c "cat /mnt/ramdisk/ramfile | cat >> /mnt/ramdisk/ramfile"
Обратите внимание, что поведение этой команды будет зависеть от начального размера файла / mnt / ramdisk / ramfile
. Если файл достаточно мал, чтобы поместиться в буфер команды cat
, он будет добавлен к самому себе только один раз, увеличивая его размер вдвое. Если он больше, чем сумма всех буферов в конвейере, он будет бесконечно добавляться к себе снова и снова, пока диск не будет заполнен. Если его размер находится между этими двумя пределами, поведение не является детерминированным.
Обратите внимание: я внимательно прочитал ваш вопрос и ответил на него, как указано. Если у вас есть другие вопросы / проблемы, которые вы не указали, то они точно не сформулированы и поэтому на них невозможно ответить.
Проблема здесь в том, что вы пытаетесь открыть файл, названный именно так
cat /mnt/ramdisk/ramfile >> /mnt/ramdisk/ramfile
, и bash не может его найти. Это вызвано тем, что вы цитируете все, и что касается bash, это всего лишь аргумент командной строки для его выполнения.
Так что это довольно легко решить
cat /mnt/ramdisk/ramfile >> /mnt/ramdisk/ramfile
К сожалению, это не сработает, поскольку кошка умна
cat: /mnt/ramdisk/ramfile: input file is output file
С помощью cat вы берете несколько входов и добавляете их к выходу
cat /mnt/ramdisk/ramfile /mnt/ramdisk/ramfile >/mnt/ramdisk/ramfile.out
создаст ramfile.out, который был двумя копиями ramfile.
Вы также делаете это как root через sudo. Еще одна вещь, о которой вам нужно знать, это то, что цель перенаправления вывода открывается с использованием контекста безопасности исходного пользователя
sudo cat /mnt/ramdisk/ramfile /mnt/ramdisk/ramfile > /mnt/ramdisk/ramfile.out
-bash: /mnt/ramdisk/ramfile.out: Permission denied
, поэтому вам необходимо убедиться, что пользователь, от которого вы выполняете sudo, имеет подходящие права на запись в целевой файл.
Вы не можете скопировать файл на себя. Однако вы можете выполнить то, что хотите, с помощью любого из следующих действий:
sudo cat $TESTFILE/ramfile $TESTFILE/ramfile > $TESTFILE/ramfile2; mv $TESTFILE/ramfile2 $TESTFILE/ramfile
или
sudo bash -c "cat $TESTFILE/ramfile $TESTFILE/ramfile > $TESTFILE/ramfile2; mv $TESTFILE/ramfile2 $TESTFILE/ramfile"