Serveur dédié sous FreeBSD, part. I

Depuis environs deux ans, j'expérimente, l'hébergement Web, par la location d'un serveur dédié.

J'ai décidé de changer d'hébergeur, auparavant, j'étais chez BSD Virtual Machines, le service est convenable. On passe commande, le serveur est immédiatement à notre disposition. Cependant on dispose d'aucun « service » en cas d'erreur. C'est pourquoi je me suis tourné vers Digicube.

Le seul problème avec un serveur dédié, c'est qu'il faut bien souvent « repasser » dernière l'installateur automatique. De plus, comme l'on n'a pas accès, physiquement à la machine, la moindre erreur se traduit souvent par une réinstallation.

Celui que j'ai acquit ne déroge pas à la règle.

Je dispose donc dorénavant d'un serveur amd64, sous FreeBSD.

Pour rendre son serveur fonctionnel, il faut faire quelques adaptations, qui seront détaillées dans ce billet.

Configuration des services

Cette partie est consacrée, à la configuration des fichiers situés dans /etc, notamment /etc/rc.conf.

Par défaut, on trouve que deux lignes, l'une donnant le nom de la machine, et l'autre sert à la connexion réseau.

hostname=".....digicube.fr"
ifconfig_re0="DHCP"

Or si on laisse cette ligne telle quelle, au prochain redémarrage du serveur, on n'aura plus de réseau. On sait déjà que notre carte réseau, re0 est une RealTek.

On va obtenir d'autres informations, grâce à la commande ifconfig :

ifconfig -a
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=389b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_UCAST,WOL_MCAST,WOL_MAGIC>
	ether 00:1c:c0:d0:b4:2f
	inet 95.130.12.57 netmask 0xffffff00 broadcast 95.130.12.255
	media: Ethernet autoselect (100baseTX <full-duplex>)
	status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
	options=3<RXCSUM,TXCSUM>
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 
	inet6 ::1 prefixlen 128 
	inet 127.0.0.1 netmask 0xff000000

Pour obtenir la table de routage :

netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            95.130.12.1        UGS         1     3097    re0
95.130.12.0/24     link#1             U           0      128    re0
95.130.12.57       link#1             UHS         0        0    lo0
127.0.0.1          link#2             UH          0       48    lo0

Internet6:
Destination                       Gateway                       Flags      Netif Expire
::1                               ::1                           UH          lo0
fe80::%lo0/64                     link#2                        U           lo0
fe80::1%lo0                       link#2                        UHS         lo0
ff01:2::/32                       fe80::1%lo0                   U           lo0
ff02::%lo0/32                     fe80::1%lo0                   U           lo0

Le panel chez Digicube nous donnes ça :

  • Adresse IP : 95.130.12.57
  • Masque : 255.255.255.255
  • Passerelle : 95.130.12.1

Nous avons toutes les informations en main pour commencer à éditer le fichier /etc/rc.conf. Voici donc un extrait :

cron_enable="YES"
sshd_enable="YES"
ntpd_enable="YES"

cleanvar_enable="YES"
clear_tmp_enable="YES"

sendmail="NONE"

hostname="....digicube.fr"
ifconfig_re0="inet 95.130.12.57 netmask 255.255.255.0"
defaultrouter="95.130.12.1"

