Я не могу включить пространство подкачки в 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 месяцев, когда я снова читаю свой сценарий (или когда приходит следующий сопровождающий), читатель должен понимать, что происходит. Это не только компьютеры, которые читают код, люди тоже читают код!
Амеди Ван Гасс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.