LAN2WAN

.: LAN2WAN :.

Aucun commentaire

L'outil Netinstall de chez Mikrotik permet de réinstaller un routeur dont vous n'avez pas le mot de passe ou qui ne semble plus démarrer.

Pour ce faire, nous allons donc télécharger l'outil "Netinstall" sur la page de téléchargement du site de Mikrotik, l'outil "WinBox" pour se connecter sur le routeur, et également la dernière version de RouterOS dans l'architecture "mipsbe".

Nous stockerons tous les fichiers dans le répertoire "c:\openwrt" pour le prochain tutoriel.
Nous disposons sur notre ordinateur Windows 7 de l'adresse IP 192.168.1.10, et du firewall désactivé !

Configuration du logiciel Netinstall

Lançons donc le logiciel "netinstall.exe" qui va nous proposer l'interface ci-dessous :
NImk001

Il faut ensuite cliquer sur le bouton "Net booting" et lui indiquer que nous voulons qu'il récupère l'adresse IP 192.168.1.1 :
NImk002

Redémarrage du routeur RB750GL via le réseau

Pour se faire, il faut rester appuyé sur le bouton en façade, à droite de l'alimentation, et ce pendant 20secondes.
Vous devriez voir apparaitre dans l'interface du logiciel Netinstall votre routeur :
NImk003

Lancement de la réinstallation du routeur

Il suffit pour se faire de sélectionner le routeur dans la partie "Routers/Drives", et également sélectionner la version de RouterOS que nous voulons lui injecter.
Nous pouvons ensuite directement cliquer sur le bouton "Install" :
NImk004

Nous aurions pu également télécharger les "Extra packages" directement à cette étape.

Nous voyons alors dérouler les différentes étapes de la réinstallation.

  • Le transfert et l'installation sur le routeur :

NImk005

  • Le redémarrage :

NImk006

  • La validation du bon déroulement de l'opération :

NImk007

Validation du bon fonctionnement du routeur

Lançons le logiciel "winbox.exe". Si votre routeur n'apparait pas dans la liste des périphériques, il suffit de cliquer sur le bouton "Refresh" dans l'onglet "Neighbors". Vous devriez alors voir apparaitre votre équipement :
NImk008

Nous pouvons maintenant nous connecter dessus et valider que celui-ci est joignable via le logiciel :
NImk009

Aucun commentaire

Le tocage à la porte, ou port-knocking, est une méthode permettant de modifier le comportement d'un pare-feu (firewall) en temps réel en provoquant l'ouverture de ports permettant la communication, grâce au lancement préalable d'une suite de connexions sur des ports distincts dans le bon ordre, à l'instar d'un code frappé à une porte.

Nous allons donc mettre en place celle-ci sur un Mikrotik RB750GL afin de protéger l'accès à notre VPN en itinérance.
Nous n'aborderons pas la partie mise en place du VPN.

Pour résumer, votre terminal (smartphone, tablette, PC Portable ...) distant va envoyer une séquence (via l'envoi d'un paquet TCP ou UDP sur certains ports) sur votre Firewall, et celui-ci va autoriser les connexions depuis notre adresse IP.
Pour ce faire, notre Firewall va donc devoir stocker les adresses IP qui vont arriver, et ce pour une durée que nous allons lui préciser.
Nous devons mettre une durée car il se peut qu'une personne scanne les 65535 ports de votre Firewall et donc déclenche l'autorisation, ce qui ne serait pas souhaitable.

Création des listes d'adresses (stockage des adresses IP)

Dans un premier temps, nous allons ajouter 3 phases.
Nous pouvons en rajouter plus sans aucun soucis.
Nous lançons WinBox, puis dans le menu de gauche "IP", "Firewall" et pour finir l'onglet "Address Lists".
Nous ajoutons donc une première liste d'adresses, la "Phase1" comme indiqué ci-dessous :
PK001

Comme on peut le voir sur la capture, il n'est pas possible de créer une liste d'adresses vide.
Nous avons donc ajouté une adresse IP qui ne risque normalement pas de nous pirater, le DNS de Google.

Ajout de la "Phase2" :
PK002

Idem que précédemment concernant l'IP de Google.
Puis ajout de la "Phase finale" :
PK003

Nous retrouvons donc nos différentes phases comme ci-dessous :
PK004

Ajout des règles du Firewall

Toujours dans la partie "Firewall", nous allons sur l'onglet "Filter Rules", puis ajoutons nos 3 différentes règles qui serviront de séquences.

Première séquence

Onglet "General" nous utiliserons le Protocol TCP et le port 12345 :
PK005

Puis onglet "Action", nous la rattacherons à notre "Phase1" pour 10 secondes :
PK006

Cela nous laisse donc 10 secondes pour jouer la seconde séquence. En cas de lenteur sur le réseau, c'est suffisant.

Seconde séquence

Onglet "General" nous utiliserons le Protocol UDP et le port 23456 :
PK007

Dans l'onglet "Advanced", nous vérifions que l'adresse IP en question est déjà présente dans notre liste d'adresses de la "Phase1" :
PK008

Puis onglet "Action", nous la rattacherons à notre "Phase2" pour 10 secondes :
PK009

Cela nous laisse donc 10 secondes pour jouer la dernière séquence.

Dernière séquence

Onglet "General" nous utiliserons le Protocol TCP et le port 45678 :
PK010

Dans l'onglet "Advanced", nous vérifions que l'adresse IP en question est déjà présente dans notre liste d'adresses de la "Phase2" :
PK011

Puis onglet "Action", nous la rattacherons à notre "Phase Finale" pour 1 minute :
PK012

Nous avons donc 1 minute pour lancer notre connexion finale, dans mon cas mon client VPN.

Ouverture du Firewall pour notre adresse IP

Dans l'onglet "General", nous autorisons les connexions sur notre interface WAN :
PK013

Dans l'onglet "Advanced", nous limitons uniquement aux adresses IP présentes dans la liste d'adresses "PK_Secure" :
PK014

Puis dans l'onglet "Action" nous acceptons que le flux passe :
PK015

Toutes ces règles sont bien entendu à remonter avant la règle de "DROP".

Résumé des modifications

Nous pouvons constater que notre séquence est bien présente, ainsi que l'ordre dans laquelle nous devons l'effectuer :
PK016

Configuration de la séquence sur Android

Il suffit de configurer les ports et protocoles dans le même ordre que ce que vous avez fait sur votre Firewall, soit :
PK017

Test de connexion

Nous voici à la fin de cette mise en place, le saint Graal est au bout, nous allons nous connecter !
Une fois la séquence lancée depuis notre téléphone Android, nous pouvons voir dans la partie "Firewall" onglet "Filter Rules" que les 3 paquets sont bien arrivés :
PK018

