Я не могу включить пространство подкачки в CentOS 7

55

Итак, я следую учебному пособию по установке OTRS, которая является Открытой системой запроса билетов. Таким образом, для установки требуется: 4 ГБ пространства подкачки. Вот команда, которую я использовал:

[root@ip-10-0-7-41 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       50G   14G   37G  27% /
devtmpfs        478M     0  478M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M   13M  484M   3% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000
[root@ip-10-0-7-41 ~]# fallocate -l 4G /myswap
[root@ip-10-0-7-41 ~]# ls -lh /myswap
-rw-r--r--. 1 root root 4.0G Jul  8 08:44 /myswap
[root@ip-10-0-7-41 ~]# chmod 600 /myswap
[root@ip-10-0-7-41 ~]# mkswap /myswap
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=3656082a-148d-4604-96fb-5b4604fa5b2e
[root@ip-10-0-7-41 ~]# swapon /myswap
swapon: /myswap: swapon failed: Invalid argument

Вы можете увидеть: Ошибка неверного аргумента здесь. Я тщетно пытался включить его. Кто-то, пожалуйста, подскажите, как исправить эту ошибку. (Я использую этот CentOS 7 на AWS Instance EC2)

[root@ip-10-0-7-41 ~]# df -T | awk '{print $1,$2,$NF}' | grep "^/dev"
/dev/xvda1 xfs /
Тот самый
источник
На какой файловой системе это происходит? btrfs случайно?
Щайба
@schaiba Здравствуйте, я редактировал свой вопрос. Я думаю, что файловая система XFS.
The One
2
На XFS действительно лучше использовать dd. Помните, что не все файловые системы поддерживают обмен или, по крайней мере, не одинаково.
Щайба
@schaiba Я не очень хорошо знал о типе файловой системы. Спасибо.
The One

Ответы:

102

Проблема в fallocate(1)том, что он использует файловую систему ioctlsдля быстрого и эффективного выделения ресурсов, недостатком является то, что он не выделяет пространство физически, а swapon(2)системный вызов требует реального пространства. Ссылка: https://bugzilla.redhat.com/show_bug.cgi?id=1129205

Я уже сталкивался с этой проблемой раньше с моей коробкой тоже. Так что вместо того, чтобы использовать fallocate, я использовал, ddкак предлагает ссылка

sudo dd if=/dev/zero of=/myswap count=4096 bs=1MiB

и двигаться вперед chmod, mkswap& swaponкоманды. Бинго! Это сработало.

Рахул
источник
1
Как ни странно, файл подкачки fallocate, который у меня работал, отлично работал на Ubuntu 16.04.3 LTS, но не работает с сообщением «swapon fail: Invalid аргумент» в Red Hat Enterprise Linux Server версии 7.4 (Maipo). Приведенная выше команда dd действительно работает на RedHat. Между этими двумя операционными системами должно быть что-то другое, что позволяет fallocate работать в Ubuntu.
Davidian1024
Решение работает на CentOS 7.5
NerdOfCode
ddкажется, что делает гораздо больше работы, time dd if=/dev/zero of=/myswap count=4096 bs=1MiBзанимает 14,003 секунды, где time fallocate -l 4G /swap3занимает 0,018 секунды, но они создают файл одинакового размера. Я предполагаю, что fallocateне копирует в нули, как ddэто swaponнужно и нуждается в этих нулях.
Даниэль Вайсхарт
swapon: /swapfile: read swap header failed: Invalid argumentполучил эту ошибку после попытки swapon /swapfileна centos7 сервере puppetenterprise
Брайан Томас
@BrianThomas Похоже, вы забыли запустить mkswap для файла после того, как создали его с помощью dd.
jblaine
17

Выполните следующие действия, это работает на капли DigitalOcean. Я проверял. Измените сумму 4096 в соответствии с вашими потребностями

yum install nano -y

sudo dd if=/dev/zero of=/swapfile count=4096 bs=1MiB
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

sudo nano /etc/fstab

добавьте эту строку:

/swapfile   swap    swap    sw  0   0

запустить эту команду

sudo sysctl vm.swappiness=10

sudo nano /etc/sysctl.conf

добавить эту строку

vm.swappiness = 10
vm.vfs_cache_pressure = 50

Чтобы проверить размер свопа

swapon --summary
free -h
Дилан Б
источник
2
Моя ddкоманда была бы, dd if=/dev/zero of=/swapfile count=4 bs=1GiBпотому что я не могу быть обеспокоен вычислением мебибайтов в гибибайтах, если ddмогу сделать это для меня. Знаете ли вы, что в былые времена люди выражали это в кибибайтах и ​​рассчитывали вручную на гибибайты? Невероятно!
Амеди Ван Гасс
@AmedeeVanGasse Ваша версия команды dd на самом деле требует 1 ГБ памяти, и команда завершится ошибкой, если у вас не так много свободной памяти.
Фабиано
@ Фабиано да и? Ваша точка зрения ...?
Амеди Ван Гасс
2
@AmedeeVanGasse Моя точка зрения заключается в том, что если вы просто не хотите беспокоиться о расчете MiBs и GiBs, bs=это неправильный способ сделать это, так как это имеет непредвиденные последствия, такие как снижение эффективности и, вероятно, не работает на большинстве недорогих хостингов. Если вы просто ленивы, используйте count_bytesи позвольте ddсделать для вас и математику, и выбор эффективного размера блока: dd if=/dev/zero of=/swapfile count=4GiB iflag=count_bytes=)
Фабиано
iflag=count_bytesэто отличное улучшение вашего комментария. И мне не лень, мне небезразлична читабельность. Через 6 месяцев, когда я снова читаю свой сценарий (или когда приходит следующий сопровождающий), читатель должен понимать, что происходит. Это не только компьютеры, которые читают код, люди тоже читают код!
Амеди Ван Гасс