
Prefácio
Cometi um erro e instaleiroot
Ubuntu 20.04 LTS com partição ZFS/OpenZFS criptografadana minha área de trabalho produtiva em uma configuração de inicialização dupla (veja a tabela de partições abaixo). Mas não prestei a devida atenção no tutorial que estava seguindo e agora parece que tenho uma partição Swap de 4G embora tenha 32G de RAM (EDITAR: Descobri como consigo aumentar o Swap mas ainda não consigo entrar em hibernação — veja abaixo). Portanto não posso colocar esta máquina em hibernação.
Qual a melhor forma de resolver esse problema, para que eu possa colocar esta máquina em hibernação?
Estado atual
$ 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 -
O que eu tentei
Criando um arquivo de troca
Achei que um arquivo de troca poderia ser uma solução fácil, mas obviamente estava errado:
$ 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.
Então acho que deveria aumentar a partição swap. Também não está claro para mim por que swapon
as afirmações de que a partição swap 4G
diz zfs get all Root/swap
que 1.08T
estão disponíveis.
Qualquer coisa com GParted
O GParted não reconhecerá muito. Isso pode estar relacionado ao bug em os-prober
(Edição 14 do GParted,Bug do Debian 888114,problema os-prober 1848496, problemas do openzfs9801e9069)
Substituindo a pequena partição Swap (=aumentando a partição Swap no ZFS)
O comando de criação foi inspirado emum comentário no GitHubmas você deve ter em mentenãousar-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
garantindo que esta entrada esteja em /etc/fstab
:
/dev/zvol/Root/swap none swap discard 0 0
em seguida, reinicie e remova a pequena troca legada:
$ sudo zfs destroy Root/swap_bak
Embora isso pareça ter funcionado, ainda não consigo hibernar:
$ sudo systemctl hibernate
Failed to hibernate system via logind: Sleep verb "hibernate" not supported
Portanto, ainda estou aberto para qualquer conselho. Talvez precise resume
de um parâmetro dedicado GRUB_CMDLINE_LINUX_DEFAULT
?
Responder1
No final das contas, o motivo não estava relacionado ao ZFS. Mesmo depois de redimensionar a troca, ela não funcionou porque está simplesmente desabilitada nas versões mais recentes do Ubuntu (mas será reconsiderado).
Para resolver isso, você deve ativar a hibernação.
- Abra
com.ubuntu.desktop.pkla
em um 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
Pesquise as entradas Disable hibernate by default in upower
e Disable hibernate by default in logind
altere cada ResultActive
valor para yes
.
Reinicie e teste o resultado com
$ sudo systemctl hibernate
# or
$ sudo pm-hibernate
Se ainda não funcionar, talvez seja necessário desativar coisas como Fast boot
e Secure boot
em seu BIOS (ATENÇÃO:isso émuitoprovavelmente você terá que fazer isso em máquinas mais novas).
Se o teste não resultar mais em erro, você também poderá atribuir hibernações a determinadas ações nas configurações do Ubuntu. Por exemplo, ao pressionar o botão liga / desliga.
Responder2
Usar o ZFS para swap (um arquivo em um sistema de arquivos ou um zvol inteiro) já éUma má ideia, muito menos hibernar com ele. Meu único conselho seriadesistir completamente, o ZFS não foi criado para essa finalidade.
ZFS é umsistema de arquivos estruturado em log, onde os blocos (extensões) de um arquivo não são corrigidos em nenhum momento, mas sim alterados a cada gravação (a regra de não substituição). O subsistema swap, entretanto, espera mapeamentos simples e inteligíveis entre o arquivo swap e os blocos, e acesso direto aos setores de disco subjacentes, nenhum dos quais é uma característica dos sistemas de arquivos estruturados em log. Btrfs, sendo outro LFS, suporta swapfiles cominúmeras restrições, apenas para fazer issoutilizável, enquanto o ZFS nem sequer suporta O_DIRECT
. Há uma razão para essa trocapartiçõestêm melhor desempenho e são mais confiáveis que swaparquivos.
O ZFS faz muita contabilidade interna para garantir a segurança transacional e depende muito de memória abundante. Se você usar o ZFS para troca, cujo objetivo principal é servir como uma extensão de memória apoiada em disco, isso causará um loop de feedback positivo entre o ZFS e o subsistema de gerenciamento de memória sob alta carga ou alta pressão de troca. Isto pode levar, por exemplo, ao bloqueio suave de todo o sistema.
Se você for mais longe e hibernar com swap-on-ZFS, as estruturas de dados internas do ZFS irão, mais cedo ou mais tarde, enlouquecer, já que a saída da hibernação depende de memória correta e consistente carregada do disco, enquanto o ZFS também depende de informações bem formadas. estruturas de dados de memória para fornecer dados integrais do disco.
Responder3
processo para aumentar o tamanho da partição swap e usá-la para hibernação
Criando a partição swap
Ativando a partição swap
Fazendo a nova partição swap funcionar para hibernação (opcional)
Criando a partição swap Inicialize no CD de instalação do Ubuntu e escolha a opção de executar o Ubuntu agora Vá para sistema -> GParted Partition Editor
Exclua a partição swap e, se não houver mais nada nela, a partição estendida que a contém. (Se por algum milagre você conseguir redimensionar sua partição swap a partir daqui, imagino que sua vida será muito mais fácil que a minha.) Diminua o tamanho de sua partição primária pela quantidade que você deseja que seu novo swap tenha (eu fiz mine 2x RAM + 500 MB só por segurança). A maneira mais fácil de fazer isso é preencher a quantidade de espaço que você deseja que o swap esteja no campo "espaço livre a seguir". No espaço livre que foi criado agora, escolha novo, digite linux-swap e você poderá nomear a partição "troque" se quiser Acerte oAplicarbotão (deve ser uma marca de seleção) para gravar as alterações no disco Quando terminar, reinicie novamente no Ubuntu Ativando a partição swap (se o seu swap estiver no disco rígido principal, você não precisa fazer nada aqui.) Agora você precisa para descobrir em qual partição seu swap está e qual é seu UUID. UUID?! você diz? Bem, esse é o identificador universalmente exclusivo da partição, para que você possa referenciá-lo mesmo que esteja em um ponto de montagem diferente de inicialização para inicialização devido à adição de discos, etc.
Abra um terminal e execute gksu gparted & e digite sua senha root. O & permite que esse processo seja executado enquanto ainda dá acesso à linha de comando.
Clique com o botão direito na sua partição swap e escolhaInformação. Você deveria ver oCaminhoeUUIDlistado lá. Mantenha-o aberto para referência futura. Execute gksu gedit /etc/fstab & e procure a linha que contémtrocariniciar. Deve ser a terceira coluna, separada por espaços ou tabulações. Você pode usar o caminho ou o UUID para informar ao Linux onde encontrar sua partição swap. Eu recomendo o UUID porque ele permanecerá constante mesmo se você mover a partição ou se o disco de alguma forma se tornar sdb em vez de sda ou algo parecido. Faça as edições apropriadas e salve o arquivo. Sua linha deve ser parecida com esta se você usou UUID (com seu UUID, é claro):
UUID=41e86209-3802-424b-9a9d-d7683142dab7 nenhum swap sw 0 0
ou isto se você usou o caminho: /dev/sda2 none swap sw 0 0
Salve o arquivo. Habilite a nova partição swap com este comando.
sudo swapon --all
OU
$ 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
Reinicialize para garantir que o novo swap seja ativado corretamente na inicialização Fazendo a partição swap funcionar para hibernação (opcional) 'INFO: Isso não funcionará para 12.04, a retomada do hibernação funcionará de maneira diferente em 12.04.'
Abra um Terminal novamente e execute cat /proc/swaps e esperamos que você veja o caminho para sua partição swap listada lá. Caso contrário, é provável que algo tenha dado errado nas etapas acima. Aqui está minha saída:
Nome do arquivo Tipo Tamanho usado Prioridade /dev/sda2 partição 2676732 73380 -1 gksu gedit /etc/default/grub & para obter a configuração do carregador de boot
Procure a linha GRUB_CMDLINE_LINUX="" e certifique-se de que esteja assim (usando seu UUID, é claro) GRUB_CMDLINE_LINUX="resume=UUID=41e86209-3802-424b-9a9d-d7683142dab7" e salve o arquivo
sudo update-grub
e espere terminar
gksu gedit /etc/initramfs-tools/conf.d/resume & e certifique-se de que seu conteúdo seja resume=UUID=41e86209-3802-424b-9a9d-d7683142dab7 (com seu UUID, é claro, no lugar do meu). Salve o arquivo!
sudo update-initramfs -u
Reinício! Agora você deve conseguir hibernar e retomar!