我想使用另一台机器未使用的 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 并在其上创建交换分区。
编辑:好的,你可以做到。仍然不推荐,但从理论上讲这是一种实现方法。
- 在远程主机上创建 tmpfs 或 ramfs。
- 将 tmpfs 或 ramfs 格式化为 ext4。
- 在其上创建一个原始磁盘映像文件。(dd 或 truncate 可以做到这一点)
- 使用 iscsi 或 AoE 导出磁盘映像。
- 在本地 Linux PC 上,连接目标。然后使用 mkswap 在目标上创建交换。
- 然后 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