Nous allons voir toujours dans la partie "Firewall", mais onglet "Address Lists", et nous pouvons constater que notre adresse IP est présentes dans les différentes "Phases" :
PK019

Ping des machines sur le réseau

Dans mon cas, je monte donc mon VPN avec mon téléphone Android, mais il se trouve que je ne pouvais pas me connecter sur les machines de mon réseau local.
Je surfais par contre bien via le VPN, et me trouvais avec l'adresse IP du serveur VPN.
Pour corriger le soucis, il suffit d'aller sur l'interface du réseau local et dans l'onglet "General" de passer l'ARP en "proxy-arp", comme ci-dessous :
PK020

Optimisation possible

Nous pouvons noter qu'il est également possible d'aller plus loin sur les vérifications, et d'envoyer depuis votre appareil mobile et de récupérer sur le Firewall un "code secret" via une "regexp" (onglet "Layer7 Protocols").

Aucun commentaire

Configuration matérielle

Il s'agit ici d'un Soekris Net4801 avec une carte additionnelle Lan1621 qui rajoute 2 ports réseaux 10/100, soit un total de 5 ports RJ-45. Le matériel en lui même n'est pas un foudre de guerre (CPU 233MHz, RAM 128Mo SDRAM, 3Ports Ethernet 10/100), mais il est suffisant pour une utilisation à domicile avec une connexion Internet de 50M maximum. Il faut également prendre en compte que tous les ports Ethernet n'étant pas des ports Gigabit, les transferts entre les différentes pattes du Firewall seront limités.

Préparation logicielle et Installation

Nous allons commencer par récupérer tout ce qui est nécessaire afin de pouvoir installer pfSense sur ce boitier. Pour se faire, nous allons télécharger la dernière version stable de pfSense sur le site. Etant donné qu'il s'agit d'un processeur avec une architecture 586, nous allons donc télécharger une version “i386”, et étant donné que nous allons installer ça sur une carte CompactFlash de 2Go, nous allons prendre le fichier “pfSense-2.1-RELEASE-2g-i386-nanobsd.img.gz”. Une fois avec ce fichier, il va nous falloir l'installer (après décompression) sur la carte mémoire. Pour se faire, nous allons nous servir de physdiskwrite. Connectons un lecteur de carte mémoire sur notre poste sous Windows, et copions le logiciel “physdiskwrite” dans le même répertoire que notre fichier “pfSense-2.1-RELEASE-2g-i386-nanobsd-20130911-1816.img”. Il faut ensuite lancer “cmd” en administrateur directement depuis le répertoire. A partir de maintenant, nous pouvons donc lancer la commande :

physdiskwrite pfSense-2.1-RELEASE-2g-i386-nanobsd-20130911-1816.img

Il va nous demander ou nous voulons copier le fichier image :

physdiskwrite v0.5.2 by Manuel Kasper

Searching for physical drives...

Information for \\.\PhysicalDrive0:
   Windows:       cyl: 60801
                  tpc: 255
                  spt: 63
Information for \\.\PhysicalDrive1:
DeviceIoControl() failed on \\.\PhysicalDrive1.

Information for \\.\PhysicalDrive2:
   Windows:       cyl: 249
                  tpc: 255
                  spt: 63

Information for \\.\PhysicalDrive3:
DeviceIoControl() failed on \\.\PhysicalDrive3.

Information for \\.\PhysicalDrive4:
DeviceIoControl() failed on \\.\PhysicalDrive4.

Which disk do you want to write? (0..2) 2
About to overwrite the contents of disk 2 with new data. Proceed? (y/n) y
1989969408/1989969408 bytes written in total

"Bien sélectionner la carte mémoire, sinon c'est l'effacement intégral de votre disque Windows" Une fois que c'est terminé, nous pouvons remettre la carte mémoire dans le boitier, et refermer celui-ci.

Démarrage du boitier

