Différences entre les versions de « Creation de VM linux »

De BlaxWiki
Aller à la navigationAller à la recherche
 
(24 versions intermédiaires par 3 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
__TOC__
__TOC__
Cette page a pour but de décrire l'installation d'une vm linux via une image compressé. La plus part de ces principes peuvent aussi s'appliquer à l'installation via une ISO linux ou  
Cette page a pour but de décrire l'installation d'une vm linux via une image compressé. La plus part de ces principes peuvent aussi s'appliquer à l'installation via une ISO linux ou  
windows.
windows.
Ligne 12 : Ligne 11 :
=== Création du fichier et decompression de l'image ===
=== Création du fichier et decompression de l'image ===
==== Cas 1 : fichier img ====
==== Cas 1 : fichier img ====
''' ATTENTION ''' Lorsque l'on créé des fichiers img avec dd, il nous montre un fichier de la taille que l'on voulait, mais au niveau du disque la taille prise correspond à celle réellement prise par le fichier img. Lors de la création ce fichier fait que quelque ko. Lorsqu'on fait un df ou un du, on ne voit que la place réellement prise dans les fichiers img
et non pas la place totale correspondant à la taille de création des fichiers img. Il faut surtout faire attention si on veut rajouter des fichiers img sur une partition en se basant sur un df et en pensantqu'il reste beaucoup de place alors que non. Pour voir la vrai place que cela devra utiliser, il faut faire un "du -khs --apparent-size" pour le répertoire, ou "du -h --apparent-size * pour les fichiers
Si on veut créer un fichier qui prenne au niveau disque la vrai place, il faut utiliser la commande fallocate
Exemples :
<pre>
[root@]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2      9.4G  2.0G  7.0G  22% /
[root@]#  dd if=/dev/zero of=/root/testimg/test1.img bs=1G seek=4 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.00330037 s, 0.0 kB/s
[root@]# ls -lh
total 0
-rw-r--r-- 1 root root 4.0G Sep 16 16:07 test1.img
[root@]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2      9.4G  2.0G  7.0G  22% /
[root@]# du -khs
4.0K    .
[root@]du -khs --apparent-size
4.1G 
</pre>


<pre>
<pre>
# dd if=/dev/zero of=/data/www1.img bs=1 count=1 seek=10G (n'ecris sur le disque qu'un octet, est cree un fichier de 10Go, dd instantanné)
# dd if=/dev/zero of=/data/www1.img bs=1 count=1M seek=10G (n'ecris sur le disque qu'un octet, est cree un fichier de 10Go, dd instantanné)
# losetup /dev/loop0 /data/www1.img
# losetup /dev/loop0 /data/www1.img


Ligne 37 : Ligne 67 :


==== Cas 2 : Block device ou LV ====
==== Cas 2 : Block device ou LV ====
Travailler avec des fichier en block device (LV ou partion /dev/sdaX) permet de bien meilleur performance de la VM.
Travailler avec des fichier en block device (LV ou partion /dev/sdaX) permet de bien meilleur performance de la VM. Si c'est une copie de vm, on peut arreter la vm originale, et faire
une copie avec dd (dd if=/dev/vg1/lv1 of=/dev/vg2/lv2 bs=4096)
<pre>
<pre>
# lvcreate -L6G -n centos6test vol_kvm1 (lvcreate -LtailleG -n nom_du_lv nom_vg)
# lvcreate -L6G -n centos6test vol_kvm1 (lvcreate -LtailleG -n nom_du_lv nom_vg)
# fdisk /dev/vol_kvm1/centos6test
# cfdisk /dev/mapper/vol_kvm1-centos6test (creer une partition principale)
# fdisk  -l /dev/vol_kvm1/centos6test
# fdisk  -l /dev/mapper/vol_kvm1-centos6test
       Device Boot      Start        End      Blocks  Id  System
       Device Boot      Start        End      Blocks  Id  System
dev/vol_kvm1/centos6test1              1        652    5237158+  83  Linux
dev/vol_kvm1/centos6test1              1        652    5237158+  83  Linux
Ligne 53 : Ligne 84 :
=== Modification dans l'image ===
=== Modification dans l'image ===
On peut avoir ici soit du vdX (driver virtio sous kvm), soit du sdX (scsi classique), ou bien alors hdX (ide mais rare). Pour que l'image soit bootable, il y a 3 fichiers à modifier.  
On peut avoir ici soit du vdX (driver virtio sous kvm), soit du sdX (scsi classique), ou bien alors hdX (ide mais rare). Pour que l'image soit bootable, il y a 3 fichiers à modifier.  
On peut bien sur configurer tout de suite aussi la partie réseau (ne pas oublier de vider le fichier /etc/udev/rules.d/70-persistent-net.rules)
On peut bien sur configurer tout de suite aussi la partie réseau (ne pas oublier de vider le fichier /etc/udev/rules.d/70-persistent-net.rules,  mais le fichier doit exister)


* /mnt/etc/fstab
* /mnt/etc/fstab
<pre>
<pre>
On peut ici faire un blkid pour mettre l'uuid du disque plutot que le /dev/xxx
/dev/vda1      /      ext3    defaults        1      1
/dev/vda1      /      ext3    defaults        1      1
# ou UUID=2038e3e9-7a49-4db2-9ca5-0b130ebbaacb /      ext3    defaults        1      1
# et eventuellement si /boot
# et eventuellement si /boot
# /dev/vda2      /      ext3    defaults        1      1
# /dev/vda2      /      ext3    defaults        1      1
Ligne 88 : Ligne 121 :


Supprimer le fichier /mnt/etc/udev/rules.d/70-persistent-net.rules
Supprimer le fichier /mnt/etc/udev/rules.d/70-persistent-net.rules
* Initrd.img
Sur certain vieux kernel et / ou des vm utilisant des initrd, il se peut qu'il fasse refaire l'initrd.img afin de charger les bons modules, à rajouter dans le fichier init de l'initrd.img décompressé
<pre>
A mettre à la fin du chargement des modules (et copier aussi les fichiers ko correspondant au kernel dans le /lib de l'initrd.img décompressé
insmod /lib/virtio.ko
insmod /lib/virtio_ring.ko
insmod /lib/virtio_net.ko
insmod /lib/virtio_balloon.ko
insmod /lib/virtio_pci.ko
insmod /lib/virtio_blk.ko
echo Waiting for driver initialization.
stabilized --hash --interval 1000 /proc/scsi/scsi
mkblkdevs
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro /dev/vda1
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
echo Switching to new root and running init.
switchroot
</pre>


=== Installation de grub ===
=== Installation de grub ===
Ligne 94 : Ligne 153 :


==== Méthode 1 ====
==== Méthode 1 ====
Cette méthode fonctionne normalement pour tous les cas.
<pre>
kpartx -a /dev/vol_kvm/web2.lc.middle.agarik.eu
rm –f /dev/vda && mknod /dev/vda b `ls -laH /dev/mapper/vol_kvm-web2.lc.middle.agarik.eu | awk '{print $5" "$6}' | sed -e "s/,//g`
rm –f /dev/vda1 && mknod /dev/vda1 b `ls -laH /dev/mapper/vol_kvm-web2.lc.middle.agarik.eu3 | awk '{print $5" "$6}' | sed -e "s/,//g`
mount /dev/mapper/vol_kvm-web2.lc.middle.agarik.eu3 /mnt/web2/
mount /dev/mapper/vol_kvm-web2.lc.middle.agarik.eu1 /mnt/web2/boot
mount -o bind /dev /mnt/web2/dev
mount -o bind /proc /mnt/web2/proc
mount -o bind /sys /mnt/web2/sys
chroot /mnt/web2
grep –v mapper /proc/mounts > /etc/mtab
sed –i –e “s/sda/vda/g” /etc/mtab
sed –i –e “s/ext3/ext4/g” /etc/mtab
echo “(hd0)  /dev/vda” > /boot/grub/device.map
grub-install /dev/vda
exit
umount /mnt/web2/dev /mnt /web2/proc /mnt/web2/sys /mnt/web2/boot /mnt/web2
kpartx -d /dev/vol_kvm/web2.lc.middle.agarik.eu
</pre>
==== NEW test ====
==== Méthode 1 ====
Cette méthode fonctionne normalement pour tous les cas.
==== Cas n°1 ====
Ici on est dans la cas où la vm n'a qu'une seule partition (pour le / et le /boot)
<pre>
# kpartx -a /dev/vgtest/lvtest1
# ls -laH  /dev/mapper/vgtest-lvtest*
brw-rw---- 1 root root 253, 0 Jun 26 19:03 /dev/mapper/vgtest-lvtest1
brw-rw---- 1 root disk 253, 1 Jun 28 14:35 /dev/mapper/vgtest-lvtest1p1
# Pour /dev/vda
# ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}'
253, 0
# ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}' | sed -e "s/,//g"
253 0
# rm –f /dev/vda && mknod /dev/vda b `ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}' | sed -e "s/,//g"`
# ll /dev/vda
brw-r--r-- 1 root root 253, 0 Jun 28 14:37 /dev/vda
# Pour /dev/vda1
# ls -laH  /dev/mapper/vgtest-lvtest1p1 | awk '{print $5" "$6}'
253, 1
# ls -laH  /dev/mapper/vgtest-lvtest1p1 | awk '{print $5" "$6}' | sed -e "s/,//g"
253, 1
# rm –f /dev/vda1 && mknod /dev/vda1 b `ls -laH /dev/mapper/vgtest-lvtest1p1 | awk '{print $5" "$6}' | sed -e "s/,//g"`
# ll /dev/vda1
brw-r--r-- 1 root root 253, 1 Jun 28 14:48 /dev/vda1
# mount /dev/mapper/vgtest-lvtest1p1 /mnt
# mount -o bind /dev /mnt/dev
# mount -o bind /proc /mnt/proc
# mount -o bind /sys /mnt/sys
# chroot /mnt
# grep –v mapper /proc/mounts > /etc/mtab
# sed –i –e “s/sda/vda/g” /etc/mtab
# Si bien sur on fait du ext4
# sed –i –e “s/ext3/ext4/g” /etc/mtab
# echo “(hd0)  /dev/vda” > /boot/grub/device.map
# grub-install /dev/vda
/dev/sda1 does not have any corresponding BIOS drive.
# exit (pour sortir du chroo)
# umount /mnt/dev
# umount /mnt/proc
# umount /mnt/sys
# umount /mnt
# kpartx -d /dev/vgtest/lvtest1
</pre>
#
==== Cas n°2 ====
Ici on est dans le cas avec 2 partitions dans la vm : /dev/vda3 qui est le /, et /dev/vda1 qui est le /boot
<pre>
kpartx -a /dev/vgtest/lvtest1
# ls -laH  /dev/mapper/vgtest-lvtest*
brw-rw---- 1 root root 253, 0 Jun 26 19:03 /dev/mapper/vgtest-lvtest1
# ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}'
253, 0
# ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}' | sed -e "s/,//g"
253 0
# rm –f /dev/vda && mknod /dev/vda b `ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}' | sed -e "s/,//g"`
# ll /dev/vd*
brw-r--r-- 1 root root 253, 0 Jun 28 14:37 /dev/vda
# Ici vda1
# rm –f /dev/vda1 && mknod /dev/vda1 b `ls -laH /dev/mapper/vol_kvm-web2.lc.middle.agarik.eu3 | awk '{print $5" "$6}' | sed -e "s/,//g`
==== Méthode 2 ====
===== Fichier Img ou LV =====
===== Fichier Img ou LV =====
Cette méthode est valable uniquement pour un fichier img ou LV. Il n'est pas nécessaire de faire un kpartx sur le fichier img ou LV, ni meme de faire un mount.
Cette méthode est valable uniquement pour un fichier img ou LV. Il n'est pas nécessaire de faire un kpartx sur le fichier img, ni meme de faire un mount (à vérifier)
<pre>
<pre>
# grub --device-map=/dev/null
# grub --device-map=/dev/null
# Dans le cas d'un LV, il faut avant faire un kpartx -a /dev/volnode01/lvtest, et faire un device (hd0) /dev/mapper/volnode01-lvtest (ne pas le faire sur les sous-partitions)
# Dans le cas d'un LV, il faut avant faire un kpartx -a /dev/volnode01/lvtest (ne pas faire de mount), et faire un device (hd0) /dev/mapper/volnode01-lvtest
(ne pas le faire sur les sous-partitions)


grub> device (hd0) /data/images/test.img
grub> device (hd0) /data/images/test.img
device (hd0) /data/images/test.img
device (hd0) /data/images/test.img
# Dans le cas d'un LV, il faut avant faire un kpartx -a /dev/volnode01/lvtest (ne pas faire de mount), et faire un device (hd0) /dev/mapper/volnode01-lvtest
(ne pas le faire sur les sous-partitions)


grub> root (hd0,0)
grub> root (hd0,0)
Ligne 126 : Ligne 326 :
</pre>
</pre>


==== Méthode 2 ====
==== Méthode 3 ====
On va faire booter ici la vm sur un iso de cd rescue (ex systemrescue http://www.sysresccd.org). Modifier en conséquence la config xml de la vm. Il faut bien sur procéder à la "fermeture" de la vm avant (umount, kpartx -d, losetep -d...). Cette méthode est valable quelque soit la facon dont est créé l'image de la vm linux (fichier img, block device sur un /dev/sdX, hdX ou LV)
On va faire booter ici la vm sur un iso de cd rescue (ex systemrescue http://www.sysresccd.org). Modifier en conséquence la config xml de la vm. Il faut bien sur procéder à la "fermeture" de la vm avant (umount, kpartx -d, losetep -d...). Cette méthode est valable quelque soit la facon dont est créé l'image de la vm linux (fichier img, block device sur un /dev/sdX, hdX ou LV)


Ligne 150 : Ligne 350 :
# kpartx -d /dev/vol_kvm1/centos6test
# kpartx -d /dev/vol_kvm1/centos6test
</pre>
</pre>


[[Catégorie:Virtualisation]]
[[Catégorie:Virtualisation]]

Version actuelle datée du 29 décembre 2016 à 14:08

Cette page a pour but de décrire l'installation d'une vm linux via une image compressé. La plus part de ces principes peuvent aussi s'appliquer à l'installation via une ISO linux ou windows. On part ici dans l'hypothèse que l'on a déja une fichier image tar.gz de son OS linux. Pour la création d'une image linux voir cette, il suffit d'installer un linux sur un serveur, rebooter le serveur en pxe, monter les disques, puis faire un tar.gz. La création de la vm se fait sous kvm, mais le principe est le même sur un hyperV.

Généralités[modifier]

On va installer les vm en mode block device, c'est à dire directement sur une partition de l'hyperviseur et non pas utiliser un fichier img. Cela nous permet de gagner en performance et nous allons aussi utiliser les driver virtio à la place de l'émulation IDE. Les drivers / modules virtio sont fournis par défaut dans les kernel linux récents. Nous allons devoir utiliser un livecd (ici systemrescue) pour booter la vm dessus et mettre en place le grub. Les drivers réseaux utilisent aussi virtio

Création du fichier et decompression de l'image[modifier]

Cas 1 : fichier img[modifier]

ATTENTION Lorsque l'on créé des fichiers img avec dd, il nous montre un fichier de la taille que l'on voulait, mais au niveau du disque la taille prise correspond à celle réellement prise par le fichier img. Lors de la création ce fichier fait que quelque ko. Lorsqu'on fait un df ou un du, on ne voit que la place réellement prise dans les fichiers img et non pas la place totale correspondant à la taille de création des fichiers img. Il faut surtout faire attention si on veut rajouter des fichiers img sur une partition en se basant sur un df et en pensantqu'il reste beaucoup de place alors que non. Pour voir la vrai place que cela devra utiliser, il faut faire un "du -khs --apparent-size" pour le répertoire, ou "du -h --apparent-size * pour les fichiers

Si on veut créer un fichier qui prenne au niveau disque la vrai place, il faut utiliser la commande fallocate

Exemples :

[root@]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       9.4G  2.0G  7.0G  22% /

[root@]#  dd if=/dev/zero of=/root/testimg/test1.img bs=1G seek=4 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.00330037 s, 0.0 kB/s

[root@]# ls -lh
total 0
-rw-r--r-- 1 root root 4.0G Sep 16 16:07 test1.img

[root@]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       9.4G  2.0G  7.0G  22% /

[root@]# du -khs
4.0K    .

[root@]du -khs --apparent-size
4.1G   
# dd if=/dev/zero of=/data/www1.img bs=1 count=1M seek=10G (n'ecris sur le disque qu'un octet, est cree un fichier de 10Go, dd instantanné)
# losetup /dev/loop0 /data/www1.img

Note : on peut faire directement un kpartx -a sur le fichier .img, cela créé implicitement un losetup (faire un kpartx -l fichier.img pour voir ce qui est mis dans /dev/mapper). 

# fdisk /dev/loop0
On peut soit faire une seule partition /, soit un / et un /boot. Les différences seront marquées plus bas suivant les 2 cas. On créé ici juste un /

# fdisk -l /dev/loop0
      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1         652     5237158+  83  Linux


# kpartx -a /dev/loop0 (cela nous permet d'avoir acces au sous partition de loop0 : loop0p1, loop0p2...
# mkfs.ext3 /dev/mapper/loop0p1
# mount /dev/mapper/loop0p1 /mnt
(si il y a un /boot monter apres l'autre partition correspondant au /boot)
# cd /mnt
# tar xzvf /nom_image.tar.gz

Cas 2 : Block device ou LV[modifier]

Travailler avec des fichier en block device (LV ou partion /dev/sdaX) permet de bien meilleur performance de la VM. Si c'est une copie de vm, on peut arreter la vm originale, et faire une copie avec dd (dd if=/dev/vg1/lv1 of=/dev/vg2/lv2 bs=4096)

# lvcreate -L6G -n centos6test vol_kvm1 (lvcreate -LtailleG -n nom_du_lv nom_vg)
# cfdisk  /dev/mapper/vol_kvm1-centos6test (creer une partition principale)
# fdisk  -l /dev/mapper/vol_kvm1-centos6test
      Device Boot      Start         End      Blocks   Id  System
dev/vol_kvm1/centos6test1               1         652     5237158+  83  Linux

# kpartx -a /dev/vol_kvm1/centos6test
# mkfs.ext3 /dev/mapper/vol_kvm1-centos6test1
# mount /dev/mapper/vol_kvm1-centos6test1 /mnt/
(si il y a un /boot monter apres l'autre partition correspondant au /boot)

Modification dans l'image[modifier]

On peut avoir ici soit du vdX (driver virtio sous kvm), soit du sdX (scsi classique), ou bien alors hdX (ide mais rare). Pour que l'image soit bootable, il y a 3 fichiers à modifier. On peut bien sur configurer tout de suite aussi la partie réseau (ne pas oublier de vider le fichier /etc/udev/rules.d/70-persistent-net.rules, mais le fichier doit exister)

  • /mnt/etc/fstab
On peut ici faire un blkid pour mettre l'uuid du disque plutot que le /dev/xxx
/dev/vda1       /       ext3    defaults        1       1
# ou UUID=2038e3e9-7a49-4db2-9ca5-0b130ebbaacb /       ext3    defaults        1       1
# et eventuellement si /boot
# /dev/vda2       /       ext3    defaults        1       1
# et si on a une partition pour le swap
#/dev/vdb1       swap    swap    defaults        0       0
# ou /dev/vdb pour le swap ca revient au même
none                    /dev/pts                devpts  gid=5,mode=620  0 0
none                    /proc                   proc    defaults        0 0
none                    /dev/shm                tmpfs   defaults        0 0
  • /mnt/boot/grub/menu.lst

Ici on rajoute /boot devant le nom du kernel et de l'initramfs car on n'a pas de partition /boot. Si on a une partition /boot, ce n'est pas la peine

efault=0
timeout=5
hiddenmenu
title CentOS (2.6.32-279.5.2.el6.x86_64)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.32-279.5.2.el6.x86_64 ro root=/dev/vda1
        initrd /boot/initramfs-2.6.32-279.5.2.el6.x86_64.img
  • /mnt/boot/grub/device.map

La ligne à modifier est celle de hd0

(fd0)   /dev/fd0
(hd0)   /dev/vda

Supprimer le fichier /mnt/etc/udev/rules.d/70-persistent-net.rules

  • Initrd.img

Sur certain vieux kernel et / ou des vm utilisant des initrd, il se peut qu'il fasse refaire l'initrd.img afin de charger les bons modules, à rajouter dans le fichier init de l'initrd.img décompressé

A mettre à la fin du chargement des modules (et copier aussi les fichiers ko correspondant au kernel dans le /lib de l'initrd.img décompressé

insmod /lib/virtio.ko
insmod /lib/virtio_ring.ko
insmod /lib/virtio_net.ko
insmod /lib/virtio_balloon.ko
insmod /lib/virtio_pci.ko
insmod /lib/virtio_blk.ko

echo Waiting for driver initialization.
stabilized --hash --interval 1000 /proc/scsi/scsi
mkblkdevs
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro /dev/vda1
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
echo Switching to new root and running init.
switchroot


Installation de grub[modifier]

Si on a une erreur lors du grub disant "/dev/xxx does not have a any corresponding BIOS drive", vérifier que le fichier /mnt/boot/grub/device.map contient bien (hd0) /dev/xxx

Méthode 1[modifier]

Cette méthode fonctionne normalement pour tous les cas.

kpartx -a /dev/vol_kvm/web2.lc.middle.agarik.eu

rm –f /dev/vda && mknod /dev/vda b `ls -laH /dev/mapper/vol_kvm-web2.lc.middle.agarik.eu | awk '{print $5" "$6}' | sed -e "s/,//g`

rm –f /dev/vda1 && mknod /dev/vda1 b `ls -laH /dev/mapper/vol_kvm-web2.lc.middle.agarik.eu3 | awk '{print $5" "$6}' | sed -e "s/,//g`

mount /dev/mapper/vol_kvm-web2.lc.middle.agarik.eu3 /mnt/web2/

mount /dev/mapper/vol_kvm-web2.lc.middle.agarik.eu1 /mnt/web2/boot

mount -o bind /dev /mnt/web2/dev

mount -o bind /proc /mnt/web2/proc

mount -o bind /sys /mnt/web2/sys

chroot /mnt/web2

grep –v mapper /proc/mounts > /etc/mtab

sed –i –e “s/sda/vda/g” /etc/mtab

sed –i –e “s/ext3/ext4/g” /etc/mtab

echo “(hd0)   /dev/vda” > /boot/grub/device.map

grub-install /dev/vda

exit

umount /mnt/web2/dev /mnt /web2/proc /mnt/web2/sys /mnt/web2/boot /mnt/web2

kpartx -d /dev/vol_kvm/web2.lc.middle.agarik.eu

NEW test[modifier]

Méthode 1[modifier]

Cette méthode fonctionne normalement pour tous les cas.

Cas n°1[modifier]

Ici on est dans la cas où la vm n'a qu'une seule partition (pour le / et le /boot)

# kpartx -a /dev/vgtest/lvtest1

# ls -laH  /dev/mapper/vgtest-lvtest*
brw-rw---- 1 root root 253, 0 Jun 26 19:03 /dev/mapper/vgtest-lvtest1
brw-rw---- 1 root disk 253, 1 Jun 28 14:35 /dev/mapper/vgtest-lvtest1p1

# Pour /dev/vda
# ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}'
253, 0

# ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}' | sed -e "s/,//g"
253 0

# rm –f /dev/vda && mknod /dev/vda b `ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}' | sed -e "s/,//g"`

# ll /dev/vda
brw-r--r-- 1 root root 253, 0 Jun 28 14:37 /dev/vda

# Pour /dev/vda1
# ls -laH  /dev/mapper/vgtest-lvtest1p1 | awk '{print $5" "$6}'
253, 1

# ls -laH  /dev/mapper/vgtest-lvtest1p1 | awk '{print $5" "$6}' | sed -e "s/,//g"
253, 1

# rm –f /dev/vda1 && mknod /dev/vda1 b `ls -laH /dev/mapper/vgtest-lvtest1p1 | awk '{print $5" "$6}' | sed -e "s/,//g"`

# ll /dev/vda1
brw-r--r-- 1 root root 253, 1 Jun 28 14:48 /dev/vda1

# mount /dev/mapper/vgtest-lvtest1p1 /mnt

# mount -o bind /dev /mnt/dev

# mount -o bind /proc /mnt/proc

# mount -o bind /sys /mnt/sys

# chroot /mnt

# grep –v mapper /proc/mounts > /etc/mtab

# sed –i –e “s/sda/vda/g” /etc/mtab

# Si bien sur on fait du ext4
# sed –i –e “s/ext3/ext4/g” /etc/mtab

# echo “(hd0)   /dev/vda” > /boot/grub/device.map

# grub-install /dev/vda
/dev/sda1 does not have any corresponding BIOS drive.

# exit (pour sortir du chroo)

# umount /mnt/dev 

# umount /mnt/proc

# umount /mnt/sys

# umount /mnt

# kpartx -d /dev/vgtest/lvtest1



Cas n°2[modifier]

Ici on est dans le cas avec 2 partitions dans la vm : /dev/vda3 qui est le /, et /dev/vda1 qui est le /boot

kpartx -a /dev/vgtest/lvtest1

# ls -laH  /dev/mapper/vgtest-lvtest*
brw-rw---- 1 root root 253, 0 Jun 26 19:03 /dev/mapper/vgtest-lvtest1

# ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}'
253, 0

# ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}' | sed -e "s/,//g"
253 0

# rm –f /dev/vda && mknod /dev/vda b `ls -laH  /dev/mapper/vgtest-lvtest1 | awk '{print $5" "$6}' | sed -e "s/,//g"`

# ll /dev/vd*
brw-r--r-- 1 root root 253, 0 Jun 28 14:37 /dev/vda

# Ici vda1 
# rm –f /dev/vda1 && mknod /dev/vda1 b `ls -laH /dev/mapper/vol_kvm-web2.lc.middle.agarik.eu3 | awk '{print $5" "$6}' | sed -e "s/,//g`

==== Méthode 2 ====
===== Fichier Img ou LV =====
Cette méthode est valable uniquement pour un fichier img ou LV. Il n'est pas nécessaire de faire un kpartx sur le fichier img, ni meme de faire un mount (à vérifier)
<pre>
# grub --device-map=/dev/null
# Dans le cas d'un LV, il faut avant faire un kpartx -a /dev/volnode01/lvtest (ne pas faire de mount), et faire un device (hd0) /dev/mapper/volnode01-lvtest
(ne pas le faire sur les sous-partitions)

grub> device (hd0) /data/images/test.img
device (hd0) /data/images/test.img

# Dans le cas d'un LV, il faut avant faire un kpartx -a /dev/volnode01/lvtest (ne pas faire de mount), et faire un device (hd0) /dev/mapper/volnode01-lvtest
(ne pas le faire sur les sous-partitions)

grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83

grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  26 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+26 p (hd0,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
Done.

grub> quit
Block device sda ou hda[modifier]

Cela fonctionne uniquement si dans le /dev de l'hyperviseur il existe deja un /dev/sdX ou /dev/hdX comme sur la vm lorsqu'elle aura booté. Monter la vm de facon classique dans /mnt

grub-install  --root-directory=/mnt /dev/sda (ou hda)

Méthode 3[modifier]

On va faire booter ici la vm sur un iso de cd rescue (ex systemrescue http://www.sysresccd.org). Modifier en conséquence la config xml de la vm. Il faut bien sur procéder à la "fermeture" de la vm avant (umount, kpartx -d, losetep -d...). Cette méthode est valable quelque soit la facon dont est créé l'image de la vm linux (fichier img, block device sur un /dev/sdX, hdX ou LV)

Une fois la vm booté sur le system rescue :

# mount /dev/vda1 /mnt # Ou montage du fichier img
(et éventuellement vda2 ou vda3 pour le /boot)
# grub-install --root-directory=/mnt /dev/vda # Ou /dev/sdX
Rebooter ensuite la vm normalement sur ses disques durs

Fermeture de l'image[modifier]

Fichier img[modifier]

# umount /mnt/
# kpartx -d /dev/loop0
# losetup -d /dev/loop0

Block device ou LV[modifier]

# umount /mnt/
# kpartx -d /dev/vol_kvm1/centos6test