Виртуальный диск в памяти: как создать ramdisk в Linux?

Бывают задачи, когда нужно работать с большим количеством мелких файлов и делать это по возможности быстро, без завязок на меееедленную файловую подсистему. Ветераны вспомнят о том, что есть такой виртуальный диск, он же - RAM-дисках (ramdisk) и будут совершенно правы - это действительно выход, а сделать ramdisk в Linux можно буквально в один клик на клавиатуре.

Собственно, в ядре должна быть поддержка tmpfs, и если вы (или авторы вашего дистрибутива) не любители усложнять себе жизнь, она там должна быть.
Быстренько создаём новую точку монтирования:

# mkdir /mnt/tmpfs/
# chmod 777 /mnt/tmpfs/
и даём все права на использование. После этого даём команду (от рута или через sudo):
# mount -t tmpfs -o size=xxxM tmpfs /mnt/tmpfs/
или
$ sudo mount -t tmpfs -o size=xxxM tmpfs /mnt/tmpfs/
где xxxM есть размер RAMdisk в Мегабайтах.
Будьте осторожны и не размахивайтесь слишком широко: если вы попросите создать ramdisk больше, чем имеете оперативной памяти, система начнёт сгружать всё в swap-файл и дела пойдут очень медленно и грустно.

Если же вы хотите изменить размер ramdisk - это просто:
# mount -o remount -o size=yyyM /mnt/tmpfs/
или
$ sudo mount -o remount -o size=
yyyM /mnt/tmpfs/
При этом содержимое диска не пропадёт, но его размер тут же увеличится (при уменьшении также ничего не пропадёт, если только данных не больше, чем диск).

Другие способы создания виртуальных дисков в памяти хорошо описываются в англоязычном посте.

Предупреждаю особо горячих финских парней: это RAM-диск, а это значит, что всё его содержимое после отключения питания машины будет безвозвратно потеряно. Будьте бдительны.

Ссылки
Есть толковые посты о том, как в Linux сделать виртуальный диск в памяти здесь и тут.

15 комментариев: |высказаться!| RSS-лента дискуссии.|
bosha комментирует...

Хм. Я в блоге тоже не так давно писал об этом.

Кстати говоря, это никакой не ramdisk. Это особенность ядра Linux и называется она tmpfs.

virens комментирует...

@bosha пишет...
Хм. Я в блоге тоже не так давно писал об этом.
А что ж ссылочку в посте не привели? Себя не похвалишь - никто не похвалит. В ваших блогах ничего сходного не нашел, увы.

Кстати говоря, это никакой не ramdisk.
Это понятно, просто для моих коллег, работающих под виндой, это самая близкая аналогия. Ну и в общем-то это можно и диском назвать :-)

Анонимный комментирует...

Не знаю насколько хорошая это идея, но /tmp и каталог временных файлов для havp я так и монтирую, в tmpfs.
Правда полгига под это дело нервируют жабу:)

escantor комментирует...

здорово, спасибо. А для чего конкретно вы используете tmpfs?

Иван комментирует...

Спасибо за инструкцию. Я в последнее время подумываю над тем что лучше базу с мускулом в памяти держать. Так что для меня инструкция в тему :)

Olly Cat комментирует...

К стати для особо горячих финских парней можно еще добавить, что использовать это надо с осторожностью при нехватки памяти. Ибо уйдет в своп и весть профит от использования может сойти на нет. ;)

Dormestmass комментирует...

В большинстве современных дистров tmpfs уже примонтирован в /dev/shm. Так что можно эту ФС сразу использовать без дополнительных телодвижений.

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

Алексей Плутахин комментирует...

Спасибо. Полезная информация.

Анонимный комментирует...

# mkdir -p /mnt/ram
# mount -t ramfs none /mnt/ram

- это _настоящая_ ram, со всеми ее преимуществами, но целиком.

Если очень надо ограничить объем:

# dd if=/dev/zero of=/mnt/ram/diskimg bs=1024 count=1024
# mke2fs -vFL RAMDisk /mnt/ram/disk.img
# mkdir -p /mnt/ramdisk
# mount -o loop /mnt/ram/disk.img /mnt/ramdisk

Minoru комментирует...

он же RAM-дисках
«он же — RAM-диск»

Для этого быстренько создаём новую точку монтирования:
Это предложение лучше записать так: «Быстренько создаём точку монтирования». А то создаётся впечатление, что ты всё ещё о tmpfs в ядре говоришь.

ramdisk<br>
больше

