× К оглавлению На главную Об авторе

Дата и время публикации:    
Дата и время модификации:

Tmpfs и DevPts

1. Файловая система devpts

Файловая система обеспечивает интерфейс для устройства псвдотерминала (pty), который обычно монтируется в точке монтирования /dev/pts. Новой файл pty-устройства создается динамически каждый раз, когда мастер устройства мултиплексирования /dev/ptmx будет открыт. Во время монтирования возможна идентификация пользователя, группы и режима доступа для всех pty-файлов файловой системе devpts. Обычно, она используется для установки группы и режима, для того чтобы разрешить писать программам, которые имеют setgid для группы tty. Идентификация пользователя обычно не требуется во время монтирования. При отсутствии соответствующих опций монтирования, идентификатор пользователя наследуется от процесса, создающего pty.

Во время монтирования файловой системы devpts присваивается начальный SID и своя собственная корневая директория, обычно /dev/pts. При создании pty-файла SID берется производным от двух SID: корневой директории и создающего pty-файл процесса. Так же pty-файлам может потребоваться поменять обозначение программы для того, чтобы отразить изменение метки, связывающей процесс. Для примера, программа login может сменить метку pty-файла, созданного rlogind исходя из соображений безопасности(initial security context) командной оболочки пользователя(user shell).

2. Файловая система tmpfs

Под обобщенным название tmpfs понимается возможность хранить временные файлы, а именно временная файловая. Они хранятся в оперативной памяти компьютера, а не на жестком диске. Эта временный накопитель данных появляется в виде виртуального диска, где накопитель на жестком диске предоставляет ему только точку монтирования. Размер диска tmpfs изменяется динамически, а потому может гипотетически съесть всю оперативную память.

2.1 Ограничение размера временного диска

Размер выделяемого диска в оперативной памяти как для файловой системы tmpfs, так и файловой системы devpts изменяется динамически. А потому, если не ограничивать размер этого временного «безобразия», то он может съесть всю оперативную память. Поэтому, при создании временного диска, который создается во время монтирования, команде mount(8) необходимо передавать аргумент size. Например, как показано в дампе 2.1.1, создаем диск временного хранения размером 20m c точкой монтирования /tmp/temporary

Дамп 2.1.1

# mkdir -p /tmp/temporary
# mount -t tmpfs -o size=20m tmpfs /tmp/temporary

При этом может возникнуть вариант, когда будет превышен лимит открытых inodes, которые если судить по документации к ядру, по умолчанию устанавливаются равной половине количества страниц оперативной памяти, а на больших машинах с большим размером памяти равной минимальному количеству страниц(RAM) каким бы он ни был низким.

Поэтому, т.к. на большом количестве открытых файлов это станет критично, при монтировании нужно передавать аргумент nr_inode утилите mount(8) c числом и суффиксом k,m или g, при обозначении кило, мега или гига соответственно. По умолчанию, как уже упоминалось ранее, если указан аргумент size берется его половина. т.е nr_inodes = SIZE/2.

При nr_inodes=0 размер inode не лимитирован. Поэтому наш предыдущий пример не много скорректируем, как показан в дампе 2.1.2

Дамп 2.1.2

# mkdir -p /tmp/temporary
# mount -t tmpfs -o size=20m,nr_inodes=0 tmpfs   /tmp/temporary

3. Монтирование devpts и tmpfs во время запуска системы

3.1 SysV init

В Debian OC Linux использовался в более ранних версий Debian вполть до Jessie, когда в ходе бурной дисскуссии было решено использовать systemd по умолчанию. Поэтому далее речь пойдет о том, как это было когда-то и стало уже историей, но на базе знаний которой строится нынешняя жизнь.

В Debian OC Linux 6.0 Squeeze вы и намека не найдете на создание точек монтирования в /etc/fstab, потому что они теперь создаются в Init-скрипте mountkernfs.sh, udev, mountdevsubfs.sh, при инициализации на 4-м этапе загрузки "Нормальной Debian-системы". Это происходит во время запуска init-скриптов из директории /etc/rcS.d, которая по-сути своей подготавливает почву для инициализации системы по уровню выполнения(runlevels). Он указывается в /etc/inittab или в параметре ядра отдельным номером по уровню выполнения без каких-либо опций. Данные о точках монтирования в Init-скрипте mountdevsubfs.sh,udev и mountdevsubfs.sh прописаны жестко.

