
Prefacio
Cometí un error e instaléUbuntu 20.04 LTS con una root
partición ZFS/OpenZFS cifradaen mi escritorio de trabajo productivo en una configuración de arranque dual (consulte la tabla de particiones a continuación). Pero no presté debida atención al tutorial que estaba siguiendo y ahora parece que tengo una partición Swap de 4G aunque tengo 32G de RAM (EDITAR: Descubrí cómo puedo aumentar el intercambio pero todavía no puedo entrar en hibernación; consulte a continuación). Por lo tanto, no puedo poner esta máquina en hibernación.
¿Cuál es la mejor manera de resolver este problema para poder poner esta máquina en hibernación?
Estado actual
$ sudo fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 1.88 TiB, 2048408248320 bytes, 4000797360 sectors
Disk model: KXG60PNV2T04 NVMe KIOXIA 2048GB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 1FCA11ED-9263-4C06-A8DF-594C0DE84AFA
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 1085439 1083392 529M Windows recovery environment
/dev/nvme0n1p2 1085440 1290239 204800 100M EFI System
/dev/nvme0n1p3 1290240 1323007 32768 16M Microsoft reserved
/dev/nvme0n1p4 1323008 409420488 408097481 194.6G Microsoft basic data
/dev/nvme0n1p5 409421824 410920959 1499136 732M Windows recovery environment
/dev/nvme0n1p6 410923008 415117311 4194304 2G Linux filesystem
/dev/nvme0n1p7 415117312 4000797326 3585680015 1.7T Linux filesystem
$ sudo swapon --show --output all
NAME TYPE SIZE USED PRIO UUID LABEL
/dev/zd0 partition 4G 0B -2 1e1fb013-69d9-4878-b358-6b8ee53d5b09
$ sudo zpool list -v
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
Root 1.66T 535G 1.13T - - 2% 31% 1.00x ONLINE -
nvme0n1p7 1.66T 535G 1.13T - - 2% 31.5% - ONLINE
$ sudo zpool status -v
pool: Root
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
Root ONLINE 0 0 0
nvme0n1p7 ONLINE 0 0 0
errors: No known data errors
$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
Root 539G 1.08T 192K none
Root/root 534G 1.08T 530G /
Root/root/00a891589b00cebc55cb6767e266ca38ac201daf3a6048c1f33d7d55c0710533 544K 1.08T 143M legacy
[…] # many other legacy mount points
Root/root/ffe52d35c873e6a417ee12c7025d848dac1f269b8078266f00a8d8088fd34384 396K 1.08T 607M legacy
Root/swap 4.25G 1.08T 172M -
$ sudo zfs get all Root/swap
NAME PROPERTY VALUE SOURCE
Root/swap type volume -
Root/swap creation So Aug 2 15:36 2020 -
Root/swap used 4.25G -
Root/swap available 1.08T -
Root/swap referenced 172M -
Root/swap compressratio 1.00x -
Root/swap reservation none default
Root/swap volsize 4G local
Root/swap volblocksize 4K -
Root/swap checksum on default
Root/swap compression off local
Root/swap readonly off default
Root/swap createtxg 3746 -
Root/swap copies 1 default
Root/swap refreservation 4.25G local
Root/swap guid 12379969387189982956 -
Root/swap primarycache metadata local
Root/swap secondarycache none local
Root/swap usedbysnapshots 0B -
Root/swap usedbydataset 172M -
Root/swap usedbychildren 0B -
Root/swap usedbyrefreservation 4.08G -
Root/swap logbias throughput local
Root/swap objsetid 278 -
Root/swap dedup off default
Root/swap mlslabel none default
Root/swap sync always local
Root/swap refcompressratio 1.00x -
Root/swap written 172M -
Root/swap logicalused 169M -
Root/swap logicalreferenced 169M -
Root/swap volmode default default
Root/swap snapshot_limit none default
Root/swap snapshot_count none default
Root/swap snapdev hidden default
Root/swap context none default
Root/swap fscontext none default
Root/swap defcontext none default
Root/swap rootcontext none default
Root/swap redundant_metadata all default
Root/swap encryption aes-256-gcm -
Root/swap keylocation none default
Root/swap keyformat passphrase -
Root/swap pbkdf2iters 342K -
Root/swap encryptionroot Root -
Root/swap keystatus available -
lo que intenté
Creando un archivo de intercambio
Pensé que un archivo de intercambio podría ser una solución fácil pero obviamente estaba equivocado:
$ sudo dd if=/dev/zero of=/swapfile bs=1MiB count=$((32*1024))
32768+0 records in
32768+0 records out
34359738368 bytes (34 GB, 32 GiB) copied, 14.5783 s, 2.4 GB/s
$ sudo chmod 600 /swapfile
$ sudo swapon /swapfile
swapon: /swapfile: skipping - it appears to have holes.
Entonces supongo que debería aumentar la partición de intercambio. Tampoco me queda claro por qué swapon
se afirma que la partición de intercambio tiene 4G
aunque zfs get all Root/swap
dice que 1.08T
está disponible.
Cualquier cosa con GParted
GParted no reconocerá mucho. Esto podría estar relacionado con el error en os-prober
(GParted número 14,Error de Debian 888114,problema del sistema operativo 1848496, problemas con openzfs9801y9069)
Reemplazo de la pequeña partición Swap (=aumentar la partición Swap en ZFS)
El comando de creación fue inspirado porun comentario en GitHubpero debes tener en cuentanousar-o sync=always
.
$ sudo zfs create -V 32G -b $(getconf PAGESIZE) -o logbias=throughput -o primarycache=metadata -o secondarycache=none -o com.sun:auto-snapshot=false -o compression=zle Root/swap_two
$ sudo zfs rename Root/swap Root/swap_bak
$ sudo zfs rename Root/swap_two Root/swap
$ sudo mkswap -f /dev/zvol/Root/swap
$ sudo swapon /dev/zvol/Root/swap
asegurándose de que esta entrada esté en /etc/fstab
:
/dev/zvol/Root/swap none swap discard 0 0
luego reinicie y elimine el pequeño intercambio heredado:
$ sudo zfs destroy Root/swap_bak
Si bien esto parece haber funcionado, todavía no puedo hibernar:
$ sudo systemctl hibernate
Failed to hibernate system via logind: Sleep verb "hibernate" not supported
Por lo tanto, todavía estoy abierto a cualquier consejo. ¿Quizás necesite un resume
parámetro dedicado GRUB_CMDLINE_LINUX_DEFAULT
?
Respuesta1
Al final, el motivo no estaba relacionado con ZFS. Incluso después de cambiar el tamaño del intercambio, no funcionó porque simplemente está deshabilitado en las versiones más nuevas de Ubuntu (aunque será reconsiderado).
Para solucionar esto, hay que activar la hibernación.
- Abrir
com.ubuntu.desktop.pkla
en un editor:
$ sudo vim /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla
# or on some machines
$ sudo vim /etc/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla
Busque las entradas Disable hibernate by default in upower
y Disable hibernate by default in logind
cambie cada ResultActive
valor a yes
.
Reinicie y pruebe el resultado con
$ sudo systemctl hibernate
# or
$ sudo pm-hibernate
Si aún no funciona, es posible que tengas que desactivar cosas como Fast boot
y Secure boot
en tu BIOS (ATENCIÓN:esmuyEs probable que tengas que hacer eso en máquinas más nuevas).
Si la prueba ya no da como resultado un error, también debería poder asignar hibernaciones a ciertas acciones en la configuración de Ubuntu. Por ejemplo al presionar el botón de encendido.
Respuesta2
El uso de ZFS para el intercambio (ya sea un archivo en un sistema de archivos o un zvol completo) ya estáuna mala idea, y mucho menos hibernar con él. Mi único consejo seríarenunciar por completo, ZFS no está diseñado para este propósito.
ZFS es unsistema de archivos estructurado por registros, donde los bloques (extensiones) de un archivo no se fijan en ningún momento, sino que cambian con cada escritura (la regla de no sobrescritura). El subsistema de intercambio, sin embargo, espera asignaciones simples e inteligibles entre el archivo de intercambio y los bloques, y acceso directo a los sectores del disco subyacentes, ninguno de los cuales es una característica de los sistemas de archivos estructurados en registros. Btrfs, al ser otro LFS, admite archivos de intercambio connumerosas restricciones, sólo para hacerlousable, mientras que ZFS ni siquiera admite O_DIRECT
. Hay una razón por la que el intercambioparticionesfuncionan mejor y son más confiables que el intercambioarchivos.
ZFS realiza una gran cantidad de contabilidad interna para garantizar la seguridad de las transacciones y depende en gran medida de una memoria abundante. Si utiliza ZFS para el intercambio, cuyo propósito principal es servir como una extensión de memoria respaldada por disco, provoca un bucle de retroalimentación positiva entre ZFS y el subsistema de administración de memoria bajo alta carga o alta presión de intercambio. Esto puede provocar, por ejemplo, un bloqueo suave de todo el sistema.
Si va más allá e hiberna con swap-on-ZFS, las estructuras de datos internas de ZFS tarde o temprano se volverán locas, ya que salir de la hibernación depende de una memoria correcta y consistente cargada desde el disco, mientras que ZFS también depende de información bien formada. estructuras de datos de memoria para proporcionar datos de disco integrales.
Respuesta3
proceso para aumentar el tamaño de la partición de intercambio y utilizarla para la hibernación
Creando la partición de intercambio
Activando la partición de intercambio
Hacer que la nueva partición de intercambio funcione para hibernar (opcional)
Creando la partición de intercambio Arranque en el CD de instalación de Ubuntu y elija la opción para ejecutar Ubuntu ahora Vaya a sistema -> Editor de particiones GParted
Elimine la partición de intercambio y, si no hay nada más en ella, la partición extendida que la contiene. (Si por algún milagro puedes cambiar el tamaño de tu partición de intercambio desde aquí, imagino que tu vida será mucho más fácil que la mía). Disminuye el tamaño de tu partición primaria en la cantidad que deseas que sea tu nueva partición de intercambio (yo hice mío 2x RAM + 500 MB solo para estar seguro). La forma más sencilla de hacer esto es completar la cantidad de espacio que desea que haya en el intercambio en el campo "espacio libre siguiente". En el espacio libre que ahora se ha creado, elija nuevo, escriba linux-swap y podrá nombrar la partición. "intercambiar" si quieres Presiona elAplicar(debe ser una marca de verificación) para escribir los cambios en el disco. Cuando termine, reinicie nuevamente en Ubuntu. Activando la partición de intercambio (si su intercambio está en su disco duro principal, no necesita hacer nada aquí). Ahora necesita para encontrar en qué partición está su swap y cuál es su UUID. ¡¿UUID?! ¿tu dices? Bueno, ese es el identificador único universal para la partición, por lo que puede hacer referencia a ella incluso si está en un punto de montaje diferente de arranque a arranque debido a la adición de discos, etc.
Abra una terminal y ejecute gksu gparted & e ingrese su contraseña de root. El & permite que este proceso se ejecute mientras le brinda acceso a la línea de comando.
Haga clic derecho en su partición de intercambio y elijaInformación. Deberías ver elCaminoyUUIDenumerado allí. Mantenga esto abierto para futuras referencias. Ejecute gksu gedit /etc/fstab & y busque la línea que tieneintercambioen eso. Debería ser la tercera columna, separada por espacios o tabulaciones. Puede usar la ruta o el UUID para indicarle a Linux dónde encontrar su partición de intercambio. Recomiendo UUID porque permanecerá constante incluso si mueves la partición o si el disco de alguna manera se convierte en sdb en lugar de sda o algo así. Realice las ediciones apropiadas y guarde el archivo. Su línea debería verse así si usó UUID (con su UUID en su lugar, por supuesto):
UUID=41e86209-3802-424b-9a9d-d7683142dab7 ninguno intercambio sw 0 0
o esto si usó la ruta: /dev/sda2 none swap sw 0 0
Guarda el archivo. Habilite la nueva partición de intercambio con este comando.
sudo swapon --all
O
$ sudo swapon --all --verbose
swapon on /dev/sda2
swapon: /dev/sda2: found swap signature: version 1, page-size 4, same byte order
swapon: /dev/sda2: pagesize=4096, swapsize=2147483648, devsize=2147483648
Confirm that the swap partition exists.
$ cat /proc/swaps
Filename Type Size Used Priority
/dev/sda2 partition 2097148 0 -1
Reinicie para asegurarse de que el nuevo intercambio se active correctamente al inicio. Hacer que la partición de intercambio funcione para hibernar (opcional) 'INFO: Esto no funcionará para 12.04, la reanudación desde la hibernación funciona de manera diferente en 12.04.'
Abra una Terminal nuevamente y ejecute cat /proc/swaps y, con suerte, verá la ruta a su partición de intercambio allí. De lo contrario, es probable que algo haya salido mal en los pasos anteriores. Aquí está mi salida:
Nombre de archivo Tipo Tamaño Utilizado Prioridad /dev/sda2 partición 2676732 73380 -1 gksu gedit /etc/default/grub & para abrir la configuración del cargador de arranque
Busque la línea GRUB_CMDLINE_LINUX="" y asegúrese de que se vea así (usando su UUID, por supuesto) GRUB_CMDLINE_LINUX="resume=UUID=41e86209-3802-424b-9a9d-d7683142dab7" y guarde el archivo
sudo update-grub
y esperar a que termine
gksu gedit /etc/initramfs-tools/conf.d/resume & y asegúrese de que su contenido sea resume=UUID=41e86209-3802-424b-9a9d-d7683142dab7 (con su UUID, por supuesto, en lugar del mío). ¡Guarda el archivo!
sudo update-initramfs -u
¡Reiniciar! ¡Ahora deberías poder hibernar y reanudar!