OpenVZ 튜토리얼 · 7 min read · Oct 11, 2025

OpenVZ: 호스트 장치/파티션/디렉토리를 바인드 마운트를 사용하여 컨테이너에 마운트하기 (Debian/Ubuntu)

OpenVZ: 호스트 장치/파티션/디렉토리를 바인드 마운트를 사용하여 컨테이너에 마운트하기 (Debian/Ubuntu)

버전 1.0
저자: Falko Timme
Twitter에서 나를 팔로우하세요

때때로 OpenVZ 호스트의 하드 드라이브, 파티션 또는 디렉토리를 OpenVZ 컨테이너 내에 마운트해야 하는 상황이 발생합니다. 예를 들어, 호스트에 빠른 SSD를 추가하고 MySQL 데이터베이스를 그곳에 두어 MySQL을 더 빠르게 만들고 싶을 수 있습니다. 이 튜토리얼에서는 바인드 마운트를 사용하여 OpenVZ 컨테이너에 호스트 장치/파티션/디렉토리를 마운트하는 방법을 설명합니다.

이 방법이 여러분에게 작동할 것이라는 보장은 하지 않습니다!

1 사전 주의사항

이 튜토리얼에서는 MySQL을 실행 중인 컨테이너 ID 101을 가진 OpenVZ 컨테이너가 있습니다. 호스트에 두 번째 하드 드라이브를 추가하고 컨테이너의 MySQL 디렉토리 /var/lib/mysql을 두 번째 하드 드라이브에 두고 싶습니다.

2 호스트 준비하기

호스트:

호스트에 새 하드 드라이브를 추가한 경우, 다음의 출력에서 확인할 수 있어야 합니다…

fdisk -l

… 그리고 포맷되지 않은 상태여야 합니다(이전에 파티션을 생성하지 않았다면) - 이 예제에서 하드 드라이브는 /dev/sdb입니다:

root@server1:~# fdisk -l  
 
 디스크 /dev/sda: 32.2 GB, 32212254720 바이트  
 255 heads, 63 sectors/track, 3916 cylinders  
 Units = cylinders of 16065 * 512 = 8225280 바이트  
 섹터 크기 (논리/물리): 512 바이트 / 512 바이트  
 I/O 크기 (최소/최적): 512 바이트 / 512 바이트  
 디스크 식별자: 0x00029d5c  
 
    장치 부팅    시작        끝        블록    Id    시스템  
 /dev/sda1   *             1          3793    30461952    83    Linux  
 /dev/sda2              3793          3917        992257    5    Extended  
 /dev/sda5              3793          3917        992256    82    Linux swap / Solaris  
 
 디스크 /dev/sdb: 32.2 GB, 32212254720 바이트  
 255 heads, 63 sectors/track, 3916 cylinders  
 Units = cylinders of 16065 * 512 = 8225280 바이트  
 섹터 크기 (논리/물리): 512 바이트 / 512 바이트  
 I/O 크기 (최소/최적): 512 바이트 / 512 바이트  
 디스크 식별자: 0x00000000  
 
 디스크 /dev/sdb는 유효한 파티션 테이블을 포함하지 않습니다  
 root@server1:~#

하나의 파티션을 생성해 보겠습니다:

fdisk /dev/sdb

root@server1:~# fdisk /dev/sdb
장치에는 유효한 DOS 파티션 테이블이나 Sun, SGI 또는 OSF 디스크 레이블이 없습니다
디스크 식별자 0x31e0dc4b로 새로운 DOS 디스크 레이블을 생성합니다.
변경 사항은 작성하기로 결정할 때까지 메모리에만 남습니다.
그 후에는 이전 내용을 복구할 수 없습니다.

경고: 파티션 테이블 4의 잘못된 플래그 0x0000이 w(rite)에 의해 수정됩니다.

경고: DOS 호환 모드는 더 이상 사용되지 않습니다.
모드를 끄고(명령 ‘c’) 표시 단위를 섹터로 변경하는 것이 강력히 권장됩니다(명령 ‘u’).

