Raspberry Pi : déplacer Raspbian sur un disque dur externe ou une clé USB

disque dur usb

Par défaut, le système d'exploitation Raspbian pour le Raspberry Pi est installé sur une microcarte SD.

On a l'avantage du faible encombrement et d'une consommation électrique très réduite.

Les inconvénients sont la lenteur de l'écriture sur la microcarte SD, sa faible longévité et selon la carte, le manque d'espace disque.

On peut choisir de déplacer le système :

  • sur une clé USB pour disposer d'un espace plus important (peu de gains en revanche sur la durée de vie et la rapidité),
  • sur un disque dur USB externe qui a tous les avantages sauf celui de la dépense électrique.

Le Raspberry Pi 3 est capable d'alimenter un disque externe. Pour le Raspberry Pi 2, il faudra prévoir une source d'alimentation électrique séparée.

Ce guide explique comment faire la migration du système depuis la carte SD sur le disque ou la clé USB.

Préparation de la migration

Pour commencer, il est préférable d'arrêter le Raspberry Pi avant de brancher le disque ou la clé.

Dans cet exemple, j'ai pris une clé USB ayant déjà servi.

 

On se connecte déjà en SSH au pi (remplacer lambda_user par votre utilisateur sur le Pi)

soozx@soozx:~ $ ssh lambda_user@192.168.0.15

 

et on arrête proprement le Pi :

lambda_user@myweb:~ $ sudo halt

 

Après avoir débranché le Pi, on insère le disque USB puis on rebranche.

On se reconnecte sur le Pi :

soozx@soozx:~ $ ssh lambda_user@192.168.0.15

 

puis on liste les disques connectés :

lambda_user@myweb:~ $ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 7,3G 0 disk
└─sda1 8:1 1 7,3G 0 part
mmcblk0 179:0 0 58,6G 0 disk
├─mmcblk0p1 179:1 0 63M 0 part /boot
└─mmcblk0p2 179:2 0 3,9G 0 part /

 

Nous trouvons ici deux disques :

  • sda avec une partition sda1 non montée
  • mmcblk0 avec deux partitions mmcblk0p1 montée sur /boot et mmcblk0p2 montée sur / qui est la racine du système d'exploitation.

L'objectif final sera de transférer / sur sda. Nous voyons que mmcblk0p2 a une taille de 3,9G ici. Il faudra au moins autant de place sur le disque dur.

 

Nous installons si ce n'est pas déjà fait l'utilitaire rsync qui nous permettra de synchroniser les fichiers depuis la carte SD sur le disque :

lambda_user@myweb:~ $ sudo apt install rsync

Préparation du disque dur externe

Nous allons maintenant préparer le disque dur externe.

Cette étape est inutile si vous disposez déjà d'une partition inutilisée de taille suffisante et formatée en ext4 sur le disque dur.

Attention, les données présentes sur le disque vont être effacées.

 

lambda_user@myweb:~ $ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

 

Par sécurité, nous vérifions que nous sommes bien sur le bon disque avec la commande 'p' (print) qui va lister les partitions présentes :

Command (m for help): p
Disk /dev/sda: 7,3 GiB, 7811891200 bytes, 15257600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0080ea51

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 15257599 15255552 7,3G c W95 FAT32 (LBA)

Ici, nous avons un disque de 7.3G qui contient une seule partition en format FAT32.

 

Nous allons effacer la partition avec la commande 'd' (delete) :

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Si vous avez plusieurs partitions, répéter cette commande pour chacune d'entre elles.

 

Enfin, on écrit les changements sur le disque avec la commande 'w' (write) :

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

 

Nous allons maintenant créer une partition pour accueillir le système Raspbian (le boot ou démarrage devra rester sur la carte SD) :

lambda_user@myweb:~ $ sudo fdisk /dev/sda

 

La commande 'n' pour new va permettre la création de la partition :

Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): [taper Entrée ou p]

