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


2

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

스왑 파일은 tmpfs마운트 지점에 있으며를 통해 공유됩니다 samba. 그러나 발행하려고 할 때마다 :

swapon /mnt/ramswap/swapfile

나는 얻다:

swapon: /mnt/ramswap/swapfile: swapon failed: Invalid argument

그리고 dmesg나는 읽었다 :

[ 9569.806483] swapon: swapfile has holes

with dd if=/dev/zero of=swapfile bs=1024 (but also =4096 and =1048576)와 with truncate -s 2G( 와 뒤에 mkswap swapfile)를 사용 하여 스왑 파일을 할당하려고 시도 했지만 결과는 항상 동일합니다.

에서 이 게시물 (2002 년에 다시 일자) 누군가가 NFS / SMB를 통해 스왑 파일을 사용하는 리눅스에서 불가능하다고 말한다. 이 진술은 여전히 ​​유효합니까? 그렇다면,이 선택의 이유는 무엇이며이 작업을 수행 할 수있는 해결 방법이 있습니까?


1
이것이 시스템을 매우 불안정하게 만드는 것을 볼 수 있습니다. 네트워크에서 가장 작은 결함으로 인해 일부 시스템이 페이지 아웃 될 경우 시스템 핵심 프로세스가 중단 될 수 있습니다. Wi-Fi를 해킹 할 수있는 사람은 말할 것도없이 페이징 아웃되는 메모리를 읽을 수 있습니다.
Darth Android

2
WiFi는 사용하지 않지만 2Gbps 이더넷 카드를 연결하는 짧은 네트워크 케이블입니다. OSI 파일에는 대부분의 결함과 손상을 방지하기에 충분한 여러 개의 체크섬 필드가 서로 겹쳐져 있습니다. 현재로서는 이것이 가능하고 어떻게 가능한지 알고 싶습니다 . 나중에 안정성과 보안에 미치는 영향에 대해 생각하겠습니다.
Avio

답변:


3

맨 페이지를 인용하려면 ...

이는 파일 시스템의 도움없이 파일을 직접 쓸 수있는 커널에서의 스왑 파일 구현 때문입니다.

파일 시스템을 거치지 않고 NFS 마운트에 직접 쓸 수 없으므로 약간 혼란스러운 오류 메시지가 표시됩니다.

@MattH가 지적했듯이 iSCSI를 사용 하여이 작업을 수행 할 수는 있지만 실제 질문은 가치가 있는지 여부입니다. RAM은 결국 매우 저렴합니다.


설명 감사합니다. 이런 식으로 말하면 그것이 계속 한계라고 생각하더라도 말이됩니다. 그 가치가 있는지 모르겠습니다. 그러나 시도조차 할 수 없다면 결코 알 수 없습니다.
Avio

7

나는 이것이 조금 오래된 스레드라는 것을 알고 있지만이 문제를 뛰어 넘었고 커널 루프백 장치를 사용하여 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/


이 네트워크는 어떻게 연결되어 있습니까? 관련된 네트워킹에 대한 언급은 없습니다.
Ken Sharp

1

설명대로 할 수 있다면 다른 컴퓨터에서 사용하지 않는 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. 그런 다음 교체하십시오.

행운을 빕니다!


1
아마도 언급하지 않았을 수도 있지만,이 실험은 기존 하드웨어를보다 합리적인 방식으로 사용하는 것을 목표로합니다. iSCSI에 대해 이해할 수있는 한, 내가하려는 일에 지나치게 비쌉니다. 그리고 스왑 파일이 tmpfs마운트 포인트 내부에 생성 되므로 기본적으로 램 드라이브 내부에 있기 때문에 다른 컴퓨터의 hdd를 사용하지 않을 것입니다 .
Avio

1
@Avio 이것에 대해 "합리적인" 것은 없습니다 :)
Darth Android

1
리눅스는 모든 종류의 목적에 모든 종류의 미디어를 사용할 수있는 자유를 제공합니다. 이제 플로피를 스왑 공간으로 사용할 수 있지만 네트워크 램 드라이브를 사용할 수없는 이유를 알려주십시오. : P
Avio

iscsi는 비싸지 않으며 리눅스만큼 개방 된 대상 소프트웨어가 있습니다.
Matt H

1
흥미로운 아이디어입니다. 시도해 볼 가치가 있습니다. RDMA가 표준이되는 날을 기대하며 신뢰할 수있는 방식으로 사용되지 않은 다른 램을 사용할 수 있습니다. 이론적으로 ... 왜 안돼?
Matt H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.