OpenVZ · 5 min read · Oct 11, 2025

OpenVZ: ホストデバイス/パーティション/ディレクトリをバインドマウントでコンテナにマウントする方法 (Debian/Ubuntu)

OpenVZ: ホストデバイス/パーティション/ディレクトリをバインドマウントでコンテナにマウントする方法 (Debian/Ubuntu)

バージョン 1.0
著者: Falko Timme
Twitterでフォローしてください

時々、OpenVZホストからOpenVZコンテナ内にハードドライブ、パーティション、またはディレクトリをマウントする必要がある状況に直面します。たとえば、ホストに高速SSDを追加し、MySQLデータベースをその上に置いてMySQLを高速化したい場合です。このチュートリアルでは、バインドマウントを使用してOpenVZコンテナ内にホストデバイス/パーティション/ディレクトリをマウントする方法を説明します。

これがあなたにとって機能するという保証はありません!

1 前提条件

このチュートリアルでは、コンテナID 101のOpenVZコンテナがMySQLを実行しています。ホストに2つ目のハードドライブを追加し、コンテナのMySQLディレクトリ/var/lib/mysqlを2つ目のハードドライブに置きたいと思います。

2 ホストの準備

ホスト:

新しいハードドライブをホストに追加した場合、次のコマンドの出力に表示されるはずです…

fdisk -l

…そして、フォーマットされていないことがわかるはずです(以前にパーティションを作成していない限り) - この例ではハードドライブは/dev/sdbです:

root@server1:~# fdisk -l  
   
 ディスク /dev/sda: 32.2 GB, 32212254720 バイト  
 255 ヘッド, 63 セクター/トラック, 3916 シリンダ  
 単位 = シリンダの 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 ヘッド, 63 セクター/トラック, 3916 シリンダ  
 単位 = シリンダの 16065 * 512 = 8225280 バイト  
 セクターサイズ (論理/物理): 512 バイト / 512 バイト  
 I/O サイズ (最小/最適): 512 バイト / 512 バイト  
 ディスク識別子: 0x00000000  
   
 ディスク /dev/sdb には有効なパーティションテーブルが含まれていません  
 root@server1:~#

それに1つのパーティションを作成しましょう:

fdisk /dev/sdb

root@server1:~# fdisk /dev/sdb
デバイスには有効なDOSパーティションテーブルも、Sun、SGI、またはOSFディスクラベルも含まれていません
ディスク識別子0x31e0dc4bで新しいDOSディスクラベルを構築しています。
変更は、書き込むことを決定するまでメモリ内にのみ残ります。
その後、もちろん、以前の内容は回復できなくなります。

警告: パーティションテーブル4の無効なフラグ0x0000はw(rite)によって修正されます

警告: DOS互換モードは非推奨です。
モードをオフに切り替えることを強くお勧めします(コマンド ‘c’)
表示単位をセクターに変更します(コマンド ‘u’)。

コマンド (ヘルプはm): <– n
コマンドアクション
e    拡張
p    プライマリパーティション (1-4)
<– p
パーティション番号 (1-4): <– 1
最初のシリンダ (1-3916、デフォルト1): <– ENTER
デフォルト値1を使用
最後のシリンダ、+シリンダまたは+サイズ{K,M,G} (1-3916、デフォルト3916): <– ENTER
デフォルト値3916を使用

コマンド (ヘルプはm): <– t
選択されたパーティション1
16進数コード (コードをリストするにはLを入力): <– L

0   空             24   NEC DOS       81   Minix / 古い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 隠しC:   c6   DRDOS/sec (FAT-
4   FAT16 <32M      41   PPC PReP ブート   85   Linux 拡張   c7   Syrinx
5   拡張           42   SFS           86   NTFS ボリュームセット da   非FSデータ
6   FAT16           4d   QNX4.x        87   NTFS ボリュームセット db   CP/M / CTOS / .
7   HPFS/NTFS       4e   QNX4.x 2nd part 88   Linux プレーンテキスト de   Dell ユーティリティ
8   AIX             4f   QNX4.x 3rd part 8e   Linux LVM         df   BootIt
9   AIX ブート可能   50   OnTrack DM      93   Amoeba           e1   DOS アクセス
a   OS/2 ブート マネージャ 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   隠しFAT12    5c   Priam Edisk    a8   Darwin UFS    f1   SpeedStor
12   Compaq 診断   61   SpeedStor      a9   NetBSD        f4   SpeedStor
14   隠しFAT16 <3 63   GNU HURD またはSys ab   Darwin ブート   f2   DOS セカンダリ
16   隠しFAT16    64   Novell Netware   af   HFS / HFS+    fb   VMware VMFS
17   隠しHPFS/NTF 65   Novell Netware   b7   BSDI fs         fc   VMware VMKCORE
18   AST SmartSleep  70   DiskSecure Mult b8   BSDI スワップ    fd   Linux raid auto
1b   隠しW95 FAT3 75   PC/IX           bb   Boot Wizard hid fe   LANstep
1c   隠しW95 FAT3 80   古いMinix       be   Solaris ブート    ff   BBT
1e   隠し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 ヘッド, 63 セクター/トラック, 3916 シリンダ  
 単位 = シリンダの 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 ヘッド, 63 セクター/トラック, 3916 シリンダ  
 単位 = シリンダの 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

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。