Linux では、SMB/NFS マウントされたファイルシステム上でスワップ ファイルを使用できないのはなぜですか?

Linux では、SMB/NFS マウントされたファイルシステム上でスワップ ファイルを使用できないのはなぜですか?

別のマシンの未使用 RAM を、主な Linux インストール用のスワップ領域として使用したいと考えています。ローカル (低速) の機械式ハードディスクと比較したネットワーク RAM ディスクのパフォーマンスについて興味がありました。

スワップファイルはtmpfsマウントポイント上にあり、を介して共有されていますsamba。ただし、次のコマンドを発行しようとするたびに、

swapon /mnt/ramswap/swapfile

次のような結果になります:

swapon: /mnt/ramswap/swapfile: swapon failed: Invalid argument

そしてdmesg私はこう読んだ。

[ 9569.806483] swapon: swapfile has holes

dd if=/dev/zero of=swapfile bs=1024 (but also =4096 and =1048576)およびtruncate -s 2G(両方とも が続く) を使用してスワップファイルを割り当てようとしましたmkswap swapfileが、結果は常に同じです。

この郵便受け(2002 年まで遡る) Linux では NFS/SMB 経由でスワップファイルを使用することはできないと誰かが言っています。この発言は今でも有効ですか? 有効である場合、この選択の理由は何ですか。また、これを機能させるための回避策はありますか?

答え1

これは少し古いスレッドであることは承知していますが、私はこの問題に遭遇し、カーネル ループバック デバイスを利用することで NFS スワップ パーティションを使用できることがわかりました。

空のファイルを作成します(/dev/zero からゼロを埋めます)。

root@machine:/# dd if=/dev/zero of=/swap bs=1024 count=1048576

ループデバイスを作成する:

root@machine:/# losetup /dev/loop0 /swap

スワッピングに適したものにします:

root@machine:/# mkswap /dev/loop0
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=931d6e04-78ec-41fd-ab2c-22522ac2711d

では、使ってみましょう:

root@machine:/# swapon /dev/loop0

変更を永続的にする

このスワップを永続的にするためのスクリプトを作成します。/etc/init.d/swap は次のようになります。

#!/bin/sh

set -e

case "$1" in
start)
losetup /dev/loop0 /swap
swapon /dev/loop0
;;
stop)
swapoff /dev/loop0
losetup -d /dev/loop0
;;
restart)
swapoff /dev/loop0
swapon /dev/loop0
;;
*)
echo "Usage: swap { start | stop | restart }" >&2
exit 1
;;
esac

exit 0

ファイルを実行可能にします。

root@machine:/# chmod +x /etc/init.d/swap

有効にする:

root@machine:/# update-rc.d swap defaults

ソース:http://www.emanuelis.eu/2010/06/21/how-to-swap-to-nfs-mount/

答え2

man ページを引用すると...

これは、ファイルシステムの支援なしにファイルに直接書き込むことができると想定したカーネル内のスワップファイルの実装によるものです。

ファイルシステムを経由せずに NFS マウントに直接書き込むことはできないため、この少しわかりにくいエラー メッセージが表示されます。

@MattH が指摘したように、iSCSI を使用してこれを行うことはできるかもしれませんが、実際の問題は、それが本当に価値があるかどうかです。結局のところ、RAM は非常に安価です。

答え3

説明どおりに実行できる場合、別のマシンの未使用の RAM を使用していないことを指摘する必要があります。スワップ ファイルは、ローカルの高速 RAM のファイル ベースのバックアップです。他のマシンのハード ディスク領域を使用することになります。

Linux には swap 用の特別なパーティション タイプがあるため、ネットワーク共有ではなくローカル ドライブ上に配置する必要があります。Windows ではこの方法は使用されず、既存のファイル システム上のファイルのみが使用されます。私の記憶が正しければ、そのファイルもローカル ドライブ上になければなりません。したがって、NFS または SMB 上に配置することはできません。

ただし、iSCSI ならできると思います。iSCSI ターゲットをローカルにマウントし、その中にスワップを用意すれば、うまくいくかもしれません。これは良いアイデアでしょうか? いいえ。パフォーマンスと信頼性の理由から、これはひどいアイデアだと思います。ネットワークがダウンしてスワップ パーティションにアクセスする必要がある場合、Linux はフリーズする可能性が高くなります。AoE を使用すると、パフォーマンスが向上するはずです。ただし、ネットワークまたは他のマシンに 1 つでも問題が発生すると、不安定な状況に陥ります。

追加の RAM を購入するか、これ以上収まらない場合は SSD を購入してその上にスワップ パーティションを作成してください。

編集: わかりました。できます。まだ推奨されませんが、これは理論的にはそれを実現する 1 つの方法です。

  1. リモート ホストに tmpfs または ramfs を作成します。
  2. tmpfs または ramfs を ext4 としてフォーマットします。
  3. そこに生のディスク イメージ ファイルを作成します。(dd または truncate で実行できます)
  4. iscsi または AoE を使用してディスク イメージをエクスポートします。
  5. ローカル Linux PC でターゲットを接続します。次に、mkswap を使用してターゲット上にスワップを作成します。
  6. それからスワポン。

幸運を!

答え4

NBD経由のスワップで別のマシンのRAMを共有しています

ホスト/サーバー

ramfs をセットアップします (必要な場合、必要でない場合はそのまま nbd に進みます)

sudo mkdir /mnt/ram
sudo mount -t tmpfs -o size=16G tmpfs /mnt/ram

設定ファイル/etc/nbd-server/config:

[generic]
  user = nbd
  group = nbd
[swap]
  exportname = /mnt/ram/swap
  copyonwrite = false
  prerun = truncate -s 16G /mnt/ram/swap && mkswap /mnt/ram/swap

NBDを開始

sudo systemctl start nbd

クライアント

sudo nbd-client 192.168.1.3 -name swap /dev/nbd0
sudo swapon /dev/nbd0

関連情報