zaLinux.ru

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


Оглавление

1. Что такое tmpfs

2. Для чего можно использовать tmpfs

3. Как использовать tmpfs

4. Интерфейс (скрипт) для работы с tmpfs (файловой системой виртуальной памяти)

4.1 Скачать скрипт для работы с tmpfs (tmpfs-mounter)

4.2 Опции tmpfs-mounter

4.3 Примеры использования tmpfs-mounter

Заключение


Эта инструкция расскажет о tmpfs: как создать файловую систему tmpfs; также в этой статье будет дан скрипт ускоряющий работу с tmpfs и делающий взаимодействие с файловой системой tmpfs более удобной.

1. Что такое tmpfs

tmpfs — это файловая система виртуальной памяти.

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

Файловая система автоматически создаётся при монтировании файловой системы с типом tmpfs с помощью следующей команды:

sudo mount -t tmpfs -o size=10M tmpfs /mnt/mytmpfs

Файловая система tmpfs имеет следующие свойства:

  • Файловая система может использовать пространство подкачки, когда не хватает физической памяти.
  • Файловая система потребляет только столько физической памяти и пространства подкачки, сколько требуется для хранения текущего содержимого файловой системы.
  • Во время операции перемонтирования (mount -o remount) размер файловой системы может быть изменён (без потери существующего содержимого файловой системы).

Если файловая система tmpfs размонтирована, её содержимое отбрасывается (теряется).

2. Для чего можно использовать tmpfs

Файловая система tmpfs отлично подойдёт для ресурсоёмких задач, узким местом которых является скорость чтения и записи на диск.

Смотрите пример использования tmpfs: Как ускорить создание словарей с паролями

Также tmpfs может пригодиться для уменьшения износа SSD/HDD при работе с обширными, но временными файлами. К примеру, мне нужно экспортировать большие базы данных из СУБД MariaDB в файлы, а затем эти файлы нужно сжать в архив и отправить по сети. После завершения отправки, файл больше не нужен и он удаляется. То есть мой SSD используется интенсивно, но в конечном счёте файлы удаляются после того, как выполнят их функцию. В этом и подобной ситуациях tmpfs отлично подойдёт.

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

3. Как использовать tmpfs

На самом деле создание виртуальной файловой системы в оперативной памяти очень проста. Чтобы создать раздел tmpfs, начнём с создания точки монтирования. Вы можете выбрать постоянное расположение, но я предпочитаю создавать новую директорию для монтирования tmpfs его в папке /tmp:

mkdir /tmp/mytmpfs

Примечание: всё содержимое папки /tmp удаляется при перезагрузки компьютера.


Затем выполните следующую команду:

sudo mount -t tmpfs -o size=5g tmpfs /tmp/mytmpfs

В этой команде:

  • 5g — размер виртуальной файловой системы в гигабайтах
  • /tmp/mytmpfs — точка монтирования виртуальной файловой системы

Всё готово — теперь вы можете перейти в виртуальную файловую систему и выполнять различные операции:

cd /tmp/mytmpfs

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

Если в процессе работы tmpfs вы столкнётесь с тем, что у вас не хватает места на данном разделе, то вы можете увеличить размер раздела без потери данных, хранящихся на нём:

sudo mount -t tmpfs -o remount,size=10g tmpfs /tmp/mytmpfs

Обратите внимание на добавление опции remount: поскольку размер (size) также является опцией монтирования, которые указываются после -o, то эти две опции перечислены через запятую)

Если вы боитесь запутаться в синтаксисе, то вы можете просто указать опцию -o дважды (в данном случае -o remount и -o size=10g являются опциями для монтирования файловой системы):

sudo mount -t tmpfs -o remount -o size=10g tmpfs /tmp/mytmpfs

Последние две команды являются идентичными.

При перемонтирвоании не теряются данные, которые хранятся на разделе tmpfs.

После перезагрузки компьютера или размонтирования tmpfs данные на этом разделе будут потеряны.


Чтобы размонтировать раздел tmpfs выполните команду:

sudo umount /tmp/mytmpfs

4. Интерфейс (скрипт) для работы с tmpfs (файловой системой виртуальной памяти)

4.1 Скачать скрипт для работы с tmpfs (tmpfs-mounter)

Как можно было убедиться выше, начать работу с tmpfs можно буквально одной командой. Но если у вас возникает необходимость воспользоваться виртуальной файловой системой tmpfs эпизодически, то приходится лезть в справку, чтобы вспомнить опции этой команды. У меня такая же проблема и я решил её с помощью скрипта, который облегчает работу с tmpfs.

