다른 컴퓨터의 사용되지 않은 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를 구입하여 그 위에 스왑 파티션을 만드세요.
편집: 네, 할 수 있어요. 여전히 권장되지는 않지만 이론적으로는 이를 달성하는 한 가지 방법입니다.
- 원격 호스트에 tmpfs 또는 ramfs를 생성합니다.
- tmpfs 또는 ramfs를 ext4로 포맷합니다.
- 여기에 원시 디스크 이미지 파일을 만듭니다. (dd나 truncate로 하면 됩니다)
- iscsi 또는 AoE를 사용하여 디스크 이미지를 내보냅니다.
- 로컬 Linux PC에서 대상을 연결하십시오. 그런 다음 mkswap을 사용하여 대상에 스왑을 만듭니다.
- 그럼 교환하세요.
행운을 빌어요!
답변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