Nie mogę włączyć zamiany przestrzeni w CentOS 7

55

Postępuję zgodnie z samouczkiem, aby zainstalować OTRS, który jest systemem Open Source Ticket Request System. Aby więc zainstalować, wymaga: 4 GB przestrzeni wymiany. Oto polecenie, którego użyłem:

[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

Możesz zobaczyć: Niepoprawny błąd argumentu tutaj. Na próżno próbowałem go włączyć. Ktoś, proszę, powiedz mi, jak naprawić ten błąd. (Używam tego CentOS 7 na AWS Instance EC2)

[root@ip-10-0-7-41 ~]# df -T | awk '{print $1,$2,$NF}' | grep "^/dev"
/dev/xvda1 xfs /
Jeden
źródło
Na jakim systemie plików to się dzieje? btrfs przypadkiem?
schaiba
@schaiba Witaj, zredagowałem moje pytanie. Myślę, że systemem plików jest XFS.
The One
2
Na XFS rzeczywiście lepiej jest go używać dd. Pamiętaj, że nie wszystkie systemy plików obsługują wymianę lub przynajmniej nie w ten sam sposób.
schaiba
@schaiba Nie wiedziałem zbyt dobrze o rodzaju systemu plików. Dzięki wielkie.
The One

Odpowiedzi:

102

Problem fallocate(1)polega na tym, że używa systemu plików, ioctlsaby alokacja była szybka i skuteczna, wadą jest to, że fizycznie nie alokuje przestrzeni, ale swapon(2)syscall wymaga prawdziwej przestrzeni. Odniesienie: https://bugzilla.redhat.com/show_bug.cgi?id=1129205

Miałem już ten problem wcześniej z moim pudełkiem. Zamiast używać fallocate, użyłem, ddjak sugeruje link

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

posuwają się do przodu i z chmod, mkswapi swaponpoleceń. Bingo! Zadziałało.

Rahul
źródło
1
Dziwne, plik wymiany zamiennie działał dla mnie dobrze na Ubuntu 16.04.3 LTS, ale nie powiedzie się z „swapon failed: Nieprawidłowy argument” w Red Hat Enterprise Linux Server wersja 7.4 (Maipo). Powyższe polecenie dd faktycznie działa w RedHat. Pomiędzy tymi dwoma systemami operacyjnymi musi być coś innego, co pozwala fallocate działać na Ubuntu.
Davidian1024
Rozwiązanie działa na CentOS 7.5
NerdOfCode
ddwygląda na to, że wykonuje dużo więcej pracy, time dd if=/dev/zero of=/myswap count=4096 bs=1MiBzajmuje 14,003 sekundy, a time fallocate -l 4G /swap3zajmuje 0,018 sekundy, ale generują ten sam rozmiar pliku. Zgaduję, że fallocatenie kopiuje zer tak jak to ddrobi i swaponpotrzebuje tych zer.
Daniel Wisehart
swapon: /swapfile: read swap header failed: Invalid argumentdostałem ten błąd po próbie swapon /swapfilena serwerze centos7 puppetenterprise
Brian Thomas
@BrianThomas Brzmi to tak, jakbyś zapomniał uruchomić mkswap na pliku po utworzeniu go za pomocą dd.
jblaine
17

Wykonaj następujące kroki, działa na kropelki DigitalOcean. Testowałem. Zmień kwotę 4096 zgodnie z potrzebami

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

dodaj tę linię:

/swapfile   swap    swap    sw  0   0

uruchom to polecenie

sudo sysctl vm.swappiness=10

sudo nano /etc/sysctl.conf

dodaj tę linię

vm.swappiness = 10
vm.vfs_cache_pressure = 50

Aby sprawdzić rozmiar wymiany

swapon --summary
free -h
Dylan B.
źródło
2
Moje ddpolecenie byłoby dd if=/dev/zero of=/swapfile count=4 bs=1GiBdlatego, że nie mogę przejmować się obliczaniem mebibajtów w gibibajtach, jeśli ddmoże to dla mnie zrobić. Czy wiesz, że w dawnych czasach ludzie wyrażali to w kibibajtach i ręcznie obliczali to gibibajtom? Niesamowite!
Amedee Van Gasse
@AmedeeVanGasse Twoja wersja polecenia dd faktycznie wymaga 1GiB pamięci, a polecenie zakończy się niepowodzeniem, jeśli nie masz tyle wolnej pamięci.
Fabiano
@Fabiano tak i? Masz na myśli ...?
Amedee Van Gasse
2
@AmedeeVanGasse mam na myśli to, że jeśli nie chcesz zawracać sobie głowy obliczaniem MiB i GiB, bs=nie jest to właściwy sposób, ponieważ ma to niezamierzone konsekwencje, takie jak obniżenie wydajności i prawdopodobnie nie działa na większości tanich hostingu. Jeśli jesteś po prostu leniwy, używać count_bytesi niech dddla was zrobić zarówno matematyki i wyborze efektywnego rozmiaru bloku: dd if=/dev/zero of=/swapfile count=4GiB iflag=count_bytes=)
Fabiano
iflag=count_bytesto doskonała poprawa Twojego komentarza. I nie jestem leniwy, zależy mi na czytelności. Za 6 miesięcy, kiedy ponownie przeczytam skrypt (lub gdy pojawi się następny opiekun), czytelnik musi zrozumieć, co się dzieje. Nie tylko komputery czytają kod, ludzie też czytają kod!
Amedee Van Gasse