Partition number (1-4, default 1): [taper Entrée ou 1]

First sector (2048-15257599, default 2048): [taper Entrée]
Last sector, +sectors or +size{K,M,G,T,P} (2048-15257599, default 15257599): [Entrée pour utiliser tout le disque,
 ou une taille suffisante par exemple +6G]

Created a new partition 1 of type 'Linux' and of size 7,3 GiB.

 

On écrit les changements avec 'w' :

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

 

Nous allons ensuite formater la partition créée :

lambda_user@myweb:~ $ sudo mke2fs -t ext4 -L rootfs /dev/sda1

 

Nous pouvons passer à la migration du système sur le disque.

Migration du système Raspbian sur le disque ou la clé USB

On commence par monter la partition nouvellement créée dans le répertoire mnt :

lambda_user@myweb:~ $ sudo mount /dev/sda1 /mnt

 

Puis on copie l'ensemble de la racine (/) présente sur la carte SD vers le disque dur monté sur mnt :

lambda_user@myweb:~ $ sudo rsync -avx / /mnt

(...)

var/tmp/

sent 985,682,776 bytes received 570,984 bytes 2,888,005.15 bytes/sec
total size is 983,418,703 speedup is 1.00

 

On indique au programme de démarrage que le système se trouve maintenant sur le disque externe (par prudence, nous faisons une copie du fichier avant de le modifier si nous souhaitons revenir en arrière) :

lambda_user@myweb:~ $ sudo cp /boot/cmdline.txt /boot/cmdline.txt.bak

lambda_user@myweb:~ $ sudo nano /boot/cmdline.txt

 

boot/cmdline.txt avant modification

 

Nous allons remplacer root=/dev/mmcblk0p2 par root=/dev/sda1 :

/boot/cmdline.txt après modification

 

Ctrl-o pour enregistrer, Ctrl-x pour fermer.

 

Une autre modification de fichier pour que le programme de démarrage attende la mise en ligne du disque USB :

lambda_user@myweb:~ $ sudo nano /boot/config.txt

 

A la fin du fichier, nous ajoutons program_usb_timeout=1 :

 

Ctrl-o pour enregistrer, Ctrl-x pour fermer.

 

Enfin nous modifions la table des fichiers de fstab :

lambda_user@myweb:~ $ sudo nano /etc/fstab

fstab avant modification

 

en remplaçant /dev/mmcblk0p2 par /dev/sda1 :

fstab après modification

 

Ctrl-o pour enregistrer, Ctrl-x pour fermer.

 

Redémarrage et vérification

La migration sur le disque USB est terminée, nous pouvons redémarrer :

lambda_user@myweb:~ $ sudo reboot
soozx@soozx:~ $ ssh lambda_user@192.168.0.15

 

On vérifie avec la commande lsblk :

lambda_user@myweb:~ $ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 7,3G 0 disk
└─sda1 8:1 1 7,3G 0 part /
mmcblk0 179:0 0 58,6G 0 disk
├─mmcblk0p1 179:1 0 63M 0 part /boot
└─mmcblk0p2 179:2 0 3,9G 0 part

 

On voit ici que la partition / (c'est à dire le système d'exploitation) est maintenant montée sur sda1.

La partition mmcblk0p2 est quant à elle inutilisée. Elle contient toutefois la copie du système avant la migration.

 

 