명령 (도움말은 m): <– n
명령 작업
e    extended
p    primary partition (1-4)
<– p
파티션 번호 (1-4): <– 1
첫 번째 실린더 (1-3916, 기본값 1): <– ENTER
기본값 1 사용
마지막 실린더, +cylinders 또는 +size{K,M,G} (1-3916, 기본값 3916): <– ENTER
기본값 3916 사용

명령 (도움말은 m): <– t
선택된 파티션 1
16진수 코드 (코드를 나열하려면 L): <– L

0  빈        24  NEC DOS       81  Minix / old Lin bf  Solaris
1  FAT12        39  Plan 9        82  Linux swap / So c1  DRDOS/sec (FAT-
2  XENIX root    3c  PartitionMagic    83  Linux         c4  DRDOS/sec (FAT-
3  XENIX usr     40  Venix 80286    84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
4  FAT16 <32M    41  PPC PReP Boot    85  Linux extended  c7  Syrinx
5  Extended      42  SFS            86  NTFS volume set  da  Non-FS data
6  FAT16         4d  QNX4.x        87  NTFS volume set  db  CP/M / CTOS / .
7  HPFS/NTFS     4e  QNX4.x 2nd part  88  Linux plaintext  de  Dell Utility
8  AIX           4f  QNX4.x 3rd part  8e  Linux LVM        df  BootIt
9  AIX bootable   50  OnTrack DM       93  Amoeba           e1  DOS access
a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT    e3  DOS R/O
b  W95 FAT32     52  CP/M           9f  BSD/OS           e4  SpeedStor
c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi  eb  BeOS fs
e  W95 FAT16 (LBA) 54  OnTrackDM6        a5  FreeBSD        ee  GPT
f  W95 Ext’d (LBA) 55  EZ-Drive          a6  OpenBSD        ef  EFI (FAT-12/16/
10  OPUS          56  Golden Bow        a7  NeXTSTEP          f0  Linux/PA-RISC b
11  Hidden FAT12    5c  Priam Edisk       a8  Darwin UFS    f1  SpeedStor
12  Compaq diagnost 61  SpeedStor         a9  NetBSD           f4  SpeedStor
14  Hidden FAT16 <3 63  GNU HURD or Sys ab  Darwin boot    f2  DOS secondary
16  Hidden FAT16    64  Novell Netware  af  HFS / HFS+    fb  VMware VMFS
17  Hidden HPFS/NTF 65  Novell Netware  b7  BSDI fs        fc  VMware VMKCORE
18  AST SmartSleep  70  DiskSecure Mult  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 75  PC/IX           bb  Boot Wizard hid  fe  LANstep
1c  Hidden W95 FAT3 80  Old Minix         be  Solaris boot    ff  BBT
1e  Hidden W95 FAT1
16진수 코드 (코드를 나열하려면 L): <– 83

명령 (도움말은 m): <– w
파티션 테이블이 변경되었습니다!

ioctl()를 호출하여 파티션 테이블을 다시 읽습니다.
디스크를 동기화합니다.
root@server1:~#

그 후에는 /dev/sdb1 파티션이 있어야 합니다:

fdisk -l
root@server1:~# fdisk -l  
 
 디스크 /dev/sda: 32.2 GB, 32212254720 바이트  
 255 heads, 63 sectors/track, 3916 cylinders  
 Units = cylinders of 16065 * 512 = 8225280 바이트  
 섹터 크기 (논리/물리): 512 바이트 / 512 바이트  
 I/O 크기 (최소/최적): 512 바이트 / 512 바이트  
 디스크 식별자: 0x00029d5c  
 
    장치 부팅    시작        끝        블록    Id    시스템  
 /dev/sda1   *             1          3793    30461952    83    Linux  
 /dev/sda2              3793          3917        992257    5    Extended  
 /dev/sda5              3793          3917        992256    82    Linux swap / Solaris  
 
 디스크 /dev/sdb: 32.2 GB, 32212254720 바이트  
 255 heads, 63 sectors/track, 3916 cylinders  
 Units = cylinders of 16065 * 512 = 8225280 바이트  
 섹터 크기 (논리/물리): 512 바이트 / 512 바이트  
 I/O 크기 (최소/최적): 512 바이트 / 512 바이트  
 디스크 식별자: 0x31e0dc4b  
 
    장치 부팅    시작        끝        블록    Id    시스템  
 /dev/sdb1                 1          3916    31455238+  83    Linux  
 root@server1:~#

ext4로 포맷해 보겠습니다…

mkfs.ext4 /dev/sdb1

… 그리고 /mnt/sdb1에 마운트합니다:

mkdir /mnt/sdb1  
 mount /dev/sdb1 /mnt/sdb1

다음의 출력에서 /dev/sdb1을 확인할 수 있어야 합니다…

mount

… 지금:

root@server1:~# mount  
 /dev/sda1 on / type ext3 (rw,errors=remount-ro)  
 tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)  
 proc on /proc type proc (rw,noexec,nosuid,nodev)  
 sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)  
 udev on /dev type tmpfs (rw,mode=0755)  
 tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)  
 devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)  
 /dev/sdb1 on /mnt/sdb1 type ext4 (rw)  
 root@server1:~#

