- Вопрос или проблема
- Замечания о fallocate и dd
- Вариант 1 (мой предпочтительный): удалите старый swap файл и создайте новый нужного размера:
- Вариант 2: изменить размер старого swap файла:
- Как изменить размер swap файла:
- Ссылки:
- Смотрите также:
- Ответ или решение
- Теоретическая часть
- Пример
- Применение
- Обсуждение
- Заключение
Вопрос или проблема
Есть ли способ увеличить мой существующий “swapfile”, не уничтожая и не пересоздавая его? Я хотел бы увеличить мой swap-объём с 1 ГБ до 2 ГБ. В данный момент он настроен следующим образом:
$ sudo swapon -s
Filename Type Size Used Priority
/swapfile file 1048572 736640 -1
$ ls -lh /swapfile
-rw------- 1 root root 1.0G Nov 9 2016 /swapfile
Я использую Ubuntu 14.04.
Сначала отключите swap файл:
sudo swapoff /swapfile
Теперь увеличим размер swap файла:
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 oflag=append conv=notrunc
Команда выше добавит 1 GiB нулевых байтов в конец вашего swap файла.
Настройте файл как “swap файл”:
sudo mkswap /swapfile
включите swap:
sudo swapon /swapfile
На производственной системе, если ваша операционная система не позволяет отключить swap файл с помощью sudo swapoff /swapfile
и вы получаете сообщение типа:
swapoff failed: Cannot allocate memory
Тогда вы можете рассмотреть возможность создания нескольких swap файлов или создать новый большего размера, инициализировать его, а затем удалить старый меньшего размера.
Вместо изменения размера существующего swap файла вы должны добавить новый swap файл потому что это не стоит ничего. Чтобы изменить размер swap файла, вы должны сначала отключить его, что перемещает содержимое swap в ОЗУ, что увеличивает нагрузку на ОЗУ и может вызвать появление OOM killer (не говоря уже о том, что это может занять несколько минут). Несколько swap файлов не проблема, это проще простого — создать ещё один swap файл. На самом деле нет никаких преимуществ изменения размера swap файла по сравнению с добавлением нового.
dd if=/dev/zero of=/some/file count=1K bs=1M
mkswap /some/file
sudo chown root:root /some/file
sudo chmod 600 /some/file
sudo swapon /some/file
Эта команда dd
создаёт файл размером 1 гигабайт. count
— это размер файла в блоках, который устанавливается флагом bs
, в байтах. Здесь bs
установлен на 1M
(= 2^20 байт, 1 мегабайт (MiB)), который при умножении на 1K
(= 1024) становится 1 GiB (1 гигабайт).
Я протестировал этот ответ на всех LTS версиях Ubuntu с 14.04 LTS по 22.04 LTS включительно, все с файловой системой ext4
.
Замечания о fallocate
и dd
Прежде чем мы продолжим, я хочу указать, что некоторые ответы используют fallocate
для выделения места под файл, вместо dd
. Не делайте этого. Используйте dd
. @muru указал несколько важных пунктов здесь и здесь. Хотя fallocate
значительно быстрее, он может создавать файлы с дырами. Я думаю, что это просто означает, что пространство не является непрерывным, что плохо для swap файлов. Я представляю это так, что fallocate
создает связный список в стиле C из памяти, тогда как dd
создает непрерывный блок памяти в стиле массива C. Swap файлы нуждаются в непрерывном блоке. dd
делает это путем побайтового копирования нулевых двоичных данных из псевдо-файла /dev/zero
в новый файл, который он создает.
man swapon
также говорит не использовать fallocate
, а использовать dd
вместо него. Вот цитата (выделено):
ЗАМЕТКИ
Вы не должны использовать
swapon
на файле с дырами. Это можно увидеть в
системном журнале какswapon: swapfile has holes.
Реализация swap файла в ядре ожидает записи в файл напрямую, без помощи файловой системы. Это является проблемой на файлах с предварительным выделением памяти (например,
fallocate(1)
) на файловых системах какXFS
илиext4
, и на файловых системах с копированием при записи, таких какbtrfs
.Рекомендуется использовать
dd(1)
и/dev/zero
, чтобы избежать дыр на XFS и ext4.
А из man mkswap
(выделено):
Заметьте, что swap файл не должен содержать никаких дыр. Использование
cp(1)
для создания файла неприемлемо. Также неприемлемо использованиеfallocate(1)
на файловых системах, поддерживающих предварительно выделенные файлы, таких как XFS или ext4, или на файловых системах с копированием при записи, таких как btrfs. Рекомендуется использоватьdd(1)
и/dev/zero
в этих случаях. Пожалуйста, читайте заметки изswapon(8)
перед добавлением swap файла в файловые системы с копированием при записи.
Так что, используйте dd
, не fallocate
, для создания swap файлов.
Обновление 17 июня 2024: с swapon --version
swapon from util-linux 2.37.2
на Ubuntu 22.04, man swapon
всё еще говорит (выделено):
Файлы с предварительным выделением, созданные с помощью
fallocate
(1), могут интерпретироваться как файлы с дырами в зависимости от файловой системы. Swap файлы с предварительным выделением поддерживаются в XFS с Linux 4.18.Наиболее портативным решением для создания swap файла является использование
dd
(1) и/dev/zero
.
Таким образом, для наибольшей портативности, я продолжу рекомендовать технику dd
, как показано ниже, хотя современный fallocate
на некоторых файловых системах может работать хорошо и не создавать дыры.
Вариант 1 (мой предпочтительный): удалите старый swap файл и создайте новый нужного размера:
Вместо изменения размера swap файла, просто удалите его и создайте новый соответствующего размера!
swapon --show # посмотрите, какие swap файлы у вас активны
sudo swapoff /swapfile # отключите /swapfile
# Создайте новый swap файл размером 16 ГиБ (-n будет заблокирован на несколько минут, если используется старый жёсткий диск)
# (Например: 15 мая 2023 года это заняло 3 мин 3 сек на жёстком диске со скоростью 5400 об/мин
# модель HGST HTS541075A9E680 SATA 2.6, 3.0Гб/с в моем старом ноутбуке)
time sudo dd if=/dev/zero of=/swapfile count=16 bs=1G
sudo mkswap /swapfile # превратите этот новый файл в swap пространство
sudo chmod 0600 /swapfile # разрешите только root читать и писать в него, для безопасности
sudo swapon /swapfile # включите его
swapon --show # убедитесь, что он теперь активен
В случае, если вы добавляете этот swap файл в первый раз, убедитесь, что он указан в вашем файле /etc/fstab
, чтобы сделать swap файл снова доступным после каждой перезагрузки. Просто выполните эти две команды в вашем терминале:
# Сделайте резервную копию вашего файла /etc/fstab на случай, если вы
# допустите какую-либо ошибку
sudo cp /etc/fstab /etc/fstab.bak
# (Выполните эту команду и в своем терминале). Это добавит запись swapfile
# в конец вашего файла `/etc/fstab`, чтобы снова включить
# swap файл после каждой загрузки
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# Просмотрите файл `/etc/fstab`, чтобы убедиться, что запись swapfile была добавлена в конец.
# Вы должны увидеть это в конце вывода:
# ```
# /swapfile none swap sw 0 0
# ```
cat /etc/fstab
Источник: смотрите “Шаг 4: Сделайте изменения постоянными” здесь.
Для подробного описания, что означают 6 полей (столбцов) в файле /etc/fstab
, смотрите:
man fstab
Или, просмотрите это онлайн здесь: https://man7.org/linux/man-pages/man5/fstab.5.html.
Для значения sw
в четвертом поле файла /etc/fstab
, в системах BSD это означает swapon
, а в Linux это ничего не означает и нигде не документировано, но действует как “ритуальные программирование” суеверное и бессмысленное заполнение по историческим причинам. Поскольку наличие его там гарантирует, что эта запись fstab (таблица файловой системы) совместима с системами BSD, и поскольку это не нарушит системы Linux, хорошей идеей будет его включение для максимальной совместимости. Я опубликовал это здесь тоже.
Вариант 2: изменить размер старого swap файла:
Принятый ответ @Ravexina верен. Однако изначально я не понимал все его части, поэтому хотел бы включить больше описаний и объяснить больше подробностей. См. dd --help
и man dd
. Часть моего обучения по этому поводу происходит из блога Богдана Корняну. Я также добавляю несколько команд в конце, чтобы показать, как проверить ваш swap, как только вы его создадите.
Как изменить размер swap файла:
Здесь мы увеличим размер существующего swap файла, добавив 8 ГиБ (Гибибайт) нулей в его конец.
-
Отключите использование только этого одного swap файла (размещенного по адресу “/swapfile“):
# Сделайте это sudo swapoff /swapfile # НЕ это, что необоснованно отключает все swap файлы или разделы # sudo swapoff --all # или # sudo swapoff -a
-
Увеличьте размер swap файла на 8 ГиБ, добавив все нулевые байты в его конец (вместо переписывания всего файла, что было бы медленно):
sudo dd if=/dev/zero of=/swapfile bs=1G count=8 oflag=append conv=notrunc
-
if
= входной файл -
/dev/zero
= специальный “файл” Linux, который просто выводит все нулевые байты каждый раз, когда вы читаете из него -
of
= выходной файл -
bs
= размер блока- Здесь
1G
обозначает 1 гибибайт, или ГиБ, который является основанием 2 для “гигабайта”, который является основанием 10. Согласноman dd
,G =1024*1024*1024
байт. Я предпочитаю так задавать размер файлов, так как компьютеры и память оборудования используют основание 2. - Если вы хотите использовать 1 гигабайт, или ГБ, который является основанием 10 для “гибибайта”, который является основанием 2, тогда вы должны использовать
1GB
вместо1G
.man dd
показывает, чтоGB =1000*1000*1000
байт.
- Здесь
-
count
= множитель блоков; общая память, которая будет записана, составитcount * bs
. -
oflag=append
означает добавлять в конец выходного файла, а не переписывать его. См.dd --help
иman dd
. Изdd --help
:append append mode (имеет смысл только для вывода; conv=notrunc рекомендовано)
-
conv=notrunc
означает, что при “преобразовании” файла “не усекать выходной файл”;dd --help
, как вы можете видеть выше, показывает, что это рекомендуется всегда, когда используетсяoflag=append
-
Примечание: если вы хотите переписать весь swap файл, а не только добавить в него, вы можете создать swap файл размером 32 ГиБ, например, так:
sudo dd if=/dev/zero of=/swapfile bs=1G count=32
-
-
Сделайте файл пригодным для использования как swap
sudo mkswap /swapfile
-
Включите swap файл
sudo swapon /swapfile
-
(Бонус/Опционально): убедитесь, что этот swap файл, который вы только что создали, теперь используется:
swapon --show
Пример вывода:
$ swapon --show NAME TYPE SIZE USED PRIO /swapfile file 64G 1.8G -2
Вы также можете увидеть некоторую информацию о памяти/swap с помощью этих двух команд:
# 1. Изучите файл /proc/meminfo на предмет строк, содержащих слово "swap", # таких как строка "SwapTotal" cat /proc/meminfo | grep -B 1000 -A 1000 -i swap # 2. Посмотрите на общую память (RAM) и swap (виртуальную память), использование # и свободное место: free -h
Ссылки:
- Ответ @Ravexina
- Блог Богдана Корняну здесь: https://bogdancornianu.com/change-swap-size-in-ubuntu/
- “Как создать и использовать swap файл на Linux”: https://itsfoss.com/create-swap-file-linux/
Смотрите также:
- Мой ответ, в котором я использую информацию о увеличении размера swapfile, чтобы решить ошибку нехватки памяти при компиляции Bazel: Stack Overflow: java.lang.OutOfMemoryError при выполнении bazel build
- Мой ответ: Unix & Linux: Что означает ‘sw’ в записи swap в fstab для колонки ‘mount options’
Вы можете создать ещё один swap файл, как это сделал я:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
- Проверьте, работает ли он с
sudo swapon --show
Чтобы сделать это постоянно, добавьте файл вfstab
с помощью команды:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
У меня хорошие результаты на моем Ubuntu 17.04 после следования совету Ариана Аcосты из блогпоста. Можно заменить 4G здесь sudo fallocate -l 4G /swapfile
на любое количество гигабайт, которое вы хотите. Например, sudo fallocate -l 2G /swapfile
для TS.
Как правило, рекомендованный размер swap файла — 2X количество ОЗУ, но вы можете сделать его настолько большим, насколько вам нужно. Помните, что это не является заменой для памяти, так как производительность значительно ниже, поскольку данные хранятся на диске.
Я создал простой bash скрипт, который увеличивает swap файл до 4 ГБ и протестировал его на Ubuntu 16.04.
Это можно запускать построчно или через bash скрипт, но я использую это для безголового установки.
#!/bin/bash
echo "====== Current Swap ======"
sudo swapon -s
echo "====== Turning Off Swap ======"
sudo swapoff /swapfile
echo "====== Allocating 4GB Swap ======"
sudo fallocate -l 4G /swapfile
echo "====== Making Swap ======"
sudo mkswap /swapfile
echo "====== Setting Permissions to Root Only ======"
sudo chmod 600 /swapfile
echo "====== Turning On Swap ======"
sudo swapon /swapfile
echo "====== Current Swap ======"
sudo swapon -s
echo "====== Done! ======"
Возможно, вы также захотите проверить разрешения. Другой способ сделать это:
# проверьте ваш swap
free
# отключите swap
sudo swapoff /swapfile
# чтобы создать SWAP файл, вам нужно будет использовать это.
sudo fallocate -l 4G /swapfile # то же, что и "sudo dd if=/dev/zero of=/swapfile bs=1G count=4"
# Обеспечьте безопасность swap.
sudo chown root:root /swapfile
sudo chmod 0600 /swapfile
# Подготовьте swap файл, создавая область Linux swap.
sudo mkswap /swapfile
# Активируйте swap файл.
sudo swapon /swapfile
# Подтвердите, что swap раздел существует.
sudo swapon -s
# снова проверьте ваш swap
free
.
Ответ или решение
Чтобы увеличить размер файла подкачки на Ubuntu 14.04 без его удаления, необходимо выполнить несколько шагов. Важно понимать, что файл подкачки используется операционной системой как виртуальная память, и увеличение его размера может повлиять на производительность системы. Мы подробно рассмотрим процедуру изменения размера файла подкачки, сохраняя текущие настройки, и рассмотрим причины использования данного подхода.
Теоретическая часть
Файл подкачки используется Linux для расширения оперативной памяти (RAM). Когда физическому объему RAM не хватает для выполнения задач, система использует файл подкачки для временного хранения данных, которые неактуальны в данный момент. Однако, файл подкачки не может заменить реальную память, поскольку чтение и запись данных на диск выполняется значительно медленнее, чем доступ к RAM.
Пример
В вашем случае текущий файл подкачки имеет размер 1 ГБ. Чтобы увеличить его до 2 ГБ, вы можете использовать команду dd
, чтобы добавить к существующему файлу подкачки дополнительное пространство. Это позволяет избежать необходимости переконфигурации системы после удаления и создания нового файла.
Применение
Следующие команды помогут вам изменить размер файла подкачки, не удаляя его:
-
Отключите файл подкачки:
sudo swapoff /swapfile
Это временно отключит файл подкачки, чтобы избежать конфликта при его изменении.
-
Увеличьте размер файла подкачки:
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 oflag=append conv=notrunc
Эта команда добавит 1 ГБ нулевых байтов к концу вашего текущего файла подкачки.
-
Настройте файл как файл подкачки:
sudo mkswap /swapfile
Это нужно для того, чтобы Linux заново распознал измененный файл как файл подкачки.
-
Включите файл подкачки:
sudo swapon /swapfile
Теперь ваш файл подкачки будет активен с увеличенным объемом.
-
Проверьте настройки файла подкачки:
sudo swapon -s free -h
Эти команды позволят вам убедиться, что файл подкачки действительно увеличен и активен.
Обсуждение
Преимущество добавления нового блока данных к существующему файлу подкачки состоит в том, что это экономит время и снижает риск потери системы из-за нехватки оперативной памяти во время процедуры. Тем не менее, стоит учитывать, что увеличение файла подкачки без соответствующего увеличения физической оперативной памяти не всегда решает проблемы производительности и может в некоторых ситуациях даже замедлить систему.
Заключение
В ситуациях, где отключение файла подкачки невозможно (возможные ошибки swapoff failed: Cannot allocate memory
), или если вы опасаетесь воздействия на стабильность системы, более безопасный подход — это создание дополнительного файла подкачки. Завершив процедуру, убедитесь, что все изменения были успешно применены, и протестируйте систему под нагрузкой, чтобы удостовериться в стабильности настроек.