3.2 Точки монтирования реализуемые с использованием devpts

Директория /dev/pts c правами доступа: drwxr-xr-x UID:root, GID:root файловая система: pts О том как реализуются точки монтирования вннутри этой директории мы поговорили уже ранее.

3.3 Точки монтирования реализуемые с использованием tmpfs

3.3.1. Ограничение размера при монтировании

Init-скрипт mountdevsubfs.sh размер выделяемой для памяти под виртуальный диск tmpfs берет из файле /etc/default/tmpfs. Размер указывается в байтах в переменной TMPFS_SIZE. Если эта переменная не содержит значение, то размер выделяемой для памяти под виртуальный диск tmpfs нужно будет взять как было описано выше для ограничений размера временного диска.

Для сокращения записи можно использовать суффиксы k,m или g, при обозначении кило, мега или гига соответственно. Так,как показано в дампе 3.3.1

Дамп 3.3.1

...
TMPFS_SIZE=32m
...

Задаст ограничение выделяемой для памяти равным 32 Мбайт.

3.3.2 Директория /lib/init/rw

Обычно задействуется Init-скриптами во время загрузки системы, когда другие файловые системы могут быть смонтированы в режиме "только чтения" или ещё не смонтированы со всем. Cоздается в Init-скрипте mountkernfs.sh при инициализации на 4-м этапе загрузки "Нормальной Debian-системы".

3.3.3 Директория /dev

Директория /dev содержит специальные или файлы устройств. Должна содержать скрипт MAKEDEV, который создает необходимый набор файлы устройств. Если потребуется, MAKEDEV может обеспечить создания любых устройств, которые могут быть найдены в системе, но лишь тех, что установлены конкретной реализации.

Пользователь должен помнить, что использование в Debian Squeeze скрипта /dev/MAKEDEV был очень спорный момент, потому что этот скрипт является символической ссылкой на /bin/true, возвращающий всегда признак успешного завершения.

Виртуальный диск для хранения специальных или файлы устройств с точкой монтирования /dev создаются в Init-скрипте udev при инициализации на 4-м этапе загрузки "Нормальной Debian-системы".

3.3.4 Директория /dev/shm

Используется в качестве разделяемой памяти между программами(процессами), что является весьма эффективным. Особенно, когда одна программа может записать, а другая прочитать, что неминуемо приведет к некоторому повышению быстродействия. Довольно часто используется для повышения выполнения виртуальной машины на хозяйской Linux-системе. Cоздается в Init-скрипте mountdevsubfs.sh при инициализации на 4-м этапе загрузки "Нормальной Debian-системы".

3.3.5 Ограничение размера директории /dev/shm

Размер выделяемой для памяти под виртуальный диск tmpfs в точке монтирования /dev/shm скрипт инициализации mountdevsubfs.sh берет из переменной SHM_SIZE, которая определена в /etc/default/tmpfs. Если значение этой переменной не указано, то размер выделяемой для памяти под виртуальный диск tmpfs будет взять как описано выше в п. 3, посвященный ограничению размера временного диска.

Размер в SHM_SIZE берется кратным размеру страницы, равный 4096 байт. Таким образом, любой размер, который не удовлетворяет условию кратности будет округлен.

Для сокращения записи можно использовать суффиксы k,m или g, при обозначении кило, мега или гига соответственно. Так,

TMPFS_SIZE=16k

Задаст ограничение выделяемой для памяти равным 16 Kбайт.

3.3.6 Методы создания собственного виртуального диска во время загрузки системы

Метод использования /etc/fstab

Самым простым вариантом монтирования и создания виртуального диска tmpfs в собственной точке монтирования, например /mnt/customfs, состоит в установки /etc/fstab.

Дамп 3.4.1

...
tmpfs /tmp/temporary tmpfs noatime,user,nosuid,size=20m,nr_inodes=0  0 0  
...