Branchons notre câble série (il est possible d'utiliser un câble USB-Serial avec un adaptateur Null-Modem) entre l'ordinateur et le boitier afin de voir ce qu'il se passe. Il est préférable de configurer Putty avant afin de pouvoir suivre correctement l'avancement du boot. Effectivement, il va falloir utiliser deux réglages différents pour avoir accès au BIOS et au Boot :

Accès au BIOS :

Vitesse : 19200
Data bits : 8
Stop bits : 1
Parité : Non
Flow control : XON/XOFF

Accès au Boot :

Vitesse : 9600
Data bits : 8
Stop bits : 1
Parité : Non
Flow control : XON/XOFF

Vérifications du Boot

Nous pouvons constater dans la phase de Boot qu'il détecte correctement nos différentes interfaces réseaux :

     ___
 ___/ f \
/ p \___/ Sense
\___/   \
    \___/

Welcome to pfSense 2.1-RELEASE  ...

Creating symlinks......done.
>>> Under 512 megabytes of ram detected.  Not enabling APC.
External config loader 1.0 is now starting... ad0s3
Launching the init system... done.
Initializing............................. done.
Starting device manager (devd)...done.
Loading configuration......done.

Default interfaces not found -- Running interface assignment option.
sis0: link state changed to DOWN
sis1: link state changed to DOWN
sis2: link state changed to DOWN
sis3: link state changed to DOWN
sis4: link state changed to DOWN

Valid interfaces are:

sis0  00:00:24:ca:8d:b8   (up) NatSemi DP8381[56] 10/100BaseTX
sis1  00:00:24:ca:8d:b9   (up) NatSemi DP8381[56] 10/100BaseTX
sis2  00:00:24:ca:8d:ba   (up) NatSemi DP8381[56] 10/100BaseTX
sis3  00:00:24:c9:de:e4   (up) NatSemi DP8381[56] 10/100BaseTX
sis4  00:00:24:c9:de:e5   (up) NatSemi DP8381[56] 10/100BaseTX

Configuration de base en console

Une fois passé la détection des interfaces, nous allons devoir répondre à certaines questions :

Do you want to set up VLANs first?
If you are not going to use VLANs, or only for optional interfaces, you should
say no here and use the webConfigurator to configure VLANs later, if required.
Do you want to set up VLANs now [y|n]?

Etant donné que nous effectuons uniquement une configuration de base, nous allons donc répondre “non” à cette question de VLANs. Nous pouvons maintenant attribuer les différentes interfaces réseaux. La norme Soekris indique que le port LAN est celui près du port console (sis0), et le WAN celui du milieu (sis1). Afin que cela soit plus simple pour nous, nous allons changer ceci afin que le premier port soit celui du WAN :

If you do not know the names of your interfaces, you may choose to use
auto-detection. In that case, disconnect all interfaces now before
hitting 'a' to initiate auto detection.

Enter the WAN interface name or 'a' for auto-detection: sis0

Enter the LAN interface name or 'a' for auto-detection
NOTE: this enables full Firewalling/NAT mode.
(or nothing if finished): sis1

Enter the Optional 1 interface name or 'a' for auto-detection
(or nothing if finished): sis2

Enter the Optional 2 interface name or 'a' for auto-detection
(or nothing if finished): sis3

Enter the Optional 3 interface name or 'a' for auto-detection
(or nothing if finished): sis4

Enter the Optional 4 interface name or 'a' for auto-detection
(or nothing if finished):

The interfaces will be assigned as follows:

WAN  -> sis0
LAN  -> sis1
OPT1 -> sis2
OPT2 -> sis3
OPT3 -> sis4

Do you want to proceed [y|n]?y

Une fois le Boot terminé, nous pouvons connecter le boitier sur le réseau via la prise “Eth1” (sis1).

Configuration de base via webConfigurator

Nous pouvons nous connecter directement sur l'interface web par défaut. Les informations d’authentification sont les suivantes :

Login : admin
Password : pfsense
v4: 192.168.1.1/24

Informations complémentaires sur la partie Hardware.

Configuration BIOS

POST: 012345689bcefghipsajklnopqr,,,tvwxy








comBIOS ver. 1.33  20080103  Copyright (C) 2000-2007 Soekris Engineering.

net4801

0128 Mbyte Memory                        CPU Geode SC1100 233 Mhz

Pri Mas  SanDisk SDCFH2-002G             LBA Xlt 992-64-63  2001 Mbyte

Slot   Vend Dev  ClassRev Cmd  Stat CL LT HT  Base1    Base2   Int
-------------------------------------------------------------------
0:00:0 1078 0001 06000000 0107 0280 00 00 00 00000000 00000000
0:06:0 100B 0020 02000000 0107 0290 00 3F 00 0000E101 A0000000 10
0:07:0 100B 0020 02000000 0107 0290 00 3F 00 0000E201 A0001000 10
0:08:0 100B 0020 02000000 0107 0290 00 3F 00 0000E301 A0002000 10
0:10:0 104C AC23 06040002 0107 0210 08 3F 01 00000000 00000000
0:18:2 100B 0502 01018001 0005 0280 00 00 00 00000000 00000000
0:19:0 0E11 A0F8 0C031008 0117 0280 08 38 00 A0003000 00000000 11
1:00:0 100B 0020 02000000 0107 0290 00 3F 00 0000D001 A4000000 05
1:01:0 100B 0020 02000000 0107 0290 00 3F 00 0000D101 A4001000 11

 3 Seconds to automatic boot.   Press Ctrl-P for entering Monitor.

Commandes BIOS

comBIOS Monitor.   Press ? for help.

> ?
comBIOS Monitor Commands

boot [drive][:partition] INT19 Boot
reboot                   cold boot
download                 download a file using XMODEM/CRC
flashupdate              update flash BIOS with downloaded file
time [HH:MM:SS]          show or set time
date [YYYY/MM/DD]        show or set date
d[b|w|d] [adr]           dump memory bytes/words/dwords
e[b|w|d] adr value [...] enter bytes/words/dwords
i[b|w|d] port            input from 8/16/32-bit port
o[b|w|d] port value      output to 8/16/32-bit port
run adr                  execute code at adr
cmosread [adr]           read CMOS RAM data
cmoswrite adr byte [...] write CMOS RAM data
cmoschecksum             update CMOS RAM Checksum
set parameter=value      set system parameter to value
show [parameter]         show one or all system parameters
?/help                   show this help

Configuration vue par FreeBSD (pfSense)

Consoles: serial port
BIOS drive C: is disk0
BIOS 639kB/130048kB available memory

FreeBSD/x86 bootstrap loader, Revision 1.1
(root@snapshots-8_3-i386.builders.pfsense.org, Wed Sep 11 18:59:49 EDT 2013)
Loading /boot/defaults/loader.conf
/boot/kernel/kernel data=0x9162bc data=0x51d734+0x9e0c4 syms=[0x4+0x9aa90+0x4+0xd51ab]
-
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [/boot/kernel/kernel]...
Copyright (c) 1992-2012 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 8.3-RELEASE-p11 #0: Wed Sep 11 19:13:36 EDT 2013
    root@snapshots-8_3-i386.builders.pfsense.org:/usr/obj.pfSense/usr/pfSensesrc/src/sys/pfSense_wrap.8.i386 i386
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Geode(TM) Integrated Processor by National Semi (233.34-MHz 586-class CPU)
  Origin = "Geode by NSC"  Id = 0x540  Family = 5  Model = 4  Stepping = 0
  Features=0x808131<FPU,TSC,MSR,CX8,CMOV,MMX>
real memory  = 134217728 (128 MB)
avail memory = 108036096 (103 MB)
ipw_bss: You need to read the LICENSE file in /usr/share/doc/legal/intel_ipw/.
ipw_bss: If you agree with the license, set legal.intel_ipw.license_ack=1 in /boot/loader.conf.
module_register_init: MOD_LOAD (ipw_bss_fw, 0xc07330f0, 0) error 1
ipw_ibss: You need to read the LICENSE file in /usr/share/doc/legal/intel_ipw/.
ipw_ibss: If you agree with the license, set legal.intel_ipw.license_ack=1 in /boot/loader.conf.
module_register_init: MOD_LOAD (ipw_ibss_fw, 0xc0733190, 0) error 1
ipw_monitor: You need to read the LICENSE file in /usr/share/doc/legal/intel_ipw/.
ipw_monitor: If you agree with the license, set legal.intel_ipw.license_ack=1 in /boot/loader.conf.
module_register_init: MOD_LOAD (ipw_monitor_fw, 0xc0733230, 0) error 1
wlan: mac acl policy registered
ACPI Error: A valid RSDP was not found (20101013/tbxfroot-309)
ACPI: Table initialisation failed: AE_NOT_FOUND
ACPI: Try disabling either ACPI or apic support.
cryptosoft0: <software crypto> on motherboard
padlock0: No ACE support.
pcib0: <Host to PCI bridge> pcibus 0 on motherboard
pci0: <PCI bus> on pcib0
sis0: <NatSemi DP8381[56] 10/100BaseTX> port 0xe100-0xe1ff mem 0xa0000000-0xa0000fff irq 10 at device 6.0 on pci0
sis0: Silicon Revision: DP83816A
miibus0: <MII bus> on sis0
nsphyter0: <DP83815 10/100 media interface> PHY 0 on miibus0
nsphyter0:  none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
sis0: [ITHREAD]
sis1: <NatSemi DP8381[56] 10/100BaseTX> port 0xe200-0xe2ff mem 0xa0001000-0xa0001fff irq 10 at device 7.0 on pci0
sis1: Silicon Revision: DP83816A
miibus1: <MII bus> on sis1
nsphyter1: <DP83815 10/100 media interface> PHY 0 on miibus1
nsphyter1:  none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
sis1: [ITHREAD]
sis2: <NatSemi DP8381[56] 10/100BaseTX> port 0xe300-0xe3ff mem 0xa0002000-0xa0002fff irq 10 at device 8.0 on pci0
sis2: Silicon Revision: DP83816A
miibus2: <MII bus> on sis2
nsphyter2: <DP83815 10/100 media interface> PHY 0 on miibus2
nsphyter2:  none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
sis2: [ITHREAD]
pcib1: <PCI-PCI bridge> at device 10.0 on pci0
pci1: <PCI bus> on pcib1
sis3: <NatSemi DP8381[56] 10/100BaseTX> port 0xd000-0xd0ff mem 0xa4000000-0xa4000fff irq 5 at device 0.0 on pci1
sis3: Silicon Revision: DP83816A
miibus3: <MII bus> on sis3
nsphyter3: <DP83815 10/100 media interface> PHY 0 on miibus3
nsphyter3:  none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
sis3: [ITHREAD]
sis4: <NatSemi DP8381[56] 10/100BaseTX> port 0xd100-0xd1ff mem 0xa4001000-0xa4001fff irq 11 at device 1.0 on pci1
sis4: Silicon Revision: DP83816A
miibus4: <MII bus> on sis4
nsphyter4: <DP83815 10/100 media interface> PHY 0 on miibus4
nsphyter4:  none, 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
sis4: [ITHREAD]
Geode Soekris net4801 comBIOS ver. 1.33 20080103 Copyright (C) 2000-2007
isab0: <PCI-ISA bridge> port 0x6100-0x613f,0x6200-0x623f at device 18.0 on pci0
isa0: <ISA bus> on isab0
pci0: <bridge> at device 18.1 (no driver attached)
atapci0: <National Geode SC1100 ATA33 controller> port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0xe000-0xe00f at device 18.2 on pci0
ata0: <ATA channel> at channel 0 on atapci0
ata0: [ITHREAD]
ata1: <ATA channel> at channel 1 on atapci0
ata1: [ITHREAD]
Timecounter "Geode" frequency 27000000 Hz quality 1000
pci0: <bridge> at device 18.5 (no driver attached)
ohci0: <OHCI (generic) USB controller> mem 0xa0003000-0xa0003fff irq 11 at device 19.0 on pci0
ohci0: [ITHREAD]
usbus0: <OHCI (generic) USB controller> on ohci0
cpu0 on motherboard
orm0: <ISA Option ROM> at iomem 0xc8000-0xd0fff pnpid ORM0000 on isa0
atrtc0: <AT Real Time Clock> at port 0x70 irq 8 on isa0
ppc0: parallel port not found.
uart0: <16550 or compatible> at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
uart0: [FILTER]
uart0: console (9600,n,8,1)
uart1: <16550 or compatible> at port 0x2f8-0x2ff irq 3 on isa0
uart1: [FILTER]
Timecounters tick every 10.000 msec
IPsec: Initialized Security Association Processing.
usbus0: 12Mbps Full Speed USB v1.0
ad0: 1953MB <SanDisk SDCFH2-002G HDX 4.32> at ata0-master PIO4
ugen0.1: <0x0e11> at usbus0
uhub0: <0x0e11 OHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
Root mount waiting for: usbus0
uhub0: 3 ports with 3 removable, self powered
Trying to mount root from ufs:/dev/ufs/pfsense0
Configuring crash dumps...
Mounting filesystems...
Setting up memory disks... done.

Aucun commentaire

Installation des paquets

Pour mettre à jour le BIOS des serveurs DELL, nous allons avoir besoin des paquets suivants :

  • libsmbios-bin
  • libsmbios2

Pour les installer, rien de plus simple :

apt-get update
apt-get install libsmbios-bin libsmbios2

Une fois cette installation réalisée, nous pouvons vérifier que nous avons bien les deux binaires qui nous intéressent :

  • /usr/sbin/dellBiosUpdate
  • /usr/sbin/getSystemId

Le premier nous permettra de mettre le BIOS à jour, tandis que le second nous donnera les informations nécessaires à la recherche de la bonne version du BIOS.

Récupération des informations

Attaquons-nous donc à la recherche des informations.
Nous allons donc utiliser la commande '/usr/sbin/getSystemId' qui va nous retourner sur notre serveur :

Libsmbios:    2.0.3
System ID:    0x014A
Service Tag:  DPWxxxx
Express Service Code: 2986399xxxx
Product Name: PowerEdge 1750
BIOS Version: A11
Vendor:       Dell Computer Corporation
Is Dell:      1

Nous pouvons vérifier avec le ServiceTag si une mise à jour du BIOS est disponible ou pas, en se rendant directement sur le site du support DELL.
Nous gagnons du temps en allant directement sur la page des BIOS DELL. Une fois sur celle-ci, nous allons chercher ce qui correspond à notre matériel, soit :

  • system_bios_ven_0x1028_dev_0x014a

Nous constatons qu'un répertoire 'system_bios_ven_0x1028_dev_0x014a_version_a12' est présent, ce qui veut dire que le BIOS 'A12' est présent. Le format d'archivage DELL étant le suivant : 'system_bios_ven_0x1028_dev_SYSTEM_ID_version_BIOS_VERSION'.

Nous allons donc télécharger le fichier 'bios.hdr' présent dans ce répertoire :

cd /usr/local/src/
wget http://linux.dell.com/repo/firmware/bios-hdrs/system_bios_ven_0x1028_dev_0x014a_version_a12/bios.hdr

Upgrade du BIOS

Avant de lancer la mise à jour, nous lancer le module DELL de Debian :

modprobe dell_rbu

Nous pouvons ensuite vérifier sa présence avec la commande :

lsmod | grep dell

Qui devrait nous retourner :

dell_rbu                6028  0
firmware_class          6816  1 dell_rbu

(Les chiffres 6028 & 6816 correspondent à la taille des modules, donc ils peuvent changer).
Maintenant que tout est vérifié, nous pouvons donc lancer notre mise à jour avec la commande :

dellBiosUpdate -u -f bios.hdr

Si il retourne une erreur indiquant qu'il ne trouve pas le binaire 'dellBiosUpdate', il suffira de lancer la commande complète :

/usr/sbin/dellBiosUpdate -u -f bios.hdr

Nous devrions avoir un retour de ce type :

Supported RBU type for this system: (MONOLITHIC, PACKET)
Using RBU v2 driver. Initializing Driver.
Setting RBU type in v2 driver to: MONOLITHIC (FORCED)
Prep driver for data load.
Writing RBU data (4096bytes/dot): ..................................................................................................................................................
Notify driver data is finished.
Activate CMOS bit to notify BIOS that update is ready on next boot.
Update staged sucessfully. BIOS update will occur on next reboot.

Le plus important étant la présence de la dernière ligne, soit 'Update staged sucessfully. BIOS update will occur on next reboot.'.
Nous redémarrons donc l'équipement, et pouvons constater lors du démarrage que le BIOS se met bien à jour.
Une fois que l'équipement est de nouveau joignable, nous pouvons également vérifier avec la commande '/usr/sbin/getSystemId' qui nous retournera ce coup-ci :

Libsmbios:    2.0.3
System ID:    0x014A
Service Tag:  DPWxxxx
Express Service Code: 2986399xxxx
Product Name: PowerEdge 1750
BIOS Version: A12
Vendor:       Dell Computer Corporation
Is Dell:      1

Le BIOS 'A12' est donc bien présent sur l'équipement.

Aucun commentaire

Le but de cette opération et donc d'étendre le stockage actuel en RAID1 de 2x 2To, soit 2To de stockage pour passer à un RAID5 avec 4x 2To, soit environ 6To.
Afin de gagner du temps, nous n'allons pas transférer les données présentes sur le RAID1 vers un disque externe en USB, mais faire un RAID1 et un RAID5 dégradés afin de transférer les données.
L'ajout des nouveaux HDD dans la bête s'est passé sans encombre. Nous pouvons donc maintenant vérifier la présence de ces nouveaux HDD via “fdisk -l” :

Disk /dev/sde: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

Disk /dev/sde doesn't contain a valid partition table

Disk /dev/sdf: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

Disk /dev/sdf doesn't contain a valid partition table



Nous voyons bien “/dev/sde” & “/dev/sdf” qui ne disposent d'aucune partition.


Création de la partition

Nous allons donc commencer par créer une partition complète sur l'un de nos nouveaux HDD. Il va nous servir d'étalonnage pour le reste.
thallium:~# fdisk /dev/sde
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x200a1ce9.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-243201, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-243201, default 243201):
Using default value 243201

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.