Возможно, вас это удивит, но у моего скрипта больше опций, чем у tmpfs 😄

В общем, вот исходный код скрипта:


#!/bin/bash

# Made by MiAl for zaLinux.ru and Suay.site

PROGNAME='tmpfs-mounter'
#PROGNAME=$0

# default values ​​of command line options
size=10
path='mytmpfs'
umount=0
show_information=0
remount=0

RED='\033[1;31m'
BBlack='\033[1;30m'
NC='\033[0m' # No Color

# if you want to launch Double Commander, then set here your username here
user=

help="""
${RED}All options are not mandatory:${NC}
	-h | --help	Show this help and exit
	-s | --size	Virtual memory filesystem size [Default: 10 GB]
	-p | --path	Path (after /tmp/) to the virtual memory filesystem [Default: mytmpfs, i.e. /tmp/mytmpfs]
	-u | --umount	Unmount the virtual memory filesystem
	-i | --info	Check if the virtual memory filesystem is already mounted
	-r | --remount	Remount the virtual memory filesystem (you can set a new size with the -s option)

${RED}Examples:${NC}

${BBlack}Show this help and exit:${NC}
	tmpfs-mounter
	sudo tmpfs-mounter -h
	
${BBlack}Mount virtual memory filesystem with default values [-s 10 -p mytmpfs]:${NC}
	sudo tmpfs-mounter

${BBlack}Mount virtual memory filesystem of 20 GB in size with default name [-p mytmpfs]:${NC}
	sudo tmpfs-mounter -s 20

${BBlack}Mount virtual memory filesystem of 20 GB in size and the path '/tmp/tmpfs-mysql':${NC}
	sudo tmpfs-mounter -s 20 -p tmpfs-mysql
	
${BBlack}Check if the virtual memory filesystem is already mounted and its size:${NC}
	sudo tmpfs-mounter -i
	
${BBlack}Remount the virtual memory filesystem with the new size 15 GB:${NC}
	sudo tmpfs-mounter -r -s 15
	
${BBlack}Unmount the virtual memory filesystem with the default value [-p mytmpfs]:${NC}
	sudo tmpfs-mounter -u

${BBlack}Unmount the virtual memory filesystem at '/tmp/tmpfs-mysql':${NC}
	sudo tmpfs-mounter -u -p tmpfs-mysql	
	
"""

usage () {
	echo -e "${RED}Discription:${NC}
${BBlack}\ttmpfs-mounter is a script for managing tmpfs (virtual memory filesystem).
\tThe script mounts tmpfs of the specified size at the specified path.
\tThe script can also remount tmpfs with a new size, check the tmpfs status and unmount tmpfs.${NC}
\n${RED}Usage:${NC}
\t${BBlack}sudo $PROGNAME [OPTIONS]${NC}
$help"
	return
}

is_tmpfs_ready () {
	if [[ -d "/tmp/$path" ]]; then
		echo 1
		return 1
	else
		echo 0
		return 0
	fi
}

show_tmpfs_info () {
	df -hT "/tmp/$path"
}

is_tmpfs_mounted () {
	mount | grep "/tmp/$path"
}

if [ "$EUID" -ne 0 ]
	then echo -e "${RED}Please run as root${NC}"
	usage
	exit
fi

while [[ -n $1 ]]; do
	case $1 in
		-s | --size)
			shift
			size=$1
			;;
			
		-d | --doublecmd)
			doublecmd=1
			size=
			path=
			;;

		-p | --path)
			shift
			path=$1			
			;;
			
		-u | --umount)
			umount=1
			;;

		-i | --info)
			show_information=1
			;;
			
		-r | --remount)
			remount=1
			;;
			
		-h | --help)
			usage
			exit
			;;
			
		*)
			usage >&2
			exit 2
			;;
	esac
	shift
done

if [[ $show_information -ne 0 ]]; then
	if [[ $(is_tmpfs_ready) -eq 1 ]]; then
		echo 'The mount directory exists'
		show_tmpfs_info
	else
		echo 'The directory does not exist'
	fi
	exit 0
	
elif [[ $umount -ne 0 ]]; then
	if [[ $(is_tmpfs_ready) -eq 1 ]]; then
		echo
	else
		echo 'The mount directory does NOT exist'
		exit 1
	fi
	umount "/tmp/$path"	
	if [[ -z "$(is_tmpfs_mounted)" ]]; then
		echo 'Virtual memory filesystem has been unmounted!'
		rm -rf "/tmp/$path"
		echo "/tmp/$path is removed!"
	else
		echo -e "${RED}Virtual memory filesystem is still mounted!\nMaybe it is busy.${NC}"
	fi
	
	exit 0

