為什麼在 Linux 中無法透過 SMB/NFS 安裝的檔案系統使用交換檔案?

為什麼在 Linux 中無法透過 SMB/NFS 安裝的檔案系統使用交換檔案?

我想使用另一台機器未使用的 RAM 作為我的主要 Linux 安裝的交換空間。我只是對網路 ramdisk 與本地(慢速)機械硬碟相比的性能感到好奇。

交換文件位於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)和 with 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

引用手冊頁...

這是因為核心中的交換文件實作希望能夠直接寫入文件,而不需要檔案系統的幫助。

不透過檔案系統就無法直接寫入 NFS 掛載,因此您會收到此稍微令人困惑的錯誤訊息。

正如 @MattH 指出的,您也許可以使用 iSCSI 來執行此操作,但真正的問題是它是否值得。畢竟 RAM 相當便宜。

答案3

如果您可以按照您的描述進行操作,我應該指出您沒有使用另一台機器未使用的記憶體。交換文件是基於文件的本地更快 RAM 的支援。您將耗盡其他機器的硬碟空間。

你不能這樣做,因為 Linux 有一個特殊的交換分割區類型,它必須位於本機磁碟機上,而不是網路共用上。 Windows 不會這樣做,它只使用現有檔案系統上的檔案。如果我沒記錯的話,該檔案也必須位於本機磁碟機上。所以它不能位於 NFS 或 SMB 上。

不過,我認為您可以使用 iSCSI 來做到這一點。如果您在本機安裝 iSCSI 目標並在其中提供交換,則可能會起作用。這是不是一個好主意?不。我認為出於性能和可靠性的原因,這是一個糟糕的主意。如果網路故障並且需要存取交換分區,Linux 很可能會凍結。你應該透過 AoE 獲得更好的表現。但同樣,如果網路或另一台機器出現問題,您的旅程就會變得崎嶇不平。

只需購買更多 RAM,或者如果您無法再安裝,請購買 SSD 並在其上建立交換分割區。

編輯:好的,你可以做到。仍然不推薦,但這是理論上實現它的一種方法。

  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

相關內容