3/15/2010

Виртуальный диск в памяти: как создать 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 комментариев:

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

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

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

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

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

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

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

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

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

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

    ОтветитьУдалить
  8. Спасибо. Полезная информация.

    ОтветитьУдалить
  9. # 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

    ОтветитьУдалить
  10. он же RAM-дисках
    «он же — RAM-диск»

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

    ramdisk<br>
    больше

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

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

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

    ОтветитьУдалить
  11. @Анонимный, 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 в оперативке — мол, так быстрее работает.
    Это тормозное чудовище ничто не спасет. И хотя я пользователь Огнелиса, но факт его тормозов (а в последнее время и несовместимости расширений) меня начинает бесить.

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

    ОтветитьУдалить
  12. >Это тормозное чудовище ничто не спасет.

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

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

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

    Что не так???

    ОтветитьУдалить
  14. Все не так.

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

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

    script1 `script2`

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

    script2 | xargs script1

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

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

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

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

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

    ОтветитьУдалить