为什么在 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)和 使用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。交换文件是基于文件的本地更快 RAM 备份。你会用尽其他机器的硬盘空间。

您无法这样做,因为 Linux 有一个特殊的交换分区类型,它必须位于本地驱动器上,而不是网络共享上。Windows 不会这样做,它只使用现有文件系统上的文件。如果我没记错的话,该文件也必须位于本地驱动器上。所以它不能在 NFS 或 SMB 上。

但是,我认为您可以使用 iSCSI 来实现这一点。如果您在本地安装 iSCSI 目标并在其中提供交换,则可能会有效。这是个好主意吗?不是。我认为出于性能和可靠性的原因,这是一个糟糕的想法。如果网络中断并且 Linux 需要访问交换分区,则 Linux 很可能会冻结。使用 AoE 应该可以获得更好的性能。但是,网络或另一台机器出现一个问题,您就会陷入困境。

只需购买更多 RAM,或者如果装不下,就购买 SSD 并在其上创建交换分区。

编辑:好的,你可以做到。仍然不推荐,但从理论上讲这是一种实现方法。

  1. 在远程主机上创建 tmpfs 或 ramfs。
  2. 将 tmpfs 或 ramfs 格式化为 ext4。
  3. 在其上创建一个原始磁盘映像文件。(dd 或 truncate 可以做到这一点)
  4. 使用 iscsi 或 AoE 导出磁盘映像。
  5. 在本地 Linux PC 上,连接目标。然后使用 mkswap 在目标上创建交换。
  6. 然后 swapon。

祝你好运!

答案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

相关内容