No puedo habilitar el espacio de intercambio en CentOS 7

55

Así que estoy siguiendo un tutorial para instalar OTRS, que es el sistema de solicitud de tickets de código abierto. Entonces, para instalar, se requiere: 4 GB de espacio de intercambio. Aquí está el comando que usé:

[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

Puedes ver: Error de argumento inválido aquí. Intenté muchas veces en vano habilitarlo. Alguien por favor dígame cómo solucionar este error. (Estoy ejecutando este CentOS 7 en AWS Instance EC2)

[root@ip-10-0-7-41 ~]# df -T | awk '{print $1,$2,$NF}' | grep "^/dev"
/dev/xvda1 xfs /
El único
fuente
¿En qué sistema de archivos está sucediendo esto? btrfs por casualidad?
schaiba
@schaiba Hola, edité mi pregunta. Creo que el sistema de archivos es xfs.
The One
2
En XFS, de hecho, es mejor usarlo dd. Tenga en cuenta que no todos los sistemas de archivos admiten el intercambio o al menos no de la misma manera.
schaiba
@schaiba No sabía muy bien sobre el tipo de sistema de archivos. Muchas gracias.
The One

Respuestas:

102

El problema fallocate(1)es que utiliza el sistema ioctlsde archivos para que la asignación sea rápida y efectiva, la desventaja es que no asigna físicamente el espacio, pero swapon(2)syscall requiere un espacio real. Referencia: https://bugzilla.redhat.com/show_bug.cgi?id=1129205

También me enfrenté a este problema anteriormente con mi caja. Entonces, en lugar de usar fallocate, usé ddcomo sugiere el enlace

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

y seguir adelante con chmod, mkswapy swaponcomandos. Bingo! Funcionó.

Rahul
fuente
1
Extraño, un archivo de intercambio de Fallocate'd funcionó bien para mí en Ubuntu 16.04.3 LTS, pero falla con "swapon fallido: argumento no válido" en Red Hat Enterprise Linux Server versión 7.4 (Maipo). El comando dd proporcionado anteriormente sí funciona en RedHat. Debe haber algo diferente entre los dos sistemas operativos que permita a Falcocate trabajar en Ubuntu.
Davidian1024
La solución funciona en CentOS 7.5
NerdOfCode
ddparece estar haciendo mucho más trabajo, time dd if=/dev/zero of=/myswap count=4096 bs=1MiBtoma 14.003 segundos, donde time fallocate -l 4G /swap3toma 0.018 segundos, pero producen el mismo tamaño de archivo. Supongo que fallocateno se copia en ceros de la manera en que lo ddhace y swaponnecesita esos ceros.
Daniel Wisehart
swapon: /swapfile: read swap header failed: Invalid argumentrecibió este error después de intentarlo en swapon /swapfileel servidor centos7 puppetenterprise
Brian Thomas
@BrianThomas Parece que olvidó ejecutar mkswap en el archivo después de crearlo con dd.
jblaine
17

Siga estos pasos, funciona en las gotas de DigitalOcean. Probé. Cambie la cantidad 4096 según su necesidad

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

agrega esta línea:

/swapfile   swap    swap    sw  0   0

ejecuta este comando

sudo sysctl vm.swappiness=10

sudo nano /etc/sysctl.conf

agrega esta línea

vm.swappiness = 10
vm.vfs_cache_pressure = 50

Para verificar el tamaño del intercambio

swapon --summary
free -h
Dylan B
fuente
2
Mi ddcomando sería dd if=/dev/zero of=/swapfile count=4 bs=1GiBporque no puedo molestarme con calcular mebibytes en gibibytes si ddpuedo hacer eso por mí. ¿Sabía que en los días de antaño la gente lo expresó en kibibytes y lo calculó a mano en gibibytes? ¡Increíble!
Amedee Van Gasse
@AmedeeVanGasse tu versión del comando dd realmente requiere 1GiB de memoria y el comando fallará si no tienes tanta memoria libre.
Fabiano
@Fabiano si y? Tu punto es ...?
Amedee Van Gasse
2
@AmedeeVanGasse, mi punto es que si simplemente no quieres molestarte en calcular MiBs y GiBs, bs=no es la forma correcta de hacerlo, ya que tiene consecuencias no deseadas, como la eficiencia del daño y probablemente no funcione en la mayoría de los alojamientos de bajo costo. Si solo eres perezoso, usa count_bytesy deja ddque te hagan las matemáticas y la elección de un tamaño de bloque eficiente: dd if=/dev/zero of=/swapfile count=4GiB iflag=count_bytes=)
Fabiano
iflag=count_bytesEs una excelente mejora para tu comentario. Y no soy vago, me importa la legibilidad. En 6 meses, cuando vuelva a leer mi script (o cuando aparezca el próximo responsable), el lector debe comprender lo que está sucediendo. ¡No solo las computadoras leen el código, los humanos también leen el código!
Amedee Van Gasse