Prefacio

Prefacio

Prefacio

Cometí un error e instaléUbuntu 20.04 LTS con una rootpartició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é swaponse afirma que la partición de intercambio tiene 4Gaunque zfs get all Root/swapdice que 1.08Testá 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)

ingrese la descripción de la imagen aquí

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 resumepará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.

  1. Abrir com.ubuntu.desktop.pklaen 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 upowery Disable hibernate by default in logindcambie cada ResultActivevalor 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 booty Secure booten 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.

Encendido: suspensión y encendido: botón Comportamiento del botón de encendido: hibernación

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

  1. 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-gruby 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!

información relacionada