Я не можу включити Swap простір у 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 EC2)

[root@ip-10-0-7-41 ~]# df -T | awk '{print $1,$2,$NF}' | grep "^/dev"
/dev/xvda1 xfs /

На якій файловій системі це відбувається? btrfs будь-яким випадком?
schaiba

@schaiba Привіт, я змінив своє запитання. Я думаю, що файлова система - xfs.
Один

2
На XFS дійсно краще використовувати dd. Зверніть увагу, що не всі файлові системи підтримують своп або принаймні не однаково.
schaiba

@schaiba Я не дуже добре знав тип файлової системи. Дуже дякую.
Один

Відповіді:


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'd спрацював мені добре на Ubuntu 16.04.3 LTS, але він не вдається з "swapon не вдався: Неправильний аргумент" на Red Hat Enterprise Linux Server 7.4 (Maipo). Команда dd, надана вище, дійсно працює на RedHat. Між двома операційними системами повинно бути щось інше, що дозволяє помилкам працювати на 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на сервері centpe7 puppetenterprise
Брайана Томаса

@BrianThomas Це здається, що ви забули запустити mmwp у файлі після того, як ви створили його з 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 Гбіт пам'яті, і команда не вдасться, якщо у вас не так багато вільної пам'яті.
Фабіано

@Fabiano так і? Ваша думка ...?
Амедей Ван Гассе

2
@AmedeeVanGasse мою думку полягає в тому, що якщо ви просто не хочете турбуватися з обчисленням МіБ та GiB, 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.