Предисловие

Предисловие

Предисловие

Я сделал ошибку и установилUbuntu 20.04 LTS с зашифрованным rootразделом ZFS / OpenZFSна моем производительном рабочем компьютере в конфигурации двойной загрузки (см. таблицу разделов ниже). Но я не уделил должного внимания руководству, которому следовал, и теперь у меня, похоже, раздел подкачки размером 4G, хотя у меня 32G RAM (РЕДАКТИРОВАТЬ: Я нашел, как увеличить объем подкачки, но все еще не могу перейти в режим гибернации — см. ниже). Поэтому я не могу перевести эту машину в спящий режим.

Как лучше всего решить эту проблему, чтобы перевести машину в режим гибернации?

Текущее состояние

$ 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             -

Что я пробовал

Создание файла подкачки

Я думал, что файл подкачки может быть простым решением, но я, очевидно, ошибался:

$ 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.

Так что я думаю, что мне лучше увеличить раздел подкачки. Мне также не ясно, почему swaponутверждается, что раздел подкачки есть, 4Gхотя zfs get all Root/swapутверждает, что 1.08Tони доступны.

Все, что связано с GParted

GParted не распознает многого. Это может быть связано с ошибкой в os-prober​​(GParted выпуск 14,Ошибка Debian 888114,os-prober выпуск 1848496, проблемы с openzfs9801и9069)

введите описание изображения здесь

Замена небольшого раздела подкачки (=увеличение раздела подкачки на ZFS)

Команда создания была вдохновленакомментарий на GitHubно вы должны иметь в видунетиспользовать-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

обеспечение того, чтобы эта запись была в /etc/fstab:

/dev/zvol/Root/swap none swap discard 0 0

затем перезагрузитесь и удалите крошечный устаревший файл подкачки:

$ sudo zfs destroy Root/swap_bak

Хотя это, похоже, сработало, я все еще не могу перейти в спящий режим:

$ sudo systemctl hibernate
Failed to hibernate system via logind: Sleep verb "hibernate" not supported

Поэтому я все еще открыт для любых советов. Может быть, ему нужен отдельный resumeпараметр в GRUB_CMDLINE_LINUX_DEFAULT?

решение1

В конце концов, причина была не связана с ZFS. Даже после изменения размера swap это не сработало, потому что оно просто отключено в новых версиях Ubuntu (хотя это будет пересмотрено).

Чтобы решить эту проблему, вам придется активировать режим гибернации.

  1. Открыть com.ubuntu.desktop.pklaв редакторе:
$ 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

Найдите записи Disable hibernate by default in upowerи Disable hibernate by default in logindизмените каждое ResultActiveзначение на yes.

Перезагрузите и проверьте результат с помощью

$ sudo systemctl hibernate
# or
$ sudo pm-hibernate

