LINUX.ORG.RU

Как правильно пользоваться /dev/shm в современном линуксе?


0

0

mount | grep shm выдаёт:
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec)

Соответствующая строка в /etc/fstab :
shm /dev/shm tmpfs nodev,nosuid,noexec 0 0

Можно ли просто писать временные файлы в эту директорию не заморачиваясь с монтированием каких-либо ещё?

★★★★★

Забыл уточнить: ядро 2.6.28.

question4 ★★★★★
() автор топика

>эту директорию

В упор не вижу никаких директорий. Ты хочешь _временно_ хранить фалы в оперативке?

wyldrodney
()

я правильно её использую так:

scyld-debian:/# cat /etc/initramfs-tools/scripts/init-bottom/scyld
#!/bin/sh
PREREQ="udev"
prereqs()
{
echo "$PREREQ"
}

case $1 in
prereqs)
prereqs
exit 0
;;
esac


modprobe aufs
modprobe squashfs
modprobe loop

sleep 2

mount -o move /root/dev/ /dev/
touch /etc/mtab
mkdir /boot.scyld
mount -w -t tmpfs none /boot.scyld
mkdir /boot.scyld/mount
mount --move /root/ /boot.scyld/mount
mount -o rw,remount /boot.scyld/mount
#
#mkdir /boot.scyld/rw
#mount -t tmpfs none /boot.scyld/rw
#
mkdir /boot.scyld/ro
mknod /dev/loop0 b 7 0
mount -t squashfs -o loop /boot.scyld/mount/root.sfs /boot.scyld/ro
mount -t aufs -o br:/boot.scyld/mount/rw=rw:/boot.scyld/ro=ro none /root
mount -o move /dev /root/dev/
mkdir /root/dev/shm
mount -t tmpfs devshm /root/dev/shm
mount -o move /boot.scyld /root/dev/shm

scaldov ★★
()
Ответ на: комментарий от wyldrodney

> В упор не вижу никаких директорий.

К этой директории на достаточно новых ядрах по умолчанию подмонтирована файловая система tmpfs размером 0,5 объёма физической памяти.

> Ты хочешь _временно_ хранить фалы в оперативке?

Да.

> http://www.linuxfocus.org/Russian/July2001/article210.shtml Вот это для ознакомления можно почитать.

Спасибо, но там рассказывают о ramfs по состоянию на 2001 год. Разве от неё не отказались несколько лет назад в пользу tmpfs?

question4 ★★★★★
() автор топика
Ответ на: комментарий от scaldov

>>/dev/shm это классический tmpfs

> в который монтируется корневая фс при работе initramfs

Я спрашиваю уже про нормальное функционирование системы, когда загрузка закончилась.

question4 ★★★★★
() автор топика

> Можно ли просто писать временные файлы в эту директорию не заморачиваясь

Можно, но она не для этого предназначена.

man shm_open

tailgunner ★★★★★
()
Ответ на: комментарий от scaldov

> я правильно её использую так:

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

Скажем, программе надо создать временный файл. Который будет нужен всего в течении нескольких секунд или минуты. И который должен быть доступен нескольким другим программам. Потом его можно со спокойной совестью удалить. Писать на жёсткий диск? Файлов таких много. Объём невелик (от десятков килобайт до нескольких мегабайт), хранить их в памяти позволяет. Желательно, чтобы программа "просто работала" на как можно большем числе компьютеров и не требовала прав рута для установки.

Имеется директория /dev/shm/ с правами drwxrwxrwt. Можно ли туда писать файлы с уникальными именами, или какие-то программы строятся из рассчёта, что /dev/shm/ пуста, и никто кроме них ею не пользуется? Можно ли ожидать, что она будет доступна на большинстве машин? Что о ней говорят основополагающие документы наподобие LSB?

question4 ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

> Можно, но она не для этого предназначена.

> man shm_open

Спасибо. Как осуществлять доступ к этому объекту из других программ? Просто вызывать shm_open с тем же именем? Останется ли объект существовать, после завершения породившего его процесса? Существует ли способ перенаправить ввод-вывод программы, использующей просто open() в такой объект, или для этого надо переписать программу?

question4 ★★★★★
() автор топика

Не вижу ничего, мешающего работать с shm. Я, например, при перекодировании звуковых файлов храню временные файлы там. Если оперативки гигов 8, можно вообще выделить под shm 6гигов, копировать туда образ DVD и заниматься перекодированием в avi, расположенном там же :)