Nous pouvons vérifier l'état de nos deux HDD :
thallium:~# fdisk -l

Disk /dev/sde: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x200a1ce9

   Device Boot      Start         End      Blocks   Id  System
/dev/sde1               1      243201  1953512001   fd  Linux raid autodetect
Partition 1 does not start on physical sector boundary.

Disk /dev/sdf: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

Disk /dev/sdf doesn't contain a valid partition table



Copie de la partition

Afin de gagner du temps, et surtout d'avoir des tailles de partitions identiques, nous allons dupliquer celle de notre premier disque (/dev/sde) sur le second (/dev/sdf) :
thallium:~# sfdisk -d /dev/sde | sfdisk /dev/sdf
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdf: 243201 cylinders, 255 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
 /dev/sdf: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sdf1            63 3907024064 3907024002  fd  Linux raid autodetect
/dev/sdf2             0         -          0   0  Empty
/dev/sdf3             0         -          0   0  Empty
/dev/sdf4             0         -          0   0  Empty
Warning: no primary partition is marked bootable (active)
This does not matter for LILO, but the DOS MBR will not boot this disk.
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)



Nous pouvons vérifier le bon accomplissement de cette modification :
thallium:~# fdisk -l

Disk /dev/sde: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x200a1ce9

   Device Boot      Start         End      Blocks   Id  System