Если это все еще не работает, вам, возможно, придется отключить такие вещи, как Fast bootи Secure bootв BIOS (ВНИМАНИЕ:этоочень(вероятно, вам придется сделать это на более новых машинах).

Если тест больше не приводит к ошибке, вы также сможете назначить гибернацию определенным действиям в настройках Ubuntu. Например, при нажатии кнопки питания.

Питание — Приостановка и питание — Кнопка Поведение кнопки питания — Спящий режим

решение2

Использование ZFS для подкачки (файла в файловой системе или всего zvol) ужеплохая идея, не говоря уже о том, чтобы зимовать с ним. Мой единственный совет был быполностью отказаться от этого, ZFS не предназначена для этой цели.

ZFS — этофайловая система с лог-структурой, где блоки (экстенты) файла не фиксируются в любое время, а изменяются для каждой записи (правило запрета перезаписи). Подсистема подкачки, однако, ожидает простых, понятных отображений между файлом подкачки и блоками, а также прямого доступа к базовым секторам диска, ни один из которых не является чертой файловых систем с лог-структурой. Btrfs, будучи еще одной LFS, поддерживает файлы подкачки смногочисленные ограничения, только чтобы сделать этопригодный к использованию, а ZFS даже не поддерживает O_DIRECT. Есть причина, по которой свопперегородкиработают лучше и надежнее, чем свопыфайлы.

ZFS выполняет много внутренних операций по учету, чтобы гарантировать безопасность транзакций, и в значительной степени полагается на обильную память. Если вы используете ZFS для подкачки, чьей основной целью является служить дисковым расширением для памяти, это вызывает положительную обратную связь между ZFS и подсистемой управления памятью при высокой нагрузке или высоком давлении подкачки. Это может привести, например, к мягкой блокировке всей системы.

Если вы пойдете дальше и перейдете в спящий режим с помощью swap-on-ZFS, внутренние структуры данных ZFS рано или поздно выйдут из строя, поскольку выход из спящего режима зависит от корректной и согласованной памяти, загруженной с диска, в то время как ZFS также зависит от правильно сформированных структур данных в памяти для предоставления целостных дисковых данных.

решение3

процесс увеличения размера раздела подкачки и использования его для гибернации

  1. Создание раздела подкачки

    Активация раздела подкачки

    Настройка нового раздела подкачки для работы в режиме гибернации (необязательно)

    Создание раздела подкачки Загрузите установочный компакт-диск Ubuntu и выберите вариант запуска Ubuntu сейчас Перейдите в систему -> GParted Partition Editor

Удалите раздел подкачки и, если в нем больше ничего нет, расширенный раздел, который его содержит. (Если каким-то чудом вы сможете изменить размер раздела подкачки отсюда, я думаю, ваша жизнь будет намного проще моей.) Уменьшите размер вашего основного раздела на величину, которую вы хотите, чтобы был ваш новый раздел подкачки (я сделал свой 2x RAM + 500 МБ просто для надежности). Самый простой способ сделать это — заполнить объем пространства, который вы хотите, чтобы был в разделе подкачки, в поле «свободное пространство после» В свободном пространстве, которое теперь создано, выберите новый, введите linux-swap и вы можете назвать раздел «swap», если хотите НажмитеПрименятькнопка (должна быть галочкой), чтобы записать изменения на диск. Когда закончите, перезагрузитесь обратно в Ubuntu. Активация раздела подкачки (если ваш раздел подкачки находится на вашем основном жестком диске, вам не нужно ничего здесь делать.) Теперь вам нужно найти, на каком разделе находится ваш раздел подкачки и каков его UUID. UUID?! вы скажете? Ну, это универсальный уникальный идентификатор для раздела, поэтому вы можете ссылаться на него, даже если он находится в другой точке монтирования от загрузки к загрузке из-за добавления дисков и т. д.

Откройте терминал и запустите gksu gparted & и введите свой пароль root. & позволяет этому процессу работать, в то же время предоставляя вам доступ к командной строке.

Щелкните правой кнопкой мыши по разделу подкачки и выберитеИнформация. Вы должны увидетьПутьиUUIDтам указано. Держите это открытым для дальнейшего использования. Запустите gksu gedit /etc/fstab & и найдите строку, которая имеетменятьв нем. Это должен быть третий столбец, разделенный пробелами или табуляциями. Вы можете использовать путь или UUID, чтобы сообщить Linux, где найти ваш раздел подкачки. Я рекомендую UUID, потому что он останется неизменным, даже если вы переместите раздел или диск каким-то образом станет sdb вместо sda или что-то в этом роде. Внесите соответствующие изменения и сохраните файл. Ваша строка должна выглядеть примерно так, если вы использовали UUID (с вашим UUID вместо него, конечно):

UUID=41e86209-3802-424b-9a9d-d7683142dab7 нет подкачка sw 0 0

или это, если вы использовали путь: /dev/sda2 none swap sw 0 0

Сохраните файл. Включите новый раздел подкачки с помощью этой команды.

sudo swapon --all

ИЛИ

$ 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

Перезагрузите компьютер, чтобы убедиться, что новый раздел подкачки правильно активируется при запуске. Настройка раздела подкачки для работы в режиме гибернации (необязательно) «ИНФОРМАЦИЯ: это не будет работать в версии 12.04, выход из режима гибернации работает иначе в версии 12.04».

Снова откройте Терминал и запустите cat /proc/swaps, и, надеюсь, вы увидите там путь к разделу подкачки. Если нет, то, скорее всего, что-то пошло не так в предыдущих шагах. Вот мой вывод:

Имя файла Тип Размер Используемый Приоритет /dev/sda2 раздел 2676732 73380 -1 gksu gedit /etc/default/grub & для извлечения конфигурации загрузчика

Найдите строку GRUB_CMDLINE_LINUX="" и убедитесь, что она выглядит следующим образом (конечно, используя ваш UUID) GRUB_CMDLINE_LINUX="resume=UUID=41e86209-3802-424b-9a9d-d7683142dab7" и сохраните файл.

sudo update-grubи дождитесь окончания

gksu gedit /etc/initramfs-tools/conf.d/resume & и убедитесь, что его содержимое resume=UUID=41e86209-3802-424b-9a9d-d7683142dab7 (конечно, с вашим UUID вместо моего). Сохраните файл!

sudo update-initramfs -u

Перезагрузите! Теперь вы сможете перейти в спящий режим и возобновить работу!

Связанный контент