web-dev-qa-db-ja.com

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を介したスワップファイルの使用は不可能であると誰かが言っています。このステートメントはまだ有効ですか?はいの場合、この選択の理由は何ですか?これを機能させるための回避策はありますか?

3
Avio

マニュアルページを引用するには...

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

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

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

3
Michael Hampton

これは少し古いスレッドであることがわかっていますが、この問題に遭遇したばかりで、カーネルループバックデバイスを使用することで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/

7
user3767547

あなたが説明するようにそれを行うことができれば、私はあなたが別のマシンの未使用のRAMを使用していないことを指摘する必要があります。スワップファイルは、ローカルの高速RAM用のファイルベースのバッキングです。他のマシンのハードディスク容量を使い果たしてしまうでしょう。

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

ただし、iSCSIで実行できる可能性があると思います。 iSCSIターゲットをローカルにマウントし、その中でスワップを提供すると、機能する場合があります。それは良い考えですか?番号。パフォーマンスと信頼性の理由から、それはひどい考えだと思います。ネットワークがダウンし、スワップパーティションにアクセスする必要がある場合、Linuxはフリーズする可能性があります。 AoEを使用するとパフォーマンスが向上するはずです。しかし、繰り返しになりますが、ネットワークまたは他のマシンの1つの問題で、でこぼこした乗り物になります。

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

編集:Okあなたはそれを行うことができます。それでも推奨されませんが、これは理論的にそれを達成するための1つの方法です。

  1. リモートホストにtmpfsまたはramfsを作成します。
  2. Tmpfsまたはramfsをext4としてフォーマットします。
  3. その上にrawディスクイメージファイルを作成します。 (ddまたはtruncateがそれを行います)
  4. IscsiまたはAoEを使用してディスクイメージをエクスポートします。
  5. ローカルのLinuxPCで、ターゲットを接続します。次に、mkswapを使用してターゲットにスワップを作成します。
  6. 次にswapon。

幸運を!

1
Matt H