개인 블로그에서 먼저 작성된 글이라 경어체가 아닌 점 양해 부탁드립니다. 내용의 차이는 없습니다.
-------------------------------------------------------------------------------------------------------------------
LXC 컨테이너를 쓰든, VM을 쓰든 Proxmox에서 다른 하드를 마운트 시켜야 할 일이 있다. 주로 쓰는 방법이 몇가지 있다.
- LXC 컨테이너에 하드 마운트
- LXC 컨테이너에서 cifs 마운트
- LXC/VM 자체를 다른 하드에 설치
- VM에서 하드 공간 마운트
- VM에 하드 패스스루
- VM에서 cifs/nfs 마운트
1. LXC 컨테이너에 하드 마운트
Bindmount를 이용한다.
우선 마운트 시키고자 하는 폴더가 호스트의 /mnt/bindmounts/test 라고 치자.
컨테이너 내부에서 이 폴더를 /media/test 라는 폴더에 마운트 시키는 법은
vim /etc/pve/lxc/(컨테이너번호).conf
으로 컨테이너 conf 파일에 들어가서 끝에 다음과 같이 추가하면 된다.
mp0: /mnt/bindmounts/test,mp=/media/test
원하는게 폴더 하나 이상일 경우 mp1, mp2식으로 쭉 동일한 방법으로 진행해주면 된다.
컨테이너 내부에 미리 /media/test 폴더를 만들어 줄 필요는 없지만 호스트에 /mnt/bindmounts/test 폴더가 없을 시 컨테이너가 실행되지 않으므로 주의.
Unprivileged 컨테이너에선 이렇게 마운트시킬 경우 기본적으로 읽기밖에 할 수 없다. 호스트에서 폴더를 777 따위로 만들어주지 않으면 쓰기는 불가. 이런 식으로 하드 접근과 쓰기를 해야한다면 컨테이너는 privileged로 하는게 좋다.
2. LXC 컨테이너에서 cifs 마운트
그냥 컨테이너 내부에서 cifs-utils를 깔고 /etc/fstab을 수정하는 방법으론 안되고,
vim /etc/apparmor.d/lxc/lxc-default
으로 lxc 관련 앱아머에
allow mount fstype=cifs,
를 추가해 준 후 상기된 방법으로 cifs-utils 깔고 fstab 수정해주면 마운트 가능.
3. LXC/VM 자체를 다른 하드에 설치
ESXi의 개념으로 본다면 다른 데이터스토어를 추가해 거기에 컨테이너든 VM이든 설치한다고 보면 되겠다. 우선 Thin-lvm 설정을 해줘야한다.
fdisk -l
로 원하는 하드가 /dev/sdxx 어디에 마운트되었는지 확인 후,
pvcreate /dev/sdxx
로 physical volume을 설정해준다.
pvs
를 해보면 두개가 나올 것이다. 원래 있던 PV와 지금 생성한 PV.
vgcreate (VG이름) /dev/sdxx
로 volume group을 설정해준다. VG 이름은 pve만 아니면 된다. 원래 있는 vg 이름이 pve라서 그건 안된다. 마찬가지로
vgs
를 쓰면 원래 있던 pve와 방금 설정한 vg가 떠야 정상. 이제 Thin-lvm을 만들면 된다.
lvcreate -L (원하는 용량) --thinpool --poolmetadatasize (메타데이터 용량) (lv이름) (vg이름)
이게 가장 뭐가 많은데... 하나씩 살펴보자. 원하는 용량 부분이 500기가라면 500G 가 될 것이고, 지정하지 않고 하드 전체를 사용하고 싶다면 -l 100%FREE 가 될 것이다. 대문자 L이 소문자 l (엘)로 바뀌었다는걸 잘 확인하자.
메타데이터 용량은 thin-lvm에만 있는 건데, 뭔지 정확히 모르지만 기본값은 이게 충분히 설정되지 않는다. 1테라 하드를 기준으로 대략 10기가 정도 메타데이터 용량을 주니 넉넉했는데, 추후에 바꾸기 정말 어려우니 처음부터 넉넉하게 주는걸 추천한다. 위와 마찬가지로 10G 등으로 넣어주면 된다.
LV이름은 본인이 원하는 것으로 짓고, vg이름은 위에서 지어놓은걸 써주면 된다. 두개가 동일한 이름이어도 상관 없다.
이제 Proxmox Web-UI에 접속해서, 왼편에 Datacenter을 클릭하고 Storage로 간다.

스샷에서 보는 바와 같이 Add - LVM-Thin을 선택하고 방금 만든 lvm을 마운트시켜주면 된다. 그 후에 create VM이나 create CT를 하면 local-lvm을 쓸지 방금 만든 lvm을 쓸지 선택할 수 있다.
4. VM에서 하드 공간 마운트
이건 3번과 같이 lv 설정이 돼있어야 가능하다. VM을 만든 후 VM 메뉴에서 Hardware - Add - Hard Disk를 선택해준다. 다음 스샷과 같다.

여기서 원하는 lv를 선택하고, 디스크 사이즈를 선택해서 마운트하면 된다.

