前言

前言

前言

我犯了一個錯誤並安裝了帶有加密 ZFS / OpenZFSroot分割區的Ubuntu 20.04 LTS在我的雙啟動配置的高效工作桌面上(請參閱下面的分區表)。但我沒有適當注意我正在遵循的教程,現在看來我有一個 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/swap1.08T

與 GParted 相關的任何內容

GParted 不會識別太多。這可能與os-prober(GParted第14期,Debian 錯誤 888114,作業系統偵測器問題 1848496, openzfs 問題98019069

在此輸入影像描述

更換小交換分區(=增加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無關。即使調整了交換大小後它也不起作用,因為它在較新的 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變更為。ResultActiveyes

重新啟動並測試結果

$ sudo systemctl hibernate
# or
$ sudo pm-hibernate

如果仍然不起作用,您可能需要在 BIOS 中停用諸如Fast boot和 之類的功能(Secure boot注意力:這是非常可能您必須在較新的機器上執行此操作)。

如果測試不再導致錯誤,您還應該能夠在 Ubuntu 設定中將休眠指派給某些操作。例如按下電源按鈕。

電源 — 掛起與電源 — 按鈕 電源按鈕行為 — 休眠

答案2

使用 ZFS 進行交換(檔案系統上的檔案或整個 zvol)已經一個壞主意,更不用說和它一起冬眠了。我唯一的建議是徹底放棄,ZFS 不是為此目的而建構的。

ZFS 是一個日誌結構檔案系統,其中文件的區塊(範圍)在任何時候都不是固定的,而是每次寫入都會發生變化(不覆蓋規則)。然而,交換子系統期望交換文件和區塊之間有簡單、可理解的映射,以及對底層磁碟區的直接訪問,而這兩者都不是日誌結構檔案系統的特徵。 Btrfs 是另一個 LFS,支援交換文件諸多限制,只為做到可用的,而ZFS甚至不支持O_DIRECT。交換是有原因的分割區比交換性能更好、更可靠文件

ZFS 進行大量內部記帳以確保事務安全,並且嚴重依賴充足的記憶體。如果使用 ZFS 進行交換(其主要目的是用作記憶體的磁碟支援擴充),則會在高負載或高交換壓力下導致 ZFS 和記憶體管理子系統之間形成正回饋循環。例如,這可能導致整個系統的軟鎖定。

如果您進一步使用 swap-on-ZFS 進行休眠,ZFS 的內部資料結構遲早會發瘋,因為從休眠中恢復依賴於從磁碟加載的正確且一致的內存,而 ZFS 還依賴格式良好的信息。結構提供完整的磁碟資料。

答案3

增加交換分區大小並用於休眠的過程

  1. 建立交換分割區

    啟動交換分割區

    使新的交換分區適用於休眠(可選)

    建立交換分割區 引導至 Ubuntu 安裝 CD 並選擇立即執行 Ubuntu 的選項 前往系統 -> GParted 分割區編輯器

刪除交換分割區,如果其中沒有其他分割區,則刪除儲存它的擴充分割區。 (如果出現奇蹟,您能夠從這裡調整交換分割區的大小,我想您的生活會比我的容易得多。)將主分割區的大小減小到您希望新交換分割區的大小(我做了為了安全起見,我的2x RAM + 500MB)。最簡單的方法是在“可用空間以下”欄位中填寫您想要交換的空間量在現在已建立的可用空間中,選擇“新建”,鍵入 linux-swap,然後可以命名該分割區如果您願意,請“交換”申請按鈕(應該是一個複選標記)將更改寫入磁碟完成後,重新引導回 Ubuntu 啟動交換分割區(如果您的交換分割區位於主硬碟上,則無需在此處執行任何操作。)現在您需要查找您的交換分割區所在的分割區及其UUID 是什麼。 UUID?你說?嗯,這是分割區的通用唯一標識符,因此即使由於添加磁碟等原因它在啟動時處於不同的安裝點,您也可以引用它。

打開終端機並執行 gksu gparted & 並輸入您的 root 密碼。 & 允許此進程運行,同時仍允許您存取命令列。

右鍵單擊您的交換分割區並選擇資訊。你應該看到小路通用唯一識別符列在那裡。保持開啟狀態以供進一步參考。執行 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(當然用你的UUID4b-9a9d-d7683142dab7(當然用你的UUID代替我的)。儲存文件!

sudo update-initramfs -u

重啟!現在您應該能夠冬眠並恢復!

相關內容