Как показано в дампе 3.4.1, указана к точке монтирования /mnt/temporary опция "noatime", котрая запрещает (или значительно снижает) записи на диск всякий раз, когда происходит чтение файла. При этом опцию "noatime" явно не указывать, потому что она устанавливается по умолчанию с версии Linux-2.6.30

Метод использования /etc/fstab является конечно более практичным, но с точки зрения того же проекта Debian это не надежно и может привести к ошибкам во время загрузки системы. Поэтому мы напишем Init-скрипт, листинг которого приводится ниже.

Метод использования Init-скрипта SysVinit

Создадим Init-скрипт /mnt/temporary по аналогии с mountkernfs.sh, udev, mountdevsubfs.sh и назовем его mountemporary.sh, который будет осуществлять монтирование виртуального диска в точке монтирования, которой является директория /mnt/costomtmfs.

Дамп 3.4.2

#! /bin/sh 
### BEGIN INIT INFO  
# Provides:     mountemporary.sh  
# Required-Start:     
# Required-Stop:  
# Should-Start:   mountkernfs  udev  mountdevsubfs.sh 
# Default-Start:  S  
# Default-Stop:  
# Short-Description: Mount costom file systems(/mnt/costomtmfs) under /mnt  
# Description:   Mount the virtual filesystems the custom temporary disk provides  
#      in mount point  the /mnt/costomtmfs. If this mount point is not exist, 
#    it will be created now and after will be  mounted! 
### END INIT INFO  
 
PATH=/sbin:/bin  
 
TMPFS_SIZE=  
[ -f /etc/default/tmpfs ] && . /etc/default/tmpfs  
 
KERNEL="$(uname -s)"  
 
. /lib/lsb/init-functions  
. /lib/init/mount-functions.sh  
 
do_start () {  
     #  
     # Mount a tmpfs on / 
     #  
     if [ ! -d /tmp/temporary ]  
     then  
         mkdir --mode=777  /tmp/costomfs 
     fi  
     CUSTOMFS_OPT=  
     [ "${CUSTOMFS_SIZE:=$TMPFS_SIZE}" ] && CUSTOMFS_OPT=",size=$CUSTOMFS_SIZE"  
     [ "${SHM_SIZE:=$TMPFS_SIZE}" ] && SHM_OPT=",size=$CUSTOMFS_SIZE"  
     domount tmpfs "" /tmp/temporary tmpfs -omode=0777$RW_OPT  
}  
 
case "$1" in  
  "")  
     echo "Warning: mountemporary should be called with the 'start' argument." >&2  
     do_start  
      ;;  
  start)  
     do_start  
      ;;  
     restart|reload|force-reload)  
      echo "Error: argument '$1' not supported" >&2  
     exit 3  
      ;;  
  stop)  
      # No-op  
      ;;  
  *)  
     echo "Usage: mountemporary [start|stop]" >&2  
     exit 3  
      ;;  
esac  

При этом нужно учесть, что файл /etc/default/tmpfs будет доступен только после установки пакета initscripts, который теперь не устанавливается по умолчанию после замены менеджера управления загрузкой системы SysVinit на Systemd

Метод использования юнитов в Systemd

Для монтирования носителей, в т.ч. и виртуальных в ОЗУ, в более поздних версиях Debian, например как в 11-й версией (bullseye), нужно использовать метод юнитовой (раздельной) конфигурации Systemd, который основывается на использование юнит-файлов c незатейливым форматом текста plain-text, например для создания и управления в системе сервисами (.service), сокетами (.device) и конечно же точек монтирования (.mount)[4.11].

Для создание юнит-файла точки монтирования (.mount) можно было бы воспользоваться утилитой systemd-fstab-generator, которая поставляется вместе с пакетом Systemd и создает эти файлы на основе лексического разбора /etc/fstab, но у нас нет точки монтирования /tmp/temporary в /etc/fstab, поэтому пишем юнит-файл mnt-temporary.mount в директории /etc/systemd/system/ или получаем с использованием дампа 3.4.3

Дамп 3.4.3

