Monter les disques de vos guests sur les serveurs de VM

Pouvoir manipuler le contenu de vos machines virtuelles ou de vos templates sans les démarrer est plutôt utile. Cela permet en particulier de corriger un problème lié au démarrage ou d’ajouter vos scripts ou un point de montage dans votre VM avant de la démarrer; comme si de rien n’était…

Dans cet article, je vous propose de trouver quelques commandes utiles pour créer un disque puis le manipuler depuis le VM Server.

Note:
pour manipuler les fichiers disques depuis le VM Server, votre VM doit être arrêtée. Ca parait évident mais ça va mieux en le disant.

Créer un disque

Comme vous le savez sans doute OCFS2 1.4 (inclus dans OracleVM Server 2.2) permet de créer des sparse files. Cela accélère la création du fichier d’une part et minimiser l’espace occupé par vos machines virtuelles. Nous allons commencé la série de manipulation par la création d’un sparse file avec la commande dd

dd if=/dev/zero of=/OVS/sharedDisk/Orcldb.img bs=1024k count=1 seek=1024
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.730697 seconds, 1.4 MB/s

Monter le fichier sur loopN pour émuler un device

Vous pouvez directement formater le fichier avec les commande mkfs puis les monter avec la commande mount. C’est sans doute la méthode la plus simple :

mkfs -t ext3 /OVS/sharedDisk/Orcldb.img
mke2fs 1.39 (29-May-2006)
/OVS/sharedDisk/Orcldb.img is not a block special device.
Proceed anyway? (y,n)
y
warning: 256 blocks unused.

Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
131328 inodes, 262144 blocks
13120 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
16416 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.


mkdir -p /disks/vm
mount -t ext3 -o loop /OVS/sharedDisk/Orcldb.img /disks/vm

df -h /disks/vm
Filesystem Size Used Avail Use% Mounted on
/var/ovs/mount/E82FDACC6E714F21BD62EF7EC8F85BA1/sharedDisk/Orcldb.img
1008M 34M 924M 4% /disks/vm

Mais disons qu’on préfèrerait se compliquer la tache et créer des partitions, des volumes physiques/logiques ou les deux. Commençons par effacer notre fichier:

cd /
umount /disks/vm
losetup -a
rm -f /OVS/sharedDisk/Orcldb.img

dd if=/dev/zero of=/OVS/sharedDisk/Orcldb.img bs=1024k count=1 seek=1024
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.001991 seconds, 527 MB/s

Au lieu de cela, nous allons simplement monter notre fichier sur une des interface loop :

losetup -a

losetup /dev/loop1 /OVS/sharedDisk/Orcldb.img

losetup -a

/dev/loop1: [0808]:524815 (/OVS/sharedDisk/Orcldb.img)

Partitioner votre nouveau disque

Vous pouvez partitionner votre disque avec votre outil de partitionnement préféré comme fdisk ou parted. Ci-dessous, je vous propose un exemple avec parted :

parted -s /dev/loop1 mklabel gpt

parted -s /dev/loop1 print

parted -s /dev/loop1 help mkpart

parted -s /dev/loop1 mkpart primary 1 100%

Error: Error informing the kernel about modifications to partition /dev/loop1p1 -- Invalid argument. This means Linux won't know about any changes you made to /dev/loop1p1 until you reboot -- so you shouldn't mount it or use it in any way before rebooting.
Warning: The kernel was unable to re-read the partition table on /dev/loop1 (Invalid argument). This means Linux won't know anything about the modifications you made until you reboot. You should reboot your computer before doing anything with /dev/loop1.


parted -s /dev/loop1 print

Model: ls -ltra /dev/mapperUnknown (unknown)
Disk /dev/loop1: 1075MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number Start End Size File system Name Flags
1 17.4kB 1075MB 1075MB primary

Vous aurez sans doute remarqué que les partitions ne sont pas remontées sur le système (i.e. le méchant message d’erreur ci-dessous); la commande kpartx vous permettra de publier les partitions dans /dev/mapper :

kpartx -a /dev/loop1

ls -ltra /dev/mapper
total 0
crw------- 1 root root 10, 62 Jan 5 00:29 control
brw-r----- 1 root disk 253, 0 Jan 5 00:38 loop1p1

Utiliser LVM

Cette section est de peu d’intérêt probablement mais vous pouvez configurer des volumes logiques sur votre disque partitionnné ou non. Je vous propose de créer une configuration très simple pour illustrer comment démonter et remonter toute votre pile:

pvcreate /dev/mapper/loop1p1
Physical volume "/dev/mapper/loop1p1" successfully created

vgcreate arkzoyd /dev/mapper/loop1p1

lvcreate --size 100m --name lv00 arkzoyd

lvdisplay
--- Logical volume ---
LV Name /dev/arkzoyd/lv00
VG Name arkzoyd
LV UUID VKAPlU-uqNf-sWER-IPUi-I5ET-f0Gb-YvAEIs
LV Write Access read/write
LV Status available
# open 0
LV Size 100.00 MB
Current LE 25
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1

Vous voilà prêt à créer votre système de fichier sur votre volume logique :

mkfs -t ext3 /dev/arkzoyd/lv00
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.


mkdir -p /disks/vm
mount -t ext3 /dev/arkzoyd/lv00 /disks/vm

