Linux에서 SMB/NFS 마운트 파일 시스템을 통해 스왑 파일을 사용할 수 없는 이유는 무엇입니까?

Linux에서 SMB/NFS 마운트 파일 시스템을 통해 스왑 파일을 사용할 수 없는 이유는 무엇입니까?

다른 컴퓨터의 사용되지 않은 RAM을 기본 Linux 설치를 위한 스왑 공간으로 사용하고 싶습니다. 로컬(느린) 기계식 하드 디스크와 비교하여 네트워크 램디스크의 성능이 궁금했습니다.

스왑 파일은 마운트 지점에 있으며 를 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에서 0으로 채움).

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가 정지될 가능성이 높습니다. 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

관련 정보