
Предисловие
Я сделал ошибку и установил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 (хотя это будет пересмотрено).
Чтобы решить эту проблему, вам придется активировать режим гибернации.
- Открыть
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
процесс увеличения размера раздела подкачки и использования его для гибернации
Создание раздела подкачки
Активация раздела подкачки
Настройка нового раздела подкачки для работы в режиме гибернации (необязательно)
Создание раздела подкачки Загрузите установочный компакт-диск 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
Перезагрузите! Теперь вы сможете перейти в спящий режим и возобновить работу!