web-dev-qa-db-ja.com

ZFSでスワップファイルを使用できない:穴のあるファイル

新しいswapfileを追加して、 このチュートリアル に従ってスワップスペースを増やしようとしています。

swapfileは正常に作成されますが、swaponコマンドはそれを受け入れません:言う "スキップ-穴があるようです。"

ルート上でZFSを使用してXubuntu 19.10を実行しています。

これが私がこれまでに試したことです:

スワップファイルを作成

fallocateの使用-失敗

Sudo fallocate -l 8G /swapfile
fallocate: fallocate failed: Operation not supported

現在 は、ZFS をサポートしていないようです。

別の方法-ddの使用-成功

Sudo dd if=/dev/zero of=/swapfile bs=1MiB count=$((8*1024))
8192+0 records in
8192+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 2.68284 s, 3.2 GB/s

スワップファイルの準備-成功

Sudo chmod 600 /swapfile
ls -lah /swapfile 
-rw------- 1 root root 8.0G Dec 27 14:15 /swapfile

Sudo mkswap /swapfile
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=db8aa64c-734c-4eba-a803-72db681ec1a1

スワップファイルを有効にする-失敗

Sudo swapon /swapfile
swapon: /swapfile: skipping - it appears to have holes.

swapon manual から:

穴のあるファイル

カーネル内のスワップファイルの実装では、ファイルシステムの支援なしに、ファイルに直接書き込むことができると想定しています。これは、穴のあるファイルまたはBtrfsなどのファイルシステム上のコピーオンライトファイルの問題です。

Cp(1)やtruncate(1)のようなコマンドは、穴のあるファイルを作成します。これらのファイルはswaponによって拒否されます。

ファイルシステムによっては、fallocate(1)によって作成された事前に割り当てられたファイルも、穴のあるファイルとして解釈される場合があります。 Linux 4.18以降、事前割り当てされたスワップファイルはXFSでサポートされています。

スワップファイルを作成する最もポータブルなソリューションは、dd(1)と/ dev/zeroを使用することです。

swaponコマンドが受け入れるZFSにスワップファイルを作成するにはどうすればよいですか?

システム情報:

Sudo parted -l

Model: WDC PC SN520 SDAPNUW-512G-1002 (nvme)
Disk /dev/nvme0n1: 512GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name                  Flags
 1      1049kB  538MB   537MB   fat32           EFI System Partition  boot, esp
 2      538MB   590MB   52.4MB  ext4
 3      590MB   2738MB  2147MB  linux-swap(v1)
 4      2738MB  4885MB  2147MB  zfs
 5      4885MB  512GB   507GB   zfs
Sudo zpool list -v

NAME          SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
bpool        1.88G   131M  1.75G        -         -     0%     6%  1.00x    ONLINE  -
  nvme0n1p4  1.88G   131M  1.75G        -         -     0%  6.82%      -  ONLINE  
rpool         472G   112G   360G        -         -     9%    23%  1.00x    ONLINE  -
  nvme0n1p5   472G   112G   360G        -         -     9%  23.8%      -  ONLINE
Sudo zfs list

# https://Pastebin.ubuntu.com/p/6jDVwbhfCT/
Sudo lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 19.10
Release:    19.10
Codename:   eoan
Sudo uname -a

Linux iCyberRoze 5.3.0-24-generic #26-Ubuntu SMP Thu Nov 14 01:33:18 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
2
slashsbin

リンクしたチュートリアルは、ルートファイルシステムがZFSであるという前提の下にありません。 ZFSマンページ は以下を示します。

ZFS Volumes as Swap

ZFSボリュームはスワップデバイスとして使用できます。 zfs create -Vコマンドを使用してボリュームを作成した後、mkswap(8)およびswapon(8)コマンドを使用してスワップ領域を設定および有効化します。 ZFSファイルシステム上のファイルにスワップしないでください。 ZFSスワップファイル構成はサポートされていません。

