以下内容(无论这是否是一个好主意)似乎不起作用:
me@client:~ $ ssh host
me@host:~ $ cd /media/big-hdd
me@host:/media/big-hdd $ sudo fallocate -l 8g swapfile
me@host:/media/big-hdd $ sudo chown me swapfile
me@host:/media/big-hdd $ logout
me@client:~ $ sudo mkdir /media/big-hdd
me@client:~ $ sudo sshfs me@host:/media/big-hdd /media/big-hdd
me@client:~ $ sudo mkswap /media/big-hdd/swapfile
Setting up swapspace version 1, size = 8388604 KiB
no label, UUID=7d6b9704-7692-4463-b0c7-8a94668d715f
me@client:~ $ sudo swapon /media/big-hdd/swapfile
swapon: /media/big-hdd/swapfile: insecure permissions 0644, 0600 suggested.
swapon: /media/big-hdd/swapfile: insecure file owner 1002, 0 (root) suggested.
swapon: /media/big-hdd/swapfile: swapon failed: Invalid argument
有人建议别处这个Invalid argument
问题是因为fallocate
没有实际分配,只保留内存。但用(慢得多)替换它
me@host:/media/big-hdd $ sudo dd if=/dev/zero of=swapfile count=2048 bs=4MiB
也没有改变任何东西。
这在原则上是不可能的,还是我只是犯了一个错误,导致它无法工作?
答案1
sshfs
由于它实现文件系统的方式,这是不可能的。
本质上,它将文件系统的客户端映射到一系列sftp
文件传输。您在本地更新文件并sshfs
远程复制该文件(完整)。这是手册页本身的内容:
在安装 SSHFS 的本地计算机上,实现使用 FUSE(用户空间中的文件系统)内核模块。这样做的实际效果是,最终用户可以与通过 SSH 安全服务的远程文件无缝交互,就像它们是他/她计算机上的本地文件一样。在远程计算机上使用 SSH 的 SFTP 子系统。
此外,请记住,FUSE 是在用户空间中实现的,因此可能会发生交换。考虑对已经在交换的系统的影响,其中调用了 FUSE 子系统,但为了运行它需要换出另一个进程(或更糟糕的是,再次将自身换回)...
这可以通过基于块的文件系统(例如 NFS)实现,事实上,这在 80 年代/90 年代的早期无盘系统上使用过。
答案2
令我惊讶的是,它不能直接起作用。swapon <swapfile-on-ssh>
和都swapon -o loop <swapfile-on-ssh>
失败Invalid argument
并swapon: swapfile has holes
在日志中显示 , 。
但可以通过以下方式工作losetup
:
losetup -f <swapfile>
losetup # To take a look which device I've got
swapon /dev/loop<N>
我已经使用这个技巧在 raspberry 3 上构建 gcc。请注意,其他回复的担忧(sshfs 本身可能会受到交换)仍然存在。