« Busybox » : différence entre les versions

De Wiki doc

(Ajout de la section "Socket réseau en utilisateur standard".)
m (→‎Socket réseau en utilisateur standard : Correction d'un résidu d'ancienne balise de syntaxe qui causait un problème d'affichage avec le modèle "Astuce")
 
(8 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
[[Category:linux]]
[[Category:linux]]
[https://fr.wikipedia.org/wiki/BusyBox Busybox] est un exécutable regroupant une multitude d'utilitaires généralement disponibles via [https://fr.wikipedia.org/wiki/GNU_Core_Utilities GNU Core Utilities]. Il a l'avantage de ne prendre que très peu de place et peut être utilisé pour faire des systèmes embarqués très simples.
[https://fr.wikipedia.org/wiki/BusyBox Busybox] est un exécutable regroupant une multitude d'utilitaires généralement disponibles via [https://fr.wikipedia.org/wiki/GNU_Core_Utilities GNU Core Utilities]. Il a l'avantage de ne prendre que très peu de place et peut être utilisé pour faire des [[Busybox_init|systèmes embarqués très simples]].


=Installation=
=Installation=
Ligne 7 : Ligne 7 :


==Via les sources==
==Via les sources==
Le paquet <source lang="bash" inline>build-essential</source> est nécessaire pour utiliser la commande <source lang="bash" inline>make</source>.
Le paquet <code lang="bash" inline>build-essential</code> est nécessaire pour utiliser la commande <code lang="bash" inline>make</code>.
  wget https://busybox.net/downloads/busybox-1.27.2.tar.bz2
  wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
  tar xf busybox-1.27.2.tar.bz2
  tar xf busybox-1.36.1.tar.bz2
  cd busybox-1.27.2/
  cd busybox-1.36.1/
  make defconfig
  make defconfig
  make
  make
Note : le code source est également disponible dans [https://{{SERVERNAME}}/fichiers/système/applications/busybox/busybox-1.36.1.tar.bz2 nos fichiers].
{{astuce|Il est possible d'embarquer les dépendances nécessaires au fonctionnement de l'ensemble directement dans le binaire via la commande de compilation <syntaxhighlight lang="bash" inline>make LDFLAGS="--static"</syntaxhighlight> (ce dernier sera par conséquent plus lourd). Ceci est utile lorsque ''Busybox'' est intégré à un système dépourvu des bibliothèques en question.}}
Un exécutable ''busybox'' a été créé dans le répertoire courant.
Un exécutable ''busybox'' a été créé dans le répertoire courant.


La commande <source lang="bash" inline>make defconfig</source> permet de créer le fichier de configuration pour <source lang="bash" inline>make</source> (''.config''). Les commandes de pré-configurations possibles sont:
La commande <code lang="bash" inline>make defconfig</code> permet de créer le fichier de configuration pour <code lang="bash" inline>make</code> (''.config''). Les commandes de pré-configurations possibles sont :
* '''make defconfig''': Créé la configuration la plus saine possible. Ça active la plupart des fonctionnalités sans quelques outils de débogage ainsi que les outils nécessitants des modifications du système comme les noms de périphériques ''selinux'' ou ''devfs''. Utiliser cette option si vous voulez démarrer depuis un Busybox complet pour, par la suite, écrémer les fonctionnalités pour en avoir un plus petit.
* '''make defconfig''' : Créé la configuration la plus saine possible. Ça active la plupart des fonctionnalités sans quelques outils de débogage ainsi que les outils nécessitants des modifications du système comme les noms de périphériques ''selinux'' ou ''devfs''. Utiliser cette option si vous voulez démarrer depuis un ''Busybox'' complet pour, par la suite, écrémer les fonctionnalités pour en avoir un plus petit.
* '''make allnoconfig''': Désactive tout. Cela crée une petite version de Busybox qui ne fait rien. Commencez ici si vous savez exactement ce que vous voulez et que vous souhaitez sélectionner uniquement ces fonctionnalités.
* '''make allnoconfig''' : Désactive tout. Cela crée une petite version de ''Busybox'' qui ne fait rien. Commencez ici si vous savez exactement ce que vous voulez et que vous souhaitez sélectionner uniquement ces fonctionnalités.
* '''make menuconfig''': Modifie interactivement le fichier ''.config'' via une interface de menu à plusieurs niveaux. Utilisez-le après l'un des deux précédents.
* '''make menuconfig''' : Modifie interactivement le fichier ''.config'' via une interface de menu à plusieurs niveaux. Utilisez-le après l'un des deux précédents.
Les autres options sont:
Les autres options sont :
* '''make oldconfig''': Mettre à jour un vieux fichier ''.config'' pour une nouvelle version de Busybox.
* '''make oldconfig''' : Mettre à jour un vieux fichier ''.config'' pour une nouvelle version de ''Busybox''.
* '''make allyesconfig''': Sélectionnez absolument tout. Cela crée une version statiquement liée de Busybox remplie de code de débogage, avec des dépendances sur ''selinux'', en utilisant des noms de ''devfs'' ... Cela s'assure que tout est compilé. Que le résultat fasse quelque chose d'utile ou non est une question ouverte.
* '''make allyesconfig''' : Sélectionnez absolument tout. Cela crée une version statiquement liée de ''Busybox'' remplie de code de débogage, avec des dépendances sur ''selinux'', en utilisant des noms de ''devfs''... Cela s'assure que tout est compilé. Que le résultat fasse quelque chose d'utile ou non est une question ouverte.
* '''make randconfig''': Créer une configuration aléatoire à des fins de tests.
* '''make randconfig''' : Créer une configuration aléatoire à des fins de tests.


=Socket réseau en utilisateur standard=
=Socket réseau en utilisateur standard=
Par défaut, un système Linux n'autorise la création et la gestion d'un socket réseau que par l'utilisateur ''root''. Il peut être pratique de permettre certains exécutables à le faire via un utilisateur standard (c'est chiant d'avoir à taper le mot de passe ''root'' tout le temps). Pour ce faire, nous utiliserons les [[Linux capabilities]].
Par défaut, un système ''Linux'' n'autorise la création et la gestion d'un socket réseau que par l'utilisateur ''root''. Il peut être pratique de permettre certains exécutables à le faire via un utilisateur standard (c'est chiant d'avoir à taper le mot de passe ''root'' tout le temps). Pour ce faire, nous utiliserons les [[Linux capabilities]].


'''Autorisation de redirection réseau'''
'''Autorisation de redirection réseau'''
  setcap CAP_NET_BIND_SERVICE=+eip /bin/busybox
  setcap CAP_NET_BIND_SERVICE=+eip /bin/busybox


{{Astuce|On peut voir cette autorisation avec la commande <source lang="bash" inline>getcap /bin/busybox</source>.}}
{{Astuce|On peut voir cette autorisation avec la commande <code>getcap /bin/busybox</code>.}}


Les utilisateurs standards peuvent désormais utiliser le serveur HTTP ou autres intégré à ''Busybox''.
Les utilisateurs standards peuvent désormais utiliser le serveur ''HTTP'' ou autres intégré à ''Busybox''.


==Source de la section==
==Source de la section==
Ligne 38 : Ligne 43 :


=Usage=
=Usage=
Nous allons partir du principe que l'emplacement de notre binaire ''busybox'' se trouve dans notre variable d'environnement <source lang="bash" inline>$PATH</source>.
Nous allons partir du principe que l'emplacement de notre binaire ''busybox'' se trouve dans notre variable d'environnement <code lang="bash" inline>$PATH</code>.


'''Lister les programmes disponibles dans notre Busybox'''
'''Lister les programmes disponibles dans notre Busybox'''
  busybox
  busybox
'''Afficher le manuel des outils contenus dans Busybox'''
'''Afficher le manuel des outils contenus dans Busybox'''
  man busybox
  man busybox
''Avec un <source lang="bash" inline>/</source> suivi du nom de la commande + <source lang="bash" inline>entrer</source> + <source lang="bash" inline>n</source> on tombe directement sur le manuel de l'outil désiré.''
 
''Avec un <code lang="bash" inline>/</code> suivi du nom de la commande + <code lang="bash" inline>entrer</code> + <code lang="bash" inline>n</code> on tombe directement sur le manuel de l'outil désiré.''
 
==Serveur WEB==
==Serveur WEB==
'''Utiliser le serveur WEB intégré'''
'''Utiliser le serveur WEB intégré'''
  busybox httpd -f -v -h /tmp/foo/
  busybox httpd -f -v -h /tmp/foo/
''Le serveur httpd ne liste pas les fichiers, il faut entrer une URL complète comme pour le TFTP. Cependant, il redirige automatiquement sur un index.html si présent.''
''Le serveur httpd ne liste pas les fichiers, il faut entrer une URL complète comme pour le TFTP. Cependant, il redirige automatiquement sur un index.html si présent.''


Paramètres:
Paramètres :
* '''-f''': Ne rend pas la main. Ça permet de fermer le serveur web avec un <source lang="bash" inline>ctrl+c</source> au lieu de ce faire chier avec les commandes <source lang="bash" inline>ps</source> et <source lang="bash" inline>kill</source>
* '''-f''' : Ne rend pas la main. Ça permet de fermer le serveur web avec un <code lang="bash" inline>ctrl+c</code> au lieu de ce faire chier avec les commandes <code lang="bash" inline>ps</code> et <code lang="bash" inline>kill</code>
* '''-v''': affiche les IP des clients se connectant et le message renvoyé par le serveur
* '''-v''' : affiche les IP des clients se connectant et le message renvoyé par le serveur
* '''-h''': Spécifie le répertoire de travail du serveur. Si ce paramètre n'est pas renseigné, le répertoire courant est utilisé
* '''-h''' : Spécifie le répertoire de travail du serveur. Si ce paramètre n'est pas renseigné, le répertoire courant est utilisé


==Serveur DHCP==
==Serveur DHCP==
'''Créer le fichiers du processus'''
'''Créer le fichiers du processus'''
  touch /tmp/udhcpd.pid
  touch /tmp/udhcpd.pid
'''Créer le fichier contenant les baux DHCP'''
'''Créer le fichier contenant les baux DHCP'''
  touch /tmp/udhcpd.leases
  touch /tmp/udhcpd.leases
'''Créer un fichier de configuration'''
'''Créer un fichier de configuration'''
<source lang="python">
<syntaxhighlight lang="python">
cat > /tmp/udhcpd.conf << _EOF_
cat > /tmp/udhcpd.conf << _EOF_
# Plage d'adresse attribuable
# Plage d'adresse attribuable
Ligne 102 : Ligne 113 :
option lease 864000 # 10 jours en secondes
option lease 864000 # 10 jours en secondes
_EOF_
_EOF_
</source>
</syntaxhighlight>


Vous pouvez adapter les adresses et nom d'interface avec les commande suivante en remplaçant ''toto'' par la donnée appropriée:
Vous pouvez adapter les adresses et nom d'interface avec les commande suivante en remplaçant ''toto'' par la donnée appropriée:
Ligne 108 : Ligne 119 :
  sed -i 's/eth1/toto/g' /tmp/udhcpd.conf
  sed -i 's/eth1/toto/g' /tmp/udhcpd.conf


Paramètres possibles:
Paramètres possibles :
{| class="wikitable"
{| class="wikitable"
|-
|-
Ligne 116 : Ligne 127 :
|}
|}


Liste exhaustive des options supportés. Voir le fichier source options.c:
Liste exhaustive des options supportés. Voir le fichier source ''options.c'' :
{| class="wikitable"
{| class="wikitable"
|-
|-
Ligne 126 : Ligne 137 :
'''Exécuter le serveur DHCP'''
'''Exécuter le serveur DHCP'''
  busybox udhcpd -fv /tmp/udhcpd.conf
  busybox udhcpd -fv /tmp/udhcpd.conf
Paramètres:
 
* '''-f''': Ne rend pas la main. Ça permet de fermer le serveur DHCP avec un <source lang="bash" inline>ctrl+c</source> au lieu de ce faire chier avec les commandes <source lang="bash" inline>ps</source> et <source lang="bash" inline>kill</source>
Paramètres :
* '''-v''': affiche les requêtes ''ACK'' et ''OFFER'' entre le serveur et les clients (on voit l'IP attribué de ce fait)
* '''-f''' : Ne rend pas la main. Ça permet de fermer le serveur DHCP avec un <code lang="bash" inline>ctrl+c</code> au lieu de ce faire chier avec les commandes <code lang="bash" inline>ps</code> et <code lang="bash" inline>kill</code>
* '''-v''' : affiche les requêtes ''ACK'' et ''OFFER'' entre le serveur et les clients (on voit l'IP attribué de ce fait)


'''Sources de la section'''
'''Sources de la section'''
* Page officielle de udhcpd: https://udhcp.busybox.net/
* Page officielle de udhcpd: https://udhcp.busybox.net/
* Fichier de configuration exemple: https://udhcp.busybox.net/udhcpd.conf
* Fichier de configuration exemple: https://udhcp.busybox.net/udhcpd.conf
==NTP==
===Serveur NTP===
Définir l'horloge système depuis une source réseau
busybox ntpd -d -n -I eth0 -l -p 0.debian.pool.ntp.org
Paramètres :
* '''-d''' : mode verbeux
* '''-n''' : ne pas démoniser (ne pas exécuter en arrière plan)
* '''-I''' : écouter sur l'interface spécifiée pour les requêtes clientes
* '''-l''' : ouvre le socket ''UDP'' sur le port 123 pour les requêtes clientes
* '''-p''' : serveur de référence sur lequel se synchronise notre serveur
==TFTP==
===Client TFTP===
Télécharger un fichier via ''TFTP''
busybox tftp -r toto.txt 192.168.100.2 -g
Téléverser un fichier via ''TFTP''
busybox tftp -l toto.txt 192.168.100.2 -p
===Serveur TFTP===
Le serveur ''TFTP'' est rarement embarqué dans le ''Busybox'' des distributions ''Linux''. Dans ce cas, il faudra le compilé soit même (testé avec la version 1.36.1).
''Busybox tftpd'' a besoin de s'appuyer sur un programme (lui même présent dans ''Busybox'') d'ouverture de socket réseau : <code lang="bash" inline>udpsvd</code>.
/tmp/busybox-1.36.1/busybox udpsvd -vE 0.0.0.0 69 /tmp/busybox-1.36.1/busybox tftpd -c /tmp/tftp/
Paramètres :
* '''-r''' : lecture seule
* '''-c''' : téléversements autorisés
* '''-u''' : rendre l'utilisateur passé en paramètre propriétaire des fichiers téléversés
* '''-l''' : journaliser dans ''Syslog'' en plus du ''Stdout'' (non fonctionnel d'après mes tests)


==Netcat==
==Netcat==
Ligne 139 : Ligne 184 :


  busybox nc ipserver 2323
  busybox nc ipserver 2323
'''Envoyer un [https://tutorials.technology/tutorials/How-to-transfer-files-over-the-network-using-Netcat.html fichier]'''
Sur le serveur :
busybox nc -l -p 9999 > /tmp/titi.dat
Sur le client :
busybox nc 192.168.0.1 9999 < /tmp/titi/titi.dat


==Terminal série==
==Terminal série==
On peut remplacer l'usage de [[Minicom]] par Busybox avec l'outil embarqué ''Microcom''.
On peut remplacer l'usage de [[Minicom]] par ''Busybox'' avec l'outil embarqué ''Microcom''.
  busybox microcom -s 9600 /dev/ttyUSB0
  busybox microcom -s 9600 /dev/ttyUSB0
Pour quitter Microcom, faites la séquence d'échappement <source lang="bash" inline>ctrl+x</source>.
 
Pour quitter ''Microcom'', faites la séquence d'échappement <code lang="bash" inline>ctrl+x</code>.
 
=Sources=
=Sources=
* https://busybox.net/FAQ.html#configure
* https://busybox.net/FAQ.html#configure
* https://busybox.net/downloads/BusyBox.html
* https://busybox.net/downloads/BusyBox.html

Dernière version du 7 septembre 2024 à 20:11

Busybox est un exécutable regroupant une multitude d'utilitaires généralement disponibles via GNU Core Utilities. Il a l'avantage de ne prendre que très peu de place et peut être utilisé pour faire des systèmes embarqués très simples.

Installation

Via le gestionnaire de paquet

apt install busybox

Via les sources

Le paquet build-essential est nécessaire pour utiliser la commande make.

wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar xf busybox-1.36.1.tar.bz2
cd busybox-1.36.1/
make defconfig
make

Note : le code source est également disponible dans nos fichiers.

ASTUCE

Il est possible d'embarquer les dépendances nécessaires au fonctionnement de l'ensemble directement dans le binaire via la commande de compilation make LDFLAGS="--static" (ce dernier sera par conséquent plus lourd). Ceci est utile lorsque Busybox est intégré à un système dépourvu des bibliothèques en question.

Un exécutable busybox a été créé dans le répertoire courant.

La commande make defconfig permet de créer le fichier de configuration pour make (.config). Les commandes de pré-configurations possibles sont :

  • make defconfig : Créé la configuration la plus saine possible. Ça active la plupart des fonctionnalités sans quelques outils de débogage ainsi que les outils nécessitants des modifications du système comme les noms de périphériques selinux ou devfs. Utiliser cette option si vous voulez démarrer depuis un Busybox complet pour, par la suite, écrémer les fonctionnalités pour en avoir un plus petit.
  • make allnoconfig : Désactive tout. Cela crée une petite version de Busybox qui ne fait rien. Commencez ici si vous savez exactement ce que vous voulez et que vous souhaitez sélectionner uniquement ces fonctionnalités.
  • make menuconfig : Modifie interactivement le fichier .config via une interface de menu à plusieurs niveaux. Utilisez-le après l'un des deux précédents.

Les autres options sont :

  • make oldconfig : Mettre à jour un vieux fichier .config pour une nouvelle version de Busybox.
  • make allyesconfig : Sélectionnez absolument tout. Cela crée une version statiquement liée de Busybox remplie de code de débogage, avec des dépendances sur selinux, en utilisant des noms de devfs... Cela s'assure que tout est compilé. Que le résultat fasse quelque chose d'utile ou non est une question ouverte.
  • make randconfig : Créer une configuration aléatoire à des fins de tests.

Socket réseau en utilisateur standard

Par défaut, un système Linux n'autorise la création et la gestion d'un socket réseau que par l'utilisateur root. Il peut être pratique de permettre certains exécutables à le faire via un utilisateur standard (c'est chiant d'avoir à taper le mot de passe root tout le temps). Pour ce faire, nous utiliserons les Linux capabilities.

Autorisation de redirection réseau

setcap CAP_NET_BIND_SERVICE=+eip /bin/busybox

ASTUCE

On peut voir cette autorisation avec la commande getcap /bin/busybox.

Les utilisateurs standards peuvent désormais utiliser le serveur HTTP ou autres intégré à Busybox.

Source de la section

Usage

Nous allons partir du principe que l'emplacement de notre binaire busybox se trouve dans notre variable d'environnement $PATH.

Lister les programmes disponibles dans notre Busybox

busybox

Afficher le manuel des outils contenus dans Busybox

man busybox

Avec un / suivi du nom de la commande + entrer + n on tombe directement sur le manuel de l'outil désiré.

Serveur WEB

Utiliser le serveur WEB intégré

busybox httpd -f -v -h /tmp/foo/

Le serveur httpd ne liste pas les fichiers, il faut entrer une URL complète comme pour le TFTP. Cependant, il redirige automatiquement sur un index.html si présent.

Paramètres :

  • -f : Ne rend pas la main. Ça permet de fermer le serveur web avec un ctrl+c au lieu de ce faire chier avec les commandes ps et kill
  • -v : affiche les IP des clients se connectant et le message renvoyé par le serveur
  • -h : Spécifie le répertoire de travail du serveur. Si ce paramètre n'est pas renseigné, le répertoire courant est utilisé

Serveur DHCP

Créer le fichiers du processus

touch /tmp/udhcpd.pid

Créer le fichier contenant les baux DHCP

touch /tmp/udhcpd.leases

Créer un fichier de configuration

cat > /tmp/udhcpd.conf << _EOF_
# Plage d'adresse attribuable
start 192.168.0.1 # Par défaut: 192.168.0.20
end 192.168.0.253 # Par défaut: 192.168.0.254

# Interface réseau d'écoute
interface eth1 # Par défaut: eth0

# Nombre maximum de baux 
max_leases 253 # Par défaut: 254

# Stocker le temps restant pour chaque bail dans le fichier des baux
# C'est utile sur les systèmes embarqués ne pouvant garder l'heure après un redémarrage
# Si cette valeur est définie à "no", l'heure de fin de bail sera stocker dans le fichier
# des baux au lieu du temps restant avant expiration

#remaining yes # Par défaut: yes

# Localisation du fichier des baux
lease_file /tmp/udhcpd.leases

# Localisation du fichier processus
pidfile /tmp/udhcpd.pid # Par défaut: /var/run/udhcpd.pid

# Les options suivantes sont pour le PXE
#siaddr 192.168.0.22 # Par défaut: 0.0.0.0
#sname zorak # Par défaut: (none)
#boot_file /var/nfs_root # Par défaut: (none)

# Options DHCP
# Elles peuvent être spécifiées via le mot clé "option" ou "opt" qui est un alias.
# La seule options définie par défaut est "lease" pour définir la durée des baux
opt dns 192.168.170.171 80.67.169.12
option subnet 255.255.255.0
opt router 192.168.0.254
#opt wins 192.168.10.10 # Ajoute un serveur WINS
#option dns 129.219.13.81 # Ajoute un autre DNS aux 2 autres ci-dessus
option domain local
option lease 864000 # 10 jours en secondes
_EOF_

Vous pouvez adapter les adresses et nom d'interface avec les commande suivante en remplaçant toto par la donnée appropriée:

sed -i 's/192\.168\.0\./192\.168\.toto./g' /tmp/udhcpd.conf
sed -i 's/eth1/toto/g' /tmp/udhcpd.conf

Paramètres possibles :

Paramètre Effet Valeur par défaut
Paramètre 1 Il fait ça yes

Liste exhaustive des options supportés. Voir le fichier source options.c :

Option Effet
toto titi

Exécuter le serveur DHCP

busybox udhcpd -fv /tmp/udhcpd.conf

Paramètres :

  • -f : Ne rend pas la main. Ça permet de fermer le serveur DHCP avec un ctrl+c au lieu de ce faire chier avec les commandes ps et kill
  • -v : affiche les requêtes ACK et OFFER entre le serveur et les clients (on voit l'IP attribué de ce fait)

Sources de la section

NTP

Serveur NTP

Définir l'horloge système depuis une source réseau

busybox ntpd -d -n -I eth0 -l -p 0.debian.pool.ntp.org

Paramètres :

  • -d : mode verbeux
  • -n : ne pas démoniser (ne pas exécuter en arrière plan)
  • -I : écouter sur l'interface spécifiée pour les requêtes clientes
  • -l : ouvre le socket UDP sur le port 123 pour les requêtes clientes
  • -p : serveur de référence sur lequel se synchronise notre serveur

TFTP

Client TFTP

Télécharger un fichier via TFTP

busybox tftp -r toto.txt 192.168.100.2 -g

Téléverser un fichier via TFTP

busybox tftp -l toto.txt 192.168.100.2 -p

Serveur TFTP

Le serveur TFTP est rarement embarqué dans le Busybox des distributions Linux. Dans ce cas, il faudra le compilé soit même (testé avec la version 1.36.1).

Busybox tftpd a besoin de s'appuyer sur un programme (lui même présent dans Busybox) d'ouverture de socket réseau : udpsvd.

/tmp/busybox-1.36.1/busybox udpsvd -vE 0.0.0.0 69 /tmp/busybox-1.36.1/busybox tftpd -c /tmp/tftp/

Paramètres :

  • -r : lecture seule
  • -c : téléversements autorisés
  • -u : rendre l'utilisateur passé en paramètre propriétaire des fichiers téléversés
  • -l : journaliser dans Syslog en plus du Stdout (non fonctionnel d'après mes tests)

Netcat

Les commandes netcat sont identique à la version APT (avec quelques options en moins).

busybox nc -l -p 2323
busybox nc ipserver 2323

Envoyer un fichier

Sur le serveur :

busybox nc -l -p 9999 > /tmp/titi.dat

Sur le client :

busybox nc 192.168.0.1 9999 < /tmp/titi/titi.dat

Terminal série

On peut remplacer l'usage de Minicom par Busybox avec l'outil embarqué Microcom.

busybox microcom -s 9600 /dev/ttyUSB0

Pour quitter Microcom, faites la séquence d'échappement ctrl+x.

Sources