ストラタスから other answer の指示に従って、ZFSプールの一部であるスワップスペースとして使用できるzvolからスワップスペースを機能させることができます。

ただし、ZFSファイルシステムに保存されているスワップファイルの使用を推奨する場合は、次のようにします。

fallocateはZFSファイルシステム内では機能しません。すでに投稿したzfsonlinux githubのバグからすでにわかっています。 ddを使用する代わりに、出力ファイルのすべての部分を書き込む必要があるため速度が低下しますが、ZFSファイルシステムで作成できる大きなスパースファイルをすばやく作成したい場合は、truncateコマンドは同じことを行いますが、ZFSで動作します。

Sudo truncate -s 8G /swapfile
Sudo chmod 600 /swapfile
Sudo swapon /swapfile

それでも表示されます:swapon: /swapfile: skipping - it appears to have holes.

ls -lsh /swapfile

レポート512 -rw------- 1 root root 8.0G Jan 17 18:27 /swapfileは、作成されたファイルが8 GBではなく512バイトしか使用しないことを示しています。

このファイルを含むZFSファイルシステムの圧縮設定により、ddの出力がまばらになる可能性があります(報告されたファイルサイズよりもディスク上のスペースがはるかに少なくなります)。

Sudo dd if=/dev/zero of=/swapfile bs=1M count=8k status=progress
ls -lsh /swapfile

レポート512 -rw-rw-r-- 1 root root 8.0G Jan 17 18:39 /swapfileは、ZFSファイルシステムの圧縮設定により、完全な8 GBファイルが512バイトに収まったことを示しています。

/dev/zeroddへの高度に圧縮可能な入力を使用する代わりに、非圧縮の/dev/urandomを使用して、実際に8 GBのハードドライブ領域を占有することができます。しかし、私のテストでは、swaponはまだそれを拒否しています。

Sudo dd if=/dev/urandom of=/swapfile bs=1M count=8k status=progress
Sudo chmod 600 /swapfile
Sudo swapon /swapfile

それでも表示されます:swapon: /swapfile: skipping - it appears to have holes.

もう1つの実験は、圧縮がオフになっているZFSファイルシステムで試すことです。

Sudo zfs create rpool/swap -o compression=off -o mountpoint=/swap/
Sudo dd if=/dev/zero of=/swap/swapfile bs=1M count=8k status=progress

今回は本当に0をディスクに書き込みます。

ls -lsh /swap/swapfile

これは8.0G -rw-r--r-- 1 root root 8.0G Jan 17 18:52 /swap/swapfileを報告します

Sudo chmod 600 /swap/swapfile
Sudo swapon /swap/swapfile

それでも表示されます:swapon: /swapfile: skipping - it appears to have holes.

私の結論は、ZFSファイルシステムにあるファイルをスワップファイルとして使用することの拒否を回避する方法があるとは言えないということです。

この質問の範囲外では、このシステムでスワップスペースを使用する代わりに、スワップパーティション(すでに590MBスワップパーティションがあるか、スワップファイルをZFS以外のファイルシステムに置くなど) ext4パーティションの場合と同様に、またはディスク領域が利用できない場合は、 Zswap (RAMスワップ領域として使用)の圧縮ブロック)または vramfs を使用します(グラフィックカードのRAMにあるスワップスペース)。

1
doubledd3

あなたが欲しいものは実際には ZFSOnlinux ページに十分に文書化されていると思います

TLDR;

# To set swap on a zfs drive:
zfs create -V 8G -b $(getconf PAGESIZE) -o logbias=throughput -o sync=always -o primarycache=metadata -o com.Sun:auto-snapshot=false VMs/swap

mkswap -f /dev/zvol/VMs/swap
swapon /dev/zvol/VMs/swap

# IN FSTAB
/dev/zvol/VMs/swap none swap discard 0 0
5
stratus