9 Comments

    1. SoozX

      Bonjour,
      Je n’ai pas essayé, je suis resté au Pi 2 …
      En même temps, sauf si vous voulez réutiliser votre sdcard pour autre chose, il y a peu d’inconvénients à continuer à booter dessus.
      Les SDcard se détériorent lors des écritures multiples pas lors des simples lectures (à ma connaissance).
      Or le boot est rarement modifié (uniquement lors des mises à jour de l’application de démarrage ce qui est très peu fréquent).

      Sur le site de raspberry.org (https://www.raspberrypi.org/blog/pi-3-booting-part-i-usb-mass-storage-boot/) il est par ailleurs indiqué que toutes les clés usb ne sont pas compatibles.
      C’est peut être là que se situe le problème.

      1. pascal

        j’ai utilisé un disque dur externe qui trainait (300 Go j’ai le temps de voir venir)
        En fait je pense que c’est ma version de raspian qui est trop ancienne pour le boot sur disque dur externe (mais c’est une image Jeedom)

  1. Bonjour à tous !

    D’abord merci beaucoup SoozX pour tes tutos ! J’ai pu installer nextcloud très facilement (après m’être un peu cassé les dents sur le net avec d’autres…je suis nouveau sur Linux !)

    Dans l’enthousiasme, j’ai souhaité immédiatement déplacer raspbian sur un disque dur externe ce qui semblait a priori avoir été fait avec succès.

    Problème: mon serveur n’est plus accessible

    J’ai effectué quelques tests:

    OUTPUT de systemctl -l status apache2
    ● apache2.service – LSB: Apache2 web server
    Loaded: loaded (/etc/init.d/apache2)
    Drop-In: /lib/systemd/system/apache2.service.d
    └─forking.conf
    Active: failed (Result: exit-code) since mar. 2017-06-06 12:17:25 CEST; 24min ago
    Process: 1878 ExecStart=/etc/init.d/apache2 start (code=exited, status=1/FAILURE)

    OUTPUT DE sudo apache2ctl configtest
    Syntax OK

    En fouillant un peu sur le net, j’ai cru comprendre qu’il fallait créer les sous-répertoires de /var/log au démarrage, mais je suis un peu perdu avec cette manip…

    Des idées de ce qui pourrait régler le soucis ?

    Merci d’avance pour vos réponse,

    1. SoozX

      Bizarre,
      Si c’est un problème avec /var/log, systemctl devrait l’indiquer et configtest aussi.
      Vérifiez déjà que le /var/log/apache2 est toujours existant :
      $ sudo su
      # ls /var/log/apache2
      S’il existe, relancer apache (# systemctl restart apache2), puis consulter le log (# nano /var/log/apache2/error.log) pour voir où est le problème.

      Si /var/log/apache2 est absent, il suffit de le recréer :
      # mkdir -p /var/log/apache2
      # chmod 750 /var/log/apache2
      # chown -R root:adm /var/log/apache2
      Puis redémarrer apache2
      # systemctl restart apache2
      et
      # exit (pour revenir en utilisateur normal).

      Par ailleurs, si vous avez migré votre installation sur un disque dur, vous pouvez vous passer de log2ram qui n’a d’utilité que sur la carte SD (ou sur une clé usb).
      $ sudo systemctl stop log2ram
      $ sudo systemctl disable log2ram

      Bonne chance !

  2. salut
    J’ai eu le même soucis que toi dodolecodeur, si tu suis se que t’as mis SoozX sa devrait retourner à la normal 😉
    Effectivement lors de ma migration le dossier /var/log/apache2/ n’existait plus.
    Prochain tuto soozx (qui peut être intéressant) si tu as le temps sa sera cool de faire un billet pour migrer /boot cette fois sur autre carte sd.
    je me retrouve avec une carte sd de 32Go avec /boot qui prend 41Mo

  3. thibaud

    bonjour,

    merci pour le tuto. Perso j’ai ces lignes qui different totalement des votres. pourriez vous me guider pour savoir ou je dois remplacer /dev/sda1?

    PARTUUID=6ea9421e-01 /boot vfat defaults 0 2
    PARTUUID=6ea9421e-02 / ext4 defaults,noatime 0 1

    1. SoozX

      Depuis les dernières versions postérieures à cet article, Raspbian utilise les identifiants de partition (PARTUUID) et plus les noms de device.

      C’est la racine (“/”) qui doit être déplacée, donc dans ce cas PARTUUID=6ea9421e-02
      qui doit être remplacé par /dev/sda1

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *