OpenVZ · 8 min read · Oct 11, 2025

OpenVZ: Монтирование устройств/разделов/каталогов хоста в контейнере с помощью привязки (Debian/Ubuntu)

OpenVZ: Монтирование устройств/разделов/каталогов хоста в контейнере с помощью привязки (Debian/Ubuntu)

Версия 1.0
Автор: Фалько Тимме
Следите за мной в Twitter

Иногда вы находитесь в ситуации, когда вам нужно смонтировать жесткий диск, раздел или каталог с хоста OpenVZ внутри контейнера OpenVZ - например, вы добавили быстрый SSD на хост и хотите разместить базы данных MySQL вашего контейнера на нем, чтобы ускорить MySQL. Этот учебник объясняет, как вы можете монтировать устройства/разделы/каталоги хоста в контейнере OpenVZ с помощью привязки.

Я не даю никаких гарантий, что это сработает для вас!

1 Предварительная заметка

В этом учебнике у меня есть контейнер OpenVZ с идентификатором контейнера 101, который работает с MySQL. Я добавляю второй жесткий диск на хост и хочу разместить каталог MySQL контейнера /var/lib/mysql на втором жестком диске.

2 Подготовка хоста

Хост:

Если вы добавили новый жесткий диск на хост, вы должны увидеть его в выводе…

fdisk -l

… и вы должны увидеть, что он не отформатирован (если вы не создали на нем разделы ранее) - в этом примере жесткий диск - /dev/sdb:

root@server1:~# fdisk -l  
   
 Диск /dev/sda: 32.2 GB, 32212254720 bytes  
 255 heads, 63 sectors/track, 3916 cylinders  
 Units = cylinders of 16065 * 512 = 8225280 bytes  
 Размер сектора (логический/физический): 512 bytes / 512 bytes  
 Размер I/O (минимальный/оптимальный): 512 bytes / 512 bytes  
 Идентификатор диска: 0x00029d5c  
   
    Устройство Загруз.  Начало  Конец  Блоки  Id  Система  
 /dev/sda1   *   1   3793   30461952   83  Linux  
 /dev/sda2   3793   3917   992257   5  Расширенный  
 /dev/sda5   3793   3917   992256   82  Linux swap / Solaris  
   
 Диск /dev/sdb: 32.2 GB, 32212254720 bytes  
 255 heads, 63 sectors/track, 3916 cylinders  
 Units = cylinders of 16065 * 512 = 8225280 bytes  
 Размер сектора (логический/физический): 512 bytes / 512 bytes  
 Размер I/O (минимальный/оптимальный): 512 bytes / 512 bytes  
 Идентификатор диска: 0x00000000  
   
 Диск /dev/sdb не содержит действительной таблицы разделов  
 root@server1:~#

Давайте создадим один единственный раздел на нем:

fdisk /dev/sdb

root@server1:~# fdisk /dev/sdb
Устройство не содержит действительной таблицы разделов DOS, ни Sun, SGI или OSF disklabel
Создание новой таблицы разделов DOS с идентификатором диска 0x31e0dc4b.
Изменения останутся в памяти только до тех пор, пока вы не решите их записать.
После этого, конечно, предыдущий контент не будет восстановим.

Предупреждение: недопустимый флаг 0x0000 таблицы разделов 4 будет исправлен командой w(rite)

ПРЕДУПРЕЖДЕНИЕ: режим совместимости с DOS устарел. Настоятельно рекомендуется
выключить режим (команда ‘c’) и изменить единицы отображения на
секторы (команда ‘u’).

Команда (m для помощи): <– n
Действие команды
e расширенный
p основной раздел (1-4)
<– p
Номер раздела (1-4): <– 1
Первый цилиндр (1-3916, по умолчанию 1): <– ENTER
Используя значение по умолчанию 1
Последний цилиндр, +cylinders или +size{K,M,G} (1-3916, по умолчанию 3916): <– ENTER
Используя значение по умолчанию 3916

Команда (m для помощи): <– t
Выбранный раздел 1
Шестнадцатеричный код (введите 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 Расширенный 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 или 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
Шестнадцатеричный код (введите L для списка кодов): <– 83

Команда (m для помощи): <– w
Таблица разделов была изменена!

Вызов ioctl() для повторного чтения таблицы разделов.
Синхронизация дисков.
root@server1:~#

После этого должен быть раздел /dev/sdb1:

fdisk -l
root@server1:~# fdisk -l  
   
 Диск /dev/sda: 32.2 GB, 32212254720 bytes  
 255 heads, 63 sectors/track, 3916 cylinders  
 Units = cylinders of 16065 * 512 = 8225280 bytes  
 Размер сектора (логический/физический): 512 bytes / 512 bytes  
 Размер I/O (минимальный/оптимальный): 512 bytes / 512 bytes  
 Идентификатор диска: 0x00029d5c  
   
    Устройство Загруз.  Начало  Конец  Блоки  Id  Система  
 /dev/sda1   *   1   3793   30461952   83  Linux  
 /dev/sda2   3793   3917   992257   5  Расширенный  
 /dev/sda5   3793   3917   992256   82  Linux swap / Solaris  
   
 Диск /dev/sdb: 32.2 GB, 32212254720 bytes  
 255 heads, 63 sectors/track, 3916 cylinders  
 Units = cylinders of 16065 * 512 = 8225280 bytes  
 Размер сектора (логический/физический): 512 bytes / 512 bytes  
 Размер I/O (минимальный/оптимальный): 512 bytes / 512 bytes  
 Идентификатор диска: 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 на правильный идентификатор контейнера!) следующим образом:

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

… и перезапустите контейнер (поэтому мы отключили системные ссылки запуска 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  
 total 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

Get new posts in your inbox

No spam. Unsubscribe anytime.