/dev/sde1               1      243201  1953512001   fd  Linux raid autodetect
Partition 1 does not start on physical sector boundary.

Disk /dev/sdf: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdf1               1      243201  1953512001   fd  Linux raid autodetect
Partition 1 does not start on physical sector boundary.



Les deux disques disposent d'un partitionnement identique.


Identification du RAID1

Nous allons maintenant devoir trouver les HDD qui composent notre RAID1 de 2To :
thallium:~# fdisk -l | grep md |grep 2000
Disk /dev/md0 doesn't contain a valid partition table
Disk /dev/md1 doesn't contain a valid partition table
Disk /dev/md2 doesn't contain a valid partition table
Disk /dev/md4 doesn't contain a valid partition table
Disk /dev/md4: 2000.4 GB, 2000396222464 bytes



Nous avons identifié le “/dev/md4”, maintenant, trouvons les disques qui le composent via “cat /proc/mdstat” :
md4 : active raid1 sdb1[0] sdd1[1]
      1953511936 blocks [2/2] [UU]



Nous savons que ce sont les disques “/dev/sdb” & “/dev/sdd”.


Extraction à chaud d'un HDD du RAID1

Pour se faire, nous allons déjà le passer dans le status FAIL, puis ensuite le REMOVE de sa grappe :
mdadm --manage /dev/md4 --fail /dev/sdd1
mdadm --manage /dev/md4 --remove /dev/sdd1



Nous pouvons vérifier qu'il ne fait plus partie de notre grappe RAID via “cat /proc/mdstat” :
md4 : active raid1 sdb1[0]
      1953511936 blocks [2/1] [U_]




Copie de la partition (bis)

Nous allons comme précédemment faire exactement le même partitionnement :
thallium:~# sfdisk -d /dev/sde | sfdisk /dev/sdd
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdd: 243201 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sdd1          0+ 243200  243201- 1953512001   fd  Linux raid autodetect
/dev/sdd2          0       -       0          0    0  Empty
/dev/sdd3          0       -       0          0    0  Empty
/dev/sdd4          0       -       0          0    0  Empty
New situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sdd1            63 3907024064 3907024002  fd  Linux raid autodetect
/dev/sdd2             0         -          0   0  Empty
/dev/sdd3             0         -          0   0  Empty
/dev/sdd4             0         -          0   0  Empty
Warning: no primary partition is marked bootable (active)
This does not matter for LILO, but the DOS MBR will not boot this disk.
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1



Nous vérifions que cela est bien pris en compte via “fdisk -l” :
Disk /dev/sdd: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0xa5552bcd

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1               1      243201  1953512001   fd  Linux raid autodetect
Partition 1 does not start on physical sector boundary.

Disk /dev/sde: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x200a1ce9

   Device Boot      Start         End      Blocks   Id  System
/dev/sde1               1      243201  1953512001   fd  Linux raid autodetect
Partition 1 does not start on physical sector boundary.

Disk /dev/sdf: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdf1               1      243201  1953512001   fd  Linux raid autodetect
Partition 1 does not start on physical sector boundary.



Nos 3 HDD sont identiques.


Vérification des MD

Comme nous avons pu le constater une grappe RAID est un MD. Il faut donc en avoir de disponible, et si cela n'est pas le cas, en créer un.
Vérifions ce que nous avons en stock :
thallium:~# ll /dev/ |grep md
drwxr-xr-x  2 root root          40 10 janv. 21:31 md
brw-rw----  1 root disk      9,   0 10 janv. 21:32 md0
brw-rw----  1 root disk      9,   1 10 janv. 21:32 md1
brw-rw----  1 root disk      9,   2 10 janv. 21:32 md2
brw-rw----  1 root disk      9,   4 10 janv. 21:32 md4
drwxr-xr-x  2 root root          60 10 janv. 21:31 .mdadm
lrwxrwxrwx  1 root root           3 10 janv. 21:32 root -> md0



