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

Вопрос или проблема

Есть ли способ увеличить мой существующий “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 ГиБ (Гибибайт) нулей в его конец.

  1. Отключите использование только этого одного swap файла (размещенного по адресу “/swapfile“):

     # Сделайте это
     sudo swapoff /swapfile
    
     # НЕ это, что необоснованно отключает все swap файлы или разделы
     # sudo swapoff --all
     # или
     # sudo swapoff -a
    
  2. Увеличьте размер 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
      
  3. Сделайте файл пригодным для использования как swap

     sudo mkswap /swapfile
    
  4. Включите swap файл

     sudo swapon /swapfile
    
  5. (Бонус/Опционально): убедитесь, что этот 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
    

Ссылки:

  1. Ответ @Ravexina
  2. Блог Богдана Корняну здесь: https://bogdancornianu.com/change-swap-size-in-ubuntu/
  3. “Как создать и использовать swap файл на Linux”: https://itsfoss.com/create-swap-file-linux/

Смотрите также:

  1. Мой ответ, в котором я использую информацию о увеличении размера swapfile, чтобы решить ошибку нехватки памяти при компиляции Bazel: Stack Overflow: java.lang.OutOfMemoryError при выполнении bazel build
  2. Мой ответ: Unix & Linux: Что означает ‘sw’ в записи swap в fstab для колонки ‘mount options’

Вы можете создать ещё один swap файл, как это сделал я:

  1. sudo fallocate -l 4G /swapfile
  2. sudo chmod 600 /swapfile
  3. sudo mkswap /swapfile
  4. sudo swapon /swapfile
  5. Проверьте, работает ли он с 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, чтобы добавить к существующему файлу подкачки дополнительное пространство. Это позволяет избежать необходимости переконфигурации системы после удаления и создания нового файла.

Применение

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

  1. Отключите файл подкачки:

    sudo swapoff /swapfile

    Это временно отключит файл подкачки, чтобы избежать конфликта при его изменении.

  2. Увеличьте размер файла подкачки:

    sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 oflag=append conv=notrunc

    Эта команда добавит 1 ГБ нулевых байтов к концу вашего текущего файла подкачки.

  3. Настройте файл как файл подкачки:

    sudo mkswap /swapfile

    Это нужно для того, чтобы Linux заново распознал измененный файл как файл подкачки.

  4. Включите файл подкачки:

    sudo swapon /swapfile

    Теперь ваш файл подкачки будет активен с увеличенным объемом.

  5. Проверьте настройки файла подкачки:

    sudo swapon -s
    free -h

    Эти команды позволят вам убедиться, что файл подкачки действительно увеличен и активен.

Обсуждение

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

Заключение

В ситуациях, где отключение файла подкачки невозможно (возможные ошибки swapoff failed: Cannot allocate memory), или если вы опасаетесь воздействия на стабильность системы, более безопасный подход — это создание дополнительного файла подкачки. Завершив процедуру, убедитесь, что все изменения были успешно применены, и протестируйте систему под нагрузкой, чтобы удостовериться в стабильности настроек.

Оцените материал
Добавить комментарий

Капча загружается...