Попытка удвоить размер файла не удалась
Я пытаюсь создать большой случайный файл на виртуальном диске, чтобы провести несколько тестов. Я создал 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 довольно медленное (даже на сервере с огромным количеством ресурсов), и я хочу убедиться, что скорость чтения из этого случайного файла не является узким местом.
РЕДАКТИРОВАТЬ:
Versions-
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
cat (GNU coreutils) 8.21
Ubuntu 14.04 x86_64
3 ответа
Есть две различные проблемы с командой, которую вы пытались:
Во-первых, вы можете передать только простую команду 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 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"