Les 4 présents sont déjà utilisés. Nous allons donc devoir en créer un nouveau :
thallium:~# mknod -m 640 /dev/md3 b 9 3



Vérification que celui-ci est bien présent :
thallium:~# ll /dev/ |grep md
drwxr-xr-x  2 root root          40 10 janv. 21:31 md
brw-rw----  1 root disk      9,   0 10 janv. 21:32 md0
brw-rw----  1 root disk      9,   1 10 janv. 21:32 md1
brw-rw----  1 root disk      9,   2 10 janv. 21:32 md2
brw-r-----  1 root root      9,   3 11 janv. 10:39 md3
brw-rw----  1 root disk      9,   4 10 janv. 21:32 md4
drwxr-xr-x  2 root root          60 10 janv. 21:31 .mdadm
lrwxrwxrwx  1 root root           3 10 janv. 21:32 root -> md0




Création du RAID5

Nous allons donc nous lancer dans la création de notre nouveau RAID5 avec 4HDD au final. Par contre, comme indiqué au début, nous allons partir sur du dégradé, afin de faire nos transferts de fichiers entre l'ancien et le nouveau RAID.
Pour ce faire, nous allons donc créer notre RAID5 en précisant qu'un disque est absent :
thallium:~# mdadm --create --verbose /dev/md3 --level=5 --assume-clean --raid-devices=4 missing /dev/sdd1 /dev/sde1 /dev/sdf1
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: /dev/sdd1 appears to contain a reiserfs file system
    size = 1953511936K
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Sat Oct  8 17:41:53 2011
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: size set to 1953510400K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md3 started.



Nous pouvons vérifier que notre nouveau RAID5 est présent, et fonctionnel :
thallium:~# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md3 : active (auto-read-only) raid5 sdf1[3] sde1[2] sdd1[1]
      5860531200 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]

md4 : active raid1 sdb1[0]
      1953511936 blocks [2/1] [U_]

md2 : active raid1 sda3[2] sdc3[1]
      943560550 blocks super 1.2 [2/2] [UU]

md1 : active (auto-read-only) raid1 sdc2[0] sda2[1]
      3903680 blocks [2/2] [UU]

md0 : active raid1 sdc1[0] sda1[1]
      29294400 blocks [2/2] [UU]

unused devices: <none>



Au passage, nous pouvons noter que les “md3” & “md4” sont tous les deux en dégradés.


Formatage du volume RAID5

Afin d'avoir un maximum d'espace disque, et un système de fichier qui tient la route, nous allons formater le volume en ReiserFS :
thallium:~# mkfs.reiserfs /dev/md3
mkfs.reiserfs 3.6.21 (2009 www.namesys.com)

A pair of credits:
Nikita Danilov  wrote  most of the core  balancing code, plugin infrastructure,
and directory code. He steadily worked long hours, and is the reason so much of
the Reiser4 plugin infrastructure is well abstracted in its details.  The carry
function, and the use of non-recursive balancing, are his idea.

Joshua Macdonald wrote the first draft of the transaction manager. Yuri Rupasov
did testing  and benchmarking,  plus he invented the r5 hash  (also used by the
dcache  code).  Yura  Rupasov,  Anatoly Pinchuk,  Igor Krasheninnikov,  Grigory
Zaigralin,  Mikhail  Gilula,   Igor  Zagorovsky,  Roman  Pozlevich,  Konstantin
Shvachko, and Joshua MacDonald are former contributors to the project.


Guessing about desired format.. Kernel 2.6.32-5-686-bigmem is running.
Format 3.6 with standard journal
Count of blocks on the device: 1465132800
Number of blocks consumed by mkreiserfs formatting process: 52924
Blocksize: 4096
Hash function used to sort names: "r5"
Journal Size 8193 blocks (first block 18)
Journal Max transaction length 1024
inode generation number: 0
UUID: 72b2d86f-e51c-4fb9-aff9-73e054253d81
ATTENTION: YOU SHOULD REBOOT AFTER FDISK!
        ALL DATA WILL BE LOST ON '/dev/md3'!
Continue (y/n):y
Initializing journal - 0%....20%....40%....60%....80%....100%
Syncing..ok
ReiserFS is successfully created on /dev/md3.




Mise à jour config RAID

Nous devons informer MDADM qu'il doit prendre en compte ce nouveau RAID.
Nous allons commencer par effectuer une copie de sauvegarde du fichier de configuration :
thallium:~# cp -p /etc/mdadm/mdadm.conf /root/mdadm.conf.20130111-1054



Puis relancer un scan avec injection du résultat dans la configuration :
thallium:~# mdadm --misc --detail --brief /dev/md* 2> /dev/null | tee -a /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata=0.90 UUID=9d4abe9b:45b62929:7a1a79cd:68e069cf
ARRAY /dev/md1 metadata=0.90 UUID=ed9b1fc4:37d4b75e:7a1a79cd:68e069cf
ARRAY /dev/md2 metadata=1.2 name=thallium:2 UUID=1239bbfa:736a2971:611b4e5a:e9148b29
ARRAY /dev/md3 metadata=1.2 name=thallium:3 UUID=819a977f:37b45a5c:4a67cbb4:8598414f
ARRAY /dev/md4 metadata=0.90 UUID=8019adce:a5db0e7a:7167efe2:badc658a



Nous vérifions que la mise à jour du fichier s'est bien passée, en comparant avec l'ancien fichier :
thallium:~# diff -Nru /root/mdadm.conf.20130111-1054 /etc/mdadm/mdadm.conf
--- /root/mdadm.conf.20130111-1054      2012-01-28 14:59:30.000000000 +0100
+++ /etc/mdadm/mdadm.conf       2013-01-11 10:59:50.000000000 +0100
@@ -33,4 +33,5 @@
 ARRAY /dev/md0 metadata=0.90 UUID=9d4abe9b:45b62929:7a1a79cd:68e069cf
 ARRAY /dev/md1 metadata=0.90 UUID=ed9b1fc4:37d4b75e:7a1a79cd:68e069cf
 ARRAY /dev/md2 metadata=1.2 name=thallium:2 UUID=1239bbfa:736a2971:611b4e5a:e9148b29
+ARRAY /dev/md3 metadata=1.2 name=thallium:3 UUID=819a977f:37b45a5c:4a67cbb4:8598414f
 ARRAY /dev/md4 metadata=0.90 UUID=8019adce:a5db0e7a:7167efe2:badc658a




