Migrating from linux-vserver to lxc on debian


Précision: cet article n'est qu'un mémo personnel qui, en aucun cas, n'invite à migrer de linux-vserver vers lxc. C'est essentiellement pour des raisons de facilité de maintenance que j'ai opté pour cette migration. En effet côté vserver il faut toujours trainer sur l'irc pour savoir si un patch correspondant au noyau que l'on souhaite installer est dispo ou aller jeter un oeil sur: http://vserver.13thfloor.at/Experimental/ et ça commençait à me gonfler un peu... De plus les dev ont aussi une vie en dehors de l'info et les mises à jour trainent un peu...

J'ai donc opté pour lxc que j'avais déjà testé auparavant mais, cerise sur le gâteau, je souhaitais conserver les différents vservers tels quels.
De plus quitte à partir sur un nouveau noyau j'ai opté pour le 3.6.18 dont la fin de support n'est annoncée qu'en 2017 (voir https://www.kernel.org/category/releases.html)


La machine hôte (c'est pas tout jeune mais cela fait tout de même plus de 10 ans que ça tourne 24/7/365):



srvweb:/var/log# lspci
00:00.0 Host bridge: Intel Corporation 82945G/GZ/P/PL Memory Controller Hub (rev 81)
00:1d.0 USB controller: Intel Corporation NM10/ICH7 Family USB UHCI Controller #1 (rev 01)
00:1d.1 USB controller: Intel Corporation NM10/ICH7 Family USB UHCI Controller #2 (rev 01)
00:1d.2 USB controller: Intel Corporation NM10/ICH7 Family USB UHCI Controller #3 (rev 01)
00:1d.3 USB controller: Intel Corporation NM10/ICH7 Family USB UHCI Controller #4 (rev 01)
00:1d.7 USB controller: Intel Corporation NM10/ICH7 Family USB2 EHCI Controller (rev 01)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev e1)
00:1f.0 ISA bridge: Intel Corporation 82801GB/GR (ICH7 Family) LPC Interface Bridge (rev 01)
00:1f.1 IDE interface: Intel Corporation 82801G (ICH7 Family) IDE Controller (rev 01)
00:1f.2 IDE interface: Intel Corporation NM10/ICH7 Family SATA Controller [IDE mode] (rev 01)
00:1f.3 SMBus: Intel Corporation NM10/ICH7 Family SMBus Controller (rev 01)
01:02.0 VGA compatible controller: Matrox Electronics Systems Ltd. MGA 1064SG [Mystique] (rev 03)
01:04.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8169 PCI Gigabit Ethernet Controller (rev 10)


srvweb:/var/log# cat /proc/cpuinfo |grep model    
model        : 4
model name    : Intel(R) Pentium(R) D  CPU 2.66GHz
model        : 4
model name    : Intel(R) Pentium(R) D  CPU 2.66GHz

srvweb:/var/log# lsb_release -a
No LSB modules are available.
Distributor ID:    Debian
Description:    Debian GNU/Linux 7.8 (wheezy)
Release:    7.8
Codename:    wheezy

srvweb:/var/log# uname -a
Linux srvweb 3.18.19 #1 SMP Thu Jul 23 11:53:20 CEST 2015 i686 GNU/Linux


srvweb:/var/log# ll /boot/vm*
-rw-r--r-- 1 root root 2047632 août  24  2013 /boot/vmlinuz-2.6.32.61-vs2.3.0.36.29.9
-rw-r--r-- 1 root root 2617136 juil. 23 13:03 /boot/vmlinuz-3.18.19
-rw-r--r-- 1 root root 2204352 févr. 23 08:54 /boot/vmlinuz-3.2.67-vs2.3.2.17
-rw-r--r-- 1 root root 2204448 mars  10 16:18 /boot/vmlinuz-3.2.68-vs2.3.2.17


On constate bien que jusqu'au 23 juillet les noyaux (compilés maison) étaient patchés vserver.


Toujours dans un souci de facilité, pas question de se retaper toutes les options du nouveau noyau donc méthode appliquée:

srvweb:/usr/src/linux-3.18.19# cat /boot/config-3.2.68-vs2.3.2.17 > ./.config

Ensuite un petit coup de vi pour dégager les occurences de VSERVER dans le .config créé ci-dessus:

srvweb:/usr/src/linux-3.18.19# vi .config -c /VSERVER