Откуда и зачем там перевод строки?

при уменьшении так же
Так же предупреждаю особо горячих финских парней
:)

Вроде как видел советы держать копию профиля Firefox в оперативке — мол, так быстрее работает.

virens комментирует...

@Анонимный, 15.03.2010 8:41:00
Не знаю насколько хорошая это идея, но /tmp и каталог временных файлов для havp я так и монтирую, в tmpfs.
Ну так знакомые виндузятники спросили: а есть в этих линупсах рамдиск!? Вот я им этим постом и ответил. Ясен пень, что это есть уж сто лет как и это не вполне диск (мне выше уже попеняли на это - и в общем-то правильно).

@escantor, 15.03.2010 8:55:00
А для чего конкретно вы используете tmpfs?
Архивирование и обработка большого количества мелких файлов, работа с данными сигналов в текстовом формате (выделение столбцов\строк) - так быстрее.

@Иван, 15.03.2010 9:31:00
Я в последнее время подумываю над тем что лучше базу с мускулом в памяти держать.
Я там про горячих парней уже писал: грохнете базу - чур меня в комментах не проклинать :-) А синхронизовать ее потом как с той, что на винчестере?

@Olly Cat, 15.03.2010 10:58:00
К стати для особо горячих финских парней можно еще добавить, что использовать это надо с осторожностью при нехватки памяти.
Каждый уважающий себя горячий пингвиновод должен лично познакомиться с oom_killer :-)

@Dormestmass
В большинстве современных дистров tmpfs уже примонтирован в /dev/shm.
А хочется свой лесапед с квадратными колесами :-) То есть свой каталог, где только твои файлы.

@Анонимный, 15.03.2010 18:08:00
# mount -t ramfs none /mnt/ram
- это _настоящая_ ram, со всеми ее преимуществами, но целиком.

Трюк интересный (я попробую на университетском кластере, который не жалко :-)). Но это вся оперативка - а хочется, чтоб еще осталось приложениями.

Если очень надо ограничить объем:
Конечно, надо, а то все в своп уйдет.

Спасибо тебе, анонимный разум, за столь интересный трюк. Будем пробовать.

@Minoru
И ты здесь, Брут? :-)

А то создаётся впечатление, что ты всё ещё о tmpfs в ядре говоришь.
Да, увлекся.

Откуда и зачем там перевод строки?
У меня экран Уже, чем окно Scribefire - иногда я переношу слова принудительно, чтобы видеть, что пишу.

:)
Таки требую отменить это дурное правило :-)

Вроде как видел советы держать копию профиля Firefox в оперативке — мол, так быстрее работает.
Это тормозное чудовище ничто не спасет. И хотя я пользователь Огнелиса, но факт его тормозов (а в последнее время и несовместимости расширений) меня начинает бесить.

Еще раз спасибо за интересные трюки, идеи, советы и конечно же найденные ошибки :-) А коли отыщутся новые - отгружайте в комментарии.

Анонимный комментирует...

>Это тормозное чудовище ничто не спасет.

Прошу прощения, если знаете про VACUUM для фоксовского мускула. Помогало. Кэш фокса в tmps самообман. Меня огнелис уже не бесит. P.S. Сам давно на midori.

alias foxvacuum='find ~/.mozilla/firefox -name '*.sqlite' -print -exec sqlite3 {} "VACUUM; REINDEX;" \;'

Dmitriy комментирует...

Здравствуйте.
Может кто нибудь мне приведет пример, как запускать в потоке два bash-скрипта, script1 делает echo "имя файла" script2 на вход это имя получает и он его, например, копирует куда-нибудь. Поотдельности все работает, script1 печатает "имя", если это имя скопировать подставить параметром в script2 "имя" - нормально копирует. А если
запускаю в одной строке:
# script1 ; script2
- печатает "имя" и все, больше ничего!!! пусто на входе script2!!

Что не так???

avlubimov комментирует...

Все не так.

С таким уровнем познаний рутом скрипты отлаживаешь...

Можно в обратные кавычки заключить то, что должно выполниться и подставиться вместо себя.

script1 `script2`

Или использовать xargs

script2 | xargs script1

Анонимный комментирует...

у меня несколько клонов одной проги запущены под вайном под разными префиксами (чтобы могли работать параллельно)

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

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

как мне теперь вообще работать с этими файлами?
согласен на любой костыль.

PS файлы лежат в /dev/shm/ (/run/shm/)

Отправить комментарий

Подписаться на RSS-ленту комментариев к этому посту.