Les services pour l'instant disponibles sont :

  • OpenSSH
  • cron
  • ntpd (pour avoir toujours son serveur à l'heure [1])

Le partitionnement

C'est souvent cette partie, qui fait défaut, on aimerait le refaire à notre guise. Voyez par vous-même, les points de montage :

mount

/dev/ad4s1a on / (ufs, local)
devfs on /dev (devfs, local, multilabel)
/dev/ad4s1g on /home (ufs, local, soft-updates)
/dev/ad4s1e on /usr (ufs, local, soft-updates)
/dev/ad4s1f on /usr/local (ufs, local, soft-updates)
/dev/ad4s1d on /var (ufs, local, soft-updates)

L'espace disque disponible :

df -h

Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad4s1a    1.9G    253M    1.5G    14%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad4s1g    127G    4.0K    117G     0%    /home
/dev/ad4s1e    3.7G    147M    3.3G     4%    /usr
/dev/ad4s1f    5.6G    4.0K    5.2G     0%    /usr/local
/dev/ad4s1d    3.7G    396K    3.4G     0%    /var

J'aurais préféré avoir une partition /usr d'une centaine de gigas, q'un /home.

Dans la suite, toutes les étapes se feront en mode multi-users, c'est à dire, je ne suis pas passé par un redémarrage du système en mode rescue [2], tout se fera « à chaud », d'où certaines contraintes.

Comme l'on travaille « à chaud », on ne peut pas démonter toutes les partitions, même si l'on emploie l'option -f.

OpenSSH étant situé dans /usr, cette partition ne doit surtout pas être démontée.

umount -f /home
umount -f /usr/local

Première tentative

On va utiliser la commande growfs(8), pour augmenter la taille de la partition /usr.

On va d'abord commencer par changer la valeur kern.geom.debugflags :

sysctl kern.geom.debugflags=17
kern.geom.debugflags: 0 -> 17

Maintenant, on peut éditer la table des labels, pour supprimer l'entrée correspondant à /usr/local et /home

bsdlabel -e ad4s1

# /dev/ad4s1:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:  4194304        0    4.2BSD        0     0     0
  b:  4194304  4194304      swap
  c: 312581745        0    unused        0     0         # "raw" part, don't edi
t
  d:  8116124  8388608    4.2BSD        0     0     0
  e:  8116124 16504732    4.2BSD        0     0     0
  f: 251658240 24620856    4.2BSD        0     0     0
  g: 36302649 276279096    4.2BSD        0     0     0

Dans mon cas, je supprime les lignes f et g.

Pour valider les modifications, j'enregistre le fichier temporaire, et j'obtiens ce message d'erreur :

bsdlabel: Class not found
re-edit the label? [y]:

Il m'est impossible de modifier la table des partitions, et par conséquent d'utiliser growfs.

Une autre approche

Puisque je suis dans l'incapacité de changer la taille de la partition /usr, je vais donc la conserver, et tout passera par /usr/local. [3]

Je vais utiliser pour cela gpart(8).

gpart show ad4

=>       63  312581745  ad4  MBR  (149G)
         63  312581745    1  freebsd  [active]  (149G)

On constate, que FreeBSD est installé sur l'ensemble du disque. La commande gpart show ad4s1 permet de donner les index des partitions.

=>        0  312581745  ad4s1  BSD  (149G)
          0    4194304      1  freebsd-ufs  (2.0G)
    4194304    4194304      2  freebsd-swap  (2.0G)
    8388608    8116124      4  freebsd-ufs  (3.9G)
   16504732    8116124      5  freebsd-ufs  (3.9G)
   24620856   12180188      6  freebsd-ufs  (5.8G)
   36801044  275780701      7  freebsd-ufs  (132G)

Ensuite, il suffit ensuite de faire :

gpart delete -i 7 ad4s1
gpart delete -i 6 ad4s1

La partition 7 correspondait au /home et 6 à /usr/local.

On peut vérifier l'état du disque avec gpart show ad4s1.

=>        0  312581745  ad4s1  BSD  (149G)
          0    4194304      1  freebsd-ufs  (2.0G)
    4194304    4194304      2  freebsd-swap  (2.0G)
    8388608    8116124      4  freebsd-ufs  (3.9G)
   16504732    8116124      5  freebsd-ufs  (3.9G)
   24620856  287960889         - free -  (137G)

J'ai gagné 137 gigas d'espace libre.

Pour rajouter une partition (dans mon cas deux),

gpart add -i 6 -s 120G -t freebsd-ufs ad4s1
gpart add -i 7 -t freebsd-ufs ad4s1

On obtiens ceci :

gpart show ad4s1
=>        0  312581745  ad4s1  BSD  (149G)
          0    4194304      1  freebsd-ufs  (2.0G)
    4194304    4194304      2  freebsd-swap  (2.0G)
    8388608    8116124      4  freebsd-ufs  (3.9G)
   16504732    8116124      5  freebsd-ufs  (3.9G)
   24620856  251658240      6  freebsd-ufs  (120G)
  276279096   36302649      7  freebsd-ufs  (17G)

On peut lancer la commande newfs(8) sur les nouvelles partions

newfs -U /dev/ad4s1f
newfs -U /dev/ad4s1g

Puis tunefs(8), pour activer l'option soft-updates.

tunefs -n enable /dev/ad4s1f
tunefs -n enable /dev/ad4s1g

On peut re-monter les partitions :

mount /dev/ad4s1f /usr/local
mount /dev/ad4s1g /home

La prochaine partie sera consacrée aux mises à jour de sécurité, et la gestion des ports.

Notes

[1] Ce service n'est pas obligatoire.

[2] Il n'a jamais fonctionné chez moi.

[3] Sous FreeBSD, lorsque l'on installe un logiciel, il s'installe dans /usr/local, même les fichiers de configuration.