# Linux VServer
#
CONFIG_VSERVER_AUTO_LBACK=y
# CONFIG_VSERVER_AUTO_SINGLE is not set
CONFIG_VSERVER_COWBL=y
# CONFIG_VSERVER_VTIME is not set
# CONFIG_VSERVER_DEVICE is not set
CONFIG_VSERVER_PROC_SECURE=y
# CONFIG_TAGGING_NONE is not set
# CONFIG_TAGGING_UID16 is not set
# CONFIG_TAGGING_GID16 is not set
CONFIG_TAGGING_ID24=y
# CONFIG_TAGGING_INTERN is not set
# CONFIG_TAG_NFSD is not set
# CONFIG_VSERVER_PRIVACY is not set
CONFIG_VSERVER_CONTEXTS=256
# CONFIG_VSERVER_WARN is not set
# CONFIG_VSERVER_DEBUG is not set
CONFIG_QUOTES_ISO8859=y
# CONFIG_QUOTES_UTF8 is not set
# CONFIG_QUOTES_ASCII is not set
CONFIG_VSERVER=y
# CONFIG_VSERVER_DISABLED is not set

srvweb:/usr/src/linux-3.18.19# make menuconfig
srvweb:/usr/src/linux-3.18.19# make
srvweb:/usr/src/linux-3.18.19# make modules_install
srvweb:/usr/src/linux-3.18.19# make install



Ensuite, on ne se moque pas, je suis toujours fidèle à lilo, donc ajout de la nouvelle entrée dans /etc/lilo.conf. Au final j'obtiens ceci:

srvweb:/etc# cat lilo.conf
# Automatically added by lilo postinst script
large-memory
lba32
boot=/dev/sda
root=/dev/sda1
install=/boot/boot-menu.b
map=/boot/map
prompt
delay=100
timeout=100
vga=normal
# Boot up Linux by default.
default=linux3268
image=/boot/vmlinuz-3.18.19
        label=linux31819
        read-only
        optional
image=/boot/vmlinuz-3.2.68-vs2.3.2.17
        label=linux3268
        read-only
        optional
image=/boot/vmlinuz-2.6.32.61-vs2.3.0.36.29.9
        label=linux263261
        read-only
        optional
image=/boot/vmlinuz-3.2.67-vs2.3.2.17
        label=Linux3267
        read-only
        optional
image=/boot/memtest86+.bin
     label=memtest86+

On constate également que je n'utilise pas d'initrd. Pour info udev n'est pas installé non plus sur cette machine: c'est l'avantage (?) de la compil perso des noyaux...


Avant de rebooter sur le 3.18.19 je modifie la config réseau pour créer un bridge qui sera nécessaire (en fonction des options choisies) à l'utilisation des containers lxc.

# brctl addbr br0
# brctl show br0
# brctl addif br0 eth0

# cat /etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto br0
iface br0 inet static
        bridge_ports eth0
        bridge-fd 0
        bridge_maxwait 0
        address 192.168.0.23
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        gateway 192.168.0.254
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 192.168.0.23 80.10.246.2 8.8.8.8
        dns-search net.caen



Ensuite reboot.



On passe maintenant à la "migration" des vservers.


AVANT:


srvweb:/# ll /opt/vservers/
total 44
d--------- 10 root root 4096 juil. 23 18:26 .
drwxr-xr-x 19 root root 4096 juil. 23 18:49 vweb10
drwxr-xr-x 23 root root 4096 juil. 25 17:30 vweb3
drwxr-xr-x 22 root root 4096 juil. 23 19:08 vweb7

Afin de rester conforme à l'arborescence par défaut des containers, j'ai simplement créé des liens symboliques comme ceci:

APRES:

srvweb:/var/lib# ls -ld lxc
lrwxrwxrwx 1 root root 14 juil. 23 13:06 lxc -> /opt/vservers/


srvweb:/opt/vservers# ll
total 44
d--------- 10 root root 4096 juil. 23 18:26 .
drwxr-xr-x  6 root root 4096 oct.  19  2013 ..
drwxr-xr-x  2 root root 4096 juil. 23 18:49 lxc10
drwxr-xr-x  2 root root 4096 juil. 23 18:49 lxc3
drwxr-xr-x  2 root root 4096 juil. 23 18:39 lxc7
-rw-r--r--  1 root root 1515 juil. 25 17:31 lxc-monitord.log
drwxr-xr-x 19 root root 4096 juil. 23 18:49 vweb10
drwxr-xr-x 23 root root 4096 juil. 25 17:30 vweb3
drwxr-xr-x 22 root root 4096 juil. 23 19:08 vweb7


srvweb:/opt/vservers# ll lxc3
total 20
drwxr-xr-x  2 root root 4096 juil. 23 18:49 .
d--------- 10 root root 4096 juil. 23 18:26 ..
-rw-r--r--  1 root root  586 juil. 23 13:13 config
-rw-r--r--  1 root root  240 juil. 23 18:45 fstab
-rw-r--r--  1 root root 1486 juil. 25 17:30 lxc3.log
lrwxrwxrwx  1 root root    8 juil. 23 13:07 rootfs -> ../vweb3

