Différences entre les versions de « Creation de VM linux »
| Ligne 122 : | Ligne 122 : | ||
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 | 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 | ==== Méthode 1 ==== | ||
Cette méthode fonctionne normalement pour tous les cas. | Cette méthode fonctionne normalement pour tous les cas. | ||
<pre> | <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> | </pre> | ||
Version du 26 juin 2013 à 16:48
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
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
Cas 1 : fichier img
# 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é)
# 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
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)
# 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
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
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
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
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)
# 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
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
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
Fichier img
# umount /mnt/ # kpartx -d /dev/loop0 # losetup -d /dev/loop0
Block device ou LV
# umount /mnt/ # kpartx -d /dev/vol_kvm1/centos6test