blog.frogeye.fr/_posts/2018-10-22-acceder-a-un-peripherique-bloc-a-distance.markdown

57 lines
3.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
layout: post
title: "Accèder à un périphérique bloc à distance"
date: 2018-10-21 14:00:00
categories: linux rescue disk network
---
<!-- L'article a été rédigé le 2018-10-22 mais Jekyll n'aime pas cette date, allez savoir -->
# Contexte
J'aime beaucoup tester des trucs sur mon serveur, notamment avec le système de fichiers BTRFS.
Sauf que j'ai fait l'erreur de [compresser `/boot` avec une méthode que Grub ne supporte pas](https://askubuntu.com/q/1056396/342879), et après un [reboot malencontreux](https://oc.todon.fr/@GeoffreyFrogeye/100938592425275062) mon système ne peux plus booter.
Qu'à cela ne tienne, je me pointe vers mon panel OVH et démarre en rescue avec une image d'Arch.
Sauf que le mode rescue utilise la clef SSH que j'ai utilisé pour créer le serveur et que j'ai détruite depuis le temps, et [impossible de la changer](https://twitter.com/GeoffreyFrogeye/status/1054315898566250496).
Ma seule option est donc de démarrer sur l'image de rescue « Made in OVH », dont le noyau n'est pas suffisament récent pour monter ma partition BTRFS (à jouer avec le feu...).
Plutôt que de recompiler un noyaux linux avec les bonnes options, je préfère plutôt monter le disque à distance depuis mon laptop et réparer mes dégâts d'ici (ça implique une bonne connexion).
# Réalisation
> **Avertissement :** Je vous donne ma méthode quick'n'dirty à défaut d'avoir trouvé quelque chose qui expliquait ce que je voulais faire simplement, mais je vous renvoie à la documentation si vous souhaitez utiliser ça de manière propre.
> Je ne sais d'ailleurs aucunement si il y a une méthode de correction d'erreur, donc à vos risques et périls (et évitez le Wi-Fi).
Sur la machine avec le périphérique bloc à monter (dans mon cas `/dev/sdb1`), installez le paquet `nbd-server` (ou `ndb` selon la distribution).
Modifiez ensuite le fichier `/etc/nbd-server/config` comme suit:
```ini
[generic]
# Mettez en root ou changez les permissions de l'utilisateur `ndb` pour
# qu'il puisse ouvrir le périphérique voulu.
user = root
group = root
[export1]
exportname = /dev/sdb1
```
Ensuite, lancez `nbd-server 4567`, 4567 étant un numéro de port choisi aléatoirement.
À noter que le processus se fork en arrière plan donc pas de sortie et il vous rend l'accès au terminal tout de suite.
Pour vérifier que ça a fonctionné, `netcat localhost 4567` devrait vous afficher quelque chose commencant par `NDB`.
> **Attention :** En lançant cette commande vous exposez n'importe qui pouvant accéder à la machine peut lire/écrire dans votre périphérique.
> Personnellement j'ai joué la carte du « Qui va trouver et exploiter la vulnérabilité en 10 minutes sérieux ? » mais je vous renvoie au manuel de `ndb-server` pour ajouter au moins un filtrage IP.
Sur la machine qui va monter le périphérique, installez le paquet `nbd-client` (ou `ndb` selon la distribution).
Lancez ensuite `nbd-client -no-optgo 10.0.0.42 7894 -N export1` avec 10.0.0.42 l'ip de la machine avec le périphérique à monter.
L'option `-no-optgo` n'était nécessaire que dans mon cas, la version de `nbd-client` étant superieure à celle de `ndb-server`
Vous devriez obtenir un message vous informant que vous avez créé le périphérique `/dev/ndb0`, que vous pouvez désormais monter comme si vous étiez sur la machine distante.
Sur une connexion à 100 Mbps rien ne m'a semblé plus lent que si j'étais en local, mais je n'ai pas non plus testé énormément de choses.
# Références
- [Readme du projet NBD](https://github.com/NetworkBlockDevice/nbd/blob/master/README.md)
- Le manuel de NBD
- [La seule occurence de NBD sur le wiki Arch](https://wiki.archlinux.org/index.php/Diskless_system#NBD_2)