Le fichier de conf d'un container:

srvweb:/opt/vservers/lxc3# cat config
# For additional config options, please look at lxc.container.conf(5)
lxc.network.type = veth
#lxc.network.macvlan.mode = bridge
lxc.network.link = br0
lxc.network.flags = up
lxc.network.name = eth0
lxc.network.ipv4 = 192.168.0.232/24
lxc.network.ipv4.gateway = 192.168.0.254
#lxc.network.hwaddr = 00:16:3e:d8:24:26
lxc.rootfs = /opt/vservers/lxc3/rootfs/
# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf
# Container specific configuration
lxc.mount = /var/lib/lxc/lxc3/fstab
lxc.utsname = vweb3
lxc.arch = i386
lxc.autodev = 1
lxc.kmsg = 0
lxc.tty = 6


Le fait d'utiliser le type veth pour le réseau nécessite qu'un bridge soit configuré sur l'hôte (d'où la modif ci-dessus)


Le fichier fstab est vide mais doit exister.

Dernière modif: le fichier inittab des containers modifié comme suit:

srvweb:/var/lib/lxc/lxc3/rootfs/etc# cat inittab
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.
id:2:initdefault:

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS

# What to do in single-user mode.
~~:S:wait:/sbin/sulogin

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

1:2345:respawn:/sbin/getty 38400 console
c1:23:respawn:/sbin/getty 38400 tty1
c2:23:respawn:/sbin/getty 38400 tty2
c3:23:respawn:/sbin/getty 38400 tty3
c4:23:respawn:/sbin/getty 38400 tty4
p6::ctrlaltdel:/sbin/init 6
p0::powerfail:/sbin/init 0


Côté config réseau dans le container, voici ce qui a été généré après démarrage:


srvweb:~# lxc-attach -n lxc3

vweb3:~# cat /etc/network/interfaces
# This configuration file is auto-generated.
# WARNING: Do not edit this file, otherwise your changes will be lost.
# Please edit template /etc/network/interfaces.template instead.

# Auto generated venet0 interfaces
auto venet0 lo
iface venet0 inet static
    address 127.0.0.1
    netmask 255.255.255.255
    broadcast 0.0.0.0
    up route add -net 191.255.255.1 netmask 255.255.255.255 dev venet0
    up route add default gw 191.255.255.1
iface lo inet loopback


Pour démarrer un container en arrière-plan:

srvweb:~# lxc-start -n lxc3 -d

Pour obtenir un statut détaillé:

srvweb:~# lxc-info -n lxc3     
Name:           lxc3
State:          RUNNING
PID:            5979
IP:             192.168.0.232
CPU use:        34.09 seconds
Memory use:     98.54 MiB
KMem use:       0 bytes
Link:           vethS3P198
 TX bytes:      287.24 KiB
 RX bytes:      3.39 MiB
 Total bytes:   3.67 MiB

Pour exécuter une commande dans le container depuis l'hôte:

srvweb:~# lxc-attach -n lxc3 -- ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 init [2] 
  387 ?        Sl     0:00 /usr/sbin/rsyslogd -c5
  438 ?        Ss     0:00 /usr/sbin/cron
  452 console  Ss+    0:00 /sbin/getty 38400 console
  453 tty1     Ss+    0:00 /sbin/getty 38400 tty1
  454 tty2     Ss+    0:00 /sbin/getty 38400 tty2
  455 tty3     Ss+    0:00 /sbin/getty 38400 tty3
  456 tty4     Ss+    0:00 /sbin/getty 38400 tty4
  724 ?        Ss     0:00 /usr/sbin/apache2 -k start
  725 ?        S      0:00 /usr/sbin/apache2 -k start
  726 ?        S      0:00 /usr/sbin/apache2 -k start
  727 ?        S      0:00 /usr/sbin/apache2 -k start
  728 ?        S      0:00 /usr/sbin/apache2 -k start
  729 ?        S      0:00 /usr/sbin/apache2 -k start
  730 ?        S      0:00 /usr/sbin/apache2 -k start
  733 ?        S      0:00 /usr/sbin/apache2 -k start
  734 ?        S      0:00 /usr/sbin/apache2 -k start
  735 ?        S      0:00 /usr/sbin/apache2 -k start
  793 ?        R+     0:00 ps ax


Liens utiles:

https://wiki.debian.org/LXC

https://linuxcontainers.org/