У меня сложилось впечатление, что у вас есть несколько неверных представлений о tmpfs
. Возможно, вам будет полезно прочитать документацию по ядру по этой теме; Я попытаюсь прояснить для вас некоторые вещи здесь.
Заголовок вашего вопроса «tmpfs
не переполняется для свопинга», похоже, не отражает фактического содержания вашего вопроса, но в любом случае tmpfs
действительно использует своп, хотя, возможно, он не переполняется для обмена. tmpfs
— это (виртуальная) файловая система в памяти; его содержимое живет только в памяти, но, поскольку оно может быть заменено, ядро может при необходимости сохранить его в свопе вместо физической памяти. Тем не менее файловые системы tmpfs
не могут быть больше общего объема доступной виртуальной памяти, т.е. физическая оперативная память и подкачка, как указано например. по бесплатно -h
.
По умолчанию файловые системы tmpfs
имеют максимальный размер, равный половине объема доступной физической памяти. Вы можете увеличить его, используя параметр size
, но опять же, он не может быть больше, чем доступная физическая память и подкачка (хотя это ограничение не применяется во время монтирования). Как только файловая система достигает своего максимального размера (точнее, содержит файлы, занимающие столько места), она сообщает, что ей не хватает места, как вы выяснили. tmpfs
сам по себе не поддерживает переполнение в любом месте, когда ему не хватает места.
Если вам нужно временное место для хранения больших файлов, используйте /var/tmp
, а не /tmp
. Вам действительно не нужна очень большая tmpfs
файловая система, это прямой путь к катастрофе, когда она переполняется (обычные способы восстановления памяти ядра не работают в tmpfs
) .
(Конечно, если у вас много ОЗУ, большой tmpfs
может работать. Я запускаю несколько систем со сборкой файловых систем tmpfs
размером 75% ОЗУ, из 32 ГБ, 64 ГБ или даже больше.)
Скрипт decrypt.sh
:
#!/bin/bash
# Create working directory.
tmpdir=$(mktemp -d)
# Remove the temporary directory upon exiting
trap 'rm -r "$tmpdir"' EXIT
# Copy "encrypt.sh" from somewhere.
cp /somewhere/encrypt.sh "$tmpdir"
# Start an interactive shell in the directory with
# HISTFILE set to /dev/null
( cd "$tmpdir" && HISTFILE=/dev/null bash )
Скрипт encrypt.sh
:
#!/bin/bash
# When exiting, terminate the parent shell
trap 'kill -s HUP "$PPID"' EXIT
# rest of script goes here
Скрипт decrypt.sh
отвечает за настройку рабочего каталога и его удаление. Настройка каталога включает его создание (с использованием mktemp -d
для создания временного каталога )и копирование в него скрипта encrypt.sh
из любого места, где может находиться оригинал. Удаление рабочего каталога происходит, когда скрипт decrypt.sh
завершает работу.
Сценарий encrypt.sh
завершит свою родительскую оболочку при выходе из нее, отправив ему сигнал HUP
, предлагающий сценарию decrypt.sh
удалить рабочий каталог. Каталог также будет удален, если пользователь выйдет из интерактивной оболочки, не запустив encrypt.sh
.
Вместо того, чтобы устанавливать HISTFILE
на /dev/null
или пытаться сбросить его в созданной интерактивной оболочке, вы можете просто установить HOME
на временный каталог. Файл истории будет создан под $HOME
и будет удален вместе с каталогом, когда decrypt.sh
выйдет из :
( cd "$tmpdir" && HOME="$tmpdir" bash )
Обратите внимание, что это влияет на поведение раскрытия тильды и cd
без аргумента и всего остального, что может использовать переменную HOME
.
Менее инвазивный вариант — явно установить для переменной HISTFILE
имя файла во временном каталоге:
( cd "$tmpdir" && HISTFILE="$tmpdir/.bash_history" bash )
Немного похоже :Инструмент, который использует некоторые из этих вещей (создает интерактивную оболочку во временном рабочем каталоге в чистой среде с очисткой -при выходе из оболочки):
Отказ от ответственности :Это я написал.