Cómo crear un archivo de intercambio en un disco ssd con btrfs

Cómo crear un archivo de intercambio en un disco ssd con btrfs

Tengo SSD con btrfs, intenté crear un archivo de intercambio como:

dd if=/dev/zero of=swapfile01  bs=1M count=10240
mkswap swapfile01
chmod 600 swapfile01
swapon swapfile01

En dmesg veo

[238434.731654] swapon: swapfile has holes

Entiendo que probablemente haya algunos agujeros causados ​​por la fragmentación del disco, pero este es un disco SSD, por lo que probablemente no debería importar. ¿Hay alguna manera de ignorar los agujeros? ¿O cómo puedo solucionar esto?

Fuera de tema: por qué quiero esto (para evitar preguntas irrelevantes en los comentarios): he cifrado el disco, lo cual es complicado cambiar su tamaño, así que decidí crear un archivo de intercambio en lugar de cambiar el tamaño de la partición de intercambio (agregué 14 GB de ram, de 4gb a 16gb y ahora no se puede hibernar).

Respuesta1

Estado en 2019

El desarrollo de Btrfs y el kernel de Linux generó mi respuesta original.obsoleto. Por favor miraesta otra respuesta.


Respuesta original de 2016

DePreguntas frecuentes de btrfs:

¿Btrfs admite archivos de intercambio? Actualmente no. Simplemente crear un archivo NOCOW no ayuda, la compatibilidad con archivos de intercambio se basa en una función que btrfs no implementa intencionalmente debido a posibles daños. (...) Una solución alternativa, aunque con un rendimiento deficiente, es montar un archivo de intercambio mediante un dispositivo de bucle.

Por lo tanto, todavía no existe una buena manera de crear un archivo de intercambio en la partición btrfs.

Respuesta2

Como se ha mencionado más arriba,desde Linux 5.0Ahora es posible crear archivos de intercambio en BTRFS. Pero no deberían estar comprimidos y sin COW. Así es como se crea realmente un archivo de este tipo:

  1. Crea un archivo vacío:touch /swap
  2. Úselo chattrpara establecerle NoCOWun atributo:chattr +C /swap
  3. Verifique que Capareció el atributo:lsattr /swap
  4. Rellénelo: dd if=/dev/zero of=/swap bs=1M count=1024 # por 1 gigabyte
  5. mkswap /swap && chmod 600 /swap && swapon /swap

Alternativamente, puede crear un directorio, configurarlo chattr +Cen ese directorio y luego crear un archivo de intercambio debajo de él.

Tenga en cuenta que no puede hacerlo chattr +Ccon un archivo que ya existe y que no está vacío. Está documentado que es un comportamiento indefinido (de hecho, simplemente no cambia los atributos). Por lo tanto, debe crear un archivo vacío y luego chattrcrear un directorio con chattry luego crear un archivo en él (en tal caso, todos los archivos creados después de chattringresar al directorio tendrán el atributo nocow).

Advertencia:Como se mencionó, esto requiere la versión del kernel 5.0 o superior. Raspberry Pi, por ejemplo, utiliza núcleos 4.19.*, por lo que no podrás utilizar esta técnica en él.

Respuesta3

Se agregó soporte para archivos de intercambio a la versión 5.0 del kernel, como se puede ver en la confirmación.https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ed46ff3d423780fa5173b38a844bf0fdb210a2a7 Para activar el archivo de intercambio en btrfs, el archivo debe estar completamente asignado como NOCOW sin compresión en un dispositivo.

Respuesta4

Lo útil que debe saber sobre el intercambio en btrfs es: si está haciendo instantáneas/subvolúmenes de respaldo, debe crear un subvolumen dedicado del que no esté tomando instantáneas.

En el subvolumen de instantánea, su archivo de intercambio volverá a ser COW y no podrá hacerlo swapondespués de reiniciar:https://www.spinics.net/lists/linux-btrfs/msg96790.html

Hice que mi último subvolumen pudiera escribirse, me gusta sudo btrfs property set -ts /.sxbackup/sx-20210211-092159-utc/ ro false, lo eliminé swapy pude swaponvolver a hacerlo en el volumen principal, pero a continuación crearé un subvolumen dedicado.

información relacionada