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 /

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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.