===== Preparare immagine cloud di CentOS 5.9 (x86_64) e ScientificLinux 5.9 (x86_64) =====
* Alvise Dorigo (INFN Padova), Marco Caberletti (INFN-CNAF), Paolo Veronesi (INFN-CNAF)
* Adattato da: [[http://wiki.infn.it/cn/ccr/cloud/preparazione_immagini_per_centos_6.4_e_sl6.4_con_cloud-init|Preparazione immagini per CentOS 6.4 e SL 6.4 con cloud-init]]
==== S.O. ====
Eseguendo le seguenti istruzioni da un server x86_64, si installa un server x86_64 (anche se si specifica nella variabile release l'rpm i386).
=== CentOS 5.9 x86_64 ===
export SO=CentOS5.9
export releaserpm=centos-release-5-9.el5.centos.1.x86_64.rpm
export releaseurl=http://mirror3.mirror.garr.it/mirrors/CentOS/5.9/os/x86_64/CentOS/$releaserpm
export gpgkey=http://mirror3.mirror.garr.it/mirrors/CentOS/5.9/os/x86_64/RPM-GPG-KEY-CentOS-5
=== ScientificLinux 5.9 x86_64 ===
export SO=SL5.9
export releaserpm=sl-release-5.9-2.sl.x86_64.rpm
export releaseurl=http://mirror3.mirror.garr.it/mirrors/scientific/59/x86_64/SL/$releaserpm
export gpgkey=http://www.scientificlinux.org/documentation/gpg/RPM-GPG-KEY-sl5
=== Per entrambi i S.O. ===
export epelrpm=epel-release-5-4.noarch.rpm
export epelurl=http://dl.fedoraproject.org/pub/epel/5/x86_64/$epelrpm
export epelgpgurl=http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-5
==== Creare un file immagine =====
export IMAGELIBDIR=/var/lib/images
mkdir -p $IMAGELIBDIR
export IMAGEFILE=$IMAGELIBDIR/cloud-image.img
dd if=/dev/zero of=$IMAGEFILE bs=2048 count=1048576
mkfs.ext3 -F $IMAGEFILE
Inizializzare il db degli rpm
export CLOUD_MOUNTPOINT=/chroot
mkdir -p $CLOUD_MOUNTPOINT
mount -o loop $IMAGEFILE $CLOUD_MOUNTPOINT
mkdir -p $CLOUD_MOUNTPOINT/var/lib/rpm
rpm --rebuilddb --root=$CLOUD_MOUNTPOINT
wget $releaseurl
rpm -i --root=$CLOUD_MOUNTPOINT --nodeps $releaserpm
rm -f $releaserpm
==Installare il SO==
rpm --root=$CLOUD_MOUNTPOINT --import $gpgkey
yum --installroot=$CLOUD_MOUNTPOINT install -y rpm-build yum initscripts kernel passwd dhclient openssh-clients openssh-server vim parted e2fsprogs sudo vim-enhanced hwdata
==Installare il repo EPEL===
rpm --import --root=$CLOUD_MOUNTPOINT $epelgpgurl
wget $epelurl
rpm -i --root=$CLOUD_MOUNTPOINT --nodeps $epelrpm
rm -f $epelrpm
== Installare il tool cloud-init ==
yum --installroot=$CLOUD_MOUNTPOINT install -y cloud-init
Allo stesso modo si possono installare altri RPMs che si desidera siano presenti nell’immagine.
==Configurare il SO==
cat <$CLOUD_MOUNTPOINT/etc/fstab
/dev/vda1 / ext4 defaults,noatime 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
EOF
cat <$CLOUD_MOUNTPOINT/etc/sysconfig/network
NETWORKING=yes
NOZEROCONF=yes
EOF
cat <$CLOUD_MOUNTPOINT/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
ONBOOT="yes"
TYPE="Ethernet"
EOF
Allo stesso modo si possono gestire tutti i file di configurazione che si desidera.
==Preparare l’immagine per l’upload==
Settare passwd di root, aggiungere utente ec2-user, modificare sudoers
chroot $CLOUD_MOUNTPOINT
export PATH=/sbin:/bin:/usr/bin:/usr/sbin
passwd -d root
echo > rootpwd
passwd --stdin root < rootpwd
rm -f rootpwd
adduser ec2-user -G adm,wheel
Con visudo scommentare la riga
%wheel ALL=(ALL) NOPASSWD: ALL
mkinitrd --with virtio_pci --with virtio_ring --with virtio_blk --with virtio_net --with virtio_balloon --with virtio -f /boot/initramfs-$(ls /lib/modules/).img $(ls /lib/modules/)
exit
== Copiare il kernel e il ramdisk nella directory dell’immagine ==
cp -v $CLOUD_MOUNTPOINT/boot/initramfs-*img $IMAGELIBDIR
cp -v $CLOUD_MOUNTPOINT/boot/vmlinuz* $IMAGELIBDIR
umount $CLOUD_MOUNTPOINT
==== Importare in glance ====
glance image-create --name "$SO-kernel" --is-public True --container-format aki --disk-format aki < $IMAGELIBDIR/vmlinuz-2.6.18-348.16.1.el5
ID_AKI=`glance image-list |grep $SO-kernel|awk -F '| ' '{print $2}'`
glance image-create --name "$SO-ramdisk" --is-public True --container-format ari --disk-format ari < $IMAGELIBDIR/initramfs-2.6.18-348.16.1.el5.img
ID_ARI=`glance image-list |grep $SO-ramdisk|awk -F '| ' '{print $2}'`
glance add name="$SO" is_public=True container_format=ami disk_format=ami kernel_id=$ID_AKI ramdisk_id=$ID_ARI < $IMAGEFILE
**NB**: in Horizon le aki e le ari non vengono visualizzate. Per istanziare l’immagine si lancia la ami.
**NB2**: Occorre la consistenza tra le tre immagini: se si vuole rendere l’immagine ami pubblica, allora lo devono essere anche la aki e la ari (anche se non vengono cmq visualizzate nella dashboard).
==== Altre Note ====
Il tutto puo’ essere facilmente scriptabile in modo da creare on demand l’immagine sempre con gli rpm e il kernel piu’ aggiornati.