Dans ce tutoriel, nous allons voir quelques commandes Linux indispensables pour l’utilisation d’une machine Linux et d’un Raspberry Pi en particulier.
Information sur la machine
uname permet d’obtenir les information système (nom du noyau, version kernel, OS, etc.)
pi@raspberrypi:~ $ uname Linux pi@raspberrypi:~ $ uname -a Linux raspberrypi 4.19.97+ #1294 Thu Jan 30 13:10:54 GMT 2020 armv6l GNU/Linux pi@raspberrypi:~ $ uname --all Linux raspberrypi 4.19.97+ #1294 Thu Jan 30 13:10:54 GMT 2020 armv6l GNU/Linux pi@raspberrypi:~ $
lshw permet d’obtenir la configuration matériel. Vous pouvez utiliser l’option -short pour afficher le résumé. (ne fonctionne pas avec Raspberry Pi)
Sur Raspberry Pi, vous pouvez utiliser la commande cat /proc/cpuinfo
pi@raspberrypi:~ $ cat /proc/cpuinfo processor : 0 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4
df -h permet de connaitre l’espace libre sur la carte mémoire (très utile avec raspberry pi)
pi@raspberrypi:~ $ df -h Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur /dev/root 3,3G 3,1G 13M 100% / devtmpfs 181M 0 181M 0% /dev tmpfs 185M 0 185M 0% /dev/shm tmpfs 185M 5,2M 180M 3% /run tmpfs 5,0M 4,0K 5,0M 1% /run/lock tmpfs 185M 0 185M 0% /sys/fs/cgroup /dev/mmcblk0p6 253M 53M 200M 21% /boot tmpfs 37M 0 37M 0% /run/user/1000
Il y a quelques informations utiles que vous pouvez obtenir avec vcgencmd
Détection de sous-tension
vcgencmd get_throttled #if answer is 0x50005 under-voltage
Mesure de tension vcgencmd measure_volts <id> (core, sdram_c, sdram_i, sdram_p)
vcgencmd measure_volts core
Mesure de la température
vcgencmd measure_temp
Commande Linux Super utilisateur
sudo est la commande qui permet de passer en super utilisateur ou administrateur. Généralement, utiliser avec une autre commande et le mot de passe de la session.
A utiliser lorsque la commande renvoie l’erreur « 13 : Permission denied »
Commandes Linux d’installation
La commande apt-get permet d’installer des logiciels et des packages sur la machine.
Notamment, téléchargement et installation des mises à jour de l’OS
sudo apt-get update
sudo apt-get upgrade
apt-get sert aussi à installer ou à supprimer des packages
sudo apt-get install <package_name>
sudo apt-get remove <package_name>
sudo apt-get purge -y <package_name>
Enfin, deux commandes pour libérer de l’espace mémoire
sudo apt-get autoremove
sudo apt-get clean
La commande dpkg, comme apt, permet d’installer des paquets Debian (fichier .deb)
sudo dpkg -i <package_path>
sudo apt install <package_path>
La commande wget permet le téléchargement de fichier distant et peut aussi permettre de télécharger des packages à installer
Exemple: pour télécharger le logiciel Arduino
cd /tmp
wget https://downloads.arduino.cc/arduino-1.8.9-linux64.tar.xz
mkdir -p ~/opt/
tar -xf arduino-1.8.9-linux64.tar.xz -C ~/opt/
cd $HOME/opt/arduino-1.8.9
./install.sh
Commandes Linux pour naviguer à travers un dossier
La commande pwd permet de savoir dans quel répertoire l’on se trouve
pi@raspberrypi:~ $ pwd /home/pi
ls permet de lister tous les dossiers et fichiers contenu dans le répertoire où l’on se trouve
pi@raspberrypi:~ $ ls 2020-05-27-144933_1824x984_scrot.png Desktop MagPi Public 2020-05-27-144941_1824x984_scrot.png Documents Modèles Téléchargements Applications Images Musique Vidéos
cd permet de se déplacer dans un dossier :
pi@raspberrypi:~ $ cd Desktop pi@raspberrypi:~/Desktop $ W
La syntaxe de cette commande est la suivante : on met « cd », puis un espace et enfin le nom du dossier dans lequel on souhaite aller. Il existe différents ajout qui modifient la commande de base :
cd .. ##Permet de revenir dans le dossier précédent
cd ##Permet de revenir à la racine
cd Bureau/Work ##Permet d'aller dans le dossier Work qui se trouve dans le dossier Bureau
cd ../.. ##Permet de remonter deux dossiers plus haut dans l'arborescence
Pour créer des répertoires
mkdir pour créer un dossier
pi@raspberrypi:~/Desktop $ ls reset_usb.py rpi-arduino-i2c.py rpi-arduino-serial.py rpi-pca9685.py pi@raspberrypi:~/Desktop $ mkdir Work pi@raspberrypi:~/Desktop $ ls reset_usb.py rpi-arduino-i2c.py rpi-arduino-serial.py rpi-pca9685.py Work
rmdir pour supprimer un dossier
pi@raspberrypi:~/Desktop $ rmdir Work pi@raspberrypi:~/Desktop $ ls reset_usb.py rpi-arduino-i2c.py rpi-arduino-serial.py rpi-pca9685.py
rm -R pour supprimer un dossier et tout son contenu
Pour lire un fichier
cat pour afficher tout le fichier
pi@raspberrypi:~ $ cat /var/log/syslog Mar 18 15:40:32 raspberrypi rsyslogd: [origin software="rsyslogd" swVersion="8.1901.0" x-pid="300" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Mar 18 15:40:34 raspberrypi rsyslogd: [origin software="rsyslogd" swVersion="8.1901.0" x-pid="300" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Mar 18 15:40:34 raspberrypi systemd[1]: logrotate.service: Succeeded. Mar 18 15:40:34 raspberrypi systemd[1]: Started Rotate log files. Mar 18 15:40:37 raspberrypi systemd[1]: systemd-hostnamed.service: Succeeded. Mar 18 15:40:45 raspberrypi systemd[1]: man-db.service: Succeeded. Mar 18 15:40:45 raspberrypi systemd[1]: Started Daily man-db regeneration.
head pour lire l’entête d’un fichier
pi@raspberrypi:~ $ head -n 10 /var/log/syslog Mar 18 15:40:32 raspberrypi rsyslogd: [origin software="rsyslogd" swVersion="8.1901.0" x-pid="300" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Mar 18 15:40:34 raspberrypi rsyslogd: [origin software="rsyslogd" swVersion="8.1901.0" x-pid="300" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Mar 18 15:40:34 raspberrypi systemd[1]: logrotate.service: Succeeded. Mar 18 15:40:34 raspberrypi systemd[1]: Started Rotate log files. Mar 18 15:40:37 raspberrypi systemd[1]: systemd-hostnamed.service: Succeeded. Mar 18 15:40:45 raspberrypi systemd[1]: man-db.service: Succeeded. Mar 18 15:40:45 raspberrypi systemd[1]: Started Daily man-db regeneration. Mar 18 15:40:47 raspberrypi dbus-daemon[633]: [session uid=1000 pid=633] Activating via systemd: service name='org.gtk.vfs.UDisks2VolumeMonitor' unit='gvfs-udisks2-volume-monitor.service' requested by ':1.7' (uid=1000 pid=750 comm="pcmanfm --desktop --profile LXDE-pi ") Mar 18 15:40:47 raspberrypi systemd[531]: Starting Virtual filesystem service - disk device monitor... Mar 18 15:40:50 raspberrypi dbus-daemon[633]: [session uid=1000 pid=633] Successfully activated service 'org.gtk.vfs.UDisks2VolumeMonitor'
tail pour lire la fin du fichier
pi@raspberrypi:~ $ tail -f /var/log/syslog Mar 18 16:00:09 raspberrypi kernel: [ 1254.094894] ICMPv6: NA: bc:a8:a6:e7:a1:c6 advertised our address 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1 on wlan0! Mar 18 16:10:06 raspberrypi kernel: [ 1850.887447] ICMPv6: NA: bc:a8:a6:e7:a1:c6 advertised our address 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1 on wlan0! Mar 18 16:10:07 raspberrypi kernel: [ 1851.909164] ICMPv6: NA: bc:a8:a6:e7:a1:c6 advertised our address 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1 on wlan0! Mar 18 16:14:14 raspberrypi kernel: [ 2098.887584] ICMPv6: NA: bc:a8:a6:e7:a1:c6 advertised our address 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1 on wlan0! Mar 18 16:14:15 raspberrypi kernel: [ 2099.925466] ICMPv6: NA: bc:a8:a6:e7:a1:c6 advertised our address 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1 on wlan0! Mar 18 16:14:16 raspberrypi kernel: [ 2100.949293] ICMPv6: NA: bc:a8:a6:e7:a1:c6 advertised our address 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1 on wlan0! Mar 18 16:17:01 raspberrypi CRON[1461]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly) Mar 18 16:18:38 raspberrypi kernel: [ 2362.996869] ICMPv6: NA: bc:a8:a6:e7:a1:c6 advertised our address 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1 on wlan0! Mar 18 16:18:39 raspberrypi kernel: [ 2364.016852] ICMPv6: NA: bc:a8:a6:e7:a1:c6 advertised our address 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1 on wlan0! Mar 18 16:18:40 raspberrypi kernel: [ 2365.040711] ICMPv6: NA: bc:a8:a6:e7:a1:c6 advertised our address 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1 on wlan0!
Pour créer et éditer un fichier
Il est possible de créer et d’éditer des fichiers directement à partir du terminal. Cela est pratique, notamment, lorsqu’on accède au microcontrôleur à distance comme un Raspberry Pi Headless.
touch MON_FICHIER.py ##Permet de créer un fichier
nano MON_FICHIER.py ##Permet de créer un fichier (si il n'existe pas encore) et d'ouvrir un éditeur de texte intégré à la console Linux
En premier lieu la commande « nano » permet d’ouvrir un fichier via un éditeur de texte intégré à la console du terminale. La commande « nano » ouvre ce fichier et le crée si le fichier n’existe pas.
Pour copier, déplacer, supprimer un fichier
mv pour déplacer ou renommer un fichier
mv [fichier_répertoire_source] [fichier_répertoire_cible]
cp pour copier un fichier
cp [option] <source_directory> <target_directory>
Exemple:
cp -r /path/to/source/ /destination/ #Pour copier le dossier source dans le dossier destination
cp -r /path/to/source/* /destination/ #Pour copier le contenu du dossier source dans le dossier destination
scp pour copier un fichier à partir et/ou vers un serveur (-r recursive, -p keep date)
scp -r -p <source_directory> user@address:<target_directory>
Exemple pour copier le fichier file.txt, contenu dans le dossier Data, vers le dossier Donwloads d’un Raspberry Pi connecté au même réseau:
scp -r -p ./Data/file.txt pi@192.168.1.26:Donwloads
rm to delete a file or a folder
rm /répertoire/nom_du_fichier
Pour rechercher une chaine de caractère dans un fichier ou un répertoire
find Pour trouver un fichier
pi@raspberrypi:~ $ sudo find / -name syslog find: ‘/run/user/1000/gvfs’: Permission non accordée /run/systemd/journal/syslog /var/log/syslog find ./ "*.txt" -mtime +7 -print #find and print all txt file older than 7 days (-delete to delete files)
Pour trouver un texte dans un fichier, on utilise la commande grep ou fgrep
pi@raspberrypi:~ $ grep Arduino /var/log/syslog Mar 18 17:10:22 raspberrypi kernel: [ 5466.943038] usb 1-1: Product: Arduino Uno Mar 18 17:10:22 raspberrypi kernel: [ 5466.943049] usb 1-1: Manufacturer: Arduino (www.arduino.cc) pi@raspberrypi:~ $ grep tty /var/log/syslog Mar 18 17:10:22 raspberrypi kernel: [ 5467.184359] cdc_acm 1-1:1.0: ttyACM0: USB ACM device
To do a recursive search for text from the current directory, use fgrep -ri
fgrep -ri mystring * # Pour rechercher "mystring" dans tous les types de fichiers de manière récursive
N.B.: Grep utilise les expressions régulières (regexp) ce qui signifie que vous pouvez préciser votre recherche. Pour vous entraîner avec les expressions régulières vous pouvez utiliser ce site.
Pour comparer des répertoires ou des fichiers
Il est possible de comparer le contenu de deux répertoires avec les commandes diff ou meld.
Si ce n’est pas fait vous pouvez l’installer avec la commande
sudo apt install diffutils meld
La commande diff est plus légère et permet de voir les différences entre dossier d’un simple coup d’œil.
diff <source_directory> <target_directory>
La commande meld ouvre un éditeur de texte qui vous permet de comparer l’arborescence des dossiers, les textes lignes par lignes et de les modifier si besoin.
meld <source_directory> <target_directory>
Un fenêtre double s’affiche vous permettant de comparer les deux répertoires fichier par fichier et d’observer les différences d’un simple coup d’oeil
Lancer un programme en tâche de fond
Lorsque vous lancer un programme bloquant à partir du terminal, comme un éditeur de texte, il est possible de le mettre en tâche de fond afin de garder la main sur le terminal.
Directement sur la même ligne de commande avec &
gedit Makefile &
Lorsque le programme est lancé, retournez sur le terminal puis tapez Ctrl+Z. Cela vous permet de reprendre la main sur le terminal.
gedit Makefile
^Z
zsh: suspended gedit Makefile
Entrez ensuite la commande bg, pour lancer le programme en tâche de fond
bg
[1] + continued gedit Makefile
Gestion des processus
top (ou htop) est l’équivalent du gestionnaire de tâche sous Windows. Il permet d’avoir une idée de l’état de santé de la machine et des processus actifs.
ps -aux pour afficher les processus en cours
pi@raspberrypi:~ $ ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.2 2.0 32724 7832 ? Ss 15:39 0:10 /sbin/init spla root 2 0.0 0.0 0 0 ? S 15:39 0:00 [kthreadd] root 4 0.0 0.0 0 0 ? I< 15:39 0:03 [kworker/0:0H-k root 6 0.0 0.0 0 0 ? I< 15:39 0:00 [mm_percpu_wq] root 7 0.0 0.0 0 0 ? S 15:39 0:01 [ksoftirqd/0] root 8 0.0 0.0 0 0 ? S 15:39 0:00 [kdevtmpfs] root 9 0.0 0.0 0 0 ? I< 15:39 0:00 [netns] root 11 0.0 0.0 0 0 ? S 15:39 0:00 [khungtaskd] root 12 0.0 0.0 0 0 ? S 15:39 0:00 [oom_reaper] root 13 0.0 0.0 0 0 ? I< 15:39 0:00 [writeback]
Combiner avec grep pour trouver des processus particulier
pi@raspberrypi:~ $ ps -aux | grep python pi 1817 0.8 1.5 12660 5860 pts/1 S+ 17:21 0:00 python pi 1820 0.0 0.4 7348 1880 pts/0 S+ 17:21 0:00 grep --color=auto python
kill/killall pour supprimer un processus une fois que vous avez trouvez le pid à l’aide de grep (ici 1817 pour le processus python)
pi@raspberrypi:~ $ ps -aux | grep python pi 1817 0.8 1.5 12660 5860 pts/1 S+ 17:21 0:00 python pi 1820 0.0 0.4 7348 1880 pts/0 S+ 17:21 0:00 grep --color=auto python pi@raspberrypi:~ $ kill -9 1817
Résultat si une session python est ouverte dans un autre terminal
pi@raspberrypi:~ $ python Python 2.7.16 (default, Oct 10 2019, 22:02:15) [GCC 8.3.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> Processus arrêté pi@raspberrypi:~ $
Identification des ports USB
lsusb pour obtenir la liste des périphérique usb
pi@raspberrypi:~ $ lsusb Bus 001 Device 003: ID 2341:0001 Arduino SA Uno (CDC ACM) Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
dmesg | grep tty pour obtenir les appareils détectés
dmesg | grep tty [ 0.000000] console [tty0] enabled [ 1.537553] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [ 1.537762] 00:07: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
ls /dev/tty* pour obtenir la liste des périphériques (dont les ports USB)
pi@raspberrypi:~ $ ls /dev/tty* /dev/tty /dev/tty16 /dev/tty24 /dev/tty32 /dev/tty40 /dev/tty49 /dev/tty57 /dev/tty8 /dev/tty0 /dev/tty17 /dev/tty25 /dev/tty33 /dev/tty41 /dev/tty5 /dev/tty58 /dev/tty9 /dev/tty1 /dev/tty18 /dev/tty26 /dev/tty34 /dev/tty42 /dev/tty50 /dev/tty59 /dev/ttyACM0 /dev/tty10 /dev/tty19 /dev/tty27 /dev/tty35 /dev/tty43 /dev/tty51 /dev/tty6 /dev/ttyAMA0 /dev/tty11 /dev/tty2 /dev/tty28 /dev/tty36 /dev/tty44 /dev/tty52 /dev/tty60 /dev/ttyprintk /dev/tty12 /dev/tty20 /dev/tty29 /dev/tty37 /dev/tty45 /dev/tty53 /dev/tty61 /dev/ttyS0 /dev/tty13 /dev/tty21 /dev/tty3 /dev/tty38 /dev/tty46 /dev/tty54 /dev/tty62 /dev/tty14 /dev/tty22 /dev/tty30 /dev/tty39 /dev/tty47 /dev/tty55 /dev/tty63 /dev/tty15 /dev/tty23 /dev/tty31 /dev/tty4 /dev/tty48 /dev/tty56 /dev/tty7
Commandes Linux pour le réseau
hostname permet d’obtenir le nom ou l’adresse IP de la machine
pi@raspberrypi:~ $ hostname raspberrypi pi@raspberrypi:~ $ hostname -i 127.0.1.1 pi@raspberrypi:~ $ hostname -I 192.168.1.43 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1
La commande ifconfig permet d’obtenir des informations sur le réseau et notamment les adresses IP.
pi@raspberrypi:~ $ ifconfig lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Boucle locale) RX packets 17 bytes 1004 (1004.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 17 bytes 1004 (1004.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.43 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 2001:861:3742:78b0:76b1:2f81:bb6e:5bd1 prefixlen 64 scopeid 0x0<global> inet6 fe80::1d5d:81c0:3c34:73cd prefixlen 64 scopeid 0x20<link> ether b8:27:eb:d5:83:aa txqueuelen 1000 (Ethernet) RX packets 13878 bytes 1570890 (1.4 MiB) RX errors 0 dropped 1 overruns 0 frame 0 TX packets 6020 bytes 1933262 (1.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ping est utile pour tester la communication réseau. Vous pouvez placer une adresse IP ou une adresse web en argument (ajouter l’option -c 10 pour n’exécuter que 10 requêtes)
ping -c 10 192.168.1.43 PING 192.168.1.43 (192.168.1.43) 56(84) bytes of data. 64 bytes from 192.168.1.43: icmp_seq=1 ttl=64 time=0.393 ms 64 bytes from 192.168.1.43: icmp_seq=2 ttl=64 time=0.300 ms 64 bytes from 192.168.1.43: icmp_seq=3 ttl=64 time=0.276 ms 64 bytes from 192.168.1.43: icmp_seq=4 ttl=64 time=0.278 ms 64 bytes from 192.168.1.43: icmp_seq=5 ttl=64 time=0.278 ms 64 bytes from 192.168.1.43: icmp_seq=6 ttl=64 time=0.280 ms 64 bytes from 192.168.1.43: icmp_seq=7 ttl=64 time=0.344 ms 64 bytes from 192.168.1.43: icmp_seq=8 ttl=64 time=0.339 ms 64 bytes from 192.168.1.43: icmp_seq=9 ttl=64 time=0.355 ms 64 bytes from 192.168.1.43: icmp_seq=10 ttl=64 time=0.356 ms --- 192.168.1.43 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 318ms rtt min/avg/max/mdev = 0.276/0.319/0.393/0.046 ms
arp renvoie une liste d’appareils connectés au réseau
pi@raspberrypi:~ $ arp -a bbox.lan (192.168.1.254) at 48:83:c7:59:27:8c [ether] on wlan0 pi@raspberrypi:~ $ arp -e Adresse TypeMap AdresseMat Indicateurs Iface bbox.lan ether 48:83:c7:59:27:8c C wlan0
Éteindre la machine
shutdown pour arrêter le système proprement
halt pour arrêter le système en arrêtant tous les processus en cours
sudo reboot pour redémarrer