Não consigo ativar o espaço de troca no CentOS 7

55

Então, eu estou seguindo um tutorial para instalar o OTRS, que é um sistema de solicitação de ticket de código aberto. Portanto, para instalar, são necessários: 4 GB de espaço de swap. Aqui está o comando que eu usei:

[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

Você pode ver: Erro de argumento inválido aqui. Tentei várias vezes em vão habilitá-lo. Alguém por favor me diga como corrigir este erro. (Estou executando este CentOS 7 na AWS Instance EC2)

[root@ip-10-0-7-41 ~]# df -T | awk '{print $1,$2,$NF}' | grep "^/dev"
/dev/xvda1 xfs /
Único
fonte
Em que sistema de arquivos isso está acontecendo? btrfs por acaso?
Schaiba
Olá, editei minha pergunta. Eu acho que o sistema de arquivos é xfs.
Aquele
2
No XFS, de fato, é melhor usar dd. Lembre-se de que nem todos os sistemas de arquivos oferecem suporte à troca ou, pelo menos, não da mesma maneira.
schaiba
@schaiba Eu não sabia muito bem sobre o tipo de sistema de arquivos. Muito obrigado.
1

Respostas:

102

O problema fallocate(1)é que ele usa o sistema ioctlsde arquivos para tornar a alocação rápida e eficaz, a desvantagem é que ele não aloca fisicamente o espaço, mas o swapon(2)syscall exige um espaço real. Referência: https://bugzilla.redhat.com/show_bug.cgi?id=1129205

Eu já havia enfrentado esse problema anteriormente com minha caixa. Então, ao invés de usar fallocate, eu usei ddcomo o link sugere

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

e avançar com chmod, mkswap& swaponcomandos. Bingo! Funcionou.

Rahul
fonte
11
Estranho, um arquivo de troca fallocate'd funcionou bem para mim no Ubuntu 16.04.3 LTS, mas falhou com "swapon falhou: argumento inválido" no Red Hat Enterprise Linux Server versão 7.4 (Maipo). O comando dd fornecido acima realmente funciona no RedHat. Deve haver algo diferente entre os dois sistemas operacionais que permita que o fallocate funcione no Ubuntu.
precisa
A solução funciona no CentOS 7.5
NerdOfCode
ddparece estar fazendo muito mais trabalho time dd if=/dev/zero of=/myswap count=4096 bs=1MiBleva 14,003 segundos, onde time fallocate -l 4G /swap3leva 0,018 segundos, mas eles produzem o mesmo tamanho de arquivo. Eu estou supondo que fallocatenão copie em zeros da mesma forma dde swaponprecisa desses zeros.
Daniel Wisehart 02/02
swapon: /swapfile: read swap header failed: Invalid argumentobtive este erro depois de tentar swapon /swapfileno servidor centos7 puppetenterprise
Brian Thomas
@BrianThomas Parece que você esqueceu de executar o mkswap no arquivo depois de criá-lo com o dd.
jblaine 13/03
17

Siga estas etapas, ele funciona nas gotículas do DigitalOcean. Eu testei. Altere a quantidade 4096 de acordo com sua necessidade

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

adicione esta linha:

/swapfile   swap    swap    sw  0   0

execute este comando

sudo sysctl vm.swappiness=10

sudo nano /etc/sysctl.conf

adicione esta linha

vm.swappiness = 10
vm.vfs_cache_pressure = 50

Para verificar o tamanho da troca

swapon --summary
free -h
Dylan B
fonte
2
Meu ddcomando seria dd if=/dev/zero of=/swapfile count=4 bs=1GiBporque não posso ser incomodado com o cálculo de mebibytes em gibibytes se ddpuder fazer isso por mim. Você sabia que antigamente as pessoas o expressavam em kibibytes e o calculavam manualmente em gibibytes? Incrível!
Amedee Van Gasse
@AmedeeVanGasse sua versão do comando dd na verdade requer 1 GiB de memória e o comando falhará se você não tiver tanta memória livre.
Fabiano
@Fabiano sim e? O seu ponto é ...?
Amedee Van Gasse
2
@AmedeeVanGasse meu argumento é que, se você simplesmente não quer se preocupar com o cálculo de MiBs e GiBs, bs=não é a maneira correta de fazer isso, pois tem consequências indesejadas, como prejudicar a eficiência e provavelmente não funcionará na maioria dos hostings de baixo custo. Se você é apenas preguiçoso, use count_bytese deixe ddfazer por você a matemática e a escolha de um tamanho de bloco eficiente: dd if=/dev/zero of=/swapfile count=4GiB iflag=count_bytes=)
Fabiano
iflag=count_bytesé uma excelente melhoria para o seu comentário. E eu não sou preguiçoso, eu me preocupo com a legibilidade. Dentro de seis meses, quando eu leio meu script novamente (ou quando o próximo mantenedor aparecer), o leitor deve entender o que está acontecendo. Não são apenas os computadores que lêem código, os humanos também lêem código!
Amedee Van Gasse