부팅 시 /dev/sdb1이 자동으로 마운트되도록 하려면 /etc/fstab에 추가합니다:

vi /etc/fstab

| [...] /dev/sdb1 /mnt/sdb1 ext4 errors=remount-ro 0 1 |

3 컨테이너 준비하기

컨테이너:

/var/lib/mysql을 새 파티션으로 이동하려면 먼저 MySQL을 중지하고, 컨테이너가 시작될 때 자동으로 시작되지 않도록 해야 하며, /var/lib/mysql의 백업과 새로 비어 있는 /var/lib/mysql 디렉토리를 생성해야 합니다:

/etc/init.d/mysql stop  
 update-rc.d -f mysql remove
mv /var/lib/mysql/ /var/lib/mysql_bak  
 mkdir /var/lib/mysql  
 chown mysql:mysql /var/lib/mysql  
 chmod 700 /var/lib/mysql

4 호스트에서 컨테이너를 위한 바인드 마운트 스크립트 생성하기

호스트:

호스트에서 이제 바인드 마운트 스크립트 /etc/vz/conf/101.mount를 생성합니다(101을 올바른 컨테이너 ID로 바꾸는 것을 잊지 마세요!):

vi /etc/vz/conf/101.mount

| #!/bin/bash . /etc/vz/vz.conf . ${VE_CONFFILE} SRC=/mnt/sdb1 DST=/var/lib/mysql if [ ! -e ${VE_ROOT}${DST} ]; then mkdir -p ${VE_ROOT}${DST}; fi mount -n -t simfs ${SRC} ${VE_ROOT}${DST} -o ${SRC} |

SRC 및 DST 변수를 필요에 맞게 조정해야 합니다. SRC는 컨테이너에 마운트하려는 디렉토리입니다(이 예제에서는 /mnt/sdb1) 그리고 DST는 컨테이너 내의 마운트 포인트입니다.

noatime과 같은 마운트 옵션을 추가하려면 마운트 줄에 -o 스위치를 추가할 수 있습니다. 예를 들어:

| #!/bin/bash . /etc/vz/vz.conf . ${VE_CONFFILE} SRC=/mnt/sdb1 DST=/var/lib/mysql if [ ! -e ${VE_ROOT}${DST} ]; then mkdir -p ${VE_ROOT}${DST}; fi mount -o noatime -n -t simfs ${SRC} ${VE_ROOT}${DST} -o ${SRC} |

스크립트를 실행 가능하게 만듭니다…

chmod +x /etc/vz/conf/101.mount