df -h /disks/vm
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/arkzoyd-lv00
97M 5.6M 87M 7% /disks/vm

Tout descendre, du système de fichiers à l’interface loop

Voilà la partie intéressante, à savoir comment descendre toute la pile du système de fichiers à l’interface loop en passant par le volume logique, le volume groupe et les partitions. Bien sur vous adapterez ce script à vos besoins selon votre configuration :

# Démonter le système de fichier
umount /disks/vm

df -h /disks/vm
Filesystem Size Used Avail Use% Mounted on
/dev/sda4 48G 10G 35G 23% /


# Désactiver les volume logique du VG arkzoyd
vgchange -an arkzoyd
0 logical volume(s) in volume group "arkzoyd" now active

lvscan
inactive '/dev/ark zoyd/lv00' [100.00 MB] inherit

# Désactiver le groupe de volume arkzoyd:
vgexport arkzoyd
Volume group "arkzoyd" successfully exported

vgdisplay arkzoyd
Volume group arkzoyd is exported
--- Volume group ---
VG Name arkzoyd
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status exported/resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 1.00 GB
PE Size 4.00 MB
Total PE 256
Alloc PE / Size 25 / 100.00 MB
Free PE / Size 231 / 924.00 MB
VG UUID aotOfR-MnrM-pGq7-Mnng-fXpT-3zkm-aqYMgz


# Supprimer les partitions de /dev/mapper
kpartx -dls -l /dem/mapper /dev/loop1

ls -l /dev/mapper
crw------- 1 root root 10, 62 Jan 5 00:29 control

# Démonter l'interface loop1
losetup -d /dev/loop1
losetup -a

Tout remonter

Dans cet exemple, nous avons tout créé depuis OracleVM Server. Souvent, la situation dans laquelle on se trouve est celle d’un fichier existant à remonter pour accéder à son contenu depuis OracleVM Server. C’est cette dernière situation que je vous propose d’exployer :

# Monter le disque sur loop1
losetup /dev/loop1 /OVS/sharedDisk/Orcldb.img
losetup -a

# Vérifier s'il y a des partitions dans le disque
fdisk -l /dev/loop1

WARNING: GPT (GUID Partition Table) detected on '/dev/loop1'! The util fdisk doesn't support GPT. Use GNU Parted.


Disk /dev/loop1: 1074 MB, 1074790400 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/loop1p1 1 131 1049599+ ee EFI GPT
Partition 1 has different physical/logical beginnings (non-Linux?):
phys=(0, 0, 1) logical=(0, 0, 2)
Partition 1 has different physical/logical endings:
phys=(1023, 254, 63) logical=(130, 170, 40)


parted -s /dev/loop1 print

Model: Unknown (unknown)
Disk /dev/loop1: 1075MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number Start End Size File system Name Flags
1 17.4kB 1075MB 1075MB primary


# Monter les partitions dans /dev/mapper
kpartx -l /dev/loop1
loop1p1 : 0 2099133 /dev/loop1 34
kpartx -a /dev/loop1
ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 62 Jan 5 00:59 control
brw-r----- 1 root disk 253, 0 Jan 5 01:04 loop1p1


# Lister les VG et les importer
vgdisplay
Volume group arkzoyd is exported
--- Volume group ---
VG Name arkzoyd
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status exported/resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 1.00 GB
PE Size 4.00 MB
Total PE 256
Alloc PE / Size 25 / 100.00 MB
Free PE / Size 231 / 924.00 MB
VG UUID aotOfR-MnrM-pGq7-Mnng-fXpT-3zkm-aqYMgz


lvscan
Volume group arkzoyd is exported

vgimport arkzoyd
Volume group "arkzoyd" successfully imported

# Activer les volumes logiques
lvscan
inactive '/dev/arkzoyd/lv00' [100.00 MB] inherit

vgchange -ay arkzoyd
1 logical volume(s) in volume group "arkzoyd" now active

lvscan
ACTIVE '/dev/arkzoyd/lv00' [100.00 MB] inherit

lvdisplay arkzoyd/lv00
--- Logical volume ---
LV Name /dev/arkzoyd/lv00
VG Name arkzoyd
LV UUID HzxedG-LZBb-siwf-3o31-FY1N-khpR-NDpSaX
LV Write Access read/write
LV Status available
# open 0
LV Size 100.00 MB
Current LE 25
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1


# Monter le système de fichiers
fsck -V /dev/arkzoyd/lv00
fsck 1.39 (29-May-2006)
[/sbin/fsck.ext3 (1) -- /dev/arkzoyd/lv00] fsck.ext3 /dev/arkzoyd/lv00
e2fsck 1.39 (29-May-2006)
/dev/arkzoyd/lv00: clean, 11/25688 files, 8914/102400 blocks


mkdir -p /disks/vm
mount -t ext3 /dev/arkzoyd/lv00 /disks/vm

df -h /disks/vm
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/arkzoyd-lv00
97M 5.6M 87M 7% /disks/vm

Vous voilà prêt à modifier le contenu de vos templates et de vos VM sous Linux; vous pourrez également modifier les services, les fichiers de configuration ou les points de montage. Les applications sont intéressantes, y compris pour vos scripts de migrations automatiques. Mais c’est déjà une autre histoire…