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

 

Si on a des services qui tournent comme mysql (mariadb), apache, php7.0-fpm, il est préférable de les arrêter :

lambda_user@myweb:~ $ sudo systemctl stop apache2 mysql php7.0-fpm

 

De même, si on a installé log2ram, il faut arrêter ce service sinon les logs ne seront pas recopiés sur le disque :

lambda_user@myweb:~ $ sudo systemctl stop log2ram.service

 

On peut même désactiver le service ensuite, car il n'a plus d'utilité si on a transféré l'ensemble du système sur un disque dur (par contre il reste utile si on se sert d'une clé USB) :

lambda_user@myweb:~ $ sudo systemctl disable log2ram.service

 

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

 

On recherche dans la ligne root=/dev/ ou root=PARTUUID

boot/cmdline.txt avant modification

 

Nous allons remplacer root=/dev/mmcblk0p2 ou root=PARTUUID=xxxxxxxx-02 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 /mnt/etc/fstab

mnt fstab dernière version

 

en remplaçant /dev/mmcblk0p2 ou PARTUUID=xxxxxxxx-02 par /dev/sda1 :

fstab modifié

 

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.

 

Pour déplacer la partition de démarrage (boot : mmcblk0p1) sur une micro-carte SD de plus petite taille : voir cet article.

 

You may also like...

19 Responses

  1. old dit :

    merci merci merci et encore merci !! migration d’une installation Yunohost sur disque externe réussie grâce à cet excellent tuto

  2. pascal dit :

    super marche bien pour moi !

    je n’ai pas réussi la méthode pour raspi3 permettant de booter sans carte sd
    http://www.imnotgeek.com/15-11-2016/raspberry-pi-3-booter-sur-un-disque-cle-usb-28534

    • SoozX dit :

      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.

      • pascal dit :

        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)

  3. dodolecodeur dit :

    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,

    • SoozX dit :

      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 !

  4. 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

  5. thibaud dit :

    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

    • SoozX dit :

      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

  6. Xavier dit :

    Bonjour,

    Merci pour ce top tuto.
    Fonctionne très bien.

    Je vais pouvoir reprendre mon projet domotique.

  7. Michael M dit :

    Bonjour,
    Impeccable, super tuto.
    grand merci.
    Michaël

  8. ced dit :

    Bonjour,
    Super tuto!!! Cela fonctionne bien avec une cle USB (de meme taille) mais lorsque je vaux faire la meme manip avec un HDD de 500Go, le rpi3 ne boot plus….

    Des idées où regarder? svp

    • SoozX dit :

      Bonjour,
      Normalement, la taille du support externe ne devrait pas faire de différence (sauf bien sûr s’il ne peut pas contenir l’intégralité des données présentes sur la SDcard).
      Je viens de refaire la manipulation avec la dernière version de Raspbian (Stretch) depuis une carte Sd de 8Go à une partition sur HDD de 75Go sans difficulté.

      Il faudrait vérifier que le disque dur (ou la partition utilisée sur le disque dur) est bien formaté avec un système de fichiers ext4 (et non pas NTFS ou FAT), que le nom de device (sda1 par exemple) est le bon lorsqu’il est branché sur le Pi.

  9. Bob dit :

    Bonjour,
    Merci beaucoup pour ce tuto.
    Après copie du dossier racine sur mon disque dur externe, il m’a été nécessaire de créer à nouveau le dossier /var/log/apache2/.
    A présent il m’est impossible de me connecter via l’interface web : la page est entièrement blanche.
    Avez-vous une idée sur l’origine de ce problème?
    Merci par avance.

    • SoozX dit :

      Bonjour,

      Avez-vous bien suivi cette procédure pour recréer /var/ log/apache2 :
      (attention, c’est /var/log/apache2 et non pas /var/log/apache2/ )

      $ sudo su
      # 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).

  10. Chris dit :

    Bonsoir. Tout d’abord un grand merci pour tes tutos très pédagogiques.
    Chez moi, nextcloud a été récalcitrant mais fonctionne maintenant très bien.
    Pour Bob, j’ai rencontré le même problème de page blanche. J’ai suivi le tuto, mais pourquoi? comment? la copie de /var/log semble avoir poser problème.
    Tout d’abord plus de /var/log/apache2 comme décrit auparavant et pour Bob plus de /var/log/mysql
    J’ai fais les commandes suivantes:
    sudo journalctl -xe => m’a retourné en autre: [ERROR] mysqld: File ‘/var/log/mysql/mariadb-bin.index’ not found (Errcode: 2 “No such file or directory”)
    sudo systemctl stop apache2 mysql php7.0-fpm
    sudo mkdir /tmp1 ( création d’un point de montage temporaire)
    sudo mount /dev/mmcblk0p2 /tmp1 ( partition mmcblk0p2 correspond à mon ancien / sur la SDCARD)
    cd /var/
    sudo rsync -av /tmp1/var/log ./ (je refais à nouveau une syncro depuis l’ancien /var/log de la SDcard vers le nouveau /var/log du disque USB)
    sudo systemctl start mariadb
    sudo systemctl start apache2 mysql php7.0-fpm
    sudo umount /tmp1
    sudo rmdir /tmp1
    Test depuis un poste sur internet en https et sur un PC en local en http OK
    Merci encore SoozX

    • SoozX dit :

      Ma faute, ma grande faute …

      Tant que log2ram fonctionne, les logs ne sont pas recopiés car ils ne sont pas sur la carte SD mais en mémoire vive …
      Il faut donc arrêter log2ram pour qu’ils soient recopiés sur le disque dur avant la commande rsync.
      J’ai modifié le tuto en ce sens.

      • Bob dit :

        Bonjour,

        Je m’y remets seulement…
        En effet, le problème est à présent réglé.

        Merci Chris d’y avoir passé du temps pour résoudre le problème.
        Merci encore Soozx pour tes précieux tutos.

Laisser un commentaire

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