Création et mise en ligne du point de montage

Il nous faut dans un premier temps créer un point de montage pour effectuer le transfert.
Disposant d'une imagination débordante, nous allons le nommer “md3” :
thallium:~# mkdir /mnt/md3



Nous pouvons dès à présent effectuer le montage :
thallium:~# mount /dev/md3 /mnt/md3



Nous vérifions que le montage s'est bien effectué :
thallium:~# mount
/dev/md0 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/md2 on /mnt/commun type reiserfs (rw)
/dev/md4 on /mnt/nas type reiserfs (rw)
/dev/md3 on /mnt/md3 type reiserfs (rw)



Vérifions de combien d'espace disque nous allons bénéficier suite à cet ajout de disques :
thallium:~# df -h | grep md3
/dev/md3              5,5T   33M  5,5T   1% /mnt/md3




Transfert des données

Maintenant que tout est en place, nous pouvons lancer le transfert des données présentes sur notre RAID1 dégradé (/dev/md4) qui est sur le montage “/mnt/nas”, et transférer tout ça sur notre RAID5 dégradé (/dev/md3) qui lui est sur le montage “/mnt/md3” :
thallium:~# cd /mnt/nas
thallium:~# cp -dpRx . /mnt/md3/



Le transfert va prendre un certain temps, voir même un temps certain … Il faut donc être patient.
Nous pouvons pour plus de sécurité, vérifier que toutes les données sont bien présentes. Pour se faire, nous allons simplement lister les fichiers des deux montages dans un fichier texte, puis les comparer :
thallium:~# cd /mnt/md3
thallium:/mnt/md3# ll -R >> fichiers.hdd
thallium:/mnt/md3# cd /mnt/nas
thallium:/mnt/nas# ll -R >> fichiers.hdd
thallium:/mnt/nas# diff -Nru fichiers.hdd /mnt/md3/fichiers.hdd



N'ayant pas de différence, nous pouvons donc passer à la suite du programme.


Destruction RAID1

Etant donné que tout est transféré, nous pouvons maintenant supprimer notre ancien RAID1. Avant de faire cela, il faut démonter le point de montage :
thallium:~# umount /mnt/nas



Nous allons déjà le passer dans le status FAIL, puis ensuite le REMOVE de sa grappe :
mdadm --manage /dev/md4 --fail /dev/sdb1



Ensuite, nous allons arrêter la grappe en question :
mdadm --manage --stop /dev/md4



Pour finir, nous allons supprimer toutes les informations qui pourraient subsister sur le dernier disque :
mdadm --zero-superblock /dev/sdb1




Copie de la partition (ter)

Nous allons comme précédemment faire exactement le même partitionnement, avec le dernier HDD qui va rejoindre le RAID5 (pour rappel “/dev/sdb”) :
thallium:~# sfdisk -d /dev/sde | sfdisk /dev/sdb
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdb: 243201 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sdb1          0+ 243200  243201- 1953512001   fd  Linux raid autodetect
/dev/sdb2          0       -       0          0    0  Empty
/dev/sdb3          0       -       0          0    0  Empty
/dev/sdb4          0       -       0          0    0  Empty
New situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sdb1            63 3907024064 3907024002  fd  Linux raid autodetect
/dev/sdb2             0         -          0   0  Empty
/dev/sdb3             0         -          0   0  Empty
/dev/sdb4             0         -          0   0  Empty
Warning: no primary partition is marked bootable (active)
This does not matter for LILO, but the DOS MBR will not boot this disk.
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)



Nous vérifions que cela est bien pris en compte via “fdisk -l” :
Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1      243201  1953512001   fd  Linux raid autodetect
Partition 1 does not start on physical sector boundary.

Disk /dev/sdd: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0xa5552bcd

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1               1      243201  1953512001   fd  Linux raid autodetect
Partition 1 does not start on physical sector boundary.

Disk /dev/sde: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x200a1ce9

   Device Boot      Start         End      Blocks   Id  System
/dev/sde1               1      243201  1953512001   fd  Linux raid autodetect
Partition 1 does not start on physical sector boundary.

Disk /dev/sdf: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdf1               1      243201  1953512001   fd  Linux raid autodetect
Partition 1 does not start on physical sector boundary.



Nos 4 HDD sont identiques.


Intégration du HDD dans le RAID5

Nous allons ajouter notre dernier HDD dans la grappe du RAID5, ce qui va avoir pour conséquence reconstruire le RAID et donc de durer très longtemps.
Effectivement, maintenant que le RAID5 va disposer de tous ses disques, il va donc devoir répartir les données et les bits de parités sur l’ensemble des disques de la grappe.
thallium:~# mdadm --manage /dev/md3 --add /dev/sdb1
mdadm: added /dev/sdb1



Nous pouvons vérifier la reconstruction de celui-ci :
thallium:~# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md3 : active raid5 sdb1[4] sdf1[3] sde1[2] sdd1[1]
      5860531200 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]
      [>....................]  recovery =  0.0% (289536/1953510400) finish=337.2min speed=96512K/sec

md2 : active raid1 sda3[2] sdc3[1]
      943560550 blocks super 1.2 [2/2] [UU]

md1 : active (auto-read-only) raid1 sdc2[0] sda2[1]
      3903680 blocks [2/2] [UU]

md0 : active raid1 sdc1[0] sda1[1]
      29294400 blocks [2/2] [UU]

unused devices: <none>




Modifications finales

Maintenant que tout est presque terminé, nous pouvons finaliser les configurations.
Nous devons indiquer le nouveau point de montage dans le fichier “/etc/fstab” afin que celui-ci se monte lors du démarrage.
Nous allons donc avoir un fichier final qui va ressembler à ça :
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/md0        /               ext3    errors=remount-ro 0       1
/dev/md1        none            swap    sw              0       0
/dev/md2        /mnt/commun     reiserfs        defaults        0       0
/dev/md3        /mnt/nas     reiserfs        defaults        0       0
#/dev/md4        /mnt/nas        reiserfs        defaults        0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0



Il nous faut également modifier la configuration de MDADM afin de lui indiquer de ne plus chercher de MD4. Notre fichier de configuration “/etc/mdadm/mdadm.conf” sera donc comme celui-ci :
ARRAY /dev/md0 metadata=0.90 UUID=9d4abe9b:45b62929:7a1a79cd:68e069cf
ARRAY /dev/md1 metadata=0.90 UUID=ed9b1fc4:37d4b75e:7a1a79cd:68e069cf
ARRAY /dev/md2 metadata=1.2 name=thallium:2 UUID=1239bbfa:736a2971:611b4e5a:e9148b29
ARRAY /dev/md3 metadata=1.2 name=thallium:3 UUID=819a977f:37b45a5c:4a67cbb4:8598414f
#ARRAY /dev/md4 metadata=0.90 UUID=8019adce:a5db0e7a:7167efe2:badc658a