$ sudo systemctl daemon-reload

В результате, если точка монтирования /tmp/temporary указана в файле /etc/fstab, в директории /var/run/systemd/generator/tmp-temporary будет сгененрирован systemd-fstab-generator в ходе выполнения daemon-reload, как показано в дампе 3.4.4

Дамп 3.4.4

$ sudoedit /var/run/systemd/generator/tmp-temporary.mount  
# Automatically generated by systemd-fstab-generator

[Unit]
Documentation=man:fstab(5) man:systemd-fstab-generator(8)
SourcePath=/etc/fstab

[Mount]
Where=/tmp/temporary
What=tmpfs
Type=tmpfs
Options=noatime,nosuid,noauto,user,size=20m,nr_inodes=0

Который в принципе повторяет последовательность ввода полей в /etc/fstab, но только путем ввода параметров в аргументах точки монтирования в отдельных строках и параметрах юнит-файла: параметр What — указываем что монтируем, в данном случае виртуальный диск в ОЗУ (tmpfs); параметр Where — куда монтируем, т.е. в какую директорию монтируем; параметр Type — указывается тип файловой системы, а в Options перечисляем опции монтирования в Options

После чего, копируем полученный файл tmp-temporary.mount в директорию и добавляем секцию Install и local-fs.target

Дамп 3.4.5

$ sudo cp /var/run/systemd/generator/tmp-temporary.mount /etc/systemd/system
$ sudoedit /etc/systemd/system/tmp-temporary.mount
...
[Install]
WantedBy=multi-user.target

Далее, выполняем активацию секции Install и WantedBy=multi-user.target [4.13], которая позволит без лишней активации, как показано 3.4.6, проводить монтирование /tmp/temporary

Дамп 3.4.6

$ sudo systemctl enable tmp-temporary.mount
Created symlink /etc/systemd/system/multi-user.target.wants/tmp-temporary.mount → /etc/systemd/system/tmp-temporary.mount.

Cоответсвенно, проверяем, что все прекрасно, как показано в дампе 3.4.7

Дамп 3.4.7

$ systemctl list-unit-files -t mount | grep temporary
tmp-temporary.mount                     enabled   enabled

И монтируем под пользователем, как показано в дампе 3.4.8

Дамп 3.4.8

  
$ sudo systemctl start tmp-temporary.mount && df | grep temporary
tmpfs                20480            0     20480            0% /tmp/temporary

Размонтируем под тем же пользователем, как показано в дампе 3.4.9

Дамп 3.4.9

  
$ sudo systemctl stop tmp-temporary.mount && df | grep temporary

Для де-активации секции Install и WantedBy=multi-user.target, выполнить systemctl disable, как показано 3.4.10

Дамп 3.4.10

  
$ sudo systemctl disable tmp-temporary.mount
Removed /etc/systemd/system/multi-user.target.wants/tmp-temporary.mount.

При этом, как оказалось, монтирование без ошибок с помощью systemd возможно только, если точка монтирования указана в директории /tmp, а вот как это победить поговорим в следующий раз.

4. Библиография

4.1 WikipediA.Systemd

4.2 Filesystem Hierarchy Standard

4.3 Debian Policy Manual

4.4 The Debian GNU/Linux FAQ Chapter 11 - Customizing your installation of Debian GNU/Linux

4.5 Devpts

4.6 What is /dev/shm and its practical usage

4.7 Can I increase inode count in Linux?

4.8 Linux optimization.Tmpfs

4.9 Debian.Wiki.SSDOptimization

4.10 ArchWiki.Systemd

4.11 freedesktop.org.Systemd.unit

4.12 GitHub. Unit-file tmp.mount

4.13 /tmp in tmpfs, how do this only with systemd?

4.14 How To Auto Mount a FileSystem Using Systemd

4.15 How to remount a systemd mount unit with different options

4.16 Fedora Docs. Understanding and administering systemd

Сайт разработан в соответствии с рекомендациями консорциума W3C для языка разметки HTML5.

Об авторе можно прочитать здесь.

Copyright © 2015-2019 Андрей Ржавсков