---
categories: ['OpenWRT','Système']
date: 2020-09-14T18:03:35+02:00
description: "Comment mettre à niveau correctement OpenWRT… sans perdre de données de configuration utilisateur (+) explications pour la migration vers une version majeure ; routeurs servis comme exemple : Ubiquiti EdgeRouter X, Xiaomi Redmi AC2100"
draft: false
tags: ['OpenWRT','sysupgrade','opkg','sysadmin','Ubiquiti','EdgeRouter','Xiaomi','Redmi','AC2100']
title: "OpenWRT : Gérer correctement le processus de mise à niveau (sysupgrade)"
translationKey: "openwrt-sysupgrade"
---
## Description
OpenWRT a un outil pour faire la mise à niveau d'une version à une autre
nommé **sysupgrade**. Il est possible de l'invoquer depuis l'interface web
d'administration LuCI.
Si le procédé vous intéresse plus que le faire par CLI, lisez la note en
question : {{< anchor "Flash depuis LuCI" "Flash depuis LuCI" >}}
---
Le procédé suivant explique pas-à-pas la mise à niveau tout en mode CLI,
tout en préservant la configuration utilisateur…
## Procédé
La première chose à laquelle nous veillons est d'installer l'outil `curl`,
car par défaut le binaire `wget` nativement installé ne supporte pas TLS.
`# opkg install curl`
### opkgscript.sh
Le script `opkgscript.sh` permet de sauvegarder la liste des paquets
installés en sus de la base.
⇒ Récupèrons le depuis [opkgscript.sh](https://raw.githubusercontent.com/richb-hanover/OpenWrtScripts/master/opkgscript.sh) :
`$ curl -O https://raw.githubusercontent.com/richb-hanover/OpenWrtScripts/master/opkgscript.sh`
⇒ Donnons les droits d'exécution nécessaire :
`# chmod 0700 opkgscript.sh`
⇒ Sauvegardons la liste des paquets installés - *pour pouvoir restaurer
après la mise à niveau système* :
`# ./opkgscript.sh -v write`
Le script écrit la liste dans un fichier `/etc/config/opkg.installed`.
### Téléchargement firmware
Depuis le répertoire `/tmp`, récupèrons la nouvelle version du firmware :
- e.g. pour la version actuelle :
`# v="23.05.3"`
⇒ pour le routeur **Ubiquiti EdgeRouter X** :
`# curl -O https://downloads.openwrt.org/releases/"${v}"/targets/ramips/mt7621/{openwrt-"${v}"-ramips-mt7621-ubnt-erx-squashfs-sysupgrade.bin,sha256sums}`
⇒ pour le **Xiaomi Redmi Router AC2100** :
`# curl -O https://downloads.openwrt.org/releases/"${v}"/targets/ramips/mt7621/{openwrt-"${v}"-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin,sha256sums}`
#### Vérification du téléchargement
Puis, nous vérifions la somme de contrôle afin de nous assurer du firmware :
`$ sha256sum -c sha256sums 2> /dev/null | grep OK`
⇒ Résultat correct pour le routeur **Xiaomi Redmi Router AC2100** :
`openwrt-23.05.3-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin: OK`
{{< note danger >}}
**ATTENTION** : Si la vérification échoue, allez en discuter sur le forum !
**Ne cherchez pas à mettre à jour avec un micro-logiciel corrompu !!!**
{{}}
### Sauvegarde configuration
L'étape suivante est de vérifier la configuration de la sauvegarde :
`# sysupgrade -l`
Si nécessaire, il faut éditer le fichier pour ajouter certains répertoires/fichiers,
ainsi dans le cas où un {{< inside2 l="sys/openwrt/sudo" t="utilisateur a été ajouté correctement au groupe `sudo`" >}},
il faudra ajouter ce qui suit dans le fichier `/etc/sysupgrade.conf` :
* /etc/sudoers
* /etc/sudoers.d/
Vérifions à nouveau - et sauvegardons la configuration :
`# sysupgrade -b /tmp/backup-${HOSTNAME}-$(date +%F).tar.gz`
{{< note info >}}On peut remarquer que dans la sauvegarde en question se
trouve le fichier `/etc/config/opkg.installed` précédemment créé avec
le script `opkgscript.sh`.
{{}}
---
Puis, il faut récupèrer cette sauvegarde :
`$ scp root@openwrt:/tmp/backup*.tar.gz $(pwd)`
*(où 'openwrt' est l'adresse IP de votre routeur…)*
{{< note info >}}
Si vous avez le message d'erreur suivant :
`ash: /usr/libexec/sftp-server: not found`
Merci de lire la note suivante {{< anchor "À-propos de SSH v9.0 et supérieure" "À-propos de SSH v9.0 et supérieure" >}}
---
La note {{< anchor "À-propos de la libération de la mémoire" "Libération mémoire" >}} peut-être
intéressante à lire, mais peu utile dans le contexte des deux routeurs
mis en exemple, tel que le Ubiquiti EdgeRouter X ou le Xiaomi Redmi Router AC2100
car dans leur cas est embarquée une RAM conséquente.
{{}}
---
### Mise à Niveau Système
Passons à la mise à niveau système, tel que :
`# sysupgrade -v openwrt-"${v}"-*-sysupgrade.bin`
⇒ Exemple, pour le routeur Ubiquiti EdgeRouter X :
```ash
# sysupgrade -v openwrt-"${v}"-ramips-mt7621-ubnt-erx-squashfs-sysupgrade.bin`
(date) upgrade: Saving config files...
etc/config/dhcp
etc/config/dhcp-opkg
etc/config/dropbear
etc/config/firewall
etc/config/https-dns-proxy
etc/config/https-dns-proxy-opkg
etc/config/luci
etc/config/luci-opkg
etc/config/network
etc/config/openssl
etc/config/opkg.installed
etc/config/rpcd
etc/config/system
etc/config/travelmate
etc/config/ubootenv
etc/config/ucitrack
etc/config/ucitrack-opkg
etc/config/uhttpd
etc/config/uhttpd-opkg
etc/config/unbound
etc/config/unbound-opkg
etc/config/wifi_schedule
etc/config/wifi_schedule-opkg
etc/config/wireless
etc/crontabs/root
etc/dropbear/authorized_keys
etc/dropbear/dropbear_ed25519_host_key
etc/dropbear/dropbear_rsa_host_key
etc/fw_env.config
etc/group
etc/hosts
etc/inittab
etc/luci-uploads/.placeholder
etc/nftables.d/10-custom-filter-chains.nft
etc/nftables.d/README
etc/opkg/keys/0b26f36ae0f4106d
etc/opkg/keys/1035ac73cc4e59e3
etc/opkg/keys/2f8b0b98e08306bf
etc/opkg/keys/4d017e6f1ed5d616
etc/opkg/keys/5151f69420c3f508
etc/opkg/keys/72a57f2191b211e0
etc/opkg/keys/792d9d9b39f180dc
etc/opkg/keys/9ef4694208102c43
etc/opkg/keys/b2d571e0880ff617
etc/opkg/keys/b5043e70f9a75cde
etc/opkg/keys/c10b9afab19ee428
etc/opkg/keys/dace9d4df16896bf
etc/opkg/keys/dd6de0d06bbd3d85
etc/opkg/keys/f94b9dd6febac963
etc/passwd
etc/profile
etc/rc.local
etc/shadow
etc/shells
etc/shinit
etc/sudoers
etc/sysctl.conf
etc/sysupgrade.conf
etc/unbound/unbound.conf
(date) upgrade: Commencing upgrade. Closing all shell sessions.
```
Normalement votre session SSH va se fermer et le routeur démarrer !
---
{{< note info >}}
Lors de la reconnexion au routeur depuis votre client SSH, il peut
arriver que la connexion soit empêchée avec le message d'erreur suivant :
`WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED`.
Si c'est le cas, merci de lire la note adéquate :
{{< anchor "À-propos de l'identification de l'hôte à distance par SSH" "À-propos de l'identification de l'hôte à distance par SSH" >}}
---
Si jamais vous faites une migration depuis 19.07.x vers 21.02.x ou
supérieure, veuillez lire impérativement la note ad hoc :
{{< anchor "À-propos de la Migration vers ≥ 21.02.0" "À-propos de la Migration vers ≥ 21.02.0" >}}
---
Après le reboot, il peut arriver que le routeur n'ait plus accès à Internet.
Merci de vérifier le fichier `/etc/resolv.conf` et de le reconfigurer si
besoin.
{{}}
#### Vérification nouvelle version
À partir du moment où vous pourrez vous connecter à nouveau à votre routeur,
vous retrouverez l'information relative à votre nouvelle version :
- depuis LuCI, aller vers "Status" > "Overview", celui-ci sera affiché
dans la section "System", face à l'information "Firmware version"
- en SSH, dans la bannière de connexion affichant ce nouveau numéro de
version, comme ci-dessous :
```ash
BusyBox v1.36.1 (2024-03-22 22:09:42 UTC) built-in shell (ash)
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
-----------------------------------------------------
OpenWrt 23.05.3, r23809-234f1a2efa
-----------------------------------------------------
```
---
### resolv.conf
À ce moment de l'étape, il est possible que vous ne puissiez plus
communiquer avec l'extérieur, car le fichier `/etc/resolv.conf` est
toujours configuré pour la résolution de noms en interne, tel que :
```cfg
# cat /etc/resolv.conf
search huc.home
nameserver 127.0.0.1
nameserver ::1
```
Dans ce cas, éditez le fichier pour ajouter un serveur DNS à interroger,
tel que ceux de la FDN : `80.67.169.12` et/ou `80.67.169.40`.
Par exemple :
```sh
# sed -i -e 's/127.0.0.1/80.67.169.12/' /etc/resolv.conf
```
### Mise à Niveau "tiers"
{{}}
Sur les routeurs ayant moins de 4 Mo de NVRAM, les mises à jour peuvent
ne pas avoir lieu correctement ; il est nécessaire de s'assurer d'avoir
au moins 600 Ko de libre.
Essayez de {{< anchor "libérer de la mémoire" "Libération mémoire" >}}…
Ce n'est pas le cas, ni du Ubiquiti EdgeRouter X, ni du Xiaomi Redmi AC2100;
le premier en a 256 Mo, le second 128 Mo.
{{}}
⇒ Effectuons la mise à niveau des paquets tiers :
`# opkg update && opkg list-upgradable`
Normalement suite à la mise à niveau, il ne devrait pas y en avoir.
S'il y en a, exécutez la commande suivante :
```sh
# for name in `opkg list-upgradable | awk '{print $1}'`; do opkg upgrade "${name}"; done
```
### Restauration profil utilisateur
Pour restaurer le profil utilisateur, on répète les étapes d'installation
de l'outil curl, puis du script `opkgscript.sh`.
Et une fois installé et les droits d'exécution attribués, on l'exécute pour
qu'il complète l'installation du "profil utilisateur" :
`# ./opkgscript.sh -v install`
Pour finir, mieux vaut redémarrer !
---
## Ultimes Vérifications
Ensuite, vérifier la configuration de votre routeur :
* que vos différentes interfaces réseaux soient toujours présentes et opérationnelles.
* que votre configuration "firewall" soit correcte ; vérifiez dans les
différents onglets votre configuration.
* que les différents services, que vous auriez précédement installés,
soient toujours opérationnels, tel qu'un tunnel IPv6, OpenVPN, ou tout
service accessible depuis le menu "Services".
---
Voilà…
Normalement, tout devrait fonctionner correctement en suivant
ce processus de mise à niveau.
## Notes
Retrouvez ci-dessous différentes notes d'informations utiles, seulement
dans certains contextes.
### Flash depuis LuCI
Depuis le menu "System" > "Backup / Flash firmware" de l'interface web LuCI :
1/ Il est utile d'aller à l'onglet 'Configuration' pour modifier la liste
des fichiers personnalisés à sauvegarder aussi…
Si les fichiers et autres répertoires relatifs à l'installation de binaires
tiers ne sont pas écrits ici, rien ne sera sauvegardé !
2/ Faites une sauvegarde de votre configuration d'OpenWRT depuis l'onglet
'Actions', section 'Backup'.
3/ Lors du processus pour flasher une nouvelle image de mise à niveau :
⇒ Pensez à utiliser les options :
- la case à cocher **KEEP SETTINGS AND RETAIN THE CURRENT CONFIGURATION**,
à minima
- la case à cocher **INCLUDE IN BACKUP A LIST OF CURRENT INSTALLED PACKAGES AT /ETC/BACKUP/INSTALLED_PACKAGES.TXT**,
qui inclut une liste des paquets supplémentaires installés par vos soins.
Si ces cases ne sont pas cochées, vous perdrez toute votre configuration
lié à OpenWRT.
De même les binaires tiers seront dans tous les cas à réinstaller, voire
à reconfigurer.
Gardez à l'esprit QUE des changements induits par les mises à niveau vers
une version majeure peuvent poser des soucis lors de la migration. Il peut
y avoir des changements critiques.
### À-propos de SSH v9.0 et supérieure
Si votre client SSH est de version ≥ 9.0 :
À partir de la version 9.0 de SSH, le comportement de `scp` a changé.
Dans l'état, la commande ci-dessus échouera avec le message d'erreur suivant :
```
scp router:/tmp/backup-***-2022-04-21.tar.gz .
ash: /usr/libexec/sftp-server: not found
scp: Connection closed
```
Dans les faits, Dropbear ne peut plus discuter avec…
Ajoutez l'option `-O` à la commande `scp`, tel que :
`$ scp -O root@openwrt:/tmp/backup*.tar.gz $(pwd)`
*(cela rétablit l'ancien comportement SFTP de scp)*
Une autre astuce est d'{{< inside2 l="/sys/openwrt/openssh" t="installer le serveur OpenSSH en lieu et place de Dropbear" >}}.
### Libération mémoire
Cette section est surtout utile si le système de fichier `/tmp` n'est pas
assez grand pour enregistrer l'image d'OpenWRT. Les actions ci-dessous
vont permettre de libérer temporairement de l'espace dans la RAM.
Par acquis de conscience, assurons-nous de l'espace mémoire et disque
avec les commandes `free` et `df`, voire `cat /proc/meminfo` ; le but
est de vérifier que **la taille de RAM *libre* est plus importante que la
taille de l'image** téléchargée. Si c'est le cas, nous pouvons continuer
le processus, sinon, nous avons un sérieux problème et il faut en discuter
sur le forum d'OpenWRT.
Prenons un exemple pour mieux comprendre :
⇒ la taille du binaire d'upgrade de la version ci-dessus :
```ash
$ ll -h
(…)
-rw-rw-r-- 1 root root 6.7M Sep 10 13:53 openwrt-22.03.0-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin
(…)
```
elle est donc de 6.7 Mo.
⇒ L'espace disponible dans `/tmp` :
```ash
# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 3.8M 3.8M 0 100% /rom
tmpfs 59.7M 540.0K 59.1M 1% /tmp
/dev/ubi0_1 97.2M 7.8M 84.7M 8% /overlay
overlayfs:/overlay 97.2M 7.8M 84.7M 8% /
tmpfs 512.0K 0 512.0K 0% /dev
```
Dans le contexte du Xiaomi Redmi AC2100, à ce jour, l'espace disponible
est de 59.1 Mo, ce qui est largement suffisant pour récupèrer l'image
de mise à niveau et la gérer.
⇒ De même, l'espace libérée de mémoire :
```ash
# free -m
total used free shared buff/cache available
Mem: 122220 40532 61400 540 20288 46700
Swap: 0 0 0
```
Dans ce contexte, l'espace libre en mémoire est de d'environ 60 Mo. Là,
encore, il y a assez d'espace pour gérer l'image de mise à niveau.
---
**Si** ainsi, dans votre contexte, l'espace totale disponible, soit celle de
la mémoire plus celle en `/tmp` n'est pas assez grande, il est possible
d'essayer ce qui suit - supprimer ce qui devient désormais inutile :
* les fichiers de listes des paquets :
`# rm -r /tmp/opkg-lists/`
* les caches suivants :
`# sync && echo 3 > /proc/sys/vm/drop_caches`
* Et si nécessaire, suppression des pilotes wifi suivants :
`# rm /etc/modules.d/*{80211,ath9k,b43}*`
* Pour finir, vérifiez qu'il n'y ait aucun lien symbolique dans le répertoire
`/etc/modules.d`, si c'est le cas, détruisez-les, ce qui libérera de
la RAM au prochain démarrage, puis **redémarrez absolument OpenWRT**
avant de faire la mise à niveau.
---
### À-propos de l'identification de l'hôte à distance par SSH
Lors de la nouvelle connexion par SSH, il est normalement possible que
vous ayez le droit au message d'erreur suivant :
```sh
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:0atP7BnQQ98EVJciOCBDYAUD245lKm2tbau8BgWMpQ0.
Please contact your system administrator.
Add correct host key in /home/you/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/you/.ssh/known_hosts:93
remove with:
ssh-keygen -f "/home/you/.ssh/known_hosts" -R "192.168.xyz.1"
ED25519 host key for 192.168.xyz.1 has changed and you have requested strict checking.
Host key verification failed.
```
**Ne paniquez pas, c'est normal !**
Ayant changé de version de système d'exploitation, l'identification de l'hôte
a changé aussi.
Appliquez la commande ssh-keygen, telle que donnée, dans votre cas, pour
supprimer l'ancienne identification d'hôte. Puis retentez votre connexion.
{{< note warning >}}Après la mise à niveau, il est très probable que les
machines derrière le routeur n'aient plus accès correctement à Internet.
C'est une phase normale ; ne pas paniquer !
En effet, ne pas oublier que `sysupgrade` supprime toute configuration utilisateur.
L'étape suivante va d'être de restaurer le "profil utilisateur".
{{}}
### À-propos de la Migration vers ≥ 21.02.0
{{}}
**Prérequis matériel minimum** : À partir de la version 21.02.0, le minimum
requis est de 8 Mo de flash, et 64 Mo de RAM.
{{}}
Vous avez choisi de migrer vers la version 21.02.0-*** depuis 19.07.***,
c'est bien !
Mais avant de faire toute autre action, connectez-vous à l'interface web,
puis sur le menu "Interfaces" ; il va vous être proposé de faire une
migration de la configuration, faites-la !
Puis, redémarrez !
---
## Documentations
Comme vous pourrez le lire dans la documentation du wiki OpenWRT, il y a
d'autres méthodes ; celle que je vous propose me semble la plus pertinente…
- [Upgrading OpenWrt firmware using LuCI and CLI](https://openwrt.org/docs/guide-user/installation/generic.sysupgrade)
- [Upgrading OpenWrt firmware using LuCI](https://openwrt.org/docs/guide-quick-start/sysupgrade.luci)
- [Upgrading OpenWrt firmware using CLI](https://openwrt.org/docs/guide-user/installation/sysupgrade.cli)
---