
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:
- Crea un archivo vacío:
touch /swap
- Úselo
chattr
para establecerleNoCOW
un atributo:chattr +C /swap
- Verifique que
C
apareció el atributo:lsattr /swap
- Rellénelo:
dd if=/dev/zero of=/swap bs=1M count=1024
# por 1 gigabyte mkswap /swap && chmod 600 /swap && swapon /swap
Alternativamente, puede crear un directorio, configurarlo chattr +C
en ese directorio y luego crear un archivo de intercambio debajo de él.
Tenga en cuenta que no puede hacerlo chattr +C
con 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 chattr
crear un directorio con chattr
y luego crear un archivo en él (en tal caso, todos los archivos creados después de chattr
ingresar 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 swapon
despué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é swap
y pude swapon
volver a hacerlo en el volumen principal, pero a continuación crearé un subvolumen dedicado.