5. VM에 하드 패스스루
패스스루를 하고 VM을 실행시키면 호스트에선 하드를 아예 볼 수 없어지지만, VM의 전원을 끄면 다시 호스트에서 마운트 가능한 점 알아두시길 바란다.
apt update -y ; apt install lshw -y
로 lshw 패키지를 설치해준 후,
lshw -class disk -class storage
커맨드를 입력하면 현재 꽂혀있는 스토리지 정보가 죽 뜬다. 예시를 가지고 하자면,
*-scsi:0
physical id: 1
logical name: scsi1
capabilities: emulated
*-disk
description: ATA Disk
product: ST1000LM035-1RK1
vendor: Seagate
physical id: 0.0.0
bus info: scsi@1:0.0.0
logical name: /dev/sda
version: SBM3
serial: WDE0819J
size: 931GiB (1TB)
capabilities: partitioned partitioned:dos
configuration: ansiversion=5 logicalsectorsize=512 sectorsize=4096 signature=44e51f5d
이 하드를 패스스루 하고 싶다고 치자. 여기서 중요한건 serial: WDE0819J 이 부분이다. 원하는 하드의 시리얼 확인 후,
ls -l /dev/disk/by-id | grep (시리얼번호)
를 치면 뭔가 결과가 뜬다. 예를 들어 내 서버에서 ls -l /dev/disk/by-id | grep WDE0819J를 치면 결과는
lrwxrwxrwx 1 root root 9 Feb 28 10:46 ata-ST1000LM035-1RK172_WDE0819J -> ../../sda
이렇게 나오게 되는데 여기서 중요한건 ata-ST1000LM035-1RK172_WDE0819J 이 부분이다. 이건 사람마다 기기마다 다르니 꼭 본인걸로 하시길. 이제 준비는 다 끝났고, 원하는 VM의 전원을 꺼준 후
qm set (VM번호) -virtio2 /dev/disk/by-id/(방금 찾아낸 디스크 이름)
으로 패스스루 해주면 된다. 내 서버의 예를 계속 들고, VM의 번호가 200이라 가정하면,
qm set 200 -virtio2 /dev/disk/by-id/ata-ST1000LM035-1RK172_WDE0819J
이렇게 되는 셈이다. 중간에 -virtio2 부분은 -sata2 -scsi2 등 다른 프로토콜을 쓸 수 있다. 원하는 하드가 하나 이상일 경우 동일한 방법으로 -virtio3, -sata3 등으로 숫자만 올려가며 패스스루 해주면 된다.
6. VM에서 cifs/nfs 마운트
여타 VM과 다르지 않다. 컨테이너와 달리 VM은 fstab 수정만으로 마운트 시키면 된다.
한가지 궁금한 점이 있습니다. lxc 컨테이너를 사용해서 웹서버를 운영해도 충분한지요? 충분하다면 리눅스 VM을 설치할 필요는 없어보여서 말입니다 ㅎㅎ..
openvpn 서버나 클라이언트를 컨테이너에서 돌리고 싶을때 conf파일에 한줄 추가시켜줘야 하는 것 빼고는 전혀 컨테이너라서 생기는 문제는 전 없었습니다.
그럼 VM 말고 컨테이너로 진행해봐야겠습니다.
그리고 추후에 CPU 교체 및 RAM 증설 할 것 같은데, 이 경우에는 Proxmox 에서 자동으로 잡아주는지 궁금합니다 !
Nginx 리버스 프록시 컨테이너를 따로 두어서 다 연결하는데, 나머지 컨테이너들에도 모두 Nginx + PHP-FPM으로 각자 웹서버를 운영하는 상태여야되는건가요?
따로 하나하나씩 컨테이너를 만드셔서 각각 컨테이너에 Apache가 설정이 되어있는건가요?
조금 다른 예를 들어보고자 합니다. 워드프레스와 nextcloud를 깐다고 가정을 해보죠. 둘 다 아파치(nginx), php, mysql(mariadb)가 필요할겁니다. 도커에선 아마 아파치, 워드프레스, php, 넥스트클라우드, mysql 컨테이너를 따로 설치하시고 서로 적절히 연결하셔서 사용하시겠죠? (제가 도커에 대해 거의 무지해서 정확하지 않을수도 있겠습니다.) lxc도 당연히 그렇게 따로 컨테이너를 나누고 적절히 연결해서 사용 가능합니다.
헌데, 저는 워드프레스 컨테이너와 넥스트클라우드 컨테이너 두개로만 나누고 아파치, php, mysql을 중복해서 깔아서 씁니다. 각각 컨테이너가 독립적으로 움직이는 환경이죠. 기본적으로 하나의 컨테이너를 켜고 끔이 다른 서비스에 지장을 주지 않는 쪽을 선호합니다. 보통 어떻게 쓰시는진 제가 알 수 없지만요.
다시 리버스 프록시 얘기로 돌아가서, 위에 적은 바와 비슷한 취지로 저는 각각 컨테이너에 아파치나 nginx가 따로 돌아가게 설정하고 쓰는 중입니다. 물론 도커 방식으로 쓰셔도 전혀 상관없습니다.
제가 궁금한 부분을 정확히 집어주셨네요 ㅎㅎ !
지금 현재 진행하고 있는데, Route Table을 따로 만들어주어야하는지.. 192.168.0.100 -> 192.168.0.101 간의 Ping 조차 통하질 않네요
++ 자답입니다!
Proxmox의 /etc/network/interfaces 에
#subnet
up ip route add 192.168.0.100/32 dev vmbr0
up ip route add 192.168.0.101/32 dev vmbr0
와 같이 추가해주니 서로 통신이 됩니다 !
웹에서 윈도우 돌리면 어떤가요? 쾌적하게 잘 돌아가나요?