(давно о таком мечтаю, но денег на реализацию нет :( )

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от question4

>> man shm_open

> Спасибо. Как осуществлять доступ к этому объекту из других программ? Просто вызывать shm_open с тем же именем? Останется ли объект существовать, после завершения породившего его процесса?

Для Линукса, ответы на все вопросы "да", но сами вопросы говорят о том, что тебе не нужен /dev/shm. Если очень хочешь tmpfs, смонтируй ее на /tmp

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Для Линукса, ответы на все вопросы "да"

Спасибо. Я правильно понял, что подмена open() невозможна?

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

>> сами вопросы говорят о том, что тебе не нужен /dev/shm

> Тогда что мне нужно?

По-моему, тебе нужен обычный временный файл. Типа man mktemp. Если тебе нужна семантика delete-on-close, то в Си это реализуется элементарно - открываешь файл, удаляешь его, и пользуешься полученным дескриптором. При закрытии файл будет удален.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> По-моему, тебе нужен обычный временный файл.

Насколько будет различаться время чтения из временного файла в памяти и временного файла на диске?

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

>Спасибо, но я спрашиваю не про загрузку, а про работу от имени непривилегированного пользователя. Который может даже не иметь права на команду mount.

если б ты читал не по диагонали, ты бы всё понял и не тупил.

scaldov ★★
()
Ответ на: комментарий от question4

> Насколько будет различаться время чтения

Померял. На полутора гигабайтах временных файлов разница в полтора-два раза.

question4 ★★★★★
() автор топика
Ответ на: комментарий от scaldov

> если б ты читал не по диагонали

Что из этого скрипта может повторить пользователь, не имеющий прав на mount и sudo? По-моему, ничего.

Что из создаваемого этим скриптом может быть полезно пользователю, не имеющему прав на sudo и mount?

Создаётся директория /boot.scyld, к ней монтируется tmpfs. Создаётся директория /root/dev/shm, к ней тоже монтируется tmpfs, затем в эту директорию перемещается то, что было смонтировано в /boot.scyld. И? Что из них останется после загрузки?

/root/dev/shm, надо думать, в итоге станет /dev/shm, но что там будет? Как в дальнейшем система испольует /dev/shm/ помимо вешанья на неё временных директорий? Для такого использования команда «mount -t tmpfs devshm /root/dev/shm» не нужна, достаточно создать какую-нибудь /root/tmp/1/, скомандовать, скажем, «mount -t tmpfs devshm /root/tmp/1/», а потом при желании перевешивать эту tmpfs из /root/tmp/1/ куда в голову взбредёт. Или не так?

При чём тут squashfs и aufs? Похоже, к использованию tmpfs они не относятся, здесь они решают задачи с ней напрямую несвязанные.

Как это соотносится с конфигурацией компьютера без initramfs? Тоже не ясно.

Итого ценного в скрипте: примеры запуска mount с -t tmpfs и -o move. Полезная информация, но ничего нового.

Я что-то пропустил?

question4 ★★★★★
() автор топика

Зачем вообще в таком случае что-то писать в файлы? Напиши какую-нибудь структуру данных, храни всё в ней.

Place-des-Arts
()
Ответ на: комментарий от tailgunner

> И своп у тебя, наверное, отключен?

Нет, но свопиться не начинало. Если начнёт свопиться, естественно скорость упадёт (возможно даже ниже, чем со временными файлами).

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

Насчёт "вдвое", я имел в виду всю программу. Которая выполняет и обработку данных, и запись временных файлов. А получилось так:

С записью временных файлов на диск:
real 2m26.056s
user 0m42.327s
sys 0m17.849s

С записью временных файлов в директорию со смонтированной tmpfs:
real 1m14.927s
user 0m41.823s
sys 0m7.304s

С записью временных файлов в /dev/null:
real 0m48.758s
user 0m43.535s
sys 0m2.376s

В другие задачи не переключался, ничего ресурсоёмкого не работало (нагрузка на процессор <1%). Каждое задание прогонял дважды и брал 2-ой результат, чтобы влияние дискового кеша на чтение исходных файлов было одинаковым. Получается, запись файлов в память заняла 26 секунд, а на диск — 97?

Вышеупомянутую разницу в полтора раза получал в плохо воспроизводимых условиях, когда много времени требовалось на вывод в консоль stderr. Здесь я его направил в /dev/null.

question4 ★★★★★
() автор топика
Ответ на: комментарий от Place-des-Arts

> Зачем вообще в таком случае что-то писать в файлы? Напиши какую-нибудь структуру данных, храни всё в ней.

С файлами проще. Один файл могут читать несколько независимых процессов. Файлы можно обрабатывать даже bash-скриптами. Если я правильно понял man shm_overview, shm_open мне хватит.

Спасибо tailgunner и no-dashi за пинки в правильном направлении.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

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

Хм, вроде речь шла о чтении.

> Получается, запись файлов в память заняла 26 секунд, а на диск — 97?

Если часть данных таки ушла на блин (fsync или даже close), то вполне возможно.

tailgunner ★★★★★
()
Ответ на: комментарий от question4

> Если я правильно понял man shm_overview, shm_open мне хватит.

Я уже жалею, что посоветовал этот ман %) shm_* - это для организации shared memory. То, что они в Линуксе реализованы поверх tmpfs - просто артефакт реализации и влияние Plan9.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.