Aucun commentaire

Copier les partitions

sfdisk -d /dev/sda | sfdisk /dev/sdb

fdisk -l
Disk /dev/sda: 73.2 GB, 73200476160 bytes
255 heads, 63 sectors/track, 8899 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               2          25      192780   fd  Linux
/dev/sda2              26         279     2040255   fd  Linux swap / Solaris
/dev/sda3   *         280        8899    69240150   fd  Linux
Disk /dev/sdb: 73.2 GB, 73200476160 bytes
255 heads, 63 sectors/track, 8899 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               2          25      192780   fd  Linux
/dev/sdb2              26         279     2040255   fd  Linux swap / Solaris
/dev/sdb3   *         280        8899    69240150   fd  Linux

Modifier le type des partitions

fdisk /dev/sdb
Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

On doit obtenir :

fdisk -l /dev/sdb
Disk /dev/sdb: 73.2 GB, 73200476160 bytes
255 heads, 63 sectors/track, 8899 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               2          25      192780   fd  Linux raid autodetect
/dev/sdb2              26         279     2040255   fd  Linux raid autodetect
/dev/sdb3   *         280        8899    69240150   fd  Linux raid autodetect

Création des volumes RAID1

On crée les RAID1 sans /dev/sda :

mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3

Si les /dev/md* n'existe pas :

mknod -m 640 /dev/md0 b 9 0
mknod -m 640 /dev/md1 b 9 1
mknod -m 640 /dev/md2 b 9 2

La commande 'cat /proc/mdstat' doit nous donner 3 RAID dégradé :

cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[1]
      4594496 blocks [2/1] [_U]
md1 : active raid1 sdb2[1]
      497920 blocks [2/1] [_U]
md0 : active raid1 sdb1[1]
      144448 blocks [2/1] [_U]
unused devices: <none>


Formater les volumes RAID

mke2fs -j /dev/md0
mkswap /dev/md1
mke2fs -j /dev/md2

Modification des fichiers système

/etc/mdadm.conf

cp /usr/share/doc/mdadm-2.5.4/mdadm.conf-example /etc/mdadm.conf
mdadm --examine --scan >> /etc/mdadm.conf

Il doit maintenant y avoir à la fin du fichier les infos concernant les volumes RAID :

ARRAY /dev/md0 level=raid1 num-devices=2 UUID=72d23d35:35d103e3:01b5209e:be9ff10a
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=a50c4299:9e19f9e4:01b5209e:be9ff10a
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=99fee3a5:ae381162:01b5209e:be9ff10a

/etc/fstab & /etc/mtab
On replace les /dev/sda* par les /dev/md* correspondant :

/dev/md2                /                       ext3    defaults        1 1
/dev/md0                /boot                   ext3    defaults        1 2
/dev/md1                swap                    swap    defaults        0 0
none                    /dev/pts                devpts  gid=5,mode=620  0 0
none                    /proc                   proc    defaults        0 0
none                    /dev/shm                tmpfs   defaults        0 0

/dev/md2 / ext3 rw 0 0
none /proc proc rw 0 0
none /dev/pts devpts rw,gid=5,mode=620 0 0
/dev/md0 /boot ext3 rw 0 0
none /dev/shm tmpfs rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0

/boot/grub/grub.conf

default=0
fallback=1
timeout=5
hiddenmenu
title CentOS (Default)
        root (hd1,0)
        kernel /vmlinuz ro root=/dev/md2
        initrd /initrd-raid1
title CentOS (Default)
        root (hd0,0)
        kernel /vmlinuz ro root=/dev/sda3

La ligne 'initrd /initrd-raid1' est nécessaire si /dev/md2 n'est pas trouvé au démarrage. Si besoin du initrd, il faut le générer :

uname -a
Linux mamachine.lan2wan.fr 2.6.18-prep #1 SMP Tue Mar 4 15:02:47 CET 2008 x86_64 x86_64 x86_64 GNU/Linux
cd /boot
mkinitrd --with=raid1 initrd-raid1 2.6.18-prep

Copie du système

mkdir /mnt/md0
mkdir /mnt/md2
mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2
cp -dpRx / /mnt/md2/
cd /boot
cp -dpRx . /mnt/md0/

Mise à jour du chargeur de démarrage (GRUB)

grub
  root (hd0,0)
  setup (hd0)
  root (hd1,0)
  setup (hd1)
  quit

Ensuite on reboot.

Modification des partitions de /dev/sda

fdisk /dev/sda
Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

fdisk -l /dev/sda
[...]
/dev/sda1               2          25      192780   fd  Linux raid autodetect
/dev/sda2              26         279     2040255   fd  Linux raid autodetect
/dev/sda3   *         280        8899    69240150   fd  Linux raid autodetect

Ajout des disques dans les RAIDs

mdadm --add /dev/md0 /dev/sda1
mdadm --add /dev/md1 /dev/sda2
mdadm --add /dev/md2 /dev/sda3

Si une erreur se produit (ex: /dev/sda3 ressource busy)
Modifier /boot/grub/grub.conf, remplacer hd1 par hd0

title CentOS (Default)
        root (hd0,0)
        kernel /vmlinuz ro root=/dev/md2
        initrd /initrd-raid1

Rebooter.
'fuser -mv /dev/sda3' ne doit plus rien renvoyer.
Ensuite relancer 'mdadm –add /dev/md2 /dev/sda3'
Les raids vont se reconstruire :

cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[2] sdb3[1]
      4594496 blocks [2/1] [_U]
      [=====>...............]  recovery = 29.7% (1367040/4594496) finish=0.6min speed=85440K/sec

md1 : active raid1 sda2[0] sdb2[1]
      497920 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
      144448 blocks [2/2] [UU]

unused devices: <none>

Dernière modification GRUB

Modifier le '/boot/grub/grub.conf'
Permettra de démarrer si le premier disque est cassé :

default=0
fallback=1
timeout=5
hiddenmenu
title CentOS (Default)
        root (hd0,0)
        kernel /vmlinuz ro root=/dev/md2
        initrd /initrd-raid1
title CentOS (Default)
        root (hd1,0)
        kernel /vmlinuz ro root=/dev/md2
        initrd /initrd-raid1

Normalement pas besoin, mais juste pour être sûr que grub est bien installé sur les 2 disques :

grub
  root (hd0,0)
  setup (hd0)
  root (hd1,0)
  setup (hd1)
  quit

Si lors de cette étape, une erreur du type 'Checking if “/boot/grub/stage1” exists… no' se produit, il faut réinstaller grub dans la partition '/boot' d'un des disques en RAID :

grub-install /dev/hdX

Ou 'hdX' est votre disque (à remplacer par hda voir sda)