Différences entre versions de « Lxc guest »

De Cliss XXI
Sauter à la navigation Sauter à la recherche
imported>VincentAdolphe
 
(10 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 51 : Ligne 51 :
 
absolument
 
absolument
 
||
 
||
* udev (masque /dev avec rien)
+
* '''udev''' (masque /dev avec rien)
* umountroot (dans le cas d'un montage dedie au lxc, peut remonter celui-ci en read-only)
+
* '''umountroot''' (dans le cas d'un montage dedie au lxc, peut remonter celui-ci en read-only)
 
|-
 
|-
 
!|
 
!|
 
à garder
 
à garder
 
||
 
||
* networking (dans lxc, la configuration réseau se fait surtout dans l'invité)
+
* '''rsyslog'''
* sendsigs
+
* '''networking''' (dans lxc, la configuration réseau se fait surtout dans l'invité)
* killproc
+
* '''sendsigs'''
* single
+
* '''killprocs'''
* rmnologin
+
* '''single'''
* mountall-bootclean.sh (nettoie /tmp/ /var/run/ /var/lock/) Sous Squeeze, ajouter un /etc/insserv/override coupant la dépendance à mountall ou utilisez '''insserv -f -r''' pour forcer la suppression du script
+
* '''rmnologin'''
 +
* '''mountall-bootclean.sh''' (nettoie /tmp/ /var/run/ /var/lock/) Sous Squeeze, ajouter un /etc/insserv/override coupant la dépendance à mountall ou utilisez '''insserv -f -r''' pour forcer la suppression du script
 
* mtab.sh (met a jour la mtab)
 
* mtab.sh (met a jour la mtab)
* procps (permet de configurer sysctl - ce qui est possible avec lxc)
+
* '''procps''' (permet de configurer sysctl - ce qui est possible avec lxc)
 +
* '''mountdevsubfs.sh''' (permet de monter /dev/shm sous forme d'un tmpfs)
 
|-
 
|-
 
!|
 
!|
Ligne 70 : Ligne 72 :
 
(ca fait moins d'erreurs et ca démarre plus vite)
 
(ca fait moins d'erreurs et ca démarre plus vite)
 
||
 
||
* hwclock.sh
+
* Dans quasiment toutes les images (vserver, debootstrap, etc.)
* hwclockfirst.sh
+
** '''hwclock.sh'''
* checkfs
+
** '''hwclockfirst.sh'''
* checkroot
+
** '''checkfs.sh'''
* mountall
+
** '''checkroot.sh'''
* mountdevsubfs
+
** '''mountall.sh'''
* mountkernfs
+
** '''mountkernfs.sh'''
* mountnfs
+
** '''mountnfs.sh'''
* mountnfs-bootclean
+
** '''mountnfs-bootclean.sh'''
* mountoverflowtmp
+
** '''mountoverflowtmp'''
* umountfs
+
** '''umountfs'''
* umountnfs.sh
+
** '''umountnfs.sh'''
* umountroot
+
** '''umountroot'''
 
+
* Plutôt rencontré dans le cas d'une conversion de machine native
* lvm2
+
** '''klogd'''
* udev
+
** '''sysklogd'''
* udev-mtab
+
** '''lvm2'''
* fixudev
+
** '''udev'''
* module-init-tool
+
** '''udev-mtab'''
* hdparm
+
** '''fixudev'''
* fuse
+
** '''module-init-tool'''
 
+
** '''hdparm'''
* kbd
+
** '''fuse'''
* keyboard-setup
+
* Plutôt dans le cas d'une machine avec serveur X
* keymap.sh
+
** '''kbd'''
* lm-sensor
+
** '''keyboard-setup'''
 +
** '''keymap.sh'''
 +
** '''lm-sensor'''
 
|}
 
|}
  
Ligne 102 : Ligne 106 :
 
Voila ma methode:
 
Voila ma methode:
  
* Tout d'abord je crée un répertoire '''/etc/init.disabled'''
+
* En général
* Sous Lenny, je déplace les scripts visés de '''/etc/init.d''' a '''/etc/init.disabled'''. Cela permet de restaurer facilement un script sans changer l'ordre ni le runlevel (c'est le nom du lien symbolique qui contient cette information).
+
** Autant que possible enlever les paquets qui ne sont plus nécessaire à l'exécution. Ca peut être fait en dernière étape une fois qu'on a passé toute les autres étapes. C'est important car une mise à jour ultérieure pourrait réserver de mauvaises surprises (exemple, mise à jour impliquant udev, ce qui réactive le script au démarrage, masque /dev avec un système de fichier udev... vide et donc la machine lxc ne démarre plus).
* Sous Squeeze, j'ai décidé de faire confiance a '''insserv''':
+
lvm2 udev lilo grub linux-image
** d'abord je retire le script visé: *insserv -r <script> , puis je le deplace dans /etc/init.disabled
+
** vérifier les dépendances avec (rdepends: montre les paquets qui dépendent de <pkg>)
** si je dois le restaurer, je fait l'operation inverse, je le deplace dans /etc/init.d puis j'execute insserv -d script
+
apt-cache depends <pkg>
 +
apt-cache rdepends <pkg>
 +
 
 +
 
 +
* Sous Lenny,
 +
** je crée tout d'abord un répertoire '''/etc-before-lxc'''
 +
** puis je déplace les scripts visés de '''/etc/rc?.d''' a '''/etc-before-lxc/rc?.d'''. Cela permet de restaurer facilement un script sans changer l'ordre ni le runlevel (c'est le nom du lien symbolique qui contient cette information).
 +
** UPDATE: eviter de supprimer/deplacer les fichiers dans /etc/init.d/ car un apt-get dist-upgrade va verifier que certain script existent (mountall, mountnfs.sh, umountroot etc...)
 +
 
 +
# Creation des repertoires cible
 +
for RL in S 0 1 2 3 4 5 6 ; do mkdir -p "/etc-before-lxc/rc${RL}.d" ; done
 +
 
 +
# deplacement des liens symboliques dans /etc-before-lxc (Dry-run, enlever "echo" devant mv pour executer)
 +
for SRV in udev umountroot hwclock.sh hwclockfirst.sh checkfs checkroot \
 +
mountall.sh mountkernfs mountnfs.sh mountnfs-bootclean mountoverflowtmp \
 +
umountfs umountnfs.sh lvm2 udev udev-mtab fixudev module-init-tool hdparm \
 +
fuse kbd keyboard-setup keymap.sh lm-sensor
 +
do for ISRV in /etc/rc?.d/???${SRV} ; do [ -f $ISRV ] && echo mv "$ISRV $(echo $ISRV | sed 's/etc/etc-before-lxc/')" ; done ; done
 +
 
 +
* Sous Squeeze, j'opte plutôt pour '''insserv''':
 +
** je retire le script visé: '''insserv -f -r ''' ''<script1>...<scriptN>''
 +
** on peut aussi déplacer les scripts dans /etc/init.disabled (mais c'est facultatif)
 +
** pour restaurer, j'execute '''insserv script''' voire '''insserv -f script'''
 +
 
 +
insserv -f -r $( for SRV in udev umountroot hwclock.sh hwclockfirst.sh checkfs checkroot \
 +
mountall.sh mountkernfs mountnfs.sh mountnfs-bootclean mountoverflowtmp \
 +
umountfs umountnfs.sh lvm2 udev udev-mtab fixudev module-init-tool hdparm \
 +
fuse kbd keyboard-setup keymap.sh lm-sensor ; do [ -f /etc/init.d/$SRV ] && echo $SRV ; done)
  
La manière sous squeeze semble plus compliquée mais permet de supprimer les liens symboliques inutiles (donc une lecture plus facile des répertoires rc?.d).
+
pour éviter d'utiliser l'option ''force'' '''-f''' d'insserv, il suffit de recopier l'entête du script incriminé dans '''/etc/insserv/overrides/''' et d'en supprimer les dépendances obligatoires: '''Required-Start:''' ''<vide>'' (voir exemple dans [[script_rc_debian]])
Dans les 2 cas, le fait de déplacer les scripts dans /etc/init.disabled permet
+
-> Vous n'avez ainsi pas touché aux scripts initiaux, et vous avez toujours la possibilité de revenir aux dépendances initiales.
# d'avoir en un clin d'oeil la liste des scripts qui ont été retire du système (démarrage / arrêt)
 
# de ne pas réactiver par erreur un script
 
# de garder une restauration simple au cas où
 

Version actuelle datée du 16 décembre 2013 à 10:59

conversion d'une image linux en LXC

Un serveur virtuel LXC est la partie utilisateur ("userland") par opposition à la partie noyau ("kernel").

Pour convertir une image c'est assez simple en ce sens qu'on va plutôt enlever des choses qu'en mettre:

  • tout les scripts de démarrage servant a faire l'initialisation matérielle
  • les scripts chargeant les modules kernel

Très bien, enlevons, mais d'abord, quels sont les scripts lancé au démarrage. La réponse pourrait être simple, c'est les script rc du système V et c'est marre.

Oui mais, avec Squeeze, Debian introduit 2 changements importants dans ces scripts:

  1. il existe maintenant 2 modes de démarrage (classique systemV et "makefile like" avec startpar)
  2. même dans le mode classique, (rcN.d/[KS]XYscript.sh) les numéros d'execution (le XY) ne sont plus

forcément figés, ils sont calculé par la commande "insserv". L'installation d'un paquet peut donc potentiellement faire changer l'ordre de démarrage.

Restons calme, il s'agit de machine virtuelles, donc l'ordre d'exécution des scripts de démarrage est moins critique que sur une machine physique. Une machine physique doit savoir jongler avec des trucs comme: j'ai besoin de monter un volume raid, mais les binaires qui me permettront de le manipuler se trouve sur le volume raid en question... C'est précisément dans ce genre de cas que l'ordre d'exécution des scripts de démarrage est critique et que l'utilisation d'initrd et des modules noyau est indispensable.

Sur une machine virtuelle on va essentiellement lancer des applicatifs. Lancer apache longtemps avant la base de donnée sur laquelle il va travailler n'est pas une bonne idée, mais ça reste (la plupart du temps) plus une gêne au démarrage qu'un plantage pur et simple.

Bref, revenons à ces scripts de démarrage qu'il faut élaguer:

  1. Quel est le type de démarrage ?
  • Lenny -> sysV
  • Squeeze:
    • si CONCURRENCY=none dans /etc/default/rcS ou si /etc/init.d/.legacy-bootordering existe -> sysV
    • sinon, si les fichiers /etc/init.d/.depend.{boot,start,stop} existent et ne sont pas vide -> "startpar" version "makefile"
    • tout les autres cas -> sysV

Voir le détail sur l'ordre d'exécution des scripts de démarrage script_rc_debian

Attention le tableau suivant est encore en développement

Script /etc/init.d

Lenny/Squeeze

a désactiver absolument

  • udev (masque /dev avec rien)
  • umountroot (dans le cas d'un montage dedie au lxc, peut remonter celui-ci en read-only)

à garder

  • rsyslog
  • networking (dans lxc, la configuration réseau se fait surtout dans l'invité)
  • sendsigs
  • killprocs
  • single
  • rmnologin
  • mountall-bootclean.sh (nettoie /tmp/ /var/run/ /var/lock/) Sous Squeeze, ajouter un /etc/insserv/override coupant la dépendance à mountall ou utilisez insserv -f -r pour forcer la suppression du script
  • mtab.sh (met a jour la mtab)
  • procps (permet de configurer sysctl - ce qui est possible avec lxc)
  • mountdevsubfs.sh (permet de monter /dev/shm sous forme d'un tmpfs)

à désactiver (ca fait moins d'erreurs et ca démarre plus vite)

  • Dans quasiment toutes les images (vserver, debootstrap, etc.)
    • hwclock.sh
    • hwclockfirst.sh
    • checkfs.sh
    • checkroot.sh
    • mountall.sh
    • mountkernfs.sh
    • mountnfs.sh
    • mountnfs-bootclean.sh
    • mountoverflowtmp
    • umountfs
    • umountnfs.sh
    • umountroot
  • Plutôt rencontré dans le cas d'une conversion de machine native
    • klogd
    • sysklogd
    • lvm2
    • udev
    • udev-mtab
    • fixudev
    • module-init-tool
    • hdparm
    • fuse
  • Plutôt dans le cas d'une machine avec serveur X
    • kbd
    • keyboard-setup
    • keymap.sh
    • lm-sensor

comment enlever les scripts au démarrage

Voila ma methode:

  • En général
    • Autant que possible enlever les paquets qui ne sont plus nécessaire à l'exécution. Ca peut être fait en dernière étape une fois qu'on a passé toute les autres étapes. C'est important car une mise à jour ultérieure pourrait réserver de mauvaises surprises (exemple, mise à jour impliquant udev, ce qui réactive le script au démarrage, masque /dev avec un système de fichier udev... vide et donc la machine lxc ne démarre plus).
lvm2 udev lilo grub linux-image
    • vérifier les dépendances avec (rdepends: montre les paquets qui dépendent de <pkg>)
apt-cache depends <pkg>
apt-cache rdepends <pkg>


  • Sous Lenny,
    • je crée tout d'abord un répertoire /etc-before-lxc
    • puis je déplace les scripts visés de /etc/rc?.d a /etc-before-lxc/rc?.d. Cela permet de restaurer facilement un script sans changer l'ordre ni le runlevel (c'est le nom du lien symbolique qui contient cette information).
    • UPDATE: eviter de supprimer/deplacer les fichiers dans /etc/init.d/ car un apt-get dist-upgrade va verifier que certain script existent (mountall, mountnfs.sh, umountroot etc...)
# Creation des repertoires cible
for RL in S 0 1 2 3 4 5 6 ; do mkdir -p "/etc-before-lxc/rc${RL}.d" ; done
# deplacement des liens symboliques dans /etc-before-lxc (Dry-run, enlever "echo" devant mv pour executer)
for SRV in udev umountroot hwclock.sh hwclockfirst.sh checkfs checkroot \
mountall.sh mountkernfs mountnfs.sh mountnfs-bootclean mountoverflowtmp \
umountfs umountnfs.sh lvm2 udev udev-mtab fixudev module-init-tool hdparm \
fuse kbd keyboard-setup keymap.sh lm-sensor
do for ISRV in /etc/rc?.d/???${SRV} ; do [ -f $ISRV ] && echo mv "$ISRV $(echo $ISRV | sed 's/etc/etc-before-lxc/')" ; done ; done
  • Sous Squeeze, j'opte plutôt pour insserv:
    • je retire le script visé: insserv -f -r <script1>...<scriptN>
    • on peut aussi déplacer les scripts dans /etc/init.disabled (mais c'est facultatif)
    • pour restaurer, j'execute insserv script voire insserv -f script
insserv -f -r $( for SRV in udev umountroot hwclock.sh hwclockfirst.sh checkfs checkroot \
mountall.sh mountkernfs mountnfs.sh mountnfs-bootclean mountoverflowtmp \
umountfs umountnfs.sh lvm2 udev udev-mtab fixudev module-init-tool hdparm \
fuse kbd keyboard-setup keymap.sh lm-sensor ; do [ -f /etc/init.d/$SRV ] && echo $SRV ; done)

pour éviter d'utiliser l'option force -f d'insserv, il suffit de recopier l'entête du script incriminé dans /etc/insserv/overrides/ et d'en supprimer les dépendances obligatoires: Required-Start: <vide> (voir exemple dans script_rc_debian) -> Vous n'avez ainsi pas touché aux scripts initiaux, et vous avez toujours la possibilité de revenir aux dépendances initiales.