… 그리고 컨테이너를 재시작합니다(이것이 3장에서 컨테이너의 MySQL 시스템 시작 링크를 비활성화한 이유입니다 - /var/lib/mysql은 현재 비어 있어 MySQL 오류가 발생할 것입니다):

vzctl restart 101

5 컨테이너에서 바인드 마운트 사용하기

컨테이너:

컨테이너 재시작이 완료되면, 컨테이너에 로그인하여 새로운 마운트가 존재하는지 확인할 수 있습니다:

mount
root@test:~# mount  
 /dev/simfs on / type simfs (rw,relatime)  
 /dev/simfs on /var/lib/mysql type simfs (rw,relatime)  
 proc on /proc type proc (rw,relatime)  
 sysfs on /sys type sysfs (rw,relatime)  
 tmpfs on /lib/init/rw type tmpfs (rw,nosuid,relatime,mode=755)  
 tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,relatime)  
 devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620)  
 root@test:~#
df -h
root@test:~# df -h  
 파일 시스템         크기   사용   가용   사용%   마운트 위치  
 /dev/simfs          1.0G   381M   644M   38%   /  
 /dev/simfs           30G   172M   28G   1%   /var/lib/mysql  
 tmpfs               128M      0   128M   0%   /lib/init/rw  
 tmpfs               128M      0   128M   0%   /dev/shm  
 root@test:~#

/var/lib 디렉토리로 이동합니다:

cd /var/lib  
 ls -la
root@test:/var/lib# ls -la  
 총합 72  
 drwxr-xr-x 18 root    root    4096 Jul 17 10:25 .  
 drwxr-xr-x 13 root    root    4096 Feb 13  2011 ..  
 drwxr-xr-x  5 root    root    4096 Jul 17 10:16 apt  
 drwxr-xr-x  2 root    root    4096 Oct 16  2010 aptitude  
 drwxr-xr-x  2 root    root    4096 Feb 13  2011 dhcp  
 drwxr-xr-x  7 root    root    4096 Jul 17 10:16 dpkg  
 drwxr-xr-x  2 root    root    4096 Jan  1  2011 initscripts  
 drwxr-xr-x  2 root    root    4096 Jan  1  2011 insserv  
 drwxrwsr-x  2 libuuid libuuid 4096 Feb 13  2011 libuuid  
 drwxr-xr-x  2 root    root    4096 Apr 17  2010 logrotate  
 drwxr-xr-x  2 root    root    4096 Dec 14  2010 misc  
 drwxr-xr-x  4 root    root    4096 Jul 17 10:53 mysql  
 drwx------  3 mysql    mysql    4096 Jul 17 10:24 mysql_bak  
 drwxr-xr-x  2 root    root    4096 Feb 13  2011 pam  
 drwxr-xr-x  2 root    root    4096 Jul 17 10:23 quota  
 drwxr-xr-x  2 root    root    4096 Jul 17 10:52 update-rc.d  
 drwxr-xr-x  2 root    root    4096 Jul 17 10:53 urandom  
 drwxr-xr-x  3 root    root    4096 Feb 13  2011 vim  
 root@test:/var/lib#

보시다시피, 새로운 /var/lib/mysql 디렉토리는 잘못된 권한/소유권을 가지고 있습니다 - 이를 수정합시다(새로운 권한/소유권은 컨테이너 재시작 후에도 유지되어야 합니다):

chown mysql:mysql /var/lib/mysql  
 chmod 700 /var/lib/mysql

이제 백업에서 데이터베이스를 /var/lib/mysql로 다시 이동해 보겠습니다:

cp -pfr /var/lib/mysql_bak/* /var/lib/mysql

그런 다음 MySQL을 시작합니다:

/etc/init.d/mysql start

그게 다입니다! 마지막으로 해야 할 일은 MySQL의 시스템 시작 링크를 다시 생성하여 컨테이너가 시작될 때 자동으로 시작되도록 하는 것입니다:

update-rc.d mysql defaults

6 링크

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.