elif [[ $remount -eq 1 ]]; then
	if [[ $(is_tmpfs_ready) -eq 0 ]]; then
		echo 'The mount directory does NOT exist'
		exit 1	
	else
		mount -t tmpfs -o "remount,size=${size}g" tmpfs /tmp/$path
		show_tmpfs_info
		exit 0
	fi

elif [[ $doublecmd -ne 0 && "$user" ]]; then
	sudo -u $user doublecmd /tmp/$path
	exit 0

elif [[ $size -ne 0 && -n "$path" ]]; then
	if [[ $(is_tmpfs_ready) -eq 1 ]]; then
		echo 'The mount directory already exists'
		show_tmpfs_info
		exit 1
	fi
	mkdir /tmp/$path
	mount -t tmpfs -o size=${size}g tmpfs /tmp/$path
	show_tmpfs_info
	echo -e "\n\nTo change your current directory, type:\n${RED}cd /tmp/$path${NC}"
fi

Чтобы им пользоваться, скопируйте скрипт в файл tmpfs-mounter.

Затем перейдите в директорию с сохранёнными скриптом.

Далее сделайте этот файл исполнимым:

chmod +x tmpfs-mounter

Всё готово, теперь вы можете его запустить.

sudo ./tmpfs-mounter -h

При желании, вы также можете скопировать этот скрипт в директорию с пользовательскими исполнимыми файлами:

sudo cp tmpfs-mounter /usr/local/bin/

В этом случае вы можете запускать программу из любого места, без необходимости переходить в директорию с сохранённым скриптом:

sudo tmpfs-mounter -h

4.2 Опции tmpfs-mounter

Использование:

sudo tmpfs-mounter [ОПЦИИ]

Все опции не являются обязательными:

	-h | --help	Показать справку и выйти
	-s | --size	Размер виртуальной файловой системы [Значение по умолчанию: 10 GB]
	-p | --path	Часть пути (после /tmp/) до виртуальной файловой системы [Значение по умолчанию: mytmpfs, то есть /tmp/mytmpfs]
	-u | --umount	Размонтировать виртуальную файловую систему
	-i | --info	Проверить статус виртуальной файловой системы
	-r | --remount	Перемонтировать файловую систему (вы можете установить новый размер с помощью опции -s)

4.3 Примеры использования tmpfs-mounter

Чтобы вывести справку, запустите скрипт с опцией -h (или длинный вариант —help). Также запуск без sudo вызовет показ опций:

tmpfs-mounter

sudo tmpfs-mounter -h

Для работы скрипта необходимы права root, поэтому скрипт нужно запускать с sudo.

При запуске скрипта без опций, сразу будет смонтирована файловая система виртуальной памяти:

sudo tmpfs-mounter

По умолчанию её размер составит 10 Гигабайт, размещена она будет в /tmp/mytmpfs.

С помощью опции -s вы можете выбрать любой другой размер, например, вот пример создания tmpfs размером 20 Гигабайт:

sudo tmpfs-mounter -s 20


С помощью опции -p вы можете поменять имя tmpfs. Эту опцию можно комбинировать с опцией -s. Например, в данном случае в качестве имени выбрано "/tmp/tmpfs-mysql", а размер файловой системой виртуальной памяти составит 20 Гигабайт:

sudo tmpfs-mounter -s 20 -p tmpfs-mysql

Следующая команда проверит статус tmpfs. Если файловая система виртуальной памяти уже смонтирована, то будет выведена информация о её размере и использованном пространстве (эту опцию можно комбинировать с -p, если вы создали раздел с именем, отличным от имени по умолчанию):

sudo tmpfs-mounter -i

Следующая команда перемонтирует файловую систему виртуальной памяти с новым размером:

sudo tmpfs-mounter -r -s 15

Эта команда отмонтирует файловую систему виртуальной памяти:

sudo tmpfs-mounter -u

Если вы использовали путь до tmpfs отличный от дефолтного, то вы можете добавить к опции -u опцию -p, после которой укажите путь до файловой системы виртуальной памяти:

sudo tmpfs-mounter -u -p tmpfs-mysql

Заключение

tmpfs — это простой способ ускорить выполнение задач, узким место в производительности которых является скорость диска.

К тому же, при частой работе с временными файлами tmpfs позволяет снизить износ SSD.


Рекомендуемые статьи:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *