<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki.squi.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Justine</id>
	<title>Justine&#039;s wiki - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.squi.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Justine"/>
	<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php/Sp%C3%A9cial:Contributions/Justine"/>
	<updated>2026-04-28T01:32:44Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Steam&amp;diff=2567</id>
		<title>Steam</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Steam&amp;diff=2567"/>
		<updated>2026-02-01T08:58:32Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:misc]]&lt;br /&gt;
[[Category:linux]]&lt;br /&gt;
= Proton =&lt;br /&gt;
== Activer la version &amp;quot;bleeding edge&amp;quot; ==&lt;br /&gt;
La version &amp;quot;bleeding edge&amp;quot; de proton, soit la toute dernière beta, peut servir (notamment pour jouer à Elden Ring alors que celui-ci vient de sortir :3).&lt;br /&gt;
&lt;br /&gt;
Sur steam:&lt;br /&gt;
* Dans la barre de recherche, taper &amp;quot;proton&amp;quot;&lt;br /&gt;
* Clic droit sur &amp;quot;Proton experimental&amp;quot;&lt;br /&gt;
* Properties&lt;br /&gt;
* Onglet betas&lt;br /&gt;
* Choisir la beta &amp;quot;bleeding edge&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Steam fais une mise à jour, et on peut alors configurer un jeu en &amp;quot;proton experimental&amp;quot; pour qu&#039;il utilise la version bleeding edge.&lt;br /&gt;
&lt;br /&gt;
= Améliorer la vitesse de téléchargement = &lt;br /&gt;
== Repasser en http1/1 ==&lt;br /&gt;
En cas de téléchargements anormalement lents sur Linux, on peut apporter quelques améliorations niveau config de steam.&lt;br /&gt;
&lt;br /&gt;
* Arrêter Steam&lt;br /&gt;
* Créer le fichier suivant: ~/.steam/steam/steam_dev.cfg&lt;br /&gt;
* Coller:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
@nClientDownloadEnableHTTP2PlatformLinux 0&lt;br /&gt;
@fDownloadRateImprovementToAddAnotherConnection 1.0&lt;br /&gt;
@cMaxContentStatsdays 30&lt;br /&gt;
@cMaxPendingUploads 4&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Essayer de désactiver l&#039;IPv6. J&#039;ai lu que les serveurs steam en France n&#039;étaient pas efficaces en IPv6, mais je n&#039;ai pas testé.&lt;br /&gt;
&lt;br /&gt;
== Problèmes de DNS ==&lt;br /&gt;
&lt;br /&gt;
Source : https://steamcommunity.com/app/221410/discussions/2/616189106498372437?l=japanese&amp;amp;ctp=1&lt;br /&gt;
&lt;br /&gt;
Steam sur Linux, lorsqu&#039;il télécharge, interroge le DNS a chaque requête. Par exemple, chez moi, mon resolver powerdns boucle sur :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;2&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache1-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:43021&amp;quot; source=&amp;quot;192.168.1.10:43021&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;2&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache8-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:59849&amp;quot; source=&amp;quot;192.168.1.10:59849&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache8-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:34778&amp;quot; source=&amp;quot;192.168.1.10:34778&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache8-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:54639&amp;quot; source=&amp;quot;192.168.1.10:54639&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.807&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache9-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:43258&amp;quot; source=&amp;quot;192.168.1.10:43258&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.807&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache9-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:46631&amp;quot; source=&amp;quot;192.168.1.10:46631&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En fonction du serveur DNS que l&#039;on utilise, si l&#039;on a pas de cache, on peut se faire rate-limit par le resolver qu&#039;on utilise. Cela a pour effet de provoquer l&#039;effondrement du téléchargement au bout de quelques secondes. Après cela il fait des pics autour de 20/30Mo/s dans mon cas, lorsque je n&#039;utilise pas mon resolver mais quad9 par exemple.&lt;br /&gt;
&lt;br /&gt;
On peut utiliser un cache DNS comme dnsmasq ou un resolver local.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Steam&amp;diff=2566</id>
		<title>Steam</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Steam&amp;diff=2566"/>
		<updated>2026-02-01T08:39:02Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Améliorer la vitesse de téléchargement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:misc]]&lt;br /&gt;
[[Category:linux]]&lt;br /&gt;
= Proton =&lt;br /&gt;
== Activer la version &amp;quot;bleeding edge&amp;quot; ==&lt;br /&gt;
La version &amp;quot;bleeding edge&amp;quot; de proton, soit la toute dernière beta, peut servir (notamment pour jouer à Elden Ring alors que celui-ci vient de sortir :3).&lt;br /&gt;
&lt;br /&gt;
Sur steam:&lt;br /&gt;
* Dans la barre de recherche, taper &amp;quot;proton&amp;quot;&lt;br /&gt;
* Clic droit sur &amp;quot;Proton experimental&amp;quot;&lt;br /&gt;
* Properties&lt;br /&gt;
* Onglet betas&lt;br /&gt;
* Choisir la beta &amp;quot;bleeding edge&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Steam fais une mise à jour, et on peut alors configurer un jeu en &amp;quot;proton experimental&amp;quot; pour qu&#039;il utilise la version bleeding edge.&lt;br /&gt;
&lt;br /&gt;
= Améliorer la vitesse de téléchargement = &lt;br /&gt;
== Repasser en http1/1 ==&lt;br /&gt;
En cas de téléchargements anormalement lents sur Linux, on peut apporter quelques améliorations niveau config de steam.&lt;br /&gt;
&lt;br /&gt;
* Arrêter Steam&lt;br /&gt;
* Créer le fichier suivant: ~/.steam/steam/steam_dev.cfg&lt;br /&gt;
* Coller:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
@nClientDownloadEnableHTTP2PlatformLinux 0&lt;br /&gt;
@fDownloadRateImprovementToAddAnotherConnection 1.0&lt;br /&gt;
@cMaxContentStatsdays 30&lt;br /&gt;
@cMaxPendingUploads 4&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Essayer de désactiver l&#039;IPv6. &lt;br /&gt;
&lt;br /&gt;
== Problèmes de DNS ==&lt;br /&gt;
&lt;br /&gt;
Source : https://steamcommunity.com/app/221410/discussions/2/616189106498372437?l=japanese&amp;amp;ctp=1&lt;br /&gt;
&lt;br /&gt;
Steam sur Linux, lorsqu&#039;il télécharge, interroge le DNS a chaque requête. Par exemple, chez moi, mon resolver powerdns boucle sur :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;2&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache1-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:43021&amp;quot; source=&amp;quot;192.168.1.10:43021&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;2&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache8-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:59849&amp;quot; source=&amp;quot;192.168.1.10:59849&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache8-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:34778&amp;quot; source=&amp;quot;192.168.1.10:34778&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache8-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:54639&amp;quot; source=&amp;quot;192.168.1.10:54639&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.807&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache9-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:43258&amp;quot; source=&amp;quot;192.168.1.10:43258&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.807&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache9-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:46631&amp;quot; source=&amp;quot;192.168.1.10:46631&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En fonction du serveur DNS que l&#039;on utilise, si l&#039;on a pas de cache, on peut se faire rate-limit par le resolver qu&#039;on utilise. Cela a pour effet de provoquer l&#039;effondrement du téléchargement au bout de quelques secondes. Après cela il fait des pics autour de 20/30Mo/s dans mon cas, lorsque je n&#039;utilise pas mon resolver mais quad9 par exemple.&lt;br /&gt;
&lt;br /&gt;
On peut utiliser un cache DNS comme dnsmasq ou un resolver local.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Steam&amp;diff=2565</id>
		<title>Steam</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Steam&amp;diff=2565"/>
		<updated>2026-02-01T08:37:34Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:misc]]&lt;br /&gt;
[[Category:linux]]&lt;br /&gt;
= Proton =&lt;br /&gt;
== Activer la version &amp;quot;bleeding edge&amp;quot; ==&lt;br /&gt;
La version &amp;quot;bleeding edge&amp;quot; de proton, soit la toute dernière beta, peut servir (notamment pour jouer à Elden Ring alors que celui-ci vient de sortir :3).&lt;br /&gt;
&lt;br /&gt;
Sur steam:&lt;br /&gt;
* Dans la barre de recherche, taper &amp;quot;proton&amp;quot;&lt;br /&gt;
* Clic droit sur &amp;quot;Proton experimental&amp;quot;&lt;br /&gt;
* Properties&lt;br /&gt;
* Onglet betas&lt;br /&gt;
* Choisir la beta &amp;quot;bleeding edge&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Steam fais une mise à jour, et on peut alors configurer un jeu en &amp;quot;proton experimental&amp;quot; pour qu&#039;il utilise la version bleeding edge.&lt;br /&gt;
&lt;br /&gt;
= Améliorer la vitesse de téléchargement = &lt;br /&gt;
== Repasser en http1/1 ==&lt;br /&gt;
En cas de téléchargements anormalement lents sur Linux, on peut apporter quelques améliorations niveau config de steam.&lt;br /&gt;
&lt;br /&gt;
* Arrêter Steam&lt;br /&gt;
* Créer le fichier suivant: ~/.steam/steam/steam_dev.cfg&lt;br /&gt;
* Coller:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
@nClientDownloadEnableHTTP2PlatformLinux 0&lt;br /&gt;
@fDownloadRateImprovementToAddAnotherConnection 1.0&lt;br /&gt;
@cMaxContentStatsdays 30&lt;br /&gt;
@cMaxPendingUploads 4&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Relancer. Cette ligne suffit chez moi, mais apparement on peut essayer :&lt;br /&gt;
 @nClientDownloadEnableHTTP2PlatformLinux 0&lt;br /&gt;
 @fDownloadRateImprovementToAddAnotherConnection 1.0&lt;br /&gt;
&lt;br /&gt;
== Problèmes de DNS ==&lt;br /&gt;
&lt;br /&gt;
Source : https://steamcommunity.com/app/221410/discussions/2/616189106498372437?l=japanese&amp;amp;ctp=1&lt;br /&gt;
&lt;br /&gt;
Steam sur Linux, lorsqu&#039;il télécharge, interroge le DNS a chaque requête. Par exemple, chez moi, mon resolver powerdns boucle sur :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;2&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache1-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:43021&amp;quot; source=&amp;quot;192.168.1.10:43021&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;2&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache8-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:59849&amp;quot; source=&amp;quot;192.168.1.10:59849&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache8-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:34778&amp;quot; source=&amp;quot;192.168.1.10:34778&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.705&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache8-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:54639&amp;quot; source=&amp;quot;192.168.1.10:54639&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.807&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache9-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:43258&amp;quot; source=&amp;quot;192.168.1.10:43258&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
Feb 01 08:33:08 resolver pdns-recursor[282]: msg=&amp;quot;Question answered from packet cache&amp;quot; subsystem=&amp;quot;in&amp;quot; level=&amp;quot;0&amp;quot; prio=&amp;quot;Notice&amp;quot; tid=&amp;quot;1&amp;quot; ts=&amp;quot;1769934788.807&amp;quot; proto=&amp;quot;udp&amp;quot; qname=&amp;quot;cache9-par1.steamcontent.com&amp;quot; qtype=&amp;quot;A&amp;quot; remote=&amp;quot;192.168.1.10:46631&amp;quot; source=&amp;quot;192.168.1.10:46631&amp;quot; tag=&amp;quot;0&amp;quot;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En fonction du serveur DNS que l&#039;on utilise, si l&#039;on a pas de cache, on peut se faire rate-limit par le resolver qu&#039;on utilise. Cela a pour effet de provoquer l&#039;effondrement du téléchargement au bout de quelques secondes. Après cela il fait des pics autour de 20/30Mo/s dans mon cas, lorsque je n&#039;utilise pas mon resolver mais quad9 par exemple.&lt;br /&gt;
&lt;br /&gt;
On peut utiliser un cache DNS comme dnsmasq ou un resolver local.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Fstab&amp;diff=2564</id>
		<title>Fstab</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Fstab&amp;diff=2564"/>
		<updated>2025-11-11T18:03:48Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Un fstab qui n&amp;#039;attends pas longtemps les montages réseau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
= But de la manoeuvre =&lt;br /&gt;
&lt;br /&gt;
Le but est ici d&#039;ajouter une partition /dev/sda1 qui sera montée automatiquement au démarrage. On utilise ici une partition locale en ext4, mais le principe est le même pour une partition en réseau...&lt;br /&gt;
&lt;br /&gt;
== Récupération de l&#039;UUID == &lt;br /&gt;
&lt;br /&gt;
Toute partition a un ID unique, qui permettra de l&#039;identifier afin de la monter à coup sûr. Pour la récupérer, rien de plus simple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[justine@Argonaut Fastcop]$ sudo blkid /dev/sda1&lt;br /&gt;
/dev/sda1: LABEL=&amp;quot;Stockage&amp;quot; UUID=&amp;quot;980daaf8-ae75-4f21-b208-5fb33b3cf3f8&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTUUID=&amp;quot;c36284f8-7114-4198-b2fc-1d78babc8a3f&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je récupère ici UUID (980daaf...).&lt;br /&gt;
&lt;br /&gt;
== Modification du fichier ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
# /etc/fstab: static file system information.&lt;br /&gt;
#&lt;br /&gt;
# Use &#039;blkid&#039; to print the universally unique identifier for a device; this may&lt;br /&gt;
# be used with UUID= as a more robust way to name devices that works even if&lt;br /&gt;
# disks are added and removed. See fstab(5).&lt;br /&gt;
#&lt;br /&gt;
# &amp;lt;file system&amp;gt;             &amp;lt;mount point&amp;gt;  &amp;lt;type&amp;gt;  &amp;lt;options&amp;gt;  &amp;lt;dump&amp;gt;  &amp;lt;pass&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
UUID=980daaf8-ae75-4f21-b208-5fb33b3cf3f8 /home/justine/Stockage ext4 defaults 0 2 #Ligne rajoutée&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La ligne est composée de 6 champs :&lt;br /&gt;
* UUID=980daaf8-ae75-4f21-b208-5fb33b3cf3f8 : C&#039;est l&#039;UUID récupéré précédemment.&lt;br /&gt;
* /home/justine/Stockage : C&#039;est le point de montage, un dossier qui doit être existant.&lt;br /&gt;
* ext4 : Le formatage de la partition. On pourrait remplacer par glusterfs, par ex&lt;br /&gt;
* defaults : Ce champ contient les options au format option1,option2,option3. Defaults gère les droits d&#039;accès : ici, on prend les droits par défaut (les droits normaux). Voir plus bas pour la liste.&lt;br /&gt;
* 0 : &amp;lt;dump&amp;gt; - est utilisé par l&#039;utilitaire dump pour décider quand faire des sauvegardes. Quand il est installé, dump vérifie le chiffre inscrit et décide si le système de fichiers doit être sauvegardé. Les valeurs possibles sont 0 et 1. Si 0, dump va ignorer le système de fichier, si 1, dump fera une sauvegarde. La plupart des utilisateurs n&#039;auront pas dump d&#039;installé, ils pourront donc inscrire 0 dans le champ &amp;lt;dump&amp;gt;. &lt;br /&gt;
* 2 : &amp;lt;pass&amp;gt; fsck lit le chiffre &amp;lt;pass&amp;gt; et détermine dans quel ordre les systèmes de fichiers vont être vérifiés. Le champ peut prendre les valeurs 0,1 et 2. Le système de fichiers root devra avoir la priorité la plus haute : 1, tous les autres systèmes que vous voulez vérifier devront avoir un 2. Les systèmes de fichiers avec un &amp;lt;pass&amp;gt; à 0 ne seront pas vérifiés par l&#039;utilitaire fsck. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Recharger le fichier ==&lt;br /&gt;
&lt;br /&gt;
La commande est simple là aussi :&lt;br /&gt;
 mount -av&lt;br /&gt;
&lt;br /&gt;
= Liste des options =&lt;br /&gt;
&lt;br /&gt;
* nofail - ignorer les erreurs au démarrage pour ce fs. Important pour les montages réseau qui peuvent ne pas être disponibles !&lt;br /&gt;
* auto - le système de fichiers sera monté automatiquement au démarrage, ou quand la commande &#039;mount -a&#039; sera joué.&lt;br /&gt;
* noauto - le système de fichiers est monté que quand on lui demande de le faire (utile pour les FS qui ne sont pas forcément présents type clef USB).&lt;br /&gt;
* exec - autorise l&#039;exécution de binaire qui sont sur cette partition (par défaut).&lt;br /&gt;
* noexec - n&#039;autorise pas l&#039;exécution de binaires sur le système de fichier.&lt;br /&gt;
* ro - monte le système de fichiers en lecture seulement.&lt;br /&gt;
* rw - monte le système de fichiers en lecture et en écriture.&lt;br /&gt;
* sync - Les entrées/sorties (I/O) devraient être faites de manière synchrone.&lt;br /&gt;
* async - Les entrées/sorties (I/O) devraient être faites de manière asynchrone.&lt;br /&gt;
* flush - option spécifique pour le FAT afin de vider les données plus souvent, cela permettant aux fenêtres de copie et aux barres de progression de rester ouverte jusqu&#039;à ce que les éléments soient sur le disques.&lt;br /&gt;
* user - permet à n&#039;importe quel utilisateur de monter le système de fichiers (cela implique noexec,nosuid,nodev à moins qu&#039;il n&#039;y ait overridden).&lt;br /&gt;
* nouser - autorise seulement le compte root à monter le fichier système (par défaut).&lt;br /&gt;
* defaults - paramètres de montage par défaut (équivalent à rw,suid,dev,exec,auto,nouser,async).&lt;br /&gt;
* suid - autorise les opérations sur les bits suid et sgid. Le plus souvent cela permet d&#039;autoriser un utilisateur sur un ordinateur à exécuter un binaire avec une élévation temporaire des privilèges dans le but d&#039;effectuer une tache spécifique.&lt;br /&gt;
* nosuid - bloque les opérations sur les bits suid et sgid.&lt;br /&gt;
* noatime - Ne pas mettre à jour la date d&#039;accès sur l&#039;inode pour le système de fichier. Cela peut aider les performances.&lt;br /&gt;
* nodiratime - Ne pas mettre à jour la date d&#039;accès aux répertoires sur l&#039;inode pour le système de fichier. Cela peut aider les performances.&lt;br /&gt;
* relatime - mettre à jour la date d&#039;accès sur l&#039;inode par rapport au modification ou au changement de date. La date d&#039;accès est mise à jour seulement si le dernier accès est antérieur à la dernière modification ou changement de date (similaire à noatime mais ne casse pas mutt ou les autres applications qui ont besoin de savoir si le fichier a été lu depuis la dernière fois qu&#039;il a été modifié). Cela peut aider les performances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Un fstab qui n&#039;attends pas longtemps les montages réseau ==&lt;br /&gt;
* https://wiki.archlinux.org/title/Fstab#Remote_file_system&lt;br /&gt;
&lt;br /&gt;
En cas de montage réseau qui peut parfois être offline sans grosse conséquences, comme un nas, on peut préciser on timeout systemd assez court directement dans le fichier fstab : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
192.168.1.200:/data     /home/justine/NAS       nfs     defaults,nofail,x-systemd.device-timeout=9      0 0 &lt;br /&gt;
192.168.1.9:/data       /home/justine/Ceres     nfs     defaults,nofail,x-systemd.device-timeout=9      0 0&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a également :&lt;br /&gt;
* x-systemd.automount : permet de ne monter le montage que lors d&#039;un premier accès&lt;br /&gt;
* x-systemd.idle-timeout=1min : démonter automatiquement après 1 minutes sans accès&lt;br /&gt;
&lt;br /&gt;
= NTFS =&lt;br /&gt;
Pour monter une partition en NTFS, le principe est le même (récupération de l&#039;UUID, etc...). Il faut cependant installer le package ntfs-3g.&lt;br /&gt;
&lt;br /&gt;
Ensuite, la ligne dans fstab donne :&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
UUID=AEC0EE2CC0EDFA8B /home/justine/Data ntfs-3g defaults 0 2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erreur suite au montage de la partition sous Windows ==&lt;br /&gt;
En cas d&#039;erreur du type:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
The disk contains an unclean file system (0, 0).&lt;br /&gt;
Metadata kept in Windows cache, refused to mount.&lt;br /&gt;
Falling back to read-only mount because the NTFS partition is in an&lt;br /&gt;
unsafe state. Please resume and shutdown Windows fully (no hibernation&lt;br /&gt;
or fast restarting.)&lt;br /&gt;
Could not mount read-write, trying read-only&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut utiliser la commande ntfsfix, puis démonter et remonter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
justine@Ulysses ~ $ sudo ntfsfix /dev/sdb1&lt;br /&gt;
Mounting volume... The disk contains an unclean file system (0, 0).&lt;br /&gt;
Metadata kept in Windows cache, refused to mount.&lt;br /&gt;
FAILED&lt;br /&gt;
Attempting to correct errors... &lt;br /&gt;
Processing $MFT and $MFTMirr...&lt;br /&gt;
Reading $MFT... OK&lt;br /&gt;
Reading $MFTMirr... OK&lt;br /&gt;
Comparing $MFTMirr to $MFT... OK&lt;br /&gt;
Processing of $MFT and $MFTMirr completed successfully.&lt;br /&gt;
Setting required flags on partition... OK&lt;br /&gt;
Going to empty the journal ($LogFile)... OK&lt;br /&gt;
Checking the alternate boot sector... OK&lt;br /&gt;
NTFS volume version is 3.1.&lt;br /&gt;
NTFS partition /dev/sdb1 was processed successfully.&lt;br /&gt;
justine@Ulysses ~ $ sudo umount /dev/sdb1&lt;br /&gt;
justine@Ulysses ~ $ sudo mount -a &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Fstab&amp;diff=2563</id>
		<title>Fstab</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Fstab&amp;diff=2563"/>
		<updated>2025-11-11T17:57:45Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
= But de la manoeuvre =&lt;br /&gt;
&lt;br /&gt;
Le but est ici d&#039;ajouter une partition /dev/sda1 qui sera montée automatiquement au démarrage. On utilise ici une partition locale en ext4, mais le principe est le même pour une partition en réseau...&lt;br /&gt;
&lt;br /&gt;
== Récupération de l&#039;UUID == &lt;br /&gt;
&lt;br /&gt;
Toute partition a un ID unique, qui permettra de l&#039;identifier afin de la monter à coup sûr. Pour la récupérer, rien de plus simple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[justine@Argonaut Fastcop]$ sudo blkid /dev/sda1&lt;br /&gt;
/dev/sda1: LABEL=&amp;quot;Stockage&amp;quot; UUID=&amp;quot;980daaf8-ae75-4f21-b208-5fb33b3cf3f8&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTUUID=&amp;quot;c36284f8-7114-4198-b2fc-1d78babc8a3f&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je récupère ici UUID (980daaf...).&lt;br /&gt;
&lt;br /&gt;
== Modification du fichier ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
# /etc/fstab: static file system information.&lt;br /&gt;
#&lt;br /&gt;
# Use &#039;blkid&#039; to print the universally unique identifier for a device; this may&lt;br /&gt;
# be used with UUID= as a more robust way to name devices that works even if&lt;br /&gt;
# disks are added and removed. See fstab(5).&lt;br /&gt;
#&lt;br /&gt;
# &amp;lt;file system&amp;gt;             &amp;lt;mount point&amp;gt;  &amp;lt;type&amp;gt;  &amp;lt;options&amp;gt;  &amp;lt;dump&amp;gt;  &amp;lt;pass&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
UUID=980daaf8-ae75-4f21-b208-5fb33b3cf3f8 /home/justine/Stockage ext4 defaults 0 2 #Ligne rajoutée&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La ligne est composée de 6 champs :&lt;br /&gt;
* UUID=980daaf8-ae75-4f21-b208-5fb33b3cf3f8 : C&#039;est l&#039;UUID récupéré précédemment.&lt;br /&gt;
* /home/justine/Stockage : C&#039;est le point de montage, un dossier qui doit être existant.&lt;br /&gt;
* ext4 : Le formatage de la partition. On pourrait remplacer par glusterfs, par ex&lt;br /&gt;
* defaults : Ce champ contient les options au format option1,option2,option3. Defaults gère les droits d&#039;accès : ici, on prend les droits par défaut (les droits normaux). Voir plus bas pour la liste.&lt;br /&gt;
* 0 : &amp;lt;dump&amp;gt; - est utilisé par l&#039;utilitaire dump pour décider quand faire des sauvegardes. Quand il est installé, dump vérifie le chiffre inscrit et décide si le système de fichiers doit être sauvegardé. Les valeurs possibles sont 0 et 1. Si 0, dump va ignorer le système de fichier, si 1, dump fera une sauvegarde. La plupart des utilisateurs n&#039;auront pas dump d&#039;installé, ils pourront donc inscrire 0 dans le champ &amp;lt;dump&amp;gt;. &lt;br /&gt;
* 2 : &amp;lt;pass&amp;gt; fsck lit le chiffre &amp;lt;pass&amp;gt; et détermine dans quel ordre les systèmes de fichiers vont être vérifiés. Le champ peut prendre les valeurs 0,1 et 2. Le système de fichiers root devra avoir la priorité la plus haute : 1, tous les autres systèmes que vous voulez vérifier devront avoir un 2. Les systèmes de fichiers avec un &amp;lt;pass&amp;gt; à 0 ne seront pas vérifiés par l&#039;utilitaire fsck. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Recharger le fichier ==&lt;br /&gt;
&lt;br /&gt;
La commande est simple là aussi :&lt;br /&gt;
 mount -av&lt;br /&gt;
&lt;br /&gt;
= Liste des options =&lt;br /&gt;
&lt;br /&gt;
* nofail - ignorer les erreurs au démarrage pour ce fs. Important pour les montages réseau qui peuvent ne pas être disponibles !&lt;br /&gt;
* auto - le système de fichiers sera monté automatiquement au démarrage, ou quand la commande &#039;mount -a&#039; sera joué.&lt;br /&gt;
* noauto - le système de fichiers est monté que quand on lui demande de le faire (utile pour les FS qui ne sont pas forcément présents type clef USB).&lt;br /&gt;
* exec - autorise l&#039;exécution de binaire qui sont sur cette partition (par défaut).&lt;br /&gt;
* noexec - n&#039;autorise pas l&#039;exécution de binaires sur le système de fichier.&lt;br /&gt;
* ro - monte le système de fichiers en lecture seulement.&lt;br /&gt;
* rw - monte le système de fichiers en lecture et en écriture.&lt;br /&gt;
* sync - Les entrées/sorties (I/O) devraient être faites de manière synchrone.&lt;br /&gt;
* async - Les entrées/sorties (I/O) devraient être faites de manière asynchrone.&lt;br /&gt;
* flush - option spécifique pour le FAT afin de vider les données plus souvent, cela permettant aux fenêtres de copie et aux barres de progression de rester ouverte jusqu&#039;à ce que les éléments soient sur le disques.&lt;br /&gt;
* user - permet à n&#039;importe quel utilisateur de monter le système de fichiers (cela implique noexec,nosuid,nodev à moins qu&#039;il n&#039;y ait overridden).&lt;br /&gt;
* nouser - autorise seulement le compte root à monter le fichier système (par défaut).&lt;br /&gt;
* defaults - paramètres de montage par défaut (équivalent à rw,suid,dev,exec,auto,nouser,async).&lt;br /&gt;
* suid - autorise les opérations sur les bits suid et sgid. Le plus souvent cela permet d&#039;autoriser un utilisateur sur un ordinateur à exécuter un binaire avec une élévation temporaire des privilèges dans le but d&#039;effectuer une tache spécifique.&lt;br /&gt;
* nosuid - bloque les opérations sur les bits suid et sgid.&lt;br /&gt;
* noatime - Ne pas mettre à jour la date d&#039;accès sur l&#039;inode pour le système de fichier. Cela peut aider les performances.&lt;br /&gt;
* nodiratime - Ne pas mettre à jour la date d&#039;accès aux répertoires sur l&#039;inode pour le système de fichier. Cela peut aider les performances.&lt;br /&gt;
* relatime - mettre à jour la date d&#039;accès sur l&#039;inode par rapport au modification ou au changement de date. La date d&#039;accès est mise à jour seulement si le dernier accès est antérieur à la dernière modification ou changement de date (similaire à noatime mais ne casse pas mutt ou les autres applications qui ont besoin de savoir si le fichier a été lu depuis la dernière fois qu&#039;il a été modifié). Cela peut aider les performances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Un fstab qui n&#039;attends pas longtemps les montages réseau ==&lt;br /&gt;
&lt;br /&gt;
En cas de montage réseau qui peut parfois être offline sans grosse conséquences, comme un nas, on peut préciser on timeout systemd assez court directement dans le fichier fstab : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
192.168.1.200:/data     /home/justine/NAS       nfs     defaults,nofail,x-systemd.device-timeout=9      0 0 &lt;br /&gt;
192.168.1.9:/data       /home/justine/Ceres     nfs     defaults,nofail,x-systemd.device-timeout=9      0 0&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NTFS =&lt;br /&gt;
Pour monter une partition en NTFS, le principe est le même (récupération de l&#039;UUID, etc...). Il faut cependant installer le package ntfs-3g.&lt;br /&gt;
&lt;br /&gt;
Ensuite, la ligne dans fstab donne :&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
UUID=AEC0EE2CC0EDFA8B /home/justine/Data ntfs-3g defaults 0 2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erreur suite au montage de la partition sous Windows ==&lt;br /&gt;
En cas d&#039;erreur du type:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
The disk contains an unclean file system (0, 0).&lt;br /&gt;
Metadata kept in Windows cache, refused to mount.&lt;br /&gt;
Falling back to read-only mount because the NTFS partition is in an&lt;br /&gt;
unsafe state. Please resume and shutdown Windows fully (no hibernation&lt;br /&gt;
or fast restarting.)&lt;br /&gt;
Could not mount read-write, trying read-only&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut utiliser la commande ntfsfix, puis démonter et remonter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
justine@Ulysses ~ $ sudo ntfsfix /dev/sdb1&lt;br /&gt;
Mounting volume... The disk contains an unclean file system (0, 0).&lt;br /&gt;
Metadata kept in Windows cache, refused to mount.&lt;br /&gt;
FAILED&lt;br /&gt;
Attempting to correct errors... &lt;br /&gt;
Processing $MFT and $MFTMirr...&lt;br /&gt;
Reading $MFT... OK&lt;br /&gt;
Reading $MFTMirr... OK&lt;br /&gt;
Comparing $MFTMirr to $MFT... OK&lt;br /&gt;
Processing of $MFT and $MFTMirr completed successfully.&lt;br /&gt;
Setting required flags on partition... OK&lt;br /&gt;
Going to empty the journal ($LogFile)... OK&lt;br /&gt;
Checking the alternate boot sector... OK&lt;br /&gt;
NTFS volume version is 3.1.&lt;br /&gt;
NTFS partition /dev/sdb1 was processed successfully.&lt;br /&gt;
justine@Ulysses ~ $ sudo umount /dev/sdb1&lt;br /&gt;
justine@Ulysses ~ $ sudo mount -a &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Fstab&amp;diff=2562</id>
		<title>Fstab</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Fstab&amp;diff=2562"/>
		<updated>2025-11-11T17:57:29Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
= But de la manoeuvre =&lt;br /&gt;
&lt;br /&gt;
Le but est ici d&#039;ajouter une partition /dev/sda1 qui sera montée automatiquement au démarrage. On utilise ici une partition locale en ext4, mais le principe est le même pour une partition en réseau...&lt;br /&gt;
&lt;br /&gt;
== Récupération de l&#039;UUID == &lt;br /&gt;
&lt;br /&gt;
Toute partition a un ID unique, qui permettra de l&#039;identifier afin de la monter à coup sûr. Pour la récupérer, rien de plus simple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[justine@Argonaut Fastcop]$ sudo blkid /dev/sda1&lt;br /&gt;
/dev/sda1: LABEL=&amp;quot;Stockage&amp;quot; UUID=&amp;quot;980daaf8-ae75-4f21-b208-5fb33b3cf3f8&amp;quot; TYPE=&amp;quot;ext4&amp;quot; PARTUUID=&amp;quot;c36284f8-7114-4198-b2fc-1d78babc8a3f&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je récupère ici UUID (980daaf...).&lt;br /&gt;
&lt;br /&gt;
== Modification du fichier ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
# /etc/fstab: static file system information.&lt;br /&gt;
#&lt;br /&gt;
# Use &#039;blkid&#039; to print the universally unique identifier for a device; this may&lt;br /&gt;
# be used with UUID= as a more robust way to name devices that works even if&lt;br /&gt;
# disks are added and removed. See fstab(5).&lt;br /&gt;
#&lt;br /&gt;
# &amp;lt;file system&amp;gt;             &amp;lt;mount point&amp;gt;  &amp;lt;type&amp;gt;  &amp;lt;options&amp;gt;  &amp;lt;dump&amp;gt;  &amp;lt;pass&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
UUID=980daaf8-ae75-4f21-b208-5fb33b3cf3f8 /home/justine/Stockage ext4 defaults 0 2 #Ligne rajoutée&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La ligne est composée de 6 champs :&lt;br /&gt;
* UUID=980daaf8-ae75-4f21-b208-5fb33b3cf3f8 : C&#039;est l&#039;UUID récupéré précédemment.&lt;br /&gt;
* /home/justine/Stockage : C&#039;est le point de montage, un dossier qui doit être existant.&lt;br /&gt;
* ext4 : Le formatage de la partition. On pourrait remplacer par glusterfs, par ex&lt;br /&gt;
* defaults : Ce champ contient les options au format option1,option2,option3. Defaults gère les droits d&#039;accès : ici, on prend les droits par défaut (les droits normaux). Voir plus bas pour la liste.&lt;br /&gt;
* 0 : &amp;lt;dump&amp;gt; - est utilisé par l&#039;utilitaire dump pour décider quand faire des sauvegardes. Quand il est installé, dump vérifie le chiffre inscrit et décide si le système de fichiers doit être sauvegardé. Les valeurs possibles sont 0 et 1. Si 0, dump va ignorer le système de fichier, si 1, dump fera une sauvegarde. La plupart des utilisateurs n&#039;auront pas dump d&#039;installé, ils pourront donc inscrire 0 dans le champ &amp;lt;dump&amp;gt;. &lt;br /&gt;
* 2 : &amp;lt;pass&amp;gt; fsck lit le chiffre &amp;lt;pass&amp;gt; et détermine dans quel ordre les systèmes de fichiers vont être vérifiés. Le champ peut prendre les valeurs 0,1 et 2. Le système de fichiers root devra avoir la priorité la plus haute : 1, tous les autres systèmes que vous voulez vérifier devront avoir un 2. Les systèmes de fichiers avec un &amp;lt;pass&amp;gt; à 0 ne seront pas vérifiés par l&#039;utilitaire fsck. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Recharger le fichier ==&lt;br /&gt;
&lt;br /&gt;
La commande est simple là aussi :&lt;br /&gt;
 mount -av&lt;br /&gt;
&lt;br /&gt;
= Liste des options =&lt;br /&gt;
&lt;br /&gt;
* nofail - ignorer les erreurs au démarrage pour ce fs. Important pour les montages réseau qui peuvent ne pas être disponibles !&lt;br /&gt;
* auto - le système de fichiers sera monté automatiquement au démarrage, ou quand la commande &#039;mount -a&#039; sera joué.&lt;br /&gt;
* noauto - le système de fichiers est monté que quand on lui demande de le faire (utile pour les FS qui ne sont pas forcément présents type clef USB).&lt;br /&gt;
* exec - autorise l&#039;exécution de binaire qui sont sur cette partition (par défaut).&lt;br /&gt;
* noexec - n&#039;autorise pas l&#039;exécution de binaires sur le système de fichier.&lt;br /&gt;
* ro - monte le système de fichiers en lecture seulement.&lt;br /&gt;
* rw - monte le système de fichiers en lecture et en écriture.&lt;br /&gt;
* sync - Les entrées/sorties (I/O) devraient être faites de manière synchrone.&lt;br /&gt;
* async - Les entrées/sorties (I/O) devraient être faites de manière asynchrone.&lt;br /&gt;
* flush - option spécifique pour le FAT afin de vider les données plus souvent, cela permettant aux fenêtres de copie et aux barres de progression de rester ouverte jusqu&#039;à ce que les éléments soient sur le disques.&lt;br /&gt;
* user - permet à n&#039;importe quel utilisateur de monter le système de fichiers (cela implique noexec,nosuid,nodev à moins qu&#039;il n&#039;y ait overridden).&lt;br /&gt;
* nouser - autorise seulement le compte root à monter le fichier système (par défaut).&lt;br /&gt;
* defaults - paramètres de montage par défaut (équivalent à rw,suid,dev,exec,auto,nouser,async).&lt;br /&gt;
* suid - autorise les opérations sur les bits suid et sgid. Le plus souvent cela permet d&#039;autoriser un utilisateur sur un ordinateur à exécuter un binaire avec une élévation temporaire des privilèges dans le but d&#039;effectuer une tache spécifique.&lt;br /&gt;
* nosuid - bloque les opérations sur les bits suid et sgid.&lt;br /&gt;
* noatime - Ne pas mettre à jour la date d&#039;accès sur l&#039;inode pour le système de fichier. Cela peut aider les performances.&lt;br /&gt;
* nodiratime - Ne pas mettre à jour la date d&#039;accès aux répertoires sur l&#039;inode pour le système de fichier. Cela peut aider les performances.&lt;br /&gt;
* relatime - mettre à jour la date d&#039;accès sur l&#039;inode par rapport au modification ou au changement de date. La date d&#039;accès est mise à jour seulement si le dernier accès est antérieur à la dernière modification ou changement de date (similaire à noatime mais ne casse pas mutt ou les autres applications qui ont besoin de savoir si le fichier a été lu depuis la dernière fois qu&#039;il a été modifié). Cela peut aider les performances.&lt;br /&gt;
&lt;br /&gt;
= NTFS =&lt;br /&gt;
Pour monter une partition en NTFS, le principe est le même (récupération de l&#039;UUID, etc...). Il faut cependant installer le package ntfs-3g.&lt;br /&gt;
&lt;br /&gt;
Ensuite, la ligne dans fstab donne :&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
UUID=AEC0EE2CC0EDFA8B /home/justine/Data ntfs-3g defaults 0 2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erreur suite au montage de la partition sous Windows ==&lt;br /&gt;
En cas d&#039;erreur du type:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
The disk contains an unclean file system (0, 0).&lt;br /&gt;
Metadata kept in Windows cache, refused to mount.&lt;br /&gt;
Falling back to read-only mount because the NTFS partition is in an&lt;br /&gt;
unsafe state. Please resume and shutdown Windows fully (no hibernation&lt;br /&gt;
or fast restarting.)&lt;br /&gt;
Could not mount read-write, trying read-only&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut utiliser la commande ntfsfix, puis démonter et remonter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
justine@Ulysses ~ $ sudo ntfsfix /dev/sdb1&lt;br /&gt;
Mounting volume... The disk contains an unclean file system (0, 0).&lt;br /&gt;
Metadata kept in Windows cache, refused to mount.&lt;br /&gt;
FAILED&lt;br /&gt;
Attempting to correct errors... &lt;br /&gt;
Processing $MFT and $MFTMirr...&lt;br /&gt;
Reading $MFT... OK&lt;br /&gt;
Reading $MFTMirr... OK&lt;br /&gt;
Comparing $MFTMirr to $MFT... OK&lt;br /&gt;
Processing of $MFT and $MFTMirr completed successfully.&lt;br /&gt;
Setting required flags on partition... OK&lt;br /&gt;
Going to empty the journal ($LogFile)... OK&lt;br /&gt;
Checking the alternate boot sector... OK&lt;br /&gt;
NTFS volume version is 3.1.&lt;br /&gt;
NTFS partition /dev/sdb1 was processed successfully.&lt;br /&gt;
justine@Ulysses ~ $ sudo umount /dev/sdb1&lt;br /&gt;
justine@Ulysses ~ $ sudo mount -a &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Un fstab qui n&#039;attends pas longtemps les montages réseau ==&lt;br /&gt;
&lt;br /&gt;
En cas de montage réseau qui peut parfois être offline sans grosse conséquences, comme un nas, on peut préciser on timeout systemd assez court directement dans le fichier fstab : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
192.168.1.200:/data     /home/justine/NAS       nfs     defaults,nofail,x-systemd.device-timeout=9      0 0 &lt;br /&gt;
192.168.1.9:/data       /home/justine/Ceres     nfs     defaults,nofail,x-systemd.device-timeout=9      0 0&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Bases_de_donn%C3%A9es&amp;diff=2561</id>
		<title>Bases de données</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Bases_de_donn%C3%A9es&amp;diff=2561"/>
		<updated>2025-10-15T12:19:50Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* À chaud */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
[[Category:windows]]&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Cette introduction est tirée de&amp;amp;nbsp;&amp;amp;nbsp;: [https://openclassrooms.com/fr/courses/1959476-administrez-vos-bases-de-donnees-avec-mysql/1959710-introduction https://openclassrooms.com/fr/courses/1959476-administrez-vos-bases-de-donnees-avec-mysql/1959710-introduction]&lt;br /&gt;
&lt;br /&gt;
== Concepts de base ==&lt;br /&gt;
&lt;br /&gt;
Une base de données informatique est un ensemble de données qui ont été stockées sur un support informatique, organisées et structurées de manière à pouvoir facilement consulter et modifier leur contenu.&lt;br /&gt;
&lt;br /&gt;
Ainsi, la base de données d&#039;un site web pourrait contenir la liste des membres, les articles, etc... Cette abse de données doit non suelement exister, mais on doit pouvoir interagir avec et la gérer&amp;amp;nbsp;: on doit pouvoir utiliser des requêtes MySQL pour pouvoir modifier cette base. Nous avons donc besoin de&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Une base de données &lt;br /&gt;
*un système pour la gérer &lt;br /&gt;
*Un langage pour transmettre des instructions &lt;br /&gt;
&lt;br /&gt;
== SGBD ==&lt;br /&gt;
&lt;br /&gt;
Un SGBD est un logiciel permettant de manipuler les données d&#039;une base de données, c&#039;est-à-dire les sélectionner, les afficher, les modifier, en ajouter ou en supprimer (CRUD&amp;amp;nbsp;: Create, Read, Update, Delete). MySQL est un SGBD. Les SGBD suivent en général le modèle client-serveur.&lt;br /&gt;
&lt;br /&gt;
== SGBDR ==&lt;br /&gt;
&lt;br /&gt;
Le R en plus signifie &amp;quot;Relationnel&amp;quot;. C&#039;est un SGBD qui implémente la théorie relationnelle. La théorie relationnelle c&#039;est compliqué, mais cela signifie en gros que les données sont contenues dans des relations, représentées sous forme de tables. Une relation est composée d&#039;une en-tête et d&#039;un corps. L&#039;en-tête contient plusieurs attributs (pour un client on aura par exemple nom, prénom, adresse...). Le corps est quant à lui un ensemble de lignes (ou n-uplets) composé d&#039;autant d&#039;éléments qu&#039;il y&#039;a de d&#039;attributs dans le corps. Exemple avec 4 lignes pour la relation client&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;hoveredCourseElement&amp;quot; data-claire-element-id=&amp;quot;2235214&amp;quot; id=&amp;quot;r-2062899&amp;quot;&lt;br /&gt;
|- data-claire-element-id=&amp;quot;2235212&amp;quot; id=&amp;quot;r-2062897&amp;quot;&lt;br /&gt;
! data-claire-element-id=&amp;quot;2129013&amp;quot; id=&amp;quot;r-1977213&amp;quot; | &lt;br /&gt;
Numéro&lt;br /&gt;
&lt;br /&gt;
! data-claire-element-id=&amp;quot;2235209&amp;quot; id=&amp;quot;r-2062894&amp;quot; | &lt;br /&gt;
Prénom&lt;br /&gt;
&lt;br /&gt;
! data-claire-element-id=&amp;quot;2235211&amp;quot; id=&amp;quot;r-2062896&amp;quot; | &lt;br /&gt;
Nom&lt;br /&gt;
&lt;br /&gt;
! data-claire-element-id=&amp;quot;2129019&amp;quot; id=&amp;quot;r-1977219&amp;quot; | &lt;br /&gt;
Email&lt;br /&gt;
&lt;br /&gt;
|- data-claire-element-id=&amp;quot;2129030&amp;quot; id=&amp;quot;r-1977230&amp;quot;&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129023&amp;quot; id=&amp;quot;r-1977223&amp;quot; | &lt;br /&gt;
1&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129025&amp;quot; id=&amp;quot;r-1977225&amp;quot; | &lt;br /&gt;
Jean&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129027&amp;quot; id=&amp;quot;r-1977227&amp;quot; | &lt;br /&gt;
Dupont&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129029&amp;quot; id=&amp;quot;r-1977229&amp;quot; | &lt;br /&gt;
jdupont@email.com&lt;br /&gt;
&lt;br /&gt;
|- data-claire-element-id=&amp;quot;2129039&amp;quot; id=&amp;quot;r-1977239&amp;quot;&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129032&amp;quot; id=&amp;quot;r-1977232&amp;quot; | &lt;br /&gt;
2&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129034&amp;quot; id=&amp;quot;r-1977234&amp;quot; | &lt;br /&gt;
Marie&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129036&amp;quot; id=&amp;quot;r-1977236&amp;quot; | &lt;br /&gt;
Malherbe&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129038&amp;quot; id=&amp;quot;r-1977238&amp;quot; | &lt;br /&gt;
mama@email.com&lt;br /&gt;
&lt;br /&gt;
|- data-claire-element-id=&amp;quot;2129048&amp;quot; id=&amp;quot;r-1977248&amp;quot;&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129041&amp;quot; id=&amp;quot;r-1977241&amp;quot; | &lt;br /&gt;
3&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129043&amp;quot; id=&amp;quot;r-1977243&amp;quot; | &lt;br /&gt;
Nicolas&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129045&amp;quot; id=&amp;quot;r-1977245&amp;quot; | &lt;br /&gt;
Jacques&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129047&amp;quot; id=&amp;quot;r-1977247&amp;quot; | &lt;br /&gt;
Jacques.nicolas@email.com&lt;br /&gt;
&lt;br /&gt;
|- data-claire-element-id=&amp;quot;2129057&amp;quot; id=&amp;quot;r-1977257&amp;quot;&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129050&amp;quot; id=&amp;quot;r-1977250&amp;quot; | &lt;br /&gt;
4&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129052&amp;quot; id=&amp;quot;r-1977252&amp;quot; | &lt;br /&gt;
Hadrien&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129054&amp;quot; id=&amp;quot;r-1977254&amp;quot; | &lt;br /&gt;
Piroux&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129056&amp;quot; id=&amp;quot;r-1977256&amp;quot; | &lt;br /&gt;
happi@email.com&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Les opérations&amp;amp;nbsp;: ===&lt;br /&gt;
&lt;br /&gt;
Différentes opérations peuvent être appliquées à ces relations pour en tirer des des informations (issues de la logique formelle et de la théorie des ensembles, apparement):&lt;br /&gt;
&lt;br /&gt;
[[File:OperSGBD.png|526x224px|OperSGBD.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Exemple de la jointure&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[File:Jointure.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
Ici, on relie les deux tables par le numéro de client.&lt;br /&gt;
&lt;br /&gt;
== Quelques SGBDR ==&lt;br /&gt;
&lt;br /&gt;
*MySQL&amp;amp;nbsp;: L&#039;un des plus utilisés, il utilise SQL. Il est open source. Il a été créé en 1994 par Widenius et Axmark, mais a depuis été racheté par Oracle, et a forké pour devenir MariaDB dans sa version Open source. Il est très utilisé mais a de nombreux défauts, car il ne suit pas toujours les normes officielles, et peux parfois manquer de certaines fonctions avancées. &lt;br /&gt;
*PostGreSQL&amp;amp;nbsp;: Il est open source, lui aussi. Moins connu, il semble cependant actuellement équivalent à MySQL en termes de ressources. Le langage procédural qu&#039;il utilise s&#039;appelle le PL/pgSQL. &lt;br /&gt;
*Access&amp;amp;nbsp;: propriété de Microsoft, il n&#039;est pas du tout adapté aux gros volumes de données. Il a cependant une interface graphique&amp;amp;nbsp;!&amp;amp;nbsp;:D &lt;br /&gt;
*SQLite&amp;amp;nbsp;: Pas en client-serveur, il stocke les données dans de simples fichiers. Il est adapté quand on a pas la possibilité d&#039;installer un serveur de base de données. Il est très performant pour les tout petits volumes de données, mais difficile à sécuriser. &lt;br /&gt;
&lt;br /&gt;
== Organisation d&#039;une base de données relationnelle ==&lt;br /&gt;
&lt;br /&gt;
Comme nous dans la vie courante, une base de données classe les informations d&#039;une façon logique. Les données sont représentées sous forme de tables&amp;amp;nbsp;: une base de données contiendra plusieurs tables. Dans chaque table se trouveront un certain nombre de colonnes. Ainsi, les données seront introduites sous formes de lignes dans la table. C&#039;est tout simplement&amp;amp;nbsp;: UN TABLEAU&amp;amp;nbsp;! Comme ça&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;hoveredCourseElement&amp;quot; data-claire-element-id=&amp;quot;2235214&amp;quot; id=&amp;quot;r-2062899&amp;quot;&lt;br /&gt;
|- data-claire-element-id=&amp;quot;2235212&amp;quot; id=&amp;quot;r-2062897&amp;quot;&lt;br /&gt;
! data-claire-element-id=&amp;quot;2129013&amp;quot; id=&amp;quot;r-1977213&amp;quot; | &lt;br /&gt;
Numéro&lt;br /&gt;
&lt;br /&gt;
! data-claire-element-id=&amp;quot;2235209&amp;quot; id=&amp;quot;r-2062894&amp;quot; | &lt;br /&gt;
Prénom&lt;br /&gt;
&lt;br /&gt;
! data-claire-element-id=&amp;quot;2235211&amp;quot; id=&amp;quot;r-2062896&amp;quot; | &lt;br /&gt;
Nom&lt;br /&gt;
&lt;br /&gt;
! data-claire-element-id=&amp;quot;2129019&amp;quot; id=&amp;quot;r-1977219&amp;quot; | &lt;br /&gt;
Email&lt;br /&gt;
&lt;br /&gt;
|- data-claire-element-id=&amp;quot;2129030&amp;quot; id=&amp;quot;r-1977230&amp;quot;&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129023&amp;quot; id=&amp;quot;r-1977223&amp;quot; | &lt;br /&gt;
1&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129025&amp;quot; id=&amp;quot;r-1977225&amp;quot; | &lt;br /&gt;
Jean&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129027&amp;quot; id=&amp;quot;r-1977227&amp;quot; | &lt;br /&gt;
Dupont&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129029&amp;quot; id=&amp;quot;r-1977229&amp;quot; | &lt;br /&gt;
jdupont@email.com&lt;br /&gt;
&lt;br /&gt;
|- data-claire-element-id=&amp;quot;2129039&amp;quot; id=&amp;quot;r-1977239&amp;quot;&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129032&amp;quot; id=&amp;quot;r-1977232&amp;quot; | &lt;br /&gt;
2&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129034&amp;quot; id=&amp;quot;r-1977234&amp;quot; | &lt;br /&gt;
Marie&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129036&amp;quot; id=&amp;quot;r-1977236&amp;quot; | &lt;br /&gt;
Malherbe&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129038&amp;quot; id=&amp;quot;r-1977238&amp;quot; | &lt;br /&gt;
mama@email.com&lt;br /&gt;
&lt;br /&gt;
|- data-claire-element-id=&amp;quot;2129048&amp;quot; id=&amp;quot;r-1977248&amp;quot;&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129041&amp;quot; id=&amp;quot;r-1977241&amp;quot; | &lt;br /&gt;
3&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129043&amp;quot; id=&amp;quot;r-1977243&amp;quot; | &lt;br /&gt;
Nicolas&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129045&amp;quot; id=&amp;quot;r-1977245&amp;quot; | &lt;br /&gt;
Jacques&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129047&amp;quot; id=&amp;quot;r-1977247&amp;quot; | &lt;br /&gt;
Jacques.nicolas@email.com&lt;br /&gt;
&lt;br /&gt;
|- data-claire-element-id=&amp;quot;2129057&amp;quot; id=&amp;quot;r-1977257&amp;quot;&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129050&amp;quot; id=&amp;quot;r-1977250&amp;quot; | &lt;br /&gt;
4&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129052&amp;quot; id=&amp;quot;r-1977252&amp;quot; | &lt;br /&gt;
Hadrien&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129054&amp;quot; id=&amp;quot;r-1977254&amp;quot; | &lt;br /&gt;
Piroux&lt;br /&gt;
&lt;br /&gt;
| data-claire-element-id=&amp;quot;2129056&amp;quot; id=&amp;quot;r-1977256&amp;quot; | &lt;br /&gt;
happi@email.com&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
= Premier TP&amp;amp;nbsp;: MySQL/MariaDB =&lt;br /&gt;
&lt;br /&gt;
Le fichier du TP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf&amp;gt;Fichier:Tpbd1.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but final de ce travail sera de mettre en place une plateforme Debian, avec un serveur LAMP. On y ajoutera MySQL, un CMS, avant de migrer vers MariaDB et même de migrer vers un cluster MariaDB. Des sauvegardes et restaurations automatiques et incrémentales seront mises en place.&lt;br /&gt;
&lt;br /&gt;
À chacun des étapes, il est important de faire un snapshot.&lt;br /&gt;
&lt;br /&gt;
== Installation de la machine de base et configuration du réseau ==&lt;br /&gt;
&lt;br /&gt;
Le système de base sera une Debian 9.5, dotée d&#039;un serveur SSH et des composants habituels du système. Je pars d&#039;une machine de base que je clone dans Virtualbox pour ne pas avoir à recommencer l&#039;installation à chaque fois (je les range dans le groupe &amp;quot;machines fraîches&amp;quot;): il faut bien penser à changer les adresses MAC ainsi que les noms d&#039;hôtes. Les machines seront reliées entre elles en mode &amp;quot;réseau NAT&amp;quot;. Au passage, je clone aussi une Debian avec interface graphique que j&#039;avais de côté et qui me servira de navigateur web, et qui sera aussi dans le réseau NAT.&lt;br /&gt;
&lt;br /&gt;
=== Réseau NAT: ===&lt;br /&gt;
&lt;br /&gt;
Le réseau NAT crée un réseau similaire à un réseau domestique, Virtualbox agissant comme une box (routeur + DHCP). Il faut pour cela:&lt;br /&gt;
&lt;br /&gt;
*Aller dans les paramètres virtualbox &amp;gt; réseau &amp;gt; créer un réseau NAT, et choisir les paramètres. &lt;br /&gt;
*On peut créer des redirections de ports à cet endroit&amp;amp;nbsp;: ce paramètre agit comme n&#039;importe quel PAT sur un routeur (le principe est le même que sur PfSense). &lt;br /&gt;
*Se rendre dans les paramètres de la / des VMs et choisir l&#039;option &amp;quot;Réseau NAT&amp;quot; avec ce réseau. &lt;br /&gt;
&lt;br /&gt;
==== Résolution de problème: ====&lt;br /&gt;
&lt;br /&gt;
Ça ne fonctionne pas sur la version &amp;quot;dépôt&amp;quot; de virtualbox sur Ubuntu 18.10. Les étapes que j&#039;ai suivies:&lt;br /&gt;
&lt;br /&gt;
*Télécharger Virtualbox depuis le site officiel dans sa dernière version. &lt;br /&gt;
&lt;br /&gt;
Après un plantage à l&#039;installation, apt me bloquait avec le message &amp;quot;Virtualbox-5.2 doit être réinstallé, mais impossible de trouver son archive&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
*sudo dpkg --configure -a &lt;br /&gt;
*relancer l&#039;installation avec dpkg -i (et non pas avec gdebi&amp;amp;nbsp;!) sur le .deb précédemment téléchargé.&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
=== Redirection de port&amp;amp;nbsp;: ===&lt;br /&gt;
&lt;br /&gt;
La règle que j&#039;ai créée est la suivante&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
[[File:RedirSSH.png|RTENOTITLE]]&lt;br /&gt;
&lt;br /&gt;
J&#039;ai ensuite ouvert le port via UFW.&lt;br /&gt;
&lt;br /&gt;
La redirection fonctionne ensuite en lancant la commande suivante depuis ma machine hôte&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ssh justine@127.0.0.1 -p 2222&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation de la plateforme LAMP ==&lt;br /&gt;
&lt;br /&gt;
À ce stade, je commence par installer sudo et vim, ce qui sera plus simple pour la suite&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;su&amp;lt;br/&amp;gt; apt update&amp;lt;br/&amp;gt; apt install sudo&amp;lt;br/&amp;gt; apt install vim&amp;lt;br/&amp;gt; ###Je rajoute mon utilisateur justine en éditant le fichier /etc/sudoers&amp;lt;br/&amp;gt; visudo&amp;lt;br/&amp;gt; exit&amp;lt;/div&amp;gt; &lt;br /&gt;
On installe ensuite mysql:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo apt install mysql-server mysql-client&amp;lt;br/&amp;gt; ###J&#039;ai déjà update juste avant, pas besoin de recommencer&amp;lt;br/&amp;gt; ###MariaDB ne demande pas de mot de passe pour le root mysql (il n&#039;en a pas!)&amp;lt;br/&amp;gt; ###Comme je suis sous Debian, cette commande installe MariaDB&amp;lt;/div&amp;gt; &amp;lt;blockquote&amp;gt;&lt;br /&gt;
Avec MariaDB, le root n&#039;as pas de mot de passe. Je peux voir ça avec&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo mysql -u root -p&amp;lt;br/&amp;gt; #Rentrer n&#039;importe quel mdp&amp;lt;br/&amp;gt; use mysql;&amp;lt;br/&amp;gt; select User,Password,Plugin from user where User=&#039;root&#039;;&amp;lt;br/&amp;gt; #Je vois bien le champ &amp;quot;Password&amp;quot; vide&amp;amp;nbsp;!!!! et le Plugin &amp;quot;unix_socket&amp;quot;&amp;lt;/div&amp;gt; &lt;br /&gt;
En effet,&amp;amp;nbsp; avec MariaDB, le root mysql utilise le root Linux&amp;amp;nbsp;!&lt;br /&gt;
&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
On modifie le fichier de configuration du serveur dans le cadre du TP et on redémarre:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;&lt;br /&gt;
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf&amp;lt;br/&amp;gt; ###Utiliser la recherche pour remplacer bind-address par 0.0.0.0&amp;lt;br/&amp;gt; sudo service mysql restart&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;amp;nbsp;Installation du serveur web et des composants PHP:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo apt install apache2&amp;lt;br/&amp;gt; ###Vérifier qu&#039;il fonctionne avec la machine &amp;quot;navigateur&amp;quot;&amp;lt;br/&amp;gt; sudo apt install php libapache2-mod-php&amp;lt;br/&amp;gt; sudo /etc/init.d/apache2 restart&amp;lt;br/&amp;gt; ###Le serveur est redémarré&amp;amp;nbsp;!&amp;lt;/div&amp;gt; &lt;br /&gt;
Test de la configuration PHP: on va créer un fichier servant à tester que PHP fonctionne.&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo vim /var/www/html/test.php&amp;lt;br/&amp;gt; ###Contrairement à ce que dit le TP, il faut mettre notre fichier php dans le dossier html, qui est la racine du serveur de base&amp;lt;br/&amp;gt; ###Je peux ensuite vérifier en allant sur [http://10.0.2.15/test.php http://10.0.2.15/test.php] qu&#039;il s&#039;affiche bien&amp;lt;br/&amp;gt; ###contenu du fichier de test php:&amp;lt;br/&amp;gt; &amp;lt;?php&amp;lt;br/&amp;gt; phpinfo();&amp;lt;br/&amp;gt; &amp;amp;nbsp;?&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;amp;nbsp;On installe le support mysql de php:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo apt install php-mysql&amp;lt;br/&amp;gt; ###Redémarrage d&#039;Apache&amp;lt;br/&amp;gt; sudo /etc/init.d/apache2 restart&amp;lt;br/&amp;gt; ###Retourner voir la page de test php en la rafraîchissant que les modules mysql se sont ajoutés (dans les .ini)&amp;lt;/div&amp;gt; &lt;br /&gt;
NOTE&amp;amp;nbsp;: une petite liste des paquets php qui pourraient s&#039;avérér utiles par la suite: php-curl php-pear php-gd php-intl php-imagick php-imap php-mcrypt php-memcache php-pspell php-recode php-snmp php-sqlite php-tidy php-xmlrpc php-xs&lt;br /&gt;
&lt;br /&gt;
=== Installation de phpmyadmin ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo apt install phpmyadmin&amp;lt;br/&amp;gt; ###Choisir le serveur apache&amp;lt;br/&amp;gt; ###Choisir la base de données db-common et entrer un mot de passe&amp;lt;br/&amp;gt; ###Une fois installé, je peux me connecter via [http://10.0.2.15/phpmyadmin http://10.0.2.15/phpmyadmin]&amp;lt;br/&amp;gt; ###Identifiants&amp;amp;nbsp;: phpmyadmin et mot de passe précédemment entré&amp;lt;/div&amp;gt; &lt;br /&gt;
Les informations sur les utilisateurs et les privilèges sont stockés dans la base de données &amp;quot;mysql&amp;quot;.&amp;amp;nbsp; Ses 4 tables importantes pour les privilèges:&lt;br /&gt;
&lt;br /&gt;
*db&amp;amp;nbsp;: privilèges sur les bdd &lt;br /&gt;
*tables_priv&amp;amp;nbsp;: privilèges sur les tables &lt;br /&gt;
*columns_priv&amp;amp;nbsp;: privilèges sur les colonnes &lt;br /&gt;
*procs_priv&amp;amp;nbsp;: privilèges sur les routines &lt;br /&gt;
&lt;br /&gt;
== Installation de Wordpress ==&lt;br /&gt;
&lt;br /&gt;
Nous allons ici procéder à une installation de type LAMP normale, en production on pourrait utiliser le paquet Debian.&lt;br /&gt;
&lt;br /&gt;
Téléchargement de Wordpress:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;wget [http://wordpress.org/latest.zip http://wordpress.org/latest.zip]&amp;lt;/div&amp;gt; &lt;br /&gt;
Création de la base de données pour wordpress et de l&#039;utilisateur:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo mysql -u root -p #Comme expliqué plus haut, pas de mot de passe&amp;lt;br/&amp;gt; CREATE DATABASE wordpress;&amp;lt;br/&amp;gt; create user &#039;wordpressuser&#039;;&amp;lt;br/&amp;gt; set password for &#039;wordpressuser&#039; = PASSWORD(&#039;Prevert77&#039;);&amp;lt;br/&amp;gt; grant all privileges on wordpress.* to wordpressuser@localhost identified by &#039;Prevert77&#039;;&amp;lt;br/&amp;gt; ###On a un utilisateur pour wordpress qui a tous les droits sur sa base&amp;lt;br/&amp;gt; exit&amp;lt;/div&amp;gt; &lt;br /&gt;
Installation de wordpress:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo apt install zip&amp;lt;br/&amp;gt; sudo unzip latest.zip -d /var/www/html/&amp;lt;br/&amp;gt; ###Les droits&amp;amp;nbsp;: le dossier wordpress doit appartenir à l&#039;utilisateur et au groupe d&#039;apache (www-data), et avoir des droits en lecture, écriture, exécution&amp;lt;br/&amp;gt; sudo chown -Rf www-data:www-data /var/www/html/wordpress/&amp;lt;br/&amp;gt; sudo chown 775 -R /var/www/html/wordpress/&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;amp;nbsp;À l&#039;aide de ma machine navigateur, je vais procéder à l&#039;installation sur [http://10.0.2.15/wordpress http://10.0.2.15/wordpress].&lt;br /&gt;
&lt;br /&gt;
Il a fallu que je crée moi-même le fichier wp-config.php, que je copie le texte suggéré dedans, que je le donne à www-data et que je lui donne les droits 775.&lt;br /&gt;
&lt;br /&gt;
Une fois fait, remplir les quelques boîtes (nom, mot de passe...) et le site s&#039;installe. Il est assez lent sur une VM à 512mo de RAM, pour l&#039;instant en tout cas.&lt;br /&gt;
&lt;br /&gt;
== Actions sur la base de données ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion de droits ===&lt;br /&gt;
&lt;br /&gt;
Il y&#039;a deux commande mysql pour gérer les droits:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;GRANT nom_action ON nom_table TO nom_utilisateur&amp;lt;/code&amp;gt;&amp;amp;nbsp;: Permet d&#039;attribuer des droits/privilèges &lt;br /&gt;
*&amp;lt;code&amp;gt;REVOKE nom_action ON nom_table TO nom_utilisateur&amp;lt;/code&amp;gt;&amp;amp;nbsp;: Permet de supprimer des droits &lt;br /&gt;
*DROP&amp;amp;nbsp;: pour supprimer un utilisateur &lt;br /&gt;
&lt;br /&gt;
=== Réparer une table ===&lt;br /&gt;
&lt;br /&gt;
En cas de message &amp;quot;Table is marked as crashed and should be repaired&amp;quot;&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;repair table nombase.nomtable&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tests pour le TP ===&lt;br /&gt;
&lt;br /&gt;
Je vais commencer par créer un utilisateur &amp;quot;invite&amp;quot; , puis lui donner différents droits sur la table wordpress:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;create user &#039;invite&#039;;&amp;lt;br/&amp;gt; create database invite;&amp;lt;br/&amp;gt; use wordpress;&amp;lt;br/&amp;gt; ###Tests d&#039;attribution de droits&amp;lt;br/&amp;gt; grant insert on * to invite;&amp;lt;br/&amp;gt; grant insert on wp_posts to invite;&amp;lt;br/&amp;gt; grant all on * to invite;&amp;lt;br/&amp;gt; revoke insert on * from invite;&amp;lt;br/&amp;gt; revoke insert on wp_posts from invite;&amp;lt;br/&amp;gt; revoke all privileges on * from invite;&amp;lt;br/&amp;gt; ###Les commandes sont assez explicites&amp;lt;/div&amp;gt; &lt;br /&gt;
== &amp;amp;nbsp;Sécurisation de MySQL ==&lt;br /&gt;
&lt;br /&gt;
On commence par lancer la commande sudo mysql_secure_installation. Ensuite, dans les différents dialogues qui s&#039;ouvrent&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Choisir un mot de passe root &lt;br /&gt;
*Supprimer l&#039;utilisateur anonyme (authentification obligatoire) &lt;br /&gt;
*empêcher les connexion root depuis le réseau (seulement depuis le local) &lt;br /&gt;
*Supprimer la base de test&amp;amp;nbsp;: elle est par défaut accessible à tout le monde, et en plus par défaut tout le monde a tous les privilèges sur les tables commencant par test_ &lt;br /&gt;
*Faire un flush des privilèges &lt;br /&gt;
&lt;br /&gt;
== Récupération d&#039;un mot de passe root perdu ==&lt;br /&gt;
&lt;br /&gt;
La méthode fournie dans le TP ne fonctionne pas chez moi (problèmes de sockets de connexion), c&#039;est apparement la méthode &amp;quot;à l&#039;ancienne, je la note quand même:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;###Je stoppe le service&amp;amp;nbsp;:&amp;lt;br/&amp;gt; sudo systemctl stop mysql&amp;lt;br/&amp;gt; ###Démarrage en mode de récupération&amp;lt;br/&amp;gt; &amp;amp;nbsp;mysqld_safe --skip-grant-tables &amp;amp;&amp;lt;br/&amp;gt; ###Connexion:&amp;lt;br/&amp;gt; mysql -u root&amp;lt;br/&amp;gt; ###Mise à jour du mdp&amp;lt;br/&amp;gt; use mysql;&amp;lt;br/&amp;gt; update user set password=PASSWORD(&amp;quot;NEW-ROOT-PASSWORD&amp;quot;) where User=&#039;root&#039;;&amp;lt;br/&amp;gt; flush privileges;&amp;lt;br/&amp;gt; quit&amp;lt;br/&amp;gt; #Redémarrage&amp;lt;br/&amp;gt; sudo systemctl restart mysql&amp;lt;/div&amp;gt; &lt;br /&gt;
La méthode qui fonctionne chez moi:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;###Je stoppe le service&amp;lt;br/&amp;gt; sudo systemctl stop mysql&amp;lt;br/&amp;gt; ###On change une variable d&#039;environnement pour être en mode récupération&amp;lt;br/&amp;gt; sudo systemctl set-environment MYSQLD_OPTS=&amp;quot;--skip-grant-tables&amp;quot;&amp;lt;br/&amp;gt; ###Redémarrage&amp;lt;br/&amp;gt; sudo systemctl start mysql&amp;lt;br/&amp;gt; ###Connexion et modification du mot de passe&amp;lt;br/&amp;gt; sudo mysql -u root&amp;lt;br/&amp;gt; use mysql;&amp;lt;br/&amp;gt; update user set password=PASSWORD(&amp;quot;Prevert77&amp;quot;) where user=&#039;root&#039;;&amp;lt;br/&amp;gt; flush privileges;&amp;lt;br/&amp;gt; exit;&amp;lt;br/&amp;gt; ###Unset de la variable&amp;amp;nbsp;:&amp;lt;br/&amp;gt; sudo systemctl unset-environment MYSQL_OPTS=&amp;quot;--skip-grant-tables&amp;quot;&amp;lt;br/&amp;gt; sudo systemctl restart mysql&amp;lt;br/&amp;gt; ###La connexion fonctionne&amp;lt;/div&amp;gt; &lt;br /&gt;
== Supervision et amélioration ==&lt;br /&gt;
&lt;br /&gt;
=== MySQLTuner: ===&lt;br /&gt;
&lt;br /&gt;
Script PERL qui permet d&#039;optimiser les perfs et de faire un diagnostic&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;wget [https://raw.github.com/major/MySQLTuner-perl/master/mysqltuner.pl https://raw.github.com/major/MySQLTuner-perl/master/mysqltuner.pl]&amp;lt;br/&amp;gt; perl mysqltuner.pl&amp;lt;/div&amp;gt; &lt;br /&gt;
Il donne quelques informations, notamment sur la RAM; cependant il n&#039;as pas l&#039;air très bien optimisé pour MariaDB.&lt;br /&gt;
&lt;br /&gt;
=== Mytop ===&lt;br /&gt;
&lt;br /&gt;
Similaire à top, mais pour les bases de données&amp;amp;nbsp;: il est intégré par défaut à MariaDB et est accesible via la commande mytop:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;###Plusieurs façons de le lancer&amp;lt;br/&amp;gt; mytop&amp;lt;br/&amp;gt; mytop --prompt -d wordpress ##Pour la base de données wordpress&amp;lt;/div&amp;gt; &lt;br /&gt;
=== Utilisation des fichiers modèles, adaptés à différentes machines ===&lt;br /&gt;
&lt;br /&gt;
Inexistants chez moi... On est censés avoir différentes configurations à recopier vers my.cnf dans /usr/share/doc/mysql-server-X/.&lt;br /&gt;
&lt;br /&gt;
=== Fine-tuning ===&lt;br /&gt;
&lt;br /&gt;
Modifier le fichier /etc/mysql/mariadb.conf.d/50-server.cnf:&lt;br /&gt;
&lt;br /&gt;
*thread_concurrency&amp;amp;nbsp;: Peut être activé suivi du nombre de threads de la machine &lt;br /&gt;
*slow_query_log&amp;amp;nbsp;: En précisant le fichier (juste à décommenter une ligne normalement), loggue les requêtes lentes. On rajoute slow_query_time = 2 pour indiquer le temps le plus lent. &lt;br /&gt;
*&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
=== Logs ===&lt;br /&gt;
&lt;br /&gt;
Par défaut, MariaDB loggue dans journalctl. Il a aussi son dossier dans /var/log/mysql.&amp;lt;br/&amp;gt; On peut configurer pas mal d&#039;options de log dans le fichier de serveur, cependant il faut bien lire les indications&amp;amp;nbsp;!&amp;lt;br/&amp;gt; Quand il y&#039;a beaucoup de transactions, il est necéssaire de changer les logs de disque&amp;amp;nbsp;: cela fait trop pour un seul en écrivant les logs ET les données&amp;amp;nbsp;: le grand nombre d&#039;entrées/sorties pénalise la réactivité du cluster.&amp;lt;br/&amp;gt; &amp;lt;br/&amp;gt; Pour rappel, le fichier de serveur est dans /etc/mysql/mariadb.conf.d&amp;lt;br/&amp;gt; &amp;lt;br/&amp;gt; Il faut aussi purger régulièrement les logs.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Sauvegardes complètes ou partielles ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
NB&amp;amp;nbsp;: On sauvegarde souvent une (ou plusieurs) base en omettant de sauvegarder&amp;lt;br/&amp;gt; également les utilisateurs et leurs privilèges. Ces informations sont dans la table users de&amp;lt;br/&amp;gt; la base mysql.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
=== À chaud ===&lt;br /&gt;
&lt;br /&gt;
On peut réaliser un backup sans arrêter le serveur de données. On va pour cela passer par mysqldump, un outil fourni avec mysqld.&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;MYSQL_PWD=Prevert77&amp;lt;br/&amp;gt; ###Ne pas noter tel quel dans un script, mais utiliser une variable d&#039;environnement&amp;lt;br/&amp;gt; sudo mysqldump --user=root --all-databases | gzip &amp;gt; save.mysql.sql.gz&amp;lt;br/&amp;gt; ###Il faut utiliser sudo pour que ça fonctionne&amp;amp;nbsp;!&amp;lt;/div&amp;gt; &lt;br /&gt;
Le fichier généré contient toutes les commandes servant à recréer les bases de données.&lt;br /&gt;
&lt;br /&gt;
=== À froid ===&lt;br /&gt;
&lt;br /&gt;
Il est rarement possible de stopper une base de données en production. Cependant, c&#039;est possible si l&#039;on a de la réplication. Cela consiste simplement à archiver les fichiers:&lt;br /&gt;
&lt;br /&gt;
*var/lib/mysql/ &lt;br /&gt;
*/var/log/mysql/ &lt;br /&gt;
&lt;br /&gt;
Pour les tables MyISAM, il s&#039;agit des fichiers .FRM, .MYI et .MYD; pour InnoDB .FRM, ibdata (données), tables .ibd, et logs iblogfile.&lt;br /&gt;
&lt;br /&gt;
== Restauration ==&lt;br /&gt;
&lt;br /&gt;
=== À chaud ===&lt;br /&gt;
&lt;br /&gt;
Sur un serveur qui tourne, on va simplement se connecter et réutiliser le dump réalisé à chaud un peu plus tôt.&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;gzip -d save.mysql.sql.gz&amp;lt;br/&amp;gt; mysql -u user -p&amp;lt;br/&amp;gt; mysql&amp;gt; use votrebase;&amp;lt;br/&amp;gt; mysql &amp;gt; source /home/user/mysql/db.sq&amp;lt;/div&amp;gt; &lt;br /&gt;
On peut aussi le faire directement&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;mysql -u myuser -p &amp;lt; /home/user/mysql/db.sql&amp;lt;br/&amp;gt; ###Dans un script, je pourrais utiliser l&#039;option --password&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== À froid ===&lt;br /&gt;
&lt;br /&gt;
Il faut juste redéposer les fichiers là ou on les a pris.&amp;lt;br/&amp;gt; BackupPC peut fonctionner aussi.&lt;br /&gt;
&lt;br /&gt;
== Archivage et journalisation automatique ==&lt;br /&gt;
&lt;br /&gt;
Un script &amp;quot;à tout faire&amp;quot; existe, packagé avec Debian&amp;amp;nbsp;: &amp;lt;code&amp;gt;sudo apt install automysqlbackup&amp;lt;/code&amp;gt;. Il permet&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Notification par mail &lt;br /&gt;
*Compression et chiffrement des sauvegardes &lt;br /&gt;
*Rotation des sauvegardes configurable &lt;br /&gt;
*Sauvegardes incrémentales &lt;br /&gt;
&lt;br /&gt;
La configuration se fait dans /etc/default/automysqlbackup&lt;br /&gt;
&lt;br /&gt;
On peut utiliser aussi rsnapshot...&lt;br /&gt;
&lt;br /&gt;
== Migration de MySQL vers MariaDB ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Attention!!!&amp;lt;br/&amp;gt; Sur un serveur en production, avant de procéder à la migration, faire une sauvegarde des bases de&amp;lt;br/&amp;gt; données!&lt;br /&gt;
&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
Marche à suivre&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;apt-get update &amp;amp;&amp;amp; apt-get upgrade&amp;lt;br/&amp;gt; apt-get install python-software-properties software-properties-common&amp;lt;br/&amp;gt; ###On peut ensuite installer MariaDB. Galera est intégré. On peut passer à la 10.1 directement depuis un MySQL&amp;gt;5.5, sinon il faut d&#039;abord passer par un MariaDB 5.5&amp;lt;br/&amp;gt; sudo apt install mariadb&amp;lt;br/&amp;gt; ###Procéder à l&#039;installation. MySQL sera supprimé entretemps&amp;amp;nbsp;!&amp;lt;/div&amp;gt; &lt;br /&gt;
== Cluster de serveurs MariaDB/Galera ==&lt;br /&gt;
&lt;br /&gt;
En production, on utiliserait au moins trois serveurs, pour gérer les conflits.&lt;br /&gt;
&lt;br /&gt;
On commence depuis une machine qui utilise directement MariaDB.&lt;br /&gt;
&lt;br /&gt;
Sur le premier noeud du cluster&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;service mysql stop&amp;lt;br/&amp;gt; ###Sur systèmes sans systemd&amp;lt;br/&amp;gt; mysqld --wsrep-new-cluster&amp;lt;br/&amp;gt; #Avec systemd&amp;lt;br/&amp;gt; sudo galera_new_cluster&amp;lt;/div&amp;gt; &lt;br /&gt;
Pour mon deuxième noeud, je pars d&#039;une machine neuve sur laquelle j&#039;installe le serveur et le client mariadb:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;su&amp;lt;br/&amp;gt; apt install mariadb-server-10.1 mariadb-client&amp;lt;br/&amp;gt; ###Je rejoins le cluster&amp;lt;br/&amp;gt; sudo systemctl stop mysql&amp;lt;br/&amp;gt; sudo mysqld --wsrep_cluster_address=gcomm://10.0.2.15&amp;lt;/div&amp;gt; &lt;br /&gt;
Le statut est ensuite visible avec une commande SQL&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
SHOW STATUS LIKE &#039;wsrep_%&#039;;&lt;br /&gt;
&lt;br /&gt;
Une page web permet de générer des configurations affinnées&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
[http://www.severalnines.com/New-Galera-Configurator/index.html http://www.severalnines.com/New-Galera-Configurator/index.html]&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
= TP2&amp;amp;nbsp;: PostGreSQL =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pdf&amp;gt;Fichier:TPPOSTGRE.pdf&amp;lt;/pdf&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le but du TP&amp;amp;nbsp;: Mettre en place un serveur LAPP (Comme LAMP mais avec PostGreSQL). Il contiendra un CMS, et la base de données sera administrée à base d&#039;outil en ligne de commande/graphiques.&lt;br /&gt;
&lt;br /&gt;
La machine de base sera du même type que celle utilisée précédemment&amp;amp;nbsp;! Nous réutiliserons aussi la machine navigateur.&lt;br /&gt;
&lt;br /&gt;
IP Maitre : 10.0.2.6&amp;lt;br/&amp;gt; IP Esclave : 10.0.2.7&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Installation de la plateforme LAMP ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;#Installation de sudo et vim&amp;lt;br/&amp;gt; su&amp;lt;br/&amp;gt; apt update&amp;lt;br/&amp;gt; apt install sudo vim&amp;lt;br/&amp;gt; ###Ajout de l&#039;utilisateur à sudo, etc...&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;#Installation et paramétrage de PostGreSQL&amp;lt;br/&amp;gt; sudo apt install postgresql postgresql-contrib&amp;lt;br/&amp;gt; #Changement mdp utilisateur système postgre&amp;lt;br/&amp;gt; sudo passwd postgres&amp;lt;br/&amp;gt; #Changement mdp admin bdd postgresql&amp;lt;br/&amp;gt; su - postgres&amp;lt;br/&amp;gt; psql -d template1 -c &amp;quot;ALTER USER postgres WITH PASSWORD &#039;Prevert77&#039;&amp;quot;&amp;lt;br/&amp;gt; #Création d&#039;une base&amp;lt;br/&amp;gt; createdb mytestdb&amp;lt;br/&amp;gt; #Connexion à la base&amp;lt;br/&amp;gt; psql mytestdb&amp;lt;br/&amp;gt; \q #Déconnexion&amp;lt;br/&amp;gt; #Création d&#039;un nouvel utilisateur&amp;lt;br/&amp;gt; psql -d template1 -c &amp;quot;create user test with password &#039;Prevert77&#039;&amp;quot;&amp;lt;br/&amp;gt; #Activation de l&#039;accès à distance&amp;lt;br/&amp;gt; psql postgres&amp;lt;br/&amp;gt; CREATE EXTENSION adminpack;&amp;lt;br/&amp;gt; #Quitter avec ctrl + d deux fois&amp;lt;/div&amp;gt; &lt;br /&gt;
On va ensuite activer les connexion TCP/IP:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo vim /etc/postgresql/9.6/main/postgresql.conf&amp;lt;br/&amp;gt; #Puis décommenter les lignes:&amp;lt;br/&amp;gt; listen_addresses = &#039;localhost&#039;&amp;lt;br/&amp;gt; password_encryption = on&amp;lt;br/&amp;gt; #Puis redémarrer le service&amp;lt;br/&amp;gt; sudo systemctl restart postgresql&amp;lt;br/&amp;gt; &amp;amp;nbsp;&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;amp;nbsp;Ce n&#039;est pas très important, mais on aura besoin d&#039;un serveur web, que l&#039;oin testera de la même façon que dans le TP précédent.&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo apt install apache2 php libapache2-mod-php&amp;lt;br/&amp;gt; ###Procéder au test php&amp;lt;br/&amp;gt; sudo vim /var/www/html/test.php&amp;lt;br/&amp;gt; ###Contrairement à ce que dit le TP, il faut mettre notre fichier php dans le dossier html, qui est la racine du serveur de base&amp;lt;br/&amp;gt; ###Je peux ensuite vérifier en allant sur [http://10.0.2.15/test.php http://10.0.2.6/test.php] qu&#039;il s&#039;affiche bien&amp;lt;br/&amp;gt; ###contenu du fichier de test php:&amp;lt;br/&amp;gt; &amp;lt;?php&amp;lt;br/&amp;gt; phpinfo();&amp;lt;br/&amp;gt; &amp;amp;nbsp;?&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
On a un serveur qui fonctionne, on va installer l&#039;interface d&#039;administration php:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo apt install phppgadmin&amp;lt;br/&amp;gt; ###Se rendre dans le fichier /etc/apache2/conf-available/phppgadmin.conf et commenter:&amp;lt;br/&amp;gt; Require local&amp;lt;br/&amp;gt; ###(Une erreur dans le TP!)&amp;lt;br/&amp;gt; ###Activer le site (depuis sites-enabled):&amp;lt;br/&amp;gt; sudo ln -s ../conf-available/phppgadmin.conf phppgadmin.conf&amp;lt;br/&amp;gt; sudo systemctl restart apache2&amp;lt;br/&amp;gt; ###Il faut ensuite se rendre dans /usr/share/phppgadmin/conf/config.inc.php et changer le paramètre suivant:&amp;lt;br/&amp;gt; $conf[&#039;extra_login_security&#039;] = true;&amp;lt;br/&amp;gt; ###En le passant à &amp;quot;false&amp;quot;&amp;lt;br/&amp;gt; ###Ensuite on re-relance:&amp;lt;br/&amp;gt; sudo systemctl restart postgresql&amp;lt;br/&amp;gt; sudo systemctl restart apache2&amp;lt;/div&amp;gt; &lt;br /&gt;
== Installation de tt-rss ==&lt;br /&gt;
&lt;br /&gt;
On va enfin installer tt-rss, parce que pourquoi pas?&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;sudo apt install git-core&amp;lt;br/&amp;gt; sudo apt install php-mbstring php-dom php-curl&amp;lt;br/&amp;gt; sudo systemctl restart apache2&amp;lt;br/&amp;gt; cd /var/www/html/&amp;lt;br/&amp;gt; sudo git clone [https://tt-rss.org/git/tt-rss.git https://tt-rss.org/git/tt-rss.git]&amp;lt;br/&amp;gt; ###Se rendre avec le navigateur sur [http://10.0.2.6/tt-rss http://10.0.2.6/tt-rss]&amp;lt;/div&amp;gt; &lt;br /&gt;
Remplir les boîtes comme ça&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
Database type&amp;amp;nbsp;: PostgreSQL&amp;lt;br/&amp;gt; USername&amp;amp;nbsp;: test&amp;lt;br/&amp;gt; Password&amp;amp;nbsp;: Prevert77&amp;lt;br/&amp;gt; Database name&amp;amp;nbsp;: mytestdb&amp;lt;br/&amp;gt; Host name&amp;amp;nbsp;: localhost&amp;lt;br/&amp;gt; Port&amp;amp;nbsp;: 5432&amp;lt;br/&amp;gt; &amp;lt;br/&amp;gt; Et cliquer sur &amp;quot;Test configuration&amp;quot;. Une fois que c&#039;est bon, cliquer sur &amp;quot;Initialize database&amp;quot;, et suivre les instructions (on doit nous suggérer de copier un texte donné dans un fichier &amp;quot;config.php&amp;quot;, comme avec un wordpress).&lt;br /&gt;
&lt;br /&gt;
Une fois que c&#039;est fait, se rendre à nouveau sur [http://10.0.2.6/tt-rss http://10.0.2.6/tt-rss]. Si des messages d&#039;erreurs apparaissent concernant les droits, exécuter les commandes chmod données par tt-rss (les dossiers cache, feed-icons et lock du dossier tt-rss doivent avoir les droits 777). Le login par défaut est admin - password: il n&#039;y a plus qu&#039;à se logguer et changer le mot de passe. tt-rss est installé.&lt;br /&gt;
&lt;br /&gt;
== Réplication &amp;quot;Streaming&amp;quot; PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
La réplication va nécessiter la création d&#039;un deuxième serveur postgreSQL &amp;quot;vierge&amp;quot;. Je crée donc une nouvelle machine et y installe un serveur PostgreSQL. Le format du cluster sera un format &amp;quot;Maitre - Esclave&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Sur le maitre, je commence par modifier le fichier /etc/postgresql/9.6/main/postgresql.conf, les lignes suivantes sont à décommenter et à modifier&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;###Sur le maitre&amp;lt;br/&amp;gt; listen_adresses = &#039;*&#039;&amp;lt;br/&amp;gt; wal_level = hot_standby&amp;lt;br/&amp;gt; wal_keep_segments = 10 #À augmenter si la table de réplication est vide&amp;lt;br/&amp;gt; max_wal_senders = 3&amp;lt;/div&amp;gt; &lt;br /&gt;
On crée un utilisateur spécifique à la réplication:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;###Sur le maitre&amp;lt;br/&amp;gt; psql -h localhost -U postgres -W -c &amp;quot;CREATE USER utilrepl WITH REPLICATION PASSWORD &#039;motdepasse&#039;;&amp;quot;&amp;lt;br/&amp;gt; ###On l&#039;autorise à se connecter en allant modifier le fichier /etc/postgresql/9.6/main/pg_hba.conf&amp;lt;br/&amp;gt; ###Rajouter la ligne&amp;amp;nbsp;:&amp;lt;br/&amp;gt; host replication utilrepl 10.0.2.7/24 md5&amp;lt;br/&amp;gt; ###On stoppe le service&amp;lt;br/&amp;gt; sudo systemctl stop postgresql&amp;lt;/div&amp;gt; &lt;br /&gt;
On va ensuite passer sur l&#039;esclave:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee;  border:1px solid #cccccc;  padding:5px 10px&amp;quot;&amp;gt;###Sur l&#039;esclave&amp;lt;br/&amp;gt; ###Modifier le fichier postgresql.conf&amp;lt;br/&amp;gt; listen_addresses = &#039;*&#039;&amp;lt;br/&amp;gt; hot_standby = on&amp;lt;br/&amp;gt; ###On arrête l&#039;esclave et on détruit tous les fichiers de sa base&amp;lt;br/&amp;gt; cd /var/lib/postgresql/9.6/main/&amp;lt;br/&amp;gt; rm -rf *&amp;lt;br/&amp;gt; ###On crée son fichier /var/lib/postgresql/9.6/main/recovery.conf, qui contient:&amp;lt;br/&amp;gt; primary_conninfo = &#039;host=10.0.2.6 port=5432 user=utilrepl password=Prevert77&#039;&amp;lt;br/&amp;gt; standby_mode = on&amp;lt;/div&amp;gt; &lt;br /&gt;
On va ensuite tout copier du Maitre vers l&#039;esclave avec rsync:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee; border:1px solid #cccccc; padding:5px 10px&amp;quot;&amp;gt;#Sur l&#039;esclave&amp;lt;br/&amp;gt; ###il faut commencer par autoriser les connexion ssh en root sur l&#039;esclave, il faudra l&#039;enlever après par sécurité&amp;lt;br/&amp;gt; #Dans le fichier /etc/ssh/sshd_config, ajouter la ligne:&amp;lt;br/&amp;gt; PermitRootLogin yes&amp;lt;br/&amp;gt; #Redémarrer le service&amp;lt;br/&amp;gt; sudo systemctl restart sshd&amp;lt;br/&amp;gt; &amp;lt;br/&amp;gt; #Sur le maitre&amp;lt;br/&amp;gt; rsync -av /var/lib/postgresql/9.6/main/ 10.0.2.7:/var/lib/postgresql/9.6/main/&amp;lt;/div&amp;gt;  &lt;br /&gt;
Il n&#039;y plus qu&#039;à lancer les deux serveurs:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee; border:1px solid #cccccc; padding:5px 10px&amp;quot;&amp;gt;#Sur les deux :&amp;lt;br/&amp;gt; sudo systemctl restart postgresql&amp;lt;/div&amp;gt; &lt;br /&gt;
Pour vérifier l&#039;état de la réplication:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee; border:1px solid #cccccc; padding:5px 10px&amp;quot;&amp;gt;psql -h localhost -U postgres -W -c &amp;quot;select * from pg_stat_replication;&amp;quot;&amp;lt;/div&amp;gt; &lt;br /&gt;
== Récupération de mot de passe ==&lt;br /&gt;
&lt;br /&gt;
On commence par arrêter le service:&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee; border:1px solid #cccccc; padding:5px 10px&amp;quot;&amp;gt;sudo systemctl stop postgresql&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;amp;nbsp;On va ensuite se rendre dans le fichier /etc/postgresql/9.6/main/pg_hba.conf:&lt;br /&gt;
&lt;br /&gt;
*Aller à la ligne &amp;quot;local all all ...&amp;quot; &lt;br /&gt;
*La modifier en &amp;quot;local all postgres trust&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Ensuite :&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eeeeee; border:1px solid #cccccc; padding:5px 10px&amp;quot;&amp;gt;sudo systemctl restart postgresql&amp;lt;br/&amp;gt; sudo su - postgres&amp;lt;br/&amp;gt; psql -d template1 -U postgres&amp;lt;br/&amp;gt; alter user postgres with password &#039;votrenouveaumotdepasse&#039;;&amp;lt;/div&amp;gt; &lt;br /&gt;
Maintenant que c&#039;est fait, il faut à nouveau modifier le fichier pg_hba.conf pour le remettre comme il était et relancer le service.&lt;br /&gt;
&lt;br /&gt;
== Fine-tuning des bases en production ==&lt;br /&gt;
&lt;br /&gt;
Issu de : [https://www.dsfc.net/logiciel-libre/postgresql/tuning-postgresql-configuration-memoire-linux/ https://www.dsfc.net/logiciel-libre/postgresql/tuning-postgresql-configuration-memoire-linux/]&lt;br /&gt;
&lt;br /&gt;
=== Mémoire disponible ===&lt;br /&gt;
&lt;br /&gt;
La mémoire disponible sous Linux peut être déterminée à l&#039;aide de la commande free. À noter : PostgreSQL n&#039;utilise plus la mémoire partagée depuis la version 9.4. Pas besoin de modifier le fichier /etc/sysctl.conf !&lt;br /&gt;
&lt;br /&gt;
=== effective_cache_size ===&lt;br /&gt;
&lt;br /&gt;
C&#039;est une directive de postgresql.conf, Qui détermine la quantité de mémoire utilisé par celui-ci. On peut aller jusqu&#039;à y mettre toute la mémoire libre obtenue avec la commande free; il est recommandé par l&#039;éditeur de PostGreSQL de n&#039;utiliser que 75% de la RAM totale de la machine.&lt;br /&gt;
&lt;br /&gt;
=== shared_buffers ===&lt;br /&gt;
&lt;br /&gt;
Ce paramètre doit être à un tiers du effective_cache_size. Il règle mise en cache des blocs du système de fichiers contenant les tables et les index. L&#039;édiiteur recommande lui 25% de la RAM totale.&lt;br /&gt;
&lt;br /&gt;
=== work_mem ===&lt;br /&gt;
&lt;br /&gt;
Détermine la taille de la mémoire disponible pour les opérations de tris, regroupement, au niveau des requêtes utilisateur. Elle doit être à 1/3 de effective_cache_size, divisé par le nombre de connexion max., gérées par la directive max_connections.&lt;br /&gt;
&lt;br /&gt;
=== maintenance_work_mem ===&lt;br /&gt;
&lt;br /&gt;
Cette mémoire est celle qui est utilisée lors des opérations de liées à la réindexation, au vacuum et au pg_dump. Les valeurs recommandées vont de 50 à 64 Mo par Go de RAM sur la machine.&lt;br /&gt;
&lt;br /&gt;
=== Outils ===&lt;br /&gt;
&lt;br /&gt;
À noter qu&#039;il existe un outil qui automatise ces opérations : pgtune, mais il n&#039;est plus maintenu depuis 9 ans...&lt;br /&gt;
&lt;br /&gt;
Il existe aussi le site https://pgtune.leopard.in.ua/#/ et son outil pgtune qui propose de générer des paramètres adaptés à la machine et à l&#039;usage de la base de données.&lt;br /&gt;
&lt;br /&gt;
Quant aux backup, il existe (en plus des solutions proposées pour MariaDB) l&#039;outil pgbarman qui permet des sauvegardes &amp;quot;au fil de l&#039;eau&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; &amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Cryptographie&amp;diff=2560</id>
		<title>Cryptographie</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Cryptographie&amp;diff=2560"/>
		<updated>2025-07-08T09:19:22Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Demande de signature de certificat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
[[Category:windows]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que c&#039;est? ==&lt;br /&gt;
&lt;br /&gt;
Plusieurs définitions importantes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt; x509&amp;amp;nbsp;: utilitaire OpenSSL permettant d&#039;afficher ou de signer des certificats&lt;br /&gt;
&lt;br /&gt;
-req&amp;amp;nbsp;: indique qu&#039;on veut utiliser une demande de signature de certificat&lt;br /&gt;
&lt;br /&gt;
-days &amp;lt;durée&amp;gt;&amp;amp;nbsp;: indique la durée de validité du certificat&lt;br /&gt;
&lt;br /&gt;
-in &amp;lt;csr&amp;gt;&amp;amp;nbsp;: indique la demande signature de certificat qu&#039;on utilise&lt;br /&gt;
&lt;br /&gt;
-out &amp;lt;clé_priv&amp;gt;&amp;amp;nbsp;: indique le fichier de sortie dans lequel va être enregistrée le certificat signé&lt;br /&gt;
&lt;br /&gt;
-CA &amp;lt;cert_ca&amp;gt;&amp;amp;nbsp;: indique le certificat de la CA qu&#039;on utilise&lt;br /&gt;
&lt;br /&gt;
-CAkey &amp;lt;clé_priv_ca&amp;gt;&amp;amp;nbsp;: indique la clé privée de la CA qu&#039;on utilise&lt;br /&gt;
&lt;br /&gt;
-CAcreateserial&amp;amp;nbsp;: créer le fichier de numéro de série de la CA, il n&#039;est obligatoire que la première fois qu&#039;on signe un certificat&lt;br /&gt;
&lt;br /&gt;
*&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Cryptographie&amp;amp;nbsp;: C’est la protection d’un message à l’aide d’une clé de chiffrement. &lt;br /&gt;
*&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Cryptogramme&amp;amp;nbsp;: C’est un message chiffré auquel on a appliqué une technique de cryptographie. &lt;br /&gt;
*&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Cryptanalyse&amp;amp;nbsp;: C’est la science qui consiste à tenter de déchiffrer un cryptogramme sans posséder la clé de chiffrement. Dans ce cas on peut alors parler de décryptage. &lt;br /&gt;
*&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Cryptage, Crypter et encrypter&amp;amp;nbsp;: Ces mots sont des anglicismes qu&#039;il est préférable de bannir de votre vocabulaire. Toutefois il est courant de les retrouver utilisés par des personnes qui font de la vulgarisation ou qui ne savent forcément pas très bien de quoi elles parlent. &lt;br /&gt;
*&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Steganographie&amp;amp;nbsp;: La steganographie est l&#039;art de cacher les informations. Il s&#039;agit de passer inaperçu, souvent en faisant passer une information pour une autre. Par exemple, cacher du texte dans des images ou des mp3. &lt;br /&gt;
*&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Encoder&amp;amp;nbsp;: Il s&#039;agit ici de changer le format des données. Il n&#039;y a rien de secret par ici. Un format souvent utilisé en sécurité et réseau est le Base64 &lt;br /&gt;
*&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Obfusquer&amp;amp;nbsp;: C’est le fait de rendre difficile à comprendre un message (typiquement du code informatique).L&#039;objectif est de rendre laborieuse la compréhension du message. &lt;br /&gt;
*&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Compresser&amp;amp;nbsp;: Enfin, les algoritmes de compression sont utilisés pour réduire la taille d&#039;un message. &lt;br /&gt;
&lt;br /&gt;
== A quoi ça sert? ==&lt;br /&gt;
&lt;br /&gt;
La cryptographie assure plusieurs services&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Intégrité&amp;amp;nbsp;: S&#039;assurer que les données n&#039;ont pas été modifiées lors de leur transmission &lt;br /&gt;
*Confidentialité&amp;amp;nbsp;: S&#039;assurer que l&#039;information n&#039;est accessible qu&#039;aux personnes autorisées &lt;br /&gt;
*Authenticité&amp;amp;nbsp;: Vérifier l&#039;identité d&#039;une personne ou d&#039;une machine &lt;br /&gt;
&lt;br /&gt;
== Comment fait-on? ==&lt;br /&gt;
&lt;br /&gt;
Pour atteindre ces objectifs, on utilise plusieurs techniques de l&#039;univers de la cryptographie&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*L&#039;intégrité repose sur les fonctions de hachage &lt;br /&gt;
*La confidentialité repose sur le chiffrement des données. &lt;br /&gt;
*L&#039;authentification se fait par aposition d&#039;une signature numérique. &lt;br /&gt;
&lt;br /&gt;
== Le hachage ==&lt;br /&gt;
&lt;br /&gt;
Une fonction de hachage est une fonction qui convertit un grand ensemble en un ensemble plus petit, appellé empreinte. Il est impossible de déchiffrer l&#039;empreinte pour revenir à l&#039;état d&#039;origine; ce n&#039;est donc pas une technique de chiffrement. Quelques exemples de fonctions de hachage connues&amp;amp;nbsp;: MD, SHA, SHA-1, SHA-2... Le hachage permet de s&#039;assurer de l&#039;intégrité des données&amp;amp;nbsp;: on pourra par exemple recalculer l&#039;empreinte d&#039;un fichier donné pour s&#039;assurer que celui-ci est conforme, en la comprant avec une empreinte donnée.&lt;br /&gt;
&lt;br /&gt;
Exemple de hachage d&#039;un fichier&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;pre&amp;gt;justine@Justine-pc:~/Documents$ sha256sum lorem.txt&lt;br /&gt;
56293a80e0394d252e995f2debccea8223e4b5b2b150bee212729b3b39ac4d46  lorem.txt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Différents types de cryptographie ==&lt;br /&gt;
&lt;br /&gt;
Il existe deux grandes familles d&#039;algorithmes de cryptographie&amp;amp;nbsp;: symétrique et asymétrique. Chacune à ses utilités. On peut aussi les combiner à différents niveaux pour en tirer le meilleur parti, c&#039;est la cryptographie asymétrique.&lt;br /&gt;
&lt;br /&gt;
=== Cryptographie symétrique ===&lt;br /&gt;
&lt;br /&gt;
On utilise des algorithmes symétriques qui sont publics, avec des clefs qui sont, elles, secrètes. Afin de pouvoir chiffrer et déchiffrer les données, tous les participants à la communication doivent partager la même clef secrète. Exemples connus&amp;amp;nbsp;: AES, IDEA, 3DES, Blowfish, etc... Comparée à sa consoeur, la cryptographie symétrique présente les avantages suivants&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Simple à mettre en oeuvre &lt;br /&gt;
*Léger en consommation CPU &lt;br /&gt;
*Chiffrement robuste &lt;br /&gt;
&lt;br /&gt;
L&#039;inconvénient est cependant de taille&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*L&#039;échange de clefs &lt;br /&gt;
&lt;br /&gt;
En effet, si on envoie les clefs en même temps que le cryptogramme, on laisse les clefs sur la serrure...&lt;br /&gt;
&lt;br /&gt;
[[File:CryptAsy.png|400x300px|CryptAsy.png]]&lt;br /&gt;
&lt;br /&gt;
Exemple en action&amp;amp;nbsp;! Je repars du fichier lorem ipsum&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;pre&amp;gt;justine@Justine-pc:~/Documents$ openssl enc -e -a -nosalt -aes-256-cbc -in lorem.txt -out fichier.txt.enc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Détail de la commande&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*openssl&amp;amp;nbsp;: le programme en lui-même &lt;br /&gt;
*enc&amp;amp;nbsp;: On précise que l&#039;on va faire du chiffrement symétrique &lt;br /&gt;
*-e&amp;amp;nbsp;: Indique que l&#039;on va chiffrer (encrypt) &lt;br /&gt;
*-a&amp;amp;nbsp;: Permet d&#039;indiquer qu&#039;on veut la sortie en base64, sinon la sortie serait illisible &lt;br /&gt;
*-nosalt&amp;amp;nbsp;: Pas de sel (donc pas d&#039;aléatoire) dans le chiffrement, on utilisera pas cet argument dans la réalité car le sel améliore la force du chiffrement &lt;br /&gt;
*-aes-256-cbc&amp;amp;nbsp;: Indique l&#039;algorithme utilisé, ici AES256 en mode CBC &lt;br /&gt;
*-in le fichier en entrée &lt;br /&gt;
*-out la sortie &lt;br /&gt;
&lt;br /&gt;
Pour le déchiffrement, on remplace -e (encrypt) par -d (decrypt):&lt;br /&gt;
&amp;lt;pre&amp;gt;justine@Justine-pc:~/Documents$ openssl enc -d -a -nosalt -aes-256-cbc -in fichier.txt.enc -out loremdecode.txt&lt;br /&gt;
justine@Justine-pc:~/Documents$ cat loremdecode.txt&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;nbsp;Cryptographie asymétrique ===&lt;br /&gt;
&lt;br /&gt;
On utilise des algorithmes asymétriques publiques, avec une paire de clefs&amp;amp;nbsp;: une publique, et une privée. La particularité de ces algos est qu&#039;un message chiffré avec une clef publique n&#039;est lisible que par le propriétaire de la clef privée. Exemples connus&amp;amp;nbsp;: RSA, El Gamal, etc...&lt;br /&gt;
&lt;br /&gt;
Les avantages&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*On peut communiquer depuis un canal non sécurisé &lt;br /&gt;
&lt;br /&gt;
Les inconvénients&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Complexité de mise en oeuvre &lt;br /&gt;
*Davantage consommateur en ressources &lt;br /&gt;
*Chiffrement moins robuste &lt;br /&gt;
&lt;br /&gt;
[[File:CryptAAsy.png|400x300px|CryptAAsy.png]]&lt;br /&gt;
&lt;br /&gt;
=== Cryptographie hybride ===&lt;br /&gt;
&lt;br /&gt;
Pour faire de la cryptographie hybride, on chiffre le contenu par chiffrement symétrique avec une clef de session aléatoire, et on chiffre la clef de session par chiffrement asymétrique avec la clef publique du destinataire. Exemples&amp;amp;nbsp;: PGP, TLS, etc.&lt;br /&gt;
&lt;br /&gt;
Les avantages&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Communication via un canal non sécurisé &lt;br /&gt;
*Consommation de ressources raisonnable &lt;br /&gt;
*Chiffrement robuste &lt;br /&gt;
&lt;br /&gt;
Inconvénient&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Une complexité encore plus grande. &lt;br /&gt;
&lt;br /&gt;
[[File:CryptHybr.png|600x500px|CryptHybr.png]]&lt;br /&gt;
&lt;br /&gt;
== La signature numérique ==&lt;br /&gt;
&lt;br /&gt;
Grâce au hachage et à la cryptographie asymétrique, il est possible de signer numériquement des données. Pour ceci, on génère une empreinte des données à signer, et on chiffre ensuite cette empreinte avec notre clef privée. Cette empreinte chiffrée est la signature. Elle peut être apposée aux données, ou mise dans un fichier distinct. Cela nous permet de prouver auprès de toutes les entités qui possèdent notre clef publique que les données émises sont authentiques, puisque la clef publique permet de déchiffrer ce que l&#039;on a chiffré avec la clef privée. Il n&#039;y a plus qu&#039;à recalculer l&#039;empreinte pour voir si elle est identique.&lt;br /&gt;
&lt;br /&gt;
Si les empreintes sont différentes, c&#039;est que les données sont corrompues, ou qu&#039;elles ont été modifiées.&lt;br /&gt;
&lt;br /&gt;
= Introduction aux infrastructures à clefs publiques =&lt;br /&gt;
&lt;br /&gt;
Nous allons ici voir comment fonctionne une ICP (Infrastructure à Clefs Publiques, ou PKI en anglais).&lt;br /&gt;
&lt;br /&gt;
== Terminologie ==&lt;br /&gt;
&lt;br /&gt;
*Public Key Infrastructure (PKI)&amp;amp;nbsp;: Décrit la collection de fichiers&amp;amp;nbsp;et les associations entre les CA, les demandes, les paires de clés, et les certificats. &lt;br /&gt;
*Authorité de Certification (CA)&amp;amp;nbsp;: Tiers de confiance à la racine d&#039;une PKI. &lt;br /&gt;
*Certificat&amp;amp;nbsp;: Un certificat est un fichier contenant une clé publique, plusieurs informations sur l&#039;émetteur et le bénéficiaire du certificat et une signature numérique de l’autorité de&amp;amp;nbsp;certification. &lt;br /&gt;
*Demande de certificat&amp;amp;nbsp;: Ou demande de signature de certificat (CSR pour Certificate Signing Request). C’est une demande de certificat qui est ensuite envoyée à une CA pour être signée. Une demande contient les informations de certificat (nom, clé publique, etc.) signées numériquement grâce à la clé privée du demandeur. &lt;br /&gt;
*Paire de clés&amp;amp;nbsp;: Cryptographie asymétrique&amp;amp;nbsp;: la clé publique et la clé privée. La clé publique est incluse dans la CSR et dans le certificat. &lt;br /&gt;
&lt;br /&gt;
== La PKI ==&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit d&#039;un ensemble de composants physiques, de procédures humaines et de logiciels permettant de gérer le cycle de vie des certificats. Elle fournit des garanties permettant de faire confiance aux autorités. Elle permet de mettre en oeuvre les moyens suivants&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Confidentialité (chiffrement)&amp;amp;nbsp;: les données restent secrètes &lt;br /&gt;
*Authentification&amp;amp;nbsp;: des utilisateurs &lt;br /&gt;
*Intégrité&amp;amp;nbsp;: les données ne sont pas modifiées, et non-répudiation (l&#039;émetteur ne peux pas dire que ses données ne sont pas à lui) &lt;br /&gt;
&lt;br /&gt;
Elle agit au niveau du stockage et/ou du transport des données, et repose sur des outils de cryptographie (clefs symétriques, asymétriques, hachage).&lt;br /&gt;
&lt;br /&gt;
== La CA ==&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit d&#039;un tiers de confiance permettant d&#039;authentifier les utilisateurs. Elle délivre des certificats qui décrivent des identités numériques, et elle met à disposition les moyens de vérifier la validité des certificats.&lt;br /&gt;
&lt;br /&gt;
Au coeur d&#039;une PKI, elle est la plus sensible en matière de sécurité. Sa clef privée sert à signer tous els certificats émis, et du coup sa sécurité à elle met en jeu la sécurité de toute la PKI. Il est du coup recommandé de conserver sa structure sur un système sécurisé, séparée de l&#039;entité finale demandeuse de certificats.&lt;br /&gt;
&lt;br /&gt;
Lors de sa création, la paire de clefs de la CA est créée, ainsi que les fichiers nécessaires à la mise en oeuvre des certificats délivrés. Une fois créée, elle peut recevoir les demandes de certificats; les certificats d&#039;entités sont destinés aux &amp;quot;consommateurs&amp;quot; de certificats X509, comme un client, un serveur VPN, etc... Les demandes et les certificats ne sont pas confidentiels et peuvent transiter par n&#039;importe quel moyen; mais il vaut mieux vérifier que le certificat reçu correspond bien à celui envoyé, en comparant son empreinte avec celle fournie par l&#039;expéditeur.&lt;br /&gt;
&lt;br /&gt;
Exemples de CA publiques&amp;amp;nbsp;: LetsEncrypt, CAcert, StartSSL, Comodo...&lt;br /&gt;
&lt;br /&gt;
L&#039;avantage d&#039;une PKI/CA est qu&#039;on peut centraliser a gestion des clefs publiques; cependant, il faut faire confiance à tous les maillons de la chaîne. En effet, Une CA peut &amp;quot;certifier&amp;quot; d&#039;autres &amp;quot;sous-CA&amp;quot;, par exemple; Et si la sécurité de la CA root est mise en cause, c&#039;est le cas de tout le reste de la chaîne. Les navigateurs web par exemple ont une liste de CA auxquelles ils font confiance, et dont ils ont les clefs publiques (pour pouvoir vérifier les certificats X509 auxquels ils sont confrontés); si une CA compromise se mets à délivrer des vrais-faux certificats, on aura un problème&amp;amp;nbsp;!&lt;br /&gt;
&lt;br /&gt;
Une contre-mesure efficace est l&#039;utilisation du protocole DANE, que l&#039;on verra plus loin.&lt;br /&gt;
&lt;br /&gt;
[[File:CryptoCA.png|800x600px|CryptoCA.png]]&lt;br /&gt;
&lt;br /&gt;
== Paire de clefs, demande de certificat, et certificat ==&lt;br /&gt;
&lt;br /&gt;
Les entités n&#039;ont besoin que d&#039;une clef privée et d&#039;une demande certificat associée (mieux vaut prendre un bon mot de passe sur cette clef&amp;amp;nbsp;: si elle est volée, on peut se faire passer pour l&#039;entité en question&amp;amp;nbsp;!). La clef privée ne doit jamais quitter le système de l&#039;entité. Une fois la paire de clefs générée, la demande de certificat est créée et signée numériquement avec la clef privée. La demande est alors envoyée à une CA pour être signée et le certificat signé est retourné.&lt;br /&gt;
&lt;br /&gt;
Le certificat est comme une carte d&#039;identité. Il sert à identifier et authentifier une personne (physique/morale), et aussi à chiffrer des échanges. La signature du tiers de confiance atteste du lien entre l&#039;identité physique et l&#039;identité numérique. Le standard généralement utilisé est X509.&lt;br /&gt;
&lt;br /&gt;
Pour résumer, un certificat veut dire&amp;amp;nbsp;: &amp;quot;Moi, CA untel (comme le prouve ma signature numérique), certifie que unautre (dont voici la clef publique), est bien celui qu&#039;il prétend être&amp;quot;.&amp;amp;nbsp; Les clients peuvent ensuite vérifier la signature de la CA, et voir que la clef publique de unautre est bien la bonne.&lt;br /&gt;
&lt;br /&gt;
=== Types de certificats ===&lt;br /&gt;
Il existe trois types de certificats : DV, OV,EV&lt;br /&gt;
* DV : Domain Validation. La validation par domaine est le niveau le plus élémentaires de la validation SSL. La CA vérifie que l&#039;on est bien le porprio d&#039;un domaine à l&#039;aide d&#039;un WHOIS. On a alors aucune informations sur l&#039;entreprise dans le certif: on sait juste que la personne qui a demandé le certif possède bien le domaine en question. Utile si la sécurité n&#039;est pas trop de mise, mais malheureusement exploitable pour du phishing par exemple, alié à du DNS squatting. &lt;br /&gt;
* OV : Organisation Validation. Nécessaire pour les entreprises et organisations quand un utilisateur doit rentrer des données sensibles (CB, etc). Ils sont notamment utiles pour les sites de commerce électronique ou les ventes en ligne. Un certificat OV authentifie le propriétaire du site et exige des informations commerciales légitimes relatives à l’entreprise concernée. La procédure de validation applicable à ces certificats est plus longue et plus précise. L’autorité de certification vérifie que vous êtes bien non seulement le propriétaire du domaine, mais également le propriétaire de l’entreprise. L’entreprise doit figurer dans la base de données du registre du commerce correspondant et dans un annuaire en ligne fiable (par exemple, dnb.com). Les fraudeurs ne peuvent pas obtenir un certificat OV parce que leur entreprise ou organisation ne peut pas être validée. Le principal avantage d’un certificat OV est que votre entreprise est indiquée sur le certificat. &lt;br /&gt;
* EV : Extended Validation. Niveau de sécurité le plus élevé. Lors de la vérification d&#039;un certificat EV SSL, le propriétaire du site web se soumet à un processus de vérification d&#039;identité complet et normalisé au niveau mondial (un ensemble de principes et de politiques de vérification ratifiés par le CA/Browser forum). Il doit prouver qu’il a les droits exclusifs d&#039;utilisation d&#039;un domaine, confirmer son existence légale, opérationnelle et physique, et prouver que l&#039;entité a autorisé l&#039;émission du certificat. Ces informations d&#039;identité vérifiées sont incluses dans le certificat. &lt;br /&gt;
&lt;br /&gt;
== Comment une demande devient certificat... ==&lt;br /&gt;
&lt;br /&gt;
Quand la CA a signé la demande de certificat, un certificat signé est produit. La clef privée de la CA est utilisée à ce moment pour signer la clef publique de l&#039;entité finale&amp;amp;nbsp;: du coup, si on fait confiance à la CA, on fait confiance à l&#039;entité. Le certificat signé est renvoyé à l&#039;entité, il n&#039;est pas confidentiel et peut être envoyé via n&#039;importe quel canal.&lt;br /&gt;
&lt;br /&gt;
== Vérification d&#039;un certificat délivré ==&lt;br /&gt;
&lt;br /&gt;
La vérification peut se produire de deux façons&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Seule une des extrémités de la communication doit être vérifiée (comme avec HTTPS, on vérifie uniquement le serv)&amp;amp;nbsp;: on parle d&#039;authentification unilatérale. &lt;br /&gt;
*Les deux extremités sont vérifiées (un VPN, par exemple)&amp;amp;nbsp;: authentification &amp;quot;pair-à-pair&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
=== Unilatérale ===&lt;br /&gt;
&lt;br /&gt;
Le serveur a créé sa paire de clefs, envoyé sa demande à la CA, et reçu une copie en retour de son certificat signé (ainsi que celui de la CA). Elle peut alors s&#039;authentifier auprès des clients faisant confiance à la CA. Le serveur n&#039;as pas eu besoin d&#039;échanger d&#039;informations sensibles avec le client pour cela. Au cours du handshake TLS, le serveur présente sa chaîne de certificats au client, qui vérifie la validité des certificats reçus. Ensuite, le serveur prouve qu&#039;il est vraiment lui en signant des données avec sa clef privée. Le client peut du coup valider la signature à l&#039;aide du certificat (le serveur prouve qu&#039;il a bien la clef privée relative à la clef publique du serveur dans le certificat).&lt;br /&gt;
&lt;br /&gt;
=== Pair-à-pair ===&lt;br /&gt;
&lt;br /&gt;
Les deux entités ont leur paire de clefs et leurs certificats signés, ainsi que celui de la CA. Elles peuvent donc s&#039;identifier mutuellement sans avoir eu à s&#039;échanger d&#039;informations sensibles. Ensuite, c&#039;est le même principe qu&#039;en unilatéral, mais fois deux.&lt;br /&gt;
&lt;br /&gt;
Au cours de la «&amp;amp;nbsp;poignée de main&amp;amp;nbsp;» (handshake) TLS, chaque côté de la connexion présente sa propre chaîne de certificats à l’extrémité distante. Chaque côté vérifie la validité du certificat reçu, contre sa propre copie du certificat de la CA. En faisant confiance au certificat racine de la CA, le pair auquel chacun est connecté peut être authentifié.&lt;br /&gt;
&lt;br /&gt;
Ensuite, l’extrémité distante prouve qu’elle «&amp;amp;nbsp;est vraiment&amp;amp;nbsp;» l’entité identifiée par le certificat en signant des données à l’aide de sa propre clé privée. Seul le titulaire de la clé privée étant capable de réaliser cette opération, ceci permet à l’autre extrémité de vérifier la validité de la signature à l’aide du certificat récu préalablement et ainsi d’authentifier l’extrémité distante.&lt;br /&gt;
&lt;br /&gt;
== DANE/TLSA ==&lt;br /&gt;
&lt;br /&gt;
Pour pallier aux attaques du type MITM ou au manque de confiance dans les CA, l&#039;IETF à oncçu le protocole DANE. Il permet de publier dans le DNS (sécurisé avec DNSSEC) des enregistrements de type TLSA.&lt;br /&gt;
&lt;br /&gt;
Une enregistrement TLSA peut indiquer/contenir la CA à interroger ou même le certificat en lui-même (ou son empreinte). Ainsi, un logiciel qui supporte TLSA/DANE peut vérifier à l&#039;aide d&#039;une requête DNS que les certificats présentés sont fiables.&lt;br /&gt;
&lt;br /&gt;
Les avantages&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Impose une contrainte sur la CA et évite les usuprations de certificats par une CA pourrie &lt;br /&gt;
*Permet même de se passer des CA en passant par les DNS &lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est peu supporté... Aucun navigateur ne le supporte nativement, alors qu&#039;il permettrait de considérables avancées en matière de sécurité.&lt;br /&gt;
&lt;br /&gt;
= Fonctionnement de TLS (Transport Layer Security) =&lt;br /&gt;
&lt;br /&gt;
TLS, qui est le remplacant de SSL, est un protocole de sécurisation des échanges sur Internet. Dans la pile de protocole TCP/IP, il se situe entre la couche application et la couche transport TCP.&lt;br /&gt;
&lt;br /&gt;
Une application utilisant TLS utilise un nouveau port (443 pour HTTPS au lieu de 80, par exemple). Certaines applications peuvent utiliser le même port gràace à StartTLS, on parle alors de &amp;quot;chiffrement opportuniste&amp;quot;. La communication peut débuter en clair et passer en chiffré à l&#039;initiative d&#039;un des pairs ou des deux.&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;un utilisateur se conncte à un site web via TLS, les étapes sont les suivantes&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
#Le navigateur demande une connexion sécurisée par TLS &lt;br /&gt;
#Il se passe plusieurs choses avant et pendant cette &amp;quot;poignée de main&amp;quot;&amp;amp;nbsp;: &lt;br /&gt;
##Client et serveur se mettent d&#039;accord sur le protocole et les suites de chiffrement à utiliser &lt;br /&gt;
##Si on utilise Diffie-Helman, ils s&#039;échangent des nombres aléatoires pour calculer la clef de session   &lt;br /&gt;
#Le serveur envoie son certificat &lt;br /&gt;
#Le navigateur vérifie le certificat auprès du CA &lt;br /&gt;
#Le navigateur génère une clef de session, la chiffre et l&#039;envoie au serveur &lt;br /&gt;
#Le serveur déchiffre la clef de session avec sa clef privée &lt;br /&gt;
#Connexion TLS établie&amp;amp;nbsp;: client et serveur échangent des donénes grâce à la clef de session &lt;br /&gt;
#Une fois la connexion terminée/expirée, le serveur révoque la clef de session &lt;br /&gt;
&lt;br /&gt;
= Mise en place d&#039;une authorité de certification et d&#039;un serveur web HTTPS =&lt;br /&gt;
&lt;br /&gt;
Je pars de deux machines&amp;amp;nbsp;: une qui sera la CA et une qui sera un serveur web.&lt;br /&gt;
&lt;br /&gt;
== Autorité de certification ==&lt;br /&gt;
&lt;br /&gt;
On génère une clef privée et un certificat qui y est lié sur le CA&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;pre&amp;gt;openssl req -newkey rsa:2048 -nodes -keyout clef.pem -x509 -days 365 -out certif.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*req&amp;amp;nbsp;: gestion de CSR (Certificate Signing Request) X.509 &lt;br /&gt;
*-newkey rsa:2048&amp;amp;nbsp;: on créée une clef &lt;br /&gt;
*-nodes&amp;amp;nbsp;: Si une clef privée est créée, elle n&#039;est pas chiffrée &lt;br /&gt;
*-keyout&amp;amp;nbsp;: nom de la clef &lt;br /&gt;
*-x509&amp;amp;nbsp;: On génère un certificat &lt;br /&gt;
*-days&amp;amp;nbsp;: durée de validité du certificat &lt;br /&gt;
*-out certif.pem&amp;amp;nbsp;: nom du certificat &lt;br /&gt;
*Attention à bien remplir les cases, surtout l&#039;organisation, pour le retrouver facilement dans le navigateur&amp;amp;nbsp;! &lt;br /&gt;
&lt;br /&gt;
Sinon, on peut le faire en deux fois (la meilleure méthode?):&lt;br /&gt;
&amp;lt;pre&amp;gt;openssl genrsa -out clefca.pem 2048&lt;br /&gt;
openssl req -new -x509 -days 365 -key clefca.pem &amp;gt; ca.crt&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut voir le contenu du certificat&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;pre&amp;gt;openssl x509 -text -noout -in certif.pem&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
J&#039;envoie ensuite le certificat sur mon PC (avec SCP ou autre...) puis je l&#039;installe dans mon navigateur.&lt;br /&gt;
&lt;br /&gt;
Dans Firefox&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
*Préférences &lt;br /&gt;
*Vie Privée et sécurité &lt;br /&gt;
*Certificats &amp;gt; Afficher les certificats &lt;br /&gt;
*Importer &lt;br /&gt;
&lt;br /&gt;
== Demande de signature de certificat ==&lt;br /&gt;
&lt;br /&gt;
=== Sur le serveur web&amp;amp;nbsp;: ===&lt;br /&gt;
&lt;br /&gt;
On génère une clef privée&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;pre&amp;gt; openssl genrsa -out clefweb.pem 2048&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(on peut rajouter -des3 après genrsa pour y mettre un mot de passe)&lt;br /&gt;
&lt;br /&gt;
Puis je créée une CSR (Certificate Signing Request) à partir de celle-ci&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;pre&amp;gt;openssl req -new -key clefweb.pem &amp;gt; demandeweb.csr&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je peux mettre un peu du bullshit pour tout ce qui est pays, province, etc... mais attentation au FQDN, à mettre le bon nom de site web&amp;amp;nbsp;!&lt;br /&gt;
&lt;br /&gt;
J&#039;envoie le csr vers mon CA.&lt;br /&gt;
&lt;br /&gt;
=== Multi-domaines ===&lt;br /&gt;
Créer un fichier cnf du type xxx.cnf : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
distinguished_name = req_distinguished_name&lt;br /&gt;
req_extensions = v3_req&lt;br /&gt;
[req_distinguished_name]&lt;br /&gt;
countryName = Country Name (2 letter code)&lt;br /&gt;
countryName_default = BE&lt;br /&gt;
stateOrProvinceName = State or Province Name (full name)&lt;br /&gt;
stateOrProvinceName_default = Some-State&lt;br /&gt;
localityName = Locality Name (eg, city)&lt;br /&gt;
localityName_default = Some-City&lt;br /&gt;
organizationName = Organization Name (eg, company)&lt;br /&gt;
organizationName_default = My Company Ltd&lt;br /&gt;
commonName = Common Name (e.g. server FQDN or YOUR name)&lt;br /&gt;
commonName_default = yourdomain.com&lt;br /&gt;
[v3_req]&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth, clientAuth&lt;br /&gt;
subjectAltName = @alt_names&lt;br /&gt;
[alt_names]&lt;br /&gt;
DNS.1 = yourdomain.com&lt;br /&gt;
DNS.2 = www.yourdomain.com&lt;br /&gt;
DNS.3 = yourdomain2.com&lt;br /&gt;
DNS.4 = www.yourdomain2.com&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis créer le csr : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
openssl req -new -key key.pem -out csr.pem -config san.cnf&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sur le CA: ===&lt;br /&gt;
&lt;br /&gt;
On signe la CSR grâce à la clef privée de la CA, pour avoir un certificat signé&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;pre&amp;gt;openssl x509 -req -in demandeweb.csr -out certifweb.crt -CA ca.crt -CAkey clefca.pem -CAcreateserial -CAserial ca.srl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Ici, les arguments semblent pour la plupart claire, sauf... &lt;br /&gt;
*-CAcreateserial et -CAserial génèrent un fichier &amp;quot;serial&amp;quot;, un numéro de série, en gros. Obligatoire seulement la première fois. &lt;br /&gt;
&lt;br /&gt;
Plus qu&#039;à transmettre ce certificat signé au site web&amp;amp;nbsp;!&lt;br /&gt;
&lt;br /&gt;
== Mise en place de HTTPS ==&lt;br /&gt;
&lt;br /&gt;
=== Sur serveur web ===&lt;br /&gt;
&lt;br /&gt;
On va utiliser tout ça sur Apache. On commence par l&#039;installer, puis on créée un vhost qui ne fonctionnera que en https, j&#039;ai sécurisé du mieux que je pouvais...:&lt;br /&gt;
&lt;br /&gt;
Apache:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
        &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
                #On redirige le traffic http vers https&lt;br /&gt;
                Redirect permanent / https://web.assr.iutsf.org&lt;br /&gt;
        &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
                #Le dossier de mon site&lt;br /&gt;
                DocumentRoot /var/www/test&lt;br /&gt;
        &lt;br /&gt;
                #Nom du site&lt;br /&gt;
                ServerName web.assr.iutsf.org&lt;br /&gt;
&lt;br /&gt;
                #Les logs, par d�faut&lt;br /&gt;
                ErrorLog ${APACHE_LOG_DIR}/error.log&lt;br /&gt;
                CustomLog ${APACHE_LOG_DIR}/access.log combined&lt;br /&gt;
&lt;br /&gt;
                #On prendra en compte les fichiers .htaccess situ�s dans notre dossier de site&lt;br /&gt;
                &amp;lt;Directory /var/www/test&amp;gt;&lt;br /&gt;
                        AllowOverride All&lt;br /&gt;
                        Require all granted&lt;br /&gt;
                &amp;lt;/directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                #On active SSL   &lt;br /&gt;
                SSLEngine on&lt;br /&gt;
&lt;br /&gt;
                # Chemin du certificat et de la clef&lt;br /&gt;
                SSLCertificateFile      /home/vagrant/web_cert.pem      &lt;br /&gt;
                SSLCertificateKeyFile   /home/vagrant/web_priv_key.pem&lt;br /&gt;
&lt;br /&gt;
                #Reglages SSL&lt;br /&gt;
                SSLProtocol All -SSLv2 -SSLv3&lt;br /&gt;
                SSLHonorCipherOrder On&lt;br /&gt;
                SSLCompression off&lt;br /&gt;
&lt;br /&gt;
                #HSTS&amp;amp;nbsp;: On force l&#039;utilisateur a utiliser https avec chiffrement (pendant 6 mois, pour tout le monde&amp;amp;nbsp;!)&lt;br /&gt;
                Header always set Strict-Transport-Security &amp;quot;max-age=15768000&amp;quot;&lt;br /&gt;
                &lt;br /&gt;
                #Suites Cryptograhiques&lt;br /&gt;
                SSLCipherSuite &#039;EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA&#039;&lt;br /&gt;
                &lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour Nginx&amp;amp;nbsp;:&lt;br /&gt;
&amp;lt;pre&amp;gt;###On pourrait rajouter ce serveur dans un autre fichier pour rediriger&lt;br /&gt;
###les demande de http vers https&lt;br /&gt;
&lt;br /&gt;
#server {                               #Serveur http; il ne sert qu&#039;a tout renvoyer vers https&lt;br /&gt;
#&lt;br /&gt;
#        listen 80;&lt;br /&gt;
#        listen [::]:80;&lt;br /&gt;
#&lt;br /&gt;
#        server_name auth.google.fr;&lt;br /&gt;
#&lt;br /&gt;
#       return 301 https://auth.google.fr&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
#        }&lt;br /&gt;
&lt;br /&gt;
server {                                #Serveur https&lt;br /&gt;
        listen 443 ssl;                 #On ecoute le port 443&lt;br /&gt;
        listen [::]:443 ssl;&lt;br /&gt;
&lt;br /&gt;
        server_name auth.google.fr;     #Nom du site&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        ###SSL&lt;br /&gt;
&lt;br /&gt;
        #Clef et certificat&lt;br /&gt;
        ssl_certificate      /home/vagrant/google/certifgoogle.crt;&lt;br /&gt;
        ssl_certificate_key  /home/vagrant/google/cleffakegoogle.pem;&lt;br /&gt;
&lt;br /&gt;
        #Securite TLS&lt;br /&gt;
        #On impose les suites de chiffrement du serveur&lt;br /&gt;
        ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
        #Protocoles SSL&lt;br /&gt;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # not possible to do exclusive&lt;br /&gt;
&lt;br /&gt;
        #Suites de chiffrement du serveur&lt;br /&gt;
        ssl_ciphers &#039;EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA&#039;;&lt;br /&gt;
&lt;br /&gt;
        #HSTS&amp;amp;nbsp;: On force le traffic en https&lt;br /&gt;
        add_header Strict-Transport-Security max-age=15768000; # six months&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        ###Fichiers&lt;br /&gt;
&lt;br /&gt;
        #dossier du site&lt;br /&gt;
        root /var/www/fakegoogle/;&lt;br /&gt;
&lt;br /&gt;
        #Fichiers d&#039;index possibles&lt;br /&gt;
        index index.php index.html index.htm index.nginx-debian.html;&lt;br /&gt;
&lt;br /&gt;
        #Renvoie la page de 404&lt;br /&gt;
        location / {&lt;br /&gt;
                try_files $uri $uri/ =404;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        #Configuration de php&lt;br /&gt;
        location ~ \.php$ {&lt;br /&gt;
               include snippets/fastcgi-php.conf;&lt;br /&gt;
               fastcgi_pass unix:/run/php/php7.0-fpm.sock;&lt;br /&gt;
        }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Recommandations en matière de cryptographie =&lt;br /&gt;
&lt;br /&gt;
Le document suivant contient des configurations recommandées.&lt;br /&gt;
&lt;br /&gt;
https://bettercrypto.org/static/applied-crypto-hardening.pdf&lt;br /&gt;
&lt;br /&gt;
= Rapidement analyser une liste de machines pour voir les dates de certifs =&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
for i in $(cat serveurs); do echo &amp;quot;$i $(curl --insecure -vvI https://$i 2&amp;gt;&amp;amp;1 | grep expire)&amp;quot; ; done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Où serveurs est une liste de FQDN ligne par ligne&lt;br /&gt;
&lt;br /&gt;
= CT : Certificate Transparency =&lt;br /&gt;
[https://certificate.transparency.dev/howctworks/ Source]&lt;br /&gt;
[https://en.wikipedia.org/wiki/Certificate_Transparency Source 2]&lt;br /&gt;
[https://www.thesslstore.com/blog/ssl-precertificates/ Source 3 : précertificats]&lt;br /&gt;
&lt;br /&gt;
La transparence des certificats (CT) est un standard de la sécurité Internet et un framework open-source permettant de superviser et auditer les certificats numériques. Ce standard créée un système de logs publics, dont le but est d&#039;enregistrer tous les certificats fournis par des autorités publiques, le tout afin d&#039;identifier facilement les certificats attribués par erreur ou pour de mauvaises intentions. &lt;br /&gt;
&lt;br /&gt;
Pour résumer : c&#039;est un réseau de machines, servant à loguer de façon ouverte (ie, accessible à tout le monde) toutes les opérations concernant les certificats. &lt;br /&gt;
&lt;br /&gt;
Ce processus est décrit dans [https://datatracker.ietf.org/doc/html/rfc9162 la rfc 9162]. Depuis 2021, c&#039;est obligatoire pour tous les certificats TLS publics. Il permet donc de repérer facilement les certificats frauduleux et de se passer de communications à part, comme avec le procole OCSP (dont j&#039;ai déjà parlé [[Protocole ACME|ICI]]).&lt;br /&gt;
&lt;br /&gt;
Le processus est très bien détaillé [https://certificate.transparency.dev/howctworks/ ICI]&lt;br /&gt;
&lt;br /&gt;
== CT Logs ==&lt;br /&gt;
La CT dépend des véritables logs. Une nouvelle entrée de log ajoute les nouveau certificats à un &amp;quot;Merkle hash tree&amp;quot; (une structure en arbre donc chaque nouvelle branche est validée par les précédentes via des hashes, en gros). Pour être correct, un log doit :&lt;br /&gt;
* Vérifier que chaque certificat ou pré-certificat possède une chaîne de signatures valide&lt;br /&gt;
* Refuser de publier un certificat sans cette signature&lt;br /&gt;
* Stocker l&#039;entièreté de cette chaîne&lt;br /&gt;
* Présenter cette chaîne sur demande&lt;br /&gt;
Une entrée de log peut accepter les certificats pas encore valides ou périmés.&lt;br /&gt;
&lt;br /&gt;
== CT monitors ==&lt;br /&gt;
Les CT monitors agissent comme des clients des serveurs de log. Ils vérifient les logs pour s&#039;assurer que ceux-ci fonctionnent normalement, et peuvent par exemple être utilisés pour surveiller les certificats d&#039;un domaine en particulier.&lt;br /&gt;
&lt;br /&gt;
== CT auditors ==&lt;br /&gt;
Ils agissent aussi comme des clients; leur but est de vérifier des informations partielles qu&#039;il possèdent. &lt;br /&gt;
&lt;br /&gt;
== Outils ==&lt;br /&gt;
=== Outils pour interroger les logs CT ===&lt;br /&gt;
* [[crt.sh]]&lt;br /&gt;
* [https://certstream.calidog.io/ https://certstream.calidog.io/ ] (Avec les logs en temps réel, pas mal)&lt;br /&gt;
* https://ct.cloudflare.com/ Merkle town, des graphiques issus des logs par CloudFlare&lt;br /&gt;
* [https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=2ahUKEwjXjo-X94b2AhWGzYUKHQMKAfYQFnoECAgQAQ&amp;amp;url=https%3A%2F%2Ftransparencyreport.google.com%2Fhttps%2Fcertificates&amp;amp;usg=AOvVaw2porDNvZV2GZ34K6_aZqGU Google] a sa propre interface&lt;br /&gt;
&lt;br /&gt;
=== Liste des CT monitors existants ===&lt;br /&gt;
https://certificate.transparency.dev/monitors/&lt;br /&gt;
&lt;br /&gt;
= Commandes diverses =&lt;br /&gt;
&lt;br /&gt;
== Voir le certificat d&#039;un serveur en connexion directe ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
openssl s_client -showcerts -servername vhost.domain.tld -connect host.domain.tld:443 2&amp;gt;/dev/null | openssl x509 -inform pem -noout -text&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Créer un certificats avec des alias via un fichier ==&lt;br /&gt;
&lt;br /&gt;
Créer une clef privée.&lt;br /&gt;
&lt;br /&gt;
Créer un fichier &amp;quot;csr.txt&amp;quot; du type:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
[req]&lt;br /&gt;
default_bits = 2048&lt;br /&gt;
prompt = no&lt;br /&gt;
default_md = sha256&lt;br /&gt;
req_extensions = req_ext&lt;br /&gt;
distinguished_name = dn&lt;br /&gt;
&lt;br /&gt;
[ dn ]&lt;br /&gt;
C=US&lt;br /&gt;
ST=New York&lt;br /&gt;
L=Night City&lt;br /&gt;
O=Best websites, Inc.&lt;br /&gt;
OU=IT&lt;br /&gt;
CN = site.best.nc &lt;br /&gt;
&lt;br /&gt;
[ req_ext ]&lt;br /&gt;
subjectAltName = @alt_names&lt;br /&gt;
&lt;br /&gt;
[ alt_names ]&lt;br /&gt;
DNS.1 = siteeee.best.nc&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le csr:&lt;br /&gt;
 openssl req -new -key private/best_key.key -config csr.txt &amp;gt; best.csr&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Systemd&amp;diff=2559</id>
		<title>Systemd</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Systemd&amp;diff=2559"/>
		<updated>2025-05-14T20:01:02Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Exemples de fichiers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
= Liens, références =&lt;br /&gt;
En vrac&lt;br /&gt;
* https://christine.website/talks/systemd-the-good-parts-2021-05-16&lt;br /&gt;
* https://wiki.archlinux.org/title/systemd&lt;br /&gt;
* https://www.freedesktop.org/software/systemd/man/systemd.service.html&lt;br /&gt;
* https://opensource.com/article/20/5/manage-startup-systemd&lt;br /&gt;
* https://opensource.com/article/20/7/systemd-timers&lt;br /&gt;
&lt;br /&gt;
Une longue série sur Systemd que je n&#039;ai pas encore lue&lt;br /&gt;
* http://0pointer.de/blog/projects/systemd-for-admins-1.html&lt;br /&gt;
* http://0pointer.de/blog/projects/systemd-for-admins-2.html&lt;br /&gt;
* http://0pointer.de/blog/projects/systemd-for-admins-3.html&lt;br /&gt;
* http://0pointer.de/blog/projects/systemd-for-admins-4.html&lt;br /&gt;
* http://0pointer.de/blog/projects/three-levels-of-off.html&lt;br /&gt;
* http://0pointer.de/blog/projects/changing-roots&lt;br /&gt;
* http://0pointer.de/blog/projects/blame-game.html&lt;br /&gt;
* http://0pointer.de/blog/projects/the-new-configuration-files.html&lt;br /&gt;
* http://0pointer.de/blog/projects/on-etc-sysinit.html&lt;br /&gt;
* http://0pointer.de/blog/projects/instances.html&lt;br /&gt;
* http://0pointer.de/blog/projects/inetd.html&lt;br /&gt;
&lt;br /&gt;
Un article sur le durcissement de services&lt;br /&gt;
* https://ruderich.org/simon/notes/systemd-service-hardening&lt;br /&gt;
&lt;br /&gt;
= Structure générale de Systemd, présentation =&lt;br /&gt;
[[Fichier:Sysd-comp.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Systemd est un ensemble de logiciels de base, alternative à SysVInit, le plus important étant notamment l&#039;init (soit de tout premier process lancé par l&#039;OS) : en effet, il fournit une gestion de services qui tourne sur le PID numéro 1 et qui lance tous les autres.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
➜  ~ sudo pstree&lt;br /&gt;
[sudo] password for justine: &lt;br /&gt;
systemd─┬─ModemManager───2*[{ModemManager}]&lt;br /&gt;
        ├─NetworkManager─┬─dhclient&lt;br /&gt;
        │                └─2*[{NetworkManager}]&lt;br /&gt;
        ├─2*[VBoxClient───VBoxClient───2*[{VBoxClient}]]&lt;br /&gt;
        ├─VBoxClient───VBoxClient───3*[{VBoxClient}]&lt;br /&gt;
        ├─VBoxClient───VBoxDRMClient&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Son but est de parralléliser de façon aggressive pour une meilleure gestion des ressources. Il: &lt;br /&gt;
* utilise des sockets ainsi que le système de messages D-BUS pour lancer ses services;&lt;br /&gt;
* permet également de gérer ses services à la demande&lt;br /&gt;
* surveille les processus utilisant des cgroups &lt;br /&gt;
* maintient les montages et automontages&lt;br /&gt;
* Supporte les init scripts au format SysV et LSB afin de remplacer SysV Init&lt;br /&gt;
&lt;br /&gt;
Habituellement surtout connu pour la gestion des services, il contient également des utilitaires:&lt;br /&gt;
* Un daemon gérant les logs (le journal)&lt;br /&gt;
* Des utilitaires permettant de contrôler des configurations de base comme le hostname, la date, les locales, &lt;br /&gt;
* De quoi pour voir la liste des utilisateurs connectés&lt;br /&gt;
* De quoi voir la liste des conteneurs qui tournent &lt;br /&gt;
* ...les comptes système&lt;br /&gt;
* les &amp;quot;runtime directories&amp;quot; et &amp;quot;runtime settings&amp;quot;&lt;br /&gt;
* Un daemon pour le réseau&lt;br /&gt;
* Un daemon pour NTP&lt;br /&gt;
* Un daemon pour le log forwarding&lt;br /&gt;
* Un daemon pour la résolution de nom...&lt;br /&gt;
&lt;br /&gt;
Bref, plein de trucs. Voici une liste non exhaustive de ses composants : &lt;br /&gt;
* Systemd-boot : Gestionnaire UEFI de boot similaire à Grub&lt;br /&gt;
* systemd-firstboot : système de configuration avant le premier boot&lt;br /&gt;
* systemd-homed : système de comptes utilisateurs humains portables&lt;br /&gt;
* systemd-logind : gestion de sessions&lt;br /&gt;
* systemd-networkd : gestion de configuration réseau&lt;br /&gt;
* systemd-nspawn : conteneur de namespace léger (un &amp;quot;chroot on steroids&amp;quot; d&#039;après le arch wiki)&lt;br /&gt;
* systemd-resolved : résolveur dns&lt;br /&gt;
* systemd-sysusers : Création d&#039;utilisateurs / de groupes systèmes et ajout d&#039;utilisateurs à des groupes lors de l&#039;installation de paquets&lt;br /&gt;
* systemd-timesyncd : synchronisation NTP&lt;br /&gt;
* Journal : Centralisation des logs&lt;br /&gt;
* Timers : Gestion de timers, alternative à cron&lt;br /&gt;
* systemd.mount : composant chargé du montage des fs&lt;br /&gt;
* systemd-sysvcompat : fournit la compatibilité avec les configurations type SysV&lt;br /&gt;
* systemd-tmpfiles : Gestion des fichiers / dossiers temporaires&lt;br /&gt;
 ...et il y&#039;en a sûrement d&#039;autres.&lt;br /&gt;
&lt;br /&gt;
= Résumé des commandes =&lt;br /&gt;
https://www.linuxtrainingacademy.com/systemd-cheat-sheet/&lt;br /&gt;
&lt;br /&gt;
== Informations ==&lt;br /&gt;
* systemctl list-dependencies : Show a unit’s dependencies&lt;br /&gt;
* systemctl list-sockets : List sockets and what activates&lt;br /&gt;
* systemctl list-jobs : View active systemd jobs&lt;br /&gt;
* systemctl list-unit-files : See unit files and their states&lt;br /&gt;
* systemctl list-units : Show if units are loaded/active&lt;br /&gt;
* systemctl get – default : List default target (like run level)&lt;br /&gt;
&lt;br /&gt;
== Editer les services ou les timers ==&lt;br /&gt;
* systemctl edit [--full] service/timer : permet de réécrire la définition d&#039;un service ou d&#039;un timer. Avec l&#039;option --full, prend le fichier qui serait dans /lib/systemd/system/, en fait une copie dans /etc/systemd/system/ et l&#039;ouvre avec un éditeur de texte afin de le réécrire complètement. Sans cette option, on va simplement modifier/ajouter certaines options du service en créant un dossier /etc/systemd/system/&amp;lt;unit-name&amp;gt;.&amp;lt;unit-type&amp;gt;.d/. Exemple d&#039;utilisation : [[Unattended-upgrades]] (section &amp;quot;modification des heures de lancement&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Travailler sur les services ==&lt;br /&gt;
&lt;br /&gt;
* systemctl stop service : Stop a running service&lt;br /&gt;
* systemctl start service : Start a service&lt;br /&gt;
* systemctl restart service : Restart a running service&lt;br /&gt;
* systemctl reload service : Reload all config files in service&lt;br /&gt;
* systemctl status service : See if service is running/enabled&lt;br /&gt;
* systemctl enable service : Enable a service to start on boot&lt;br /&gt;
* systemctl disable service : Disable service–won’t start at boot&lt;br /&gt;
* systemctl show service : Show properties of a service (or other unit)&lt;br /&gt;
* systemctl -H host status network : Run any systemctl command remotely&lt;br /&gt;
&lt;br /&gt;
== Travailler sur le système ==&lt;br /&gt;
&lt;br /&gt;
* systemctl reboot : Reboot the system (reboot.target)&lt;br /&gt;
* systemctl poweroff : Power off the system (poweroff.target)&lt;br /&gt;
* systemctl emergency : Put in emergency mode (emergency.target)&lt;br /&gt;
* systemctl default : Back to default target (multi-user.target&lt;br /&gt;
* systemctl suspend : Mettre en veille&lt;br /&gt;
* systemctl hibernate : Mode hibernation &lt;br /&gt;
&lt;br /&gt;
== Travailler avec les logs ==&lt;br /&gt;
&lt;br /&gt;
* journalctl : Show all collected log messages&lt;br /&gt;
* journalctl -u network.service : See network service messages&lt;br /&gt;
* journalctl -f : Follow messages as they appear&lt;br /&gt;
* journalctl -k : Show only kernel messages&lt;br /&gt;
&lt;br /&gt;
== Travailler avec les targets ==&lt;br /&gt;
* systemctl isolate multi-user.target : Passer sur la target multi-user&lt;br /&gt;
* systemctl set-default -f multi-user.target : Changer la target par défaut&lt;br /&gt;
* systemctl list-unit-files | grep target  : Voir les targets configurées sur le système&lt;br /&gt;
* systemctl show -p Wants -p Requires &amp;lt;target&amp;gt; : Voir les unités regroupées dans une target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Équivalence Sysvinit vers Systemd ==&lt;br /&gt;
&lt;br /&gt;
 Sysvinit: service SERVICE_NAME start&lt;br /&gt;
 Systemd: systemctl start SERVICE_NAME (Example: systemctl start cron.service)&lt;br /&gt;
 Notes: Used to start a service (not reboot persistent)&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: service SERVICE_NAME stop&lt;br /&gt;
 Systemd: systemctl stop SERVICE_NAME&lt;br /&gt;
 Notes: Used to stop a service (not reboot persistent)&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: service SERVICE_NAME restart&lt;br /&gt;
 Systemd: systemctl restart SERVICE_NAME&lt;br /&gt;
 Notes: Used to stop and then start a service&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: service SERVICE_NAME reload&lt;br /&gt;
 Systemd: systemctl reload SERVICE_NAME&lt;br /&gt;
 Notes: When supported, reloads the config file without interrupting pending operations.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: service SERVICE_NAME condrestart&lt;br /&gt;
 Systemd: systemctl condrestart SERVICE_NAME&lt;br /&gt;
 Notes: Restarts if the service is already running.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: service SERVICE_NAME status&lt;br /&gt;
 Systemd: systemctl status SERVICE_NAME&lt;br /&gt;
 Notes: Tells whether a service is currently running.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig SERVICE_NAME on&lt;br /&gt;
 Systemd: systemctl enable SERVICE_NAME&lt;br /&gt;
 Notes: Turn the service on, for start at next boot, or other trigger.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig SERVICE_NAME off&lt;br /&gt;
 Systemd: systemctl disable SERVICE_NAME&lt;br /&gt;
 Notes: Turn the service off for the next reboot, or any other trigger.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig SERVICE_NAME&lt;br /&gt;
 Systemd: systemctl is-enabled SERVICE_NAME&lt;br /&gt;
 Notes: Used to check whether a service is configured to start or not in the current environment.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig –list&lt;br /&gt;
 Systemd: systemctl list-unit-files –type=service (or) ls /etc/systemd/system/*.wants/&lt;br /&gt;
 Notes: Print a table of services that lists which runlevels each is configured on or off&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig –list | grep 5:on&lt;br /&gt;
 Systemd: systemctl list-dependencies graphical.target&lt;br /&gt;
 Notes: Print a table of services that will be started when booting into graphical mode&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig SERVICE_NAME –list&lt;br /&gt;
 Systemd: ls /etc/systemd/system/*.wants/SERVICE_NAME.service&lt;br /&gt;
 Notes: Used to list what levels this service is configured on or off&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig SERVICE_NAME –add&lt;br /&gt;
 Systemd: systemctl daemon-reload&lt;br /&gt;
 Notes: Used when you create a new service file or modify any configuration&lt;br /&gt;
 &lt;br /&gt;
 Runlevels to Targets Cheat Sheet&lt;br /&gt;
 Sysvinit: 0&lt;br /&gt;
 Systemd: runlevel0.target, poweroff.target&lt;br /&gt;
 Notes: Halt the system.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: 1, s, single&lt;br /&gt;
 Systemd: runlevel1.target, rescue.target&lt;br /&gt;
 Notes: Single user mode.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: 2, 4&lt;br /&gt;
 Systemd: runlevel2.target, runlevel4.target, multi-user.target&lt;br /&gt;
 Notes: User-defined/Site-specific runlevels. By default, identical to 3.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: 3&lt;br /&gt;
 Systemd: runlevel3.target, multi-user.target&lt;br /&gt;
 Notes: Multi-user, non-graphical. Users can usually login via multiple consoles or via the network.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: 5&lt;br /&gt;
 Systemd: runlevel5.target, graphical.target&lt;br /&gt;
 Notes: Multi-user, graphical. Usually has all the services of runlevel 3 plus a graphical login.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: 6&lt;br /&gt;
 Systemd: runlevel6.target, reboot.target&lt;br /&gt;
 Notes: Reboot&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: emergency&lt;br /&gt;
 Systemd: emergency.target&lt;br /&gt;
 Notes: Emergency shell&lt;br /&gt;
 &lt;br /&gt;
 Changing runlevels:&lt;br /&gt;
 Sysvinit: telinit 3&lt;br /&gt;
 Systemd: systemctl isolate multi-user.target (OR systemctl isolate runlevel3.target OR telinit 3)&lt;br /&gt;
 Notes: Change to multi-user run level.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: sed s/^id:.*:initdefault:/id:3:initdefault:/&lt;br /&gt;
 Systemd: ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target&lt;br /&gt;
 Notes: Set to use multi-user runlevel on next reboot.&lt;br /&gt;
&lt;br /&gt;
= Création d&#039;un service avec systemd =&lt;br /&gt;
&lt;br /&gt;
https://doc.ubuntu-fr.org/creer_un_service_avec_systemd&lt;br /&gt;
&lt;br /&gt;
Comme Upstart, systemd utilise des fichiers de configuration correspondant aux différents services à manipuler. Il n&#039;est (en général) plus nécessaire de créer des fichiers bash pour gérer le service, systemd s&#039;occupe de tout (lancement, arrêt, redémarrage, status, gestion des logs, etc)&lt;br /&gt;
Ces fichiers de configuration se trouvent dans /etc/systemd/system/ et permettent d&#039;indiquer les conditions d&#039;activation ou désactivation d&#039;un service, leur propriétaire, etc. &lt;br /&gt;
&lt;br /&gt;
Une fois le fichier créé:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl enable &amp;lt;nom du service&amp;gt;.service&lt;br /&gt;
systemctl start &amp;lt;nom du service&amp;gt;.service&lt;br /&gt;
systemctl status &amp;lt;nom du service&amp;gt;.service&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Types de services ==&lt;br /&gt;
&lt;br /&gt;
* Service simple : Lance un processus principal. Si le processus a besoin de canaux de communication comme des sockets, ils doivent être prêts avant l&#039;activation du processus. Ainsi, systemd peut traiter les autres unités sans se préoccuper de la fin du lancement d&#039;une unité de type &amp;quot;simple&amp;quot;.&lt;br /&gt;
* Service &amp;quot;forking&amp;quot; : C&#039;est lorsqu&#039;un processus père lance un processus fils. Le père s&#039;arrête quand le fils est en place avec tous ses canaux de communication en place. Le processus fils continue à fonctionner en tant que le processus principal du service. systemd poursuit le traitement des autres unités une fois que le processus père se termine. Ce type de service correspond aux services UNIX traditionnels.&lt;br /&gt;
* Oneshot : Similaire à un service simple, mais systemd attend que le processus se termine avant de continuer ses traitements. En gros, lorsque le service est lancé avec systemctl start foo, le script exécute toute sa commande et attends qu&#039;elle retourne avant de rendre la main.&lt;br /&gt;
Ce type de service est typiquement utilisé comme équivalent aux commandes lancées au démarrage via les scripts d&#039;init system V. Cela permet à systemd de remplacer ce mécanisme. De ce fait, avec systemd des nouveaux services apparaissent, alors qu&#039;ils auraient été simplement des scripts d&#039;init avec SysVinit.&lt;br /&gt;
* dbus : Un service de type dbus est similaire à un service de type simple. Cependant, le processus du service doit obtenir un nom via D-Bus. systemd pourra alors traiter les autres unités.&lt;br /&gt;
* notify : Un service de type notify est similaire à un service de type simple. Cependant, c&#039;est le processus du service qui avertira systemd (via la fonction sd_notfy(3)) qu&#039;il peut traiter les autres unités.&lt;br /&gt;
&lt;br /&gt;
Dbus : Logiciel de communication inter-processus développé par RHEL.&lt;br /&gt;
&lt;br /&gt;
== Exemples de fichiers ==&lt;br /&gt;
&lt;br /&gt;
=== OneShot ===&lt;br /&gt;
&lt;br /&gt;
Exemple d&#039;Iptables&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
&lt;br /&gt;
#Signifie que quand la commande start est terminée, le processus est toujours considéré comme lancé.&lt;br /&gt;
#Utile pour les oneshot qui lancent une commande mais n&#039;ont pas de processus derrière.&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
&lt;br /&gt;
#Commande à exécuter au lancement du processus. Obligatoire.&lt;br /&gt;
ExecStart=/usr/libexec/iptables.init start&lt;br /&gt;
&lt;br /&gt;
#Commande a exécuter pour arrêter le service. Facultatif.&lt;br /&gt;
ExecStop=/usr/libexec/iptables.init stop &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Service Simple ===&lt;br /&gt;
&lt;br /&gt;
Exemple de deluged (un client bittorent)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
#Donne une description du service (affichée pour le status)&lt;br /&gt;
Description=Deluge Bittorrent Client Daemon&lt;br /&gt;
&lt;br /&gt;
#Indique un pré-requis au lancement du service (ici, être relié au réseau). Le service ne sera pas stoppé si on perd le réseau; &lt;br /&gt;
#Pour cela, il faut utilise une balise Requires=&lt;br /&gt;
After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
&lt;br /&gt;
#Propriétaire du processus&lt;br /&gt;
User=deluge&lt;br /&gt;
Group=deluge&lt;br /&gt;
UMask=007&lt;br /&gt;
 &lt;br /&gt;
ExecStart=/usr/bin/deluged -d&lt;br /&gt;
 &lt;br /&gt;
#Relancer le service si il crashe&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
 &lt;br /&gt;
# Configures the time to wait before service is stopped forcefully.&lt;br /&gt;
TimeoutStopSec=300&lt;br /&gt;
 &lt;br /&gt;
[Install]&lt;br /&gt;
#Dans quel target doit être actif le service (cf la section sur les targets)&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modèle de service ===&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;avoir des templates de services qui lanceront des copies : par exemple : getty@.service donnera getty@tty1.service, getty@tty2.service... etc. On peut aussi avoir une instance par utilisateur, par exemple.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Syncthing - Open Source Continuous File Synchronization for %I&lt;br /&gt;
Documentation=man:syncthing(1)&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
#Spécifier les dépendances d&#039;un service.&lt;br /&gt;
Wants=syncthing-inotify@.service&lt;br /&gt;
 &lt;br /&gt;
[Service]&lt;br /&gt;
#%i correspond à l&#039;argument passé au lancement du service.&lt;br /&gt;
User=%i&lt;br /&gt;
ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
SuccessExitStatus=3 4&lt;br /&gt;
RestartForceExitStatus=3 4&lt;br /&gt;
UMask=0002&lt;br /&gt;
 &lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Concernant user=%i, pour lancer les différentes instances avec les users différents:&lt;br /&gt;
 systemctl enable syncthing@Connor.service&lt;br /&gt;
 systemctl enable syncthing@Ripley.service&lt;br /&gt;
 systemctl enable syncthing@Croft.service&lt;br /&gt;
&lt;br /&gt;
= Targets =&lt;br /&gt;
&lt;br /&gt;
Systemd introduit la notion de target au sein de ses unités. Une target permet de regrouper dans un seul paquet plusieurs autres unités et de retrouver la notion de runlevel de SystemV.&lt;br /&gt;
&lt;br /&gt;
== Runlevels ==&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Run_level&lt;br /&gt;
Pour expliquer simplement la notion de runlevels, il s&#039;agit d&#039;un chiffre de 0 à 6 (et parfois &amp;quot;s&amp;quot;) donné par sysvinit pour déterminer les fonctions activées : en gros, le niveau 6 est donné au démarrage, le niveau 0 à l&#039;arrêt. On peut passer d&#039;un niveau à l&#039;autre de façon successive. L&#039;idée est de dire que le système passe d&#039;un état à l&#039;autre et qu&#039;à chaque état peut être associé un ensemble de services et autres. Par exemple, les runlevels de sysvinit sont :&lt;br /&gt;
* 0 : Arrêt&lt;br /&gt;
* 1 : Mono-utilisateur ou maintenance&lt;br /&gt;
* 2 à 5 : Fonction de l&#039;OS&lt;br /&gt;
* 6 : Reboot&lt;br /&gt;
&lt;br /&gt;
Pour les 2 à 5, on peut avoir :&lt;br /&gt;
* 2 : Multi-user sans serveur applicatif&lt;br /&gt;
* 3 : Multi-users avec serveurs applicatifs&lt;br /&gt;
* 4 ou 5 pour lancer l&#039;environnement graphique.&lt;br /&gt;
&lt;br /&gt;
== Tableau de correspondance target / runlevel ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Runlevel  Systemd Target 	                Notes&lt;br /&gt;
0 	  runlevel0.target, poweroff.target 	Arrête le système&lt;br /&gt;
1 	  runlevel1.target, rescue.target 	Mode single user&lt;br /&gt;
3 	  runlevel3.target, multi-user.target 	Mode multi-utilisateur, non graphique&lt;br /&gt;
2, 4 	  runlevel2.target, runlevel4.target, multi-user.target 	Mode défini par l&#039;utilisateur, identique au 3 par défaut.&lt;br /&gt;
5 	  runlevel5.target, graphical.target 	Mode graphique multi-utilisateur&lt;br /&gt;
6 	  runlevel6.target, reboot.target 	Redémarre&lt;br /&gt;
emergency 	emergency.target 	Shell d&#039;urgence &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Voir les targets ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
systemd-analyze critical-chain&lt;br /&gt;
The time after the unit is active or started is printed after the &amp;quot;@&amp;quot; character.&lt;br /&gt;
The time the unit takes to start is printed after the &amp;quot;+&amp;quot; character.&lt;br /&gt;
&lt;br /&gt;
graphical.target @1min 32.691s&lt;br /&gt;
└─multi-user.target @1min 32.691s&lt;br /&gt;
  └─xinetd.service @1min 32.120s +570ms&lt;br /&gt;
    └─network-online.target @6.872s&lt;br /&gt;
      └─network.target @6.864s&lt;br /&gt;
        └─networking.service @6.706s +157ms&lt;br /&gt;
          └─network-pre.target @6.695s&lt;br /&gt;
            └─firewalld.service @4.043s +2.651s&lt;br /&gt;
              └─dbus.service @4.038s&lt;br /&gt;
                └─basic.target @4.033s&lt;br /&gt;
                  └─sockets.target @4.033s&lt;br /&gt;
                    └─dbus.socket @4.033s&lt;br /&gt;
                      └─sysinit.target @4.030s&lt;br /&gt;
                        └─apparmor.service @3.752s +276ms&lt;br /&gt;
                          └─local-fs.target @3.750s&lt;br /&gt;
                            └─opt.mount @3.730s +19ms&lt;br /&gt;
                              └─systemd-fsck@dev-mapper-vg_root\x2dlv_opt.service @3.558s +169ms&lt;br /&gt;
                                └─local-fs-pre.target @3.556s&lt;br /&gt;
                                  └─multipathd.service @3.222s +333ms&lt;br /&gt;
                                    └─systemd-udev-settle.service @2.097s +1.124s&lt;br /&gt;
                                      └─systemd-udev-trigger.service @1.914s +182ms&lt;br /&gt;
                                        └─systemd-journald.socket @1.911s&lt;br /&gt;
                                          └─-.mount @1.902s&lt;br /&gt;
                                            └─systemd-journald.socket @1.911s&lt;br /&gt;
                                              └─...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Timers Systemd =&lt;br /&gt;
https://wiki.archlinux.org/title/Systemd/Timers&lt;br /&gt;
https://www.freedesktop.org/software/systemd/man/systemd.timer.html&lt;br /&gt;
&lt;br /&gt;
Les timers sont des &amp;quot;unit files&amp;quot; (les unit files étant les fichiers décrivant par exemple les services, visibles avec la commande &amp;quot;systemctl list-unit-files&amp;quot;; je traduirais ici par &amp;quot;fichier unitaire&amp;quot; parce que je n&#039;ai aucune foutue idée du nom en français) dont le nom se termine en .timer et qui contrôlent des fichiers .service ou  des évènements. Ils peuvent être utilisés comme alternative à cron. Les timers supportent les évenènements liés au calendrier, les évènement monotones (pas compris), et peuvent être lancés de façon asynchrone.&lt;br /&gt;
&lt;br /&gt;
== Les fichiers unitaires pour les timers ==&lt;br /&gt;
Les timers sont définis dans des fichiers unitaires dont le nom comporte l&#039;extension &amp;quot;.timer&amp;quot;. Ils sont eux aussi des fichiers de configuration unitaires, et sont chargés au même endroit que les autres; cependant, ils contiennent une section [Timer] qui définit quand et comment ils s&#039;activent. Les timers peuvent être de 2 types différents : &lt;br /&gt;
* Realtime timers (ou wallclock timers) : Ils s&#039;activent selon un &#039;&#039;calendar&#039;&#039; (un agenda, en somme), comme un cronjob : par exemple, tous les jours à midi, le 15e jour du mois à 22h, etc. Ils sont définis par l&#039;option OnCalendar= &lt;br /&gt;
* Monotonic timers : Ils s&#039;activent après une durée relative à un point de départ : par exemple, 15 minutes après le boot. Ils s&#039;arrêtent quand l&#039;ordinateur est suspendu ou éteint. Ils sont définis par une mention &amp;quot;On&#039;&#039;type&#039;&#039;Sec=&amp;quot;; les plus courant sont OnBootSec= et OnUnitActiveSec=&lt;br /&gt;
&lt;br /&gt;
La liste complète des options est dans le man de systemd.timer.&lt;br /&gt;
&lt;br /&gt;
Pour chaque fichier .timer, un fichier .service correspondant existe : un foo.timer sera accompagné d&#039;un foo.service. Le fichier .timer a pour rôle de contrôler l&#039;activation du fichier .service (qui n&#039;as d&#039;ailleurs pas besoin d&#039;une section [Install] tant que c&#039;est le .timer qui est enabled. Le fichier .timer peut si besoin contrôler un fichier unitaire qui ne s&#039;appelle pas comme lui en utilisant le paramètre Unit= dans la section [Timer]. &lt;br /&gt;
&lt;br /&gt;
== Gestion des timers ==&lt;br /&gt;
Les timers peuvent être démarrés, arrêtés, activés / désactivés comme on le ferait pour un service, avec par exemple systemctl enable foo.timer.&lt;br /&gt;
&lt;br /&gt;
=== Créer un timer ===&lt;br /&gt;
&lt;br /&gt;
Exemple : je veux créer un timer foo.timer qui lance le service foo.service. Il est important qu&#039;ils aient le même nom; autrement, je devrais dans mon timer utiliser l&#039;option Unit= ([[Systemd#Les_fichiers_unitaires_pour_les_timers|voir juste au-dessus]]).&lt;br /&gt;
&lt;br /&gt;
* Créer le service /etc/systemd/system/foo.service (par exemple). Je n&#039;ai pas fait beaucoup d&#039;essais, mais le type OneShot semble le plus adapté, puisqu&#039;il exécute sa commande et s&#039;arrête : cela semble le plus utile dans l&#039;optique de remplacer une crontab. Il existe sûrement d&#039;autres possibilités.&lt;br /&gt;
* Créer le timer /etc/systemd/system/foo.timer (par exemple). Voir les exemples en dessous.&lt;br /&gt;
* Activer le timer : systemctl enable foo.timer. Sinon, il ne sera pas là au reboot !&lt;br /&gt;
* Lancer le timer : systemctl start foo.timer. Hé oui, un timer est lancé en permanence : en fait, on peut le voir comme un daemon dont la seule utilité est de regarder l&#039;horloge et de lancer le service quand le moment est venu.&lt;br /&gt;
* Vérifier : systemctl list-timers. Notre timer doit s&#039;y trouver. &lt;br /&gt;
&lt;br /&gt;
=== Afficher les timers ===&lt;br /&gt;
On peut voir les timers qui tournent ou ceux qui sont arrêtés :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
systemctl list-timers&lt;br /&gt;
#Donne par exemple&lt;br /&gt;
NEXT                         LEFT       LAST                         PASSED       UNIT                         ACTIVATES&lt;br /&gt;
Wed 2021-11-10 15:31:45 CET  51min left Wed 2021-11-10 14:34:04 CET  6min ago     anacron.timer                anacron.service&lt;br /&gt;
Thu 2021-11-11 00:00:00 CET  9h left    Wed 2021-11-10 10:30:04 CET  4h 10min ago logrotate.timer              logrotate.service&lt;br /&gt;
Thu 2021-11-11 00:00:00 CET  9h left    Wed 2021-11-10 10:30:04 CET  4h 10min ago man-db.timer                 man-db.service&lt;br /&gt;
Thu 2021-11-11 02:09:06 CET  11h left   Wed 2021-11-10 10:30:04 CET  4h 10min ago apt-daily.timer              apt-daily.service&lt;br /&gt;
Thu 2021-11-11 06:32:59 CET  15h left   Wed 2021-11-10 10:30:04 CET  4h 10min ago apt-daily-upgrade.timer      apt-daily-upgrade.service&lt;br /&gt;
Thu 2021-11-11 10:44:49 CET  20h left   Wed 2021-11-10 10:44:49 CET  3h 55min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.ser&lt;br /&gt;
&lt;br /&gt;
6 timers listed.&lt;br /&gt;
Pass --all to see loaded but inactive timers, too.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemples (tirés du wiki arch) ==&lt;br /&gt;
=== Monotonic ===&lt;br /&gt;
Un timer qui lancer le service foo.conf 15 mn après le boot, puis une fois par semaine tant que le système tourne&lt;br /&gt;
&lt;br /&gt;
/etc/systemd/system/foo.timer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run foo weekly and on boot&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnBootSec=15min&lt;br /&gt;
OnUnitActiveSec=1w&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Temps réel ===&lt;br /&gt;
Un timer qui tourne tous les lundis à midi. Si je l&#039;active et qu&#039;il voit qu&#039;il n&#039;as pas pu faire son truc le lundi midi précédent parce que le système était eteint par exemple, il le fait immédiatement (option Persistent=True). &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run foo weekly&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=weekly&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Format des dates pour le temps réel ===&lt;br /&gt;
OnCalendar peut utiliser des valeurs assez généralistes appellées special expressions (hourly, daily, etc...). En voici la liste et leur équivalent au format timestamp :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &lt;br /&gt;
    minutely → *-*-* *:*:00&lt;br /&gt;
      hourly → *-*-* *:00:00&lt;br /&gt;
       daily → *-*-* 00:00:00&lt;br /&gt;
     monthly → *-*-01 00:00:00&lt;br /&gt;
      weekly → Mon *-*-* 00:00:00&lt;br /&gt;
      yearly → *-01-01 00:00:00&lt;br /&gt;
   quarterly → *-01,04,07,10-01 00:00:00&lt;br /&gt;
semiannually → *-01,07-01 00:00:00&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autrement, l&#039;option OnCalendar utilise les timestamps : &lt;br /&gt;
 JourDeLaSemaine Année-Mois-Jour Heure:Minute:Seconde&lt;br /&gt;
On peut utiliser un astérisque pour dire que l&#039;on veut n&#039;importe quelle valeur (comme pour cron); deux valeurs séparées par un double point &amp;quot;..&amp;quot; indique une plage de valeurs (par exemple 10..20 englobe toutes les valeurs de 10 à 20 inclus). &lt;br /&gt;
&lt;br /&gt;
La partie DayOfWeek n&#039;est pas obligatoire, voir le troisième exemple.&lt;br /&gt;
&lt;br /&gt;
On peut aussi indiquer plusieurs fois OnCalendar afin de spécifier plusieurs dates auxquelles le service doit tourner.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
* Les 4 premiers jours du mois à midi, seulement le lundi et le jeudi : &lt;br /&gt;
 OnCalendar=Mon,Tue *-*-01..04 12:00:00&lt;br /&gt;
* Le premier samedi du mois : &lt;br /&gt;
 OnCalendar=Sat *-*-1..7 18:00:00&lt;br /&gt;
* Tous les jours à 4heures :&lt;br /&gt;
OnCalendar=*-*-* 4:00:00&lt;br /&gt;
* À 22h30 la semaine et 20h00 le weekend:&lt;br /&gt;
 OnCalendar=Mon..Fri 22:30&lt;br /&gt;
 OnCalendar=Sat,Sun 20:00&lt;br /&gt;
&lt;br /&gt;
On peut analyser notre spécification temporelle afin de s&#039;assurer qu&#039;elle est valide et calculer son prochain déclenchement avec l&#039;option calendar de systemd-analyze. Par exemple :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
➜  ~ systemd-analyze calendar &amp;quot;Mon,Fri *-*-* 22:00:00&amp;quot; &lt;br /&gt;
Normalized form: Mon,Fri *-*-* 22:00:00&lt;br /&gt;
    Next elapse: Fri 2021-11-12 22:00:00 CET&lt;br /&gt;
       (in UTC): Fri 2021-11-12 21:00:00 UTC&lt;br /&gt;
       From now: 2 days left&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;https://wiki.archlinux.org/title/Systemd/Journal&lt;br /&gt;
&lt;br /&gt;
=== Utiliser systemd-run avec des timers à usage unique===&lt;br /&gt;
On peut utiliser systemd-run pour lancer une commande / un service après une certaine durée. Par exemple, pour faire un touch sur un fichier après 30 secondes:&lt;br /&gt;
 systemd-run --on-active=30 /bin/touch /tmp/foo&lt;br /&gt;
On peut spécifier un fichier unitaire à lancer après une certaine durée. Ici, je lance foo.service après 12h et 30m:&lt;br /&gt;
 systemd-run --on-active=&amp;quot;12h 30m&amp;quot; --unit foo.service&lt;br /&gt;
Plus d&#039;infos dans le manuel de systemd-run.&lt;br /&gt;
&lt;br /&gt;
= Journal =&lt;br /&gt;
Systemd a son propre système de récupération des logs, appellé le *journal* (en français dans le texte). Il n&#039;est donc pas nécessaire de faire tourner un daemon de syslog supplémentaire !&lt;br /&gt;
== Sources ==&lt;br /&gt;
* [https://wiki.archlinux.org/title/Systemd/Journal source de base]&lt;br /&gt;
* [https://www.freedesktop.org/wiki/Software/systemd/catalog/ sur le catalogue]&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs Une source assez complète]&lt;br /&gt;
* [https://man.archlinux.org/man/systemd-journald.service.8#JOURNAL_NAMESPACES namespaces]&lt;br /&gt;
&lt;br /&gt;
== Emplacement des journaux ==&lt;br /&gt;
Le journal est stocké de façon persistante sous la forme de binaires dans le dossier /var/log/journal, qui fait partie du package systemd (quand il est configuré avec Storage=auto). Si il est effacé, systemd ne le refera pas - et les journaux ne seront plus persistants. Si le service systemd-journald est redémarré et que le journal est configuré avec Stprage=persistent, le dossier sera recréé.&lt;br /&gt;
&lt;br /&gt;
== Classification des entrées de journal ==&lt;br /&gt;
Le journal classifie les entrées selon deux tableaux, priority et facility (ce qui correspond à la RFC 5424).&lt;br /&gt;
&lt;br /&gt;
=== Priority ===&lt;br /&gt;
Correspond au niveau d&#039;alerte.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value !! Severity !! Keyword  !! Description || Examples&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Emergency || emerg || System is unusable || Severe Kernel BUG, [[Systemd-coredump|systemd dumped core]].&amp;lt;br&amp;gt;This level should not be used by applications.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Alert || alert || Should be corrected immediately || Vital subsystem goes out of work. Data loss. &amp;lt;br&amp;gt;|kernel: BUG: unable to handle kernel paging request at ffffc90403238ffc|.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Critical || crit || Critical conditions || Crashes, coredumps. Like familiar flash:&amp;lt;br&amp;gt;|systemd-coredump[25319]: Process 25310 (plugin-containe) of user 1000 dumped core&amp;lt;br&amp;gt;Failure in the system primary application, like X11. &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Error || err || Error conditions || Not severe error reported:&amp;lt;br&amp;gt;|kernel: usb 1-3: 3:1: cannot get freq at ep 0x84,&amp;lt;br&amp;gt;Failed unmounting /var.&amp;lt;br&amp;gt;|libvirtd[1720]: internal error: Failed to initialize a valid firewall backend&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Warning || warning || May indicate that an error will occur if action is not taken. ||  A non-root file system has only 1GB free.&amp;lt;br&amp;gt; (process:5999): Gtk-WARNING **: Locale not supported by C library. Using the fallback &#039;C&#039; locale.&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Notice || notice || Events that are unusual, but not error conditions. || |systemd[1]: var.mount: Directory /var to mount over is not empty, mounting anyway,&amp;lt;br&amp;gt;|gcr-prompter[4997]: Gtk: GtkDialog mapped without a transient parent. This is discouraged&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Informational || info ||  Normal operational messages that require no action. || |lvm[585]:   7 logical volume(s) in volume group &amp;quot;archvg&amp;quot; now active&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Debug || debug || Information useful to developers for debugging the application. || |kdeinit5[1900]: powerdevil: Scheduling inhibition from &amp;quot;:1.14&amp;quot; &amp;quot;firefox&amp;quot; with cookie 13 and reason &amp;quot;screen&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Facility ===&lt;br /&gt;
Sert à indiquer le type de programme dont provient le message.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Facility code !! Keyword !! Description !! Info&lt;br /&gt;
|-&lt;br /&gt;
| 0 || kern || Kernel messages&lt;br /&gt;
|-&lt;br /&gt;
| 1 || user || User-level messages&lt;br /&gt;
|-&lt;br /&gt;
| 2 || mail || Mail system || Archaic POSIX still supported and sometimes used (for more {{man|1|mail}})&lt;br /&gt;
|-&lt;br /&gt;
| 3 || daemon || System daemons || All daemons, including systemd and its subsystems&lt;br /&gt;
|-&lt;br /&gt;
| 4 || auth || Security/authorization messages || Also watch for different facility 10&lt;br /&gt;
|-&lt;br /&gt;
| 5 || syslog || Messages generated internally by syslogd || For syslogd implementations (not used by systemd, see facility 3)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || lpr || Line printer subsystem (archaic subsystem)&lt;br /&gt;
|-&lt;br /&gt;
| 7 || news || Network news subsystem (archaic subsystem)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || uucp || UUCP subsystem (archaic subsystem)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || || Clock daemon || systemd-timesyncd&lt;br /&gt;
|-&lt;br /&gt;
| 10 || authpriv || Security/authorization messages || Also watch for different facility 4&lt;br /&gt;
|-&lt;br /&gt;
| 11 || ftp || FTP daemon&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || NTP subsystem&lt;br /&gt;
|-&lt;br /&gt;
| 13 || - || Log audit&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || Log alert&lt;br /&gt;
|-&lt;br /&gt;
| 15 || cron || Scheduling daemon&lt;br /&gt;
|-&lt;br /&gt;
| 16 || local0 || Local use 0  (local0)&lt;br /&gt;
|-&lt;br /&gt;
| 17 || local1 || Local use 1  (local1)&lt;br /&gt;
|-&lt;br /&gt;
| 18 || local2 || Local use 2  (local2)&lt;br /&gt;
|-&lt;br /&gt;
| 19 || local3 || Local use 3  (local3)&lt;br /&gt;
|-&lt;br /&gt;
| 20 || local4 || Local use 4  (local4)&lt;br /&gt;
|-&lt;br /&gt;
| 21 || local5 || Local use 5  (local5)&lt;br /&gt;
|-&lt;br /&gt;
| 22 || local6 || Local use 6  (local6)&lt;br /&gt;
|-&lt;br /&gt;
| 23 || local7 || Local use 7  (local7)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les plus utiles à surveiller sont : 0, 1, 3, 4, 9, 10, 15.&lt;br /&gt;
&lt;br /&gt;
== Afficher le journal et filtrer sa sortie ==&lt;br /&gt;
La commande de base de consultation du journal est:&lt;br /&gt;
 journalctl&lt;br /&gt;
&lt;br /&gt;
=== Suivre un service (une unit) ===&lt;br /&gt;
 journalctl -u mon service&lt;br /&gt;
&lt;br /&gt;
=== Suivre les message générés par un exécutable ===&lt;br /&gt;
 journalctl /usr/lib/systemd/systemd&lt;br /&gt;
&lt;br /&gt;
=== Suivre les mesage par PID ===&lt;br /&gt;
 journalctl _PID=1&lt;br /&gt;
&lt;br /&gt;
=== Affichage temps réel ===&lt;br /&gt;
 journalctl -f&lt;br /&gt;
&lt;br /&gt;
=== Filtrer depuis le boot actuel / précédent, voir la liste des boots ===&lt;br /&gt;
 journalctl -b&lt;br /&gt;
&lt;br /&gt;
Si je veux voir depuis le boot précédent:&lt;br /&gt;
 journalctl -b -1&lt;br /&gt;
-2 m&#039;emmènera au boot d&#039;encore avant, etc.&lt;br /&gt;
&lt;br /&gt;
Je peux voir la liste des boots enregistrés:&lt;br /&gt;
 journalctl --list-boots&lt;br /&gt;
&lt;br /&gt;
=== Afficher des explications du catalogue ===&lt;br /&gt;
Le journal inclue un système de catalogue ([https://www.freedesktop.org/wiki/Software/systemd/catalog/ explications]), qui permet d&#039;améliorer la sortie du journal en ajoutant plus d&#039;explications. &lt;br /&gt;
&lt;br /&gt;
On peut voir les entrées de catalogue existant sur le système:&lt;br /&gt;
 journalctl --list-catalog&lt;br /&gt;
Et voir notre journal avec les entrées expliquées quand c&#039;est dispo&lt;br /&gt;
 journactl -x&lt;br /&gt;
&lt;br /&gt;
=== Gestion du temps ===&lt;br /&gt;
Depuis une date:&lt;br /&gt;
 journalctl --since=&amp;quot;2012-10-30 18:17:16&amp;quot;&lt;br /&gt;
Depuis un temps:&lt;br /&gt;
 journalctl --since &amp;quot;20 min ago&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Voir le dmesg ===&lt;br /&gt;
 journalctl -k&lt;br /&gt;
&lt;br /&gt;
=== Filtrer par niveau d&#039;alerte ===&lt;br /&gt;
On peut choisir une range de niveau d&#039;alerte:&lt;br /&gt;
 journalctl -p err..alert&lt;br /&gt;
On peut aussi utiliser des nombres:&lt;br /&gt;
 journalctl -p 3..1&lt;br /&gt;
&lt;br /&gt;
Avec un seul nombre, on choisit cette priorité et les priorités plus élevées. Par exemple:&lt;br /&gt;
 journalctl -p 3 &lt;br /&gt;
affichera les messages de niveau erreur ou plus élevé.&lt;br /&gt;
&lt;br /&gt;
=== Filtrer par facility (filtrer par source) ===&lt;br /&gt;
Pour filtrer sur ma facility 10 (qui est l&#039;équivalent d&#039;un auth.log), par exemple:&lt;br /&gt;
 journalctl SYSLOG_FACILITY=10&lt;br /&gt;
&lt;br /&gt;
== Formater la sortie ==&lt;br /&gt;
Par défaut, le journal utilise less comme pager (soit, comme gestionnaire d&#039;affichage).&lt;br /&gt;
&lt;br /&gt;
=== Ne pas couper les lignes / Afficher sur la sortie standard ===&lt;br /&gt;
Pour une longue ligne, le journal va la tronquer et il faudra se balader avec les flèches gauche / droite. Ce n&#039;est pas génial; le plus simple pour s&#039;en débarasser consiste à utiliser l&#039;option --no-pager pour afficher sur la sortie standard.&lt;br /&gt;
 journalctl --no-pager&lt;br /&gt;
&lt;br /&gt;
=== Choisir un format de sortie ===&lt;br /&gt;
L&#039;option -o permet de choisir un tas de formats d&#039;affichage, dont la liste est disponible dans le man de journalctl:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
short&lt;br /&gt;
is the default and generates an output that is mostly&lt;br /&gt;
identical to the formatting of classic syslog files,&lt;br /&gt;
showing one line per journal entry.&lt;br /&gt;
&lt;br /&gt;
short-full&lt;br /&gt;
is very similar, but shows timestamps in the format the&lt;br /&gt;
--since= and --until= options accept. Unlike the&lt;br /&gt;
timestamp information shown in short output mode this&lt;br /&gt;
mode includes weekday, year and timezone information in&lt;br /&gt;
the output, and is locale-independent.&lt;br /&gt;
&lt;br /&gt;
short-iso&lt;br /&gt;
is very similar, but shows ISO 8601 wallclock timestamps.&lt;br /&gt;
&lt;br /&gt;
short-iso-precise&lt;br /&gt;
as for short-iso but includes full microsecond precision.&lt;br /&gt;
&lt;br /&gt;
short-precise&lt;br /&gt;
is very similar, but shows classic syslog timestamps with&lt;br /&gt;
full microsecond precision.&lt;br /&gt;
&lt;br /&gt;
short-monotonic&lt;br /&gt;
is very similar, but shows monotonic timestamps instead&lt;br /&gt;
of wallclock timestamps.&lt;br /&gt;
&lt;br /&gt;
short-unix&lt;br /&gt;
is very similar, but shows seconds passed since January&lt;br /&gt;
1st 1970 UTC instead of wallclock timestamps (&amp;quot;UNIX&lt;br /&gt;
time&amp;quot;). The time is shown with microsecond accuracy.&lt;br /&gt;
&lt;br /&gt;
verbose&lt;br /&gt;
shows the full-structured entry items with all fields.&lt;br /&gt;
&lt;br /&gt;
export&lt;br /&gt;
serializes the journal into a binary (but mostly&lt;br /&gt;
text-based) stream suitable for backups and network&lt;br /&gt;
transfer (see Journal Export Format[1] for more&lt;br /&gt;
information). To import the binary stream back into&lt;br /&gt;
native journald format use systemd-journal-remote(8).&lt;br /&gt;
&lt;br /&gt;
json&lt;br /&gt;
formats entries as JSON objects, separated by newline&lt;br /&gt;
characters (see Journal JSON Format[2] for more&lt;br /&gt;
information). Field values are generally encoded as JSON&lt;br /&gt;
strings, with three exceptions:&lt;br /&gt;
&lt;br /&gt;
1. Fields larger than 4096 bytes are encoded as null&lt;br /&gt;
   values. (This may be turned off by passing --all, but&lt;br /&gt;
   be aware that this may allocate overly long JSON&lt;br /&gt;
   objects.)&lt;br /&gt;
&lt;br /&gt;
2. Journal entries permit non-unique fields within the&lt;br /&gt;
   same log entry. JSON does not allow non-unique fields&lt;br /&gt;
   within objects. Due to this, if a non-unique field is&lt;br /&gt;
   encountered a JSON array is used as field value,&lt;br /&gt;
   listing all field values as elements.&lt;br /&gt;
&lt;br /&gt;
3. Fields containing non-printable or non-UTF8 bytes are&lt;br /&gt;
   encoded as arrays containing the raw bytes&lt;br /&gt;
   individually formatted as unsigned numbers.&lt;br /&gt;
&lt;br /&gt;
Note that this encoding is reversible (with the exception&lt;br /&gt;
of the size limit).&lt;br /&gt;
&lt;br /&gt;
json-pretty&lt;br /&gt;
formats entries as JSON data structures, but formats them&lt;br /&gt;
in multiple lines in order to make them more readable by&lt;br /&gt;
humans.&lt;br /&gt;
&lt;br /&gt;
json-sse&lt;br /&gt;
formats entries as JSON data structures, but wraps them&lt;br /&gt;
in a format suitable for Server-Sent Events[3].&lt;br /&gt;
&lt;br /&gt;
json-seq&lt;br /&gt;
formats entries as JSON data structures, but prefixes&lt;br /&gt;
them with an ASCII Record Separator character (0x1E) and&lt;br /&gt;
suffixes them with an ASCII Line Feed character (0x0A),&lt;br /&gt;
in accordance with JavaScript Object Notation (JSON) Text&lt;br /&gt;
Sequences[4] (&amp;quot;application/json-seq&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
cat&lt;br /&gt;
generates a very terse output, only showing the actual&lt;br /&gt;
message of each journal entry with no metadata, not even&lt;br /&gt;
a timestamp. If combined with the --output-fields= option&lt;br /&gt;
will output the listed fields for each log record,&lt;br /&gt;
instead of the message.&lt;br /&gt;
&lt;br /&gt;
with-unit&lt;br /&gt;
similar to short-full, but prefixes the unit and user&lt;br /&gt;
unit names instead of the traditional syslog identifier.&lt;br /&gt;
Useful when using templated instances, as it will include&lt;br /&gt;
the arguments in the unit names.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour un affichage en json lisible par exemple:&lt;br /&gt;
 journalctl -o json-pretty&lt;br /&gt;
&lt;br /&gt;
== Configuration du journal ==&lt;br /&gt;
Le fichier de configuration du journal se situe dans /etc/systemd/journal. Le service a redémarrer est systemd-journald.&lt;br /&gt;
&lt;br /&gt;
Le manuel est détaillé : &lt;br /&gt;
 man journald.conf&lt;br /&gt;
&lt;br /&gt;
=== Gestion de la persistence ===&lt;br /&gt;
Le journal est nettoyé (en anglais &amp;quot;vacuumed&amp;quot;, soit littéralement &amp;quot;passé l&#039;aspirateur&amp;quot;) régulièrement en fonction de la configuration. Les journaux nettoyés ne sont plus disponibles !&lt;br /&gt;
&lt;br /&gt;
=== Option &amp;quot;Storage&amp;quot; ===&lt;br /&gt;
Dans le fichier de conf du journal, une option important est &amp;quot;Storage&amp;quot;. Celle-ci détermine la persistence et peut prendre les valeurs:&lt;br /&gt;
* volatile : gardé en mémoire seulement, dans /run/log/journal&lt;br /&gt;
* persistent : gardé sur disque, dans /var/log/journal&lt;br /&gt;
* auto : comme persistent, si /var/log/journal existe&lt;br /&gt;
* none : on ne garde rien.&lt;br /&gt;
&lt;br /&gt;
==== Taille maximum ====&lt;br /&gt;
Par défaut, le système ne conserve pas les journaux de façon illimitée : un journal non-volatile aura une taille limite à 10% de son filesystem, dans une limite de 4 Go. On peut confirmer ces valeurs avec:&lt;br /&gt;
 journalctl -b -u systemd-journald&lt;br /&gt;
&lt;br /&gt;
* Cette valeur maximum peut être modifiée dans le fichier de conf:&lt;br /&gt;
 SystemMaxUse=50M&lt;br /&gt;
...ou dans un snippet à part, par exemple dans &lt;br /&gt;
 /etc/systemd/journald.conf.d/00-journal-size.conf&lt;br /&gt;
avec&lt;br /&gt;
 [Journal]&lt;br /&gt;
 SystemMaxUse=50M&lt;br /&gt;
&lt;br /&gt;
* On peut configurer la quantité d&#039;espace qui doit rester dispo après rotation:&lt;br /&gt;
 SystemKeepFree=&lt;br /&gt;
* On peut configurer la taille maximum d&#039;un fichier de journal avec&lt;br /&gt;
 SystemMaxFileSize&lt;br /&gt;
&lt;br /&gt;
==== Rotation des journaux ====&lt;br /&gt;
On peut faire tourner les journaux à la main, par exemple pour effacer tout ce qui a plus de 2 jours:&lt;br /&gt;
 journalctl --vacuum-time=2d&lt;br /&gt;
Ou retenir les 500 derniers Mo de journal:&lt;br /&gt;
 journalctl --vacuum-size=500M&lt;br /&gt;
On peut voir l&#039;espace disque utilisé par le journal:&lt;br /&gt;
 journalctl --disk-usage&lt;br /&gt;
&lt;br /&gt;
==== Namespace ====&lt;br /&gt;
On peut aussi limiter la taille pour une unité, par exemple sshd, avec le système de namespaces. Il faut modifier le fichier d&#039;unit et ajouter:&lt;br /&gt;
 LogNamespace=ssh&lt;br /&gt;
dans la section [Service]. Ensuite, on créée /etc/systemd/journald@ssh.conf en copiant /etc/systemd/journald.conf; puis on l&#039;édite et on lui donne un SystemMaxUse. Après ça, il suffit de redémarrer le service (sshd en l&#039;occurence).&lt;br /&gt;
&lt;br /&gt;
On peut voir le journal d&#039;un namespace de la façon suivante:&lt;br /&gt;
 journalctl --namespace ssh&lt;br /&gt;
&lt;br /&gt;
=== Un exemple de configuration pour de la production ===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#/etc/systemd/journald.conf&lt;br /&gt;
[Journal]&lt;br /&gt;
Compress=yes &lt;br /&gt;
ForwardToConsole=no &lt;br /&gt;
ForwardToSyslog=no&lt;br /&gt;
MaxRetentionSec=1year &lt;br /&gt;
RateLimitBurst=10000 &lt;br /&gt;
RateLimitIntervalSec=30s&lt;br /&gt;
Storage=persistent &lt;br /&gt;
SyncIntervalSec=1s &lt;br /&gt;
SystemMaxUse=8g &lt;br /&gt;
SystemKeepFree=20% &lt;br /&gt;
SystemMaxFileSize=10M&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Compress : les logs sont compressés avant d&#039;être stockés.&lt;br /&gt;
* ForwardtoConsole, ForwardtoSyslog : ici, on ne forwarde pas les messages (ni à une console, ni à un syslog). On les garde !&lt;br /&gt;
* MaxRetentionSec : Ici, on garde un an maximum de journaux. Le mot &amp;quot;Sec&amp;quot; est un peu malvenu, parce qu&#039;on peut donner des valeurs en : &amp;quot;year&amp;quot;, &amp;quot;month&amp;quot;, &amp;quot;week&amp;quot;, &amp;quot;day&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot; m&amp;quot;.&lt;br /&gt;
* RateLimitBurst et IntervalSec (valeurs par défaut ici) : si le log reçoit plus de 10000 messages en 30 secondes, il les droppe.&lt;br /&gt;
* Storage=Persistent : on garde les journaux sur le disque. &lt;br /&gt;
* SyncIntervalSec: Le journal attend la durée donnée avant de synchroniser son journal sur disque pour les entrées de message dont le niveau d&#039;alerte est de ERR ou moins. Les autre sont synchronisées immédiatement.&lt;br /&gt;
* SystemMaxUse : À 8 Go, les journaux sont effacés.&lt;br /&gt;
* SystemKeepFree : Si le FS a moins de 20% de libre, le journal fera de la place.&lt;br /&gt;
* SystemMaxFileSize : taille maximum d&#039;un journal individuel.&lt;br /&gt;
&lt;br /&gt;
== Forward vers un serveur syslog ==&lt;br /&gt;
Il est possible de forwarder le journal vers un daemon syslog. Il suffit de le configurer avec l&#039;option:&lt;br /&gt;
 ForwardToSyslog=yes&lt;br /&gt;
&lt;br /&gt;
En configurant le syslog, il est alors possible de renvoyer les messages sur un serveur de syslog. Cela peut être intéressant de garder cette conf en conjonction avec Storage=none, par exemple, pour externaliser tous les logs.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Systemd&amp;diff=2558</id>
		<title>Systemd</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Systemd&amp;diff=2558"/>
		<updated>2025-05-14T20:00:15Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
= Liens, références =&lt;br /&gt;
En vrac&lt;br /&gt;
* https://christine.website/talks/systemd-the-good-parts-2021-05-16&lt;br /&gt;
* https://wiki.archlinux.org/title/systemd&lt;br /&gt;
* https://www.freedesktop.org/software/systemd/man/systemd.service.html&lt;br /&gt;
* https://opensource.com/article/20/5/manage-startup-systemd&lt;br /&gt;
* https://opensource.com/article/20/7/systemd-timers&lt;br /&gt;
&lt;br /&gt;
Une longue série sur Systemd que je n&#039;ai pas encore lue&lt;br /&gt;
* http://0pointer.de/blog/projects/systemd-for-admins-1.html&lt;br /&gt;
* http://0pointer.de/blog/projects/systemd-for-admins-2.html&lt;br /&gt;
* http://0pointer.de/blog/projects/systemd-for-admins-3.html&lt;br /&gt;
* http://0pointer.de/blog/projects/systemd-for-admins-4.html&lt;br /&gt;
* http://0pointer.de/blog/projects/three-levels-of-off.html&lt;br /&gt;
* http://0pointer.de/blog/projects/changing-roots&lt;br /&gt;
* http://0pointer.de/blog/projects/blame-game.html&lt;br /&gt;
* http://0pointer.de/blog/projects/the-new-configuration-files.html&lt;br /&gt;
* http://0pointer.de/blog/projects/on-etc-sysinit.html&lt;br /&gt;
* http://0pointer.de/blog/projects/instances.html&lt;br /&gt;
* http://0pointer.de/blog/projects/inetd.html&lt;br /&gt;
&lt;br /&gt;
Un article sur le durcissement de services&lt;br /&gt;
* https://ruderich.org/simon/notes/systemd-service-hardening&lt;br /&gt;
&lt;br /&gt;
= Structure générale de Systemd, présentation =&lt;br /&gt;
[[Fichier:Sysd-comp.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Systemd est un ensemble de logiciels de base, alternative à SysVInit, le plus important étant notamment l&#039;init (soit de tout premier process lancé par l&#039;OS) : en effet, il fournit une gestion de services qui tourne sur le PID numéro 1 et qui lance tous les autres.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
➜  ~ sudo pstree&lt;br /&gt;
[sudo] password for justine: &lt;br /&gt;
systemd─┬─ModemManager───2*[{ModemManager}]&lt;br /&gt;
        ├─NetworkManager─┬─dhclient&lt;br /&gt;
        │                └─2*[{NetworkManager}]&lt;br /&gt;
        ├─2*[VBoxClient───VBoxClient───2*[{VBoxClient}]]&lt;br /&gt;
        ├─VBoxClient───VBoxClient───3*[{VBoxClient}]&lt;br /&gt;
        ├─VBoxClient───VBoxDRMClient&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Son but est de parralléliser de façon aggressive pour une meilleure gestion des ressources. Il: &lt;br /&gt;
* utilise des sockets ainsi que le système de messages D-BUS pour lancer ses services;&lt;br /&gt;
* permet également de gérer ses services à la demande&lt;br /&gt;
* surveille les processus utilisant des cgroups &lt;br /&gt;
* maintient les montages et automontages&lt;br /&gt;
* Supporte les init scripts au format SysV et LSB afin de remplacer SysV Init&lt;br /&gt;
&lt;br /&gt;
Habituellement surtout connu pour la gestion des services, il contient également des utilitaires:&lt;br /&gt;
* Un daemon gérant les logs (le journal)&lt;br /&gt;
* Des utilitaires permettant de contrôler des configurations de base comme le hostname, la date, les locales, &lt;br /&gt;
* De quoi pour voir la liste des utilisateurs connectés&lt;br /&gt;
* De quoi voir la liste des conteneurs qui tournent &lt;br /&gt;
* ...les comptes système&lt;br /&gt;
* les &amp;quot;runtime directories&amp;quot; et &amp;quot;runtime settings&amp;quot;&lt;br /&gt;
* Un daemon pour le réseau&lt;br /&gt;
* Un daemon pour NTP&lt;br /&gt;
* Un daemon pour le log forwarding&lt;br /&gt;
* Un daemon pour la résolution de nom...&lt;br /&gt;
&lt;br /&gt;
Bref, plein de trucs. Voici une liste non exhaustive de ses composants : &lt;br /&gt;
* Systemd-boot : Gestionnaire UEFI de boot similaire à Grub&lt;br /&gt;
* systemd-firstboot : système de configuration avant le premier boot&lt;br /&gt;
* systemd-homed : système de comptes utilisateurs humains portables&lt;br /&gt;
* systemd-logind : gestion de sessions&lt;br /&gt;
* systemd-networkd : gestion de configuration réseau&lt;br /&gt;
* systemd-nspawn : conteneur de namespace léger (un &amp;quot;chroot on steroids&amp;quot; d&#039;après le arch wiki)&lt;br /&gt;
* systemd-resolved : résolveur dns&lt;br /&gt;
* systemd-sysusers : Création d&#039;utilisateurs / de groupes systèmes et ajout d&#039;utilisateurs à des groupes lors de l&#039;installation de paquets&lt;br /&gt;
* systemd-timesyncd : synchronisation NTP&lt;br /&gt;
* Journal : Centralisation des logs&lt;br /&gt;
* Timers : Gestion de timers, alternative à cron&lt;br /&gt;
* systemd.mount : composant chargé du montage des fs&lt;br /&gt;
* systemd-sysvcompat : fournit la compatibilité avec les configurations type SysV&lt;br /&gt;
* systemd-tmpfiles : Gestion des fichiers / dossiers temporaires&lt;br /&gt;
 ...et il y&#039;en a sûrement d&#039;autres.&lt;br /&gt;
&lt;br /&gt;
= Résumé des commandes =&lt;br /&gt;
https://www.linuxtrainingacademy.com/systemd-cheat-sheet/&lt;br /&gt;
&lt;br /&gt;
== Informations ==&lt;br /&gt;
* systemctl list-dependencies : Show a unit’s dependencies&lt;br /&gt;
* systemctl list-sockets : List sockets and what activates&lt;br /&gt;
* systemctl list-jobs : View active systemd jobs&lt;br /&gt;
* systemctl list-unit-files : See unit files and their states&lt;br /&gt;
* systemctl list-units : Show if units are loaded/active&lt;br /&gt;
* systemctl get – default : List default target (like run level)&lt;br /&gt;
&lt;br /&gt;
== Editer les services ou les timers ==&lt;br /&gt;
* systemctl edit [--full] service/timer : permet de réécrire la définition d&#039;un service ou d&#039;un timer. Avec l&#039;option --full, prend le fichier qui serait dans /lib/systemd/system/, en fait une copie dans /etc/systemd/system/ et l&#039;ouvre avec un éditeur de texte afin de le réécrire complètement. Sans cette option, on va simplement modifier/ajouter certaines options du service en créant un dossier /etc/systemd/system/&amp;lt;unit-name&amp;gt;.&amp;lt;unit-type&amp;gt;.d/. Exemple d&#039;utilisation : [[Unattended-upgrades]] (section &amp;quot;modification des heures de lancement&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Travailler sur les services ==&lt;br /&gt;
&lt;br /&gt;
* systemctl stop service : Stop a running service&lt;br /&gt;
* systemctl start service : Start a service&lt;br /&gt;
* systemctl restart service : Restart a running service&lt;br /&gt;
* systemctl reload service : Reload all config files in service&lt;br /&gt;
* systemctl status service : See if service is running/enabled&lt;br /&gt;
* systemctl enable service : Enable a service to start on boot&lt;br /&gt;
* systemctl disable service : Disable service–won’t start at boot&lt;br /&gt;
* systemctl show service : Show properties of a service (or other unit)&lt;br /&gt;
* systemctl -H host status network : Run any systemctl command remotely&lt;br /&gt;
&lt;br /&gt;
== Travailler sur le système ==&lt;br /&gt;
&lt;br /&gt;
* systemctl reboot : Reboot the system (reboot.target)&lt;br /&gt;
* systemctl poweroff : Power off the system (poweroff.target)&lt;br /&gt;
* systemctl emergency : Put in emergency mode (emergency.target)&lt;br /&gt;
* systemctl default : Back to default target (multi-user.target&lt;br /&gt;
* systemctl suspend : Mettre en veille&lt;br /&gt;
* systemctl hibernate : Mode hibernation &lt;br /&gt;
&lt;br /&gt;
== Travailler avec les logs ==&lt;br /&gt;
&lt;br /&gt;
* journalctl : Show all collected log messages&lt;br /&gt;
* journalctl -u network.service : See network service messages&lt;br /&gt;
* journalctl -f : Follow messages as they appear&lt;br /&gt;
* journalctl -k : Show only kernel messages&lt;br /&gt;
&lt;br /&gt;
== Travailler avec les targets ==&lt;br /&gt;
* systemctl isolate multi-user.target : Passer sur la target multi-user&lt;br /&gt;
* systemctl set-default -f multi-user.target : Changer la target par défaut&lt;br /&gt;
* systemctl list-unit-files | grep target  : Voir les targets configurées sur le système&lt;br /&gt;
* systemctl show -p Wants -p Requires &amp;lt;target&amp;gt; : Voir les unités regroupées dans une target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Équivalence Sysvinit vers Systemd ==&lt;br /&gt;
&lt;br /&gt;
 Sysvinit: service SERVICE_NAME start&lt;br /&gt;
 Systemd: systemctl start SERVICE_NAME (Example: systemctl start cron.service)&lt;br /&gt;
 Notes: Used to start a service (not reboot persistent)&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: service SERVICE_NAME stop&lt;br /&gt;
 Systemd: systemctl stop SERVICE_NAME&lt;br /&gt;
 Notes: Used to stop a service (not reboot persistent)&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: service SERVICE_NAME restart&lt;br /&gt;
 Systemd: systemctl restart SERVICE_NAME&lt;br /&gt;
 Notes: Used to stop and then start a service&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: service SERVICE_NAME reload&lt;br /&gt;
 Systemd: systemctl reload SERVICE_NAME&lt;br /&gt;
 Notes: When supported, reloads the config file without interrupting pending operations.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: service SERVICE_NAME condrestart&lt;br /&gt;
 Systemd: systemctl condrestart SERVICE_NAME&lt;br /&gt;
 Notes: Restarts if the service is already running.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: service SERVICE_NAME status&lt;br /&gt;
 Systemd: systemctl status SERVICE_NAME&lt;br /&gt;
 Notes: Tells whether a service is currently running.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig SERVICE_NAME on&lt;br /&gt;
 Systemd: systemctl enable SERVICE_NAME&lt;br /&gt;
 Notes: Turn the service on, for start at next boot, or other trigger.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig SERVICE_NAME off&lt;br /&gt;
 Systemd: systemctl disable SERVICE_NAME&lt;br /&gt;
 Notes: Turn the service off for the next reboot, or any other trigger.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig SERVICE_NAME&lt;br /&gt;
 Systemd: systemctl is-enabled SERVICE_NAME&lt;br /&gt;
 Notes: Used to check whether a service is configured to start or not in the current environment.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig –list&lt;br /&gt;
 Systemd: systemctl list-unit-files –type=service (or) ls /etc/systemd/system/*.wants/&lt;br /&gt;
 Notes: Print a table of services that lists which runlevels each is configured on or off&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig –list | grep 5:on&lt;br /&gt;
 Systemd: systemctl list-dependencies graphical.target&lt;br /&gt;
 Notes: Print a table of services that will be started when booting into graphical mode&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig SERVICE_NAME –list&lt;br /&gt;
 Systemd: ls /etc/systemd/system/*.wants/SERVICE_NAME.service&lt;br /&gt;
 Notes: Used to list what levels this service is configured on or off&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: chkconfig SERVICE_NAME –add&lt;br /&gt;
 Systemd: systemctl daemon-reload&lt;br /&gt;
 Notes: Used when you create a new service file or modify any configuration&lt;br /&gt;
 &lt;br /&gt;
 Runlevels to Targets Cheat Sheet&lt;br /&gt;
 Sysvinit: 0&lt;br /&gt;
 Systemd: runlevel0.target, poweroff.target&lt;br /&gt;
 Notes: Halt the system.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: 1, s, single&lt;br /&gt;
 Systemd: runlevel1.target, rescue.target&lt;br /&gt;
 Notes: Single user mode.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: 2, 4&lt;br /&gt;
 Systemd: runlevel2.target, runlevel4.target, multi-user.target&lt;br /&gt;
 Notes: User-defined/Site-specific runlevels. By default, identical to 3.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: 3&lt;br /&gt;
 Systemd: runlevel3.target, multi-user.target&lt;br /&gt;
 Notes: Multi-user, non-graphical. Users can usually login via multiple consoles or via the network.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: 5&lt;br /&gt;
 Systemd: runlevel5.target, graphical.target&lt;br /&gt;
 Notes: Multi-user, graphical. Usually has all the services of runlevel 3 plus a graphical login.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: 6&lt;br /&gt;
 Systemd: runlevel6.target, reboot.target&lt;br /&gt;
 Notes: Reboot&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: emergency&lt;br /&gt;
 Systemd: emergency.target&lt;br /&gt;
 Notes: Emergency shell&lt;br /&gt;
 &lt;br /&gt;
 Changing runlevels:&lt;br /&gt;
 Sysvinit: telinit 3&lt;br /&gt;
 Systemd: systemctl isolate multi-user.target (OR systemctl isolate runlevel3.target OR telinit 3)&lt;br /&gt;
 Notes: Change to multi-user run level.&lt;br /&gt;
 &lt;br /&gt;
 Sysvinit: sed s/^id:.*:initdefault:/id:3:initdefault:/&lt;br /&gt;
 Systemd: ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target&lt;br /&gt;
 Notes: Set to use multi-user runlevel on next reboot.&lt;br /&gt;
&lt;br /&gt;
= Création d&#039;un service avec systemd =&lt;br /&gt;
&lt;br /&gt;
https://doc.ubuntu-fr.org/creer_un_service_avec_systemd&lt;br /&gt;
&lt;br /&gt;
Comme Upstart, systemd utilise des fichiers de configuration correspondant aux différents services à manipuler. Il n&#039;est (en général) plus nécessaire de créer des fichiers bash pour gérer le service, systemd s&#039;occupe de tout (lancement, arrêt, redémarrage, status, gestion des logs, etc)&lt;br /&gt;
Ces fichiers de configuration se trouvent dans /etc/systemd/system/ et permettent d&#039;indiquer les conditions d&#039;activation ou désactivation d&#039;un service, leur propriétaire, etc. &lt;br /&gt;
&lt;br /&gt;
Une fois le fichier créé:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl enable &amp;lt;nom du service&amp;gt;.service&lt;br /&gt;
systemctl start &amp;lt;nom du service&amp;gt;.service&lt;br /&gt;
systemctl status &amp;lt;nom du service&amp;gt;.service&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Types de services ==&lt;br /&gt;
&lt;br /&gt;
* Service simple : Lance un processus principal. Si le processus a besoin de canaux de communication comme des sockets, ils doivent être prêts avant l&#039;activation du processus. Ainsi, systemd peut traiter les autres unités sans se préoccuper de la fin du lancement d&#039;une unité de type &amp;quot;simple&amp;quot;.&lt;br /&gt;
* Service &amp;quot;forking&amp;quot; : C&#039;est lorsqu&#039;un processus père lance un processus fils. Le père s&#039;arrête quand le fils est en place avec tous ses canaux de communication en place. Le processus fils continue à fonctionner en tant que le processus principal du service. systemd poursuit le traitement des autres unités une fois que le processus père se termine. Ce type de service correspond aux services UNIX traditionnels.&lt;br /&gt;
* Oneshot : Similaire à un service simple, mais systemd attend que le processus se termine avant de continuer ses traitements. En gros, lorsque le service est lancé avec systemctl start foo, le script exécute toute sa commande et attends qu&#039;elle retourne avant de rendre la main.&lt;br /&gt;
Ce type de service est typiquement utilisé comme équivalent aux commandes lancées au démarrage via les scripts d&#039;init system V. Cela permet à systemd de remplacer ce mécanisme. De ce fait, avec systemd des nouveaux services apparaissent, alors qu&#039;ils auraient été simplement des scripts d&#039;init avec SysVinit.&lt;br /&gt;
* dbus : Un service de type dbus est similaire à un service de type simple. Cependant, le processus du service doit obtenir un nom via D-Bus. systemd pourra alors traiter les autres unités.&lt;br /&gt;
* notify : Un service de type notify est similaire à un service de type simple. Cependant, c&#039;est le processus du service qui avertira systemd (via la fonction sd_notfy(3)) qu&#039;il peut traiter les autres unités.&lt;br /&gt;
&lt;br /&gt;
Dbus : Logiciel de communication inter-processus développé par RHEL.&lt;br /&gt;
&lt;br /&gt;
== Exemples de fichiers ==&lt;br /&gt;
&lt;br /&gt;
=== OneShot ===&lt;br /&gt;
&lt;br /&gt;
Exemple d&#039;Iptables&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
&lt;br /&gt;
#Signifie que quand la commande start est terminée, le processus est toujours considéré comme lancé.&lt;br /&gt;
#Utile pour les oneshot qui lancent une commande mais n&#039;ont pas de processus derrière.&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
&lt;br /&gt;
#Commande à exécuter au lancement du processus. Obligatoire.&lt;br /&gt;
ExecStart=/usr/libexec/iptables.init start&lt;br /&gt;
&lt;br /&gt;
#Commande a exécuter pour arrêter le service. Facultatif.&lt;br /&gt;
ExecStop=/usr/libexec/iptables.init stop &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Service Simple ===&lt;br /&gt;
&lt;br /&gt;
Exemple de deluged (un client bittorent)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
#Donne une description du service (affichée pour le status)&lt;br /&gt;
Description=Deluge Bittorrent Client Daemon&lt;br /&gt;
&lt;br /&gt;
#Indique un pré-requis au lancement du service (ici, être relié au réseau). Le service ne sera pas stoppé si on perd le réseau; &lt;br /&gt;
#Pour cela, il faut utilise une balise Requires=&lt;br /&gt;
After=network-online.target&lt;br /&gt;
 &lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
&lt;br /&gt;
#Propriétaire du processus&lt;br /&gt;
User=deluge&lt;br /&gt;
Group=deluge&lt;br /&gt;
UMask=007&lt;br /&gt;
 &lt;br /&gt;
ExecStart=/usr/bin/deluged -d&lt;br /&gt;
 &lt;br /&gt;
#Relancer le service si il crashe&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
 &lt;br /&gt;
# Configures the time to wait before service is stopped forcefully.&lt;br /&gt;
TimeoutStopSec=300&lt;br /&gt;
 &lt;br /&gt;
[Install]&lt;br /&gt;
#Dans quel target doit être actif le service (cf la section sur les targets)&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modèle de service ===&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;avoir des templates de services qui lanceront des copies : par exemple : getty@.service donnera getty@tty1.service, getty@tty2.service... etc. On peut aussi avoir une instance par utilisateur, par exemple.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Syncthing - Open Source Continuous File Synchronization for %I&lt;br /&gt;
Documentation=man:syncthing(1)&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
#Spécifier les dépendances d&#039;un service.&lt;br /&gt;
Wants=syncthing-inotify@.service&lt;br /&gt;
 &lt;br /&gt;
[Service]&lt;br /&gt;
#%i correspond à l&#039;argument passé au lancement du service.&lt;br /&gt;
User=%i&lt;br /&gt;
ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
SuccessExitStatus=3 4&lt;br /&gt;
RestartForceExitStatus=3 4&lt;br /&gt;
UMask=0002&lt;br /&gt;
 &lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Concernant user=%i, pour lancer les différentes instances avec les users différents:&lt;br /&gt;
 systemctl enable syncthing@Connor.service&lt;br /&gt;
 systemctl enable syncthing@Ripley.service&lt;br /&gt;
 systemctl enable syncthing@Croft.service&lt;br /&gt;
&lt;br /&gt;
= Targets =&lt;br /&gt;
&lt;br /&gt;
Systemd introduit la notion de target au sein de ses unités. Une target permet de regrouper dans un seul paquet plusieurs autres unités et de retrouver la notion de runlevel de SystemV.&lt;br /&gt;
&lt;br /&gt;
== Runlevels ==&lt;br /&gt;
&lt;br /&gt;
https://fr.wikipedia.org/wiki/Run_level&lt;br /&gt;
Pour expliquer simplement la notion de runlevels, il s&#039;agit d&#039;un chiffre de 0 à 6 (et parfois &amp;quot;s&amp;quot;) donné par sysvinit pour déterminer les fonctions activées : en gros, le niveau 6 est donné au démarrage, le niveau 0 à l&#039;arrêt. On peut passer d&#039;un niveau à l&#039;autre de façon successive. L&#039;idée est de dire que le système passe d&#039;un état à l&#039;autre et qu&#039;à chaque état peut être associé un ensemble de services et autres. Par exemple, les runlevels de sysvinit sont :&lt;br /&gt;
* 0 : Arrêt&lt;br /&gt;
* 1 : Mono-utilisateur ou maintenance&lt;br /&gt;
* 2 à 5 : Fonction de l&#039;OS&lt;br /&gt;
* 6 : Reboot&lt;br /&gt;
&lt;br /&gt;
Pour les 2 à 5, on peut avoir :&lt;br /&gt;
* 2 : Multi-user sans serveur applicatif&lt;br /&gt;
* 3 : Multi-users avec serveurs applicatifs&lt;br /&gt;
* 4 ou 5 pour lancer l&#039;environnement graphique.&lt;br /&gt;
&lt;br /&gt;
== Tableau de correspondance target / runlevel ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Runlevel  Systemd Target 	                Notes&lt;br /&gt;
0 	  runlevel0.target, poweroff.target 	Arrête le système&lt;br /&gt;
1 	  runlevel1.target, rescue.target 	Mode single user&lt;br /&gt;
3 	  runlevel3.target, multi-user.target 	Mode multi-utilisateur, non graphique&lt;br /&gt;
2, 4 	  runlevel2.target, runlevel4.target, multi-user.target 	Mode défini par l&#039;utilisateur, identique au 3 par défaut.&lt;br /&gt;
5 	  runlevel5.target, graphical.target 	Mode graphique multi-utilisateur&lt;br /&gt;
6 	  runlevel6.target, reboot.target 	Redémarre&lt;br /&gt;
emergency 	emergency.target 	Shell d&#039;urgence &lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Voir les targets ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
systemd-analyze critical-chain&lt;br /&gt;
The time after the unit is active or started is printed after the &amp;quot;@&amp;quot; character.&lt;br /&gt;
The time the unit takes to start is printed after the &amp;quot;+&amp;quot; character.&lt;br /&gt;
&lt;br /&gt;
graphical.target @1min 32.691s&lt;br /&gt;
└─multi-user.target @1min 32.691s&lt;br /&gt;
  └─xinetd.service @1min 32.120s +570ms&lt;br /&gt;
    └─network-online.target @6.872s&lt;br /&gt;
      └─network.target @6.864s&lt;br /&gt;
        └─networking.service @6.706s +157ms&lt;br /&gt;
          └─network-pre.target @6.695s&lt;br /&gt;
            └─firewalld.service @4.043s +2.651s&lt;br /&gt;
              └─dbus.service @4.038s&lt;br /&gt;
                └─basic.target @4.033s&lt;br /&gt;
                  └─sockets.target @4.033s&lt;br /&gt;
                    └─dbus.socket @4.033s&lt;br /&gt;
                      └─sysinit.target @4.030s&lt;br /&gt;
                        └─apparmor.service @3.752s +276ms&lt;br /&gt;
                          └─local-fs.target @3.750s&lt;br /&gt;
                            └─opt.mount @3.730s +19ms&lt;br /&gt;
                              └─systemd-fsck@dev-mapper-vg_root\x2dlv_opt.service @3.558s +169ms&lt;br /&gt;
                                └─local-fs-pre.target @3.556s&lt;br /&gt;
                                  └─multipathd.service @3.222s +333ms&lt;br /&gt;
                                    └─systemd-udev-settle.service @2.097s +1.124s&lt;br /&gt;
                                      └─systemd-udev-trigger.service @1.914s +182ms&lt;br /&gt;
                                        └─systemd-journald.socket @1.911s&lt;br /&gt;
                                          └─-.mount @1.902s&lt;br /&gt;
                                            └─systemd-journald.socket @1.911s&lt;br /&gt;
                                              └─...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Timers Systemd =&lt;br /&gt;
https://wiki.archlinux.org/title/Systemd/Timers&lt;br /&gt;
https://www.freedesktop.org/software/systemd/man/systemd.timer.html&lt;br /&gt;
&lt;br /&gt;
Les timers sont des &amp;quot;unit files&amp;quot; (les unit files étant les fichiers décrivant par exemple les services, visibles avec la commande &amp;quot;systemctl list-unit-files&amp;quot;; je traduirais ici par &amp;quot;fichier unitaire&amp;quot; parce que je n&#039;ai aucune foutue idée du nom en français) dont le nom se termine en .timer et qui contrôlent des fichiers .service ou  des évènements. Ils peuvent être utilisés comme alternative à cron. Les timers supportent les évenènements liés au calendrier, les évènement monotones (pas compris), et peuvent être lancés de façon asynchrone.&lt;br /&gt;
&lt;br /&gt;
== Les fichiers unitaires pour les timers ==&lt;br /&gt;
Les timers sont définis dans des fichiers unitaires dont le nom comporte l&#039;extension &amp;quot;.timer&amp;quot;. Ils sont eux aussi des fichiers de configuration unitaires, et sont chargés au même endroit que les autres; cependant, ils contiennent une section [Timer] qui définit quand et comment ils s&#039;activent. Les timers peuvent être de 2 types différents : &lt;br /&gt;
* Realtime timers (ou wallclock timers) : Ils s&#039;activent selon un &#039;&#039;calendar&#039;&#039; (un agenda, en somme), comme un cronjob : par exemple, tous les jours à midi, le 15e jour du mois à 22h, etc. Ils sont définis par l&#039;option OnCalendar= &lt;br /&gt;
* Monotonic timers : Ils s&#039;activent après une durée relative à un point de départ : par exemple, 15 minutes après le boot. Ils s&#039;arrêtent quand l&#039;ordinateur est suspendu ou éteint. Ils sont définis par une mention &amp;quot;On&#039;&#039;type&#039;&#039;Sec=&amp;quot;; les plus courant sont OnBootSec= et OnUnitActiveSec=&lt;br /&gt;
&lt;br /&gt;
La liste complète des options est dans le man de systemd.timer.&lt;br /&gt;
&lt;br /&gt;
Pour chaque fichier .timer, un fichier .service correspondant existe : un foo.timer sera accompagné d&#039;un foo.service. Le fichier .timer a pour rôle de contrôler l&#039;activation du fichier .service (qui n&#039;as d&#039;ailleurs pas besoin d&#039;une section [Install] tant que c&#039;est le .timer qui est enabled. Le fichier .timer peut si besoin contrôler un fichier unitaire qui ne s&#039;appelle pas comme lui en utilisant le paramètre Unit= dans la section [Timer]. &lt;br /&gt;
&lt;br /&gt;
== Gestion des timers ==&lt;br /&gt;
Les timers peuvent être démarrés, arrêtés, activés / désactivés comme on le ferait pour un service, avec par exemple systemctl enable foo.timer.&lt;br /&gt;
&lt;br /&gt;
=== Créer un timer ===&lt;br /&gt;
&lt;br /&gt;
Exemple : je veux créer un timer foo.timer qui lance le service foo.service. Il est important qu&#039;ils aient le même nom; autrement, je devrais dans mon timer utiliser l&#039;option Unit= ([[Systemd#Les_fichiers_unitaires_pour_les_timers|voir juste au-dessus]]).&lt;br /&gt;
&lt;br /&gt;
* Créer le service /etc/systemd/system/foo.service (par exemple). Je n&#039;ai pas fait beaucoup d&#039;essais, mais le type OneShot semble le plus adapté, puisqu&#039;il exécute sa commande et s&#039;arrête : cela semble le plus utile dans l&#039;optique de remplacer une crontab. Il existe sûrement d&#039;autres possibilités.&lt;br /&gt;
* Créer le timer /etc/systemd/system/foo.timer (par exemple). Voir les exemples en dessous.&lt;br /&gt;
* Activer le timer : systemctl enable foo.timer. Sinon, il ne sera pas là au reboot !&lt;br /&gt;
* Lancer le timer : systemctl start foo.timer. Hé oui, un timer est lancé en permanence : en fait, on peut le voir comme un daemon dont la seule utilité est de regarder l&#039;horloge et de lancer le service quand le moment est venu.&lt;br /&gt;
* Vérifier : systemctl list-timers. Notre timer doit s&#039;y trouver. &lt;br /&gt;
&lt;br /&gt;
=== Afficher les timers ===&lt;br /&gt;
On peut voir les timers qui tournent ou ceux qui sont arrêtés :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
systemctl list-timers&lt;br /&gt;
#Donne par exemple&lt;br /&gt;
NEXT                         LEFT       LAST                         PASSED       UNIT                         ACTIVATES&lt;br /&gt;
Wed 2021-11-10 15:31:45 CET  51min left Wed 2021-11-10 14:34:04 CET  6min ago     anacron.timer                anacron.service&lt;br /&gt;
Thu 2021-11-11 00:00:00 CET  9h left    Wed 2021-11-10 10:30:04 CET  4h 10min ago logrotate.timer              logrotate.service&lt;br /&gt;
Thu 2021-11-11 00:00:00 CET  9h left    Wed 2021-11-10 10:30:04 CET  4h 10min ago man-db.timer                 man-db.service&lt;br /&gt;
Thu 2021-11-11 02:09:06 CET  11h left   Wed 2021-11-10 10:30:04 CET  4h 10min ago apt-daily.timer              apt-daily.service&lt;br /&gt;
Thu 2021-11-11 06:32:59 CET  15h left   Wed 2021-11-10 10:30:04 CET  4h 10min ago apt-daily-upgrade.timer      apt-daily-upgrade.service&lt;br /&gt;
Thu 2021-11-11 10:44:49 CET  20h left   Wed 2021-11-10 10:44:49 CET  3h 55min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.ser&lt;br /&gt;
&lt;br /&gt;
6 timers listed.&lt;br /&gt;
Pass --all to see loaded but inactive timers, too.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemples (tirés du wiki arch) ==&lt;br /&gt;
=== Monotonic ===&lt;br /&gt;
Un timer qui lancer le service foo.conf 15 mn après le boot, puis une fois par semaine tant que le système tourne&lt;br /&gt;
&lt;br /&gt;
/etc/systemd/system/foo.timer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run foo weekly and on boot&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnBootSec=15min&lt;br /&gt;
OnUnitActiveSec=1w&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Temps réel ===&lt;br /&gt;
Un timer qui tourne tous les lundis à midi. Si je l&#039;active et qu&#039;il voit qu&#039;il n&#039;as pas pu faire son truc le lundi midi précédent parce que le système était eteint par exemple, il le fait immédiatement (option Persistent=True). &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run foo weekly&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=weekly&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Format des dates pour le temps réel ===&lt;br /&gt;
OnCalendar peut utiliser des valeurs assez généralistes appellées special expressions (hourly, daily, etc...). En voici la liste et leur équivalent au format timestamp :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &lt;br /&gt;
    minutely → *-*-* *:*:00&lt;br /&gt;
      hourly → *-*-* *:00:00&lt;br /&gt;
       daily → *-*-* 00:00:00&lt;br /&gt;
     monthly → *-*-01 00:00:00&lt;br /&gt;
      weekly → Mon *-*-* 00:00:00&lt;br /&gt;
      yearly → *-01-01 00:00:00&lt;br /&gt;
   quarterly → *-01,04,07,10-01 00:00:00&lt;br /&gt;
semiannually → *-01,07-01 00:00:00&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autrement, l&#039;option OnCalendar utilise les timestamps : &lt;br /&gt;
 JourDeLaSemaine Année-Mois-Jour Heure:Minute:Seconde&lt;br /&gt;
On peut utiliser un astérisque pour dire que l&#039;on veut n&#039;importe quelle valeur (comme pour cron); deux valeurs séparées par un double point &amp;quot;..&amp;quot; indique une plage de valeurs (par exemple 10..20 englobe toutes les valeurs de 10 à 20 inclus). &lt;br /&gt;
&lt;br /&gt;
La partie DayOfWeek n&#039;est pas obligatoire, voir le troisième exemple.&lt;br /&gt;
&lt;br /&gt;
On peut aussi indiquer plusieurs fois OnCalendar afin de spécifier plusieurs dates auxquelles le service doit tourner.&lt;br /&gt;
&lt;br /&gt;
Exemples :&lt;br /&gt;
* Les 4 premiers jours du mois à midi, seulement le lundi et le jeudi : &lt;br /&gt;
 OnCalendar=Mon,Tue *-*-01..04 12:00:00&lt;br /&gt;
* Le premier samedi du mois : &lt;br /&gt;
 OnCalendar=Sat *-*-1..7 18:00:00&lt;br /&gt;
* Tous les jours à 4heures :&lt;br /&gt;
OnCalendar=*-*-* 4:00:00&lt;br /&gt;
* À 22h30 la semaine et 20h00 le weekend:&lt;br /&gt;
 OnCalendar=Mon..Fri 22:30&lt;br /&gt;
 OnCalendar=Sat,Sun 20:00&lt;br /&gt;
&lt;br /&gt;
On peut analyser notre spécification temporelle afin de s&#039;assurer qu&#039;elle est valide et calculer son prochain déclenchement avec l&#039;option calendar de systemd-analyze. Par exemple :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
➜  ~ systemd-analyze calendar &amp;quot;Mon,Fri *-*-* 22:00:00&amp;quot; &lt;br /&gt;
Normalized form: Mon,Fri *-*-* 22:00:00&lt;br /&gt;
    Next elapse: Fri 2021-11-12 22:00:00 CET&lt;br /&gt;
       (in UTC): Fri 2021-11-12 21:00:00 UTC&lt;br /&gt;
       From now: 2 days left&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;https://wiki.archlinux.org/title/Systemd/Journal&lt;br /&gt;
&lt;br /&gt;
=== Utiliser systemd-run avec des timers à usage unique===&lt;br /&gt;
On peut utiliser systemd-run pour lancer une commande / un service après une certaine durée. Par exemple, pour faire un touch sur un fichier après 30 secondes:&lt;br /&gt;
 systemd-run --on-active=30 /bin/touch /tmp/foo&lt;br /&gt;
On peut spécifier un fichier unitaire à lancer après une certaine durée. Ici, je lance foo.service après 12h et 30m:&lt;br /&gt;
 systemd-run --on-active=&amp;quot;12h 30m&amp;quot; --unit foo.service&lt;br /&gt;
Plus d&#039;infos dans le manuel de systemd-run.&lt;br /&gt;
&lt;br /&gt;
= Journal =&lt;br /&gt;
Systemd a son propre système de récupération des logs, appellé le *journal* (en français dans le texte). Il n&#039;est donc pas nécessaire de faire tourner un daemon de syslog supplémentaire !&lt;br /&gt;
== Sources ==&lt;br /&gt;
* [https://wiki.archlinux.org/title/Systemd/Journal source de base]&lt;br /&gt;
* [https://www.freedesktop.org/wiki/Software/systemd/catalog/ sur le catalogue]&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs Une source assez complète]&lt;br /&gt;
* [https://man.archlinux.org/man/systemd-journald.service.8#JOURNAL_NAMESPACES namespaces]&lt;br /&gt;
&lt;br /&gt;
== Emplacement des journaux ==&lt;br /&gt;
Le journal est stocké de façon persistante sous la forme de binaires dans le dossier /var/log/journal, qui fait partie du package systemd (quand il est configuré avec Storage=auto). Si il est effacé, systemd ne le refera pas - et les journaux ne seront plus persistants. Si le service systemd-journald est redémarré et que le journal est configuré avec Stprage=persistent, le dossier sera recréé.&lt;br /&gt;
&lt;br /&gt;
== Classification des entrées de journal ==&lt;br /&gt;
Le journal classifie les entrées selon deux tableaux, priority et facility (ce qui correspond à la RFC 5424).&lt;br /&gt;
&lt;br /&gt;
=== Priority ===&lt;br /&gt;
Correspond au niveau d&#039;alerte.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value !! Severity !! Keyword  !! Description || Examples&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Emergency || emerg || System is unusable || Severe Kernel BUG, [[Systemd-coredump|systemd dumped core]].&amp;lt;br&amp;gt;This level should not be used by applications.&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Alert || alert || Should be corrected immediately || Vital subsystem goes out of work. Data loss. &amp;lt;br&amp;gt;|kernel: BUG: unable to handle kernel paging request at ffffc90403238ffc|.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Critical || crit || Critical conditions || Crashes, coredumps. Like familiar flash:&amp;lt;br&amp;gt;|systemd-coredump[25319]: Process 25310 (plugin-containe) of user 1000 dumped core&amp;lt;br&amp;gt;Failure in the system primary application, like X11. &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Error || err || Error conditions || Not severe error reported:&amp;lt;br&amp;gt;|kernel: usb 1-3: 3:1: cannot get freq at ep 0x84,&amp;lt;br&amp;gt;Failed unmounting /var.&amp;lt;br&amp;gt;|libvirtd[1720]: internal error: Failed to initialize a valid firewall backend&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Warning || warning || May indicate that an error will occur if action is not taken. ||  A non-root file system has only 1GB free.&amp;lt;br&amp;gt; (process:5999): Gtk-WARNING **: Locale not supported by C library. Using the fallback &#039;C&#039; locale.&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Notice || notice || Events that are unusual, but not error conditions. || |systemd[1]: var.mount: Directory /var to mount over is not empty, mounting anyway,&amp;lt;br&amp;gt;|gcr-prompter[4997]: Gtk: GtkDialog mapped without a transient parent. This is discouraged&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Informational || info ||  Normal operational messages that require no action. || |lvm[585]:   7 logical volume(s) in volume group &amp;quot;archvg&amp;quot; now active&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Debug || debug || Information useful to developers for debugging the application. || |kdeinit5[1900]: powerdevil: Scheduling inhibition from &amp;quot;:1.14&amp;quot; &amp;quot;firefox&amp;quot; with cookie 13 and reason &amp;quot;screen&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Facility ===&lt;br /&gt;
Sert à indiquer le type de programme dont provient le message.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Facility code !! Keyword !! Description !! Info&lt;br /&gt;
|-&lt;br /&gt;
| 0 || kern || Kernel messages&lt;br /&gt;
|-&lt;br /&gt;
| 1 || user || User-level messages&lt;br /&gt;
|-&lt;br /&gt;
| 2 || mail || Mail system || Archaic POSIX still supported and sometimes used (for more {{man|1|mail}})&lt;br /&gt;
|-&lt;br /&gt;
| 3 || daemon || System daemons || All daemons, including systemd and its subsystems&lt;br /&gt;
|-&lt;br /&gt;
| 4 || auth || Security/authorization messages || Also watch for different facility 10&lt;br /&gt;
|-&lt;br /&gt;
| 5 || syslog || Messages generated internally by syslogd || For syslogd implementations (not used by systemd, see facility 3)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || lpr || Line printer subsystem (archaic subsystem)&lt;br /&gt;
|-&lt;br /&gt;
| 7 || news || Network news subsystem (archaic subsystem)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || uucp || UUCP subsystem (archaic subsystem)&lt;br /&gt;
|-&lt;br /&gt;
| 9 || || Clock daemon || systemd-timesyncd&lt;br /&gt;
|-&lt;br /&gt;
| 10 || authpriv || Security/authorization messages || Also watch for different facility 4&lt;br /&gt;
|-&lt;br /&gt;
| 11 || ftp || FTP daemon&lt;br /&gt;
|-&lt;br /&gt;
| 12 || - || NTP subsystem&lt;br /&gt;
|-&lt;br /&gt;
| 13 || - || Log audit&lt;br /&gt;
|-&lt;br /&gt;
| 14 || - || Log alert&lt;br /&gt;
|-&lt;br /&gt;
| 15 || cron || Scheduling daemon&lt;br /&gt;
|-&lt;br /&gt;
| 16 || local0 || Local use 0  (local0)&lt;br /&gt;
|-&lt;br /&gt;
| 17 || local1 || Local use 1  (local1)&lt;br /&gt;
|-&lt;br /&gt;
| 18 || local2 || Local use 2  (local2)&lt;br /&gt;
|-&lt;br /&gt;
| 19 || local3 || Local use 3  (local3)&lt;br /&gt;
|-&lt;br /&gt;
| 20 || local4 || Local use 4  (local4)&lt;br /&gt;
|-&lt;br /&gt;
| 21 || local5 || Local use 5  (local5)&lt;br /&gt;
|-&lt;br /&gt;
| 22 || local6 || Local use 6  (local6)&lt;br /&gt;
|-&lt;br /&gt;
| 23 || local7 || Local use 7  (local7)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les plus utiles à surveiller sont : 0, 1, 3, 4, 9, 10, 15.&lt;br /&gt;
&lt;br /&gt;
== Afficher le journal et filtrer sa sortie ==&lt;br /&gt;
La commande de base de consultation du journal est:&lt;br /&gt;
 journalctl&lt;br /&gt;
&lt;br /&gt;
=== Suivre un service (une unit) ===&lt;br /&gt;
 journalctl -u mon service&lt;br /&gt;
&lt;br /&gt;
=== Suivre les message générés par un exécutable ===&lt;br /&gt;
 journalctl /usr/lib/systemd/systemd&lt;br /&gt;
&lt;br /&gt;
=== Suivre les mesage par PID ===&lt;br /&gt;
 journalctl _PID=1&lt;br /&gt;
&lt;br /&gt;
=== Affichage temps réel ===&lt;br /&gt;
 journalctl -f&lt;br /&gt;
&lt;br /&gt;
=== Filtrer depuis le boot actuel / précédent, voir la liste des boots ===&lt;br /&gt;
 journalctl -b&lt;br /&gt;
&lt;br /&gt;
Si je veux voir depuis le boot précédent:&lt;br /&gt;
 journalctl -b -1&lt;br /&gt;
-2 m&#039;emmènera au boot d&#039;encore avant, etc.&lt;br /&gt;
&lt;br /&gt;
Je peux voir la liste des boots enregistrés:&lt;br /&gt;
 journalctl --list-boots&lt;br /&gt;
&lt;br /&gt;
=== Afficher des explications du catalogue ===&lt;br /&gt;
Le journal inclue un système de catalogue ([https://www.freedesktop.org/wiki/Software/systemd/catalog/ explications]), qui permet d&#039;améliorer la sortie du journal en ajoutant plus d&#039;explications. &lt;br /&gt;
&lt;br /&gt;
On peut voir les entrées de catalogue existant sur le système:&lt;br /&gt;
 journalctl --list-catalog&lt;br /&gt;
Et voir notre journal avec les entrées expliquées quand c&#039;est dispo&lt;br /&gt;
 journactl -x&lt;br /&gt;
&lt;br /&gt;
=== Gestion du temps ===&lt;br /&gt;
Depuis une date:&lt;br /&gt;
 journalctl --since=&amp;quot;2012-10-30 18:17:16&amp;quot;&lt;br /&gt;
Depuis un temps:&lt;br /&gt;
 journalctl --since &amp;quot;20 min ago&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Voir le dmesg ===&lt;br /&gt;
 journalctl -k&lt;br /&gt;
&lt;br /&gt;
=== Filtrer par niveau d&#039;alerte ===&lt;br /&gt;
On peut choisir une range de niveau d&#039;alerte:&lt;br /&gt;
 journalctl -p err..alert&lt;br /&gt;
On peut aussi utiliser des nombres:&lt;br /&gt;
 journalctl -p 3..1&lt;br /&gt;
&lt;br /&gt;
Avec un seul nombre, on choisit cette priorité et les priorités plus élevées. Par exemple:&lt;br /&gt;
 journalctl -p 3 &lt;br /&gt;
affichera les messages de niveau erreur ou plus élevé.&lt;br /&gt;
&lt;br /&gt;
=== Filtrer par facility (filtrer par source) ===&lt;br /&gt;
Pour filtrer sur ma facility 10 (qui est l&#039;équivalent d&#039;un auth.log), par exemple:&lt;br /&gt;
 journalctl SYSLOG_FACILITY=10&lt;br /&gt;
&lt;br /&gt;
== Formater la sortie ==&lt;br /&gt;
Par défaut, le journal utilise less comme pager (soit, comme gestionnaire d&#039;affichage).&lt;br /&gt;
&lt;br /&gt;
=== Ne pas couper les lignes / Afficher sur la sortie standard ===&lt;br /&gt;
Pour une longue ligne, le journal va la tronquer et il faudra se balader avec les flèches gauche / droite. Ce n&#039;est pas génial; le plus simple pour s&#039;en débarasser consiste à utiliser l&#039;option --no-pager pour afficher sur la sortie standard.&lt;br /&gt;
 journalctl --no-pager&lt;br /&gt;
&lt;br /&gt;
=== Choisir un format de sortie ===&lt;br /&gt;
L&#039;option -o permet de choisir un tas de formats d&#039;affichage, dont la liste est disponible dans le man de journalctl:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
short&lt;br /&gt;
is the default and generates an output that is mostly&lt;br /&gt;
identical to the formatting of classic syslog files,&lt;br /&gt;
showing one line per journal entry.&lt;br /&gt;
&lt;br /&gt;
short-full&lt;br /&gt;
is very similar, but shows timestamps in the format the&lt;br /&gt;
--since= and --until= options accept. Unlike the&lt;br /&gt;
timestamp information shown in short output mode this&lt;br /&gt;
mode includes weekday, year and timezone information in&lt;br /&gt;
the output, and is locale-independent.&lt;br /&gt;
&lt;br /&gt;
short-iso&lt;br /&gt;
is very similar, but shows ISO 8601 wallclock timestamps.&lt;br /&gt;
&lt;br /&gt;
short-iso-precise&lt;br /&gt;
as for short-iso but includes full microsecond precision.&lt;br /&gt;
&lt;br /&gt;
short-precise&lt;br /&gt;
is very similar, but shows classic syslog timestamps with&lt;br /&gt;
full microsecond precision.&lt;br /&gt;
&lt;br /&gt;
short-monotonic&lt;br /&gt;
is very similar, but shows monotonic timestamps instead&lt;br /&gt;
of wallclock timestamps.&lt;br /&gt;
&lt;br /&gt;
short-unix&lt;br /&gt;
is very similar, but shows seconds passed since January&lt;br /&gt;
1st 1970 UTC instead of wallclock timestamps (&amp;quot;UNIX&lt;br /&gt;
time&amp;quot;). The time is shown with microsecond accuracy.&lt;br /&gt;
&lt;br /&gt;
verbose&lt;br /&gt;
shows the full-structured entry items with all fields.&lt;br /&gt;
&lt;br /&gt;
export&lt;br /&gt;
serializes the journal into a binary (but mostly&lt;br /&gt;
text-based) stream suitable for backups and network&lt;br /&gt;
transfer (see Journal Export Format[1] for more&lt;br /&gt;
information). To import the binary stream back into&lt;br /&gt;
native journald format use systemd-journal-remote(8).&lt;br /&gt;
&lt;br /&gt;
json&lt;br /&gt;
formats entries as JSON objects, separated by newline&lt;br /&gt;
characters (see Journal JSON Format[2] for more&lt;br /&gt;
information). Field values are generally encoded as JSON&lt;br /&gt;
strings, with three exceptions:&lt;br /&gt;
&lt;br /&gt;
1. Fields larger than 4096 bytes are encoded as null&lt;br /&gt;
   values. (This may be turned off by passing --all, but&lt;br /&gt;
   be aware that this may allocate overly long JSON&lt;br /&gt;
   objects.)&lt;br /&gt;
&lt;br /&gt;
2. Journal entries permit non-unique fields within the&lt;br /&gt;
   same log entry. JSON does not allow non-unique fields&lt;br /&gt;
   within objects. Due to this, if a non-unique field is&lt;br /&gt;
   encountered a JSON array is used as field value,&lt;br /&gt;
   listing all field values as elements.&lt;br /&gt;
&lt;br /&gt;
3. Fields containing non-printable or non-UTF8 bytes are&lt;br /&gt;
   encoded as arrays containing the raw bytes&lt;br /&gt;
   individually formatted as unsigned numbers.&lt;br /&gt;
&lt;br /&gt;
Note that this encoding is reversible (with the exception&lt;br /&gt;
of the size limit).&lt;br /&gt;
&lt;br /&gt;
json-pretty&lt;br /&gt;
formats entries as JSON data structures, but formats them&lt;br /&gt;
in multiple lines in order to make them more readable by&lt;br /&gt;
humans.&lt;br /&gt;
&lt;br /&gt;
json-sse&lt;br /&gt;
formats entries as JSON data structures, but wraps them&lt;br /&gt;
in a format suitable for Server-Sent Events[3].&lt;br /&gt;
&lt;br /&gt;
json-seq&lt;br /&gt;
formats entries as JSON data structures, but prefixes&lt;br /&gt;
them with an ASCII Record Separator character (0x1E) and&lt;br /&gt;
suffixes them with an ASCII Line Feed character (0x0A),&lt;br /&gt;
in accordance with JavaScript Object Notation (JSON) Text&lt;br /&gt;
Sequences[4] (&amp;quot;application/json-seq&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
cat&lt;br /&gt;
generates a very terse output, only showing the actual&lt;br /&gt;
message of each journal entry with no metadata, not even&lt;br /&gt;
a timestamp. If combined with the --output-fields= option&lt;br /&gt;
will output the listed fields for each log record,&lt;br /&gt;
instead of the message.&lt;br /&gt;
&lt;br /&gt;
with-unit&lt;br /&gt;
similar to short-full, but prefixes the unit and user&lt;br /&gt;
unit names instead of the traditional syslog identifier.&lt;br /&gt;
Useful when using templated instances, as it will include&lt;br /&gt;
the arguments in the unit names.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour un affichage en json lisible par exemple:&lt;br /&gt;
 journalctl -o json-pretty&lt;br /&gt;
&lt;br /&gt;
== Configuration du journal ==&lt;br /&gt;
Le fichier de configuration du journal se situe dans /etc/systemd/journal. Le service a redémarrer est systemd-journald.&lt;br /&gt;
&lt;br /&gt;
Le manuel est détaillé : &lt;br /&gt;
 man journald.conf&lt;br /&gt;
&lt;br /&gt;
=== Gestion de la persistence ===&lt;br /&gt;
Le journal est nettoyé (en anglais &amp;quot;vacuumed&amp;quot;, soit littéralement &amp;quot;passé l&#039;aspirateur&amp;quot;) régulièrement en fonction de la configuration. Les journaux nettoyés ne sont plus disponibles !&lt;br /&gt;
&lt;br /&gt;
=== Option &amp;quot;Storage&amp;quot; ===&lt;br /&gt;
Dans le fichier de conf du journal, une option important est &amp;quot;Storage&amp;quot;. Celle-ci détermine la persistence et peut prendre les valeurs:&lt;br /&gt;
* volatile : gardé en mémoire seulement, dans /run/log/journal&lt;br /&gt;
* persistent : gardé sur disque, dans /var/log/journal&lt;br /&gt;
* auto : comme persistent, si /var/log/journal existe&lt;br /&gt;
* none : on ne garde rien.&lt;br /&gt;
&lt;br /&gt;
==== Taille maximum ====&lt;br /&gt;
Par défaut, le système ne conserve pas les journaux de façon illimitée : un journal non-volatile aura une taille limite à 10% de son filesystem, dans une limite de 4 Go. On peut confirmer ces valeurs avec:&lt;br /&gt;
 journalctl -b -u systemd-journald&lt;br /&gt;
&lt;br /&gt;
* Cette valeur maximum peut être modifiée dans le fichier de conf:&lt;br /&gt;
 SystemMaxUse=50M&lt;br /&gt;
...ou dans un snippet à part, par exemple dans &lt;br /&gt;
 /etc/systemd/journald.conf.d/00-journal-size.conf&lt;br /&gt;
avec&lt;br /&gt;
 [Journal]&lt;br /&gt;
 SystemMaxUse=50M&lt;br /&gt;
&lt;br /&gt;
* On peut configurer la quantité d&#039;espace qui doit rester dispo après rotation:&lt;br /&gt;
 SystemKeepFree=&lt;br /&gt;
* On peut configurer la taille maximum d&#039;un fichier de journal avec&lt;br /&gt;
 SystemMaxFileSize&lt;br /&gt;
&lt;br /&gt;
==== Rotation des journaux ====&lt;br /&gt;
On peut faire tourner les journaux à la main, par exemple pour effacer tout ce qui a plus de 2 jours:&lt;br /&gt;
 journalctl --vacuum-time=2d&lt;br /&gt;
Ou retenir les 500 derniers Mo de journal:&lt;br /&gt;
 journalctl --vacuum-size=500M&lt;br /&gt;
On peut voir l&#039;espace disque utilisé par le journal:&lt;br /&gt;
 journalctl --disk-usage&lt;br /&gt;
&lt;br /&gt;
==== Namespace ====&lt;br /&gt;
On peut aussi limiter la taille pour une unité, par exemple sshd, avec le système de namespaces. Il faut modifier le fichier d&#039;unit et ajouter:&lt;br /&gt;
 LogNamespace=ssh&lt;br /&gt;
dans la section [Service]. Ensuite, on créée /etc/systemd/journald@ssh.conf en copiant /etc/systemd/journald.conf; puis on l&#039;édite et on lui donne un SystemMaxUse. Après ça, il suffit de redémarrer le service (sshd en l&#039;occurence).&lt;br /&gt;
&lt;br /&gt;
On peut voir le journal d&#039;un namespace de la façon suivante:&lt;br /&gt;
 journalctl --namespace ssh&lt;br /&gt;
&lt;br /&gt;
=== Un exemple de configuration pour de la production ===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#/etc/systemd/journald.conf&lt;br /&gt;
[Journal]&lt;br /&gt;
Compress=yes &lt;br /&gt;
ForwardToConsole=no &lt;br /&gt;
ForwardToSyslog=no&lt;br /&gt;
MaxRetentionSec=1year &lt;br /&gt;
RateLimitBurst=10000 &lt;br /&gt;
RateLimitIntervalSec=30s&lt;br /&gt;
Storage=persistent &lt;br /&gt;
SyncIntervalSec=1s &lt;br /&gt;
SystemMaxUse=8g &lt;br /&gt;
SystemKeepFree=20% &lt;br /&gt;
SystemMaxFileSize=10M&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Compress : les logs sont compressés avant d&#039;être stockés.&lt;br /&gt;
* ForwardtoConsole, ForwardtoSyslog : ici, on ne forwarde pas les messages (ni à une console, ni à un syslog). On les garde !&lt;br /&gt;
* MaxRetentionSec : Ici, on garde un an maximum de journaux. Le mot &amp;quot;Sec&amp;quot; est un peu malvenu, parce qu&#039;on peut donner des valeurs en : &amp;quot;year&amp;quot;, &amp;quot;month&amp;quot;, &amp;quot;week&amp;quot;, &amp;quot;day&amp;quot;, &amp;quot;h&amp;quot;, &amp;quot; m&amp;quot;.&lt;br /&gt;
* RateLimitBurst et IntervalSec (valeurs par défaut ici) : si le log reçoit plus de 10000 messages en 30 secondes, il les droppe.&lt;br /&gt;
* Storage=Persistent : on garde les journaux sur le disque. &lt;br /&gt;
* SyncIntervalSec: Le journal attend la durée donnée avant de synchroniser son journal sur disque pour les entrées de message dont le niveau d&#039;alerte est de ERR ou moins. Les autre sont synchronisées immédiatement.&lt;br /&gt;
* SystemMaxUse : À 8 Go, les journaux sont effacés.&lt;br /&gt;
* SystemKeepFree : Si le FS a moins de 20% de libre, le journal fera de la place.&lt;br /&gt;
* SystemMaxFileSize : taille maximum d&#039;un journal individuel.&lt;br /&gt;
&lt;br /&gt;
== Forward vers un serveur syslog ==&lt;br /&gt;
Il est possible de forwarder le journal vers un daemon syslog. Il suffit de le configurer avec l&#039;option:&lt;br /&gt;
 ForwardToSyslog=yes&lt;br /&gt;
&lt;br /&gt;
En configurant le syslog, il est alors possible de renvoyer les messages sur un serveur de syslog. Cela peut être intéressant de garder cette conf en conjonction avec Storage=none, par exemple, pour externaliser tous les logs.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Logrotate&amp;diff=2557</id>
		<title>Logrotate</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Logrotate&amp;diff=2557"/>
		<updated>2025-03-05T15:24:03Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
= Utilité =&lt;br /&gt;
Logrotate sert à faire tourner les fichiers de logs sous Linux, en les compressant et / ou en les effaçant.&lt;br /&gt;
&lt;br /&gt;
J&#039;en parle déjà [[Analyse_de_logs#Logrotate|Ici]]&lt;br /&gt;
&lt;br /&gt;
= Créer un script de logrotate =&lt;br /&gt;
https://www.thegeekstuff.com/2010/07/logrotate-examples/&lt;br /&gt;
&lt;br /&gt;
D&#039;abord, l&#039;emplacement des différents élements:&lt;br /&gt;
 * /usr/bin/logrotate: La commande en elle même&lt;br /&gt;
 * /etc/cron.daily/logrotate : Le script shell qui execute logrotate tous les jours&lt;br /&gt;
 * /etc/logrotate.conf : La configuration de rotation des logs est spécifiée ici&lt;br /&gt;
 * /etc/logrotate.d : Les paquets installés sur le systèmes lâchent leur configuration logrotate ici.&lt;br /&gt;
&lt;br /&gt;
== Lancer la commande logrotate à la main ==&lt;br /&gt;
&lt;br /&gt;
 logrotate -s /var/log/logstatus logrotate.conf&lt;br /&gt;
 # -s : on écrit le statut de la rotation dans logstatus&lt;br /&gt;
&lt;br /&gt;
== Exemples ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/tmp/output.log {&lt;br /&gt;
        size 1k #On rotate au dela de 1ko&lt;br /&gt;
        monthly  #On rotate tous les mois (marche avec weekly, daily...)&lt;br /&gt;
        create 700 justine admins #Nouveau fichier créé avec autorisation 700, user justine, groupe admins&lt;br /&gt;
        rotate 4 #Combien de fichiers ayant déjà tourné on garde&lt;br /&gt;
        copytruncate #Pas compris... Aide le programme à loguer au bon endroit&lt;br /&gt;
        compress #Compresser les archives&lt;br /&gt;
        dateext #Mettre la date dans le nom des archives&lt;br /&gt;
        postrotate #Faire des choses après la compression&lt;br /&gt;
             /home/justine/script.sh&lt;br /&gt;
        maxage 100 #Toutes les archives + de 100 jours sont supprimées&lt;br /&gt;
        missingok #Pas de message d&#039;erreur si le fichier n&#039;existe pas&lt;br /&gt;
        compresscmd /bin/bzip2 #On précise la commande de compression...&lt;br /&gt;
        compressext #...et l&#039;extension&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un exemple fonctionnel (les commentaires ne sont pas acceptés)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/var/log/blogpull.log {&lt;br /&gt;
        size 1k &lt;br /&gt;
        weekly &lt;br /&gt;
        create 644 root root&lt;br /&gt;
        rotate 10&lt;br /&gt;
        copytruncate &lt;br /&gt;
        compress&lt;br /&gt;
        dateext&lt;br /&gt;
        maxage 100&lt;br /&gt;
        missingok&lt;br /&gt;
        compresscmd /bin/bzip2&lt;br /&gt;
        compressext .bz2&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tester mon fichier de conf ==&lt;br /&gt;
 logrotate -f /mon/fichier/de/conf&lt;br /&gt;
&lt;br /&gt;
= Compression multithread avec pigz =&lt;br /&gt;
* [https://www.makethenmakeinstall.com/2015/04/logrotate-with-alternate-compression-tool-such-as-pigz/ Source]&lt;br /&gt;
* [https://manpages.debian.org/bookworm/pigz/pigz.1.en.html Manuel]&lt;br /&gt;
&lt;br /&gt;
Par défaut, logrotate utilise gzip pour la compression des logs. Cet utilitaire suffit la plupart du temps, mais il a le défaut d&#039;être monothread. Il n&#039;est pas très efficace dans le cas de fichiers volumineux.&lt;br /&gt;
&lt;br /&gt;
On peut vouloir une alternative multi-thread si on de gros fichiers de logs, comme c&#039;est mon cas par exemple avec mon serveur syslog. On peut alors utiliser pigz, qui est une variante multi-threadée de gzip. &lt;br /&gt;
&lt;br /&gt;
Une version de logrotate supérieure ou égale à 3.8.1-5 est nécessaire pour gérer correctement les arguments dans compressoptions.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/data/syslog/*/*.log {&lt;br /&gt;
&lt;br /&gt;
# Fréquence de rotation par défaut :&lt;br /&gt;
    daily&lt;br /&gt;
&lt;br /&gt;
# Si l&#039;un des journaux décrit est manquant, aucune erreur n&#039;est remontée.&lt;br /&gt;
    missingok&lt;br /&gt;
&lt;br /&gt;
# Les logs sont compressés après rotation avec pigz sur 4 threads (-p4) :&lt;br /&gt;
    compress&lt;br /&gt;
    compresscmd /usr/bin/pigz&lt;br /&gt;
    compressoptions -p5&lt;br /&gt;
&lt;br /&gt;
# Compression le jour suivant&lt;br /&gt;
    delaycompress&lt;br /&gt;
&lt;br /&gt;
# Insertion de la date dans l&#039;archivage des journaux.&lt;br /&gt;
    dateext&lt;br /&gt;
&lt;br /&gt;
# Prise en compte de la date de la veille pour plus de cohérence&lt;br /&gt;
    dateyesterday&lt;br /&gt;
&lt;br /&gt;
# Conservation de l&#039;extension .log après rotation &amp;quot;-YYYYMMDD.log.gz&amp;quot;&lt;br /&gt;
    extension .log&lt;br /&gt;
&lt;br /&gt;
# Une rotation par jour est effectuée&lt;br /&gt;
    rotate 366&lt;br /&gt;
&lt;br /&gt;
# Si une archive est agée de plus de 366 jours, elle est détruite :&lt;br /&gt;
    maxage 366&lt;br /&gt;
&lt;br /&gt;
# Lors d&#039;une rotation, un fichier de remplacement est créé avec les droits 0640 appartenant à root et au groupe root.&lt;br /&gt;
    create 640 root root&lt;br /&gt;
&lt;br /&gt;
# Indique au service rsyslog qu&#039;une rotation des logs a été faite&lt;br /&gt;
    postrotate&lt;br /&gt;
          invoke-rc.d rsyslog rotate &amp;gt; /dev/null&lt;br /&gt;
    endscript&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2556</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2556"/>
		<updated>2024-08-23T15:41:40Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Rust */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Disclaimer ==&lt;br /&gt;
Ceci est mon wiki personnel, rédigé au cours de mes études et de ma carrière; je n&#039;ai pas la prétention que tout y soit exact.&lt;br /&gt;
Toutes les pages utiles sont en lien sur la présente page de sommaire. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes personnelles, que je ne mettrait à jour que si j&#039;en ressens le besoin. Il peut parfois s&#039;agir de traduction d&#039;articles existants, si c&#039;est le cas, le lien original est en général au sommet de la page.&lt;br /&gt;
&lt;br /&gt;
[[Logo du site]]&lt;br /&gt;
&lt;br /&gt;
Justine&lt;br /&gt;
&lt;br /&gt;
==Autres / Aide==&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Help:Formatting/fr Aide au formatage]&lt;br /&gt;
*[https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf Aide au langage markdown (pour Git)]&lt;br /&gt;
*[[Portfolio - Notes en vrac]]&lt;br /&gt;
*[[ITIL]]&lt;br /&gt;
*[[Vocabulaire &amp;amp; notions diverses]]&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Extension:SyntaxHighlight L&#039;extension SyntaxHighlight]&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheets==&lt;br /&gt;
* [[Idées diverses de gain de temps]]&lt;br /&gt;
* [[Raccourcis shell bash]]&lt;br /&gt;
* [[Raccourcis Vim]]&lt;br /&gt;
* [[Cs: Ansible]]&lt;br /&gt;
* [[CS : FirewallD]]&lt;br /&gt;
* [[Cs : Vim]]&lt;br /&gt;
* [[Cs:_Tips_Linux]]&lt;br /&gt;
* [[Cs: Git]]&lt;br /&gt;
* [[Cs: Pacman]]&lt;br /&gt;
* [[CS : lsof]]&lt;br /&gt;
* [[CS : SecuriteLinux]]&lt;br /&gt;
* [[Mémo_Apache|Mémo Apache]] &lt;br /&gt;
* [[Memo_nginx|Memo nginx]]   &lt;br /&gt;
* [[Mémo_Openssl|Mémo Openssl]]&lt;br /&gt;
&lt;br /&gt;
==Ansible== &lt;br /&gt;
* [[Ansible|Ansible]] &lt;br /&gt;
** [[Ansible : remplacement récursif de texte]]&lt;br /&gt;
** [[Ansible : Filtres]]&lt;br /&gt;
** [[Ansible : playbook avancé, avec handlers et templates]]&lt;br /&gt;
** [[Ansible : Quirks]]&lt;br /&gt;
** [[Ansible et Windows]]&lt;br /&gt;
** [[Ansible : awx-cli]]&lt;br /&gt;
** [[Ansible : Collections]]&lt;br /&gt;
** [[Ansible : sous-commandes]]&lt;br /&gt;
** [[Ansible : VMWare]]&lt;br /&gt;
&lt;br /&gt;
==Conteneurs== &lt;br /&gt;
[[Fichier:Moby-logo-small.png|90px]]  [[Fichier:K8s-small.png|90px]]&lt;br /&gt;
* [[Docker|Docker]] &lt;br /&gt;
* [[Docker-compose]]&lt;br /&gt;
* [[Traefik]]&lt;br /&gt;
* [[Docker swarm]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[LXD]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;/span&amp;gt;Systèmes&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt; &#039;&#039;&#039;[[File:869px-Tux.svg.png|40x49px|869px-Tux.svg.png]]&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
* [[Additions_Invité_sur_Linux|Additions Invité sur Linux]] &lt;br /&gt;
* [[Analyse de logs]]&lt;br /&gt;
** [[Rsyslog]]&lt;br /&gt;
** [[YAML]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
* [[Apache Tomcat]]&lt;br /&gt;
* [[Appels Système (syscall)]]&lt;br /&gt;
* [[APT]]&lt;br /&gt;
* [[Architecture système]]&lt;br /&gt;
* [[Asterisk|Asterisk]] &lt;br /&gt;
* [[Authentification - PAM]] &lt;br /&gt;
* [[Autostart]]&lt;br /&gt;
* [[Awk]]&lt;br /&gt;
* [[Bases_de_données|Bases de données]] &lt;br /&gt;
* [[Bind9]]&lt;br /&gt;
* [[Ceph]]&lt;br /&gt;
* [[Certbot]]&lt;br /&gt;
* [[Cgroups]]&lt;br /&gt;
* [[CheckMK]]&lt;br /&gt;
* [[Chronyd]]&lt;br /&gt;
* [[Cloud Computing]]&lt;br /&gt;
* [[Commandes analyse maillog]]&lt;br /&gt;
* [[Commandes de test de charge]]&lt;br /&gt;
* [[Commandes_Linux|Commandes Linux]] &lt;br /&gt;
* [[Convertir des .deb en .rpm avec alien]]&lt;br /&gt;
* [[Cryptographie|Cryptographie]] &lt;br /&gt;
** [[Protocole ACME]]&lt;br /&gt;
* [[Droits|Droits]] &lt;br /&gt;
* [[Environnement utilisateur]]&lt;br /&gt;
* [[Filesystems|Filesystems]] &lt;br /&gt;
** [[Surveillance de disques]]&lt;br /&gt;
* [[Firefox]]&lt;br /&gt;
* [[Fstab]]&lt;br /&gt;
* [[Gestion_de_paquets|Gestion de paquets]] &lt;br /&gt;
** [[Unattended-upgrades]]&lt;br /&gt;
* [[Grafana et prometheus]]&lt;br /&gt;
* [[Groupwares|Groupwares]] &lt;br /&gt;
* [[HAProxy]]&lt;br /&gt;
* [[Informations Système sous Linux]]&lt;br /&gt;
* [[Juju]]&lt;br /&gt;
* [[KeepaliveD]]&lt;br /&gt;
* [[Kernel Tuning]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[Kubernetes (obsolete)]]&lt;br /&gt;
* [[LAMP|LAMP]]&lt;br /&gt;
* [[LDAP]] &lt;br /&gt;
* [[Linux|Linux / Systèmes]] &lt;br /&gt;
* [[Linux : Permissions]]&lt;br /&gt;
* [[Attributs_Linux_étendus|Attributs Linux étendus]] &lt;br /&gt;
* [[Linux : Mémoire, RAM, swap]]&lt;br /&gt;
* [[Linux : Gestion de la résolution]]&lt;br /&gt;
* [[Logrotate]]&lt;br /&gt;
* [[Make]]&lt;br /&gt;
* [[Messagerie : Risques]]&lt;br /&gt;
* [[OAuth]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Pile son]]&lt;br /&gt;
* [[Postfix]]&lt;br /&gt;
* [[Processus et Appels Système]]&lt;br /&gt;
* [[Proxmox|Proxmox]] &lt;br /&gt;
* [[Raccourcis_shell_bash|Raccourcis shell bash]] &lt;br /&gt;
* [[Raccourcis_Vim|Raccourcis Vim]] &lt;br /&gt;
* [[Red Hat : Satellite 6]]&lt;br /&gt;
* [[Reverse Proxy Nginx]]&lt;br /&gt;
* [[Rsync,_SFTP,_RoboCopy|Rsync, SFTP, RoboCopy]] &lt;br /&gt;
* [[Screen]]&lt;br /&gt;
* [[Sed]]&lt;br /&gt;
* [[Sendmail]]&lt;br /&gt;
* [[Sshfs]]&lt;br /&gt;
* [[Sockets]]&lt;br /&gt;
* [[Steam cmd]]&lt;br /&gt;
* [[Stockage|Stockage]] &lt;br /&gt;
** [[LVM : opérations courantes]]&lt;br /&gt;
** [[Iscsiadm]]&lt;br /&gt;
** [[IscsiAdm + Multipath]]&lt;br /&gt;
* [[Structure de dossiers Linux]]&lt;br /&gt;
* [[Supervision]]&lt;br /&gt;
* [[Systemd]]&lt;br /&gt;
** [[Timesyncd]]&lt;br /&gt;
* [[Utilisateurs|Utilisateurs]] &lt;br /&gt;
* [[Varnish]]&lt;br /&gt;
* [[VMWare|VMWare]] &lt;br /&gt;
** [[VMWare : Utilisation de PowerCLI]]&lt;br /&gt;
** [[VMWare : Autres notions]]&lt;br /&gt;
&lt;br /&gt;
=== Spécificités Windows [[Fichier:Winlogo.png|50px]] === &lt;br /&gt;
&lt;br /&gt;
* [[Services_Windows|Services Windows]] &lt;br /&gt;
** [[Active_Directory|Active Directory]]&lt;br /&gt;
** [[WSUS_et_Core|WSUS et Core]] &lt;br /&gt;
** [[PowerShell|PowerShell]] &lt;br /&gt;
** [[GPO|GPO]] &lt;br /&gt;
** [[Exchange|Exchange]] &lt;br /&gt;
** [[Exchange pour de vrai]]&lt;br /&gt;
** [[Windows : Outils à connaître]]&lt;br /&gt;
** [[Powershell : Active Directory]]&lt;br /&gt;
** [[AD : intégration Linux]]&lt;br /&gt;
* [[Création de tâches planifiée]]&lt;br /&gt;
* [[Gestion d&#039;accès chez Microsoft]]&lt;br /&gt;
* [[Smbclient]]&lt;br /&gt;
* [[Commandes CMD utiles]]&lt;br /&gt;
&lt;br /&gt;
== Réseaux  [[File:Computer-networking.jpg|middle|77x60px|Computer-networking.jpg]] ==&lt;br /&gt;
&lt;br /&gt;
*[[DHCPv4|DHCPv4]] &lt;br /&gt;
*[[DHCPv6|DHCPv6]] &lt;br /&gt;
*[[DNS|DNS]] &lt;br /&gt;
*[[Ethernet|Ethernet]] &lt;br /&gt;
**[[FireWall_:_CheckPoint|FireWall : CheckPoint]]   &lt;br /&gt;
*[[Firewall|Firewall]] &lt;br /&gt;
**[[Firewall_:_Juniper|Firewall : Juniper]] &lt;br /&gt;
**[[FireWall : CheckPoint]]&lt;br /&gt;
**[[Firewalld]]&lt;br /&gt;
**[[IPTables]]&lt;br /&gt;
**[[Nftables]]&lt;br /&gt;
*[[Gestion_de_parc|Gestion de parc]] &lt;br /&gt;
*[[GlobalProtect sur linux]]&lt;br /&gt;
*[[ICMPv4|ICMPv4]] &lt;br /&gt;
*[[IPv4|IPv4]] &lt;br /&gt;
*[[IPv6|IPv6]] &lt;br /&gt;
* [[Knot DNS]]&lt;br /&gt;
*[[Liste_des_ports|Liste des ports]] &lt;br /&gt;
*[[Modèle_OSI_et_TCP/IP|Modèle OSI et TCP/IP]] &lt;br /&gt;
*[[NAT/PAT|NAT/PAT]] &lt;br /&gt;
*[[NetCat|NetCat]] &lt;br /&gt;
*[[Nmap]]&lt;br /&gt;
*[[Protocoles|Protocoles]] &lt;br /&gt;
*[[Proxy|Proxy]] &lt;br /&gt;
*[[Reseau|Reseau]] &lt;br /&gt;
*[[SNMP|SNMP]] &lt;br /&gt;
*[[SSH|SSH]] &lt;br /&gt;
*[[SSO|SSO]] &lt;br /&gt;
*[[TCP_&amp;amp;_UDP|TCP &amp;amp; UDP]] &lt;br /&gt;
*[[Tor]]&lt;br /&gt;
*[[VLAN|VLAN]] &lt;br /&gt;
*[[VPN|VPN]]&lt;br /&gt;
* [[Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Cisco NetAcad [[File:1200px-Cisco logo blue 2016.svg.png|middle|75x50px|1200px-Cisco logo blue 2016.svg.png]] ===&lt;br /&gt;
&lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_1|Cisco : R&amp;amp;S 1]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_2|Cisco : R&amp;amp;S 2]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_3|Cisco : R&amp;amp;S 3]]&lt;br /&gt;
&lt;br /&gt;
== Web ==&lt;br /&gt;
*[[CGI]]&lt;br /&gt;
*[[Websockets]]&lt;br /&gt;
&lt;br /&gt;
== Cybersécurité [[File:Padlock.png|Padlock.png|77x60px]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Cybersécurité|Cybersécurité : notions de base]] &lt;br /&gt;
*[[Cybersécurité_:_keepass|Cybersécurité : keepass]] &lt;br /&gt;
*[[Metasploit|Metasploit]] &lt;br /&gt;
*[[Cybersécurité_(Kali)_:_Crack_de_mots_de_passe_avec_Hydra|Cybersécurité (Kali) : Crack de mots de passe avec Hydra]] &lt;br /&gt;
*[[Cybersécurité_:_Documentation|Cybersécurité : Documentation]] &lt;br /&gt;
*[[Cybersécurité_:_Lynis|Cybersécurité : Lynis]] &lt;br /&gt;
*[[Cybersécurité_:_Graylog|Cybersécurité : Graylog]] &lt;br /&gt;
*[[Cybersécurité_:_Liens|Cybersécurité : Liens]]&lt;br /&gt;
*[[Messagerie : Risques]] &lt;br /&gt;
*[[Outils Divers]]&lt;br /&gt;
*[[Tests de charge]]&lt;br /&gt;
*[[Honeypot]]&lt;br /&gt;
* [[Shodan]]&lt;br /&gt;
* [https://github.com/certsocietegenerale/IRM/tree/master/EN Des méthodes simples d&#039;analyse]&lt;br /&gt;
* [[Ffuf : Fuzz Faster U Fool]]&lt;br /&gt;
* [[PGP - GPG]]&lt;br /&gt;
&lt;br /&gt;
=== HackTheBox Academy ===&lt;br /&gt;
Mes notes concernant mon suivi de modules sur HTB Academy - elles sont possiblement en anglais.&lt;br /&gt;
* [[HTBA : Active Directory Intro]]&lt;br /&gt;
&lt;br /&gt;
== Gestion de projet [[File:Gdpimage.png|middle|96x64px|Gdpimage.png]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Gestion_de_projet|Gestion de projet]] &lt;br /&gt;
*[[Outils_et_Méthodologie_de_Résolution_de_Problèmes_(MRP)|Outils et Méthodologie de Résolution de Problèmes (MRP)]] &lt;br /&gt;
*[[GDP_Agile_avec_SCRUM|GDP Agile avec SCRUM]]&lt;br /&gt;
&lt;br /&gt;
== Scripting / Programmation [[File:Python-7be70baaac.png|middle|69x69px|Python-7be70baaac.png]][[File:Bashlogo.png|middle|74x74px|Bashlogo.png]] ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
**[[Python : APIs]]&lt;br /&gt;
**[[Python : argparse]]&lt;br /&gt;
**[[Python : Black]]&lt;br /&gt;
**[[Python : coloration de texte]]&lt;br /&gt;
**[[Python_:_Context_Manager|Python : Context Manager]] &lt;br /&gt;
**[[Python : Dataclasses]]&lt;br /&gt;
**[[Python : datetimes]]&lt;br /&gt;
**[[Python : dictionnaires]]&lt;br /&gt;
**[[Python : Ensembles]]&lt;br /&gt;
**[[Python : Fichiers de config]]&lt;br /&gt;
**[[Python : Flask]]&lt;br /&gt;
***[[Python : Flask et SocketIO]]&lt;br /&gt;
**[[Python_:_Fonctions|Python : Fonctions]] &lt;br /&gt;
**[[Python : Fonctions de l&#039;interpréteur]]&lt;br /&gt;
**[[Python_:_Les_fichiers|Python : Les fichiers]]  &lt;br /&gt;
**[[Python : fstrings]] &lt;br /&gt;
**[[Python : Interactions avec Windows]]&lt;br /&gt;
**[[Python_:_Listes|Python : Listes]] &lt;br /&gt;
** [[Python : Locust (Tests de charge)]]&lt;br /&gt;
**[[Python_:_Méthodes_de_chaines|Python : Méthodes de chaines]] &lt;br /&gt;
**[[Python_:_misc|Python : misc]] &lt;br /&gt;
**[[Python : Opérateurs]]&lt;br /&gt;
**[[Python : Opérateur Binaires]]&lt;br /&gt;
**[[Python : os.walk()]]&lt;br /&gt;
**[[Python_-_PEP8|Python - PEP8]] &lt;br /&gt;
**[[Python : Pipenv]]&lt;br /&gt;
**[[Python : Pygame]]&lt;br /&gt;
**[[Python : PySimpleGUI]]&lt;br /&gt;
**[[Python_:_Programmation_Asynchrone|Python : Programmation Asynchrone]] &lt;br /&gt;
**[[Python_:_Programmation_système|Python : Programmation système]] &lt;br /&gt;
**[[Python_:_Réseau|Python : Réseau]] &lt;br /&gt;
**[[Python : simuler des inputs]]&lt;br /&gt;
**[[Python_:_Tkinter|Python : Tkinter]] &lt;br /&gt;
**[[Python : Virtualenv]]&lt;br /&gt;
**[[Python_:_Vocabulaire|Python : Vocabulaire]] &lt;br /&gt;
**[[Python_:_with_et_les_gestionnaires_de_contexte|Python : with et les gestionnaires de contexte]]&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
Voici quelques références externes parmi les plus utiles :&lt;br /&gt;
* [https://doc.rust-lang.org/book/ The Rust Book] pour apprendre le langage.&lt;br /&gt;
* [https://doc.rust-lang.org/stable/rust-by-example/ Rust by example] avec une approche plus lisible. Plus utile que le Rust book a reprendre par la suite.&lt;br /&gt;
* [https://learnxinyminutes.com/docs/rust/ LearnXinY] qui est toujours une source formidable en cas de trous de mémoire.&lt;br /&gt;
&lt;br /&gt;
* Des notes diverses sur le langage, notamment des crates qui peuvent servir : [[Rust : divers]]&lt;br /&gt;
* [[Rust : Tokio]]&lt;br /&gt;
&lt;br /&gt;
Mes notes issues du du rust book dans l&#039;ordre&lt;br /&gt;
* [[Rust : Structs]]&lt;br /&gt;
* [[Rust: enums]]&lt;br /&gt;
* [[Rust : match]]&lt;br /&gt;
* [[Rust : if let]]&lt;br /&gt;
* [[Rust : packages]]&lt;br /&gt;
* [[Rust : Common collections]]&lt;br /&gt;
* [[Rust : Error handling]]&lt;br /&gt;
* [[Rust : génériques, traits, lifetimes]]&lt;br /&gt;
* [[Rust : tests automatisés]]&lt;br /&gt;
* [[Rust : iterateurs]]&lt;br /&gt;
(Le reste sur mon gitea).&lt;br /&gt;
&lt;br /&gt;
Autres notes:&lt;br /&gt;
* [[Rust : Debug avec GDB]]&lt;br /&gt;
* [[Rust : serde]]&lt;br /&gt;
* [[Rust : Display implementation and Rc + RefCell use demo]]&lt;br /&gt;
* [[Rust : async]]&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
**[[Bash|Bash : Anciennes notes]] &lt;br /&gt;
**[[Bash_:_Codes_de_retour|Bash : Codes de retour]] &lt;br /&gt;
**[[Bash_:_Fonctions|Bash : Fonctions]] &lt;br /&gt;
**[[Bash_:_généralités|Bash : généralités]] &lt;br /&gt;
**[[Bash_:_Paramètres_de_position|Bash : Paramètres de position]] &lt;br /&gt;
**[[Bash_:_Pattern_Matching|Bash : Pattern Matching]]  &lt;br /&gt;
**[[Bash_:_Tableaux|Bash : Tableaux]] &lt;br /&gt;
**[[Bash_:_Traitement_sur_les_chaînes|Bash : Traitement sur les chaînes]] &lt;br /&gt;
**[[Zsh]]&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
**[[PowerShell|PowerShell]] &lt;br /&gt;
**[[PowerShell_:_Scripting|PowerShell : Scripting]] &lt;br /&gt;
**[[PowerShell_:_scripts_complets|PowerShell : scripts complets]] &lt;br /&gt;
**[[PowerShell_:_Exporter_une_boîte_en_pst|PowerShell : Exporter une boîte en pst]]   &lt;br /&gt;
&lt;br /&gt;
=== Généralités ===&lt;br /&gt;
**[[Expressions_Régulières|Expressions Régulières]]&lt;br /&gt;
**[[RPC / REST]]&lt;br /&gt;
&lt;br /&gt;
=== Assembleur ===&lt;br /&gt;
* [[Assembleur|Assembleur (généralités)]]&lt;br /&gt;
* [[Assembleur : boot sector]]&lt;br /&gt;
&lt;br /&gt;
=== Langage C ===&lt;br /&gt;
** [[C : bases]]&lt;br /&gt;
**[[Langage C]]&lt;br /&gt;
&lt;br /&gt;
=== Golang ===&lt;br /&gt;
**[[Golang : bases]]&lt;br /&gt;
&lt;br /&gt;
== Hors-Sujet ==&lt;br /&gt;
&lt;br /&gt;
*[[Coaching_:_CV|Coaching : CV]]&lt;br /&gt;
*[[Droit|Droit]] &lt;br /&gt;
*[[Management|Management]] &lt;br /&gt;
*[[Ondes_radio|Ondes radio]]&lt;br /&gt;
*[[Vérités et contre-vérités]]&lt;br /&gt;
*[[Questions Sysadmin]]&lt;br /&gt;
*[[Comprendre comment fonctionne son organisation]]&lt;br /&gt;
&lt;br /&gt;
=== Musique ===&lt;br /&gt;
*[[Musique modale, musique tonale]]&lt;br /&gt;
*[[Gamme pentatonique]]&lt;br /&gt;
&lt;br /&gt;
== Jouer sur Linux ==&lt;br /&gt;
* [[Steam]]&lt;br /&gt;
* [[Optimus]]&lt;br /&gt;
&lt;br /&gt;
== Notes Personnelles ==&lt;br /&gt;
&lt;br /&gt;
Cette section contient des notes plus personnelles et moins rédigées, laissées là pour référence future.&lt;br /&gt;
&lt;br /&gt;
*[[Secure boot &amp;amp; pilotes nVIdia]]&lt;br /&gt;
*[[Dual boot et ennuis divers...]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;C’est pour ça : j’lis jamais rien. C’est un vrai piège à cons c’t’histoire-là. En plus j’sais pas lire.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2555</id>
		<title>Rust : Tokio</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2555"/>
		<updated>2024-08-22T14:34:58Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= A propos de cette page =&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du tuto d&#039;utilisation de l&#039;environnement Tokio : [https://tokio.rs/tokio/tutorial ici]&lt;br /&gt;
&lt;br /&gt;
= Présentation =&lt;br /&gt;
&lt;br /&gt;
Tokio est un runtime asynchrone pour Rust, et fournit les outils pour créer des applications asynchrone utilisant le réseau. Les composants principaux sont:&lt;br /&gt;
&lt;br /&gt;
* Un runtime multi-process pour l&#039;exécution de code asynchrone&lt;br /&gt;
* Une version asynchrone de la librairie standard&lt;br /&gt;
* Un grand ecosystème de librairies associées.&lt;br /&gt;
&lt;br /&gt;
Son rôle est avant tout d&#039;accélerer les applications dans le cas où elles sont dépendante d&#039;IO réseau en grande quantité, et pas dépendantes du CPU. Il n&#039;est pas non plus intéressant pour accéder à un grand nombre de fichiers simultanément car les OS n&#039;ont généralement pas d&#039;API asynchrone pour les filesystems.&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
Le but du tutoriel est de montrer comment implémenter un client et un serveur Redis, avec un petit ensemble de commandes Redis. Ce projet s&#039;appelle Mini-Redis et est [https://github.com/tokio-rs/mini-redis sur Github].&lt;br /&gt;
&lt;br /&gt;
Avec une version récente de Rust, on commence par le serveur mini-redis, qui nous permettra de tester notre client.&lt;br /&gt;
 cargo install mini-redis&lt;br /&gt;
 //Lancer le serveur&lt;br /&gt;
 mini-redis-server&lt;br /&gt;
 //Depuis un autre terminal&lt;br /&gt;
 mini-redis-cli get foo&lt;br /&gt;
 //Doit renvoyer (nil)&lt;br /&gt;
&lt;br /&gt;
= Hello Tokio =&lt;br /&gt;
&lt;br /&gt;
On commence par créer une application très simple, qui va se connecter au serveur mini-redis et passer la clef &amp;quot;hello&amp;quot; à &amp;quot;world&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 cargo new my-redis&lt;br /&gt;
 cd my-redis&lt;br /&gt;
 //Cargo.toml&lt;br /&gt;
 tokio = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;full&amp;quot;] }&lt;br /&gt;
 mini-redis = &amp;quot;0.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis dans le main.rs&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use mini_redis::{client, Result};&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() -&amp;gt; Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Open a connection to the mini-redis address.&lt;br /&gt;
    let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    // Set the key &amp;quot;hello&amp;quot; with value &amp;quot;world&amp;quot;&lt;br /&gt;
    client.set(&amp;quot;hello&amp;quot;, &amp;quot;world&amp;quot;.into()).await?;&lt;br /&gt;
&lt;br /&gt;
    // Get key &amp;quot;hello&amp;quot;&lt;br /&gt;
    let result = client.get(&amp;quot;hello&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;got value from the server; result={:?}&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En faisant un cargo run avec le serveur mini-redis fonctionnel dans un autre terminal, on a bien le résultat attendu.&lt;br /&gt;
&lt;br /&gt;
En détail :&lt;br /&gt;
 let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
Fonction fournie par mini-redis qui donne un handle sur un client tcp. L&#039;opération est asynchrone, mais le code ressemble à du code synchrone; on sait qu&#039;il est asynchrone grace à &amp;quot;await&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Programmation asynchrone ? ==&lt;br /&gt;
La plupart du temps, les programmes exécutés dans l&#039;ordre dans lequel ils sont écrits. Si une tâche prend du temps, le thread est bloqué le temps que ça termine, ce qui peut être le cas pour une connexion TCP via laquelle un échange de données a lieu. &lt;br /&gt;
&lt;br /&gt;
Avec la programmation asynchrone, les opération qui ne peuvent pas se terminer immédiatement vont en arrière plan. Le thread n&#039;est pas bloqué et peut faire d&#039;autres choses en attendant. Quand la tâche en arrière plan se termine, elle n&#039;est plus suspendue et peut continuer. La programmation asynchrone peut permettre d&#039;avoir des applications plus rapides, mais aussi bien plus compliquées. Elles forcent à gérer l&#039;état des différentes tâches du programme.&lt;br /&gt;
&lt;br /&gt;
== Compile-time green threading (j&#039;ai pas envie de traduire) ==&lt;br /&gt;
Rust implémente l&#039;asynchrone avec les mots async et await. Les fonctions qui font de l&#039;asynchrone sont marquées avec async:&lt;br /&gt;
 pub async fn connect&amp;lt;T: ToSocketAddrs&amp;gt;(addr: T) -&amp;gt; Result&amp;lt;Client&amp;gt; //etc&lt;br /&gt;
Les fonctions en &amp;quot;async fn&amp;quot; sont traduites par Rust lors de la compilation vers des routines asynchrones. N&#039;importe quel appel à .await dans la fonction asynchrone renvoie le contrôle des opérations au thread, afin qu&#039;il puisse faire autre chose pendant que les opérations se terminent en fond.&lt;br /&gt;
&lt;br /&gt;
== Utiliser async / await ==&lt;br /&gt;
Les fonctions asynchrones sont appellées comme n&#039;importe quelle autre fonction, mais ne renvoient pas une valeur représentant le résultat de leurs opérations. Elles renvoient une valeur qui représente l&#039;opération. Il faut utiliser .await sur cette valeur afin d&#039;obtenir le résultat. &lt;br /&gt;
Exemple: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
async fn say_world() {&lt;br /&gt;
    println!(&amp;quot;world&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    // Calling `say_world()` does not execute the body of `say_world()`.&lt;br /&gt;
    let op = say_world();&lt;br /&gt;
&lt;br /&gt;
    // This println! comes first&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Calling `.await` on `op` starts executing `say_world`.&lt;br /&gt;
    op.await;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie &lt;br /&gt;
 hello&lt;br /&gt;
 world&lt;br /&gt;
&lt;br /&gt;
La valeur de retour d&#039;une &amp;quot;async fn&amp;quot; est un type anonyme qui implément le trait &amp;quot;Future&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Fonction main asynchrone ==&lt;br /&gt;
La fonction main utilisée ici est différente de ce qu&#039;on trouve habituellement : elle est asynchrone et annotée avec &amp;quot;#[tokio::main]&amp;quot;. Une fonction async est nécessaire car on veut entrer dans un environnement asynchrone. Cependant, elle doit être exécutée par un runtime, qui contient le task scheduler, les I/O, les timers, etc. C&#039;est le rôle de la macro #[tokio::main].&lt;br /&gt;
&lt;br /&gt;
Cette macro sert à transformer notre &#039;async fn main&#039; en une &#039;fn main()&#039; synchrone qui initialize une instance du runtime et lance la fonction main asynchrone.&lt;br /&gt;
&lt;br /&gt;
Avec ça:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a en réalité&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
fn main() {&lt;br /&gt;
    let mut rt = tokio::runtime::Runtime::new().unwrap();&lt;br /&gt;
    rt.block_on(async {&lt;br /&gt;
        println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
    })&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features de Tokio ==&lt;br /&gt;
&lt;br /&gt;
Tokio a beaucoup de fonctionnalités : TCP, UDP, sockets unix, etc. Nous avons ici utilisé la feature &amp;quot;full&amp;quot; pour l&#039;exemple mais on peut en enlever pour alléger la compilation.&lt;br /&gt;
&lt;br /&gt;
= Spawning =&lt;br /&gt;
On bouge le code précendent en example.&lt;br /&gt;
 mkdir -p examples&lt;br /&gt;
 mv src/main.rs examples/hello-redis.rs&lt;br /&gt;
&lt;br /&gt;
== Sockets entrants ==&lt;br /&gt;
&lt;br /&gt;
On va avoir besoin de sockets TCP entrants sur le port 6379. On le fait avec tokio::net::TcpListener. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Many of Tokio&#039;s types are named the same as their synchronous equivalent in the Rust standard library. When it makes sense, Tokio exposes the same APIs as std but using async fn.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On bind nos sockets sur le port 6379 et on les accepte dans une boucle. Chaque socket est process puis fermé.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use tokio::net::{TcpListener, TcpStream};&lt;br /&gt;
use mini_redis::{Connection, Frame};&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    // Bind the listener to the address&lt;br /&gt;
    let listener = TcpListener::bind(&amp;quot;127.0.0.1:6379&amp;quot;).await.unwrap();&lt;br /&gt;
&lt;br /&gt;
    loop {&lt;br /&gt;
        // The second item contains the IP and port of the new connection.&lt;br /&gt;
        let (socket, _) = listener.accept().await.unwrap();&lt;br /&gt;
        process(socket).await;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async fn process(socket: TcpStream) {&lt;br /&gt;
    // The `Connection` lets us read/write redis **frames** instead of&lt;br /&gt;
    // byte streams. The `Connection` type is defined by mini-redis.&lt;br /&gt;
    let mut connection = Connection::new(socket);&lt;br /&gt;
&lt;br /&gt;
    if let Some(frame) = connection.read_frame().await.unwrap() {&lt;br /&gt;
        println!(&amp;quot;GOT: {:?}&amp;quot;, frame);&lt;br /&gt;
&lt;br /&gt;
        // Respond with an error&lt;br /&gt;
        let response = Frame::Error(&amp;quot;unimplemented&amp;quot;.to_string());&lt;br /&gt;
        connection.write_frame(&amp;amp;response).await.unwrap();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut ensuite le lancer en tant que serveur et lancer notre exemple &amp;quot;hello-redis&amp;quot; dans un second terminal, ce qui donne&lt;br /&gt;
 Error: &amp;quot;unimplemented&amp;quot;&lt;br /&gt;
Et le serveur donne: &lt;br /&gt;
 GOT: Array([Bulk(b&amp;quot;set&amp;quot;), Bulk(b&amp;quot;hello&amp;quot;), Bulk(b&amp;quot;world&amp;quot;)])&lt;br /&gt;
&lt;br /&gt;
== Concurrence ==&lt;br /&gt;
Le problème de notre serveur, au delà du fait qu&#039;il ne renvoie que des erreurs, et qu&#039;il ne process les requêtes que une par une - il reste bloqué dans sa boucle d&#039;acceptation jusque à ce que la réponse soit entièrement écrite sur le socket. Hors, on veut gérer beaucoup de connections simultanées, on a besoin de concurrence ! On a besoin de concurrence, mais pas forcément de parrallélisme. Concurrence = plusieurs tâches en même temps, parrallélisme = plusieurs threads. Tokio peut gérer un grand nombre de tâches sur un seul thread !&lt;br /&gt;
&lt;br /&gt;
On va donc spawn une nouvelle tâche pour chaque nouvelle connection. Notre main ressemble désormais à ça :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use tokio::net::TcpListener;&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    let listener = TcpListener::bind(&amp;quot;127.0.0.1:6379&amp;quot;).await.unwrap();&lt;br /&gt;
&lt;br /&gt;
    loop {&lt;br /&gt;
        let (socket, _) = listener.accept().await.unwrap();&lt;br /&gt;
        // A new task is spawned for each inbound socket. The socket is&lt;br /&gt;
        // moved to the new task and processed there.&lt;br /&gt;
        tokio::spawn(async move {&lt;br /&gt;
            process(socket).await;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tâches ==&lt;br /&gt;
&lt;br /&gt;
Un &amp;quot;green thread&amp;quot; est un thread qui est schedule par un runtime ou une machine virtuelle, afin de reproduire un environnement multi-threadé.&lt;br /&gt;
&lt;br /&gt;
Une tâche Tokio est un &amp;quot;green thread&amp;quot; asynchrone. On la créée en passant un block async a tokio::spawn, qui renvoie un JoinHandle. Le bloc en question peut renvoyer une valeur, que l&#039;on récupère en appellant .await sur le JoinHandle afin de récupérer un result. Par exemple : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 #[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    let handle = tokio::spawn(async {&lt;br /&gt;
        // Do some async work&lt;br /&gt;
        &amp;quot;return value&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Do some other work&lt;br /&gt;
&lt;br /&gt;
    let out = handle.await.unwrap();&lt;br /&gt;
    println!(&amp;quot;GOT {}&amp;quot;, out);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tâches sont donc managées par le scheduler; elles peuvent être lancées sur le même thread ou sur un autre. Elles sont très légères, ne demandant que 64 octets de mémoire. On peut sans problème en appeller des milliers. &lt;br /&gt;
&lt;br /&gt;
=== Static ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/pretzelhammer/rust-blog/blob/master/posts/common-rust-lifetime-misconceptions.md#2-if-t-static-then-t-must-be-valid-for-the-entire-program sur les statiques]&lt;br /&gt;
Cependant, le lifetime d&#039;une tâche est &#039;static. Pour rappel, un lifetime &#039;static signifie que la durée de vie court jusqu&#039;à la fin du programme; la variable est immutable; elle ne peut être créée qu&#039;à la compilation. Attention cependant, un &amp;amp;&#039;static T est différent d&#039;un T: &#039;static. &amp;amp;&#039;static T est une référence immutable que l&#039;on peut garder un temps indéfini. Ce n&#039;est possible que si T est immutable et ne bouge pas après la création de sa référence. Après ça, j&#039;ai pas tout compris... C&#039;est compliqué, bon sang !&lt;br /&gt;
&lt;br /&gt;
Bref, le code suivant ne compile pas :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use tokio::task;&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    let v = vec![1, 2, 3];&lt;br /&gt;
&lt;br /&gt;
    task::spawn(async {&lt;br /&gt;
        println!(&amp;quot;Here&#039;s a vec: {:?}&amp;quot;, v);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Le compilateur renvoie un &amp;quot;function requires argument type to outlive `&#039;static`&amp;quot;. En effet, par défaut, les variable ne sont pas &amp;quot;move&amp;quot; dans les blocs asynchrones. Ici v continue d&#039;appartenir à la fonction main. On a donc le même problème qu&#039;avec un thread : on peut utiliser &amp;quot;move&amp;quot; et perdre la possession de la variable, ou bien utiliser un Arc ou autre. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Send ===&lt;br /&gt;
Les tâches tokio doivent implémenter &amp;quot;Send&amp;quot;. Cela permet à tokio de déplacer les tâches entre des threads pendant qu&#039;elles sont suspendues à un .await. Tasks are Send when all data that is held across .await calls is Send. En gros, tout ce qui est utilisé après .await dans la tâche doit être Send pour être sauvegardé. Je crois ?&lt;br /&gt;
&lt;br /&gt;
Ca fonctionne : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use tokio::task::yield_now;&lt;br /&gt;
use std::rc::Rc;&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    tokio::spawn(async {&lt;br /&gt;
        // The scope forces `rc` to drop before `.await`.&lt;br /&gt;
        {&lt;br /&gt;
            let rc = Rc::new(&amp;quot;hello&amp;quot;);&lt;br /&gt;
            println!(&amp;quot;{}&amp;quot;, rc);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // `rc` is no longer used. It is **not** persisted when&lt;br /&gt;
        // the task yields to the scheduler&lt;br /&gt;
        yield_now().await;&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pas ça&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use tokio::task::yield_now;&lt;br /&gt;
use std::rc::Rc;&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    tokio::spawn(async {&lt;br /&gt;
        let rc = Rc::new(&amp;quot;hello&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // `rc` is used after `.await`. It must be persisted to&lt;br /&gt;
        // the task&#039;s state.&lt;br /&gt;
        yield_now().await;&lt;br /&gt;
&lt;br /&gt;
        println!(&amp;quot;{}&amp;quot;, rc);&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2554</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2554"/>
		<updated>2024-08-20T14:16:30Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Rust */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Disclaimer ==&lt;br /&gt;
Ceci est mon wiki personnel, rédigé au cours de mes études et de ma carrière; je n&#039;ai pas la prétention que tout y soit exact.&lt;br /&gt;
Toutes les pages utiles sont en lien sur la présente page de sommaire. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes personnelles, que je ne mettrait à jour que si j&#039;en ressens le besoin. Il peut parfois s&#039;agir de traduction d&#039;articles existants, si c&#039;est le cas, le lien original est en général au sommet de la page.&lt;br /&gt;
&lt;br /&gt;
[[Logo du site]]&lt;br /&gt;
&lt;br /&gt;
Justine&lt;br /&gt;
&lt;br /&gt;
==Autres / Aide==&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Help:Formatting/fr Aide au formatage]&lt;br /&gt;
*[https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf Aide au langage markdown (pour Git)]&lt;br /&gt;
*[[Portfolio - Notes en vrac]]&lt;br /&gt;
*[[ITIL]]&lt;br /&gt;
*[[Vocabulaire &amp;amp; notions diverses]]&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Extension:SyntaxHighlight L&#039;extension SyntaxHighlight]&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheets==&lt;br /&gt;
* [[Idées diverses de gain de temps]]&lt;br /&gt;
* [[Raccourcis shell bash]]&lt;br /&gt;
* [[Raccourcis Vim]]&lt;br /&gt;
* [[Cs: Ansible]]&lt;br /&gt;
* [[CS : FirewallD]]&lt;br /&gt;
* [[Cs : Vim]]&lt;br /&gt;
* [[Cs:_Tips_Linux]]&lt;br /&gt;
* [[Cs: Git]]&lt;br /&gt;
* [[Cs: Pacman]]&lt;br /&gt;
* [[CS : lsof]]&lt;br /&gt;
* [[CS : SecuriteLinux]]&lt;br /&gt;
* [[Mémo_Apache|Mémo Apache]] &lt;br /&gt;
* [[Memo_nginx|Memo nginx]]   &lt;br /&gt;
* [[Mémo_Openssl|Mémo Openssl]]&lt;br /&gt;
&lt;br /&gt;
==Ansible== &lt;br /&gt;
* [[Ansible|Ansible]] &lt;br /&gt;
** [[Ansible : remplacement récursif de texte]]&lt;br /&gt;
** [[Ansible : Filtres]]&lt;br /&gt;
** [[Ansible : playbook avancé, avec handlers et templates]]&lt;br /&gt;
** [[Ansible : Quirks]]&lt;br /&gt;
** [[Ansible et Windows]]&lt;br /&gt;
** [[Ansible : awx-cli]]&lt;br /&gt;
** [[Ansible : Collections]]&lt;br /&gt;
** [[Ansible : sous-commandes]]&lt;br /&gt;
** [[Ansible : VMWare]]&lt;br /&gt;
&lt;br /&gt;
==Conteneurs== &lt;br /&gt;
[[Fichier:Moby-logo-small.png|90px]]  [[Fichier:K8s-small.png|90px]]&lt;br /&gt;
* [[Docker|Docker]] &lt;br /&gt;
* [[Docker-compose]]&lt;br /&gt;
* [[Traefik]]&lt;br /&gt;
* [[Docker swarm]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[LXD]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;/span&amp;gt;Systèmes&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt; &#039;&#039;&#039;[[File:869px-Tux.svg.png|40x49px|869px-Tux.svg.png]]&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
* [[Additions_Invité_sur_Linux|Additions Invité sur Linux]] &lt;br /&gt;
* [[Analyse de logs]]&lt;br /&gt;
** [[Rsyslog]]&lt;br /&gt;
** [[YAML]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
* [[Apache Tomcat]]&lt;br /&gt;
* [[Appels Système (syscall)]]&lt;br /&gt;
* [[APT]]&lt;br /&gt;
* [[Architecture système]]&lt;br /&gt;
* [[Asterisk|Asterisk]] &lt;br /&gt;
* [[Authentification - PAM]] &lt;br /&gt;
* [[Autostart]]&lt;br /&gt;
* [[Awk]]&lt;br /&gt;
* [[Bases_de_données|Bases de données]] &lt;br /&gt;
* [[Bind9]]&lt;br /&gt;
* [[Ceph]]&lt;br /&gt;
* [[Certbot]]&lt;br /&gt;
* [[Cgroups]]&lt;br /&gt;
* [[CheckMK]]&lt;br /&gt;
* [[Chronyd]]&lt;br /&gt;
* [[Cloud Computing]]&lt;br /&gt;
* [[Commandes analyse maillog]]&lt;br /&gt;
* [[Commandes de test de charge]]&lt;br /&gt;
* [[Commandes_Linux|Commandes Linux]] &lt;br /&gt;
* [[Convertir des .deb en .rpm avec alien]]&lt;br /&gt;
* [[Cryptographie|Cryptographie]] &lt;br /&gt;
** [[Protocole ACME]]&lt;br /&gt;
* [[Droits|Droits]] &lt;br /&gt;
* [[Environnement utilisateur]]&lt;br /&gt;
* [[Filesystems|Filesystems]] &lt;br /&gt;
** [[Surveillance de disques]]&lt;br /&gt;
* [[Firefox]]&lt;br /&gt;
* [[Fstab]]&lt;br /&gt;
* [[Gestion_de_paquets|Gestion de paquets]] &lt;br /&gt;
** [[Unattended-upgrades]]&lt;br /&gt;
* [[Grafana et prometheus]]&lt;br /&gt;
* [[Groupwares|Groupwares]] &lt;br /&gt;
* [[HAProxy]]&lt;br /&gt;
* [[Informations Système sous Linux]]&lt;br /&gt;
* [[Juju]]&lt;br /&gt;
* [[KeepaliveD]]&lt;br /&gt;
* [[Kernel Tuning]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[Kubernetes (obsolete)]]&lt;br /&gt;
* [[LAMP|LAMP]]&lt;br /&gt;
* [[LDAP]] &lt;br /&gt;
* [[Linux|Linux / Systèmes]] &lt;br /&gt;
* [[Linux : Permissions]]&lt;br /&gt;
* [[Attributs_Linux_étendus|Attributs Linux étendus]] &lt;br /&gt;
* [[Linux : Mémoire, RAM, swap]]&lt;br /&gt;
* [[Linux : Gestion de la résolution]]&lt;br /&gt;
* [[Logrotate]]&lt;br /&gt;
* [[Make]]&lt;br /&gt;
* [[Messagerie : Risques]]&lt;br /&gt;
* [[OAuth]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Pile son]]&lt;br /&gt;
* [[Postfix]]&lt;br /&gt;
* [[Processus et Appels Système]]&lt;br /&gt;
* [[Proxmox|Proxmox]] &lt;br /&gt;
* [[Raccourcis_shell_bash|Raccourcis shell bash]] &lt;br /&gt;
* [[Raccourcis_Vim|Raccourcis Vim]] &lt;br /&gt;
* [[Red Hat : Satellite 6]]&lt;br /&gt;
* [[Reverse Proxy Nginx]]&lt;br /&gt;
* [[Rsync,_SFTP,_RoboCopy|Rsync, SFTP, RoboCopy]] &lt;br /&gt;
* [[Screen]]&lt;br /&gt;
* [[Sed]]&lt;br /&gt;
* [[Sendmail]]&lt;br /&gt;
* [[Sshfs]]&lt;br /&gt;
* [[Sockets]]&lt;br /&gt;
* [[Steam cmd]]&lt;br /&gt;
* [[Stockage|Stockage]] &lt;br /&gt;
** [[LVM : opérations courantes]]&lt;br /&gt;
** [[Iscsiadm]]&lt;br /&gt;
** [[IscsiAdm + Multipath]]&lt;br /&gt;
* [[Structure de dossiers Linux]]&lt;br /&gt;
* [[Supervision]]&lt;br /&gt;
* [[Systemd]]&lt;br /&gt;
** [[Timesyncd]]&lt;br /&gt;
* [[Utilisateurs|Utilisateurs]] &lt;br /&gt;
* [[Varnish]]&lt;br /&gt;
* [[VMWare|VMWare]] &lt;br /&gt;
** [[VMWare : Utilisation de PowerCLI]]&lt;br /&gt;
** [[VMWare : Autres notions]]&lt;br /&gt;
&lt;br /&gt;
=== Spécificités Windows [[Fichier:Winlogo.png|50px]] === &lt;br /&gt;
&lt;br /&gt;
* [[Services_Windows|Services Windows]] &lt;br /&gt;
** [[Active_Directory|Active Directory]]&lt;br /&gt;
** [[WSUS_et_Core|WSUS et Core]] &lt;br /&gt;
** [[PowerShell|PowerShell]] &lt;br /&gt;
** [[GPO|GPO]] &lt;br /&gt;
** [[Exchange|Exchange]] &lt;br /&gt;
** [[Exchange pour de vrai]]&lt;br /&gt;
** [[Windows : Outils à connaître]]&lt;br /&gt;
** [[Powershell : Active Directory]]&lt;br /&gt;
** [[AD : intégration Linux]]&lt;br /&gt;
* [[Création de tâches planifiée]]&lt;br /&gt;
* [[Gestion d&#039;accès chez Microsoft]]&lt;br /&gt;
* [[Smbclient]]&lt;br /&gt;
* [[Commandes CMD utiles]]&lt;br /&gt;
&lt;br /&gt;
== Réseaux  [[File:Computer-networking.jpg|middle|77x60px|Computer-networking.jpg]] ==&lt;br /&gt;
&lt;br /&gt;
*[[DHCPv4|DHCPv4]] &lt;br /&gt;
*[[DHCPv6|DHCPv6]] &lt;br /&gt;
*[[DNS|DNS]] &lt;br /&gt;
*[[Ethernet|Ethernet]] &lt;br /&gt;
**[[FireWall_:_CheckPoint|FireWall : CheckPoint]]   &lt;br /&gt;
*[[Firewall|Firewall]] &lt;br /&gt;
**[[Firewall_:_Juniper|Firewall : Juniper]] &lt;br /&gt;
**[[FireWall : CheckPoint]]&lt;br /&gt;
**[[Firewalld]]&lt;br /&gt;
**[[IPTables]]&lt;br /&gt;
**[[Nftables]]&lt;br /&gt;
*[[Gestion_de_parc|Gestion de parc]] &lt;br /&gt;
*[[GlobalProtect sur linux]]&lt;br /&gt;
*[[ICMPv4|ICMPv4]] &lt;br /&gt;
*[[IPv4|IPv4]] &lt;br /&gt;
*[[IPv6|IPv6]] &lt;br /&gt;
* [[Knot DNS]]&lt;br /&gt;
*[[Liste_des_ports|Liste des ports]] &lt;br /&gt;
*[[Modèle_OSI_et_TCP/IP|Modèle OSI et TCP/IP]] &lt;br /&gt;
*[[NAT/PAT|NAT/PAT]] &lt;br /&gt;
*[[NetCat|NetCat]] &lt;br /&gt;
*[[Nmap]]&lt;br /&gt;
*[[Protocoles|Protocoles]] &lt;br /&gt;
*[[Proxy|Proxy]] &lt;br /&gt;
*[[Reseau|Reseau]] &lt;br /&gt;
*[[SNMP|SNMP]] &lt;br /&gt;
*[[SSH|SSH]] &lt;br /&gt;
*[[SSO|SSO]] &lt;br /&gt;
*[[TCP_&amp;amp;_UDP|TCP &amp;amp; UDP]] &lt;br /&gt;
*[[Tor]]&lt;br /&gt;
*[[VLAN|VLAN]] &lt;br /&gt;
*[[VPN|VPN]]&lt;br /&gt;
* [[Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Cisco NetAcad [[File:1200px-Cisco logo blue 2016.svg.png|middle|75x50px|1200px-Cisco logo blue 2016.svg.png]] ===&lt;br /&gt;
&lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_1|Cisco : R&amp;amp;S 1]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_2|Cisco : R&amp;amp;S 2]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_3|Cisco : R&amp;amp;S 3]]&lt;br /&gt;
&lt;br /&gt;
== Web ==&lt;br /&gt;
*[[CGI]]&lt;br /&gt;
*[[Websockets]]&lt;br /&gt;
&lt;br /&gt;
== Cybersécurité [[File:Padlock.png|Padlock.png|77x60px]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Cybersécurité|Cybersécurité : notions de base]] &lt;br /&gt;
*[[Cybersécurité_:_keepass|Cybersécurité : keepass]] &lt;br /&gt;
*[[Metasploit|Metasploit]] &lt;br /&gt;
*[[Cybersécurité_(Kali)_:_Crack_de_mots_de_passe_avec_Hydra|Cybersécurité (Kali) : Crack de mots de passe avec Hydra]] &lt;br /&gt;
*[[Cybersécurité_:_Documentation|Cybersécurité : Documentation]] &lt;br /&gt;
*[[Cybersécurité_:_Lynis|Cybersécurité : Lynis]] &lt;br /&gt;
*[[Cybersécurité_:_Graylog|Cybersécurité : Graylog]] &lt;br /&gt;
*[[Cybersécurité_:_Liens|Cybersécurité : Liens]]&lt;br /&gt;
*[[Messagerie : Risques]] &lt;br /&gt;
*[[Outils Divers]]&lt;br /&gt;
*[[Tests de charge]]&lt;br /&gt;
*[[Honeypot]]&lt;br /&gt;
* [[Shodan]]&lt;br /&gt;
* [https://github.com/certsocietegenerale/IRM/tree/master/EN Des méthodes simples d&#039;analyse]&lt;br /&gt;
* [[Ffuf : Fuzz Faster U Fool]]&lt;br /&gt;
* [[PGP - GPG]]&lt;br /&gt;
&lt;br /&gt;
=== HackTheBox Academy ===&lt;br /&gt;
Mes notes concernant mon suivi de modules sur HTB Academy - elles sont possiblement en anglais.&lt;br /&gt;
* [[HTBA : Active Directory Intro]]&lt;br /&gt;
&lt;br /&gt;
== Gestion de projet [[File:Gdpimage.png|middle|96x64px|Gdpimage.png]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Gestion_de_projet|Gestion de projet]] &lt;br /&gt;
*[[Outils_et_Méthodologie_de_Résolution_de_Problèmes_(MRP)|Outils et Méthodologie de Résolution de Problèmes (MRP)]] &lt;br /&gt;
*[[GDP_Agile_avec_SCRUM|GDP Agile avec SCRUM]]&lt;br /&gt;
&lt;br /&gt;
== Scripting / Programmation [[File:Python-7be70baaac.png|middle|69x69px|Python-7be70baaac.png]][[File:Bashlogo.png|middle|74x74px|Bashlogo.png]] ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
**[[Python : APIs]]&lt;br /&gt;
**[[Python : argparse]]&lt;br /&gt;
**[[Python : Black]]&lt;br /&gt;
**[[Python : coloration de texte]]&lt;br /&gt;
**[[Python_:_Context_Manager|Python : Context Manager]] &lt;br /&gt;
**[[Python : Dataclasses]]&lt;br /&gt;
**[[Python : datetimes]]&lt;br /&gt;
**[[Python : dictionnaires]]&lt;br /&gt;
**[[Python : Ensembles]]&lt;br /&gt;
**[[Python : Fichiers de config]]&lt;br /&gt;
**[[Python : Flask]]&lt;br /&gt;
***[[Python : Flask et SocketIO]]&lt;br /&gt;
**[[Python_:_Fonctions|Python : Fonctions]] &lt;br /&gt;
**[[Python : Fonctions de l&#039;interpréteur]]&lt;br /&gt;
**[[Python_:_Les_fichiers|Python : Les fichiers]]  &lt;br /&gt;
**[[Python : fstrings]] &lt;br /&gt;
**[[Python : Interactions avec Windows]]&lt;br /&gt;
**[[Python_:_Listes|Python : Listes]] &lt;br /&gt;
** [[Python : Locust (Tests de charge)]]&lt;br /&gt;
**[[Python_:_Méthodes_de_chaines|Python : Méthodes de chaines]] &lt;br /&gt;
**[[Python_:_misc|Python : misc]] &lt;br /&gt;
**[[Python : Opérateurs]]&lt;br /&gt;
**[[Python : Opérateur Binaires]]&lt;br /&gt;
**[[Python : os.walk()]]&lt;br /&gt;
**[[Python_-_PEP8|Python - PEP8]] &lt;br /&gt;
**[[Python : Pipenv]]&lt;br /&gt;
**[[Python : Pygame]]&lt;br /&gt;
**[[Python : PySimpleGUI]]&lt;br /&gt;
**[[Python_:_Programmation_Asynchrone|Python : Programmation Asynchrone]] &lt;br /&gt;
**[[Python_:_Programmation_système|Python : Programmation système]] &lt;br /&gt;
**[[Python_:_Réseau|Python : Réseau]] &lt;br /&gt;
**[[Python : simuler des inputs]]&lt;br /&gt;
**[[Python_:_Tkinter|Python : Tkinter]] &lt;br /&gt;
**[[Python : Virtualenv]]&lt;br /&gt;
**[[Python_:_Vocabulaire|Python : Vocabulaire]] &lt;br /&gt;
**[[Python_:_with_et_les_gestionnaires_de_contexte|Python : with et les gestionnaires de contexte]]&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
* Des notes diverses sur le langage, notamment des crates qui peuvent servir : [[Rust : divers]]&lt;br /&gt;
* [[Rust : Tokio]]&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du livre officiel de Rust : [https://doc.rust-lang.org/book/ The Rust book] dans l&#039;ordre des chapitres.&lt;br /&gt;
&lt;br /&gt;
* [[Rust : Structs]]&lt;br /&gt;
* [[Rust: enums]]&lt;br /&gt;
* [[Rust : match]]&lt;br /&gt;
* [[Rust : if let]]&lt;br /&gt;
* [[Rust : packages]]&lt;br /&gt;
* [[Rust : Common collections]]&lt;br /&gt;
* [[Rust : Error handling]]&lt;br /&gt;
* [[Rust : génériques, traits, lifetimes]]&lt;br /&gt;
* [[Rust : tests automatisés]]&lt;br /&gt;
* [[Rust : iterateurs]]&lt;br /&gt;
(Le reste sur mon gitea).&lt;br /&gt;
&lt;br /&gt;
Autres notes:&lt;br /&gt;
* [[Rust : Debug avec GDB]]&lt;br /&gt;
* [[Rust : serde]]&lt;br /&gt;
* [[Rust : Display implementation and Rc + RefCell use demo]]&lt;br /&gt;
* [[Rust : async]]&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
**[[Bash|Bash : Anciennes notes]] &lt;br /&gt;
**[[Bash_:_Codes_de_retour|Bash : Codes de retour]] &lt;br /&gt;
**[[Bash_:_Fonctions|Bash : Fonctions]] &lt;br /&gt;
**[[Bash_:_généralités|Bash : généralités]] &lt;br /&gt;
**[[Bash_:_Paramètres_de_position|Bash : Paramètres de position]] &lt;br /&gt;
**[[Bash_:_Pattern_Matching|Bash : Pattern Matching]]  &lt;br /&gt;
**[[Bash_:_Tableaux|Bash : Tableaux]] &lt;br /&gt;
**[[Bash_:_Traitement_sur_les_chaînes|Bash : Traitement sur les chaînes]] &lt;br /&gt;
**[[Zsh]]&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
**[[PowerShell|PowerShell]] &lt;br /&gt;
**[[PowerShell_:_Scripting|PowerShell : Scripting]] &lt;br /&gt;
**[[PowerShell_:_scripts_complets|PowerShell : scripts complets]] &lt;br /&gt;
**[[PowerShell_:_Exporter_une_boîte_en_pst|PowerShell : Exporter une boîte en pst]]   &lt;br /&gt;
&lt;br /&gt;
=== Généralités ===&lt;br /&gt;
**[[Expressions_Régulières|Expressions Régulières]]&lt;br /&gt;
**[[RPC / REST]]&lt;br /&gt;
&lt;br /&gt;
=== Assembleur ===&lt;br /&gt;
* [[Assembleur|Assembleur (généralités)]]&lt;br /&gt;
* [[Assembleur : boot sector]]&lt;br /&gt;
&lt;br /&gt;
=== Langage C ===&lt;br /&gt;
** [[C : bases]]&lt;br /&gt;
**[[Langage C]]&lt;br /&gt;
&lt;br /&gt;
=== Golang ===&lt;br /&gt;
**[[Golang : bases]]&lt;br /&gt;
&lt;br /&gt;
== Hors-Sujet ==&lt;br /&gt;
&lt;br /&gt;
*[[Coaching_:_CV|Coaching : CV]]&lt;br /&gt;
*[[Droit|Droit]] &lt;br /&gt;
*[[Management|Management]] &lt;br /&gt;
*[[Ondes_radio|Ondes radio]]&lt;br /&gt;
*[[Vérités et contre-vérités]]&lt;br /&gt;
*[[Questions Sysadmin]]&lt;br /&gt;
*[[Comprendre comment fonctionne son organisation]]&lt;br /&gt;
&lt;br /&gt;
=== Musique ===&lt;br /&gt;
*[[Musique modale, musique tonale]]&lt;br /&gt;
*[[Gamme pentatonique]]&lt;br /&gt;
&lt;br /&gt;
== Jouer sur Linux ==&lt;br /&gt;
* [[Steam]]&lt;br /&gt;
* [[Optimus]]&lt;br /&gt;
&lt;br /&gt;
== Notes Personnelles ==&lt;br /&gt;
&lt;br /&gt;
Cette section contient des notes plus personnelles et moins rédigées, laissées là pour référence future.&lt;br /&gt;
&lt;br /&gt;
*[[Secure boot &amp;amp; pilotes nVIdia]]&lt;br /&gt;
*[[Dual boot et ennuis divers...]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;C’est pour ça : j’lis jamais rien. C’est un vrai piège à cons c’t’histoire-là. En plus j’sais pas lire.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2553</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2553"/>
		<updated>2024-08-20T14:16:21Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Rust */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Disclaimer ==&lt;br /&gt;
Ceci est mon wiki personnel, rédigé au cours de mes études et de ma carrière; je n&#039;ai pas la prétention que tout y soit exact.&lt;br /&gt;
Toutes les pages utiles sont en lien sur la présente page de sommaire. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes personnelles, que je ne mettrait à jour que si j&#039;en ressens le besoin. Il peut parfois s&#039;agir de traduction d&#039;articles existants, si c&#039;est le cas, le lien original est en général au sommet de la page.&lt;br /&gt;
&lt;br /&gt;
[[Logo du site]]&lt;br /&gt;
&lt;br /&gt;
Justine&lt;br /&gt;
&lt;br /&gt;
==Autres / Aide==&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Help:Formatting/fr Aide au formatage]&lt;br /&gt;
*[https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf Aide au langage markdown (pour Git)]&lt;br /&gt;
*[[Portfolio - Notes en vrac]]&lt;br /&gt;
*[[ITIL]]&lt;br /&gt;
*[[Vocabulaire &amp;amp; notions diverses]]&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Extension:SyntaxHighlight L&#039;extension SyntaxHighlight]&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheets==&lt;br /&gt;
* [[Idées diverses de gain de temps]]&lt;br /&gt;
* [[Raccourcis shell bash]]&lt;br /&gt;
* [[Raccourcis Vim]]&lt;br /&gt;
* [[Cs: Ansible]]&lt;br /&gt;
* [[CS : FirewallD]]&lt;br /&gt;
* [[Cs : Vim]]&lt;br /&gt;
* [[Cs:_Tips_Linux]]&lt;br /&gt;
* [[Cs: Git]]&lt;br /&gt;
* [[Cs: Pacman]]&lt;br /&gt;
* [[CS : lsof]]&lt;br /&gt;
* [[CS : SecuriteLinux]]&lt;br /&gt;
* [[Mémo_Apache|Mémo Apache]] &lt;br /&gt;
* [[Memo_nginx|Memo nginx]]   &lt;br /&gt;
* [[Mémo_Openssl|Mémo Openssl]]&lt;br /&gt;
&lt;br /&gt;
==Ansible== &lt;br /&gt;
* [[Ansible|Ansible]] &lt;br /&gt;
** [[Ansible : remplacement récursif de texte]]&lt;br /&gt;
** [[Ansible : Filtres]]&lt;br /&gt;
** [[Ansible : playbook avancé, avec handlers et templates]]&lt;br /&gt;
** [[Ansible : Quirks]]&lt;br /&gt;
** [[Ansible et Windows]]&lt;br /&gt;
** [[Ansible : awx-cli]]&lt;br /&gt;
** [[Ansible : Collections]]&lt;br /&gt;
** [[Ansible : sous-commandes]]&lt;br /&gt;
** [[Ansible : VMWare]]&lt;br /&gt;
&lt;br /&gt;
==Conteneurs== &lt;br /&gt;
[[Fichier:Moby-logo-small.png|90px]]  [[Fichier:K8s-small.png|90px]]&lt;br /&gt;
* [[Docker|Docker]] &lt;br /&gt;
* [[Docker-compose]]&lt;br /&gt;
* [[Traefik]]&lt;br /&gt;
* [[Docker swarm]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[LXD]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;/span&amp;gt;Systèmes&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt; &#039;&#039;&#039;[[File:869px-Tux.svg.png|40x49px|869px-Tux.svg.png]]&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
* [[Additions_Invité_sur_Linux|Additions Invité sur Linux]] &lt;br /&gt;
* [[Analyse de logs]]&lt;br /&gt;
** [[Rsyslog]]&lt;br /&gt;
** [[YAML]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
* [[Apache Tomcat]]&lt;br /&gt;
* [[Appels Système (syscall)]]&lt;br /&gt;
* [[APT]]&lt;br /&gt;
* [[Architecture système]]&lt;br /&gt;
* [[Asterisk|Asterisk]] &lt;br /&gt;
* [[Authentification - PAM]] &lt;br /&gt;
* [[Autostart]]&lt;br /&gt;
* [[Awk]]&lt;br /&gt;
* [[Bases_de_données|Bases de données]] &lt;br /&gt;
* [[Bind9]]&lt;br /&gt;
* [[Ceph]]&lt;br /&gt;
* [[Certbot]]&lt;br /&gt;
* [[Cgroups]]&lt;br /&gt;
* [[CheckMK]]&lt;br /&gt;
* [[Chronyd]]&lt;br /&gt;
* [[Cloud Computing]]&lt;br /&gt;
* [[Commandes analyse maillog]]&lt;br /&gt;
* [[Commandes de test de charge]]&lt;br /&gt;
* [[Commandes_Linux|Commandes Linux]] &lt;br /&gt;
* [[Convertir des .deb en .rpm avec alien]]&lt;br /&gt;
* [[Cryptographie|Cryptographie]] &lt;br /&gt;
** [[Protocole ACME]]&lt;br /&gt;
* [[Droits|Droits]] &lt;br /&gt;
* [[Environnement utilisateur]]&lt;br /&gt;
* [[Filesystems|Filesystems]] &lt;br /&gt;
** [[Surveillance de disques]]&lt;br /&gt;
* [[Firefox]]&lt;br /&gt;
* [[Fstab]]&lt;br /&gt;
* [[Gestion_de_paquets|Gestion de paquets]] &lt;br /&gt;
** [[Unattended-upgrades]]&lt;br /&gt;
* [[Grafana et prometheus]]&lt;br /&gt;
* [[Groupwares|Groupwares]] &lt;br /&gt;
* [[HAProxy]]&lt;br /&gt;
* [[Informations Système sous Linux]]&lt;br /&gt;
* [[Juju]]&lt;br /&gt;
* [[KeepaliveD]]&lt;br /&gt;
* [[Kernel Tuning]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[Kubernetes (obsolete)]]&lt;br /&gt;
* [[LAMP|LAMP]]&lt;br /&gt;
* [[LDAP]] &lt;br /&gt;
* [[Linux|Linux / Systèmes]] &lt;br /&gt;
* [[Linux : Permissions]]&lt;br /&gt;
* [[Attributs_Linux_étendus|Attributs Linux étendus]] &lt;br /&gt;
* [[Linux : Mémoire, RAM, swap]]&lt;br /&gt;
* [[Linux : Gestion de la résolution]]&lt;br /&gt;
* [[Logrotate]]&lt;br /&gt;
* [[Make]]&lt;br /&gt;
* [[Messagerie : Risques]]&lt;br /&gt;
* [[OAuth]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Pile son]]&lt;br /&gt;
* [[Postfix]]&lt;br /&gt;
* [[Processus et Appels Système]]&lt;br /&gt;
* [[Proxmox|Proxmox]] &lt;br /&gt;
* [[Raccourcis_shell_bash|Raccourcis shell bash]] &lt;br /&gt;
* [[Raccourcis_Vim|Raccourcis Vim]] &lt;br /&gt;
* [[Red Hat : Satellite 6]]&lt;br /&gt;
* [[Reverse Proxy Nginx]]&lt;br /&gt;
* [[Rsync,_SFTP,_RoboCopy|Rsync, SFTP, RoboCopy]] &lt;br /&gt;
* [[Screen]]&lt;br /&gt;
* [[Sed]]&lt;br /&gt;
* [[Sendmail]]&lt;br /&gt;
* [[Sshfs]]&lt;br /&gt;
* [[Sockets]]&lt;br /&gt;
* [[Steam cmd]]&lt;br /&gt;
* [[Stockage|Stockage]] &lt;br /&gt;
** [[LVM : opérations courantes]]&lt;br /&gt;
** [[Iscsiadm]]&lt;br /&gt;
** [[IscsiAdm + Multipath]]&lt;br /&gt;
* [[Structure de dossiers Linux]]&lt;br /&gt;
* [[Supervision]]&lt;br /&gt;
* [[Systemd]]&lt;br /&gt;
** [[Timesyncd]]&lt;br /&gt;
* [[Utilisateurs|Utilisateurs]] &lt;br /&gt;
* [[Varnish]]&lt;br /&gt;
* [[VMWare|VMWare]] &lt;br /&gt;
** [[VMWare : Utilisation de PowerCLI]]&lt;br /&gt;
** [[VMWare : Autres notions]]&lt;br /&gt;
&lt;br /&gt;
=== Spécificités Windows [[Fichier:Winlogo.png|50px]] === &lt;br /&gt;
&lt;br /&gt;
* [[Services_Windows|Services Windows]] &lt;br /&gt;
** [[Active_Directory|Active Directory]]&lt;br /&gt;
** [[WSUS_et_Core|WSUS et Core]] &lt;br /&gt;
** [[PowerShell|PowerShell]] &lt;br /&gt;
** [[GPO|GPO]] &lt;br /&gt;
** [[Exchange|Exchange]] &lt;br /&gt;
** [[Exchange pour de vrai]]&lt;br /&gt;
** [[Windows : Outils à connaître]]&lt;br /&gt;
** [[Powershell : Active Directory]]&lt;br /&gt;
** [[AD : intégration Linux]]&lt;br /&gt;
* [[Création de tâches planifiée]]&lt;br /&gt;
* [[Gestion d&#039;accès chez Microsoft]]&lt;br /&gt;
* [[Smbclient]]&lt;br /&gt;
* [[Commandes CMD utiles]]&lt;br /&gt;
&lt;br /&gt;
== Réseaux  [[File:Computer-networking.jpg|middle|77x60px|Computer-networking.jpg]] ==&lt;br /&gt;
&lt;br /&gt;
*[[DHCPv4|DHCPv4]] &lt;br /&gt;
*[[DHCPv6|DHCPv6]] &lt;br /&gt;
*[[DNS|DNS]] &lt;br /&gt;
*[[Ethernet|Ethernet]] &lt;br /&gt;
**[[FireWall_:_CheckPoint|FireWall : CheckPoint]]   &lt;br /&gt;
*[[Firewall|Firewall]] &lt;br /&gt;
**[[Firewall_:_Juniper|Firewall : Juniper]] &lt;br /&gt;
**[[FireWall : CheckPoint]]&lt;br /&gt;
**[[Firewalld]]&lt;br /&gt;
**[[IPTables]]&lt;br /&gt;
**[[Nftables]]&lt;br /&gt;
*[[Gestion_de_parc|Gestion de parc]] &lt;br /&gt;
*[[GlobalProtect sur linux]]&lt;br /&gt;
*[[ICMPv4|ICMPv4]] &lt;br /&gt;
*[[IPv4|IPv4]] &lt;br /&gt;
*[[IPv6|IPv6]] &lt;br /&gt;
* [[Knot DNS]]&lt;br /&gt;
*[[Liste_des_ports|Liste des ports]] &lt;br /&gt;
*[[Modèle_OSI_et_TCP/IP|Modèle OSI et TCP/IP]] &lt;br /&gt;
*[[NAT/PAT|NAT/PAT]] &lt;br /&gt;
*[[NetCat|NetCat]] &lt;br /&gt;
*[[Nmap]]&lt;br /&gt;
*[[Protocoles|Protocoles]] &lt;br /&gt;
*[[Proxy|Proxy]] &lt;br /&gt;
*[[Reseau|Reseau]] &lt;br /&gt;
*[[SNMP|SNMP]] &lt;br /&gt;
*[[SSH|SSH]] &lt;br /&gt;
*[[SSO|SSO]] &lt;br /&gt;
*[[TCP_&amp;amp;_UDP|TCP &amp;amp; UDP]] &lt;br /&gt;
*[[Tor]]&lt;br /&gt;
*[[VLAN|VLAN]] &lt;br /&gt;
*[[VPN|VPN]]&lt;br /&gt;
* [[Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Cisco NetAcad [[File:1200px-Cisco logo blue 2016.svg.png|middle|75x50px|1200px-Cisco logo blue 2016.svg.png]] ===&lt;br /&gt;
&lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_1|Cisco : R&amp;amp;S 1]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_2|Cisco : R&amp;amp;S 2]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_3|Cisco : R&amp;amp;S 3]]&lt;br /&gt;
&lt;br /&gt;
== Web ==&lt;br /&gt;
*[[CGI]]&lt;br /&gt;
*[[Websockets]]&lt;br /&gt;
&lt;br /&gt;
== Cybersécurité [[File:Padlock.png|Padlock.png|77x60px]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Cybersécurité|Cybersécurité : notions de base]] &lt;br /&gt;
*[[Cybersécurité_:_keepass|Cybersécurité : keepass]] &lt;br /&gt;
*[[Metasploit|Metasploit]] &lt;br /&gt;
*[[Cybersécurité_(Kali)_:_Crack_de_mots_de_passe_avec_Hydra|Cybersécurité (Kali) : Crack de mots de passe avec Hydra]] &lt;br /&gt;
*[[Cybersécurité_:_Documentation|Cybersécurité : Documentation]] &lt;br /&gt;
*[[Cybersécurité_:_Lynis|Cybersécurité : Lynis]] &lt;br /&gt;
*[[Cybersécurité_:_Graylog|Cybersécurité : Graylog]] &lt;br /&gt;
*[[Cybersécurité_:_Liens|Cybersécurité : Liens]]&lt;br /&gt;
*[[Messagerie : Risques]] &lt;br /&gt;
*[[Outils Divers]]&lt;br /&gt;
*[[Tests de charge]]&lt;br /&gt;
*[[Honeypot]]&lt;br /&gt;
* [[Shodan]]&lt;br /&gt;
* [https://github.com/certsocietegenerale/IRM/tree/master/EN Des méthodes simples d&#039;analyse]&lt;br /&gt;
* [[Ffuf : Fuzz Faster U Fool]]&lt;br /&gt;
* [[PGP - GPG]]&lt;br /&gt;
&lt;br /&gt;
=== HackTheBox Academy ===&lt;br /&gt;
Mes notes concernant mon suivi de modules sur HTB Academy - elles sont possiblement en anglais.&lt;br /&gt;
* [[HTBA : Active Directory Intro]]&lt;br /&gt;
&lt;br /&gt;
== Gestion de projet [[File:Gdpimage.png|middle|96x64px|Gdpimage.png]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Gestion_de_projet|Gestion de projet]] &lt;br /&gt;
*[[Outils_et_Méthodologie_de_Résolution_de_Problèmes_(MRP)|Outils et Méthodologie de Résolution de Problèmes (MRP)]] &lt;br /&gt;
*[[GDP_Agile_avec_SCRUM|GDP Agile avec SCRUM]]&lt;br /&gt;
&lt;br /&gt;
== Scripting / Programmation [[File:Python-7be70baaac.png|middle|69x69px|Python-7be70baaac.png]][[File:Bashlogo.png|middle|74x74px|Bashlogo.png]] ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
**[[Python : APIs]]&lt;br /&gt;
**[[Python : argparse]]&lt;br /&gt;
**[[Python : Black]]&lt;br /&gt;
**[[Python : coloration de texte]]&lt;br /&gt;
**[[Python_:_Context_Manager|Python : Context Manager]] &lt;br /&gt;
**[[Python : Dataclasses]]&lt;br /&gt;
**[[Python : datetimes]]&lt;br /&gt;
**[[Python : dictionnaires]]&lt;br /&gt;
**[[Python : Ensembles]]&lt;br /&gt;
**[[Python : Fichiers de config]]&lt;br /&gt;
**[[Python : Flask]]&lt;br /&gt;
***[[Python : Flask et SocketIO]]&lt;br /&gt;
**[[Python_:_Fonctions|Python : Fonctions]] &lt;br /&gt;
**[[Python : Fonctions de l&#039;interpréteur]]&lt;br /&gt;
**[[Python_:_Les_fichiers|Python : Les fichiers]]  &lt;br /&gt;
**[[Python : fstrings]] &lt;br /&gt;
**[[Python : Interactions avec Windows]]&lt;br /&gt;
**[[Python_:_Listes|Python : Listes]] &lt;br /&gt;
** [[Python : Locust (Tests de charge)]]&lt;br /&gt;
**[[Python_:_Méthodes_de_chaines|Python : Méthodes de chaines]] &lt;br /&gt;
**[[Python_:_misc|Python : misc]] &lt;br /&gt;
**[[Python : Opérateurs]]&lt;br /&gt;
**[[Python : Opérateur Binaires]]&lt;br /&gt;
**[[Python : os.walk()]]&lt;br /&gt;
**[[Python_-_PEP8|Python - PEP8]] &lt;br /&gt;
**[[Python : Pipenv]]&lt;br /&gt;
**[[Python : Pygame]]&lt;br /&gt;
**[[Python : PySimpleGUI]]&lt;br /&gt;
**[[Python_:_Programmation_Asynchrone|Python : Programmation Asynchrone]] &lt;br /&gt;
**[[Python_:_Programmation_système|Python : Programmation système]] &lt;br /&gt;
**[[Python_:_Réseau|Python : Réseau]] &lt;br /&gt;
**[[Python : simuler des inputs]]&lt;br /&gt;
**[[Python_:_Tkinter|Python : Tkinter]] &lt;br /&gt;
**[[Python : Virtualenv]]&lt;br /&gt;
**[[Python_:_Vocabulaire|Python : Vocabulaire]] &lt;br /&gt;
**[[Python_:_with_et_les_gestionnaires_de_contexte|Python : with et les gestionnaires de contexte]]&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
* Des notes diverses sur le langage, notamment des crates qui peuvent servir : [[Rust: divers]]&lt;br /&gt;
* [[Rust : Tokio]]&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du livre officiel de Rust : [https://doc.rust-lang.org/book/ The Rust book] dans l&#039;ordre des chapitres.&lt;br /&gt;
&lt;br /&gt;
* [[Rust : Structs]]&lt;br /&gt;
* [[Rust: enums]]&lt;br /&gt;
* [[Rust : match]]&lt;br /&gt;
* [[Rust : if let]]&lt;br /&gt;
* [[Rust : packages]]&lt;br /&gt;
* [[Rust : Common collections]]&lt;br /&gt;
* [[Rust : Error handling]]&lt;br /&gt;
* [[Rust : génériques, traits, lifetimes]]&lt;br /&gt;
* [[Rust : tests automatisés]]&lt;br /&gt;
* [[Rust : iterateurs]]&lt;br /&gt;
(Le reste sur mon gitea).&lt;br /&gt;
&lt;br /&gt;
Autres notes:&lt;br /&gt;
* [[Rust : Debug avec GDB]]&lt;br /&gt;
* [[Rust : serde]]&lt;br /&gt;
* [[Rust : Display implementation and Rc + RefCell use demo]]&lt;br /&gt;
* [[Rust : async]]&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
**[[Bash|Bash : Anciennes notes]] &lt;br /&gt;
**[[Bash_:_Codes_de_retour|Bash : Codes de retour]] &lt;br /&gt;
**[[Bash_:_Fonctions|Bash : Fonctions]] &lt;br /&gt;
**[[Bash_:_généralités|Bash : généralités]] &lt;br /&gt;
**[[Bash_:_Paramètres_de_position|Bash : Paramètres de position]] &lt;br /&gt;
**[[Bash_:_Pattern_Matching|Bash : Pattern Matching]]  &lt;br /&gt;
**[[Bash_:_Tableaux|Bash : Tableaux]] &lt;br /&gt;
**[[Bash_:_Traitement_sur_les_chaînes|Bash : Traitement sur les chaînes]] &lt;br /&gt;
**[[Zsh]]&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
**[[PowerShell|PowerShell]] &lt;br /&gt;
**[[PowerShell_:_Scripting|PowerShell : Scripting]] &lt;br /&gt;
**[[PowerShell_:_scripts_complets|PowerShell : scripts complets]] &lt;br /&gt;
**[[PowerShell_:_Exporter_une_boîte_en_pst|PowerShell : Exporter une boîte en pst]]   &lt;br /&gt;
&lt;br /&gt;
=== Généralités ===&lt;br /&gt;
**[[Expressions_Régulières|Expressions Régulières]]&lt;br /&gt;
**[[RPC / REST]]&lt;br /&gt;
&lt;br /&gt;
=== Assembleur ===&lt;br /&gt;
* [[Assembleur|Assembleur (généralités)]]&lt;br /&gt;
* [[Assembleur : boot sector]]&lt;br /&gt;
&lt;br /&gt;
=== Langage C ===&lt;br /&gt;
** [[C : bases]]&lt;br /&gt;
**[[Langage C]]&lt;br /&gt;
&lt;br /&gt;
=== Golang ===&lt;br /&gt;
**[[Golang : bases]]&lt;br /&gt;
&lt;br /&gt;
== Hors-Sujet ==&lt;br /&gt;
&lt;br /&gt;
*[[Coaching_:_CV|Coaching : CV]]&lt;br /&gt;
*[[Droit|Droit]] &lt;br /&gt;
*[[Management|Management]] &lt;br /&gt;
*[[Ondes_radio|Ondes radio]]&lt;br /&gt;
*[[Vérités et contre-vérités]]&lt;br /&gt;
*[[Questions Sysadmin]]&lt;br /&gt;
*[[Comprendre comment fonctionne son organisation]]&lt;br /&gt;
&lt;br /&gt;
=== Musique ===&lt;br /&gt;
*[[Musique modale, musique tonale]]&lt;br /&gt;
*[[Gamme pentatonique]]&lt;br /&gt;
&lt;br /&gt;
== Jouer sur Linux ==&lt;br /&gt;
* [[Steam]]&lt;br /&gt;
* [[Optimus]]&lt;br /&gt;
&lt;br /&gt;
== Notes Personnelles ==&lt;br /&gt;
&lt;br /&gt;
Cette section contient des notes plus personnelles et moins rédigées, laissées là pour référence future.&lt;br /&gt;
&lt;br /&gt;
*[[Secure boot &amp;amp; pilotes nVIdia]]&lt;br /&gt;
*[[Dual boot et ennuis divers...]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;C’est pour ça : j’lis jamais rien. C’est un vrai piège à cons c’t’histoire-là. En plus j’sais pas lire.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2552</id>
		<title>Rust : Tokio</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2552"/>
		<updated>2024-08-19T15:24:37Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= A propos de cette page =&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du tuto d&#039;utilisation de l&#039;environnement Tokio : [https://tokio.rs/tokio/tutorial ici]&lt;br /&gt;
&lt;br /&gt;
= Présentation =&lt;br /&gt;
&lt;br /&gt;
Tokio est un runtime asynchrone pour Rust, et fournit les outils pour créer des applications asynchrone utilisant le réseau. Les composants principaux sont:&lt;br /&gt;
&lt;br /&gt;
* Un runtime multi-process pour l&#039;exécution de code asynchrone&lt;br /&gt;
* Une version asynchrone de la librairie standard&lt;br /&gt;
* Un grand ecosystème de librairies associées.&lt;br /&gt;
&lt;br /&gt;
Son rôle est avant tout d&#039;accélerer les applications dans le cas où elles sont dépendante d&#039;IO réseau en grande quantité, et pas dépendantes du CPU. Il n&#039;est pas non plus intéressant pour accéder à un grand nombre de fichiers simultanément car les OS n&#039;ont généralement pas d&#039;API asynchrone pour les filesystems.&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
Le but du tutoriel est de montrer comment implémenter un client et un serveur Redis, avec un petit ensemble de commandes Redis. Ce projet s&#039;appelle Mini-Redis et est [https://github.com/tokio-rs/mini-redis sur Github].&lt;br /&gt;
&lt;br /&gt;
Avec une version récente de Rust, on commence par le serveur mini-redis, qui nous permettra de tester notre client.&lt;br /&gt;
 cargo install mini-redis&lt;br /&gt;
 //Lancer le serveur&lt;br /&gt;
 mini-redis-server&lt;br /&gt;
 //Depuis un autre terminal&lt;br /&gt;
 mini-redis-cli get foo&lt;br /&gt;
 //Doit renvoyer (nil)&lt;br /&gt;
&lt;br /&gt;
= Hello Tokio =&lt;br /&gt;
&lt;br /&gt;
On commence par créer une application très simple, qui va se connecter au serveur mini-redis et passer la clef &amp;quot;hello&amp;quot; à &amp;quot;world&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 cargo new my-redis&lt;br /&gt;
 cd my-redis&lt;br /&gt;
 //Cargo.toml&lt;br /&gt;
 tokio = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;full&amp;quot;] }&lt;br /&gt;
 mini-redis = &amp;quot;0.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis dans le main.rs&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use mini_redis::{client, Result};&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() -&amp;gt; Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Open a connection to the mini-redis address.&lt;br /&gt;
    let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    // Set the key &amp;quot;hello&amp;quot; with value &amp;quot;world&amp;quot;&lt;br /&gt;
    client.set(&amp;quot;hello&amp;quot;, &amp;quot;world&amp;quot;.into()).await?;&lt;br /&gt;
&lt;br /&gt;
    // Get key &amp;quot;hello&amp;quot;&lt;br /&gt;
    let result = client.get(&amp;quot;hello&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;got value from the server; result={:?}&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En faisant un cargo run avec le serveur mini-redis fonctionnel dans un autre terminal, on a bien le résultat attendu.&lt;br /&gt;
&lt;br /&gt;
En détail :&lt;br /&gt;
 let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
Fonction fournie par mini-redis qui donne un handle sur un client tcp. L&#039;opération est asynchrone, mais le code ressemble à du code synchrone; on sait qu&#039;il est asynchrone grace à &amp;quot;await&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Programmation asynchrone ? ==&lt;br /&gt;
La plupart du temps, les programmes exécutés dans l&#039;ordre dans lequel ils sont écrits. Si une tâche prend du temps, le thread est bloqué le temps que ça termine, ce qui peut être le cas pour une connexion TCP via laquelle un échange de données a lieu. &lt;br /&gt;
&lt;br /&gt;
Avec la programmation asynchrone, les opération qui ne peuvent pas se terminer immédiatement vont en arrière plan. Le thread n&#039;est pas bloqué et peut faire d&#039;autres choses en attendant. Quand la tâche en arrière plan se termine, elle n&#039;est plus suspendue et peut continuer. La programmation asynchrone peut permettre d&#039;avoir des applications plus rapides, mais aussi bien plus compliquées. Elles forcent à gérer l&#039;état des différentes tâches du programme.&lt;br /&gt;
&lt;br /&gt;
== Compile-time green threading (j&#039;ai pas envie de traduire) ==&lt;br /&gt;
Rust implémente l&#039;asynchrone avec les mots async et await. Les fonctions qui font de l&#039;asynchrone sont marquées avec async:&lt;br /&gt;
 pub async fn connect&amp;lt;T: ToSocketAddrs&amp;gt;(addr: T) -&amp;gt; Result&amp;lt;Client&amp;gt; //etc&lt;br /&gt;
Les fonctions en &amp;quot;async fn&amp;quot; sont traduites par Rust lors de la compilation vers des routines asynchrones. N&#039;importe quel appel à .await dans la fonction asynchrone renvoie le contrôle des opérations au thread, afin qu&#039;il puisse faire autre chose pendant que les opérations se terminent en fond.&lt;br /&gt;
&lt;br /&gt;
== Utiliser async / await ==&lt;br /&gt;
Les fonctions asynchrones sont appellées comme n&#039;importe quelle autre fonction, mais ne renvoient pas une valeur représentant le résultat de leurs opérations. Elles renvoient une valeur qui représente l&#039;opération. Il faut utiliser .await sur cette valeur afin d&#039;obtenir le résultat. &lt;br /&gt;
Exemple: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
async fn say_world() {&lt;br /&gt;
    println!(&amp;quot;world&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    // Calling `say_world()` does not execute the body of `say_world()`.&lt;br /&gt;
    let op = say_world();&lt;br /&gt;
&lt;br /&gt;
    // This println! comes first&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Calling `.await` on `op` starts executing `say_world`.&lt;br /&gt;
    op.await;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie &lt;br /&gt;
 hello&lt;br /&gt;
 world&lt;br /&gt;
&lt;br /&gt;
La valeur de retour d&#039;une &amp;quot;async fn&amp;quot; est un type anonyme qui implément le trait &amp;quot;Future&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Fonction main asynchrone ==&lt;br /&gt;
La fonction main utilisée ici est différente de ce qu&#039;on trouve habituellement : elle est asynchrone et annotée avec &amp;quot;#[tokio::main]&amp;quot;. Une fonction async est nécessaire car on veut entrer dans un environnement asynchrone. Cependant, elle doit être exécutée par un runtime, qui contient le task scheduler, les I/O, les timers, etc. C&#039;est le rôle de la macro #[tokio::main].&lt;br /&gt;
&lt;br /&gt;
Cette macro sert à transformer notre &#039;async fn main&#039; en une &#039;fn main()&#039; synchrone qui initialize une instance du runtime et lance la fonction main asynchrone.&lt;br /&gt;
&lt;br /&gt;
Avec ça:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a en réalité&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
fn main() {&lt;br /&gt;
    let mut rt = tokio::runtime::Runtime::new().unwrap();&lt;br /&gt;
    rt.block_on(async {&lt;br /&gt;
        println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
    })&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features de Tokio ==&lt;br /&gt;
&lt;br /&gt;
Tokio a beaucoup de fonctionnalités : TCP, UDP, sockets unix, etc. Nous avons ici utilisé la feature &amp;quot;full&amp;quot; pour l&#039;exemple mais on peut en enlever pour alléger la compilation.&lt;br /&gt;
&lt;br /&gt;
= Spawning =&lt;br /&gt;
On bouge le code précendent en example.&lt;br /&gt;
 mkdir -p examples&lt;br /&gt;
 mv src/main.rs examples/hello-redis.rs&lt;br /&gt;
&lt;br /&gt;
== Sockets entrants ==&lt;br /&gt;
&lt;br /&gt;
On va avoir besoin de sockets TCP entrants sur le port 6379. On le fait avec tokio::net::TcpListener. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Many of Tokio&#039;s types are named the same as their synchronous equivalent in the Rust standard library. When it makes sense, Tokio exposes the same APIs as std but using async fn.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On bind nos sockets sur le port 6379 et on les accepte dans une boucle. Chaque socket est process puis fermé.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use tokio::net::{TcpListener, TcpStream};&lt;br /&gt;
use mini_redis::{Connection, Frame};&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    // Bind the listener to the address&lt;br /&gt;
    let listener = TcpListener::bind(&amp;quot;127.0.0.1:6379&amp;quot;).await.unwrap();&lt;br /&gt;
&lt;br /&gt;
    loop {&lt;br /&gt;
        // The second item contains the IP and port of the new connection.&lt;br /&gt;
        let (socket, _) = listener.accept().await.unwrap();&lt;br /&gt;
        process(socket).await;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async fn process(socket: TcpStream) {&lt;br /&gt;
    // The `Connection` lets us read/write redis **frames** instead of&lt;br /&gt;
    // byte streams. The `Connection` type is defined by mini-redis.&lt;br /&gt;
    let mut connection = Connection::new(socket);&lt;br /&gt;
&lt;br /&gt;
    if let Some(frame) = connection.read_frame().await.unwrap() {&lt;br /&gt;
        println!(&amp;quot;GOT: {:?}&amp;quot;, frame);&lt;br /&gt;
&lt;br /&gt;
        // Respond with an error&lt;br /&gt;
        let response = Frame::Error(&amp;quot;unimplemented&amp;quot;.to_string());&lt;br /&gt;
        connection.write_frame(&amp;amp;response).await.unwrap();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut ensuite le lancer en tant que serveur et lancer notre exemple &amp;quot;hello-redis&amp;quot; dans un second terminal, ce qui donne&lt;br /&gt;
 Error: &amp;quot;unimplemented&amp;quot;&lt;br /&gt;
Et le serveur donne: &lt;br /&gt;
 GOT: Array([Bulk(b&amp;quot;set&amp;quot;), Bulk(b&amp;quot;hello&amp;quot;), Bulk(b&amp;quot;world&amp;quot;)])&lt;br /&gt;
&lt;br /&gt;
== Concurrence ==&lt;br /&gt;
Le problème de notre serveur, au delà du fait qu&#039;il ne renvoie que des erreurs, et qu&#039;il ne process les requêtes que une par une - il reste bloqué dans sa boucle d&#039;acceptation jusque à ce que la réponse soit entièrement écrite sur le socket. Hors, on veut gérer beaucoup de connections simultanées, on a besoin de concurrence ! On a besoin de concurrence, mais pas forcément de parrallélisme. Concurrence = plusieurs tâches en même temps, parrallélisme = plusieurs threads. Tokio peut gérer un grand nombre de tâches sur un seul thread !&lt;br /&gt;
&lt;br /&gt;
On va donc spawn une nouvelle tâche pour chaque nouvelle connection. Notre main ressemble désormais à ça :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use tokio::net::TcpListener;&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    let listener = TcpListener::bind(&amp;quot;127.0.0.1:6379&amp;quot;).await.unwrap();&lt;br /&gt;
&lt;br /&gt;
    loop {&lt;br /&gt;
        let (socket, _) = listener.accept().await.unwrap();&lt;br /&gt;
        // A new task is spawned for each inbound socket. The socket is&lt;br /&gt;
        // moved to the new task and processed there.&lt;br /&gt;
        tokio::spawn(async move {&lt;br /&gt;
            process(socket).await;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2551</id>
		<title>Rust : Tokio</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2551"/>
		<updated>2024-08-19T14:35:19Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= A propos de cette page =&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du tuto d&#039;utilisation de l&#039;environnement Tokio : [https://tokio.rs/tokio/tutorial ici]&lt;br /&gt;
&lt;br /&gt;
= Présentation =&lt;br /&gt;
&lt;br /&gt;
Tokio est un runtime asynchrone pour Rust, et fournit les outils pour créer des applications asynchrone utilisant le réseau. Les composants principaux sont:&lt;br /&gt;
&lt;br /&gt;
* Un runtime multi-process pour l&#039;exécution de code asynchrone&lt;br /&gt;
* Une version asynchrone de la librairie standard&lt;br /&gt;
* Un grand ecosystème de librairies associées.&lt;br /&gt;
&lt;br /&gt;
Son rôle est avant tout d&#039;accélerer les applications dans le cas où elles sont dépendante d&#039;IO réseau en grande quantité, et pas dépendantes du CPU. Il n&#039;est pas non plus intéressant pour accéder à un grand nombre de fichiers simultanément car les OS n&#039;ont généralement pas d&#039;API asynchrone pour les filesystems.&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
Le but du tutoriel est de montrer comment implémenter un client et un serveur Redis, avec un petit ensemble de commandes Redis. Ce projet s&#039;appelle Mini-Redis et est [https://github.com/tokio-rs/mini-redis sur Github].&lt;br /&gt;
&lt;br /&gt;
Avec une version récente de Rust, on commence par le serveur mini-redis, qui nous permettra de tester notre client.&lt;br /&gt;
 cargo install mini-redis&lt;br /&gt;
 //Lancer le serveur&lt;br /&gt;
 mini-redis-server&lt;br /&gt;
 //Depuis un autre terminal&lt;br /&gt;
 mini-redis-cli get foo&lt;br /&gt;
 //Doit renvoyer (nil)&lt;br /&gt;
&lt;br /&gt;
= Hello Tokio =&lt;br /&gt;
&lt;br /&gt;
On commence par créer une application très simple, qui va se connecter au serveur mini-redis et passer la clef &amp;quot;hello&amp;quot; à &amp;quot;world&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 cargo new my-redis&lt;br /&gt;
 cd my-redis&lt;br /&gt;
 //Cargo.toml&lt;br /&gt;
 tokio = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;full&amp;quot;] }&lt;br /&gt;
 mini-redis = &amp;quot;0.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis dans le main.rs&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use mini_redis::{client, Result};&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() -&amp;gt; Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Open a connection to the mini-redis address.&lt;br /&gt;
    let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    // Set the key &amp;quot;hello&amp;quot; with value &amp;quot;world&amp;quot;&lt;br /&gt;
    client.set(&amp;quot;hello&amp;quot;, &amp;quot;world&amp;quot;.into()).await?;&lt;br /&gt;
&lt;br /&gt;
    // Get key &amp;quot;hello&amp;quot;&lt;br /&gt;
    let result = client.get(&amp;quot;hello&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;got value from the server; result={:?}&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En faisant un cargo run avec le serveur mini-redis fonctionnel dans un autre terminal, on a bien le résultat attendu.&lt;br /&gt;
&lt;br /&gt;
En détail :&lt;br /&gt;
 let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
Fonction fournie par mini-redis qui donne un handle sur un client tcp. L&#039;opération est asynchrone, mais le code ressemble à du code synchrone; on sait qu&#039;il est asynchrone grace à &amp;quot;await&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Programmation asynchrone ? ==&lt;br /&gt;
La plupart du temps, les programmes exécutés dans l&#039;ordre dans lequel ils sont écrits. Si une tâche prend du temps, le thread est bloqué le temps que ça termine, ce qui peut être le cas pour une connexion TCP via laquelle un échange de données a lieu. &lt;br /&gt;
&lt;br /&gt;
Avec la programmation asynchrone, les opération qui ne peuvent pas se terminer immédiatement vont en arrière plan. Le thread n&#039;est pas bloqué et peut faire d&#039;autres choses en attendant. Quand la tâche en arrière plan se termine, elle n&#039;est plus suspendue et peut continuer. La programmation asynchrone peut permettre d&#039;avoir des applications plus rapides, mais aussi bien plus compliquées. Elles forcent à gérer l&#039;état des différentes tâches du programme.&lt;br /&gt;
&lt;br /&gt;
== Compile-time green threading (j&#039;ai pas envie de traduire) ==&lt;br /&gt;
Rust implémente l&#039;asynchrone avec les mots async et await. Les fonctions qui font de l&#039;asynchrone sont marquées avec async:&lt;br /&gt;
 pub async fn connect&amp;lt;T: ToSocketAddrs&amp;gt;(addr: T) -&amp;gt; Result&amp;lt;Client&amp;gt; //etc&lt;br /&gt;
Les fonctions en &amp;quot;async fn&amp;quot; sont traduites par Rust lors de la compilation vers des routines asynchrones. N&#039;importe quel appel à .await dans la fonction asynchrone renvoie le contrôle des opérations au thread, afin qu&#039;il puisse faire autre chose pendant que les opérations se terminent en fond.&lt;br /&gt;
&lt;br /&gt;
== Utiliser async / await ==&lt;br /&gt;
Les fonctions asynchrones sont appellées comme n&#039;importe quelle autre fonction, mais ne renvoient pas une valeur représentant le résultat de leurs opérations. Elles renvoient une valeur qui représente l&#039;opération. Il faut utiliser .await sur cette valeur afin d&#039;obtenir le résultat. &lt;br /&gt;
Exemple: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
async fn say_world() {&lt;br /&gt;
    println!(&amp;quot;world&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    // Calling `say_world()` does not execute the body of `say_world()`.&lt;br /&gt;
    let op = say_world();&lt;br /&gt;
&lt;br /&gt;
    // This println! comes first&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Calling `.await` on `op` starts executing `say_world`.&lt;br /&gt;
    op.await;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie &lt;br /&gt;
 hello&lt;br /&gt;
 world&lt;br /&gt;
&lt;br /&gt;
La valeur de retour d&#039;une &amp;quot;async fn&amp;quot; est un type anonyme qui implément le trait &amp;quot;Future&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Fonction main asynchrone ==&lt;br /&gt;
La fonction main utilisée ici est différente de ce qu&#039;on trouve habituellement : elle est asynchrone et annotée avec &amp;quot;#[tokio::main]&amp;quot;. Une fonction async est nécessaire car on veut entrer dans un environnement asynchrone. Cependant, elle doit être exécutée par un runtime, qui contient le task scheduler, les I/O, les timers, etc. C&#039;est le rôle de la macro #[tokio::main].&lt;br /&gt;
&lt;br /&gt;
Cette macro sert à transformer notre &#039;async fn main&#039; en une &#039;fn main()&#039; synchrone qui initialize une instance du runtime et lance la fonction main asynchrone.&lt;br /&gt;
&lt;br /&gt;
Avec ça:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a en réalité&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
fn main() {&lt;br /&gt;
    let mut rt = tokio::runtime::Runtime::new().unwrap();&lt;br /&gt;
    rt.block_on(async {&lt;br /&gt;
        println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
    })&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features de Tokio ==&lt;br /&gt;
&lt;br /&gt;
Tokio a beaucoup de fonctionnalités : TCP, UDP, sockets unix, etc. Nous avons ici utilisé la feature &amp;quot;full&amp;quot; pour l&#039;exemple mais on peut en enlever pour alléger la compilation.&lt;br /&gt;
&lt;br /&gt;
= Spawning =&lt;br /&gt;
On bouge le code précendent en example.&lt;br /&gt;
 mkdir -p examples&lt;br /&gt;
 mv src/main.rs examples/hello-redis.rs&lt;br /&gt;
&lt;br /&gt;
== Sockets entrants ==&lt;br /&gt;
&lt;br /&gt;
On va avoir besoin de sockets TCP entrants sur le port 6379. On le fait avec tokio::net::TcpListener. &lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Many of Tokio&#039;s types are named the same as their synchronous equivalent in the Rust standard library. When it makes sense, Tokio exposes the same APIs as std but using async fn.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2550</id>
		<title>Rust : Tokio</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2550"/>
		<updated>2024-08-19T14:34:09Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= A propos de cette page =&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du tuto d&#039;utilisation de l&#039;environnement Tokio : [https://tokio.rs/tokio/tutorial ici]&lt;br /&gt;
&lt;br /&gt;
= Présentation =&lt;br /&gt;
&lt;br /&gt;
Tokio est un runtime asynchrone pour Rust, et fournit les outils pour créer des applications asynchrone utilisant le réseau. Les composants principaux sont:&lt;br /&gt;
&lt;br /&gt;
* Un runtime multi-process pour l&#039;exécution de code asynchrone&lt;br /&gt;
* Une version asynchrone de la librairie standard&lt;br /&gt;
* Un grand ecosystème de librairies associées.&lt;br /&gt;
&lt;br /&gt;
Son rôle est avant tout d&#039;accélerer les applications dans le cas où elles sont dépendante d&#039;IO réseau en grande quantité, et pas dépendantes du CPU. Il n&#039;est pas non plus intéressant pour accéder à un grand nombre de fichiers simultanément car les OS n&#039;ont généralement pas d&#039;API asynchrone pour les filesystems.&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
Le but du tutoriel est de montrer comment implémenter un client et un serveur Redis, avec un petit ensemble de commandes Redis. Ce projet s&#039;appelle Mini-Redis et est [https://github.com/tokio-rs/mini-redis sur Github].&lt;br /&gt;
&lt;br /&gt;
Avec une version récente de Rust, on commence par le serveur mini-redis, qui nous permettra de tester notre client.&lt;br /&gt;
 cargo install mini-redis&lt;br /&gt;
 //Lancer le serveur&lt;br /&gt;
 mini-redis-server&lt;br /&gt;
 //Depuis un autre terminal&lt;br /&gt;
 mini-redis-cli get foo&lt;br /&gt;
 //Doit renvoyer (nil)&lt;br /&gt;
&lt;br /&gt;
= Hello Tokio =&lt;br /&gt;
&lt;br /&gt;
On commence par créer une application très simple, qui va se connecter au serveur mini-redis et passer la clef &amp;quot;hello&amp;quot; à &amp;quot;world&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 cargo new my-redis&lt;br /&gt;
 cd my-redis&lt;br /&gt;
 //Cargo.toml&lt;br /&gt;
 tokio = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;full&amp;quot;] }&lt;br /&gt;
 mini-redis = &amp;quot;0.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis dans le main.rs&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use mini_redis::{client, Result};&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() -&amp;gt; Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Open a connection to the mini-redis address.&lt;br /&gt;
    let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    // Set the key &amp;quot;hello&amp;quot; with value &amp;quot;world&amp;quot;&lt;br /&gt;
    client.set(&amp;quot;hello&amp;quot;, &amp;quot;world&amp;quot;.into()).await?;&lt;br /&gt;
&lt;br /&gt;
    // Get key &amp;quot;hello&amp;quot;&lt;br /&gt;
    let result = client.get(&amp;quot;hello&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;got value from the server; result={:?}&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En faisant un cargo run avec le serveur mini-redis fonctionnel dans un autre terminal, on a bien le résultat attendu.&lt;br /&gt;
&lt;br /&gt;
En détail :&lt;br /&gt;
 let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
Fonction fournie par mini-redis qui donne un handle sur un client tcp. L&#039;opération est asynchrone, mais le code ressemble à du code synchrone; on sait qu&#039;il est asynchrone grace à &amp;quot;await&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Programmation asynchrone ? ==&lt;br /&gt;
La plupart du temps, les programmes exécutés dans l&#039;ordre dans lequel ils sont écrits. Si une tâche prend du temps, le thread est bloqué le temps que ça termine, ce qui peut être le cas pour une connexion TCP via laquelle un échange de données a lieu. &lt;br /&gt;
&lt;br /&gt;
Avec la programmation asynchrone, les opération qui ne peuvent pas se terminer immédiatement vont en arrière plan. Le thread n&#039;est pas bloqué et peut faire d&#039;autres choses en attendant. Quand la tâche en arrière plan se termine, elle n&#039;est plus suspendue et peut continuer. La programmation asynchrone peut permettre d&#039;avoir des applications plus rapides, mais aussi bien plus compliquées. Elles forcent à gérer l&#039;état des différentes tâches du programme.&lt;br /&gt;
&lt;br /&gt;
== Compile-time green threading (j&#039;ai pas envie de traduire) ==&lt;br /&gt;
Rust implémente l&#039;asynchrone avec les mots async et await. Les fonctions qui font de l&#039;asynchrone sont marquées avec async:&lt;br /&gt;
 pub async fn connect&amp;lt;T: ToSocketAddrs&amp;gt;(addr: T) -&amp;gt; Result&amp;lt;Client&amp;gt; //etc&lt;br /&gt;
Les fonctions en &amp;quot;async fn&amp;quot; sont traduites par Rust lors de la compilation vers des routines asynchrones. N&#039;importe quel appel à .await dans la fonction asynchrone renvoie le contrôle des opérations au thread, afin qu&#039;il puisse faire autre chose pendant que les opérations se terminent en fond.&lt;br /&gt;
&lt;br /&gt;
== Utiliser async / await ==&lt;br /&gt;
Les fonctions asynchrones sont appellées comme n&#039;importe quelle autre fonction, mais ne renvoient pas une valeur représentant le résultat de leurs opérations. Elles renvoient une valeur qui représente l&#039;opération. Il faut utiliser .await sur cette valeur afin d&#039;obtenir le résultat. &lt;br /&gt;
Exemple: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
async fn say_world() {&lt;br /&gt;
    println!(&amp;quot;world&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    // Calling `say_world()` does not execute the body of `say_world()`.&lt;br /&gt;
    let op = say_world();&lt;br /&gt;
&lt;br /&gt;
    // This println! comes first&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Calling `.await` on `op` starts executing `say_world`.&lt;br /&gt;
    op.await;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie &lt;br /&gt;
 hello&lt;br /&gt;
 world&lt;br /&gt;
&lt;br /&gt;
La valeur de retour d&#039;une &amp;quot;async fn&amp;quot; est un type anonyme qui implément le trait &amp;quot;Future&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Fonction main asynchrone ==&lt;br /&gt;
La fonction main utilisée ici est différente de ce qu&#039;on trouve habituellement : elle est asynchrone et annotée avec &amp;quot;#[tokio::main]&amp;quot;. Une fonction async est nécessaire car on veut entrer dans un environnement asynchrone. Cependant, elle doit être exécutée par un runtime, qui contient le task scheduler, les I/O, les timers, etc. C&#039;est le rôle de la macro #[tokio::main].&lt;br /&gt;
&lt;br /&gt;
Cette macro sert à transformer notre &#039;async fn main&#039; en une &#039;fn main()&#039; synchrone qui initialize une instance du runtime et lance la fonction main asynchrone.&lt;br /&gt;
&lt;br /&gt;
Avec ça:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a en réalité&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
fn main() {&lt;br /&gt;
    let mut rt = tokio::runtime::Runtime::new().unwrap();&lt;br /&gt;
    rt.block_on(async {&lt;br /&gt;
        println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
    })&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features de Tokio ==&lt;br /&gt;
&lt;br /&gt;
Tokio a beaucoup de fonctionnalités : TCP, UDP, sockets unix, etc. Nous avons ici utilisé la feature &amp;quot;full&amp;quot; pour l&#039;exemple mais on peut en enlever pour alléger la compilation.&lt;br /&gt;
&lt;br /&gt;
= Spawning =&lt;br /&gt;
On bouge le code précendent en example.&lt;br /&gt;
 mkdir -p examples&lt;br /&gt;
 mv src/main.rs examples/hello-redis.rs&lt;br /&gt;
&lt;br /&gt;
== Sockets entrants ==&lt;br /&gt;
&lt;br /&gt;
On va avoir besoin de sockets TCP entrants sur le port 6379. On le fait avec tokio::net::TcpListener. &lt;br /&gt;
&amp;lt;quote&amp;gt;Many of Tokio&#039;s types are named the same as their synchronous equivalent in the Rust standard library. When it makes sense, Tokio exposes the same APIs as std but using async fn.&amp;lt;/quote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2549</id>
		<title>Rust : Tokio</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2549"/>
		<updated>2024-08-19T14:33:51Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= A propos de cette page =&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du tuto d&#039;utilisation de l&#039;environnement Tokio : [https://tokio.rs/tokio/tutorial ici]&lt;br /&gt;
&lt;br /&gt;
= Présentation =&lt;br /&gt;
&lt;br /&gt;
Tokio est un runtime asynchrone pour Rust, et fournit les outils pour créer des applications asynchrone utilisant le réseau. Les composants principaux sont:&lt;br /&gt;
&lt;br /&gt;
* Un runtime multi-process pour l&#039;exécution de code asynchrone&lt;br /&gt;
* Une version asynchrone de la librairie standard&lt;br /&gt;
* Un grand ecosystème de librairies associées.&lt;br /&gt;
&lt;br /&gt;
Son rôle est avant tout d&#039;accélerer les applications dans le cas où elles sont dépendante d&#039;IO réseau en grande quantité, et pas dépendantes du CPU. Il n&#039;est pas non plus intéressant pour accéder à un grand nombre de fichiers simultanément car les OS n&#039;ont généralement pas d&#039;API asynchrone pour les filesystems.&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
Le but du tutoriel est de montrer comment implémenter un client et un serveur Redis, avec un petit ensemble de commandes Redis. Ce projet s&#039;appelle Mini-Redis et est [https://github.com/tokio-rs/mini-redis sur Github].&lt;br /&gt;
&lt;br /&gt;
Avec une version récente de Rust, on commence par le serveur mini-redis, qui nous permettra de tester notre client.&lt;br /&gt;
 cargo install mini-redis&lt;br /&gt;
 //Lancer le serveur&lt;br /&gt;
 mini-redis-server&lt;br /&gt;
 //Depuis un autre terminal&lt;br /&gt;
 mini-redis-cli get foo&lt;br /&gt;
 //Doit renvoyer (nil)&lt;br /&gt;
&lt;br /&gt;
= Hello Tokio =&lt;br /&gt;
&lt;br /&gt;
On commence par créer une application très simple, qui va se connecter au serveur mini-redis et passer la clef &amp;quot;hello&amp;quot; à &amp;quot;world&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 cargo new my-redis&lt;br /&gt;
 cd my-redis&lt;br /&gt;
 //Cargo.toml&lt;br /&gt;
 tokio = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;full&amp;quot;] }&lt;br /&gt;
 mini-redis = &amp;quot;0.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis dans le main.rs&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use mini_redis::{client, Result};&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() -&amp;gt; Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Open a connection to the mini-redis address.&lt;br /&gt;
    let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    // Set the key &amp;quot;hello&amp;quot; with value &amp;quot;world&amp;quot;&lt;br /&gt;
    client.set(&amp;quot;hello&amp;quot;, &amp;quot;world&amp;quot;.into()).await?;&lt;br /&gt;
&lt;br /&gt;
    // Get key &amp;quot;hello&amp;quot;&lt;br /&gt;
    let result = client.get(&amp;quot;hello&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;got value from the server; result={:?}&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En faisant un cargo run avec le serveur mini-redis fonctionnel dans un autre terminal, on a bien le résultat attendu.&lt;br /&gt;
&lt;br /&gt;
En détail :&lt;br /&gt;
 let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
Fonction fournie par mini-redis qui donne un handle sur un client tcp. L&#039;opération est asynchrone, mais le code ressemble à du code synchrone; on sait qu&#039;il est asynchrone grace à &amp;quot;await&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Programmation asynchrone ? ==&lt;br /&gt;
La plupart du temps, les programmes exécutés dans l&#039;ordre dans lequel ils sont écrits. Si une tâche prend du temps, le thread est bloqué le temps que ça termine, ce qui peut être le cas pour une connexion TCP via laquelle un échange de données a lieu. &lt;br /&gt;
&lt;br /&gt;
Avec la programmation asynchrone, les opération qui ne peuvent pas se terminer immédiatement vont en arrière plan. Le thread n&#039;est pas bloqué et peut faire d&#039;autres choses en attendant. Quand la tâche en arrière plan se termine, elle n&#039;est plus suspendue et peut continuer. La programmation asynchrone peut permettre d&#039;avoir des applications plus rapides, mais aussi bien plus compliquées. Elles forcent à gérer l&#039;état des différentes tâches du programme.&lt;br /&gt;
&lt;br /&gt;
== Compile-time green threading (j&#039;ai pas envie de traduire) ==&lt;br /&gt;
Rust implémente l&#039;asynchrone avec les mots async et await. Les fonctions qui font de l&#039;asynchrone sont marquées avec async:&lt;br /&gt;
 pub async fn connect&amp;lt;T: ToSocketAddrs&amp;gt;(addr: T) -&amp;gt; Result&amp;lt;Client&amp;gt; //etc&lt;br /&gt;
Les fonctions en &amp;quot;async fn&amp;quot; sont traduites par Rust lors de la compilation vers des routines asynchrones. N&#039;importe quel appel à .await dans la fonction asynchrone renvoie le contrôle des opérations au thread, afin qu&#039;il puisse faire autre chose pendant que les opérations se terminent en fond.&lt;br /&gt;
&lt;br /&gt;
== Utiliser async / await ==&lt;br /&gt;
Les fonctions asynchrones sont appellées comme n&#039;importe quelle autre fonction, mais ne renvoient pas une valeur représentant le résultat de leurs opérations. Elles renvoient une valeur qui représente l&#039;opération. Il faut utiliser .await sur cette valeur afin d&#039;obtenir le résultat. &lt;br /&gt;
Exemple: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
async fn say_world() {&lt;br /&gt;
    println!(&amp;quot;world&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    // Calling `say_world()` does not execute the body of `say_world()`.&lt;br /&gt;
    let op = say_world();&lt;br /&gt;
&lt;br /&gt;
    // This println! comes first&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Calling `.await` on `op` starts executing `say_world`.&lt;br /&gt;
    op.await;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie &lt;br /&gt;
 hello&lt;br /&gt;
 world&lt;br /&gt;
&lt;br /&gt;
La valeur de retour d&#039;une &amp;quot;async fn&amp;quot; est un type anonyme qui implément le trait &amp;quot;Future&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Fonction main asynchrone ==&lt;br /&gt;
La fonction main utilisée ici est différente de ce qu&#039;on trouve habituellement : elle est asynchrone et annotée avec &amp;quot;#[tokio::main]&amp;quot;. Une fonction async est nécessaire car on veut entrer dans un environnement asynchrone. Cependant, elle doit être exécutée par un runtime, qui contient le task scheduler, les I/O, les timers, etc. C&#039;est le rôle de la macro #[tokio::main].&lt;br /&gt;
&lt;br /&gt;
Cette macro sert à transformer notre &#039;async fn main&#039; en une &#039;fn main()&#039; synchrone qui initialize une instance du runtime et lance la fonction main asynchrone.&lt;br /&gt;
&lt;br /&gt;
Avec ça:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a en réalité&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
fn main() {&lt;br /&gt;
    let mut rt = tokio::runtime::Runtime::new().unwrap();&lt;br /&gt;
    rt.block_on(async {&lt;br /&gt;
        println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
    })&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features de Tokio ==&lt;br /&gt;
&lt;br /&gt;
Tokio a beaucoup de fonctionnalités : TCP, UDP, sockets unix, etc. Nous avons ici utilisé la feature &amp;quot;full&amp;quot; pour l&#039;exemple mais on peut en enlever pour alléger la compilation.&lt;br /&gt;
&lt;br /&gt;
= Spawning =&lt;br /&gt;
On bouge le code précendent en example.&lt;br /&gt;
 mkdir -p examples&lt;br /&gt;
 mv src/main.rs examples/hello-redis.rs&lt;br /&gt;
&lt;br /&gt;
== Sockets entrants ==&lt;br /&gt;
&lt;br /&gt;
On va avoir besoin de sockets TCP entrants sur le port 6379. On le fait avec tokio::net::TcpListener. &lt;br /&gt;
&amp;gt;  Many of Tokio&#039;s types are named the same as their synchronous equivalent in the Rust standard library. When it makes sense, Tokio exposes the same APIs as std but using async fn.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2548</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2548"/>
		<updated>2024-08-19T14:25:12Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Disclaimer ==&lt;br /&gt;
Ceci est mon wiki personnel, rédigé au cours de mes études et de ma carrière; je n&#039;ai pas la prétention que tout y soit exact.&lt;br /&gt;
Toutes les pages utiles sont en lien sur la présente page de sommaire. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes personnelles, que je ne mettrait à jour que si j&#039;en ressens le besoin. Il peut parfois s&#039;agir de traduction d&#039;articles existants, si c&#039;est le cas, le lien original est en général au sommet de la page.&lt;br /&gt;
&lt;br /&gt;
[[Logo du site]]&lt;br /&gt;
&lt;br /&gt;
Justine&lt;br /&gt;
&lt;br /&gt;
==Autres / Aide==&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Help:Formatting/fr Aide au formatage]&lt;br /&gt;
*[https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf Aide au langage markdown (pour Git)]&lt;br /&gt;
*[[Portfolio - Notes en vrac]]&lt;br /&gt;
*[[ITIL]]&lt;br /&gt;
*[[Vocabulaire &amp;amp; notions diverses]]&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Extension:SyntaxHighlight L&#039;extension SyntaxHighlight]&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheets==&lt;br /&gt;
* [[Idées diverses de gain de temps]]&lt;br /&gt;
* [[Raccourcis shell bash]]&lt;br /&gt;
* [[Raccourcis Vim]]&lt;br /&gt;
* [[Cs: Ansible]]&lt;br /&gt;
* [[CS : FirewallD]]&lt;br /&gt;
* [[Cs : Vim]]&lt;br /&gt;
* [[Cs:_Tips_Linux]]&lt;br /&gt;
* [[Cs: Git]]&lt;br /&gt;
* [[Cs: Pacman]]&lt;br /&gt;
* [[CS : lsof]]&lt;br /&gt;
* [[CS : SecuriteLinux]]&lt;br /&gt;
* [[Mémo_Apache|Mémo Apache]] &lt;br /&gt;
* [[Memo_nginx|Memo nginx]]   &lt;br /&gt;
* [[Mémo_Openssl|Mémo Openssl]]&lt;br /&gt;
&lt;br /&gt;
==Ansible== &lt;br /&gt;
* [[Ansible|Ansible]] &lt;br /&gt;
** [[Ansible : remplacement récursif de texte]]&lt;br /&gt;
** [[Ansible : Filtres]]&lt;br /&gt;
** [[Ansible : playbook avancé, avec handlers et templates]]&lt;br /&gt;
** [[Ansible : Quirks]]&lt;br /&gt;
** [[Ansible et Windows]]&lt;br /&gt;
** [[Ansible : awx-cli]]&lt;br /&gt;
** [[Ansible : Collections]]&lt;br /&gt;
** [[Ansible : sous-commandes]]&lt;br /&gt;
** [[Ansible : VMWare]]&lt;br /&gt;
&lt;br /&gt;
==Conteneurs== &lt;br /&gt;
[[Fichier:Moby-logo-small.png|90px]]  [[Fichier:K8s-small.png|90px]]&lt;br /&gt;
* [[Docker|Docker]] &lt;br /&gt;
* [[Docker-compose]]&lt;br /&gt;
* [[Traefik]]&lt;br /&gt;
* [[Docker swarm]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[LXD]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;/span&amp;gt;Systèmes&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt; &#039;&#039;&#039;[[File:869px-Tux.svg.png|40x49px|869px-Tux.svg.png]]&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
* [[Additions_Invité_sur_Linux|Additions Invité sur Linux]] &lt;br /&gt;
* [[Analyse de logs]]&lt;br /&gt;
** [[Rsyslog]]&lt;br /&gt;
** [[YAML]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
* [[Apache Tomcat]]&lt;br /&gt;
* [[Appels Système (syscall)]]&lt;br /&gt;
* [[APT]]&lt;br /&gt;
* [[Architecture système]]&lt;br /&gt;
* [[Asterisk|Asterisk]] &lt;br /&gt;
* [[Authentification - PAM]] &lt;br /&gt;
* [[Autostart]]&lt;br /&gt;
* [[Awk]]&lt;br /&gt;
* [[Bases_de_données|Bases de données]] &lt;br /&gt;
* [[Bind9]]&lt;br /&gt;
* [[Ceph]]&lt;br /&gt;
* [[Certbot]]&lt;br /&gt;
* [[Cgroups]]&lt;br /&gt;
* [[CheckMK]]&lt;br /&gt;
* [[Chronyd]]&lt;br /&gt;
* [[Cloud Computing]]&lt;br /&gt;
* [[Commandes analyse maillog]]&lt;br /&gt;
* [[Commandes de test de charge]]&lt;br /&gt;
* [[Commandes_Linux|Commandes Linux]] &lt;br /&gt;
* [[Convertir des .deb en .rpm avec alien]]&lt;br /&gt;
* [[Cryptographie|Cryptographie]] &lt;br /&gt;
** [[Protocole ACME]]&lt;br /&gt;
* [[Droits|Droits]] &lt;br /&gt;
* [[Environnement utilisateur]]&lt;br /&gt;
* [[Filesystems|Filesystems]] &lt;br /&gt;
** [[Surveillance de disques]]&lt;br /&gt;
* [[Firefox]]&lt;br /&gt;
* [[Fstab]]&lt;br /&gt;
* [[Gestion_de_paquets|Gestion de paquets]] &lt;br /&gt;
** [[Unattended-upgrades]]&lt;br /&gt;
* [[Grafana et prometheus]]&lt;br /&gt;
* [[Groupwares|Groupwares]] &lt;br /&gt;
* [[HAProxy]]&lt;br /&gt;
* [[Informations Système sous Linux]]&lt;br /&gt;
* [[Juju]]&lt;br /&gt;
* [[KeepaliveD]]&lt;br /&gt;
* [[Kernel Tuning]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[Kubernetes (obsolete)]]&lt;br /&gt;
* [[LAMP|LAMP]]&lt;br /&gt;
* [[LDAP]] &lt;br /&gt;
* [[Linux|Linux / Systèmes]] &lt;br /&gt;
* [[Linux : Permissions]]&lt;br /&gt;
* [[Attributs_Linux_étendus|Attributs Linux étendus]] &lt;br /&gt;
* [[Linux : Mémoire, RAM, swap]]&lt;br /&gt;
* [[Linux : Gestion de la résolution]]&lt;br /&gt;
* [[Logrotate]]&lt;br /&gt;
* [[Make]]&lt;br /&gt;
* [[Messagerie : Risques]]&lt;br /&gt;
* [[OAuth]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Pile son]]&lt;br /&gt;
* [[Postfix]]&lt;br /&gt;
* [[Processus et Appels Système]]&lt;br /&gt;
* [[Proxmox|Proxmox]] &lt;br /&gt;
* [[Raccourcis_shell_bash|Raccourcis shell bash]] &lt;br /&gt;
* [[Raccourcis_Vim|Raccourcis Vim]] &lt;br /&gt;
* [[Red Hat : Satellite 6]]&lt;br /&gt;
* [[Reverse Proxy Nginx]]&lt;br /&gt;
* [[Rsync,_SFTP,_RoboCopy|Rsync, SFTP, RoboCopy]] &lt;br /&gt;
* [[Screen]]&lt;br /&gt;
* [[Sed]]&lt;br /&gt;
* [[Sendmail]]&lt;br /&gt;
* [[Sshfs]]&lt;br /&gt;
* [[Sockets]]&lt;br /&gt;
* [[Steam cmd]]&lt;br /&gt;
* [[Stockage|Stockage]] &lt;br /&gt;
** [[LVM : opérations courantes]]&lt;br /&gt;
** [[Iscsiadm]]&lt;br /&gt;
** [[IscsiAdm + Multipath]]&lt;br /&gt;
* [[Structure de dossiers Linux]]&lt;br /&gt;
* [[Supervision]]&lt;br /&gt;
* [[Systemd]]&lt;br /&gt;
** [[Timesyncd]]&lt;br /&gt;
* [[Utilisateurs|Utilisateurs]] &lt;br /&gt;
* [[Varnish]]&lt;br /&gt;
* [[VMWare|VMWare]] &lt;br /&gt;
** [[VMWare : Utilisation de PowerCLI]]&lt;br /&gt;
** [[VMWare : Autres notions]]&lt;br /&gt;
&lt;br /&gt;
=== Spécificités Windows [[Fichier:Winlogo.png|50px]] === &lt;br /&gt;
&lt;br /&gt;
* [[Services_Windows|Services Windows]] &lt;br /&gt;
** [[Active_Directory|Active Directory]]&lt;br /&gt;
** [[WSUS_et_Core|WSUS et Core]] &lt;br /&gt;
** [[PowerShell|PowerShell]] &lt;br /&gt;
** [[GPO|GPO]] &lt;br /&gt;
** [[Exchange|Exchange]] &lt;br /&gt;
** [[Exchange pour de vrai]]&lt;br /&gt;
** [[Windows : Outils à connaître]]&lt;br /&gt;
** [[Powershell : Active Directory]]&lt;br /&gt;
** [[AD : intégration Linux]]&lt;br /&gt;
* [[Création de tâches planifiée]]&lt;br /&gt;
* [[Gestion d&#039;accès chez Microsoft]]&lt;br /&gt;
* [[Smbclient]]&lt;br /&gt;
* [[Commandes CMD utiles]]&lt;br /&gt;
&lt;br /&gt;
== Réseaux  [[File:Computer-networking.jpg|middle|77x60px|Computer-networking.jpg]] ==&lt;br /&gt;
&lt;br /&gt;
*[[DHCPv4|DHCPv4]] &lt;br /&gt;
*[[DHCPv6|DHCPv6]] &lt;br /&gt;
*[[DNS|DNS]] &lt;br /&gt;
*[[Ethernet|Ethernet]] &lt;br /&gt;
**[[FireWall_:_CheckPoint|FireWall : CheckPoint]]   &lt;br /&gt;
*[[Firewall|Firewall]] &lt;br /&gt;
**[[Firewall_:_Juniper|Firewall : Juniper]] &lt;br /&gt;
**[[FireWall : CheckPoint]]&lt;br /&gt;
**[[Firewalld]]&lt;br /&gt;
**[[IPTables]]&lt;br /&gt;
**[[Nftables]]&lt;br /&gt;
*[[Gestion_de_parc|Gestion de parc]] &lt;br /&gt;
*[[GlobalProtect sur linux]]&lt;br /&gt;
*[[ICMPv4|ICMPv4]] &lt;br /&gt;
*[[IPv4|IPv4]] &lt;br /&gt;
*[[IPv6|IPv6]] &lt;br /&gt;
* [[Knot DNS]]&lt;br /&gt;
*[[Liste_des_ports|Liste des ports]] &lt;br /&gt;
*[[Modèle_OSI_et_TCP/IP|Modèle OSI et TCP/IP]] &lt;br /&gt;
*[[NAT/PAT|NAT/PAT]] &lt;br /&gt;
*[[NetCat|NetCat]] &lt;br /&gt;
*[[Nmap]]&lt;br /&gt;
*[[Protocoles|Protocoles]] &lt;br /&gt;
*[[Proxy|Proxy]] &lt;br /&gt;
*[[Reseau|Reseau]] &lt;br /&gt;
*[[SNMP|SNMP]] &lt;br /&gt;
*[[SSH|SSH]] &lt;br /&gt;
*[[SSO|SSO]] &lt;br /&gt;
*[[TCP_&amp;amp;_UDP|TCP &amp;amp; UDP]] &lt;br /&gt;
*[[Tor]]&lt;br /&gt;
*[[VLAN|VLAN]] &lt;br /&gt;
*[[VPN|VPN]]&lt;br /&gt;
* [[Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Cisco NetAcad [[File:1200px-Cisco logo blue 2016.svg.png|middle|75x50px|1200px-Cisco logo blue 2016.svg.png]] ===&lt;br /&gt;
&lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_1|Cisco : R&amp;amp;S 1]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_2|Cisco : R&amp;amp;S 2]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_3|Cisco : R&amp;amp;S 3]]&lt;br /&gt;
&lt;br /&gt;
== Web ==&lt;br /&gt;
*[[CGI]]&lt;br /&gt;
*[[Websockets]]&lt;br /&gt;
&lt;br /&gt;
== Cybersécurité [[File:Padlock.png|Padlock.png|77x60px]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Cybersécurité|Cybersécurité : notions de base]] &lt;br /&gt;
*[[Cybersécurité_:_keepass|Cybersécurité : keepass]] &lt;br /&gt;
*[[Metasploit|Metasploit]] &lt;br /&gt;
*[[Cybersécurité_(Kali)_:_Crack_de_mots_de_passe_avec_Hydra|Cybersécurité (Kali) : Crack de mots de passe avec Hydra]] &lt;br /&gt;
*[[Cybersécurité_:_Documentation|Cybersécurité : Documentation]] &lt;br /&gt;
*[[Cybersécurité_:_Lynis|Cybersécurité : Lynis]] &lt;br /&gt;
*[[Cybersécurité_:_Graylog|Cybersécurité : Graylog]] &lt;br /&gt;
*[[Cybersécurité_:_Liens|Cybersécurité : Liens]]&lt;br /&gt;
*[[Messagerie : Risques]] &lt;br /&gt;
*[[Outils Divers]]&lt;br /&gt;
*[[Tests de charge]]&lt;br /&gt;
*[[Honeypot]]&lt;br /&gt;
* [[Shodan]]&lt;br /&gt;
* [https://github.com/certsocietegenerale/IRM/tree/master/EN Des méthodes simples d&#039;analyse]&lt;br /&gt;
* [[Ffuf : Fuzz Faster U Fool]]&lt;br /&gt;
* [[PGP - GPG]]&lt;br /&gt;
&lt;br /&gt;
=== HackTheBox Academy ===&lt;br /&gt;
Mes notes concernant mon suivi de modules sur HTB Academy - elles sont possiblement en anglais.&lt;br /&gt;
* [[HTBA : Active Directory Intro]]&lt;br /&gt;
&lt;br /&gt;
== Gestion de projet [[File:Gdpimage.png|middle|96x64px|Gdpimage.png]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Gestion_de_projet|Gestion de projet]] &lt;br /&gt;
*[[Outils_et_Méthodologie_de_Résolution_de_Problèmes_(MRP)|Outils et Méthodologie de Résolution de Problèmes (MRP)]] &lt;br /&gt;
*[[GDP_Agile_avec_SCRUM|GDP Agile avec SCRUM]]&lt;br /&gt;
&lt;br /&gt;
== Scripting / Programmation [[File:Python-7be70baaac.png|middle|69x69px|Python-7be70baaac.png]][[File:Bashlogo.png|middle|74x74px|Bashlogo.png]] ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
**[[Python : APIs]]&lt;br /&gt;
**[[Python : argparse]]&lt;br /&gt;
**[[Python : Black]]&lt;br /&gt;
**[[Python : coloration de texte]]&lt;br /&gt;
**[[Python_:_Context_Manager|Python : Context Manager]] &lt;br /&gt;
**[[Python : Dataclasses]]&lt;br /&gt;
**[[Python : datetimes]]&lt;br /&gt;
**[[Python : dictionnaires]]&lt;br /&gt;
**[[Python : Ensembles]]&lt;br /&gt;
**[[Python : Fichiers de config]]&lt;br /&gt;
**[[Python : Flask]]&lt;br /&gt;
***[[Python : Flask et SocketIO]]&lt;br /&gt;
**[[Python_:_Fonctions|Python : Fonctions]] &lt;br /&gt;
**[[Python : Fonctions de l&#039;interpréteur]]&lt;br /&gt;
**[[Python_:_Les_fichiers|Python : Les fichiers]]  &lt;br /&gt;
**[[Python : fstrings]] &lt;br /&gt;
**[[Python : Interactions avec Windows]]&lt;br /&gt;
**[[Python_:_Listes|Python : Listes]] &lt;br /&gt;
** [[Python : Locust (Tests de charge)]]&lt;br /&gt;
**[[Python_:_Méthodes_de_chaines|Python : Méthodes de chaines]] &lt;br /&gt;
**[[Python_:_misc|Python : misc]] &lt;br /&gt;
**[[Python : Opérateurs]]&lt;br /&gt;
**[[Python : Opérateur Binaires]]&lt;br /&gt;
**[[Python : os.walk()]]&lt;br /&gt;
**[[Python_-_PEP8|Python - PEP8]] &lt;br /&gt;
**[[Python : Pipenv]]&lt;br /&gt;
**[[Python : Pygame]]&lt;br /&gt;
**[[Python : PySimpleGUI]]&lt;br /&gt;
**[[Python_:_Programmation_Asynchrone|Python : Programmation Asynchrone]] &lt;br /&gt;
**[[Python_:_Programmation_système|Python : Programmation système]] &lt;br /&gt;
**[[Python_:_Réseau|Python : Réseau]] &lt;br /&gt;
**[[Python : simuler des inputs]]&lt;br /&gt;
**[[Python_:_Tkinter|Python : Tkinter]] &lt;br /&gt;
**[[Python : Virtualenv]]&lt;br /&gt;
**[[Python_:_Vocabulaire|Python : Vocabulaire]] &lt;br /&gt;
**[[Python_:_with_et_les_gestionnaires_de_contexte|Python : with et les gestionnaires de contexte]]&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
* Des notes diverses sur le langage, notamment des crates qui peuvent servir : [[Rust: Divers]]&lt;br /&gt;
* [[Rust : Tokio]]&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du livre officiel de Rust : [https://doc.rust-lang.org/book/ The Rust book] dans l&#039;ordre des chapitres.&lt;br /&gt;
&lt;br /&gt;
* [[Rust : Structs]]&lt;br /&gt;
* [[Rust: enums]]&lt;br /&gt;
* [[Rust : match]]&lt;br /&gt;
* [[Rust : if let]]&lt;br /&gt;
* [[Rust : packages]]&lt;br /&gt;
* [[Rust : Common collections]]&lt;br /&gt;
* [[Rust : Error handling]]&lt;br /&gt;
* [[Rust : génériques, traits, lifetimes]]&lt;br /&gt;
* [[Rust : tests automatisés]]&lt;br /&gt;
* [[Rust : iterateurs]]&lt;br /&gt;
(Le reste sur mon gitea).&lt;br /&gt;
&lt;br /&gt;
Autres notes:&lt;br /&gt;
* [[Rust : Debug avec GDB]]&lt;br /&gt;
* [[Rust : serde]]&lt;br /&gt;
* [[Rust : Display implementation and Rc + RefCell use demo]]&lt;br /&gt;
* [[Rust : async]]&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
**[[Bash|Bash : Anciennes notes]] &lt;br /&gt;
**[[Bash_:_Codes_de_retour|Bash : Codes de retour]] &lt;br /&gt;
**[[Bash_:_Fonctions|Bash : Fonctions]] &lt;br /&gt;
**[[Bash_:_généralités|Bash : généralités]] &lt;br /&gt;
**[[Bash_:_Paramètres_de_position|Bash : Paramètres de position]] &lt;br /&gt;
**[[Bash_:_Pattern_Matching|Bash : Pattern Matching]]  &lt;br /&gt;
**[[Bash_:_Tableaux|Bash : Tableaux]] &lt;br /&gt;
**[[Bash_:_Traitement_sur_les_chaînes|Bash : Traitement sur les chaînes]] &lt;br /&gt;
**[[Zsh]]&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
**[[PowerShell|PowerShell]] &lt;br /&gt;
**[[PowerShell_:_Scripting|PowerShell : Scripting]] &lt;br /&gt;
**[[PowerShell_:_scripts_complets|PowerShell : scripts complets]] &lt;br /&gt;
**[[PowerShell_:_Exporter_une_boîte_en_pst|PowerShell : Exporter une boîte en pst]]   &lt;br /&gt;
&lt;br /&gt;
=== Généralités ===&lt;br /&gt;
**[[Expressions_Régulières|Expressions Régulières]]&lt;br /&gt;
**[[RPC / REST]]&lt;br /&gt;
&lt;br /&gt;
=== Assembleur ===&lt;br /&gt;
* [[Assembleur|Assembleur (généralités)]]&lt;br /&gt;
* [[Assembleur : boot sector]]&lt;br /&gt;
&lt;br /&gt;
=== Langage C ===&lt;br /&gt;
** [[C : bases]]&lt;br /&gt;
**[[Langage C]]&lt;br /&gt;
&lt;br /&gt;
=== Golang ===&lt;br /&gt;
**[[Golang : bases]]&lt;br /&gt;
&lt;br /&gt;
== Hors-Sujet ==&lt;br /&gt;
&lt;br /&gt;
*[[Coaching_:_CV|Coaching : CV]]&lt;br /&gt;
*[[Droit|Droit]] &lt;br /&gt;
*[[Management|Management]] &lt;br /&gt;
*[[Ondes_radio|Ondes radio]]&lt;br /&gt;
*[[Vérités et contre-vérités]]&lt;br /&gt;
*[[Questions Sysadmin]]&lt;br /&gt;
*[[Comprendre comment fonctionne son organisation]]&lt;br /&gt;
&lt;br /&gt;
=== Musique ===&lt;br /&gt;
*[[Musique modale, musique tonale]]&lt;br /&gt;
*[[Gamme pentatonique]]&lt;br /&gt;
&lt;br /&gt;
== Jouer sur Linux ==&lt;br /&gt;
* [[Steam]]&lt;br /&gt;
* [[Optimus]]&lt;br /&gt;
&lt;br /&gt;
== Notes Personnelles ==&lt;br /&gt;
&lt;br /&gt;
Cette section contient des notes plus personnelles et moins rédigées, laissées là pour référence future.&lt;br /&gt;
&lt;br /&gt;
*[[Secure boot &amp;amp; pilotes nVIdia]]&lt;br /&gt;
*[[Dual boot et ennuis divers...]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;C’est pour ça : j’lis jamais rien. C’est un vrai piège à cons c’t’histoire-là. En plus j’sais pas lire.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2547</id>
		<title>Rust : Tokio</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2547"/>
		<updated>2024-08-19T14:24:30Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= A propos de cette page =&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du tuto d&#039;utilisation de l&#039;environnement Tokio : [https://tokio.rs/tokio/tutorial ici]&lt;br /&gt;
&lt;br /&gt;
= Présentation =&lt;br /&gt;
&lt;br /&gt;
Tokio est un runtime asynchrone pour Rust, et fournit les outils pour créer des applications asynchrone utilisant le réseau. Les composants principaux sont:&lt;br /&gt;
&lt;br /&gt;
* Un runtime multi-process pour l&#039;exécution de code asynchrone&lt;br /&gt;
* Une version asynchrone de la librairie standard&lt;br /&gt;
* Un grand ecosystème de librairies associées.&lt;br /&gt;
&lt;br /&gt;
Son rôle est avant tout d&#039;accélerer les applications dans le cas où elles sont dépendante d&#039;IO réseau en grande quantité, et pas dépendantes du CPU. Il n&#039;est pas non plus intéressant pour accéder à un grand nombre de fichiers simultanément car les OS n&#039;ont généralement pas d&#039;API asynchrone pour les filesystems.&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
Le but du tutoriel est de montrer comment implémenter un client et un serveur Redis, avec un petit ensemble de commandes Redis. Ce projet s&#039;appelle Mini-Redis et est [https://github.com/tokio-rs/mini-redis sur Github].&lt;br /&gt;
&lt;br /&gt;
Avec une version récente de Rust, on commence par le serveur mini-redis, qui nous permettra de tester notre client.&lt;br /&gt;
 cargo install mini-redis&lt;br /&gt;
 //Lancer le serveur&lt;br /&gt;
 mini-redis-server&lt;br /&gt;
 //Depuis un autre terminal&lt;br /&gt;
 mini-redis-cli get foo&lt;br /&gt;
 //Doit renvoyer (nil)&lt;br /&gt;
&lt;br /&gt;
= Hello Tokio =&lt;br /&gt;
&lt;br /&gt;
On commence par créer une application très simple, qui va se connecter au serveur mini-redis et passer la clef &amp;quot;hello&amp;quot; à &amp;quot;world&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 cargo new my-redis&lt;br /&gt;
 cd my-redis&lt;br /&gt;
 //Cargo.toml&lt;br /&gt;
 tokio = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;full&amp;quot;] }&lt;br /&gt;
 mini-redis = &amp;quot;0.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis dans le main.rs&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use mini_redis::{client, Result};&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() -&amp;gt; Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Open a connection to the mini-redis address.&lt;br /&gt;
    let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    // Set the key &amp;quot;hello&amp;quot; with value &amp;quot;world&amp;quot;&lt;br /&gt;
    client.set(&amp;quot;hello&amp;quot;, &amp;quot;world&amp;quot;.into()).await?;&lt;br /&gt;
&lt;br /&gt;
    // Get key &amp;quot;hello&amp;quot;&lt;br /&gt;
    let result = client.get(&amp;quot;hello&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;got value from the server; result={:?}&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En faisant un cargo run avec le serveur mini-redis fonctionnel dans un autre terminal, on a bien le résultat attendu.&lt;br /&gt;
&lt;br /&gt;
En détail :&lt;br /&gt;
 let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
Fonction fournie par mini-redis qui donne un handle sur un client tcp. L&#039;opération est asynchrone, mais le code ressemble à du code synchrone; on sait qu&#039;il est asynchrone grace à &amp;quot;await&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Programmation asynchrone ? ==&lt;br /&gt;
La plupart du temps, les programmes exécutés dans l&#039;ordre dans lequel ils sont écrits. Si une tâche prend du temps, le thread est bloqué le temps que ça termine, ce qui peut être le cas pour une connexion TCP via laquelle un échange de données a lieu. &lt;br /&gt;
&lt;br /&gt;
Avec la programmation asynchrone, les opération qui ne peuvent pas se terminer immédiatement vont en arrière plan. Le thread n&#039;est pas bloqué et peut faire d&#039;autres choses en attendant. Quand la tâche en arrière plan se termine, elle n&#039;est plus suspendue et peut continuer. La programmation asynchrone peut permettre d&#039;avoir des applications plus rapides, mais aussi bien plus compliquées. Elles forcent à gérer l&#039;état des différentes tâches du programme.&lt;br /&gt;
&lt;br /&gt;
== Compile-time green threading (j&#039;ai pas envie de traduire) ==&lt;br /&gt;
Rust implémente l&#039;asynchrone avec les mots async et await. Les fonctions qui font de l&#039;asynchrone sont marquées avec async:&lt;br /&gt;
 pub async fn connect&amp;lt;T: ToSocketAddrs&amp;gt;(addr: T) -&amp;gt; Result&amp;lt;Client&amp;gt; //etc&lt;br /&gt;
Les fonctions en &amp;quot;async fn&amp;quot; sont traduites par Rust lors de la compilation vers des routines asynchrones. N&#039;importe quel appel à .await dans la fonction asynchrone renvoie le contrôle des opérations au thread, afin qu&#039;il puisse faire autre chose pendant que les opérations se terminent en fond.&lt;br /&gt;
&lt;br /&gt;
== Utiliser async / await ==&lt;br /&gt;
Les fonctions asynchrones sont appellées comme n&#039;importe quelle autre fonction, mais ne renvoient pas une valeur représentant le résultat de leurs opérations. Elles renvoient une valeur qui représente l&#039;opération. Il faut utiliser .await sur cette valeur afin d&#039;obtenir le résultat. &lt;br /&gt;
Exemple: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
async fn say_world() {&lt;br /&gt;
    println!(&amp;quot;world&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    // Calling `say_world()` does not execute the body of `say_world()`.&lt;br /&gt;
    let op = say_world();&lt;br /&gt;
&lt;br /&gt;
    // This println! comes first&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Calling `.await` on `op` starts executing `say_world`.&lt;br /&gt;
    op.await;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie &lt;br /&gt;
 hello&lt;br /&gt;
 world&lt;br /&gt;
&lt;br /&gt;
La valeur de retour d&#039;une &amp;quot;async fn&amp;quot; est un type anonyme qui implément le trait &amp;quot;Future&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Fonction main asynchrone ==&lt;br /&gt;
La fonction main utilisée ici est différente de ce qu&#039;on trouve habituellement : elle est asynchrone et annotée avec &amp;quot;#[tokio::main]&amp;quot;. Une fonction async est nécessaire car on veut entrer dans un environnement asynchrone. Cependant, elle doit être exécutée par un runtime, qui contient le task scheduler, les I/O, les timers, etc. C&#039;est le rôle de la macro #[tokio::main].&lt;br /&gt;
&lt;br /&gt;
Cette macro sert à transformer notre &#039;async fn main&#039; en une &#039;fn main()&#039; synchrone qui initialize une instance du runtime et lance la fonction main asynchrone.&lt;br /&gt;
&lt;br /&gt;
Avec ça:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a en réalité&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
fn main() {&lt;br /&gt;
    let mut rt = tokio::runtime::Runtime::new().unwrap();&lt;br /&gt;
    rt.block_on(async {&lt;br /&gt;
        println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
    })&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features de Tokio ==&lt;br /&gt;
&lt;br /&gt;
Tokio a beaucoup de fonctionnalités : TCP, UDP, sockets unix, etc. Nous avons ici utilisé la feature &amp;quot;full&amp;quot; pour l&#039;exemple mais on peut en enlever pour alléger la compilation.&lt;br /&gt;
&lt;br /&gt;
= Spawning =&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2546</id>
		<title>Rust : Tokio</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2546"/>
		<updated>2024-08-19T14:24:13Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= A propos de cette page =&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du tuto d&#039;utilisation de l&#039;environnement Tokio : [https://tokio.rs/tokio/tutorial ici]&lt;br /&gt;
&lt;br /&gt;
= Présentation =&lt;br /&gt;
&lt;br /&gt;
Tokio est un runtime asynchrone pour Rust, et fournit les outils pour créer des applications asynchrone utilisant le réseau. Les composants principaux sont:&lt;br /&gt;
&lt;br /&gt;
* Un runtime multi-process pour l&#039;exécution de code asynchrone&lt;br /&gt;
* Une version asynchrone de la librairie standard&lt;br /&gt;
* Un grand ecosystème de librairies associées.&lt;br /&gt;
&lt;br /&gt;
Son rôle est avant tout d&#039;accélerer les applications dans le cas où elles sont dépendante d&#039;IO réseau en grande quantité, et pas dépendantes du CPU. Il n&#039;est pas non plus intéressant pour accéder à un grand nombre de fichiers simultanément car les OS n&#039;ont généralement pas d&#039;API asynchrone pour les filesystems.&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
Le but du tutoriel est de montrer comment implémenter un client et un serveur Redis, avec un petit ensemble de commandes Redis. Ce projet s&#039;appelle Mini-Redis et est [https://github.com/tokio-rs/mini-redis sur Github].&lt;br /&gt;
&lt;br /&gt;
Avec une version récente de Rust, on commence par le serveur mini-redis, qui nous permettra de tester notre client.&lt;br /&gt;
 cargo install mini-redis&lt;br /&gt;
 //Lancer le serveur&lt;br /&gt;
 mini-redis-server&lt;br /&gt;
 //Depuis un autre terminal&lt;br /&gt;
 mini-redis-cli get foo&lt;br /&gt;
 //Doit renvoyer (nil)&lt;br /&gt;
&lt;br /&gt;
= Hello Tokio =&lt;br /&gt;
&lt;br /&gt;
On commence par créer une application très simple, qui va se connecter au serveur mini-redis et passer la clef &amp;quot;hello&amp;quot; à &amp;quot;world&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 cargo new my-redis&lt;br /&gt;
 cd my-redis&lt;br /&gt;
 //Cargo.toml&lt;br /&gt;
 tokio = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;full&amp;quot;] }&lt;br /&gt;
 mini-redis = &amp;quot;0.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis dans le main.rs&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use mini_redis::{client, Result};&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() -&amp;gt; Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Open a connection to the mini-redis address.&lt;br /&gt;
    let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    // Set the key &amp;quot;hello&amp;quot; with value &amp;quot;world&amp;quot;&lt;br /&gt;
    client.set(&amp;quot;hello&amp;quot;, &amp;quot;world&amp;quot;.into()).await?;&lt;br /&gt;
&lt;br /&gt;
    // Get key &amp;quot;hello&amp;quot;&lt;br /&gt;
    let result = client.get(&amp;quot;hello&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;got value from the server; result={:?}&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En faisant un cargo run avec le serveur mini-redis fonctionnel dans un autre terminal, on a bien le résultat attendu.&lt;br /&gt;
&lt;br /&gt;
En détail :&lt;br /&gt;
 let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
Fonction fournie par mini-redis qui donne un handle sur un client tcp. L&#039;opération est asynchrone, mais le code ressemble à du code synchrone; on sait qu&#039;il est asynchrone grace à &amp;quot;await&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Programmation asynchrone ? ==&lt;br /&gt;
La plupart du temps, les programmes exécutés dans l&#039;ordre dans lequel ils sont écrits. Si une tâche prend du temps, le thread est bloqué le temps que ça termine, ce qui peut être le cas pour une connexion TCP via laquelle un échange de données a lieu. &lt;br /&gt;
&lt;br /&gt;
Avec la programmation asynchrone, les opération qui ne peuvent pas se terminer immédiatement vont en arrière plan. Le thread n&#039;est pas bloqué et peut faire d&#039;autres choses en attendant. Quand la tâche en arrière plan se termine, elle n&#039;est plus suspendue et peut continuer. La programmation asynchrone peut permettre d&#039;avoir des applications plus rapides, mais aussi bien plus compliquées. Elles forcent à gérer l&#039;état des différentes tâches du programme.&lt;br /&gt;
&lt;br /&gt;
== Compile-time green threading (j&#039;ai pas envie de traduire) ==&lt;br /&gt;
Rust implémente l&#039;asynchrone avec les mots async et await. Les fonctions qui font de l&#039;asynchrone sont marquées avec async:&lt;br /&gt;
 pub async fn connect&amp;lt;T: ToSocketAddrs&amp;gt;(addr: T) -&amp;gt; Result&amp;lt;Client&amp;gt; //etc&lt;br /&gt;
Les fonctions en &amp;quot;async fn&amp;quot; sont traduites par Rust lors de la compilation vers des routines asynchrones. N&#039;importe quel appel à .await dans la fonction asynchrone renvoie le contrôle des opérations au thread, afin qu&#039;il puisse faire autre chose pendant que les opérations se terminent en fond.&lt;br /&gt;
&lt;br /&gt;
== Utiliser async / await ==&lt;br /&gt;
Les fonctions asynchrones sont appellées comme n&#039;importe quelle autre fonction, mais ne renvoient pas une valeur représentant le résultat de leurs opérations. Elles renvoient une valeur qui représente l&#039;opération. Il faut utiliser .await sur cette valeur afin d&#039;obtenir le résultat. &lt;br /&gt;
Exemple: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
async fn say_world() {&lt;br /&gt;
    println!(&amp;quot;world&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    // Calling `say_world()` does not execute the body of `say_world()`.&lt;br /&gt;
    let op = say_world();&lt;br /&gt;
&lt;br /&gt;
    // This println! comes first&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Calling `.await` on `op` starts executing `say_world`.&lt;br /&gt;
    op.await;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie &lt;br /&gt;
 hello&lt;br /&gt;
 world&lt;br /&gt;
&lt;br /&gt;
La valeur de retour d&#039;une &amp;quot;async fn&amp;quot; est un type anonyme qui implément le trait &amp;quot;Future&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Fonction main asynchrone ==&lt;br /&gt;
La fonction main utilisée ici est différente de ce qu&#039;on trouve habituellement : elle est asynchrone et annotée avec &amp;quot;#[tokio::main]&amp;quot;. Une fonction async est nécessaire car on veut entrer dans un environnement asynchrone. Cependant, elle doit être exécutée par un runtime, qui contient le task scheduler, les I/O, les timers, etc. C&#039;est le rôle de la macro #[tokio::main].&lt;br /&gt;
&lt;br /&gt;
Cette macro sert à transformer notre &#039;async fn main&#039; en une &#039;fn main()&#039; synchrone qui initialize une instance du runtime et lance la fonction main asynchrone.&lt;br /&gt;
&lt;br /&gt;
Avec ça:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a en réalité&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
fn main() {&lt;br /&gt;
    let mut rt = tokio::runtime::Runtime::new().unwrap();&lt;br /&gt;
    rt.block_on(async {&lt;br /&gt;
        println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
    })&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Features de Tokio ==&lt;br /&gt;
&lt;br /&gt;
Tokio a beaucoup de fonctionnalités : TCP, UDP, sockets unix, etc. Nous avons ici utilisé la feature &amp;quot;full&amp;quot; pour l&#039;exemple mais on peut en enlever pour alléger la compilation.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2545</id>
		<title>Rust : Tokio</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2545"/>
		<updated>2024-08-19T14:17:17Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= A propos de cette page =&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du tuto d&#039;utilisation de l&#039;environnement Tokio : [https://tokio.rs/tokio/tutorial ici]&lt;br /&gt;
&lt;br /&gt;
= Présentation =&lt;br /&gt;
&lt;br /&gt;
Tokio est un runtime asynchrone pour Rust, et fournit les outils pour créer des applications asynchrone utilisant le réseau. Les composants principaux sont:&lt;br /&gt;
&lt;br /&gt;
* Un runtime multi-process pour l&#039;exécution de code asynchrone&lt;br /&gt;
* Une version asynchrone de la librairie standard&lt;br /&gt;
* Un grand ecosystème de librairies associées.&lt;br /&gt;
&lt;br /&gt;
Son rôle est avant tout d&#039;accélerer les applications dans le cas où elles sont dépendante d&#039;IO réseau en grande quantité, et pas dépendantes du CPU. Il n&#039;est pas non plus intéressant pour accéder à un grand nombre de fichiers simultanément car les OS n&#039;ont généralement pas d&#039;API asynchrone pour les filesystems.&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
Le but du tutoriel est de montrer comment implémenter un client et un serveur Redis, avec un petit ensemble de commandes Redis. Ce projet s&#039;appelle Mini-Redis et est [https://github.com/tokio-rs/mini-redis sur Github].&lt;br /&gt;
&lt;br /&gt;
Avec une version récente de Rust, on commence par le serveur mini-redis, qui nous permettra de tester notre client.&lt;br /&gt;
 cargo install mini-redis&lt;br /&gt;
 //Lancer le serveur&lt;br /&gt;
 mini-redis-server&lt;br /&gt;
 //Depuis un autre terminal&lt;br /&gt;
 mini-redis-cli get foo&lt;br /&gt;
 //Doit renvoyer (nil)&lt;br /&gt;
&lt;br /&gt;
= Hello Tokio =&lt;br /&gt;
&lt;br /&gt;
On commence par créer une application très simple, qui va se connecter au serveur mini-redis et passer la clef &amp;quot;hello&amp;quot; à &amp;quot;world&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 cargo new my-redis&lt;br /&gt;
 cd my-redis&lt;br /&gt;
 //Cargo.toml&lt;br /&gt;
 tokio = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;full&amp;quot;] }&lt;br /&gt;
 mini-redis = &amp;quot;0.4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Puis dans le main.rs&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
use mini_redis::{client, Result};&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() -&amp;gt; Result&amp;lt;()&amp;gt; {&lt;br /&gt;
    // Open a connection to the mini-redis address.&lt;br /&gt;
    let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    // Set the key &amp;quot;hello&amp;quot; with value &amp;quot;world&amp;quot;&lt;br /&gt;
    client.set(&amp;quot;hello&amp;quot;, &amp;quot;world&amp;quot;.into()).await?;&lt;br /&gt;
&lt;br /&gt;
    // Get key &amp;quot;hello&amp;quot;&lt;br /&gt;
    let result = client.get(&amp;quot;hello&amp;quot;).await?;&lt;br /&gt;
&lt;br /&gt;
    println!(&amp;quot;got value from the server; result={:?}&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
    Ok(())&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En faisant un cargo run avec le serveur mini-redis fonctionnel dans un autre terminal, on a bien le résultat attendu.&lt;br /&gt;
&lt;br /&gt;
En détail :&lt;br /&gt;
 let mut client = client::connect(&amp;quot;127.0.0.1:6379&amp;quot;).await?;&lt;br /&gt;
Fonction fournie par mini-redis qui donne un handle sur un client tcp. L&#039;opération est asynchrone, mais le code ressemble à du code synchrone; on sait qu&#039;il est asynchrone grace à &amp;quot;await&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Programmation asynchrone ? ==&lt;br /&gt;
La plupart du temps, les programmes exécutés dans l&#039;ordre dans lequel ils sont écrits. Si une tâche prend du temps, le thread est bloqué le temps que ça termine, ce qui peut être le cas pour une connexion TCP via laquelle un échange de données a lieu. &lt;br /&gt;
&lt;br /&gt;
Avec la programmation asynchrone, les opération qui ne peuvent pas se terminer immédiatement vont en arrière plan. Le thread n&#039;est pas bloqué et peut faire d&#039;autres choses en attendant. Quand la tâche en arrière plan se termine, elle n&#039;est plus suspendue et peut continuer. La programmation asynchrone peut permettre d&#039;avoir des applications plus rapides, mais aussi bien plus compliquées. Elles forcent à gérer l&#039;état des différentes tâches du programme.&lt;br /&gt;
&lt;br /&gt;
== Compile-time green threading (j&#039;ai pas envie de traduire) ==&lt;br /&gt;
Rust implémente l&#039;asynchrone avec les mots async et await. Les fonctions qui font de l&#039;asynchrone sont marquées avec async:&lt;br /&gt;
 pub async fn connect&amp;lt;T: ToSocketAddrs&amp;gt;(addr: T) -&amp;gt; Result&amp;lt;Client&amp;gt; //etc&lt;br /&gt;
Les fonctions en &amp;quot;async fn&amp;quot; sont traduites par Rust lors de la compilation vers des routines asynchrones. N&#039;importe quel appel à .await dans la fonction asynchrone renvoie le contrôle des opérations au thread, afin qu&#039;il puisse faire autre chose pendant que les opérations se terminent en fond.&lt;br /&gt;
&lt;br /&gt;
== Utiliser async / await ==&lt;br /&gt;
Les fonctions asynchrones sont appellées comme n&#039;importe quelle autre fonction, mais ne renvoient pas une valeur représentant le résultat de leurs opérations. Elles renvoient une valeur qui représente l&#039;opération. Il faut utiliser .await sur cette valeur afin d&#039;obtenir le résultat. &lt;br /&gt;
Exemple: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
async fn say_world() {&lt;br /&gt;
    println!(&amp;quot;world&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#[tokio::main]&lt;br /&gt;
async fn main() {&lt;br /&gt;
    // Calling `say_world()` does not execute the body of `say_world()`.&lt;br /&gt;
    let op = say_world();&lt;br /&gt;
&lt;br /&gt;
    // This println! comes first&lt;br /&gt;
    println!(&amp;quot;hello&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Calling `.await` on `op` starts executing `say_world`.&lt;br /&gt;
    op.await;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renvoie &lt;br /&gt;
 hello&lt;br /&gt;
 world&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2544</id>
		<title>Rust : Tokio</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_Tokio&amp;diff=2544"/>
		<updated>2024-08-19T13:59:30Z</updated>

		<summary type="html">&lt;p&gt;Justine : Page créée avec « = A propos de cette page =  Il s&amp;#039;agit de mes notes issues du tuto d&amp;#039;utilisation de l&amp;#039;environnement Tokio : [https://tokio.rs/tokio/tutorial ici]  = Présentation =  Tokio est un runtime asynchrone pour Rust, et fournit les outils pour créer des applications asynchrone utilisant le réseau. Les composants principaux sont:  * Un runtime multi-process pour l&amp;#039;exécution de code asynchrone * Une version asynchrone de la librairie standard * Un grand ecosystème de li... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= A propos de cette page =&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du tuto d&#039;utilisation de l&#039;environnement Tokio : [https://tokio.rs/tokio/tutorial ici]&lt;br /&gt;
&lt;br /&gt;
= Présentation =&lt;br /&gt;
&lt;br /&gt;
Tokio est un runtime asynchrone pour Rust, et fournit les outils pour créer des applications asynchrone utilisant le réseau. Les composants principaux sont:&lt;br /&gt;
&lt;br /&gt;
* Un runtime multi-process pour l&#039;exécution de code asynchrone&lt;br /&gt;
* Une version asynchrone de la librairie standard&lt;br /&gt;
* Un grand ecosystème de librairies associées.&lt;br /&gt;
&lt;br /&gt;
Son rôle est avant tout d&#039;accélerer les applications dans le cas où elles sont dépendante d&#039;IO réseau en grande quantité, et pas dépendantes du CPU. Il n&#039;est pas non plus intéressant pour accéder à un grand nombre de fichiers simultanément car les OS n&#039;ont généralement pas d&#039;API asynchrone pour les filesystems.&lt;br /&gt;
&lt;br /&gt;
= Setup =&lt;br /&gt;
&lt;br /&gt;
Le but du tutoriel est de montrer comment implémenter un client et un serveur Redis, avec un petit ensemble de commandes Redis. Ce projet s&#039;appelle Mini-Redis et est [https://github.com/tokio-rs/mini-redis sur Github].&lt;br /&gt;
&lt;br /&gt;
Avec une version récente de Rust, on commence par le serveur mini-redis, qui nous permettra de tester notre client.&lt;br /&gt;
 cargo install mini-redis&lt;br /&gt;
 //Lancer le serveur&lt;br /&gt;
 mini-redis-server&lt;br /&gt;
 //Depuis un autre terminal&lt;br /&gt;
 mini-redis-cli get foo&lt;br /&gt;
 //Doit renvoyer (nil)&lt;br /&gt;
&lt;br /&gt;
= Hello Tokio =&lt;br /&gt;
&lt;br /&gt;
On commence par créer une application très simple, qui va se connecter au serveur mini-redis et passer la clef &amp;quot;hello&amp;quot; à &amp;quot;world&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 cargo new my-redis&lt;br /&gt;
 cd my-redis&lt;br /&gt;
 //Cargo.toml&lt;br /&gt;
 tokio = { version = &amp;quot;1&amp;quot;, features = [&amp;quot;full&amp;quot;] }&lt;br /&gt;
 mini-redis = &amp;quot;0.4&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_divers&amp;diff=2543</id>
		<title>Rust : divers</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_divers&amp;diff=2543"/>
		<updated>2024-08-19T13:36:39Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Crates intéressantes =&lt;br /&gt;
&lt;br /&gt;
== Crates courantes ==&lt;br /&gt;
&lt;br /&gt;
* Serde est formidable pour la serialisation / déserialisation d&#039;objets et notamment leur sauvegarde dans des fichiers. Cf un exemple pas parfait : https://gitea.squi.fr/Rust/configfile&lt;br /&gt;
&lt;br /&gt;
== Nouveaux objets ==&lt;br /&gt;
&lt;br /&gt;
* [https://crates.io/crates/elsa Elsa] fournit des collections &#039;append-only&#039; avec des références toujours valides. Les collections sont immutables et peuvent servir à avoir une collection de Strings par exemple.&lt;br /&gt;
* [https://crates.io/crates/rpds RPDS ] est un peu dans le même Esprit.&lt;br /&gt;
&lt;br /&gt;
== Gestion d&#039;erreur ==&lt;br /&gt;
* [https://docs.rs/anyhow/latest/anyhow/ Anyhow] permet de simplifier l&#039;écriture des fonctions faillibles. On peut passer de ça :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
fn myfunc() -&amp;gt; Result&amp;lt;(), Box&amp;lt;dyn std::error::Error&amp;gt;&amp;gt; {&lt;br /&gt;
//etc&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
à ça:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Result&amp;lt;T, anyhow::Error&amp;gt;&lt;br /&gt;
//Ou même &lt;br /&gt;
anyhow::Result&amp;lt;T&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2542</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2542"/>
		<updated>2024-08-19T13:34:03Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Rust */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Disclaimer ==&lt;br /&gt;
Ceci est mon wiki personnel, rédigé au cours de mes études et de ma carrière; je n&#039;ai pas la prétention que tout y soit exact.&lt;br /&gt;
Toutes les pages utiles sont en lien sur la présente page de sommaire. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes personnelles, que je ne mettrait à jour que si j&#039;en ressens le besoin. Il peut parfois s&#039;agir de traduction d&#039;articles existants, si c&#039;est le cas, le lien original est en général au sommet de la page.&lt;br /&gt;
&lt;br /&gt;
[[Logo du site]]&lt;br /&gt;
&lt;br /&gt;
Justine&lt;br /&gt;
&lt;br /&gt;
==Autres / Aide==&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Help:Formatting/fr Aide au formatage]&lt;br /&gt;
*[https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf Aide au langage markdown (pour Git)]&lt;br /&gt;
*[[Portfolio - Notes en vrac]]&lt;br /&gt;
*[[ITIL]]&lt;br /&gt;
*[[Vocabulaire &amp;amp; notions diverses]]&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Extension:SyntaxHighlight L&#039;extension SyntaxHighlight]&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheets==&lt;br /&gt;
* [[Idées diverses de gain de temps]]&lt;br /&gt;
* [[Raccourcis shell bash]]&lt;br /&gt;
* [[Raccourcis Vim]]&lt;br /&gt;
* [[Cs: Ansible]]&lt;br /&gt;
* [[CS : FirewallD]]&lt;br /&gt;
* [[Cs : Vim]]&lt;br /&gt;
* [[Cs:_Tips_Linux]]&lt;br /&gt;
* [[Cs: Git]]&lt;br /&gt;
* [[Cs: Pacman]]&lt;br /&gt;
* [[CS : lsof]]&lt;br /&gt;
* [[CS : SecuriteLinux]]&lt;br /&gt;
* [[Mémo_Apache|Mémo Apache]] &lt;br /&gt;
* [[Memo_nginx|Memo nginx]]   &lt;br /&gt;
* [[Mémo_Openssl|Mémo Openssl]]&lt;br /&gt;
&lt;br /&gt;
==Ansible== &lt;br /&gt;
* [[Ansible|Ansible]] &lt;br /&gt;
** [[Ansible : remplacement récursif de texte]]&lt;br /&gt;
** [[Ansible : Filtres]]&lt;br /&gt;
** [[Ansible : playbook avancé, avec handlers et templates]]&lt;br /&gt;
** [[Ansible : Quirks]]&lt;br /&gt;
** [[Ansible et Windows]]&lt;br /&gt;
** [[Ansible : awx-cli]]&lt;br /&gt;
** [[Ansible : Collections]]&lt;br /&gt;
** [[Ansible : sous-commandes]]&lt;br /&gt;
** [[Ansible : VMWare]]&lt;br /&gt;
&lt;br /&gt;
==Conteneurs== &lt;br /&gt;
[[Fichier:Moby-logo-small.png|90px]]  [[Fichier:K8s-small.png|90px]]&lt;br /&gt;
* [[Docker|Docker]] &lt;br /&gt;
* [[Docker-compose]]&lt;br /&gt;
* [[Traefik]]&lt;br /&gt;
* [[Docker swarm]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[LXD]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;/span&amp;gt;Systèmes&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt; &#039;&#039;&#039;[[File:869px-Tux.svg.png|40x49px|869px-Tux.svg.png]]&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
* [[Additions_Invité_sur_Linux|Additions Invité sur Linux]] &lt;br /&gt;
* [[Analyse de logs]]&lt;br /&gt;
** [[Rsyslog]]&lt;br /&gt;
** [[YAML]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
* [[Apache Tomcat]]&lt;br /&gt;
* [[Appels Système (syscall)]]&lt;br /&gt;
* [[APT]]&lt;br /&gt;
* [[Architecture système]]&lt;br /&gt;
* [[Asterisk|Asterisk]] &lt;br /&gt;
* [[Authentification - PAM]] &lt;br /&gt;
* [[Autostart]]&lt;br /&gt;
* [[Awk]]&lt;br /&gt;
* [[Bases_de_données|Bases de données]] &lt;br /&gt;
* [[Bind9]]&lt;br /&gt;
* [[Ceph]]&lt;br /&gt;
* [[Certbot]]&lt;br /&gt;
* [[Cgroups]]&lt;br /&gt;
* [[CheckMK]]&lt;br /&gt;
* [[Chronyd]]&lt;br /&gt;
* [[Cloud Computing]]&lt;br /&gt;
* [[Commandes analyse maillog]]&lt;br /&gt;
* [[Commandes de test de charge]]&lt;br /&gt;
* [[Commandes_Linux|Commandes Linux]] &lt;br /&gt;
* [[Convertir des .deb en .rpm avec alien]]&lt;br /&gt;
* [[Cryptographie|Cryptographie]] &lt;br /&gt;
** [[Protocole ACME]]&lt;br /&gt;
* [[Droits|Droits]] &lt;br /&gt;
* [[Environnement utilisateur]]&lt;br /&gt;
* [[Filesystems|Filesystems]] &lt;br /&gt;
** [[Surveillance de disques]]&lt;br /&gt;
* [[Firefox]]&lt;br /&gt;
* [[Fstab]]&lt;br /&gt;
* [[Gestion_de_paquets|Gestion de paquets]] &lt;br /&gt;
** [[Unattended-upgrades]]&lt;br /&gt;
* [[Grafana et prometheus]]&lt;br /&gt;
* [[Groupwares|Groupwares]] &lt;br /&gt;
* [[HAProxy]]&lt;br /&gt;
* [[Informations Système sous Linux]]&lt;br /&gt;
* [[Juju]]&lt;br /&gt;
* [[KeepaliveD]]&lt;br /&gt;
* [[Kernel Tuning]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[Kubernetes (obsolete)]]&lt;br /&gt;
* [[LAMP|LAMP]]&lt;br /&gt;
* [[LDAP]] &lt;br /&gt;
* [[Linux|Linux / Systèmes]] &lt;br /&gt;
* [[Linux : Permissions]]&lt;br /&gt;
* [[Attributs_Linux_étendus|Attributs Linux étendus]] &lt;br /&gt;
* [[Linux : Mémoire, RAM, swap]]&lt;br /&gt;
* [[Linux : Gestion de la résolution]]&lt;br /&gt;
* [[Logrotate]]&lt;br /&gt;
* [[Make]]&lt;br /&gt;
* [[Messagerie : Risques]]&lt;br /&gt;
* [[OAuth]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Pile son]]&lt;br /&gt;
* [[Postfix]]&lt;br /&gt;
* [[Processus et Appels Système]]&lt;br /&gt;
* [[Proxmox|Proxmox]] &lt;br /&gt;
* [[Raccourcis_shell_bash|Raccourcis shell bash]] &lt;br /&gt;
* [[Raccourcis_Vim|Raccourcis Vim]] &lt;br /&gt;
* [[Red Hat : Satellite 6]]&lt;br /&gt;
* [[Reverse Proxy Nginx]]&lt;br /&gt;
* [[Rsync,_SFTP,_RoboCopy|Rsync, SFTP, RoboCopy]] &lt;br /&gt;
* [[Screen]]&lt;br /&gt;
* [[Sed]]&lt;br /&gt;
* [[Sendmail]]&lt;br /&gt;
* [[Sshfs]]&lt;br /&gt;
* [[Sockets]]&lt;br /&gt;
* [[Steam cmd]]&lt;br /&gt;
* [[Stockage|Stockage]] &lt;br /&gt;
** [[LVM : opérations courantes]]&lt;br /&gt;
** [[Iscsiadm]]&lt;br /&gt;
** [[IscsiAdm + Multipath]]&lt;br /&gt;
* [[Structure de dossiers Linux]]&lt;br /&gt;
* [[Supervision]]&lt;br /&gt;
* [[Systemd]]&lt;br /&gt;
** [[Timesyncd]]&lt;br /&gt;
* [[Utilisateurs|Utilisateurs]] &lt;br /&gt;
* [[Varnish]]&lt;br /&gt;
* [[VMWare|VMWare]] &lt;br /&gt;
** [[VMWare : Utilisation de PowerCLI]]&lt;br /&gt;
** [[VMWare : Autres notions]]&lt;br /&gt;
&lt;br /&gt;
=== Spécificités Windows [[Fichier:Winlogo.png|50px]] === &lt;br /&gt;
&lt;br /&gt;
* [[Services_Windows|Services Windows]] &lt;br /&gt;
** [[Active_Directory|Active Directory]]&lt;br /&gt;
** [[WSUS_et_Core|WSUS et Core]] &lt;br /&gt;
** [[PowerShell|PowerShell]] &lt;br /&gt;
** [[GPO|GPO]] &lt;br /&gt;
** [[Exchange|Exchange]] &lt;br /&gt;
** [[Exchange pour de vrai]]&lt;br /&gt;
** [[Windows : Outils à connaître]]&lt;br /&gt;
** [[Powershell : Active Directory]]&lt;br /&gt;
** [[AD : intégration Linux]]&lt;br /&gt;
* [[Création de tâches planifiée]]&lt;br /&gt;
* [[Gestion d&#039;accès chez Microsoft]]&lt;br /&gt;
* [[Smbclient]]&lt;br /&gt;
* [[Commandes CMD utiles]]&lt;br /&gt;
&lt;br /&gt;
== Réseaux  [[File:Computer-networking.jpg|middle|77x60px|Computer-networking.jpg]] ==&lt;br /&gt;
&lt;br /&gt;
*[[DHCPv4|DHCPv4]] &lt;br /&gt;
*[[DHCPv6|DHCPv6]] &lt;br /&gt;
*[[DNS|DNS]] &lt;br /&gt;
*[[Ethernet|Ethernet]] &lt;br /&gt;
**[[FireWall_:_CheckPoint|FireWall : CheckPoint]]   &lt;br /&gt;
*[[Firewall|Firewall]] &lt;br /&gt;
**[[Firewall_:_Juniper|Firewall : Juniper]] &lt;br /&gt;
**[[FireWall : CheckPoint]]&lt;br /&gt;
**[[Firewalld]]&lt;br /&gt;
**[[IPTables]]&lt;br /&gt;
**[[Nftables]]&lt;br /&gt;
*[[Gestion_de_parc|Gestion de parc]] &lt;br /&gt;
*[[GlobalProtect sur linux]]&lt;br /&gt;
*[[ICMPv4|ICMPv4]] &lt;br /&gt;
*[[IPv4|IPv4]] &lt;br /&gt;
*[[IPv6|IPv6]] &lt;br /&gt;
* [[Knot DNS]]&lt;br /&gt;
*[[Liste_des_ports|Liste des ports]] &lt;br /&gt;
*[[Modèle_OSI_et_TCP/IP|Modèle OSI et TCP/IP]] &lt;br /&gt;
*[[NAT/PAT|NAT/PAT]] &lt;br /&gt;
*[[NetCat|NetCat]] &lt;br /&gt;
*[[Nmap]]&lt;br /&gt;
*[[Protocoles|Protocoles]] &lt;br /&gt;
*[[Proxy|Proxy]] &lt;br /&gt;
*[[Reseau|Reseau]] &lt;br /&gt;
*[[SNMP|SNMP]] &lt;br /&gt;
*[[SSH|SSH]] &lt;br /&gt;
*[[SSO|SSO]] &lt;br /&gt;
*[[TCP_&amp;amp;_UDP|TCP &amp;amp; UDP]] &lt;br /&gt;
*[[Tor]]&lt;br /&gt;
*[[VLAN|VLAN]] &lt;br /&gt;
*[[VPN|VPN]]&lt;br /&gt;
* [[Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Cisco NetAcad [[File:1200px-Cisco logo blue 2016.svg.png|middle|75x50px|1200px-Cisco logo blue 2016.svg.png]] ===&lt;br /&gt;
&lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_1|Cisco : R&amp;amp;S 1]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_2|Cisco : R&amp;amp;S 2]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_3|Cisco : R&amp;amp;S 3]]&lt;br /&gt;
&lt;br /&gt;
== Web ==&lt;br /&gt;
*[[CGI]]&lt;br /&gt;
*[[Websockets]]&lt;br /&gt;
&lt;br /&gt;
== Cybersécurité [[File:Padlock.png|Padlock.png|77x60px]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Cybersécurité|Cybersécurité : notions de base]] &lt;br /&gt;
*[[Cybersécurité_:_keepass|Cybersécurité : keepass]] &lt;br /&gt;
*[[Metasploit|Metasploit]] &lt;br /&gt;
*[[Cybersécurité_(Kali)_:_Crack_de_mots_de_passe_avec_Hydra|Cybersécurité (Kali) : Crack de mots de passe avec Hydra]] &lt;br /&gt;
*[[Cybersécurité_:_Documentation|Cybersécurité : Documentation]] &lt;br /&gt;
*[[Cybersécurité_:_Lynis|Cybersécurité : Lynis]] &lt;br /&gt;
*[[Cybersécurité_:_Graylog|Cybersécurité : Graylog]] &lt;br /&gt;
*[[Cybersécurité_:_Liens|Cybersécurité : Liens]]&lt;br /&gt;
*[[Messagerie : Risques]] &lt;br /&gt;
*[[Outils Divers]]&lt;br /&gt;
*[[Tests de charge]]&lt;br /&gt;
*[[Honeypot]]&lt;br /&gt;
* [[Shodan]]&lt;br /&gt;
* [https://github.com/certsocietegenerale/IRM/tree/master/EN Des méthodes simples d&#039;analyse]&lt;br /&gt;
* [[Ffuf : Fuzz Faster U Fool]]&lt;br /&gt;
* [[PGP - GPG]]&lt;br /&gt;
&lt;br /&gt;
=== HackTheBox Academy ===&lt;br /&gt;
Mes notes concernant mon suivi de modules sur HTB Academy - elles sont possiblement en anglais.&lt;br /&gt;
* [[HTBA : Active Directory Intro]]&lt;br /&gt;
&lt;br /&gt;
== Gestion de projet [[File:Gdpimage.png|middle|96x64px|Gdpimage.png]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Gestion_de_projet|Gestion de projet]] &lt;br /&gt;
*[[Outils_et_Méthodologie_de_Résolution_de_Problèmes_(MRP)|Outils et Méthodologie de Résolution de Problèmes (MRP)]] &lt;br /&gt;
*[[GDP_Agile_avec_SCRUM|GDP Agile avec SCRUM]]&lt;br /&gt;
&lt;br /&gt;
== Scripting / Programmation [[File:Python-7be70baaac.png|middle|69x69px|Python-7be70baaac.png]][[File:Bashlogo.png|middle|74x74px|Bashlogo.png]] ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
**[[Python : APIs]]&lt;br /&gt;
**[[Python : argparse]]&lt;br /&gt;
**[[Python : Black]]&lt;br /&gt;
**[[Python : coloration de texte]]&lt;br /&gt;
**[[Python_:_Context_Manager|Python : Context Manager]] &lt;br /&gt;
**[[Python : Dataclasses]]&lt;br /&gt;
**[[Python : datetimes]]&lt;br /&gt;
**[[Python : dictionnaires]]&lt;br /&gt;
**[[Python : Ensembles]]&lt;br /&gt;
**[[Python : Fichiers de config]]&lt;br /&gt;
**[[Python : Flask]]&lt;br /&gt;
***[[Python : Flask et SocketIO]]&lt;br /&gt;
**[[Python_:_Fonctions|Python : Fonctions]] &lt;br /&gt;
**[[Python : Fonctions de l&#039;interpréteur]]&lt;br /&gt;
**[[Python_:_Les_fichiers|Python : Les fichiers]]  &lt;br /&gt;
**[[Python : fstrings]] &lt;br /&gt;
**[[Python : Interactions avec Windows]]&lt;br /&gt;
**[[Python_:_Listes|Python : Listes]] &lt;br /&gt;
** [[Python : Locust (Tests de charge)]]&lt;br /&gt;
**[[Python_:_Méthodes_de_chaines|Python : Méthodes de chaines]] &lt;br /&gt;
**[[Python_:_misc|Python : misc]] &lt;br /&gt;
**[[Python : Opérateurs]]&lt;br /&gt;
**[[Python : Opérateur Binaires]]&lt;br /&gt;
**[[Python : os.walk()]]&lt;br /&gt;
**[[Python_-_PEP8|Python - PEP8]] &lt;br /&gt;
**[[Python : Pipenv]]&lt;br /&gt;
**[[Python : Pygame]]&lt;br /&gt;
**[[Python : PySimpleGUI]]&lt;br /&gt;
**[[Python_:_Programmation_Asynchrone|Python : Programmation Asynchrone]] &lt;br /&gt;
**[[Python_:_Programmation_système|Python : Programmation système]] &lt;br /&gt;
**[[Python_:_Réseau|Python : Réseau]] &lt;br /&gt;
**[[Python : simuler des inputs]]&lt;br /&gt;
**[[Python_:_Tkinter|Python : Tkinter]] &lt;br /&gt;
**[[Python : Virtualenv]]&lt;br /&gt;
**[[Python_:_Vocabulaire|Python : Vocabulaire]] &lt;br /&gt;
**[[Python_:_with_et_les_gestionnaires_de_contexte|Python : with et les gestionnaires de contexte]]&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
Des notes diverses sur le langage, notamment des crates qui peuvent servir : [[Rust: Divers]]&lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes issues du livre officiel de Rust : [https://doc.rust-lang.org/book/ The Rust book] dans l&#039;ordre des chapitres.&lt;br /&gt;
&lt;br /&gt;
* [[Rust : Structs]]&lt;br /&gt;
* [[Rust: enums]]&lt;br /&gt;
* [[Rust : match]]&lt;br /&gt;
* [[Rust : if let]]&lt;br /&gt;
* [[Rust : packages]]&lt;br /&gt;
* [[Rust : Common collections]]&lt;br /&gt;
* [[Rust : Error handling]]&lt;br /&gt;
* [[Rust : génériques, traits, lifetimes]]&lt;br /&gt;
* [[Rust : tests automatisés]]&lt;br /&gt;
* [[Rust : iterateurs]]&lt;br /&gt;
(Le reste sur mon gitea).&lt;br /&gt;
&lt;br /&gt;
Autres notes:&lt;br /&gt;
* [[Rust : Debug avec GDB]]&lt;br /&gt;
* [[Rust : serde]]&lt;br /&gt;
* [[Rust : Display implementation and Rc + RefCell use demo]]&lt;br /&gt;
* [[Rust : async]]&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
**[[Bash|Bash : Anciennes notes]] &lt;br /&gt;
**[[Bash_:_Codes_de_retour|Bash : Codes de retour]] &lt;br /&gt;
**[[Bash_:_Fonctions|Bash : Fonctions]] &lt;br /&gt;
**[[Bash_:_généralités|Bash : généralités]] &lt;br /&gt;
**[[Bash_:_Paramètres_de_position|Bash : Paramètres de position]] &lt;br /&gt;
**[[Bash_:_Pattern_Matching|Bash : Pattern Matching]]  &lt;br /&gt;
**[[Bash_:_Tableaux|Bash : Tableaux]] &lt;br /&gt;
**[[Bash_:_Traitement_sur_les_chaînes|Bash : Traitement sur les chaînes]] &lt;br /&gt;
**[[Zsh]]&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
**[[PowerShell|PowerShell]] &lt;br /&gt;
**[[PowerShell_:_Scripting|PowerShell : Scripting]] &lt;br /&gt;
**[[PowerShell_:_scripts_complets|PowerShell : scripts complets]] &lt;br /&gt;
**[[PowerShell_:_Exporter_une_boîte_en_pst|PowerShell : Exporter une boîte en pst]]   &lt;br /&gt;
&lt;br /&gt;
=== Généralités ===&lt;br /&gt;
**[[Expressions_Régulières|Expressions Régulières]]&lt;br /&gt;
**[[RPC / REST]]&lt;br /&gt;
&lt;br /&gt;
=== Assembleur ===&lt;br /&gt;
* [[Assembleur|Assembleur (généralités)]]&lt;br /&gt;
* [[Assembleur : boot sector]]&lt;br /&gt;
&lt;br /&gt;
=== Langage C ===&lt;br /&gt;
** [[C : bases]]&lt;br /&gt;
**[[Langage C]]&lt;br /&gt;
&lt;br /&gt;
=== Golang ===&lt;br /&gt;
**[[Golang : bases]]&lt;br /&gt;
&lt;br /&gt;
== Hors-Sujet ==&lt;br /&gt;
&lt;br /&gt;
*[[Coaching_:_CV|Coaching : CV]]&lt;br /&gt;
*[[Droit|Droit]] &lt;br /&gt;
*[[Management|Management]] &lt;br /&gt;
*[[Ondes_radio|Ondes radio]]&lt;br /&gt;
*[[Vérités et contre-vérités]]&lt;br /&gt;
*[[Questions Sysadmin]]&lt;br /&gt;
*[[Comprendre comment fonctionne son organisation]]&lt;br /&gt;
&lt;br /&gt;
=== Musique ===&lt;br /&gt;
*[[Musique modale, musique tonale]]&lt;br /&gt;
*[[Gamme pentatonique]]&lt;br /&gt;
&lt;br /&gt;
== Jouer sur Linux ==&lt;br /&gt;
* [[Steam]]&lt;br /&gt;
* [[Optimus]]&lt;br /&gt;
&lt;br /&gt;
== Notes Personnelles ==&lt;br /&gt;
&lt;br /&gt;
Cette section contient des notes plus personnelles et moins rédigées, laissées là pour référence future.&lt;br /&gt;
&lt;br /&gt;
*[[Secure boot &amp;amp; pilotes nVIdia]]&lt;br /&gt;
*[[Dual boot et ennuis divers...]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;C’est pour ça : j’lis jamais rien. C’est un vrai piège à cons c’t’histoire-là. En plus j’sais pas lire.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_divers&amp;diff=2541</id>
		<title>Rust : divers</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_divers&amp;diff=2541"/>
		<updated>2024-08-19T13:33:01Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Crates intéressantes =&lt;br /&gt;
&lt;br /&gt;
== Nouveaux objets ==&lt;br /&gt;
&lt;br /&gt;
* [https://crates.io/crates/elsa Elsa] fournit des collections &#039;append-only&#039; avec des références toujours valides. Les collections sont immutables et peuvent servir à avoir une collection de Strings par exemple.&lt;br /&gt;
* [https://crates.io/crates/rpds RPDS ] est un peu dans le même Esprit.&lt;br /&gt;
&lt;br /&gt;
== Gestion d&#039;erreur ==&lt;br /&gt;
* [https://docs.rs/anyhow/latest/anyhow/ Anyhow] permet de simplifier l&#039;écriture des fonctions faillibles. On peut passer de ça :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
fn myfunc() -&amp;gt; Result&amp;lt;(), Box&amp;lt;dyn std::error::Error&amp;gt;&amp;gt; {&lt;br /&gt;
//etc&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
à ça:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Result&amp;lt;T, anyhow::Error&amp;gt;&lt;br /&gt;
//Ou même &lt;br /&gt;
anyhow::Result&amp;lt;T&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Rust_:_divers&amp;diff=2540</id>
		<title>Rust : divers</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Rust_:_divers&amp;diff=2540"/>
		<updated>2024-08-19T12:42:16Z</updated>

		<summary type="html">&lt;p&gt;Justine : Page créée avec « = Crates intéressantes =  * [https://crates.io/crates/elsa Elsa] fournit des collections &amp;#039;append-only&amp;#039; avec des références toujours valides. Les collections sont immutables et peuvent servir à avoir une collection de Strings par exemple. * [https://crates.io/crates/rpds RPDS ] est un peu dans le même Esprit. »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Crates intéressantes =&lt;br /&gt;
&lt;br /&gt;
* [https://crates.io/crates/elsa Elsa] fournit des collections &#039;append-only&#039; avec des références toujours valides. Les collections sont immutables et peuvent servir à avoir une collection de Strings par exemple.&lt;br /&gt;
* [https://crates.io/crates/rpds RPDS ] est un peu dans le même Esprit.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=LVM_:_op%C3%A9rations_courantes&amp;diff=2539</id>
		<title>LVM : opérations courantes</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=LVM_:_op%C3%A9rations_courantes&amp;diff=2539"/>
		<updated>2024-08-02T17:15:50Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
[[Category:stockage]]&lt;br /&gt;
= Ajouter une partition et créer des LV =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fdisk /dev/sdc&lt;br /&gt;
Commande (m pour l&#039;aide) : n&lt;br /&gt;
Sélection (p par défaut) : p&lt;br /&gt;
 &lt;br /&gt;
Commande (m pour l&#039;aide) : t&lt;br /&gt;
Code Hexa (taper L pour afficher tous les codes) :8e&lt;br /&gt;
 &lt;br /&gt;
Commande (m pour l&#039;aide) : p&lt;br /&gt;
Commande (m pour l&#039;aide) : w&lt;br /&gt;
&lt;br /&gt;
#Puis pour le LVM:&lt;br /&gt;
pvcreate /dev/sdb1&lt;br /&gt;
[root@monserveur ~] vgextend VGdisk /dev/sdb1&lt;br /&gt;
  Volume group &amp;quot;VGdisk&amp;quot; successfully extended&lt;br /&gt;
[root@monserveur ~] lvcreate -L 10G VGdisk -n LVOracle /dev/sdb1&lt;br /&gt;
  Logical volume &amp;quot;LVOracle&amp;quot; created.&lt;br /&gt;
[root@monserveur ~] lvcreate -L 50G VGdisk -n LVOradata /dev/sdb1&lt;br /&gt;
  Logical volume &amp;quot;LVOradata&amp;quot; created.&lt;br /&gt;
[root@monserveur ~] lvcreate -L 10G VGdisk -n LVArchiveLogs /dev/sdb1&lt;br /&gt;
  Volume group &amp;quot;VGdisk&amp;quot; has insufficient free space (2559 extents): 2560 required.&lt;br /&gt;
[root@monserveur ~] lvcreate -L 9.9G VGdisk -n LVArchiveLogs /dev/sdb1&lt;br /&gt;
  Rounding up size to full physical extent 9.90 GiB&lt;br /&gt;
  Logical volume &amp;quot;LVArchiveLogs&amp;quot; created.&lt;br /&gt;
[root@monserveur ~] lvs&lt;br /&gt;
  LV            VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert&lt;br /&gt;
  LVArchiveLogs VGdisk -wi-a-----   9.90g                                                    &lt;br /&gt;
  LVOracle      VGdisk -wi-a-----  10.00g                                                    &lt;br /&gt;
  LVOradata     VGdisk -wi-a-----  50.00g                                                    &lt;br /&gt;
  LVsystem      VGdisk -wi-ao---- 102.00g                &lt;br /&gt;
[root@monserveur ~] mkfs.ext4 /dev/VGdisk/LVOradata  #Pour tous les lvs&lt;br /&gt;
&lt;br /&gt;
#Pour augmenter un LV en ajoutant tout l&#039;espace dispo &lt;br /&gt;
[root@monserveur ~] lvextend -l +100%FREE /dev/myvg/testlv&lt;br /&gt;
#Ou un certain nombre de Go&lt;br /&gt;
[root@monserveur ~] lvextend -L12G /dev/myvg/homevol &lt;br /&gt;
#Il faut ensuite resize le fs&lt;br /&gt;
#xfs&lt;br /&gt;
[root@monserveur ~] xfs_growfs /dev/vg/lv&lt;br /&gt;
#ext&lt;br /&gt;
[root@monserveur ~] resize2fs /dev/vg/lv&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Augmenter un disque existant (et resize d&#039;un LV) =&lt;br /&gt;
[https://kerneltalks.com/disk-management/how-to-rescan-disk-in-linux-after-extending-vmware-disk/ Une bonne source]&lt;br /&gt;
&lt;br /&gt;
Dans le cas d&#039;une VM sous VMWare par exemple, on peut augmenter la taille d&#039;un disque existant (au lieu d&#039;en créer un nouveau) pour ensuite créer une partition et augmenter la taille d&#039;un LV.&lt;br /&gt;
&lt;br /&gt;
Après avoir augmenté mon disque (ici sdc):&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
#Pour que Linux voit la nouvelle taille&lt;br /&gt;
echo 1&amp;gt;/sys/class/block/sdc/device/rescan&lt;br /&gt;
#On va rajouter une partition&lt;br /&gt;
fdisk /dev/sdc&lt;br /&gt;
#Nouvelle partition, primaire, puis changer son type avec &amp;quot;t&amp;quot;, choisir &amp;quot;8e&amp;quot;&lt;br /&gt;
#La suite est très similaire à la méthode au-dessus&lt;br /&gt;
#LV nommé monlv, en ext4&lt;br /&gt;
vgextend monvg /dev/sdc2&lt;br /&gt;
lvextend -l +100%FREE /dev/monvg/monlv&lt;br /&gt;
resize2fs /dev/monvg/monlv&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Rescan de la taille d&#039;un PV =&lt;br /&gt;
Utile dans le cas où, par exemple, le PV est un disque (virtuel) entier et que ce disque vient d&#039;être agrandi.&lt;br /&gt;
&lt;br /&gt;
La commande est simple:&lt;br /&gt;
 pvresize /dev/monpv&lt;br /&gt;
Par exemple&lt;br /&gt;
 pvresize /dev/sdc&lt;br /&gt;
&lt;br /&gt;
= Agrandir une partition simplement avec growpart =&lt;br /&gt;
&lt;br /&gt;
L&#039;utilitaire growpart permet d&#039;agrandir une partition afin de lui donner le plus d&#039;espace disponible. Dispo sur Debian en installant :&lt;br /&gt;
 sudo apt install cloud-guest-utils&lt;br /&gt;
Ensuite, on lui donne le disque et la partition&lt;br /&gt;
 growpart /dev/sda 1&lt;br /&gt;
Ici, j&#039;augmente sda1. Attention à démonter la partition avant.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2538</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2538"/>
		<updated>2024-07-25T22:40:40Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Disclaimer ==&lt;br /&gt;
Ceci est mon wiki personnel, rédigé au cours de mes études et de ma carrière; je n&#039;ai pas la prétention que tout y soit exact.&lt;br /&gt;
Toutes les pages utiles sont en lien sur la présente page de sommaire. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes personnelles, que je ne mettrait à jour que si j&#039;en ressens le besoin. Il peut parfois s&#039;agir de traduction d&#039;articles existants, si c&#039;est le cas, le lien original est en général au sommet de la page.&lt;br /&gt;
&lt;br /&gt;
[[Logo du site]]&lt;br /&gt;
&lt;br /&gt;
Justine&lt;br /&gt;
&lt;br /&gt;
==Autres / Aide==&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Help:Formatting/fr Aide au formatage]&lt;br /&gt;
*[https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf Aide au langage markdown (pour Git)]&lt;br /&gt;
*[[Portfolio - Notes en vrac]]&lt;br /&gt;
*[[ITIL]]&lt;br /&gt;
*[[Vocabulaire &amp;amp; notions diverses]]&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Extension:SyntaxHighlight L&#039;extension SyntaxHighlight]&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheets==&lt;br /&gt;
* [[Idées diverses de gain de temps]]&lt;br /&gt;
* [[Raccourcis shell bash]]&lt;br /&gt;
* [[Raccourcis Vim]]&lt;br /&gt;
* [[Cs: Ansible]]&lt;br /&gt;
* [[CS : FirewallD]]&lt;br /&gt;
* [[Cs : Vim]]&lt;br /&gt;
* [[Cs:_Tips_Linux]]&lt;br /&gt;
* [[Cs: Git]]&lt;br /&gt;
* [[Cs: Pacman]]&lt;br /&gt;
* [[CS : lsof]]&lt;br /&gt;
* [[CS : SecuriteLinux]]&lt;br /&gt;
* [[Mémo_Apache|Mémo Apache]] &lt;br /&gt;
* [[Memo_nginx|Memo nginx]]   &lt;br /&gt;
* [[Mémo_Openssl|Mémo Openssl]]&lt;br /&gt;
&lt;br /&gt;
==Ansible== &lt;br /&gt;
* [[Ansible|Ansible]] &lt;br /&gt;
** [[Ansible : remplacement récursif de texte]]&lt;br /&gt;
** [[Ansible : Filtres]]&lt;br /&gt;
** [[Ansible : playbook avancé, avec handlers et templates]]&lt;br /&gt;
** [[Ansible : Quirks]]&lt;br /&gt;
** [[Ansible et Windows]]&lt;br /&gt;
** [[Ansible : awx-cli]]&lt;br /&gt;
** [[Ansible : Collections]]&lt;br /&gt;
** [[Ansible : sous-commandes]]&lt;br /&gt;
** [[Ansible : VMWare]]&lt;br /&gt;
&lt;br /&gt;
==Conteneurs== &lt;br /&gt;
[[Fichier:Moby-logo-small.png|90px]]  [[Fichier:K8s-small.png|90px]]&lt;br /&gt;
* [[Docker|Docker]] &lt;br /&gt;
* [[Docker-compose]]&lt;br /&gt;
* [[Traefik]]&lt;br /&gt;
* [[Docker swarm]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[LXD]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;/span&amp;gt;Systèmes&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt; &#039;&#039;&#039;[[File:869px-Tux.svg.png|40x49px|869px-Tux.svg.png]]&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
* [[Additions_Invité_sur_Linux|Additions Invité sur Linux]] &lt;br /&gt;
* [[Analyse de logs]]&lt;br /&gt;
** [[Rsyslog]]&lt;br /&gt;
** [[YAML]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
* [[Apache Tomcat]]&lt;br /&gt;
* [[Appels Système (syscall)]]&lt;br /&gt;
* [[APT]]&lt;br /&gt;
* [[Architecture système]]&lt;br /&gt;
* [[Asterisk|Asterisk]] &lt;br /&gt;
* [[Authentification - PAM]] &lt;br /&gt;
* [[Autostart]]&lt;br /&gt;
* [[Awk]]&lt;br /&gt;
* [[Bases_de_données|Bases de données]] &lt;br /&gt;
* [[Bind9]]&lt;br /&gt;
* [[Ceph]]&lt;br /&gt;
* [[Certbot]]&lt;br /&gt;
* [[Cgroups]]&lt;br /&gt;
* [[CheckMK]]&lt;br /&gt;
* [[Chronyd]]&lt;br /&gt;
* [[Cloud Computing]]&lt;br /&gt;
* [[Commandes analyse maillog]]&lt;br /&gt;
* [[Commandes de test de charge]]&lt;br /&gt;
* [[Commandes_Linux|Commandes Linux]] &lt;br /&gt;
* [[Convertir des .deb en .rpm avec alien]]&lt;br /&gt;
* [[Cryptographie|Cryptographie]] &lt;br /&gt;
** [[Protocole ACME]]&lt;br /&gt;
* [[Droits|Droits]] &lt;br /&gt;
* [[Environnement utilisateur]]&lt;br /&gt;
* [[Filesystems|Filesystems]] &lt;br /&gt;
** [[Surveillance de disques]]&lt;br /&gt;
* [[Firefox]]&lt;br /&gt;
* [[Fstab]]&lt;br /&gt;
* [[Gestion_de_paquets|Gestion de paquets]] &lt;br /&gt;
** [[Unattended-upgrades]]&lt;br /&gt;
* [[Grafana et prometheus]]&lt;br /&gt;
* [[Groupwares|Groupwares]] &lt;br /&gt;
* [[HAProxy]]&lt;br /&gt;
* [[Informations Système sous Linux]]&lt;br /&gt;
* [[Juju]]&lt;br /&gt;
* [[KeepaliveD]]&lt;br /&gt;
* [[Kernel Tuning]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[Kubernetes (obsolete)]]&lt;br /&gt;
* [[LAMP|LAMP]]&lt;br /&gt;
* [[LDAP]] &lt;br /&gt;
* [[Linux|Linux / Systèmes]] &lt;br /&gt;
* [[Linux : Permissions]]&lt;br /&gt;
* [[Attributs_Linux_étendus|Attributs Linux étendus]] &lt;br /&gt;
* [[Linux : Mémoire, RAM, swap]]&lt;br /&gt;
* [[Linux : Gestion de la résolution]]&lt;br /&gt;
* [[Logrotate]]&lt;br /&gt;
* [[Make]]&lt;br /&gt;
* [[Messagerie : Risques]]&lt;br /&gt;
* [[OAuth]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Pile son]]&lt;br /&gt;
* [[Postfix]]&lt;br /&gt;
* [[Processus et Appels Système]]&lt;br /&gt;
* [[Proxmox|Proxmox]] &lt;br /&gt;
* [[Raccourcis_shell_bash|Raccourcis shell bash]] &lt;br /&gt;
* [[Raccourcis_Vim|Raccourcis Vim]] &lt;br /&gt;
* [[Red Hat : Satellite 6]]&lt;br /&gt;
* [[Reverse Proxy Nginx]]&lt;br /&gt;
* [[Rsync,_SFTP,_RoboCopy|Rsync, SFTP, RoboCopy]] &lt;br /&gt;
* [[Screen]]&lt;br /&gt;
* [[Sed]]&lt;br /&gt;
* [[Sendmail]]&lt;br /&gt;
* [[Sshfs]]&lt;br /&gt;
* [[Sockets]]&lt;br /&gt;
* [[Steam cmd]]&lt;br /&gt;
* [[Stockage|Stockage]] &lt;br /&gt;
** [[LVM : opérations courantes]]&lt;br /&gt;
** [[Iscsiadm]]&lt;br /&gt;
** [[IscsiAdm + Multipath]]&lt;br /&gt;
* [[Structure de dossiers Linux]]&lt;br /&gt;
* [[Supervision]]&lt;br /&gt;
* [[Systemd]]&lt;br /&gt;
** [[Timesyncd]]&lt;br /&gt;
* [[Utilisateurs|Utilisateurs]] &lt;br /&gt;
* [[Varnish]]&lt;br /&gt;
* [[VMWare|VMWare]] &lt;br /&gt;
** [[VMWare : Utilisation de PowerCLI]]&lt;br /&gt;
** [[VMWare : Autres notions]]&lt;br /&gt;
&lt;br /&gt;
=== Spécificités Windows [[Fichier:Winlogo.png|50px]] === &lt;br /&gt;
&lt;br /&gt;
* [[Services_Windows|Services Windows]] &lt;br /&gt;
** [[Active_Directory|Active Directory]]&lt;br /&gt;
** [[WSUS_et_Core|WSUS et Core]] &lt;br /&gt;
** [[PowerShell|PowerShell]] &lt;br /&gt;
** [[GPO|GPO]] &lt;br /&gt;
** [[Exchange|Exchange]] &lt;br /&gt;
** [[Exchange pour de vrai]]&lt;br /&gt;
** [[Windows : Outils à connaître]]&lt;br /&gt;
** [[Powershell : Active Directory]]&lt;br /&gt;
** [[AD : intégration Linux]]&lt;br /&gt;
* [[Création de tâches planifiée]]&lt;br /&gt;
* [[Gestion d&#039;accès chez Microsoft]]&lt;br /&gt;
* [[Smbclient]]&lt;br /&gt;
* [[Commandes CMD utiles]]&lt;br /&gt;
&lt;br /&gt;
== Réseaux  [[File:Computer-networking.jpg|middle|77x60px|Computer-networking.jpg]] ==&lt;br /&gt;
&lt;br /&gt;
*[[DHCPv4|DHCPv4]] &lt;br /&gt;
*[[DHCPv6|DHCPv6]] &lt;br /&gt;
*[[DNS|DNS]] &lt;br /&gt;
*[[Ethernet|Ethernet]] &lt;br /&gt;
**[[FireWall_:_CheckPoint|FireWall : CheckPoint]]   &lt;br /&gt;
*[[Firewall|Firewall]] &lt;br /&gt;
**[[Firewall_:_Juniper|Firewall : Juniper]] &lt;br /&gt;
**[[FireWall : CheckPoint]]&lt;br /&gt;
**[[Firewalld]]&lt;br /&gt;
**[[IPTables]]&lt;br /&gt;
**[[Nftables]]&lt;br /&gt;
*[[Gestion_de_parc|Gestion de parc]] &lt;br /&gt;
*[[GlobalProtect sur linux]]&lt;br /&gt;
*[[ICMPv4|ICMPv4]] &lt;br /&gt;
*[[IPv4|IPv4]] &lt;br /&gt;
*[[IPv6|IPv6]] &lt;br /&gt;
* [[Knot DNS]]&lt;br /&gt;
*[[Liste_des_ports|Liste des ports]] &lt;br /&gt;
*[[Modèle_OSI_et_TCP/IP|Modèle OSI et TCP/IP]] &lt;br /&gt;
*[[NAT/PAT|NAT/PAT]] &lt;br /&gt;
*[[NetCat|NetCat]] &lt;br /&gt;
*[[Nmap]]&lt;br /&gt;
*[[Protocoles|Protocoles]] &lt;br /&gt;
*[[Proxy|Proxy]] &lt;br /&gt;
*[[Reseau|Reseau]] &lt;br /&gt;
*[[SNMP|SNMP]] &lt;br /&gt;
*[[SSH|SSH]] &lt;br /&gt;
*[[SSO|SSO]] &lt;br /&gt;
*[[TCP_&amp;amp;_UDP|TCP &amp;amp; UDP]] &lt;br /&gt;
*[[Tor]]&lt;br /&gt;
*[[VLAN|VLAN]] &lt;br /&gt;
*[[VPN|VPN]]&lt;br /&gt;
* [[Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Cisco NetAcad [[File:1200px-Cisco logo blue 2016.svg.png|middle|75x50px|1200px-Cisco logo blue 2016.svg.png]] ===&lt;br /&gt;
&lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_1|Cisco : R&amp;amp;S 1]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_2|Cisco : R&amp;amp;S 2]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_3|Cisco : R&amp;amp;S 3]]&lt;br /&gt;
&lt;br /&gt;
== Web ==&lt;br /&gt;
*[[CGI]]&lt;br /&gt;
*[[Websockets]]&lt;br /&gt;
&lt;br /&gt;
== Cybersécurité [[File:Padlock.png|Padlock.png|77x60px]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Cybersécurité|Cybersécurité : notions de base]] &lt;br /&gt;
*[[Cybersécurité_:_keepass|Cybersécurité : keepass]] &lt;br /&gt;
*[[Metasploit|Metasploit]] &lt;br /&gt;
*[[Cybersécurité_(Kali)_:_Crack_de_mots_de_passe_avec_Hydra|Cybersécurité (Kali) : Crack de mots de passe avec Hydra]] &lt;br /&gt;
*[[Cybersécurité_:_Documentation|Cybersécurité : Documentation]] &lt;br /&gt;
*[[Cybersécurité_:_Lynis|Cybersécurité : Lynis]] &lt;br /&gt;
*[[Cybersécurité_:_Graylog|Cybersécurité : Graylog]] &lt;br /&gt;
*[[Cybersécurité_:_Liens|Cybersécurité : Liens]]&lt;br /&gt;
*[[Messagerie : Risques]] &lt;br /&gt;
*[[Outils Divers]]&lt;br /&gt;
*[[Tests de charge]]&lt;br /&gt;
*[[Honeypot]]&lt;br /&gt;
* [[Shodan]]&lt;br /&gt;
* [https://github.com/certsocietegenerale/IRM/tree/master/EN Des méthodes simples d&#039;analyse]&lt;br /&gt;
* [[Ffuf : Fuzz Faster U Fool]]&lt;br /&gt;
* [[PGP - GPG]]&lt;br /&gt;
&lt;br /&gt;
=== HackTheBox Academy ===&lt;br /&gt;
Mes notes concernant mon suivi de modules sur HTB Academy - elles sont possiblement en anglais.&lt;br /&gt;
* [[HTBA : Active Directory Intro]]&lt;br /&gt;
&lt;br /&gt;
== Gestion de projet [[File:Gdpimage.png|middle|96x64px|Gdpimage.png]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Gestion_de_projet|Gestion de projet]] &lt;br /&gt;
*[[Outils_et_Méthodologie_de_Résolution_de_Problèmes_(MRP)|Outils et Méthodologie de Résolution de Problèmes (MRP)]] &lt;br /&gt;
*[[GDP_Agile_avec_SCRUM|GDP Agile avec SCRUM]]&lt;br /&gt;
&lt;br /&gt;
== Scripting / Programmation [[File:Python-7be70baaac.png|middle|69x69px|Python-7be70baaac.png]][[File:Bashlogo.png|middle|74x74px|Bashlogo.png]] ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
**[[Python : APIs]]&lt;br /&gt;
**[[Python : argparse]]&lt;br /&gt;
**[[Python : Black]]&lt;br /&gt;
**[[Python : coloration de texte]]&lt;br /&gt;
**[[Python_:_Context_Manager|Python : Context Manager]] &lt;br /&gt;
**[[Python : Dataclasses]]&lt;br /&gt;
**[[Python : datetimes]]&lt;br /&gt;
**[[Python : dictionnaires]]&lt;br /&gt;
**[[Python : Ensembles]]&lt;br /&gt;
**[[Python : Fichiers de config]]&lt;br /&gt;
**[[Python : Flask]]&lt;br /&gt;
***[[Python : Flask et SocketIO]]&lt;br /&gt;
**[[Python_:_Fonctions|Python : Fonctions]] &lt;br /&gt;
**[[Python : Fonctions de l&#039;interpréteur]]&lt;br /&gt;
**[[Python_:_Les_fichiers|Python : Les fichiers]]  &lt;br /&gt;
**[[Python : fstrings]] &lt;br /&gt;
**[[Python : Interactions avec Windows]]&lt;br /&gt;
**[[Python_:_Listes|Python : Listes]] &lt;br /&gt;
** [[Python : Locust (Tests de charge)]]&lt;br /&gt;
**[[Python_:_Méthodes_de_chaines|Python : Méthodes de chaines]] &lt;br /&gt;
**[[Python_:_misc|Python : misc]] &lt;br /&gt;
**[[Python : Opérateurs]]&lt;br /&gt;
**[[Python : Opérateur Binaires]]&lt;br /&gt;
**[[Python : os.walk()]]&lt;br /&gt;
**[[Python_-_PEP8|Python - PEP8]] &lt;br /&gt;
**[[Python : Pipenv]]&lt;br /&gt;
**[[Python : Pygame]]&lt;br /&gt;
**[[Python : PySimpleGUI]]&lt;br /&gt;
**[[Python_:_Programmation_Asynchrone|Python : Programmation Asynchrone]] &lt;br /&gt;
**[[Python_:_Programmation_système|Python : Programmation système]] &lt;br /&gt;
**[[Python_:_Réseau|Python : Réseau]] &lt;br /&gt;
**[[Python : simuler des inputs]]&lt;br /&gt;
**[[Python_:_Tkinter|Python : Tkinter]] &lt;br /&gt;
**[[Python : Virtualenv]]&lt;br /&gt;
**[[Python_:_Vocabulaire|Python : Vocabulaire]] &lt;br /&gt;
**[[Python_:_with_et_les_gestionnaires_de_contexte|Python : with et les gestionnaires de contexte]]&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
Il s&#039;agit de mes notes issues du livre officiel de Rust : [https://doc.rust-lang.org/book/ The Rust book] dans l&#039;ordre des chapitres.&lt;br /&gt;
&lt;br /&gt;
* [[Rust : Structs]]&lt;br /&gt;
* [[Rust: enums]]&lt;br /&gt;
* [[Rust : match]]&lt;br /&gt;
* [[Rust : if let]]&lt;br /&gt;
* [[Rust : packages]]&lt;br /&gt;
* [[Rust : Common collections]]&lt;br /&gt;
* [[Rust : Error handling]]&lt;br /&gt;
* [[Rust : génériques, traits, lifetimes]]&lt;br /&gt;
* [[Rust : tests automatisés]]&lt;br /&gt;
* [[Rust : iterateurs]]&lt;br /&gt;
(Le reste sur mon gitea).&lt;br /&gt;
&lt;br /&gt;
Autres notes:&lt;br /&gt;
* [[Rust : Debug avec GDB]]&lt;br /&gt;
* [[Rust : serde]]&lt;br /&gt;
* [[Rust : Display implementation and Rc + RefCell use demo]]&lt;br /&gt;
* [[Rust : async]]&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
**[[Bash|Bash : Anciennes notes]] &lt;br /&gt;
**[[Bash_:_Codes_de_retour|Bash : Codes de retour]] &lt;br /&gt;
**[[Bash_:_Fonctions|Bash : Fonctions]] &lt;br /&gt;
**[[Bash_:_généralités|Bash : généralités]] &lt;br /&gt;
**[[Bash_:_Paramètres_de_position|Bash : Paramètres de position]] &lt;br /&gt;
**[[Bash_:_Pattern_Matching|Bash : Pattern Matching]]  &lt;br /&gt;
**[[Bash_:_Tableaux|Bash : Tableaux]] &lt;br /&gt;
**[[Bash_:_Traitement_sur_les_chaînes|Bash : Traitement sur les chaînes]] &lt;br /&gt;
**[[Zsh]]&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
**[[PowerShell|PowerShell]] &lt;br /&gt;
**[[PowerShell_:_Scripting|PowerShell : Scripting]] &lt;br /&gt;
**[[PowerShell_:_scripts_complets|PowerShell : scripts complets]] &lt;br /&gt;
**[[PowerShell_:_Exporter_une_boîte_en_pst|PowerShell : Exporter une boîte en pst]]   &lt;br /&gt;
&lt;br /&gt;
=== Généralités ===&lt;br /&gt;
**[[Expressions_Régulières|Expressions Régulières]]&lt;br /&gt;
**[[RPC / REST]]&lt;br /&gt;
&lt;br /&gt;
=== Assembleur ===&lt;br /&gt;
* [[Assembleur|Assembleur (généralités)]]&lt;br /&gt;
* [[Assembleur : boot sector]]&lt;br /&gt;
&lt;br /&gt;
=== Langage C ===&lt;br /&gt;
** [[C : bases]]&lt;br /&gt;
**[[Langage C]]&lt;br /&gt;
&lt;br /&gt;
=== Golang ===&lt;br /&gt;
**[[Golang : bases]]&lt;br /&gt;
&lt;br /&gt;
== Hors-Sujet ==&lt;br /&gt;
&lt;br /&gt;
*[[Coaching_:_CV|Coaching : CV]]&lt;br /&gt;
*[[Droit|Droit]] &lt;br /&gt;
*[[Management|Management]] &lt;br /&gt;
*[[Ondes_radio|Ondes radio]]&lt;br /&gt;
*[[Vérités et contre-vérités]]&lt;br /&gt;
*[[Questions Sysadmin]]&lt;br /&gt;
*[[Comprendre comment fonctionne son organisation]]&lt;br /&gt;
&lt;br /&gt;
=== Musique ===&lt;br /&gt;
*[[Musique modale, musique tonale]]&lt;br /&gt;
*[[Gamme pentatonique]]&lt;br /&gt;
&lt;br /&gt;
== Jouer sur Linux ==&lt;br /&gt;
* [[Steam]]&lt;br /&gt;
* [[Optimus]]&lt;br /&gt;
&lt;br /&gt;
== Notes Personnelles ==&lt;br /&gt;
&lt;br /&gt;
Cette section contient des notes plus personnelles et moins rédigées, laissées là pour référence future.&lt;br /&gt;
&lt;br /&gt;
*[[Secure boot &amp;amp; pilotes nVIdia]]&lt;br /&gt;
*[[Dual boot et ennuis divers...]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;C’est pour ça : j’lis jamais rien. C’est un vrai piège à cons c’t’histoire-là. En plus j’sais pas lire.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Raccourcis_shell_bash&amp;diff=2537</id>
		<title>Raccourcis shell bash</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Raccourcis_shell_bash&amp;diff=2537"/>
		<updated>2024-07-25T22:38:01Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Une source intéressante [https://github.com/onceupon/Bash-Oneliner ici]&lt;br /&gt;
&lt;br /&gt;
[[Category:linux]]&lt;br /&gt;
Cette page contient des raccourcis et des astuces pour le Shell Linux. &lt;br /&gt;
&lt;br /&gt;
= Des variables d&#039;environnement =&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
$0   :name of shell or shell script.&lt;br /&gt;
$1, $2, $3, ... :positional parameters.&lt;br /&gt;
$#   :number of positional parameters.&lt;br /&gt;
$?   :most recent foreground pipeline exit status.&lt;br /&gt;
$-   :current options set for the shell.&lt;br /&gt;
$$   :pid of the current shell (not subshell).&lt;br /&gt;
$!   :is the PID of the most recent background command.&lt;br /&gt;
$_   :last argument of the previously executed command, or the path of the bash script.&lt;br /&gt;
&lt;br /&gt;
$DESKTOP_SESSION     current display manager&lt;br /&gt;
$EDITOR   preferred text editor.&lt;br /&gt;
$LANG   current language.&lt;br /&gt;
$PATH   list of directories to search for executable files (i.e. ready-to-run programs)&lt;br /&gt;
$PWD    current directory&lt;br /&gt;
$SHELL  current shell&lt;br /&gt;
$USER   current username&lt;br /&gt;
$HOSTNAME   current hostname&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Reprises de commandes =&lt;br /&gt;
&lt;br /&gt;
== Reprendre la dernière commande en y ajoutant sudo ==&lt;br /&gt;
 sudo !!&lt;br /&gt;
&lt;br /&gt;
== Reprendre la dernière commande ==&lt;br /&gt;
&lt;br /&gt;
!foo reprend la dernière commande commencant par &amp;quot;foo&amp;quot;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
!cat&lt;br /&gt;
# or&lt;br /&gt;
!c&lt;br /&gt;
# run cat filename again&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Refaire la dernière commande en la modifiant ==&lt;br /&gt;
Sur bash, le fait de taper !! va reprendre la dernière commande envoyée, telle quelle.&lt;br /&gt;
&lt;br /&gt;
Cela peut permettre par exemple de rajouter un sudo oublié :&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
~ &amp;gt; systemctl restart apache2&lt;br /&gt;
~ &amp;gt; sudo !!&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/Source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut également utiliser cela en faisant une substitution.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
~&amp;gt; systemctl restart apache2&lt;br /&gt;
~&amp;gt; !!:s/apache2/sshd&lt;br /&gt;
systemctl restart sshd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ici, la syntaxe s/truc/bidule rappelle bien évidemment sed.&lt;br /&gt;
&lt;br /&gt;
= Gestion de l&#039;édition =&lt;br /&gt;
&lt;br /&gt;
== Copier/coller du texte ==&lt;br /&gt;
&lt;br /&gt;
Couper du curseur jusqu&#039;à la fin de la ligne: Ctrl + k&lt;br /&gt;
&lt;br /&gt;
Couper du début jusqu&#039;au curseur : Ctrl + u&lt;br /&gt;
&lt;br /&gt;
Recoller ce texte coupé : Ctrl + y&lt;br /&gt;
&lt;br /&gt;
Couper le mot à gauche du curseur : Ctrl + w&lt;br /&gt;
&lt;br /&gt;
== Éditer la commande actuelle dans un éditeur de texte ==&lt;br /&gt;
&lt;br /&gt;
Si je commence à taper une commande assez longue et que je veux l&#039;éditer dans mon éditeur par défaut, il me suffit d&#039;utiliser :&lt;br /&gt;
&lt;br /&gt;
Ctrl + x + e&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez utile pour faire du bash, par exemple. Une fois que la commande est éditée, il n&#039;y a plus qu&#039;à faire enregistrer - quitter pour que la commande s&#039;exécute dans le shell.&lt;br /&gt;
&lt;br /&gt;
== Coller l&#039;argument de la commande précédente ==&lt;br /&gt;
&lt;br /&gt;
Je peux coller simplement l&#039;argument de la commande précédente à l&#039;aide du raccourci :&lt;br /&gt;
&lt;br /&gt;
Alt + .&lt;br /&gt;
&lt;br /&gt;
(Qui sur un clavier azerty se fait du coup avec Alt + Maj + La touche ;)&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez utile à la fin d&#039;une commande.&lt;br /&gt;
&lt;br /&gt;
== Effectuer une recherche dans les commandes déjà passées ==&lt;br /&gt;
&lt;br /&gt;
Ctrl + r permet de faire des recherches dans les commandes déjà passées pour les réutiliser.&lt;br /&gt;
&lt;br /&gt;
== Se déplacer au début / à la fin de la commande ==&lt;br /&gt;
&lt;br /&gt;
Pour aller au début de la commande : Ctrl + a&lt;br /&gt;
&lt;br /&gt;
Pour aller à la fin : Ctrl + e&lt;br /&gt;
&lt;br /&gt;
== Coller les arguments de la dernière commande utilisée ==&lt;br /&gt;
&lt;br /&gt;
Alt + .&lt;br /&gt;
&lt;br /&gt;
Sur un clavier azerty, il faut du coup faire Alt+shift+. (sinon ça fait Alt+;). On récupère les arguments de la dernière commande: si je fait&lt;br /&gt;
 echo oui&lt;br /&gt;
puis le raccourci, j&#039;obtient&lt;br /&gt;
 oui&lt;br /&gt;
&lt;br /&gt;
= Grep =&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
grep = grep -G # Basic Regular Expression (BRE)&lt;br /&gt;
fgrep = grep -F # fixed text, ignoring meta-characters&lt;br /&gt;
egrep = grep -E # Extended Regular Expression (ERE)&lt;br /&gt;
rgrep = grep -r # recursive&lt;br /&gt;
grep -P # Perl Compatible Regular Expressions (PCRE)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Autres =&lt;br /&gt;
== Le mode follow de less ==&lt;br /&gt;
&lt;br /&gt;
On peut remplacer tail par less pour avoir le même principe (l&#039;affichage du fichier en temps réel), mais avec la possibilité de pouvoir remonter dans le fichier, faire des recherches à l&#039;intérieur... Grâce au mode follow de less, accessible via shift + f. L&#039;inconvénient est qu&#039;il n&#039;affiche pas les numéros de lignes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Resetter le terminal? ==&lt;br /&gt;
&lt;br /&gt;
On peut taper la commande &amp;quot;reset&amp;quot; pour ramener le terminal à zéro si il rencontre un problème.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Raccourcis_shell_bash&amp;diff=2536</id>
		<title>Raccourcis shell bash</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Raccourcis_shell_bash&amp;diff=2536"/>
		<updated>2024-07-23T10:11:57Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Une source intéressante [https://github.com/onceupon/Bash-Oneliner ici]&lt;br /&gt;
&lt;br /&gt;
[[Category:linux]]&lt;br /&gt;
Cette page contient des raccourcis et des astuces pour le Shell Linux. &lt;br /&gt;
== Reprendre la dernière commande en y ajoutant sudo ==&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo !!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Copier/coller du texte ==&lt;br /&gt;
&lt;br /&gt;
Couper du curseur jusqu&#039;à la fin de la ligne: Ctrl + k&lt;br /&gt;
&lt;br /&gt;
Couper du début jusqu&#039;au curseur : Ctrl + u&lt;br /&gt;
&lt;br /&gt;
Recoller ce texte coupé : Ctrl + y&lt;br /&gt;
&lt;br /&gt;
Couper le mot à gauche du curseur : Ctrl + w&lt;br /&gt;
&lt;br /&gt;
== Le mode follow de less ==&lt;br /&gt;
&lt;br /&gt;
On peut remplacer tail par less pour avoir le même principe (l&#039;affichage du fichier en temps réel), mais avec la possibilité de pouvoir remonter dans le fichier, faire des recherches à l&#039;intérieur... Grâce au mode follow de less, accessible via shift + f. L&#039;inconvénient est qu&#039;il n&#039;affiche pas les numéros de lignes.&lt;br /&gt;
&lt;br /&gt;
== Éditer la commande actuelle dans un éditeur de texte ==&lt;br /&gt;
&lt;br /&gt;
Si je commence à taper une commande assez longue et que je veux l&#039;éditer dans mon éditeur par défaut, il me suffit d&#039;utiliser :&lt;br /&gt;
&lt;br /&gt;
Ctrl + x + e&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez utile pour faire du bash, par exemple. Une fois que la commande est éditée, il n&#039;y a plus qu&#039;à faire enregistrer - quitter pour que la commande s&#039;exécute dans le shell.&lt;br /&gt;
&lt;br /&gt;
== Coller l&#039;argument de la commande précédente ==&lt;br /&gt;
&lt;br /&gt;
Je peux coller simplement l&#039;argument de la commande précédente à l&#039;aide du raccourci :&lt;br /&gt;
&lt;br /&gt;
Alt + .&lt;br /&gt;
&lt;br /&gt;
(Qui sur un clavier azerty se fait du coup avec Alt + Maj + La touche ;)&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez utile à la fin d&#039;une commande.&lt;br /&gt;
&lt;br /&gt;
== Resetter le terminal? ==&lt;br /&gt;
&lt;br /&gt;
On peut taper la commande &amp;quot;reset&amp;quot; pour ramener le terminal à zéro si il rencontre un problème.&lt;br /&gt;
&lt;br /&gt;
== Effectuer une recherche dans les commandes déjà passées ==&lt;br /&gt;
&lt;br /&gt;
Ctrl + r permet de faire des recherches dans les commandes déjà passées pour les réutiliser.&lt;br /&gt;
&lt;br /&gt;
== Se déplacer au début / à la fin de la commande ==&lt;br /&gt;
&lt;br /&gt;
Pour aller au début de la commande : Ctrl + a&lt;br /&gt;
&lt;br /&gt;
Pour aller à la fin : Ctrl + e&lt;br /&gt;
&lt;br /&gt;
== Coller les arguments de la dernière commande utilisée ==&lt;br /&gt;
&lt;br /&gt;
Alt + .&lt;br /&gt;
&lt;br /&gt;
Sur un clavier azerty, il faut du coup faire Alt+shift+. (sinon ça fait Alt+;). On récupère les arguments de la dernière commande: si je fait&lt;br /&gt;
 echo oui&lt;br /&gt;
puis le raccourci, j&#039;obtient&lt;br /&gt;
 oui&lt;br /&gt;
&lt;br /&gt;
== Refaire la dernière commande en la modifiant ==&lt;br /&gt;
Sur bash, le fait de taper !! va reprendre la dernière commande envoyée, telle quelle.&lt;br /&gt;
&lt;br /&gt;
Cela peut permettre par exemple de rajouter un sudo oublié :&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
~ &amp;gt; systemctl restart apache2&lt;br /&gt;
~ &amp;gt; sudo !!&lt;br /&gt;
sudo systemctl restart apache2&lt;br /&gt;
&amp;lt;/Source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut également utiliser cela en faisant une substitution.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
~&amp;gt; systemctl restart apache2&lt;br /&gt;
~&amp;gt; !!:s/apache2/sshd&lt;br /&gt;
systemctl restart sshd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ici, la syntaxe s/truc/bidule rappelle bien évidemment sed.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Logrotate&amp;diff=2535</id>
		<title>Logrotate</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Logrotate&amp;diff=2535"/>
		<updated>2024-07-23T09:27:27Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
= Utilité =&lt;br /&gt;
Logrotate sert à faire tourner les fichiers de logs sous Linux, en les compressant et / ou en les effaçant.&lt;br /&gt;
&lt;br /&gt;
J&#039;en parle déjà [[Analyse_de_logs#Logrotate|Ici]]&lt;br /&gt;
&lt;br /&gt;
= Créer un script de logrotate =&lt;br /&gt;
https://www.thegeekstuff.com/2010/07/logrotate-examples/&lt;br /&gt;
&lt;br /&gt;
D&#039;abord, l&#039;emplacement des différents élements:&lt;br /&gt;
 * /usr/bin/logrotate: La commande en elle même&lt;br /&gt;
 * /etc/cron.daily/logrotate : Le script shell qui execute logrotate tous les jours&lt;br /&gt;
 * /etc/logrotate.conf : La configuration de rotation des logs est spécifiée ici&lt;br /&gt;
 * /etc/logrotate.d : Les paquets installés sur le systèmes lâchent leur configuration logrotate ici.&lt;br /&gt;
&lt;br /&gt;
== Lancer la commande logrotate à la main ==&lt;br /&gt;
&lt;br /&gt;
 logrotate -s /var/log/logstatus logrotate.conf&lt;br /&gt;
 # -s : on écrit le statut de la rotation dans logstatus&lt;br /&gt;
&lt;br /&gt;
== Exemples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/tmp/output.log {&lt;br /&gt;
        size 1k #On rotate au dela de 1ko&lt;br /&gt;
        monthly  #On rotate tous les mois (marche avec weekly, daily...)&lt;br /&gt;
        create 700 justine admins #Nouveau fichier créé avec autorisation 700, user justine, groupe admins&lt;br /&gt;
        rotate 4 #Combien de fichiers ayant déjà tourné on garde&lt;br /&gt;
        copytruncate #Pas compris... Aide le programme à loguer au bon endroit&lt;br /&gt;
        compress #Compresser les archives&lt;br /&gt;
        dateext #Mettre la date dans le nom des archives&lt;br /&gt;
        postrotate #Faire des choses après la compression&lt;br /&gt;
             /home/justine/script.sh&lt;br /&gt;
        maxage 100 #Toutes les archives + de 100 jours sont supprimées&lt;br /&gt;
        missingok #Pas de message d&#039;erreur si le fichier n&#039;existe pas&lt;br /&gt;
        compresscmd /bin/bzip2 #On précise la commande de compression...&lt;br /&gt;
        compressext #...et l&#039;extension&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un exemple fonctionnel (les commentaires ne sont pas acceptés)&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
/var/log/blogpull.log {&lt;br /&gt;
        size 1k &lt;br /&gt;
        weekly &lt;br /&gt;
        create 644 root root&lt;br /&gt;
        rotate 10&lt;br /&gt;
        copytruncate &lt;br /&gt;
        compress&lt;br /&gt;
        dateext&lt;br /&gt;
        maxage 100&lt;br /&gt;
        missingok&lt;br /&gt;
        compresscmd /bin/bzip2&lt;br /&gt;
        compressext .bz2&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tester mon fichier de conf ==&lt;br /&gt;
 logrotate -f /mon/fichier/de/conf&lt;br /&gt;
&lt;br /&gt;
= Compression multithread avec pigz =&lt;br /&gt;
* [https://www.makethenmakeinstall.com/2015/04/logrotate-with-alternate-compression-tool-such-as-pigz/ Source]&lt;br /&gt;
* [https://manpages.debian.org/bookworm/pigz/pigz.1.en.html Manuel]&lt;br /&gt;
&lt;br /&gt;
Par défaut, logrotate utilise gzip pour la compression des logs. Cet utilitaire suffit la plupart du temps, mais il a le défaut d&#039;être monothread. Il n&#039;est pas très efficace dans le cas de fichiers volumineux.&lt;br /&gt;
&lt;br /&gt;
On peut vouloir une alternative multi-thread si on de gros fichiers de logs, comme c&#039;est mon cas par exemple avec mon serveur syslog. On peut alors utiliser pigz, qui est une variante multi-threadée de gzip. &lt;br /&gt;
&lt;br /&gt;
Une version de logrotate supérieure ou égale à 3.8.1-5 est nécessaire pour gérer correctement les arguments dans compressoptions.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/data/syslog/*/*.log {&lt;br /&gt;
&lt;br /&gt;
# Fréquence de rotation par défaut :&lt;br /&gt;
    daily&lt;br /&gt;
&lt;br /&gt;
# Si l&#039;un des journaux décrit est manquant, aucune erreur n&#039;est remontée.&lt;br /&gt;
    missingok&lt;br /&gt;
&lt;br /&gt;
# Les logs sont compressés après rotation avec pigz sur 4 threads (-p4) :&lt;br /&gt;
    compress&lt;br /&gt;
    compresscmd /usr/bin/pigz&lt;br /&gt;
    compressoptions -p5&lt;br /&gt;
&lt;br /&gt;
# Compression le jour suivant&lt;br /&gt;
    delaycompress&lt;br /&gt;
&lt;br /&gt;
# Insertion de la date dans l&#039;archivage des journaux.&lt;br /&gt;
    dateext&lt;br /&gt;
&lt;br /&gt;
# Prise en compte de la date de la veille pour plus de cohérence&lt;br /&gt;
    dateyesterday&lt;br /&gt;
&lt;br /&gt;
# Conservation de l&#039;extension .log après rotation &amp;quot;-YYYYMMDD.log.gz&amp;quot;&lt;br /&gt;
    extension .log&lt;br /&gt;
&lt;br /&gt;
# Une rotation par jour est effectuée&lt;br /&gt;
    rotate 366&lt;br /&gt;
&lt;br /&gt;
# Si une archive est agée de plus de 366 jours, elle est détruite :&lt;br /&gt;
    maxage 366&lt;br /&gt;
&lt;br /&gt;
# Lors d&#039;une rotation, un fichier de remplacement est créé avec les droits 0640 appartenant à root et au groupe root.&lt;br /&gt;
    create 640 root root&lt;br /&gt;
&lt;br /&gt;
# Indique au service rsyslog qu&#039;une rotation des logs a été faite&lt;br /&gt;
    postrotate&lt;br /&gt;
          invoke-rc.d rsyslog rotate &amp;gt; /dev/null&lt;br /&gt;
    endscript&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Docker-compose&amp;diff=2534</id>
		<title>Docker-compose</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Docker-compose&amp;diff=2534"/>
		<updated>2024-07-16T21:04:22Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Conteneurs]]&lt;br /&gt;
[https://docs.docker.com/compose/compose-file/compose-file-v3/ Référence de la syntaxe en version 3]&lt;br /&gt;
&lt;br /&gt;
= Installer docker et docker-compose =&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
#Enlever les vieilles versions&lt;br /&gt;
sudo apt-get remove docker docker-engine docker.io containerd runc&lt;br /&gt;
#Préalable&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release&lt;br /&gt;
##Ajouter la clef GPG&lt;br /&gt;
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg&lt;br /&gt;
#Ajouter le repo&lt;br /&gt;
echo &amp;quot;deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable&amp;quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&lt;br /&gt;
#Installer Docker&lt;br /&gt;
apt update&lt;br /&gt;
apt install docker-ce docker-ce-cli containerd.io&lt;br /&gt;
#Installer docker-compose&lt;br /&gt;
apt install docker-compose&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Explication des versions de docker-compose =&lt;br /&gt;
[https://docs.docker.com/compose/compose-file/compose-versioning/ Doc sur les versions]&lt;br /&gt;
Il existe à l&#039;heure actuelle (Octobre 2021) trois versions de Docker-compose: Les versions 2 et 3 sont valides, la 1 est dépréciée. Il est recommandé d&#039;utiliser la dernière version, mais nous y reviendrons.&lt;br /&gt;
&lt;br /&gt;
Il faut spécifier la version au début de chaque fichier docker-compose. Pour cela:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
version :2&lt;br /&gt;
#Correspond à 2.0&lt;br /&gt;
version: 2.1&lt;br /&gt;
#Ou&lt;br /&gt;
version: 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si on ne mets pas cette ligne, le fichier est considéré comme étant en version 1.&lt;br /&gt;
&lt;br /&gt;
Les différences notables:&lt;br /&gt;
* Version 1 : Ne prend pas en compte la notion de networking, ni celle de volumes. Le seul moyen de lier des conteneurs est par l&#039;usage de links.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
web:&lt;br /&gt;
  build: .&lt;br /&gt;
  ports:&lt;br /&gt;
   - &amp;quot;5000:5000&amp;quot;&lt;br /&gt;
  volumes:&lt;br /&gt;
   - .:/code&lt;br /&gt;
  links:&lt;br /&gt;
   - redis&lt;br /&gt;
redis:&lt;br /&gt;
  image: redis&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Version 2 : On peut déclarer des volumes et des réseaux. Par défaut, les conteneurs sont dans le même réseau et leur hostname est leur nom; mais on peut faire ses propres réseaux. Les versions mineures ont apporté de nouveaux paramètres, voir ladoc en lien ci-dessus. &lt;br /&gt;
Exemple un peu &amp;quot;chiadé&amp;quot;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
version: &amp;quot;2.4&amp;quot;&lt;br /&gt;
services:&lt;br /&gt;
  web:&lt;br /&gt;
    build: .&lt;br /&gt;
    ports:&lt;br /&gt;
     - &amp;quot;5000:5000&amp;quot;&lt;br /&gt;
    volumes:&lt;br /&gt;
     - .:/code&lt;br /&gt;
    networks:&lt;br /&gt;
      - front-tier&lt;br /&gt;
      - back-tier&lt;br /&gt;
  redis:&lt;br /&gt;
    image: redis&lt;br /&gt;
    volumes:&lt;br /&gt;
      - redis-data:/var/lib/redis&lt;br /&gt;
    networks:&lt;br /&gt;
      - back-tier&lt;br /&gt;
volumes:&lt;br /&gt;
  redis-data:&lt;br /&gt;
    driver: local&lt;br /&gt;
networks:&lt;br /&gt;
  front-tier:&lt;br /&gt;
    driver: bridge&lt;br /&gt;
  back-tier:&lt;br /&gt;
    driver: bridge&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Version 3 : La version 3 a été conçue pour être cross-compatible avec le mode Swarm de docker-compose. De nombreuses options ont disparu :( La fonctionnalité deploy a été ajoutée, j&#039;y reviendrait plus bas. &lt;br /&gt;
&lt;br /&gt;
= Un exemple simple : freshrss =&lt;br /&gt;
Un fichier docker-compose doit **toujours** s&#039;appeller docker-compose.yml. En général, je fais un dossier pour chaque projet dans /opt.&lt;br /&gt;
&lt;br /&gt;
Le docker-compose suivant fait tourner un conteneur pour FreshRSS (un très bon lecteur de flux en mode web).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
version: &amp;quot;3&amp;quot;&lt;br /&gt;
services:&lt;br /&gt;
  freshrss:&lt;br /&gt;
    image: ghcr.io/linuxserver/freshrss&lt;br /&gt;
    container_name: freshrss&lt;br /&gt;
    environment:&lt;br /&gt;
      - PUID=1000&lt;br /&gt;
      - PGID=1000&lt;br /&gt;
      - TZ=Europe/London&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./config:/config&lt;br /&gt;
    ports:&lt;br /&gt;
      - 3100:80&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Explications:&lt;br /&gt;
* --- : marque le début d&#039;un fichier yaml.&lt;br /&gt;
* services : on va déclarer nos services.&lt;br /&gt;
* freshrss : nom de mon service&lt;br /&gt;
* image : nom de l&#039;image dans le [https://hub.docker.com/search?type=image docker hub]&lt;br /&gt;
* container_name : le nom de mon conteneur&lt;br /&gt;
* environment: Sert à déclarer des variables d&#039;environnement dans le conteneur. Celles-ci sont utilisées par mon application.&lt;br /&gt;
&lt;br /&gt;
== volumes ==&lt;br /&gt;
* volumes : on déclare des volumes. &lt;br /&gt;
Un volume est un dossier partagé entre le conteneur et la machine hôte. Ils servent surtout à y mettre les données importantes, pour ne pas les perdres entre deux démarrages. L&#039;utilisation de volumes est pratique car elle permet de ranger toute notre application dans un dossier avec son docker-compose, de la déplacer, la lancer ailleurs, etc. &lt;br /&gt;
&lt;br /&gt;
Mon docker-compose.yml est dans /opt/freshrss.&lt;br /&gt;
&lt;br /&gt;
Ici, la mention ./config:/config permet de binder (à gauche) le dossier de ma machine hôte /opt/freshrss/config avec (à droite) le dossier /config dans mon conteneur.&lt;br /&gt;
&lt;br /&gt;
== ports ==&lt;br /&gt;
* ports: on binde les ports.&lt;br /&gt;
Ici, il s&#039;agit de binder des ports, sur le même principe que pour le volume. Le port 3100 de mon hôte mènera ainsi au port 80 du conteneur. Par défaut, c&#039;est en tcp, mais on peut préciser (et même binder des ports de protocole différents):&lt;br /&gt;
3100/tcp:87/udp&lt;br /&gt;
&lt;br /&gt;
== Quand redémarre le conteneur ? ==&lt;br /&gt;
* restart : sert à définir les conditions de redémarrage du conteneur.&lt;br /&gt;
Peut être à no, always-on, unless-stopped, on-failure. Il s&#039;agit ici d&#039;une syntaxe de version 2, qui est compatible comme ça mais pas en mode swarm. La version swamr donnerait plutôt:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
version: &amp;quot;3.9&amp;quot;&lt;br /&gt;
services:&lt;br /&gt;
  redis:&lt;br /&gt;
    image: redis:alpine&lt;br /&gt;
    deploy:&lt;br /&gt;
      restart_policy:&lt;br /&gt;
        condition: on-failure&lt;br /&gt;
        delay: 5s&lt;br /&gt;
        max_attempts: 3&lt;br /&gt;
        window: 120s&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je ne rentre pas dans les détails sur la section deploy, je vais le faire juste après.&lt;br /&gt;
&lt;br /&gt;
= De façon (un peu) plus poussée =&lt;br /&gt;
== La section deploy, mode de compatibilité ==&lt;br /&gt;
Cette section, apparue en version 3, contient toutes les directives utiles à un déploiement sur swarm. Cependant, elle peut aussi contenir des choses utiles sans swarm, comme une limite de ram ou une restart-policy. Les deux choses qui m&#039;intéressent sont surtout:&lt;br /&gt;
* La limite de mémoire&lt;br /&gt;
* La restart policy&lt;br /&gt;
...car ce sont des choses que l&#039;on peut utiliser en version 3, sans swarm. En effet, par défaut, un lancement sans swarm ignore les directives dans deploy !&lt;br /&gt;
&lt;br /&gt;
Pour pouvoir lancer un fichier en version 3, sans swarm, avec une section deploy et en récupérant ce qui est récupérable, il faut lancer son fichier avec l&#039;option (non documentée) --compatibility. On va voir un exemple un peu plus parlant.&lt;br /&gt;
&lt;br /&gt;
== Un exemple avec des réseaux, des limites mémoire, 2 conteneurs ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
version: &amp;quot;3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  gitea:&lt;br /&gt;
    external: false&lt;br /&gt;
  db:&lt;br /&gt;
    external: false&lt;br /&gt;
    ipam:&lt;br /&gt;
      config:&lt;br /&gt;
        - subnet: 172.19.0.0/24&lt;br /&gt;
&lt;br /&gt;
services:&lt;br /&gt;
  database:&lt;br /&gt;
    image: mariadb:latest&lt;br /&gt;
    container_name: mariadb_gitea&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./gitea_db/:/var/lib/mysql&lt;br /&gt;
    environment:&lt;br /&gt;
      - MYSQL_ROOT_PASSWORD=ithaibai0C&lt;br /&gt;
      - MYSQL_DATABASE=gitea&lt;br /&gt;
      - MYSQL_USER=gitea&lt;br /&gt;
      - MYSQL_PASSWORD=ithaibai0C&lt;br /&gt;
    networks:&lt;br /&gt;
      db:&lt;br /&gt;
        ipv4_address: 172.19.0.10&lt;br /&gt;
    deploy:&lt;br /&gt;
      resources:&lt;br /&gt;
        limits:&lt;br /&gt;
          memory: 200M&lt;br /&gt;
        reservations:&lt;br /&gt;
          memory: 100M&lt;br /&gt;
&lt;br /&gt;
  server:&lt;br /&gt;
    image: gitea/gitea:latest&lt;br /&gt;
    container_name: gitea&lt;br /&gt;
    environment:&lt;br /&gt;
      - USER_UID=1000&lt;br /&gt;
      - USER_GID=1000&lt;br /&gt;
    restart: always&lt;br /&gt;
    networks:&lt;br /&gt;
      gitea:&lt;br /&gt;
      db:&lt;br /&gt;
        ipv4_address: 172.19.0.20&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./gitea:/data&lt;br /&gt;
      - /etc/timezone:/etc/timezone:ro&lt;br /&gt;
      - /etc/localtime:/etc/localtime:ro&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;3000:3000&amp;quot;&lt;br /&gt;
    deploy:&lt;br /&gt;
      resources:&lt;br /&gt;
        limits:&lt;br /&gt;
          memory: 200M&lt;br /&gt;
        reservations:&lt;br /&gt;
          memory: 100M&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== section network ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
networks:&lt;br /&gt;
  gitea:&lt;br /&gt;
    external: false&lt;br /&gt;
  db:&lt;br /&gt;
    external: false&lt;br /&gt;
    ipam:&lt;br /&gt;
      config:&lt;br /&gt;
        - subnet: 172.19.0.0/24&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Il n&#039;est pas obligatoire de déclarer des IPs pour s&#039;assurer de la connectivité des conteneurs; voir [[ Docker-compose#En_utilisant_les_hostnames ]]&lt;br /&gt;
Ici, je déclare mes réseaux. J&#039;en ai 2 ; gitea et db. L&#039;option external si elle est à True sert à rejoindre un réseau déjà existant (ce qui n&#039;est pas mon cas ici). Si elle est activée, docker-compose va chercher un réseau du nom de mon réseau et tenter de s&#039;y connecter.&lt;br /&gt;
&lt;br /&gt;
Par défaut, un réseau utilise une adresse privée aléatoire. Je peux définir le sous-réseau que je veux donner à mon réseau avec les options &amp;quot;ipam&amp;quot; et suivantes.&lt;br /&gt;
&lt;br /&gt;
Ensuite, pour chacun de mes conteneurs, je peux leur dire quelle adresse ils prendront si j&#039;ai définit un subnet dans la partie réseau (je ne peux pas leur définir d&#039;adresse sans avoir déclaré de subnet dans réseau bien sûr, et par défaut les conteneurs ont une adresse aléatoire):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
    networks:&lt;br /&gt;
      db:&lt;br /&gt;
        ipv4_address: 172.19.0.10&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== En utilisant les hostnames ===&lt;br /&gt;
Par défaut, deux conteneurs situés dans le même réseau peuvent résoudre les noms de conteneurs comme des noms dns. Dans l&#039;exemple ci-dessous, le conteneur &#039;alice&#039; peut parler à &#039;bob&#039; directement via une requête sur http://bob/stufftograb et ça se passera bien. Donc, configurer les réseaux est facultatif.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
version: &#039;3.3&#039;&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  monreseau:&lt;br /&gt;
&lt;br /&gt;
services:&lt;br /&gt;
  alice:&lt;br /&gt;
    restart: always&lt;br /&gt;
    environment:&lt;br /&gt;
      - MASTER_URL=http://bob/stufftograb&lt;br /&gt;
    networks:&lt;br /&gt;
      - monreseau&lt;br /&gt;
  bob:&lt;br /&gt;
    restart: always&lt;br /&gt;
    networks:&lt;br /&gt;
      - monreseau&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== section deploy : limites mémoire ==&lt;br /&gt;
En version 3 sans swarm, avec le mode de compatibilité, je peux limiter la ram allouée aux conteneurs (mais pas le CPU). Autrement, ils se servent allègrement jusqu&#039;à ce qu&#039;il n&#039;y en ai plus (et ils redémarrent).&lt;br /&gt;
&lt;br /&gt;
Cela se fait par la section suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
    deploy:&lt;br /&gt;
      resources:&lt;br /&gt;
        limits:&lt;br /&gt;
          memory: 200M&lt;br /&gt;
        reservations:&lt;br /&gt;
          memory: 100M&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ici, je limite à 200 Mo et je réserve 100Mo. &lt;br /&gt;
&lt;br /&gt;
== Choisir quel utilisateur lance les conteneurs ==&lt;br /&gt;
C&#039;est utile notamment pour savoir à quel utiisateur doivent appartenir les dossiers qui me servent de volumes. Cela se fait par la directive user: &amp;quot;UID:GID&amp;quot;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
service:&lt;br /&gt;
  database:&lt;br /&gt;
    container_name: mydb&lt;br /&gt;
    user: &amp;quot;1001:1001&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Choisir les serveurs DNS de mon conteneur ==&lt;br /&gt;
Cela se fait simplement via une directive appellée DNS:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
    blackbox-exporter:&lt;br /&gt;
        dns:&lt;br /&gt;
          - 9.9.9.9&lt;br /&gt;
          - 8.8.8.8&lt;br /&gt;
          - 1.1.1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, mon conteneur blackbox ira résoudre ses adresses auprès de quad9 (puis de Google, puis de Cloudflare).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Voir les stats de mes conteneurs (mémoire, cpu, etc) =&lt;br /&gt;
Cela se fait via la commande &amp;quot;docker stats&amp;quot;:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
docker stats&lt;br /&gt;
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT   MEM %     NET I/O           BLOCK I/O         PIDS&lt;br /&gt;
29448d6f6660   freshrss        0.01%     19.97MiB / 200MiB   9.98%     7.36kB / 6.41kB   221kB / 10.3MB    14&lt;br /&gt;
5700f28b120e   mariadb_gitea   0.03%     91.88MiB / 200MiB   45.94%    113kB / 269kB     17.8MB / 8.19kB   8&lt;br /&gt;
90751ba098af   gitea           0.00%     126.3MiB / 200MiB   63.13%    346kB / 1.44MB    745kB / 36.9kB    12&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Lancement, arrêt =&lt;br /&gt;
À effectuer en se trouvant dans le dossier de mon docker-compose.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
#Lancement normal&lt;br /&gt;
docker-compose up&lt;br /&gt;
#Lancement avec mise en arrière plan&lt;br /&gt;
docker-compose up -d&lt;br /&gt;
#Lancement avec mode de compatibilité&lt;br /&gt;
docker-compose --compatibility up -d&lt;br /&gt;
#Arrêt&lt;br /&gt;
docker-compose down&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Mise à jour d&#039;un conteneur en latest =&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
docker compose pull&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=CheckMK&amp;diff=2533</id>
		<title>CheckMK</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=CheckMK&amp;diff=2533"/>
		<updated>2024-07-03T08:05:37Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Un mot sur les MIBs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:linux]]&lt;br /&gt;
Cette page contient diverses astuces pour l&#039;outil de supervision qu&#039;est Check_MK&lt;br /&gt;
&lt;br /&gt;
== Lire / vider les logwatch ==&lt;br /&gt;
&lt;br /&gt;
Pour cela, il suffit d&#039;accéder à l&#039;interface de logwatch via https://adressedu/site/logwatch.py&lt;br /&gt;
&lt;br /&gt;
== Tester un agent ==&lt;br /&gt;
A faire depuis le serveur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;bash&#039;&amp;gt;&lt;br /&gt;
OMD[mysite]:~$ telnet 10.1.1.2 6556&lt;br /&gt;
Trying 10.1.1.2...&lt;br /&gt;
Connected to 10.1.1.2.&lt;br /&gt;
Escape character is &#039;^]&#039;.&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;check_mk&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
Version: 1.2.7i1&lt;br /&gt;
AgentOS: linux&lt;br /&gt;
AgentDirectory: /etc/check_mk&lt;br /&gt;
DataDirectory: /var/lib/check_mk_agent&lt;br /&gt;
SpoolDirectory: /var/lib/check_mk_agent/spool&lt;br /&gt;
PluginsDirectory: /usr/lib/check_mk_agent/plugins&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installer un agent avec systemd (à tester) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# How to install Check MK Agent on ubuntu 16.04&lt;br /&gt;
&lt;br /&gt;
# Install check_mk_agent:&lt;br /&gt;
#   - sudo apt-get install check-mk-agent (will install older version)&lt;br /&gt;
#   - On your Check_MK dashboard, go to &amp;quot;Monitoring Agents&amp;quot;, click the link for &amp;quot;Check_MK Agent for Linux&amp;quot;, save the raw text&lt;br /&gt;
#     on your server:&lt;br /&gt;
&lt;br /&gt;
sudo vi /usr/bin/check_mk_agent&lt;br /&gt;
# paste Check_MK dashboard &amp;gt; Monitoring Agents &amp;gt; Check_MK Agent for Linux&lt;br /&gt;
&lt;br /&gt;
sudo chmod +x /usr/bin/check_mk_agent&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Setup Systemd&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
sudo vi /etc/systemd/system/check_mk.socket&lt;br /&gt;
# paste Check_MK dashboard &amp;gt; Monitoring Agents &amp;gt; systemd SOCKET definition file&lt;br /&gt;
&lt;br /&gt;
sudo vi /etc/systemd/system/check_mk@.service&lt;br /&gt;
# paste Check_MK dashboard &amp;gt; Monitoring Agents &amp;gt; systemd SERVICE definition file&lt;br /&gt;
&lt;br /&gt;
#start&lt;br /&gt;
sudo systemctl daemon-reload&lt;br /&gt;
sudo systemctl enable check_mk.socket&lt;br /&gt;
sudo systemctl start check_mk.socket&lt;br /&gt;
&lt;br /&gt;
# Add firewall rule from specific OMD Server IP&lt;br /&gt;
sudo ufw allow from 15.15.15.0/24 to any port 6556&lt;br /&gt;
&lt;br /&gt;
#test on another host&lt;br /&gt;
nc -v &amp;lt;ip address&amp;gt; 6556&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ecriture d&#039;un plugin SNMP =&lt;br /&gt;
https://docs.checkmk.com/master/en/devel_check_plugins.html#snmp&lt;br /&gt;
https://docs.checkmk.com/master/en/snmp.html&lt;br /&gt;
http://www.pawelko.net/?s=check_mk&lt;br /&gt;
&lt;br /&gt;
== Un mot sur le terme plugin ==&lt;br /&gt;
Jusque ici, j&#039;ai beaucoup utilisé des sondes : un script posé sur la cible et qui est exécuté au lancement de l&#039;agent, formatte des infos et les renvoie. Ce sont ce que j&#039;appelle des sondes. Les plugins fonctionnent autrement. Dans le cas où je passe par un agent:&lt;br /&gt;
* Je créée sur la machine supervisée, dans /usr/lib/check_mk_agent/plugins, un fichier au nom quelconque et qui contiendra les valeurs suivantes:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;NomDuService&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
Commande renvoyant les infos brutes&lt;br /&gt;
#Par exemple:&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;uptime&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
uptime -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ainsi, l&#039;agent verra un plugin, et rajoutera dans sa sorte une section NomDuService, laquelle contiendra de l&#039;information.&lt;br /&gt;
* Sur mon serveur CMK, je vais créer un plugin en python décrivant comment ce plugin est utilisé. Il décrit la façon dont les données renvoyées doivent être interprétées (gravité...).&lt;br /&gt;
&lt;br /&gt;
== Préambule ==&lt;br /&gt;
&lt;br /&gt;
Traditionnellement, CMK procède de la façon suivante : la cible (machine supervisée) possède un agent. Le serveur de supervision va interroger cette cible qui renvoie alors ces informations. Les informations sont récupérées grâce à des commandes shell et mise en forme dans un long str qui est renvoyé au serveur. Dans le cas de SNMP, c&#039;est différent. On ne passe par cet agent : le serveur CMK va utiliser des scripts qu&#039;il possède afin de savoir comment interroger la cible via SNMP.&lt;br /&gt;
&lt;br /&gt;
== Les bases de SNMP ==&lt;br /&gt;
[[SNMP]]&lt;br /&gt;
&lt;br /&gt;
Il faut configurer le serveur en question pour qu&#039;il accepte les requêtes SNMP. On peut utiliser n&#039;importe quelle version et community.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on créée le serveur dans CMK, on donne les paramètres SNMP, on fait un diag pour voir si ça fonctionne. Simple.&lt;br /&gt;
&lt;br /&gt;
== Étapes de préparation ==&lt;br /&gt;
=== Principe ===&lt;br /&gt;
La détection de service se fait en deux phases. D&#039;abord, D&#039;abord, une détection SNMP a lieu, afin de déterminer quels plugins sont utilisables sur la machine en question. Pour ça, on scanne quelques OIDs, le plus important étant sysdescr : 1.3.6.1.2.1.1.0. Cet OID donne toujours une description de l&#039;appareil, par exemple &amp;quot;Cisco NX-OS(tm) n5000&amp;quot;. Rien qu&#039;en se basant sur cet OID, on peut déterminer si un plugin sera utile; si ça ne suffit pas, on peut ajouter d&#039;autres OID à la détection SNMP.&lt;br /&gt;
&lt;br /&gt;
Ensuite, la découverte des des données de supervision proprement dites a lieu (c&#039;est la détection de services, comme avec un agent quand je vais découvrir les services que celui-ci me renvoie). Elles sont ensuite combinées dans une table et fournies à la fonction de discovery du check dans l&#039;argument &amp;quot;section&amp;quot;, qui comme d&#039;habitude détermine les items à surveiller.&lt;br /&gt;
&lt;br /&gt;
Enfin, les checks ont lieu. On sait alors déjà quels plugins sont utilisés puisqu&#039;on a fait nos découvertes. Ici les données sont récupérées par un walk SNMP et à partir de ça l&#039;argument &amp;quot;section&amp;quot; peut être renseigné. &lt;br /&gt;
&lt;br /&gt;
En résumé, on a pas besoin d&#039;un agent, mais:&lt;br /&gt;
* d&#039;OIDs individuels et de texte à y chercher pour la détection SNMP (est-ce que mon plugin s&#039;applique ici ?)&lt;br /&gt;
* de zones SNMP sur lesquelles faire des walks afin de récupérer les infos.&lt;br /&gt;
&lt;br /&gt;
Les plugins SNMP sont considérés comme des plugins, &lt;br /&gt;
&lt;br /&gt;
=== Un mot sur les MIBs ===&lt;br /&gt;
&lt;br /&gt;
Alors, les MIBs, CMK peut fonctionner sans. Il a son propre set de MiBs par défaut, qui décrivent des zones générales dans l&#039;arbre des OID. Mais il se peut qu&#039;elles ne suffisent pas : on peut alors récupérer une MIB sur le site du vendeur, afin que CMK puisse traduire des OIDs en noms lors de ses walks. Les MIBs se mettent alors dans local/share/check_mk/mibs :&lt;br /&gt;
&lt;br /&gt;
Pour rappel, chaque site CMK a son propre utilisateur sur le serveur, et le home de cet utilisateur contient tous les fichiers de configuration. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
root@supervision:/home/justine# su - sys&lt;br /&gt;
OMD[sys]:~$ cd local/share/check_mk/mibs/&lt;br /&gt;
OMD[sys]:~/local/share/check_mk/mibs$ ls&lt;br /&gt;
OMD[sys]:~/local/share/check_mk/mibs$ #Déposer les mibs ici :)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Récupérer les OIDs intéressants ===&lt;br /&gt;
Pour faire un plugin, je dois savoir ce que je veux monitorer. La première étape consiste à faire un walk *entier* afin de savoir quelles sont toutes les infos disponibles. En ligne de commande et en étant dans le bon utilisateur CMK, on a une simple commande permettant de le faire; la condition préalable est que la machine a superviser ait été correctement renseignée dans l&#039;interface, avec ses paramètres SNMP. On aura un fichier pour nous aider à écrire notre plugin. En supposant que la machine s&#039;appelle &amp;quot;mydevice01&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
OMD[mysite]:~$ cmk -v --snmpwalk mydevice01&lt;br /&gt;
mydevice01:&lt;br /&gt;
Walk on &amp;quot;.1.3.6.1.2.1&amp;quot;...3898 variables.&lt;br /&gt;
Walk on &amp;quot;.1.3.6.1.4.1&amp;quot;...6025 variables.&lt;br /&gt;
Wrote fetched data to /omd/sites/heute/var/check_mk/snmpwalks/mydevice01.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce process peut prendre des minutes, ou même des heures. On nous dit ici que les données ont été écrites dans un fichier texte, facile à lire il ressemble à cela:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
.1.3.6.1.2.1.1.1.0 JetStream 24-Port Gigabit L2 Managed Switch with 4 Combo SFP Slots&lt;br /&gt;
.1.3.6.1.2.1.1.2.0 .1.3.6.1.4.1.11863.1.1.3&lt;br /&gt;
.1.3.6.1.2.1.1.3.0 546522419&lt;br /&gt;
.1.3.6.1.2.1.1.4.0 hh@example.com&lt;br /&gt;
.1.3.6.1.2.1.1.5.0 sw-ks-01&lt;br /&gt;
etc&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On trouve chaque OID et sa valeur (la première ligne étant le sysdescr !). Les OIDs n&#039;étant pas parlant, et si on a les bonnes MIBs d&#039;installées, on peut dans un second temps faire en sorte que ce walk soit traduit pour nos beaux yeux:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
OMD[heute]:~$ cmk --snmptranslate mydevice01  &amp;gt; translated&lt;br /&gt;
Processing 9923 lines.&lt;br /&gt;
finished.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, on redirige tout ça dans &amp;quot;translated&amp;quot;, sinon ça s&#039;affiche sur la sortie standard. On a alors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
.1.3.6.1.2.1.1.1.0 JetStream 24-Port Gigabit L2 Managed Switch with 4 Combo SFP Slots --&amp;gt; SNMPv2-MIB::sysDescr.0&lt;br /&gt;
.1.3.6.1.2.1.1.2.0 .1.3.6.1.4.1.11863.1.1.3 --&amp;gt; SNMPv2-MIB::sysObjectID.0&lt;br /&gt;
.1.3.6.1.2.1.1.3.0 546522419 --&amp;gt; DISMAN-EVENT-MIB::sysUpTimeInstance&lt;br /&gt;
.1.3.6.1.2.1.1.4.0 hh@example.com --&amp;gt; SNMPv2-MIB::sysContact.0&lt;br /&gt;
.1.3.6.1.2.1.1.5.0 sw-ks-01 --&amp;gt; SNMPv2-MIB::sysName.0&lt;br /&gt;
.1.3.6.1.2.1.1.6.0 Core Switch Serverraum klein --&amp;gt; SNMPv2-MIB::sysLocation.0&lt;br /&gt;
.1.3.6.1.2.1.1.7.0 3 --&amp;gt; SNMPv2-MIB::sysServices.0&lt;br /&gt;
.1.3.6.1.2.1.2.1.0 27 --&amp;gt; IF-MIB::ifNumber.0&lt;br /&gt;
.1.3.6.1.2.1.2.2.1.1.1 1 --&amp;gt; IF-MIB::ifIndex.1&lt;br /&gt;
.1.3.6.1.2.1.2.2.1.1.2 2 --&amp;gt; IF-MIB::ifIndex.2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Écriture d&#039;un plugin ==&lt;br /&gt;
&lt;br /&gt;
Maintenant qu&#039;on a nos OID, on va développer le plugin. On va faire trois choses:&lt;br /&gt;
* Pour sa détection SNMP, spécifier quelles OIDs doivent contenir quel texte pour que notre plugin soit lancé.&lt;br /&gt;
* Déclarer quelles OIDs seront interrogées pour la supervision.&lt;br /&gt;
* Ecrire un plugin analogue à ceux utilisés pour un check par agent.&lt;br /&gt;
&lt;br /&gt;
Jusque ici tout allait bien... Mais ce n&#039;est plus le cas. La doc dit d&#039;enregistrer, pour les deux premières étapes, une section dans local/lib/check_mk/base/plugins/agent_based/foo.py... Mais le dossier local/lib/check_mk n&#039;existe pas. Et en prenant mes checks compellent, qui sont dans ~/local/share/check_mk/checks, ça n&#039;as pas la même tête. Ces checks datent certes de 2015. Mais alors, à quoi doit ressembler mon fichier ?&lt;br /&gt;
&lt;br /&gt;
=== Qu&#039;est-ce que c&#039;est que ce bazar ? Analyse d&#039;un check compellent ===&lt;br /&gt;
&lt;br /&gt;
Je sais que mes checks Compellent, installés par un package, fonctionnent (et ça sans agent). Le dossier Checks ne contient pas que des checks SNMP, certes; mais ceux-ci en sont.&lt;br /&gt;
&lt;br /&gt;
En voici un:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Check_mk Plugin For Dell Compellent SC4020&lt;br /&gt;
# Licence : GPL&lt;br /&gt;
# Cyril Pawelko - cyril@pawelko.net&lt;br /&gt;
# 03/2015&lt;br /&gt;
&lt;br /&gt;
def inventory_dell_compellent_ctlrfan(info):&lt;br /&gt;
    return [ (&amp;quot;%s&amp;quot; % (x[2]) , None) for x in info ]&lt;br /&gt;
&lt;br /&gt;
def check_dell_compellent_ctlrfan(item, _no_params, info):&lt;br /&gt;
        for line in info:&lt;br /&gt;
                if line[2] == item:&lt;br /&gt;
                        ident = &amp;quot;Enclosure Fan %s (%s)&amp;quot; % (line[0],line[2])&lt;br /&gt;
                        #  ScStatus (INTEGER) {up( 1 ),down( 2 ),degraded( 3 )}&lt;br /&gt;
                        if line[1] == &amp;quot;1&amp;quot; : return (0,ident + &amp;quot; is OK&amp;quot;)&lt;br /&gt;
                        elif line[1] == &amp;quot;3&amp;quot; : return (1, ident + &amp;quot; is degraded(!)&amp;quot;)&lt;br /&gt;
                        elif line[1] == &amp;quot;2&amp;quot; : return (2, ident + &amp;quot; is down(!!)&amp;quot;)&lt;br /&gt;
                        else : return(3, ident + &amp;quot; state unknown&amp;quot;)&lt;br /&gt;
        return (3, &amp;quot;Controller Fan %s not found&amp;quot; % item )&lt;br /&gt;
&lt;br /&gt;
check_info[&amp;quot;dell_compellent_ctlrfan&amp;quot;] = {&lt;br /&gt;
    &amp;quot;check_function&amp;quot;        : check_dell_compellent_ctlrfan,&lt;br /&gt;
    &amp;quot;inventory_function&amp;quot;    : inventory_dell_compellent_ctlrfan,&lt;br /&gt;
    &amp;quot;service_description&amp;quot;   : &amp;quot;%s&amp;quot;,&lt;br /&gt;
    &amp;quot;has_perfdata&amp;quot;          : False,&lt;br /&gt;
    &amp;quot;snmp_scan_function&amp;quot;    : lambda oid: &amp;quot;compellent&amp;quot; in oid(&amp;quot;.1.3.6.1.2.1.1.1.0&amp;quot;).lower() and\&lt;br /&gt;
                                                                oid(&amp;quot;.1.3.6.1.4.1.16139.2.15.1.7.1&amp;quot;) != &amp;quot;EN-SC4020&amp;quot; and # SC-4020 has enclosure fans, but no controller fan \&lt;br /&gt;
                                                                oid(&amp;quot;.1.3.6.1.4.1.16139.2.1.0&amp;quot;) != None,&lt;br /&gt;
    &amp;quot;snmp_info&amp;quot;             : ( &amp;quot;.1.3.6.1.4.1.16139.2.16.1&amp;quot;, [&lt;br /&gt;
                                        2, # 0 scEnclFanNbr&lt;br /&gt;
                                        3, # 1 scEnclFanStatus&lt;br /&gt;
                                        4, # 2 scEnclFanLocation&lt;br /&gt;
                              ]),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trois parties:&lt;br /&gt;
* inventory_dell_compellent_ctlrfan(info) : fonction d&#039;inventaire. Je ne comprends pas ce qu&#039;elle fait. Je suppose que pour mes deux fonctions, info est ce que renvoient les walks décrits dans la 3e partie.&lt;br /&gt;
* check_dell_compellent_ctlrfan : fonction check : semble renvoyer (numéro décrivant la gravité, informations à afficher). Prend info, mais aussi _no_params et item, je ne sais pas ce que c&#039;est.&lt;br /&gt;
* check_info[&amp;quot;dell_compellent_ctlrfan&amp;quot;] : définit toutes les infos concernant ce check, y compris l&#039;appel des deux fonctions au-dessus:&lt;br /&gt;
** check_function : ma fonction de check, exécutée en lui donnant les infos&lt;br /&gt;
** inventory_function : ma fonction d&#039;inventaire&lt;br /&gt;
** service description : %s ? Devrait renvoyer la description du servie, mais je ne connais pas ce formatage à l&#039;ancienne&lt;br /&gt;
** has_perfdata : false ici, je suppose qu&#039;on peut renvoyer des valeurs pour des graphes&lt;br /&gt;
** snmp_scan_function : Cette horrible fonction lambda renvoie True si le mot &amp;quot;compellent&amp;quot; est dans le sysdescr et qu&#039;on a les bons équipements&lt;br /&gt;
** snmp_info : je suppose qu&#039;il s&#039;agit du walk, lequel renvoie les infos.&lt;br /&gt;
&lt;br /&gt;
=== Analyse d&#039;un check plus récent ===&lt;br /&gt;
&lt;br /&gt;
Ici, un check plus récent pour une box (peu importe):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def inventory_adsl_line(info):&lt;br /&gt;
    for oid_end,adslLineCoding, adslLineType, adslLineSpecific, \&lt;br /&gt;
        adslAturInvSerialNumber, adslAturInvVendorID, adslAturInvVersionNumber, \&lt;br /&gt;
        adslAturCurrSnrMgn, adslAturCurrAtn, adslAturCurrStatus, adslAturCurrOutputPwr, \&lt;br /&gt;
        adslAturCurrAttainableRate, adslAtucChanCurrTxRate, adslAturChanCurrTxRate \&lt;br /&gt;
    in info:&lt;br /&gt;
        yield oid_end, None # item name follows oid enumeration&lt;br /&gt;
&lt;br /&gt;
def check_adsl_line(item, params, info):&lt;br /&gt;
    # try to extract check parameters&lt;br /&gt;
    if &#039;downstream_params&#039; in params:&lt;br /&gt;
        downstream_warn,downstream_crit = params[&#039;downstream_params&#039;]&lt;br /&gt;
    else:&lt;br /&gt;
#[ABREGE]&lt;br /&gt;
&lt;br /&gt;
def scan_adsl(oid):&lt;br /&gt;
    sys_descr = oid(&amp;quot;.1.3.6.1.2.1.1.1.0&amp;quot;).lower()&lt;br /&gt;
    for type_ in [ &amp;quot;vigor130&amp;quot;, &amp;quot;vigor165&amp;quot;, ]:  &lt;br /&gt;
      if type_ in sys_descr:&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
check_info[&amp;quot;adsl_line&amp;quot;] = {&lt;br /&gt;
    &amp;quot;check_function&amp;quot;        : check_adsl_line,&lt;br /&gt;
    &amp;quot;group&amp;quot;                 : &amp;quot;adsl_line&amp;quot;,&lt;br /&gt;
    &amp;quot;inventory_function&amp;quot;    : inventory_adsl_line,&lt;br /&gt;
    &amp;quot;service_description&amp;quot;   : &amp;quot;ADSL at Interface  %s&amp;quot;,&lt;br /&gt;
    &amp;quot;snmp_info&amp;quot;             : ( &amp;quot;.1.3.6.1.2.1.10.94.1.1&amp;quot;, [ \&lt;br /&gt;
       OID_END, # interface number&lt;br /&gt;
       &amp;quot;1.1.1&amp;quot;, # adslLineCoding&lt;br /&gt;
       &amp;quot;1.1.2&amp;quot;, # adslLineType&lt;br /&gt;
       &amp;quot;1.1.3&amp;quot;, # adslLineSpecific&lt;br /&gt;
       &amp;quot;3.1.1&amp;quot;, # adslAturInvSerialNumber&lt;br /&gt;
       &amp;quot;3.1.2&amp;quot;, # adslAturInvVendorID&lt;br /&gt;
       &amp;quot;3.1.3&amp;quot;, # adslAturInvVersionNumber&lt;br /&gt;
       &amp;quot;3.1.4&amp;quot;, # adslAturCurrSnrMgn&lt;br /&gt;
       &amp;quot;3.1.5&amp;quot;, # adslAturCurrAtn&lt;br /&gt;
       &amp;quot;3.1.6&amp;quot;, # adslAturCurrStatus&lt;br /&gt;
       &amp;quot;3.1.7&amp;quot;, # adslAturCurrOutputPwr&lt;br /&gt;
       &amp;quot;3.1.8&amp;quot;, # adslAturCurrAttainableRate&lt;br /&gt;
       &amp;quot;4.1.2&amp;quot;, # adslAtucChanCurrTxRate&lt;br /&gt;
       &amp;quot;5.1.2&amp;quot;, # adslAtucChanCurrTxRate&lt;br /&gt;
       ] ),&lt;br /&gt;
   &amp;quot;snmp_scan_function&amp;quot;     : scan_adsl,&lt;br /&gt;
   &amp;quot;includes&amp;quot;               : [&amp;quot;if.include&amp;quot;],&lt;br /&gt;
   &amp;quot;has_perfdata&amp;quot;           : True&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, j&#039;ai toujours ma fonction de check, mais aussi un groupe ? et on voit bien que ma fonction de scan sert à déterminer si l&#039;équipement en question est concerné.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Optimus&amp;diff=2532</id>
		<title>Optimus</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Optimus&amp;diff=2532"/>
		<updated>2024-06-15T09:34:37Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Avec Gamescope */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Optimus : utiliser deux GPU =&lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
* https://wiki.archlinux.org/title/Gamescope&lt;br /&gt;
* https://wiki.archlinux.org/title/PRIME&lt;br /&gt;
* https://wiki.archlinux.org/title/NVIDIA_Optimus&lt;br /&gt;
* https://docs.mesa3d.org/envvars.html&lt;br /&gt;
&lt;br /&gt;
Pour une raison ou pour une autre, on peut vouloir utiliser deux GPU sous Linux. Dans mon cas, j&#039;utilise le GPU Radeon intégré à mon processeur pour le bureau et le GPU Nvidia dédié pour les jeux vidéo. &lt;br /&gt;
&lt;br /&gt;
Sous Wayland en 2024, c&#039;est plutôt bien géré : il n&#039;y a pas grand-chose à faire, Steam choisissant tout seul le GPU NVidia pour lancer les jeux. Cependant, on peut avoir quelques déconvenues.&lt;br /&gt;
&lt;br /&gt;
== Envycontrol : un script user-friendly de sélection du GPU ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bayasdev/envycontrol/ Envycontrol] est disponible dans le AUR ou sur Github. Il permet de choisir simplement son GPU, voir son aide. Il peut être particulièrement utile pour désactiver le GPU dédié d&#039;un PC portable afin d&#039;économiser de la batterie, par exemple.&lt;br /&gt;
&lt;br /&gt;
== Avec Gamescope ==&lt;br /&gt;
* https://github.com/ValveSoftware/gamescope/issues/498&lt;br /&gt;
&lt;br /&gt;
Note : ça ne fonctionne pas, chez moi en tout cas.&lt;br /&gt;
&lt;br /&gt;
Gamescope peut poser des soucis dans ce genre de configuration, il faut lui préciser via le driver mesa quel GPU utiliser. Pour ça on utilise des variables d&#039;environnement. Au préalable, on va récupérer quelques informations. Lancer:&lt;br /&gt;
 &lt;br /&gt;
 lspci -nn&lt;br /&gt;
&lt;br /&gt;
On va chercher à récupérer le vendorID et deviceID du GPU dédié. Dans mon cas:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
236 justine@~ &amp;gt; lspci -nn | grep VGA&lt;br /&gt;
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation AD104 [GeForce RTX 4070 Ti] [10de:2782] (rev a1)&lt;br /&gt;
0d:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Phoenix1 [1002:15bf] (rev 06)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici les informations sont entre crochets, je note les valeurs 10de:2782 pour mon GPU Nvidia.&lt;br /&gt;
&lt;br /&gt;
Ensuite, pour lancer CS2 dans Steam par exemple, mes options de lancement ressemble à ça:&lt;br /&gt;
 DRI_PRIME=1 MESA_VK_DEVICE_SELECT=10de:1347 NV_PRIME_RENDER_OFFLOAD=1 VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia gamescope --force-grab-cursor -W 3440 -H 1440 -r 144 -- %command% +exec autoexec.cfg&lt;br /&gt;
&lt;br /&gt;
* DRI_PRIME=1 : La Doc Arch précise que lorsque l&#039;on utilise PRIME (donc que l&#039;on a un GPU NVidia) il faut set cette variable pour utiliser le GPU dédié. Je n&#039;ai pas trouvé beaucoup d&#039;infos ?&lt;br /&gt;
* MESA_VK_DEVICE_SELECT=10de:2782 : c&#039;est ici que l&#039;on utilise les valeurs VendorID et DeviceID récupéré plus haut.&lt;br /&gt;
* NV_PRIME_RENDER_OFFLOAD=1 VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia : pas sûre&lt;br /&gt;
* gamescope etc : commande de lancement du jeu avec une résolution précise, etc.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Optimus&amp;diff=2531</id>
		<title>Optimus</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Optimus&amp;diff=2531"/>
		<updated>2024-06-15T09:19:33Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Optimus : utiliser deux GPU =&lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
* https://wiki.archlinux.org/title/Gamescope&lt;br /&gt;
* https://wiki.archlinux.org/title/PRIME&lt;br /&gt;
* https://wiki.archlinux.org/title/NVIDIA_Optimus&lt;br /&gt;
* https://docs.mesa3d.org/envvars.html&lt;br /&gt;
&lt;br /&gt;
Pour une raison ou pour une autre, on peut vouloir utiliser deux GPU sous Linux. Dans mon cas, j&#039;utilise le GPU Radeon intégré à mon processeur pour le bureau et le GPU Nvidia dédié pour les jeux vidéo. &lt;br /&gt;
&lt;br /&gt;
Sous Wayland en 2024, c&#039;est plutôt bien géré : il n&#039;y a pas grand-chose à faire, Steam choisissant tout seul le GPU NVidia pour lancer les jeux. Cependant, on peut avoir quelques déconvenues.&lt;br /&gt;
&lt;br /&gt;
== Envycontrol : un script user-friendly de sélection du GPU ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bayasdev/envycontrol/ Envycontrol] est disponible dans le AUR ou sur Github. Il permet de choisir simplement son GPU, voir son aide. Il peut être particulièrement utile pour désactiver le GPU dédié d&#039;un PC portable afin d&#039;économiser de la batterie, par exemple.&lt;br /&gt;
&lt;br /&gt;
== Avec Gamescope ==&lt;br /&gt;
&lt;br /&gt;
Gamescope peut poser des soucis dans ce genre de configuration, il faut lui préciser via le driver mesa quel GPU utiliser. Pour ça on utilise des variables d&#039;environnement. Au préalable, on va récupérer quelques informations. Lancer:&lt;br /&gt;
 &lt;br /&gt;
 lspci -nn&lt;br /&gt;
&lt;br /&gt;
On va chercher à récupérer le vendorID et deviceID du GPU dédié. Dans mon cas:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
236 justine@~ &amp;gt; lspci -nn | grep VGA&lt;br /&gt;
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation AD104 [GeForce RTX 4070 Ti] [10de:2782] (rev a1)&lt;br /&gt;
0d:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Phoenix1 [1002:15bf] (rev 06)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici les informations sont entre crochets, je note les valeurs 10de:2782 pour mon GPU Nvidia.&lt;br /&gt;
&lt;br /&gt;
Ensuite, pour lancer CS2 dans Steam par exemple, mes options de lancement ressemble à ça:&lt;br /&gt;
 DRI_PRIME=1 MESA_VK_DEVICE_SELECT=10de:1347 NV_PRIME_RENDER_OFFLOAD=1 VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia gamescope --force-grab-cursor -W 3440 -H 1440 -r 144 -- %command% +exec autoexec.cfg&lt;br /&gt;
&lt;br /&gt;
* DRI_PRIME=1 : La Doc Arch précise que lorsque l&#039;on utilise PRIME (donc que l&#039;on a un GPU NVidia) il faut set cette variable pour utiliser le GPU dédié. Je n&#039;ai pas trouvé beaucoup d&#039;infos ?&lt;br /&gt;
* MESA_VK_DEVICE_SELECT=10de:2782 : c&#039;est ici que l&#039;on utilise les valeurs VendorID et DeviceID récupéré plus haut.&lt;br /&gt;
* NV_PRIME_RENDER_OFFLOAD=1 VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia : pas sûre&lt;br /&gt;
* gamescope etc : commande de lancement du jeu avec une résolution précise, etc.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2530</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2530"/>
		<updated>2024-06-15T09:18:00Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Jouer sur Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Disclaimer ==&lt;br /&gt;
Ceci est mon wiki personnel, rédigé au cours de mes études et de ma carrière; je n&#039;ai pas la prétention que tout y soit exact.&lt;br /&gt;
Toutes les pages utiles sont en lien sur la présente page de sommaire. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes personnelles, que je ne mettrait à jour que si j&#039;en ressens le besoin. Il peut parfois s&#039;agir de traduction d&#039;articles existants, si c&#039;est le cas, le lien original est en général au sommet de la page.&lt;br /&gt;
&lt;br /&gt;
[[Logo du site]]&lt;br /&gt;
&lt;br /&gt;
Justine&lt;br /&gt;
&lt;br /&gt;
==Autres / Aide==&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Help:Formatting/fr Aide au formatage]&lt;br /&gt;
*[https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf Aide au langage markdown (pour Git)]&lt;br /&gt;
*[[Portfolio - Notes en vrac]]&lt;br /&gt;
*[[ITIL]]&lt;br /&gt;
*[[Vocabulaire &amp;amp; notions diverses]]&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Extension:SyntaxHighlight L&#039;extension SyntaxHighlight]&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheets==&lt;br /&gt;
* [[Idées diverses de gain de temps]]&lt;br /&gt;
&lt;br /&gt;
* [[Cs: Ansible]]&lt;br /&gt;
* [[CS : FirewallD]]&lt;br /&gt;
* [[Cs : Vim]]&lt;br /&gt;
* [[Cs:_Tips_Linux]]&lt;br /&gt;
* [[Cs: Git]]&lt;br /&gt;
* [[Cs: Pacman]]&lt;br /&gt;
* [[CS : lsof]]&lt;br /&gt;
* [[CS : SecuriteLinux]]&lt;br /&gt;
* [[Mémo_Apache|Mémo Apache]] &lt;br /&gt;
* [[Memo_nginx|Memo nginx]]   &lt;br /&gt;
* [[Mémo_Openssl|Mémo Openssl]]&lt;br /&gt;
&lt;br /&gt;
==Ansible== &lt;br /&gt;
* [[Ansible|Ansible]] &lt;br /&gt;
** [[Ansible : remplacement récursif de texte]]&lt;br /&gt;
** [[Ansible : Filtres]]&lt;br /&gt;
** [[Ansible : playbook avancé, avec handlers et templates]]&lt;br /&gt;
** [[Ansible : Quirks]]&lt;br /&gt;
** [[Ansible et Windows]]&lt;br /&gt;
** [[Ansible : awx-cli]]&lt;br /&gt;
** [[Ansible : Collections]]&lt;br /&gt;
** [[Ansible : sous-commandes]]&lt;br /&gt;
** [[Ansible : VMWare]]&lt;br /&gt;
&lt;br /&gt;
==Conteneurs== &lt;br /&gt;
[[Fichier:Moby-logo-small.png|90px]]  [[Fichier:K8s-small.png|90px]]&lt;br /&gt;
* [[Docker|Docker]] &lt;br /&gt;
* [[Docker-compose]]&lt;br /&gt;
* [[Traefik]]&lt;br /&gt;
* [[Docker swarm]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[LXD]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;/span&amp;gt;Systèmes&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt; &#039;&#039;&#039;[[File:869px-Tux.svg.png|40x49px|869px-Tux.svg.png]]&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
* [[Additions_Invité_sur_Linux|Additions Invité sur Linux]] &lt;br /&gt;
* [[Analyse de logs]]&lt;br /&gt;
** [[Rsyslog]]&lt;br /&gt;
** [[YAML]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
* [[Apache Tomcat]]&lt;br /&gt;
* [[Appels Système (syscall)]]&lt;br /&gt;
* [[APT]]&lt;br /&gt;
* [[Architecture système]]&lt;br /&gt;
* [[Asterisk|Asterisk]] &lt;br /&gt;
* [[Authentification - PAM]] &lt;br /&gt;
* [[Autostart]]&lt;br /&gt;
* [[Awk]]&lt;br /&gt;
* [[Bases_de_données|Bases de données]] &lt;br /&gt;
* [[Bind9]]&lt;br /&gt;
* [[Ceph]]&lt;br /&gt;
* [[Certbot]]&lt;br /&gt;
* [[Cgroups]]&lt;br /&gt;
* [[CheckMK]]&lt;br /&gt;
* [[Chronyd]]&lt;br /&gt;
* [[Cloud Computing]]&lt;br /&gt;
* [[Commandes analyse maillog]]&lt;br /&gt;
* [[Commandes de test de charge]]&lt;br /&gt;
* [[Commandes_Linux|Commandes Linux]] &lt;br /&gt;
* [[Convertir des .deb en .rpm avec alien]]&lt;br /&gt;
* [[Cryptographie|Cryptographie]] &lt;br /&gt;
** [[Protocole ACME]]&lt;br /&gt;
* [[Droits|Droits]] &lt;br /&gt;
* [[Environnement utilisateur]]&lt;br /&gt;
* [[Filesystems|Filesystems]] &lt;br /&gt;
** [[Surveillance de disques]]&lt;br /&gt;
* [[Firefox]]&lt;br /&gt;
* [[Fstab]]&lt;br /&gt;
* [[Gestion_de_paquets|Gestion de paquets]] &lt;br /&gt;
** [[Unattended-upgrades]]&lt;br /&gt;
* [[Grafana et prometheus]]&lt;br /&gt;
* [[Groupwares|Groupwares]] &lt;br /&gt;
* [[HAProxy]]&lt;br /&gt;
* [[Informations Système sous Linux]]&lt;br /&gt;
* [[Juju]]&lt;br /&gt;
* [[KeepaliveD]]&lt;br /&gt;
* [[Kernel Tuning]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[Kubernetes (obsolete)]]&lt;br /&gt;
* [[LAMP|LAMP]]&lt;br /&gt;
* [[LDAP]] &lt;br /&gt;
* [[Linux|Linux / Systèmes]] &lt;br /&gt;
* [[Linux : Permissions]]&lt;br /&gt;
* [[Attributs_Linux_étendus|Attributs Linux étendus]] &lt;br /&gt;
* [[Linux : Mémoire, RAM, swap]]&lt;br /&gt;
* [[Linux : Gestion de la résolution]]&lt;br /&gt;
* [[Logrotate]]&lt;br /&gt;
* [[Make]]&lt;br /&gt;
* [[Messagerie : Risques]]&lt;br /&gt;
* [[OAuth]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Pile son]]&lt;br /&gt;
* [[Postfix]]&lt;br /&gt;
* [[Processus et Appels Système]]&lt;br /&gt;
* [[Proxmox|Proxmox]] &lt;br /&gt;
* [[Raccourcis_shell_bash|Raccourcis shell bash]] &lt;br /&gt;
* [[Raccourcis_Vim|Raccourcis Vim]] &lt;br /&gt;
* [[Red Hat : Satellite 6]]&lt;br /&gt;
* [[Reverse Proxy Nginx]]&lt;br /&gt;
* [[Rsync,_SFTP,_RoboCopy|Rsync, SFTP, RoboCopy]] &lt;br /&gt;
* [[Screen]]&lt;br /&gt;
* [[Sed]]&lt;br /&gt;
* [[Sendmail]]&lt;br /&gt;
* [[Sshfs]]&lt;br /&gt;
* [[Sockets]]&lt;br /&gt;
* [[Steam cmd]]&lt;br /&gt;
* [[Stockage|Stockage]] &lt;br /&gt;
** [[LVM : opérations courantes]]&lt;br /&gt;
** [[Iscsiadm]]&lt;br /&gt;
** [[IscsiAdm + Multipath]]&lt;br /&gt;
* [[Structure de dossiers Linux]]&lt;br /&gt;
* [[Supervision]]&lt;br /&gt;
* [[Systemd]]&lt;br /&gt;
** [[Timesyncd]]&lt;br /&gt;
* [[Utilisateurs|Utilisateurs]] &lt;br /&gt;
* [[Varnish]]&lt;br /&gt;
* [[VMWare|VMWare]] &lt;br /&gt;
** [[VMWare : Utilisation de PowerCLI]]&lt;br /&gt;
** [[VMWare : Autres notions]]&lt;br /&gt;
&lt;br /&gt;
=== Spécificités Windows [[Fichier:Winlogo.png|50px]] === &lt;br /&gt;
&lt;br /&gt;
* [[Services_Windows|Services Windows]] &lt;br /&gt;
** [[Active_Directory|Active Directory]]&lt;br /&gt;
** [[WSUS_et_Core|WSUS et Core]] &lt;br /&gt;
** [[PowerShell|PowerShell]] &lt;br /&gt;
** [[GPO|GPO]] &lt;br /&gt;
** [[Exchange|Exchange]] &lt;br /&gt;
** [[Exchange pour de vrai]]&lt;br /&gt;
** [[Windows : Outils à connaître]]&lt;br /&gt;
** [[Powershell : Active Directory]]&lt;br /&gt;
** [[AD : intégration Linux]]&lt;br /&gt;
* [[Création de tâches planifiée]]&lt;br /&gt;
* [[Gestion d&#039;accès chez Microsoft]]&lt;br /&gt;
* [[Smbclient]]&lt;br /&gt;
* [[Commandes CMD utiles]]&lt;br /&gt;
&lt;br /&gt;
== Réseaux  [[File:Computer-networking.jpg|middle|77x60px|Computer-networking.jpg]] ==&lt;br /&gt;
&lt;br /&gt;
*[[DHCPv4|DHCPv4]] &lt;br /&gt;
*[[DHCPv6|DHCPv6]] &lt;br /&gt;
*[[DNS|DNS]] &lt;br /&gt;
*[[Ethernet|Ethernet]] &lt;br /&gt;
**[[FireWall_:_CheckPoint|FireWall : CheckPoint]]   &lt;br /&gt;
*[[Firewall|Firewall]] &lt;br /&gt;
**[[Firewall_:_Juniper|Firewall : Juniper]] &lt;br /&gt;
**[[FireWall : CheckPoint]]&lt;br /&gt;
**[[Firewalld]]&lt;br /&gt;
**[[IPTables]]&lt;br /&gt;
**[[Nftables]]&lt;br /&gt;
*[[Gestion_de_parc|Gestion de parc]] &lt;br /&gt;
*[[GlobalProtect sur linux]]&lt;br /&gt;
*[[ICMPv4|ICMPv4]] &lt;br /&gt;
*[[IPv4|IPv4]] &lt;br /&gt;
*[[IPv6|IPv6]] &lt;br /&gt;
* [[Knot DNS]]&lt;br /&gt;
*[[Liste_des_ports|Liste des ports]] &lt;br /&gt;
*[[Modèle_OSI_et_TCP/IP|Modèle OSI et TCP/IP]] &lt;br /&gt;
*[[NAT/PAT|NAT/PAT]] &lt;br /&gt;
*[[NetCat|NetCat]] &lt;br /&gt;
*[[Nmap]]&lt;br /&gt;
*[[Protocoles|Protocoles]] &lt;br /&gt;
*[[Proxy|Proxy]] &lt;br /&gt;
*[[Reseau|Reseau]] &lt;br /&gt;
*[[SNMP|SNMP]] &lt;br /&gt;
*[[SSH|SSH]] &lt;br /&gt;
*[[SSO|SSO]] &lt;br /&gt;
*[[TCP_&amp;amp;_UDP|TCP &amp;amp; UDP]] &lt;br /&gt;
*[[Tor]]&lt;br /&gt;
*[[VLAN|VLAN]] &lt;br /&gt;
*[[VPN|VPN]]&lt;br /&gt;
* [[Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Cisco NetAcad [[File:1200px-Cisco logo blue 2016.svg.png|middle|75x50px|1200px-Cisco logo blue 2016.svg.png]] ===&lt;br /&gt;
&lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_1|Cisco : R&amp;amp;S 1]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_2|Cisco : R&amp;amp;S 2]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_3|Cisco : R&amp;amp;S 3]]&lt;br /&gt;
&lt;br /&gt;
== Web ==&lt;br /&gt;
*[[CGI]]&lt;br /&gt;
*[[Websockets]]&lt;br /&gt;
&lt;br /&gt;
== Cybersécurité [[File:Padlock.png|Padlock.png|77x60px]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Cybersécurité|Cybersécurité : notions de base]] &lt;br /&gt;
*[[Cybersécurité_:_keepass|Cybersécurité : keepass]] &lt;br /&gt;
*[[Metasploit|Metasploit]] &lt;br /&gt;
*[[Cybersécurité_(Kali)_:_Crack_de_mots_de_passe_avec_Hydra|Cybersécurité (Kali) : Crack de mots de passe avec Hydra]] &lt;br /&gt;
*[[Cybersécurité_:_Documentation|Cybersécurité : Documentation]] &lt;br /&gt;
*[[Cybersécurité_:_Lynis|Cybersécurité : Lynis]] &lt;br /&gt;
*[[Cybersécurité_:_Graylog|Cybersécurité : Graylog]] &lt;br /&gt;
*[[Cybersécurité_:_Liens|Cybersécurité : Liens]]&lt;br /&gt;
*[[Messagerie : Risques]] &lt;br /&gt;
*[[Outils Divers]]&lt;br /&gt;
*[[Tests de charge]]&lt;br /&gt;
*[[Honeypot]]&lt;br /&gt;
* [[Shodan]]&lt;br /&gt;
* [https://github.com/certsocietegenerale/IRM/tree/master/EN Des méthodes simples d&#039;analyse]&lt;br /&gt;
* [[Ffuf : Fuzz Faster U Fool]]&lt;br /&gt;
* [[PGP - GPG]]&lt;br /&gt;
&lt;br /&gt;
=== HackTheBox Academy ===&lt;br /&gt;
Mes notes concernant mon suivi de modules sur HTB Academy - elles sont possiblement en anglais.&lt;br /&gt;
* [[HTBA : Active Directory Intro]]&lt;br /&gt;
&lt;br /&gt;
== Gestion de projet [[File:Gdpimage.png|middle|96x64px|Gdpimage.png]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Gestion_de_projet|Gestion de projet]] &lt;br /&gt;
*[[Outils_et_Méthodologie_de_Résolution_de_Problèmes_(MRP)|Outils et Méthodologie de Résolution de Problèmes (MRP)]] &lt;br /&gt;
*[[GDP_Agile_avec_SCRUM|GDP Agile avec SCRUM]]&lt;br /&gt;
&lt;br /&gt;
== Scripting / Programmation [[File:Python-7be70baaac.png|middle|69x69px|Python-7be70baaac.png]][[File:Bashlogo.png|middle|74x74px|Bashlogo.png]] ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
**[[Python : APIs]]&lt;br /&gt;
**[[Python : argparse]]&lt;br /&gt;
**[[Python : Black]]&lt;br /&gt;
**[[Python : coloration de texte]]&lt;br /&gt;
**[[Python_:_Context_Manager|Python : Context Manager]] &lt;br /&gt;
**[[Python : Dataclasses]]&lt;br /&gt;
**[[Python : datetimes]]&lt;br /&gt;
**[[Python : dictionnaires]]&lt;br /&gt;
**[[Python : Ensembles]]&lt;br /&gt;
**[[Python : Fichiers de config]]&lt;br /&gt;
**[[Python : Flask]]&lt;br /&gt;
***[[Python : Flask et SocketIO]]&lt;br /&gt;
**[[Python_:_Fonctions|Python : Fonctions]] &lt;br /&gt;
**[[Python : Fonctions de l&#039;interpréteur]]&lt;br /&gt;
**[[Python_:_Les_fichiers|Python : Les fichiers]]  &lt;br /&gt;
**[[Python : fstrings]] &lt;br /&gt;
**[[Python : Interactions avec Windows]]&lt;br /&gt;
**[[Python_:_Listes|Python : Listes]] &lt;br /&gt;
** [[Python : Locust (Tests de charge)]]&lt;br /&gt;
**[[Python_:_Méthodes_de_chaines|Python : Méthodes de chaines]] &lt;br /&gt;
**[[Python_:_misc|Python : misc]] &lt;br /&gt;
**[[Python : Opérateurs]]&lt;br /&gt;
**[[Python : Opérateur Binaires]]&lt;br /&gt;
**[[Python : os.walk()]]&lt;br /&gt;
**[[Python_-_PEP8|Python - PEP8]] &lt;br /&gt;
**[[Python : Pipenv]]&lt;br /&gt;
**[[Python : Pygame]]&lt;br /&gt;
**[[Python : PySimpleGUI]]&lt;br /&gt;
**[[Python_:_Programmation_Asynchrone|Python : Programmation Asynchrone]] &lt;br /&gt;
**[[Python_:_Programmation_système|Python : Programmation système]] &lt;br /&gt;
**[[Python_:_Réseau|Python : Réseau]] &lt;br /&gt;
**[[Python : simuler des inputs]]&lt;br /&gt;
**[[Python_:_Tkinter|Python : Tkinter]] &lt;br /&gt;
**[[Python : Virtualenv]]&lt;br /&gt;
**[[Python_:_Vocabulaire|Python : Vocabulaire]] &lt;br /&gt;
**[[Python_:_with_et_les_gestionnaires_de_contexte|Python : with et les gestionnaires de contexte]]&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
Il s&#039;agit de mes notes issues du livre officiel de Rust : [https://doc.rust-lang.org/book/ The Rust book] dans l&#039;ordre des chapitres.&lt;br /&gt;
&lt;br /&gt;
* [[Rust : Structs]]&lt;br /&gt;
* [[Rust: enums]]&lt;br /&gt;
* [[Rust : match]]&lt;br /&gt;
* [[Rust : if let]]&lt;br /&gt;
* [[Rust : packages]]&lt;br /&gt;
* [[Rust : Common collections]]&lt;br /&gt;
* [[Rust : Error handling]]&lt;br /&gt;
* [[Rust : génériques, traits, lifetimes]]&lt;br /&gt;
* [[Rust : tests automatisés]]&lt;br /&gt;
* [[Rust : iterateurs]]&lt;br /&gt;
(Le reste sur mon gitea).&lt;br /&gt;
&lt;br /&gt;
Autres notes:&lt;br /&gt;
* [[Rust : Debug avec GDB]]&lt;br /&gt;
* [[Rust : serde]]&lt;br /&gt;
* [[Rust : Display implementation and Rc + RefCell use demo]]&lt;br /&gt;
* [[Rust : async]]&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
**[[Bash|Bash : Anciennes notes]] &lt;br /&gt;
**[[Bash_:_Codes_de_retour|Bash : Codes de retour]] &lt;br /&gt;
**[[Bash_:_Fonctions|Bash : Fonctions]] &lt;br /&gt;
**[[Bash_:_généralités|Bash : généralités]] &lt;br /&gt;
**[[Bash_:_Paramètres_de_position|Bash : Paramètres de position]] &lt;br /&gt;
**[[Bash_:_Pattern_Matching|Bash : Pattern Matching]]  &lt;br /&gt;
**[[Bash_:_Tableaux|Bash : Tableaux]] &lt;br /&gt;
**[[Bash_:_Traitement_sur_les_chaînes|Bash : Traitement sur les chaînes]] &lt;br /&gt;
**[[Zsh]]&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
**[[PowerShell|PowerShell]] &lt;br /&gt;
**[[PowerShell_:_Scripting|PowerShell : Scripting]] &lt;br /&gt;
**[[PowerShell_:_scripts_complets|PowerShell : scripts complets]] &lt;br /&gt;
**[[PowerShell_:_Exporter_une_boîte_en_pst|PowerShell : Exporter une boîte en pst]]   &lt;br /&gt;
&lt;br /&gt;
=== Généralités ===&lt;br /&gt;
**[[Expressions_Régulières|Expressions Régulières]]&lt;br /&gt;
**[[RPC / REST]]&lt;br /&gt;
&lt;br /&gt;
=== Assembleur ===&lt;br /&gt;
* [[Assembleur|Assembleur (généralités)]]&lt;br /&gt;
* [[Assembleur : boot sector]]&lt;br /&gt;
&lt;br /&gt;
=== Langage C ===&lt;br /&gt;
** [[C : bases]]&lt;br /&gt;
**[[Langage C]]&lt;br /&gt;
&lt;br /&gt;
=== Golang ===&lt;br /&gt;
**[[Golang : bases]]&lt;br /&gt;
&lt;br /&gt;
== Hors-Sujet ==&lt;br /&gt;
&lt;br /&gt;
*[[Coaching_:_CV|Coaching : CV]]&lt;br /&gt;
*[[Droit|Droit]] &lt;br /&gt;
*[[Management|Management]] &lt;br /&gt;
*[[Ondes_radio|Ondes radio]]&lt;br /&gt;
*[[Vérités et contre-vérités]]&lt;br /&gt;
*[[Questions Sysadmin]]&lt;br /&gt;
*[[Comprendre comment fonctionne son organisation]]&lt;br /&gt;
&lt;br /&gt;
=== Musique ===&lt;br /&gt;
*[[Musique modale, musique tonale]]&lt;br /&gt;
*[[Gamme pentatonique]]&lt;br /&gt;
&lt;br /&gt;
== Jouer sur Linux ==&lt;br /&gt;
* [[Steam]]&lt;br /&gt;
* [[Optimus]]&lt;br /&gt;
&lt;br /&gt;
== Notes Personnelles ==&lt;br /&gt;
&lt;br /&gt;
Cette section contient des notes plus personnelles et moins rédigées, laissées là pour référence future.&lt;br /&gt;
&lt;br /&gt;
*[[Secure boot &amp;amp; pilotes nVIdia]]&lt;br /&gt;
*[[Dual boot et ennuis divers...]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;C’est pour ça : j’lis jamais rien. C’est un vrai piège à cons c’t’histoire-là. En plus j’sais pas lire.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Optimus&amp;diff=2529</id>
		<title>Optimus</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Optimus&amp;diff=2529"/>
		<updated>2024-06-15T09:17:42Z</updated>

		<summary type="html">&lt;p&gt;Justine : Page créée avec « = Optimus : utiliser deux GPU =  Liens :  * https://wiki.archlinux.org/title/Gamescope * https://wiki.archlinux.org/title/PRIME * https://wiki.archlinux.org/title/NVIDIA_Optimus * https://docs.mesa3d.org/envvars.html  Pour une raison ou pour une autre, on peut vouloir utiliser deux GPU sous Linux. Dans mon cas, j&amp;#039;utilise le GPU Radeon intégré à mon processeur pour le bureau et le GPU Nvidia dédié pour les jeux vidéo.   Sous Wayland en 2024, c&amp;#039;est plutôt bi... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Optimus : utiliser deux GPU =&lt;br /&gt;
&lt;br /&gt;
Liens : &lt;br /&gt;
* https://wiki.archlinux.org/title/Gamescope&lt;br /&gt;
* https://wiki.archlinux.org/title/PRIME&lt;br /&gt;
* https://wiki.archlinux.org/title/NVIDIA_Optimus&lt;br /&gt;
* https://docs.mesa3d.org/envvars.html&lt;br /&gt;
&lt;br /&gt;
Pour une raison ou pour une autre, on peut vouloir utiliser deux GPU sous Linux. Dans mon cas, j&#039;utilise le GPU Radeon intégré à mon processeur pour le bureau et le GPU Nvidia dédié pour les jeux vidéo. &lt;br /&gt;
&lt;br /&gt;
Sous Wayland en 2024, c&#039;est plutôt bien géré : il n&#039;y a pas grand-chose à faire, Steam choisissant tout seul le GPU NVidia pour lancer les jeux. Cependant, on peut avoir quelques déconvenues.&lt;br /&gt;
&lt;br /&gt;
== Envycontrol : un script user-friendly de sélection du périphérique ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bayasdev/envycontrol/ Envycontrol] est disponible dans le AUR ou sur Github. Il permet de choisir simplement son GPU, voir son aide.&lt;br /&gt;
&lt;br /&gt;
== Avec Gamescope ==&lt;br /&gt;
&lt;br /&gt;
Gamescope peut poser des soucis dans ce genre de configuration, il faut lui préciser via le driver mesa quel GPU utiliser. Pour ça on utilise des variables d&#039;environnement. Au préalable, on va récupérer quelques informations. Lancer:&lt;br /&gt;
 &lt;br /&gt;
 lspci -nn&lt;br /&gt;
&lt;br /&gt;
On va chercher à récupérer le vendorID et deviceID du GPU dédié. Dans mon cas:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
236 justine@~ &amp;gt; lspci -nn | grep VGA&lt;br /&gt;
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation AD104 [GeForce RTX 4070 Ti] [10de:2782] (rev a1)&lt;br /&gt;
0d:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Phoenix1 [1002:15bf] (rev 06)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici les informations sont entre crochets, je note les valeurs 10de:2782 pour mon GPU Nvidia.&lt;br /&gt;
&lt;br /&gt;
Ensuite, pour lancer CS2 dans Steam par exemple, mes options de lancement ressemble à ça:&lt;br /&gt;
 DRI_PRIME=1 MESA_VK_DEVICE_SELECT=10de:1347 NV_PRIME_RENDER_OFFLOAD=1 VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia gamescope --force-grab-cursor -W 3440 -H 1440 -r 144 -- %command% +exec autoexec.cfg&lt;br /&gt;
&lt;br /&gt;
* DRI_PRIME=1 : La Doc Arch précise que lorsque l&#039;on utilise PRIME (donc que l&#039;on a un GPU NVidia) il faut set cette variable pour utiliser le GPU dédié. Je n&#039;ai pas trouvé beaucoup d&#039;infos ?&lt;br /&gt;
* MESA_VK_DEVICE_SELECT=10de:2782 : c&#039;est ici que l&#039;on utilise les valeurs VendorID et DeviceID récupéré plus haut.&lt;br /&gt;
* NV_PRIME_RENDER_OFFLOAD=1 VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia : pas sûre&lt;br /&gt;
* gamescope etc : commande de lancement du jeu avec une résolution précise, etc.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Steam_cmd&amp;diff=2528</id>
		<title>Steam cmd</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Steam_cmd&amp;diff=2528"/>
		<updated>2024-06-03T15:58:49Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Utilisation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Steam CMD ? =&lt;br /&gt;
Steamcmd est une interface pour steam en ligne de commande.&lt;br /&gt;
&lt;br /&gt;
[https://developer.valvesoftware.com/wiki/SteamCMD#Running_SteamCMD Doc]&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
Sur arch, c&#039;est simple:&lt;br /&gt;
&lt;br /&gt;
 yay -S steamcmd&lt;br /&gt;
&lt;br /&gt;
Sur Debian, il faut activer les repos non-free et l&#039;architecture 32 bits.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#/etc/apt/sources.list&lt;br /&gt;
deb http://deb.debian.org/debian/ testing main non-free&lt;br /&gt;
#Lancer&lt;br /&gt;
sudo dpkg --add-architecture i386; sudo apt update&lt;br /&gt;
apt update &amp;amp;&amp;amp; apt install steamcmd&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Utilisation =&lt;br /&gt;
Il suffit de lancer la CLI steamcmd avec la commande &amp;quot;steamcmd&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
 login nom_user_steam&lt;br /&gt;
On nous demande le password et le code steamguard au besoin. Ce n&#039;est à faire que la première fois; par la suite, il suffit de taper la commande &amp;quot;login nom_user_steam&amp;quot;. Attention, avoir une instance de Steam qui tourne sur la même machine peut interférer.&lt;br /&gt;
&lt;br /&gt;
== Installer / mettre à jour un jeu ==&lt;br /&gt;
Pour installer un jeu, on a besoin de son [https://steamdb.info identifiant]&lt;br /&gt;
&lt;br /&gt;
On commence par donner un dossier d&#039;installation au jeu (à faire avant de login, techniquement, ce qui veut dire qu&#039;il faut relancer Steamcmd pour chaque jeu que l&#039;on veut installer):&lt;br /&gt;
&lt;br /&gt;
 force_install_dir /home/justine/Sandbox/Games/Balatro&lt;br /&gt;
&lt;br /&gt;
Puis on lance l&#039;install / update de ce dernier.&lt;br /&gt;
&lt;br /&gt;
  app_update id_du_jeu&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
== Erreur : &amp;quot;invalid platform&amp;quot; ==&lt;br /&gt;
Lorsqu&#039;on essaye de télécharger un jeu pour Windows par ex. alors que l&#039;on est sur Linux, on a l&#039;erreur : &amp;quot;ERROR! Failed to install app &#039;2379780&#039; (Invalid platform)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Il suffit de forcer la plateforme sur laquelle à Windows:&lt;br /&gt;
 @sSteamCmdForcePlatformType windows&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Steam_cmd&amp;diff=2527</id>
		<title>Steam cmd</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Steam_cmd&amp;diff=2527"/>
		<updated>2024-06-03T15:54:46Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Steam CMD ? =&lt;br /&gt;
Steamcmd est une interface pour steam en ligne de commande.&lt;br /&gt;
&lt;br /&gt;
[https://developer.valvesoftware.com/wiki/SteamCMD#Running_SteamCMD Doc]&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
Sur arch, c&#039;est simple:&lt;br /&gt;
&lt;br /&gt;
 yay -S steamcmd&lt;br /&gt;
&lt;br /&gt;
Sur Debian, il faut activer les repos non-free et l&#039;architecture 32 bits.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#/etc/apt/sources.list&lt;br /&gt;
deb http://deb.debian.org/debian/ testing main non-free&lt;br /&gt;
#Lancer&lt;br /&gt;
sudo dpkg --add-architecture i386; sudo apt update&lt;br /&gt;
apt update &amp;amp;&amp;amp; apt install steamcmd&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Utilisation =&lt;br /&gt;
Il suffit de lancer la CLI steamcmd avec la commande &amp;quot;steamcmd&amp;quot;. La première chose à faire est de se logger.&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
 login nom_user_steam&lt;br /&gt;
On nous demande le password et le code steamguard au besoin. Ce n&#039;est à faire que la première fois; par la suite, il suffit de taper la commande &amp;quot;login nom_user_steam&amp;quot;. Attention, avoir une instance de Steam qui tourne sur la même machine peut interférer.&lt;br /&gt;
&lt;br /&gt;
== Installer / mettre à jour un jeu ==&lt;br /&gt;
Pour installer un jeu, on a besoin de son [https://steamdb.info identifiant]&lt;br /&gt;
&lt;br /&gt;
On commence par donner un dossier d&#039;installation au jeu (à faire avant de login, techniquement, ce qui veut dire qu&#039;il faut relancer Steamcmd pour chaque jeu que l&#039;on veut installer):&lt;br /&gt;
&lt;br /&gt;
 force_install_dir /home/justine/Sandbox/Games/Balatro&lt;br /&gt;
&lt;br /&gt;
Puis on lance l&#039;install / update de ce dernier.&lt;br /&gt;
&lt;br /&gt;
  app_update id_du_jeu&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
== Erreur : &amp;quot;invalid platform&amp;quot; ==&lt;br /&gt;
Lorsqu&#039;on essaye de télécharger un jeu pour Windows par ex. alors que l&#039;on est sur Linux, on a l&#039;erreur : &amp;quot;ERROR! Failed to install app &#039;2379780&#039; (Invalid platform)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Il suffit de forcer la plateforme sur laquelle à Windows:&lt;br /&gt;
 @sSteamCmdForcePlatformType windows&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2526</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2526"/>
		<updated>2024-06-03T15:53:05Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Systèmes 40x49px|869px-Tux.svg.png */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Disclaimer ==&lt;br /&gt;
Ceci est mon wiki personnel, rédigé au cours de mes études et de ma carrière; je n&#039;ai pas la prétention que tout y soit exact.&lt;br /&gt;
Toutes les pages utiles sont en lien sur la présente page de sommaire. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes personnelles, que je ne mettrait à jour que si j&#039;en ressens le besoin. Il peut parfois s&#039;agir de traduction d&#039;articles existants, si c&#039;est le cas, le lien original est en général au sommet de la page.&lt;br /&gt;
&lt;br /&gt;
[[Logo du site]]&lt;br /&gt;
&lt;br /&gt;
Justine&lt;br /&gt;
&lt;br /&gt;
==Autres / Aide==&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Help:Formatting/fr Aide au formatage]&lt;br /&gt;
*[https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf Aide au langage markdown (pour Git)]&lt;br /&gt;
*[[Portfolio - Notes en vrac]]&lt;br /&gt;
*[[ITIL]]&lt;br /&gt;
*[[Vocabulaire &amp;amp; notions diverses]]&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Extension:SyntaxHighlight L&#039;extension SyntaxHighlight]&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheets==&lt;br /&gt;
* [[Idées diverses de gain de temps]]&lt;br /&gt;
&lt;br /&gt;
* [[Cs: Ansible]]&lt;br /&gt;
* [[CS : FirewallD]]&lt;br /&gt;
* [[Cs : Vim]]&lt;br /&gt;
* [[Cs:_Tips_Linux]]&lt;br /&gt;
* [[Cs: Git]]&lt;br /&gt;
* [[Cs: Pacman]]&lt;br /&gt;
* [[CS : lsof]]&lt;br /&gt;
* [[CS : SecuriteLinux]]&lt;br /&gt;
* [[Mémo_Apache|Mémo Apache]] &lt;br /&gt;
* [[Memo_nginx|Memo nginx]]   &lt;br /&gt;
* [[Mémo_Openssl|Mémo Openssl]]&lt;br /&gt;
&lt;br /&gt;
==Ansible== &lt;br /&gt;
* [[Ansible|Ansible]] &lt;br /&gt;
** [[Ansible : remplacement récursif de texte]]&lt;br /&gt;
** [[Ansible : Filtres]]&lt;br /&gt;
** [[Ansible : playbook avancé, avec handlers et templates]]&lt;br /&gt;
** [[Ansible : Quirks]]&lt;br /&gt;
** [[Ansible et Windows]]&lt;br /&gt;
** [[Ansible : awx-cli]]&lt;br /&gt;
** [[Ansible : Collections]]&lt;br /&gt;
** [[Ansible : sous-commandes]]&lt;br /&gt;
** [[Ansible : VMWare]]&lt;br /&gt;
&lt;br /&gt;
==Conteneurs== &lt;br /&gt;
[[Fichier:Moby-logo-small.png|90px]]  [[Fichier:K8s-small.png|90px]]&lt;br /&gt;
* [[Docker|Docker]] &lt;br /&gt;
* [[Docker-compose]]&lt;br /&gt;
* [[Traefik]]&lt;br /&gt;
* [[Docker swarm]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[LXD]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;/span&amp;gt;Systèmes&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt; &#039;&#039;&#039;[[File:869px-Tux.svg.png|40x49px|869px-Tux.svg.png]]&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
* [[Additions_Invité_sur_Linux|Additions Invité sur Linux]] &lt;br /&gt;
* [[Analyse de logs]]&lt;br /&gt;
** [[Rsyslog]]&lt;br /&gt;
** [[YAML]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
* [[Apache Tomcat]]&lt;br /&gt;
* [[Appels Système (syscall)]]&lt;br /&gt;
* [[APT]]&lt;br /&gt;
* [[Architecture système]]&lt;br /&gt;
* [[Asterisk|Asterisk]] &lt;br /&gt;
* [[Authentification - PAM]] &lt;br /&gt;
* [[Autostart]]&lt;br /&gt;
* [[Awk]]&lt;br /&gt;
* [[Bases_de_données|Bases de données]] &lt;br /&gt;
* [[Bind9]]&lt;br /&gt;
* [[Ceph]]&lt;br /&gt;
* [[Certbot]]&lt;br /&gt;
* [[Cgroups]]&lt;br /&gt;
* [[CheckMK]]&lt;br /&gt;
* [[Chronyd]]&lt;br /&gt;
* [[Cloud Computing]]&lt;br /&gt;
* [[Commandes analyse maillog]]&lt;br /&gt;
* [[Commandes de test de charge]]&lt;br /&gt;
* [[Commandes_Linux|Commandes Linux]] &lt;br /&gt;
* [[Convertir des .deb en .rpm avec alien]]&lt;br /&gt;
* [[Cryptographie|Cryptographie]] &lt;br /&gt;
** [[Protocole ACME]]&lt;br /&gt;
* [[Droits|Droits]] &lt;br /&gt;
* [[Environnement utilisateur]]&lt;br /&gt;
* [[Filesystems|Filesystems]] &lt;br /&gt;
** [[Surveillance de disques]]&lt;br /&gt;
* [[Firefox]]&lt;br /&gt;
* [[Fstab]]&lt;br /&gt;
* [[Gestion_de_paquets|Gestion de paquets]] &lt;br /&gt;
** [[Unattended-upgrades]]&lt;br /&gt;
* [[Grafana et prometheus]]&lt;br /&gt;
* [[Groupwares|Groupwares]] &lt;br /&gt;
* [[HAProxy]]&lt;br /&gt;
* [[Informations Système sous Linux]]&lt;br /&gt;
* [[Juju]]&lt;br /&gt;
* [[KeepaliveD]]&lt;br /&gt;
* [[Kernel Tuning]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[Kubernetes (obsolete)]]&lt;br /&gt;
* [[LAMP|LAMP]]&lt;br /&gt;
* [[LDAP]] &lt;br /&gt;
* [[Linux|Linux / Systèmes]] &lt;br /&gt;
* [[Linux : Permissions]]&lt;br /&gt;
* [[Attributs_Linux_étendus|Attributs Linux étendus]] &lt;br /&gt;
* [[Linux : Mémoire, RAM, swap]]&lt;br /&gt;
* [[Linux : Gestion de la résolution]]&lt;br /&gt;
* [[Logrotate]]&lt;br /&gt;
* [[Make]]&lt;br /&gt;
* [[Messagerie : Risques]]&lt;br /&gt;
* [[OAuth]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Pile son]]&lt;br /&gt;
* [[Postfix]]&lt;br /&gt;
* [[Processus et Appels Système]]&lt;br /&gt;
* [[Proxmox|Proxmox]] &lt;br /&gt;
* [[Raccourcis_shell_bash|Raccourcis shell bash]] &lt;br /&gt;
* [[Raccourcis_Vim|Raccourcis Vim]] &lt;br /&gt;
* [[Red Hat : Satellite 6]]&lt;br /&gt;
* [[Reverse Proxy Nginx]]&lt;br /&gt;
* [[Rsync,_SFTP,_RoboCopy|Rsync, SFTP, RoboCopy]] &lt;br /&gt;
* [[Screen]]&lt;br /&gt;
* [[Sed]]&lt;br /&gt;
* [[Sendmail]]&lt;br /&gt;
* [[Sshfs]]&lt;br /&gt;
* [[Sockets]]&lt;br /&gt;
* [[Steam cmd]]&lt;br /&gt;
* [[Stockage|Stockage]] &lt;br /&gt;
** [[LVM : opérations courantes]]&lt;br /&gt;
** [[Iscsiadm]]&lt;br /&gt;
** [[IscsiAdm + Multipath]]&lt;br /&gt;
* [[Structure de dossiers Linux]]&lt;br /&gt;
* [[Supervision]]&lt;br /&gt;
* [[Systemd]]&lt;br /&gt;
** [[Timesyncd]]&lt;br /&gt;
* [[Utilisateurs|Utilisateurs]] &lt;br /&gt;
* [[Varnish]]&lt;br /&gt;
* [[VMWare|VMWare]] &lt;br /&gt;
** [[VMWare : Utilisation de PowerCLI]]&lt;br /&gt;
** [[VMWare : Autres notions]]&lt;br /&gt;
&lt;br /&gt;
=== Spécificités Windows [[Fichier:Winlogo.png|50px]] === &lt;br /&gt;
&lt;br /&gt;
* [[Services_Windows|Services Windows]] &lt;br /&gt;
** [[Active_Directory|Active Directory]]&lt;br /&gt;
** [[WSUS_et_Core|WSUS et Core]] &lt;br /&gt;
** [[PowerShell|PowerShell]] &lt;br /&gt;
** [[GPO|GPO]] &lt;br /&gt;
** [[Exchange|Exchange]] &lt;br /&gt;
** [[Exchange pour de vrai]]&lt;br /&gt;
** [[Windows : Outils à connaître]]&lt;br /&gt;
** [[Powershell : Active Directory]]&lt;br /&gt;
** [[AD : intégration Linux]]&lt;br /&gt;
* [[Création de tâches planifiée]]&lt;br /&gt;
* [[Gestion d&#039;accès chez Microsoft]]&lt;br /&gt;
* [[Smbclient]]&lt;br /&gt;
* [[Commandes CMD utiles]]&lt;br /&gt;
&lt;br /&gt;
== Réseaux  [[File:Computer-networking.jpg|middle|77x60px|Computer-networking.jpg]] ==&lt;br /&gt;
&lt;br /&gt;
*[[DHCPv4|DHCPv4]] &lt;br /&gt;
*[[DHCPv6|DHCPv6]] &lt;br /&gt;
*[[DNS|DNS]] &lt;br /&gt;
*[[Ethernet|Ethernet]] &lt;br /&gt;
**[[FireWall_:_CheckPoint|FireWall : CheckPoint]]   &lt;br /&gt;
*[[Firewall|Firewall]] &lt;br /&gt;
**[[Firewall_:_Juniper|Firewall : Juniper]] &lt;br /&gt;
**[[FireWall : CheckPoint]]&lt;br /&gt;
**[[Firewalld]]&lt;br /&gt;
**[[IPTables]]&lt;br /&gt;
**[[Nftables]]&lt;br /&gt;
*[[Gestion_de_parc|Gestion de parc]] &lt;br /&gt;
*[[GlobalProtect sur linux]]&lt;br /&gt;
*[[ICMPv4|ICMPv4]] &lt;br /&gt;
*[[IPv4|IPv4]] &lt;br /&gt;
*[[IPv6|IPv6]] &lt;br /&gt;
* [[Knot DNS]]&lt;br /&gt;
*[[Liste_des_ports|Liste des ports]] &lt;br /&gt;
*[[Modèle_OSI_et_TCP/IP|Modèle OSI et TCP/IP]] &lt;br /&gt;
*[[NAT/PAT|NAT/PAT]] &lt;br /&gt;
*[[NetCat|NetCat]] &lt;br /&gt;
*[[Nmap]]&lt;br /&gt;
*[[Protocoles|Protocoles]] &lt;br /&gt;
*[[Proxy|Proxy]] &lt;br /&gt;
*[[Reseau|Reseau]] &lt;br /&gt;
*[[SNMP|SNMP]] &lt;br /&gt;
*[[SSH|SSH]] &lt;br /&gt;
*[[SSO|SSO]] &lt;br /&gt;
*[[TCP_&amp;amp;_UDP|TCP &amp;amp; UDP]] &lt;br /&gt;
*[[Tor]]&lt;br /&gt;
*[[VLAN|VLAN]] &lt;br /&gt;
*[[VPN|VPN]]&lt;br /&gt;
* [[Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Cisco NetAcad [[File:1200px-Cisco logo blue 2016.svg.png|middle|75x50px|1200px-Cisco logo blue 2016.svg.png]] ===&lt;br /&gt;
&lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_1|Cisco : R&amp;amp;S 1]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_2|Cisco : R&amp;amp;S 2]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_3|Cisco : R&amp;amp;S 3]]&lt;br /&gt;
&lt;br /&gt;
== Web ==&lt;br /&gt;
*[[CGI]]&lt;br /&gt;
*[[Websockets]]&lt;br /&gt;
&lt;br /&gt;
== Cybersécurité [[File:Padlock.png|Padlock.png|77x60px]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Cybersécurité|Cybersécurité : notions de base]] &lt;br /&gt;
*[[Cybersécurité_:_keepass|Cybersécurité : keepass]] &lt;br /&gt;
*[[Metasploit|Metasploit]] &lt;br /&gt;
*[[Cybersécurité_(Kali)_:_Crack_de_mots_de_passe_avec_Hydra|Cybersécurité (Kali) : Crack de mots de passe avec Hydra]] &lt;br /&gt;
*[[Cybersécurité_:_Documentation|Cybersécurité : Documentation]] &lt;br /&gt;
*[[Cybersécurité_:_Lynis|Cybersécurité : Lynis]] &lt;br /&gt;
*[[Cybersécurité_:_Graylog|Cybersécurité : Graylog]] &lt;br /&gt;
*[[Cybersécurité_:_Liens|Cybersécurité : Liens]]&lt;br /&gt;
*[[Messagerie : Risques]] &lt;br /&gt;
*[[Outils Divers]]&lt;br /&gt;
*[[Tests de charge]]&lt;br /&gt;
*[[Honeypot]]&lt;br /&gt;
* [[Shodan]]&lt;br /&gt;
* [https://github.com/certsocietegenerale/IRM/tree/master/EN Des méthodes simples d&#039;analyse]&lt;br /&gt;
* [[Ffuf : Fuzz Faster U Fool]]&lt;br /&gt;
* [[PGP - GPG]]&lt;br /&gt;
&lt;br /&gt;
=== HackTheBox Academy ===&lt;br /&gt;
Mes notes concernant mon suivi de modules sur HTB Academy - elles sont possiblement en anglais.&lt;br /&gt;
* [[HTBA : Active Directory Intro]]&lt;br /&gt;
&lt;br /&gt;
== Gestion de projet [[File:Gdpimage.png|middle|96x64px|Gdpimage.png]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Gestion_de_projet|Gestion de projet]] &lt;br /&gt;
*[[Outils_et_Méthodologie_de_Résolution_de_Problèmes_(MRP)|Outils et Méthodologie de Résolution de Problèmes (MRP)]] &lt;br /&gt;
*[[GDP_Agile_avec_SCRUM|GDP Agile avec SCRUM]]&lt;br /&gt;
&lt;br /&gt;
== Scripting / Programmation [[File:Python-7be70baaac.png|middle|69x69px|Python-7be70baaac.png]][[File:Bashlogo.png|middle|74x74px|Bashlogo.png]] ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
**[[Python : APIs]]&lt;br /&gt;
**[[Python : argparse]]&lt;br /&gt;
**[[Python : Black]]&lt;br /&gt;
**[[Python : coloration de texte]]&lt;br /&gt;
**[[Python_:_Context_Manager|Python : Context Manager]] &lt;br /&gt;
**[[Python : Dataclasses]]&lt;br /&gt;
**[[Python : datetimes]]&lt;br /&gt;
**[[Python : dictionnaires]]&lt;br /&gt;
**[[Python : Ensembles]]&lt;br /&gt;
**[[Python : Fichiers de config]]&lt;br /&gt;
**[[Python : Flask]]&lt;br /&gt;
***[[Python : Flask et SocketIO]]&lt;br /&gt;
**[[Python_:_Fonctions|Python : Fonctions]] &lt;br /&gt;
**[[Python : Fonctions de l&#039;interpréteur]]&lt;br /&gt;
**[[Python_:_Les_fichiers|Python : Les fichiers]]  &lt;br /&gt;
**[[Python : fstrings]] &lt;br /&gt;
**[[Python : Interactions avec Windows]]&lt;br /&gt;
**[[Python_:_Listes|Python : Listes]] &lt;br /&gt;
** [[Python : Locust (Tests de charge)]]&lt;br /&gt;
**[[Python_:_Méthodes_de_chaines|Python : Méthodes de chaines]] &lt;br /&gt;
**[[Python_:_misc|Python : misc]] &lt;br /&gt;
**[[Python : Opérateurs]]&lt;br /&gt;
**[[Python : Opérateur Binaires]]&lt;br /&gt;
**[[Python : os.walk()]]&lt;br /&gt;
**[[Python_-_PEP8|Python - PEP8]] &lt;br /&gt;
**[[Python : Pipenv]]&lt;br /&gt;
**[[Python : Pygame]]&lt;br /&gt;
**[[Python : PySimpleGUI]]&lt;br /&gt;
**[[Python_:_Programmation_Asynchrone|Python : Programmation Asynchrone]] &lt;br /&gt;
**[[Python_:_Programmation_système|Python : Programmation système]] &lt;br /&gt;
**[[Python_:_Réseau|Python : Réseau]] &lt;br /&gt;
**[[Python : simuler des inputs]]&lt;br /&gt;
**[[Python_:_Tkinter|Python : Tkinter]] &lt;br /&gt;
**[[Python : Virtualenv]]&lt;br /&gt;
**[[Python_:_Vocabulaire|Python : Vocabulaire]] &lt;br /&gt;
**[[Python_:_with_et_les_gestionnaires_de_contexte|Python : with et les gestionnaires de contexte]]&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
Il s&#039;agit de mes notes issues du livre officiel de Rust : [https://doc.rust-lang.org/book/ The Rust book] dans l&#039;ordre des chapitres.&lt;br /&gt;
&lt;br /&gt;
* [[Rust : Structs]]&lt;br /&gt;
* [[Rust: enums]]&lt;br /&gt;
* [[Rust : match]]&lt;br /&gt;
* [[Rust : if let]]&lt;br /&gt;
* [[Rust : packages]]&lt;br /&gt;
* [[Rust : Common collections]]&lt;br /&gt;
* [[Rust : Error handling]]&lt;br /&gt;
* [[Rust : génériques, traits, lifetimes]]&lt;br /&gt;
* [[Rust : tests automatisés]]&lt;br /&gt;
* [[Rust : iterateurs]]&lt;br /&gt;
(Le reste sur mon gitea).&lt;br /&gt;
&lt;br /&gt;
Autres notes:&lt;br /&gt;
* [[Rust : Debug avec GDB]]&lt;br /&gt;
* [[Rust : serde]]&lt;br /&gt;
* [[Rust : Display implementation and Rc + RefCell use demo]]&lt;br /&gt;
* [[Rust : async]]&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
**[[Bash|Bash : Anciennes notes]] &lt;br /&gt;
**[[Bash_:_Codes_de_retour|Bash : Codes de retour]] &lt;br /&gt;
**[[Bash_:_Fonctions|Bash : Fonctions]] &lt;br /&gt;
**[[Bash_:_généralités|Bash : généralités]] &lt;br /&gt;
**[[Bash_:_Paramètres_de_position|Bash : Paramètres de position]] &lt;br /&gt;
**[[Bash_:_Pattern_Matching|Bash : Pattern Matching]]  &lt;br /&gt;
**[[Bash_:_Tableaux|Bash : Tableaux]] &lt;br /&gt;
**[[Bash_:_Traitement_sur_les_chaînes|Bash : Traitement sur les chaînes]] &lt;br /&gt;
**[[Zsh]]&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
**[[PowerShell|PowerShell]] &lt;br /&gt;
**[[PowerShell_:_Scripting|PowerShell : Scripting]] &lt;br /&gt;
**[[PowerShell_:_scripts_complets|PowerShell : scripts complets]] &lt;br /&gt;
**[[PowerShell_:_Exporter_une_boîte_en_pst|PowerShell : Exporter une boîte en pst]]   &lt;br /&gt;
&lt;br /&gt;
=== Généralités ===&lt;br /&gt;
**[[Expressions_Régulières|Expressions Régulières]]&lt;br /&gt;
**[[RPC / REST]]&lt;br /&gt;
&lt;br /&gt;
=== Assembleur ===&lt;br /&gt;
* [[Assembleur|Assembleur (généralités)]]&lt;br /&gt;
* [[Assembleur : boot sector]]&lt;br /&gt;
&lt;br /&gt;
=== Langage C ===&lt;br /&gt;
** [[C : bases]]&lt;br /&gt;
**[[Langage C]]&lt;br /&gt;
&lt;br /&gt;
=== Golang ===&lt;br /&gt;
**[[Golang : bases]]&lt;br /&gt;
&lt;br /&gt;
== Hors-Sujet ==&lt;br /&gt;
&lt;br /&gt;
*[[Coaching_:_CV|Coaching : CV]]&lt;br /&gt;
*[[Droit|Droit]] &lt;br /&gt;
*[[Management|Management]] &lt;br /&gt;
*[[Ondes_radio|Ondes radio]]&lt;br /&gt;
*[[Vérités et contre-vérités]]&lt;br /&gt;
*[[Questions Sysadmin]]&lt;br /&gt;
*[[Comprendre comment fonctionne son organisation]]&lt;br /&gt;
&lt;br /&gt;
=== Musique ===&lt;br /&gt;
*[[Musique modale, musique tonale]]&lt;br /&gt;
*[[Gamme pentatonique]]&lt;br /&gt;
&lt;br /&gt;
== Jouer sur Linux ==&lt;br /&gt;
* [[Steam]]&lt;br /&gt;
&lt;br /&gt;
== Notes Personnelles ==&lt;br /&gt;
&lt;br /&gt;
Cette section contient des notes plus personnelles et moins rédigées, laissées là pour référence future.&lt;br /&gt;
&lt;br /&gt;
*[[Secure boot &amp;amp; pilotes nVIdia]]&lt;br /&gt;
*[[Dual boot et ennuis divers...]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;C’est pour ça : j’lis jamais rien. C’est un vrai piège à cons c’t’histoire-là. En plus j’sais pas lire.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Steam_cmd&amp;diff=2525</id>
		<title>Steam cmd</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Steam_cmd&amp;diff=2525"/>
		<updated>2024-06-03T15:46:30Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Steam CMD ? =&lt;br /&gt;
Steamcmd est une interface pour steam en ligne de commande.&lt;br /&gt;
&lt;br /&gt;
[https://developer.valvesoftware.com/wiki/SteamCMD#Running_SteamCMD Doc]&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
Sur arch, c&#039;est simple:&lt;br /&gt;
&lt;br /&gt;
 yay -S steamcmd&lt;br /&gt;
&lt;br /&gt;
Sur Debian, il faut activer les repos non-free et l&#039;architecture 32 bits.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#/etc/apt/sources.list&lt;br /&gt;
deb http://deb.debian.org/debian/ testing main non-free&lt;br /&gt;
#Lancer&lt;br /&gt;
sudo dpkg --add-architecture i386; sudo apt update&lt;br /&gt;
apt update &amp;amp;&amp;amp; apt install steamcmd&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Utilisation =&lt;br /&gt;
Il suffit de lancer la CLI steamcmd avec la commande &amp;quot;steamcmd&amp;quot;. La première chose à faire est de se logger.&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
 login nom_user_steam&lt;br /&gt;
On nous demande le password et le code steamguard au besoin. Ce n&#039;est à faire que la première fois; par la suite, il suffit de taper la commande &amp;quot;login nom_user_steam&amp;quot;. Attention, avoir une instance de Steam qui tourne sur la même machine peut interférer.&lt;br /&gt;
&lt;br /&gt;
== Installer / mettre à jour un jeu ==&lt;br /&gt;
Pour installer un jeu, on a besoin de son [https://steamdb.info identifiant]&lt;br /&gt;
&lt;br /&gt;
On commence par donner un dossier d&#039;installation au jeu:&lt;br /&gt;
&lt;br /&gt;
 force_install_dir /home/justine/Sandbox/Games/Balatro&lt;br /&gt;
&lt;br /&gt;
Puis on lance l&#039;install / update de ce dernier.&lt;br /&gt;
&lt;br /&gt;
  app_update id_du_jeu&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Steam_cmd&amp;diff=2524</id>
		<title>Steam cmd</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Steam_cmd&amp;diff=2524"/>
		<updated>2024-06-03T15:42:51Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Login */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Steam CMD ? =&lt;br /&gt;
Steamcmd est une interface pour steam en ligne de commande.&lt;br /&gt;
&lt;br /&gt;
[https://developer.valvesoftware.com/wiki/SteamCMD#Running_SteamCMD Doc]&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
Sur arch, c&#039;est simple:&lt;br /&gt;
&lt;br /&gt;
 yay -S steamcmd&lt;br /&gt;
&lt;br /&gt;
= Utilisation =&lt;br /&gt;
Il suffit de lancer la CLI steamcmd avec la commande &amp;quot;steamcmd&amp;quot;. La première chose à faire est de se logger.&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
 login nom_user_steam&lt;br /&gt;
On nous demande le password et le code steamguard au besoin. Ce n&#039;est à faire que la première fois; par la suite, il suffit de taper la commande &amp;quot;login nom_user_steam&amp;quot;. Attention, avoir une instance de Steam qui tourne sur la même machine peut interférer.&lt;br /&gt;
&lt;br /&gt;
== Installer / mettre à jour un jeu ==&lt;br /&gt;
Pour installer un jeu, on a besoin de son [https://steamdb.info identifiant]&lt;br /&gt;
&lt;br /&gt;
On commence par donner un dossier d&#039;installation au jeu:&lt;br /&gt;
&lt;br /&gt;
 force_install_dir /home/justine/Sandbox/Games/Balatro&lt;br /&gt;
&lt;br /&gt;
Puis on lance l&#039;install / update de ce dernier.&lt;br /&gt;
&lt;br /&gt;
  app_update id_du_jeu&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Steam_cmd&amp;diff=2523</id>
		<title>Steam cmd</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Steam_cmd&amp;diff=2523"/>
		<updated>2024-06-03T15:40:21Z</updated>

		<summary type="html">&lt;p&gt;Justine : Page créée avec « = Steam CMD ? = Steamcmd est une interface pour steam en ligne de commande.  [https://developer.valvesoftware.com/wiki/SteamCMD#Running_SteamCMD Doc]  = Installation =  Sur arch, c&amp;#039;est simple:   yay -S steamcmd  = Utilisation = Il suffit de lancer la CLI steamcmd avec la commande &amp;quot;steamcmd&amp;quot;. La première chose à faire est de se logger.  == Login ==  login nom_user_steam On nous demande le password et le code steamguard au besoin. Ce n&amp;#039;est à faire que la premiè... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Steam CMD ? =&lt;br /&gt;
Steamcmd est une interface pour steam en ligne de commande.&lt;br /&gt;
&lt;br /&gt;
[https://developer.valvesoftware.com/wiki/SteamCMD#Running_SteamCMD Doc]&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
Sur arch, c&#039;est simple:&lt;br /&gt;
&lt;br /&gt;
 yay -S steamcmd&lt;br /&gt;
&lt;br /&gt;
= Utilisation =&lt;br /&gt;
Il suffit de lancer la CLI steamcmd avec la commande &amp;quot;steamcmd&amp;quot;. La première chose à faire est de se logger.&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
 login nom_user_steam&lt;br /&gt;
On nous demande le password et le code steamguard au besoin. Ce n&#039;est à faire que la première fois; par la suite, il suffit de taper la commande &amp;quot;login&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Installer / mettre à jour un jeu ==&lt;br /&gt;
Pour installer un jeu, on a besoin de son [https://steamdb.info identifiant]&lt;br /&gt;
&lt;br /&gt;
On commence par donner un dossier d&#039;installation au jeu:&lt;br /&gt;
&lt;br /&gt;
 force_install_dir /home/justine/Sandbox/Games/Balatro&lt;br /&gt;
&lt;br /&gt;
Puis on lance l&#039;install / update de ce dernier.&lt;br /&gt;
&lt;br /&gt;
  app_update id_du_jeu&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2522</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2522"/>
		<updated>2024-05-29T14:30:18Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Systèmes 40x49px|869px-Tux.svg.png */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Disclaimer ==&lt;br /&gt;
Ceci est mon wiki personnel, rédigé au cours de mes études et de ma carrière; je n&#039;ai pas la prétention que tout y soit exact.&lt;br /&gt;
Toutes les pages utiles sont en lien sur la présente page de sommaire. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes personnelles, que je ne mettrait à jour que si j&#039;en ressens le besoin. Il peut parfois s&#039;agir de traduction d&#039;articles existants, si c&#039;est le cas, le lien original est en général au sommet de la page.&lt;br /&gt;
&lt;br /&gt;
[[Logo du site]]&lt;br /&gt;
&lt;br /&gt;
Justine&lt;br /&gt;
&lt;br /&gt;
==Autres / Aide==&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Help:Formatting/fr Aide au formatage]&lt;br /&gt;
*[https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf Aide au langage markdown (pour Git)]&lt;br /&gt;
*[[Portfolio - Notes en vrac]]&lt;br /&gt;
*[[ITIL]]&lt;br /&gt;
*[[Vocabulaire &amp;amp; notions diverses]]&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Extension:SyntaxHighlight L&#039;extension SyntaxHighlight]&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheets==&lt;br /&gt;
* [[Idées diverses de gain de temps]]&lt;br /&gt;
&lt;br /&gt;
* [[Cs: Ansible]]&lt;br /&gt;
* [[CS : FirewallD]]&lt;br /&gt;
* [[Cs : Vim]]&lt;br /&gt;
* [[Cs:_Tips_Linux]]&lt;br /&gt;
* [[Cs: Git]]&lt;br /&gt;
* [[Cs: Pacman]]&lt;br /&gt;
* [[CS : lsof]]&lt;br /&gt;
* [[CS : SecuriteLinux]]&lt;br /&gt;
* [[Mémo_Apache|Mémo Apache]] &lt;br /&gt;
* [[Memo_nginx|Memo nginx]]   &lt;br /&gt;
* [[Mémo_Openssl|Mémo Openssl]]&lt;br /&gt;
&lt;br /&gt;
==Ansible== &lt;br /&gt;
* [[Ansible|Ansible]] &lt;br /&gt;
** [[Ansible : remplacement récursif de texte]]&lt;br /&gt;
** [[Ansible : Filtres]]&lt;br /&gt;
** [[Ansible : playbook avancé, avec handlers et templates]]&lt;br /&gt;
** [[Ansible : Quirks]]&lt;br /&gt;
** [[Ansible et Windows]]&lt;br /&gt;
** [[Ansible : awx-cli]]&lt;br /&gt;
** [[Ansible : Collections]]&lt;br /&gt;
** [[Ansible : sous-commandes]]&lt;br /&gt;
** [[Ansible : VMWare]]&lt;br /&gt;
&lt;br /&gt;
==Conteneurs== &lt;br /&gt;
[[Fichier:Moby-logo-small.png|90px]]  [[Fichier:K8s-small.png|90px]]&lt;br /&gt;
* [[Docker|Docker]] &lt;br /&gt;
* [[Docker-compose]]&lt;br /&gt;
* [[Traefik]]&lt;br /&gt;
* [[Docker swarm]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[LXD]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;/span&amp;gt;Systèmes&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt; &#039;&#039;&#039;[[File:869px-Tux.svg.png|40x49px|869px-Tux.svg.png]]&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
* [[Additions_Invité_sur_Linux|Additions Invité sur Linux]] &lt;br /&gt;
* [[Analyse de logs]]&lt;br /&gt;
** [[Rsyslog]]&lt;br /&gt;
** [[YAML]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
* [[Apache Tomcat]]&lt;br /&gt;
* [[Appels Système (syscall)]]&lt;br /&gt;
* [[APT]]&lt;br /&gt;
* [[Architecture système]]&lt;br /&gt;
* [[Asterisk|Asterisk]] &lt;br /&gt;
* [[Authentification - PAM]] &lt;br /&gt;
* [[Autostart]]&lt;br /&gt;
* [[Awk]]&lt;br /&gt;
* [[Bases_de_données|Bases de données]] &lt;br /&gt;
* [[Bind9]]&lt;br /&gt;
* [[Ceph]]&lt;br /&gt;
* [[Certbot]]&lt;br /&gt;
* [[Cgroups]]&lt;br /&gt;
* [[CheckMK]]&lt;br /&gt;
* [[Chronyd]]&lt;br /&gt;
* [[Cloud Computing]]&lt;br /&gt;
* [[Commandes analyse maillog]]&lt;br /&gt;
* [[Commandes de test de charge]]&lt;br /&gt;
* [[Commandes_Linux|Commandes Linux]] &lt;br /&gt;
* [[Convertir des .deb en .rpm avec alien]]&lt;br /&gt;
* [[Cryptographie|Cryptographie]] &lt;br /&gt;
** [[Protocole ACME]]&lt;br /&gt;
* [[Droits|Droits]] &lt;br /&gt;
* [[Environnement utilisateur]]&lt;br /&gt;
* [[Filesystems|Filesystems]] &lt;br /&gt;
** [[Surveillance de disques]]&lt;br /&gt;
* [[Firefox]]&lt;br /&gt;
* [[Fstab]]&lt;br /&gt;
* [[Gestion_de_paquets|Gestion de paquets]] &lt;br /&gt;
** [[Unattended-upgrades]]&lt;br /&gt;
* [[Grafana et prometheus]]&lt;br /&gt;
* [[Groupwares|Groupwares]] &lt;br /&gt;
* [[HAProxy]]&lt;br /&gt;
* [[Informations Système sous Linux]]&lt;br /&gt;
* [[Juju]]&lt;br /&gt;
* [[KeepaliveD]]&lt;br /&gt;
* [[Kernel Tuning]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[Kubernetes (obsolete)]]&lt;br /&gt;
* [[LAMP|LAMP]]&lt;br /&gt;
* [[LDAP]] &lt;br /&gt;
* [[Linux|Linux / Systèmes]] &lt;br /&gt;
* [[Linux : Permissions]]&lt;br /&gt;
* [[Attributs_Linux_étendus|Attributs Linux étendus]] &lt;br /&gt;
* [[Linux : Mémoire, RAM, swap]]&lt;br /&gt;
* [[Linux : Gestion de la résolution]]&lt;br /&gt;
* [[Logrotate]]&lt;br /&gt;
* [[Make]]&lt;br /&gt;
* [[Messagerie : Risques]]&lt;br /&gt;
* [[OAuth]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Pile son]]&lt;br /&gt;
* [[Postfix]]&lt;br /&gt;
* [[Processus et Appels Système]]&lt;br /&gt;
* [[Proxmox|Proxmox]] &lt;br /&gt;
* [[Raccourcis_shell_bash|Raccourcis shell bash]] &lt;br /&gt;
* [[Raccourcis_Vim|Raccourcis Vim]] &lt;br /&gt;
* [[Red Hat : Satellite 6]]&lt;br /&gt;
* [[Reverse Proxy Nginx]]&lt;br /&gt;
* [[Rsync,_SFTP,_RoboCopy|Rsync, SFTP, RoboCopy]] &lt;br /&gt;
* [[Screen]]&lt;br /&gt;
* [[Sed]]&lt;br /&gt;
* [[Sendmail]]&lt;br /&gt;
* [[Sshfs]]&lt;br /&gt;
* [[Sockets]]&lt;br /&gt;
* [[Stockage|Stockage]] &lt;br /&gt;
** [[LVM : opérations courantes]]&lt;br /&gt;
** [[Iscsiadm]]&lt;br /&gt;
** [[IscsiAdm + Multipath]]&lt;br /&gt;
* [[Structure de dossiers Linux]]&lt;br /&gt;
* [[Supervision]]&lt;br /&gt;
* [[Systemd]]&lt;br /&gt;
** [[Timesyncd]]&lt;br /&gt;
* [[Utilisateurs|Utilisateurs]] &lt;br /&gt;
* [[Varnish]]&lt;br /&gt;
* [[VMWare|VMWare]] &lt;br /&gt;
** [[VMWare : Utilisation de PowerCLI]]&lt;br /&gt;
** [[VMWare : Autres notions]]&lt;br /&gt;
&lt;br /&gt;
=== Spécificités Windows [[Fichier:Winlogo.png|50px]] === &lt;br /&gt;
&lt;br /&gt;
* [[Services_Windows|Services Windows]] &lt;br /&gt;
** [[Active_Directory|Active Directory]]&lt;br /&gt;
** [[WSUS_et_Core|WSUS et Core]] &lt;br /&gt;
** [[PowerShell|PowerShell]] &lt;br /&gt;
** [[GPO|GPO]] &lt;br /&gt;
** [[Exchange|Exchange]] &lt;br /&gt;
** [[Exchange pour de vrai]]&lt;br /&gt;
** [[Windows : Outils à connaître]]&lt;br /&gt;
** [[Powershell : Active Directory]]&lt;br /&gt;
** [[AD : intégration Linux]]&lt;br /&gt;
* [[Création de tâches planifiée]]&lt;br /&gt;
* [[Gestion d&#039;accès chez Microsoft]]&lt;br /&gt;
* [[Smbclient]]&lt;br /&gt;
* [[Commandes CMD utiles]]&lt;br /&gt;
&lt;br /&gt;
== Réseaux  [[File:Computer-networking.jpg|middle|77x60px|Computer-networking.jpg]] ==&lt;br /&gt;
&lt;br /&gt;
*[[DHCPv4|DHCPv4]] &lt;br /&gt;
*[[DHCPv6|DHCPv6]] &lt;br /&gt;
*[[DNS|DNS]] &lt;br /&gt;
*[[Ethernet|Ethernet]] &lt;br /&gt;
**[[FireWall_:_CheckPoint|FireWall : CheckPoint]]   &lt;br /&gt;
*[[Firewall|Firewall]] &lt;br /&gt;
**[[Firewall_:_Juniper|Firewall : Juniper]] &lt;br /&gt;
**[[FireWall : CheckPoint]]&lt;br /&gt;
**[[Firewalld]]&lt;br /&gt;
**[[IPTables]]&lt;br /&gt;
**[[Nftables]]&lt;br /&gt;
*[[Gestion_de_parc|Gestion de parc]] &lt;br /&gt;
*[[GlobalProtect sur linux]]&lt;br /&gt;
*[[ICMPv4|ICMPv4]] &lt;br /&gt;
*[[IPv4|IPv4]] &lt;br /&gt;
*[[IPv6|IPv6]] &lt;br /&gt;
* [[Knot DNS]]&lt;br /&gt;
*[[Liste_des_ports|Liste des ports]] &lt;br /&gt;
*[[Modèle_OSI_et_TCP/IP|Modèle OSI et TCP/IP]] &lt;br /&gt;
*[[NAT/PAT|NAT/PAT]] &lt;br /&gt;
*[[NetCat|NetCat]] &lt;br /&gt;
*[[Nmap]]&lt;br /&gt;
*[[Protocoles|Protocoles]] &lt;br /&gt;
*[[Proxy|Proxy]] &lt;br /&gt;
*[[Reseau|Reseau]] &lt;br /&gt;
*[[SNMP|SNMP]] &lt;br /&gt;
*[[SSH|SSH]] &lt;br /&gt;
*[[SSO|SSO]] &lt;br /&gt;
*[[TCP_&amp;amp;_UDP|TCP &amp;amp; UDP]] &lt;br /&gt;
*[[Tor]]&lt;br /&gt;
*[[VLAN|VLAN]] &lt;br /&gt;
*[[VPN|VPN]]&lt;br /&gt;
* [[Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Cisco NetAcad [[File:1200px-Cisco logo blue 2016.svg.png|middle|75x50px|1200px-Cisco logo blue 2016.svg.png]] ===&lt;br /&gt;
&lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_1|Cisco : R&amp;amp;S 1]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_2|Cisco : R&amp;amp;S 2]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_3|Cisco : R&amp;amp;S 3]]&lt;br /&gt;
&lt;br /&gt;
== Web ==&lt;br /&gt;
*[[CGI]]&lt;br /&gt;
*[[Websockets]]&lt;br /&gt;
&lt;br /&gt;
== Cybersécurité [[File:Padlock.png|Padlock.png|77x60px]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Cybersécurité|Cybersécurité : notions de base]] &lt;br /&gt;
*[[Cybersécurité_:_keepass|Cybersécurité : keepass]] &lt;br /&gt;
*[[Metasploit|Metasploit]] &lt;br /&gt;
*[[Cybersécurité_(Kali)_:_Crack_de_mots_de_passe_avec_Hydra|Cybersécurité (Kali) : Crack de mots de passe avec Hydra]] &lt;br /&gt;
*[[Cybersécurité_:_Documentation|Cybersécurité : Documentation]] &lt;br /&gt;
*[[Cybersécurité_:_Lynis|Cybersécurité : Lynis]] &lt;br /&gt;
*[[Cybersécurité_:_Graylog|Cybersécurité : Graylog]] &lt;br /&gt;
*[[Cybersécurité_:_Liens|Cybersécurité : Liens]]&lt;br /&gt;
*[[Messagerie : Risques]] &lt;br /&gt;
*[[Outils Divers]]&lt;br /&gt;
*[[Tests de charge]]&lt;br /&gt;
*[[Honeypot]]&lt;br /&gt;
* [[Shodan]]&lt;br /&gt;
* [https://github.com/certsocietegenerale/IRM/tree/master/EN Des méthodes simples d&#039;analyse]&lt;br /&gt;
* [[Ffuf : Fuzz Faster U Fool]]&lt;br /&gt;
* [[PGP - GPG]]&lt;br /&gt;
&lt;br /&gt;
=== HackTheBox Academy ===&lt;br /&gt;
Mes notes concernant mon suivi de modules sur HTB Academy - elles sont possiblement en anglais.&lt;br /&gt;
* [[HTBA : Active Directory Intro]]&lt;br /&gt;
&lt;br /&gt;
== Gestion de projet [[File:Gdpimage.png|middle|96x64px|Gdpimage.png]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Gestion_de_projet|Gestion de projet]] &lt;br /&gt;
*[[Outils_et_Méthodologie_de_Résolution_de_Problèmes_(MRP)|Outils et Méthodologie de Résolution de Problèmes (MRP)]] &lt;br /&gt;
*[[GDP_Agile_avec_SCRUM|GDP Agile avec SCRUM]]&lt;br /&gt;
&lt;br /&gt;
== Scripting / Programmation [[File:Python-7be70baaac.png|middle|69x69px|Python-7be70baaac.png]][[File:Bashlogo.png|middle|74x74px|Bashlogo.png]] ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
**[[Python : APIs]]&lt;br /&gt;
**[[Python : argparse]]&lt;br /&gt;
**[[Python : Black]]&lt;br /&gt;
**[[Python : coloration de texte]]&lt;br /&gt;
**[[Python_:_Context_Manager|Python : Context Manager]] &lt;br /&gt;
**[[Python : Dataclasses]]&lt;br /&gt;
**[[Python : datetimes]]&lt;br /&gt;
**[[Python : dictionnaires]]&lt;br /&gt;
**[[Python : Ensembles]]&lt;br /&gt;
**[[Python : Fichiers de config]]&lt;br /&gt;
**[[Python : Flask]]&lt;br /&gt;
***[[Python : Flask et SocketIO]]&lt;br /&gt;
**[[Python_:_Fonctions|Python : Fonctions]] &lt;br /&gt;
**[[Python : Fonctions de l&#039;interpréteur]]&lt;br /&gt;
**[[Python_:_Les_fichiers|Python : Les fichiers]]  &lt;br /&gt;
**[[Python : fstrings]] &lt;br /&gt;
**[[Python : Interactions avec Windows]]&lt;br /&gt;
**[[Python_:_Listes|Python : Listes]] &lt;br /&gt;
** [[Python : Locust (Tests de charge)]]&lt;br /&gt;
**[[Python_:_Méthodes_de_chaines|Python : Méthodes de chaines]] &lt;br /&gt;
**[[Python_:_misc|Python : misc]] &lt;br /&gt;
**[[Python : Opérateurs]]&lt;br /&gt;
**[[Python : Opérateur Binaires]]&lt;br /&gt;
**[[Python : os.walk()]]&lt;br /&gt;
**[[Python_-_PEP8|Python - PEP8]] &lt;br /&gt;
**[[Python : Pipenv]]&lt;br /&gt;
**[[Python : Pygame]]&lt;br /&gt;
**[[Python : PySimpleGUI]]&lt;br /&gt;
**[[Python_:_Programmation_Asynchrone|Python : Programmation Asynchrone]] &lt;br /&gt;
**[[Python_:_Programmation_système|Python : Programmation système]] &lt;br /&gt;
**[[Python_:_Réseau|Python : Réseau]] &lt;br /&gt;
**[[Python : simuler des inputs]]&lt;br /&gt;
**[[Python_:_Tkinter|Python : Tkinter]] &lt;br /&gt;
**[[Python : Virtualenv]]&lt;br /&gt;
**[[Python_:_Vocabulaire|Python : Vocabulaire]] &lt;br /&gt;
**[[Python_:_with_et_les_gestionnaires_de_contexte|Python : with et les gestionnaires de contexte]]&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
Il s&#039;agit de mes notes issues du livre officiel de Rust : [https://doc.rust-lang.org/book/ The Rust book] dans l&#039;ordre des chapitres.&lt;br /&gt;
&lt;br /&gt;
* [[Rust : Structs]]&lt;br /&gt;
* [[Rust: enums]]&lt;br /&gt;
* [[Rust : match]]&lt;br /&gt;
* [[Rust : if let]]&lt;br /&gt;
* [[Rust : packages]]&lt;br /&gt;
* [[Rust : Common collections]]&lt;br /&gt;
* [[Rust : Error handling]]&lt;br /&gt;
* [[Rust : génériques, traits, lifetimes]]&lt;br /&gt;
* [[Rust : tests automatisés]]&lt;br /&gt;
* [[Rust : iterateurs]]&lt;br /&gt;
(Le reste sur mon gitea).&lt;br /&gt;
&lt;br /&gt;
Autres notes:&lt;br /&gt;
* [[Rust : Debug avec GDB]]&lt;br /&gt;
* [[Rust : serde]]&lt;br /&gt;
* [[Rust : Display implementation and Rc + RefCell use demo]]&lt;br /&gt;
* [[Rust : async]]&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
**[[Bash|Bash : Anciennes notes]] &lt;br /&gt;
**[[Bash_:_Codes_de_retour|Bash : Codes de retour]] &lt;br /&gt;
**[[Bash_:_Fonctions|Bash : Fonctions]] &lt;br /&gt;
**[[Bash_:_généralités|Bash : généralités]] &lt;br /&gt;
**[[Bash_:_Paramètres_de_position|Bash : Paramètres de position]] &lt;br /&gt;
**[[Bash_:_Pattern_Matching|Bash : Pattern Matching]]  &lt;br /&gt;
**[[Bash_:_Tableaux|Bash : Tableaux]] &lt;br /&gt;
**[[Bash_:_Traitement_sur_les_chaînes|Bash : Traitement sur les chaînes]] &lt;br /&gt;
**[[Zsh]]&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
**[[PowerShell|PowerShell]] &lt;br /&gt;
**[[PowerShell_:_Scripting|PowerShell : Scripting]] &lt;br /&gt;
**[[PowerShell_:_scripts_complets|PowerShell : scripts complets]] &lt;br /&gt;
**[[PowerShell_:_Exporter_une_boîte_en_pst|PowerShell : Exporter une boîte en pst]]   &lt;br /&gt;
&lt;br /&gt;
=== Généralités ===&lt;br /&gt;
**[[Expressions_Régulières|Expressions Régulières]]&lt;br /&gt;
**[[RPC / REST]]&lt;br /&gt;
&lt;br /&gt;
=== Assembleur ===&lt;br /&gt;
* [[Assembleur|Assembleur (généralités)]]&lt;br /&gt;
* [[Assembleur : boot sector]]&lt;br /&gt;
&lt;br /&gt;
=== Langage C ===&lt;br /&gt;
** [[C : bases]]&lt;br /&gt;
**[[Langage C]]&lt;br /&gt;
&lt;br /&gt;
=== Golang ===&lt;br /&gt;
**[[Golang : bases]]&lt;br /&gt;
&lt;br /&gt;
== Hors-Sujet ==&lt;br /&gt;
&lt;br /&gt;
*[[Coaching_:_CV|Coaching : CV]]&lt;br /&gt;
*[[Droit|Droit]] &lt;br /&gt;
*[[Management|Management]] &lt;br /&gt;
*[[Ondes_radio|Ondes radio]]&lt;br /&gt;
*[[Vérités et contre-vérités]]&lt;br /&gt;
*[[Questions Sysadmin]]&lt;br /&gt;
*[[Comprendre comment fonctionne son organisation]]&lt;br /&gt;
&lt;br /&gt;
=== Musique ===&lt;br /&gt;
*[[Musique modale, musique tonale]]&lt;br /&gt;
*[[Gamme pentatonique]]&lt;br /&gt;
&lt;br /&gt;
== Jouer sur Linux ==&lt;br /&gt;
* [[Steam]]&lt;br /&gt;
&lt;br /&gt;
== Notes Personnelles ==&lt;br /&gt;
&lt;br /&gt;
Cette section contient des notes plus personnelles et moins rédigées, laissées là pour référence future.&lt;br /&gt;
&lt;br /&gt;
*[[Secure boot &amp;amp; pilotes nVIdia]]&lt;br /&gt;
*[[Dual boot et ennuis divers...]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;C’est pour ça : j’lis jamais rien. C’est un vrai piège à cons c’t’histoire-là. En plus j’sais pas lire.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Sshfs&amp;diff=2521</id>
		<title>Sshfs</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Sshfs&amp;diff=2521"/>
		<updated>2024-05-29T14:29:54Z</updated>

		<summary type="html">&lt;p&gt;Justine : Page créée avec « = Sources = * [https://github.com/libfuse/sshfs Github] * [https://wiki.archlinux.org/title/SSHFS Le saint wiki Arch] * [https://man.archlinux.org/man/sshfs.1 Le manuel]  = Présentation =  SSHFS est un filesystem basé sur FUSE (Filesystem in UserSpacE) permettant de monter des dossier distants en local via une connection SSH.   Il est dispo sur la plupart des distributions et peut être installé assez facilement (via apt, pacman, etc).  Il est assez facile à... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Sources =&lt;br /&gt;
* [https://github.com/libfuse/sshfs Github]&lt;br /&gt;
* [https://wiki.archlinux.org/title/SSHFS Le saint wiki Arch]&lt;br /&gt;
* [https://man.archlinux.org/man/sshfs.1 Le manuel]&lt;br /&gt;
&lt;br /&gt;
= Présentation =&lt;br /&gt;
&lt;br /&gt;
SSHFS est un filesystem basé sur FUSE (Filesystem in UserSpacE) permettant de monter des dossier distants en local via une connection SSH. &lt;br /&gt;
&lt;br /&gt;
Il est dispo sur la plupart des distributions et peut être installé assez facilement (via apt, pacman, etc).&lt;br /&gt;
&lt;br /&gt;
Il est assez facile à invoquer:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
sshfs [user@]host:[dir] mountpoint [options]&lt;br /&gt;
#Par ex.&lt;br /&gt;
sshfs 192.168.1.200:/home/justine/sshfs ./montage&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si il n&#039;est pas spécifié, le chemin distant donne sur le home. &lt;br /&gt;
&lt;br /&gt;
On peut ensuite démonter le dossier avec umount; le wiki arch donne la commande :&lt;br /&gt;
  fusermount3 -u mountpoint&lt;br /&gt;
&lt;br /&gt;
== Usage et performances ==&lt;br /&gt;
&lt;br /&gt;
Mon idée était simplement d&#039;utiliser sshfs lors d&#039;opérations d&#039;administration (pour transférer des certificats par exemple), et non pas comme alternative à NFS ou SMB. Cependant, je me usis posé la question des performances, et je ne suis pas la seule. [https://blog.ja-ke.tech/2019/08/27/nas-performance-sshfs-nfs-smb.html Cet article] donne un bon aperçu des performances, SSHFS est étonnament performant et comparable à NFS à chiffrement égal. SMB est dans le bas du panier !&lt;br /&gt;
&lt;br /&gt;
On peut donc envisager de l&#039;utiliser de façon plus performantes. Le wiki Arch donne une méthode [https://wiki.archlinux.org/title/SSHFS à l&#039;aide de systemd].&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
Quelques options utiles:&lt;br /&gt;
* -f : garder le process à l&#039;avant plan (l&#039;inverse du -d de docker compose)&lt;br /&gt;
* -C : activer la compression&lt;br /&gt;
* -F &amp;lt;chemin&amp;gt; : passer le chemin d&#039;un fichier de config ssh&lt;br /&gt;
* -o reconnect: reconnection automatique au serveur&lt;br /&gt;
* -o idmap=user : traduire automatiquement les UID/GID des users locaux et distants&lt;br /&gt;
&lt;br /&gt;
= Un gestionnaire de profils pour sshfs =&lt;br /&gt;
&lt;br /&gt;
[https://github.com/prurigro/sshmnt Ce script ] permet d&#039;avoir différents profils montable à la volée. &lt;br /&gt;
&lt;br /&gt;
Il suffit de l&#039;avoir dans le PATH, et de le lancer une première fois pour répondre à ses questions pour qu&#039;il génère son fichier de conf. Ensuite, on peut éditer le fichier de conf avec sshmnt -e pour créer les différents profils. L&#039;example donné est assez clair :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#Example:&lt;br /&gt;
# location=name:login=username:ip=address:port=22:path=/basepath/of/mount:mntopts=uid=99,gid=99:&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2520</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Accueil&amp;diff=2520"/>
		<updated>2024-05-02T15:30:25Z</updated>

		<summary type="html">&lt;p&gt;Justine : /* Systèmes 40x49px|869px-Tux.svg.png */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Disclaimer ==&lt;br /&gt;
Ceci est mon wiki personnel, rédigé au cours de mes études et de ma carrière; je n&#039;ai pas la prétention que tout y soit exact.&lt;br /&gt;
Toutes les pages utiles sont en lien sur la présente page de sommaire. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit de mes notes personnelles, que je ne mettrait à jour que si j&#039;en ressens le besoin. Il peut parfois s&#039;agir de traduction d&#039;articles existants, si c&#039;est le cas, le lien original est en général au sommet de la page.&lt;br /&gt;
&lt;br /&gt;
[[Logo du site]]&lt;br /&gt;
&lt;br /&gt;
Justine&lt;br /&gt;
&lt;br /&gt;
==Autres / Aide==&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Help:Formatting/fr Aide au formatage]&lt;br /&gt;
*[https://guides.github.com/pdfs/markdown-cheatsheet-online.pdf Aide au langage markdown (pour Git)]&lt;br /&gt;
*[[Portfolio - Notes en vrac]]&lt;br /&gt;
*[[ITIL]]&lt;br /&gt;
*[[Vocabulaire &amp;amp; notions diverses]]&lt;br /&gt;
*[https://www.mediawiki.org/wiki/Extension:SyntaxHighlight L&#039;extension SyntaxHighlight]&lt;br /&gt;
&lt;br /&gt;
==Cheat Sheets==&lt;br /&gt;
* [[Idées diverses de gain de temps]]&lt;br /&gt;
&lt;br /&gt;
* [[Cs: Ansible]]&lt;br /&gt;
* [[CS : FirewallD]]&lt;br /&gt;
* [[Cs : Vim]]&lt;br /&gt;
* [[Cs:_Tips_Linux]]&lt;br /&gt;
* [[Cs: Git]]&lt;br /&gt;
* [[Cs: Pacman]]&lt;br /&gt;
* [[CS : lsof]]&lt;br /&gt;
* [[CS : SecuriteLinux]]&lt;br /&gt;
* [[Mémo_Apache|Mémo Apache]] &lt;br /&gt;
* [[Memo_nginx|Memo nginx]]   &lt;br /&gt;
* [[Mémo_Openssl|Mémo Openssl]]&lt;br /&gt;
&lt;br /&gt;
==Ansible== &lt;br /&gt;
* [[Ansible|Ansible]] &lt;br /&gt;
** [[Ansible : remplacement récursif de texte]]&lt;br /&gt;
** [[Ansible : Filtres]]&lt;br /&gt;
** [[Ansible : playbook avancé, avec handlers et templates]]&lt;br /&gt;
** [[Ansible : Quirks]]&lt;br /&gt;
** [[Ansible et Windows]]&lt;br /&gt;
** [[Ansible : awx-cli]]&lt;br /&gt;
** [[Ansible : Collections]]&lt;br /&gt;
** [[Ansible : sous-commandes]]&lt;br /&gt;
** [[Ansible : VMWare]]&lt;br /&gt;
&lt;br /&gt;
==Conteneurs== &lt;br /&gt;
[[Fichier:Moby-logo-small.png|90px]]  [[Fichier:K8s-small.png|90px]]&lt;br /&gt;
* [[Docker|Docker]] &lt;br /&gt;
* [[Docker-compose]]&lt;br /&gt;
* [[Traefik]]&lt;br /&gt;
* [[Docker swarm]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[LXD]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;/span&amp;gt;Systèmes&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;mw_htmlentity&amp;quot;&amp;gt; &#039;&#039;&#039;[[File:869px-Tux.svg.png|40x49px|869px-Tux.svg.png]]&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
* [[Additions_Invité_sur_Linux|Additions Invité sur Linux]] &lt;br /&gt;
* [[Analyse de logs]]&lt;br /&gt;
** [[Rsyslog]]&lt;br /&gt;
** [[YAML]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
* [[Apache Tomcat]]&lt;br /&gt;
* [[Appels Système (syscall)]]&lt;br /&gt;
* [[APT]]&lt;br /&gt;
* [[Architecture système]]&lt;br /&gt;
* [[Asterisk|Asterisk]] &lt;br /&gt;
* [[Authentification - PAM]] &lt;br /&gt;
* [[Autostart]]&lt;br /&gt;
* [[Awk]]&lt;br /&gt;
* [[Bases_de_données|Bases de données]] &lt;br /&gt;
* [[Bind9]]&lt;br /&gt;
* [[Ceph]]&lt;br /&gt;
* [[Certbot]]&lt;br /&gt;
* [[Cgroups]]&lt;br /&gt;
* [[CheckMK]]&lt;br /&gt;
* [[Chronyd]]&lt;br /&gt;
* [[Cloud Computing]]&lt;br /&gt;
* [[Commandes analyse maillog]]&lt;br /&gt;
* [[Commandes de test de charge]]&lt;br /&gt;
* [[Commandes_Linux|Commandes Linux]] &lt;br /&gt;
* [[Convertir des .deb en .rpm avec alien]]&lt;br /&gt;
* [[Cryptographie|Cryptographie]] &lt;br /&gt;
** [[Protocole ACME]]&lt;br /&gt;
* [[Droits|Droits]] &lt;br /&gt;
* [[Environnement utilisateur]]&lt;br /&gt;
* [[Filesystems|Filesystems]] &lt;br /&gt;
** [[Surveillance de disques]]&lt;br /&gt;
* [[Firefox]]&lt;br /&gt;
* [[Fstab]]&lt;br /&gt;
* [[Gestion_de_paquets|Gestion de paquets]] &lt;br /&gt;
** [[Unattended-upgrades]]&lt;br /&gt;
* [[Grafana et prometheus]]&lt;br /&gt;
* [[Groupwares|Groupwares]] &lt;br /&gt;
* [[HAProxy]]&lt;br /&gt;
* [[Informations Système sous Linux]]&lt;br /&gt;
* [[Juju]]&lt;br /&gt;
* [[KeepaliveD]]&lt;br /&gt;
* [[Kernel Tuning]]&lt;br /&gt;
* [[Kubernetes]]&lt;br /&gt;
* [[Kubernetes (obsolete)]]&lt;br /&gt;
* [[LAMP|LAMP]]&lt;br /&gt;
* [[LDAP]] &lt;br /&gt;
* [[Linux|Linux / Systèmes]] &lt;br /&gt;
* [[Linux : Permissions]]&lt;br /&gt;
* [[Attributs_Linux_étendus|Attributs Linux étendus]] &lt;br /&gt;
* [[Linux : Mémoire, RAM, swap]]&lt;br /&gt;
* [[Linux : Gestion de la résolution]]&lt;br /&gt;
* [[Logrotate]]&lt;br /&gt;
* [[Make]]&lt;br /&gt;
* [[Messagerie : Risques]]&lt;br /&gt;
* [[OAuth]]&lt;br /&gt;
* [[PHP]]&lt;br /&gt;
* [[Pile son]]&lt;br /&gt;
* [[Postfix]]&lt;br /&gt;
* [[Processus et Appels Système]]&lt;br /&gt;
* [[Proxmox|Proxmox]] &lt;br /&gt;
* [[Raccourcis_shell_bash|Raccourcis shell bash]] &lt;br /&gt;
* [[Raccourcis_Vim|Raccourcis Vim]] &lt;br /&gt;
* [[Red Hat : Satellite 6]]&lt;br /&gt;
* [[Reverse Proxy Nginx]]&lt;br /&gt;
* [[Rsync,_SFTP,_RoboCopy|Rsync, SFTP, RoboCopy]] &lt;br /&gt;
* [[Screen]]&lt;br /&gt;
* [[Sed]]&lt;br /&gt;
* [[Sendmail]]&lt;br /&gt;
* [[Sockets]]&lt;br /&gt;
* [[Stockage|Stockage]] &lt;br /&gt;
** [[LVM : opérations courantes]]&lt;br /&gt;
** [[Iscsiadm]]&lt;br /&gt;
** [[IscsiAdm + Multipath]]&lt;br /&gt;
* [[Structure de dossiers Linux]]&lt;br /&gt;
* [[Supervision]]&lt;br /&gt;
* [[Systemd]]&lt;br /&gt;
** [[Timesyncd]]&lt;br /&gt;
* [[Utilisateurs|Utilisateurs]] &lt;br /&gt;
* [[Varnish]]&lt;br /&gt;
* [[VMWare|VMWare]] &lt;br /&gt;
** [[VMWare : Utilisation de PowerCLI]]&lt;br /&gt;
** [[VMWare : Autres notions]]&lt;br /&gt;
&lt;br /&gt;
=== Spécificités Windows [[Fichier:Winlogo.png|50px]] === &lt;br /&gt;
&lt;br /&gt;
* [[Services_Windows|Services Windows]] &lt;br /&gt;
** [[Active_Directory|Active Directory]]&lt;br /&gt;
** [[WSUS_et_Core|WSUS et Core]] &lt;br /&gt;
** [[PowerShell|PowerShell]] &lt;br /&gt;
** [[GPO|GPO]] &lt;br /&gt;
** [[Exchange|Exchange]] &lt;br /&gt;
** [[Exchange pour de vrai]]&lt;br /&gt;
** [[Windows : Outils à connaître]]&lt;br /&gt;
** [[Powershell : Active Directory]]&lt;br /&gt;
** [[AD : intégration Linux]]&lt;br /&gt;
* [[Création de tâches planifiée]]&lt;br /&gt;
* [[Gestion d&#039;accès chez Microsoft]]&lt;br /&gt;
* [[Smbclient]]&lt;br /&gt;
* [[Commandes CMD utiles]]&lt;br /&gt;
&lt;br /&gt;
== Réseaux  [[File:Computer-networking.jpg|middle|77x60px|Computer-networking.jpg]] ==&lt;br /&gt;
&lt;br /&gt;
*[[DHCPv4|DHCPv4]] &lt;br /&gt;
*[[DHCPv6|DHCPv6]] &lt;br /&gt;
*[[DNS|DNS]] &lt;br /&gt;
*[[Ethernet|Ethernet]] &lt;br /&gt;
**[[FireWall_:_CheckPoint|FireWall : CheckPoint]]   &lt;br /&gt;
*[[Firewall|Firewall]] &lt;br /&gt;
**[[Firewall_:_Juniper|Firewall : Juniper]] &lt;br /&gt;
**[[FireWall : CheckPoint]]&lt;br /&gt;
**[[Firewalld]]&lt;br /&gt;
**[[IPTables]]&lt;br /&gt;
**[[Nftables]]&lt;br /&gt;
*[[Gestion_de_parc|Gestion de parc]] &lt;br /&gt;
*[[GlobalProtect sur linux]]&lt;br /&gt;
*[[ICMPv4|ICMPv4]] &lt;br /&gt;
*[[IPv4|IPv4]] &lt;br /&gt;
*[[IPv6|IPv6]] &lt;br /&gt;
* [[Knot DNS]]&lt;br /&gt;
*[[Liste_des_ports|Liste des ports]] &lt;br /&gt;
*[[Modèle_OSI_et_TCP/IP|Modèle OSI et TCP/IP]] &lt;br /&gt;
*[[NAT/PAT|NAT/PAT]] &lt;br /&gt;
*[[NetCat|NetCat]] &lt;br /&gt;
*[[Nmap]]&lt;br /&gt;
*[[Protocoles|Protocoles]] &lt;br /&gt;
*[[Proxy|Proxy]] &lt;br /&gt;
*[[Reseau|Reseau]] &lt;br /&gt;
*[[SNMP|SNMP]] &lt;br /&gt;
*[[SSH|SSH]] &lt;br /&gt;
*[[SSO|SSO]] &lt;br /&gt;
*[[TCP_&amp;amp;_UDP|TCP &amp;amp; UDP]] &lt;br /&gt;
*[[Tor]]&lt;br /&gt;
*[[VLAN|VLAN]] &lt;br /&gt;
*[[VPN|VPN]]&lt;br /&gt;
* [[Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Cisco NetAcad [[File:1200px-Cisco logo blue 2016.svg.png|middle|75x50px|1200px-Cisco logo blue 2016.svg.png]] ===&lt;br /&gt;
&lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_1|Cisco : R&amp;amp;S 1]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_2|Cisco : R&amp;amp;S 2]] &lt;br /&gt;
*[[Cisco_:_R&amp;amp;S_3|Cisco : R&amp;amp;S 3]]&lt;br /&gt;
&lt;br /&gt;
== Web ==&lt;br /&gt;
*[[CGI]]&lt;br /&gt;
*[[Websockets]]&lt;br /&gt;
&lt;br /&gt;
== Cybersécurité [[File:Padlock.png|Padlock.png|77x60px]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Cybersécurité|Cybersécurité : notions de base]] &lt;br /&gt;
*[[Cybersécurité_:_keepass|Cybersécurité : keepass]] &lt;br /&gt;
*[[Metasploit|Metasploit]] &lt;br /&gt;
*[[Cybersécurité_(Kali)_:_Crack_de_mots_de_passe_avec_Hydra|Cybersécurité (Kali) : Crack de mots de passe avec Hydra]] &lt;br /&gt;
*[[Cybersécurité_:_Documentation|Cybersécurité : Documentation]] &lt;br /&gt;
*[[Cybersécurité_:_Lynis|Cybersécurité : Lynis]] &lt;br /&gt;
*[[Cybersécurité_:_Graylog|Cybersécurité : Graylog]] &lt;br /&gt;
*[[Cybersécurité_:_Liens|Cybersécurité : Liens]]&lt;br /&gt;
*[[Messagerie : Risques]] &lt;br /&gt;
*[[Outils Divers]]&lt;br /&gt;
*[[Tests de charge]]&lt;br /&gt;
*[[Honeypot]]&lt;br /&gt;
* [[Shodan]]&lt;br /&gt;
* [https://github.com/certsocietegenerale/IRM/tree/master/EN Des méthodes simples d&#039;analyse]&lt;br /&gt;
* [[Ffuf : Fuzz Faster U Fool]]&lt;br /&gt;
* [[PGP - GPG]]&lt;br /&gt;
&lt;br /&gt;
=== HackTheBox Academy ===&lt;br /&gt;
Mes notes concernant mon suivi de modules sur HTB Academy - elles sont possiblement en anglais.&lt;br /&gt;
* [[HTBA : Active Directory Intro]]&lt;br /&gt;
&lt;br /&gt;
== Gestion de projet [[File:Gdpimage.png|middle|96x64px|Gdpimage.png]] ==&lt;br /&gt;
&lt;br /&gt;
*[[Gestion_de_projet|Gestion de projet]] &lt;br /&gt;
*[[Outils_et_Méthodologie_de_Résolution_de_Problèmes_(MRP)|Outils et Méthodologie de Résolution de Problèmes (MRP)]] &lt;br /&gt;
*[[GDP_Agile_avec_SCRUM|GDP Agile avec SCRUM]]&lt;br /&gt;
&lt;br /&gt;
== Scripting / Programmation [[File:Python-7be70baaac.png|middle|69x69px|Python-7be70baaac.png]][[File:Bashlogo.png|middle|74x74px|Bashlogo.png]] ==&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
**[[Python : APIs]]&lt;br /&gt;
**[[Python : argparse]]&lt;br /&gt;
**[[Python : Black]]&lt;br /&gt;
**[[Python : coloration de texte]]&lt;br /&gt;
**[[Python_:_Context_Manager|Python : Context Manager]] &lt;br /&gt;
**[[Python : Dataclasses]]&lt;br /&gt;
**[[Python : datetimes]]&lt;br /&gt;
**[[Python : dictionnaires]]&lt;br /&gt;
**[[Python : Ensembles]]&lt;br /&gt;
**[[Python : Fichiers de config]]&lt;br /&gt;
**[[Python : Flask]]&lt;br /&gt;
***[[Python : Flask et SocketIO]]&lt;br /&gt;
**[[Python_:_Fonctions|Python : Fonctions]] &lt;br /&gt;
**[[Python : Fonctions de l&#039;interpréteur]]&lt;br /&gt;
**[[Python_:_Les_fichiers|Python : Les fichiers]]  &lt;br /&gt;
**[[Python : fstrings]] &lt;br /&gt;
**[[Python : Interactions avec Windows]]&lt;br /&gt;
**[[Python_:_Listes|Python : Listes]] &lt;br /&gt;
** [[Python : Locust (Tests de charge)]]&lt;br /&gt;
**[[Python_:_Méthodes_de_chaines|Python : Méthodes de chaines]] &lt;br /&gt;
**[[Python_:_misc|Python : misc]] &lt;br /&gt;
**[[Python : Opérateurs]]&lt;br /&gt;
**[[Python : Opérateur Binaires]]&lt;br /&gt;
**[[Python : os.walk()]]&lt;br /&gt;
**[[Python_-_PEP8|Python - PEP8]] &lt;br /&gt;
**[[Python : Pipenv]]&lt;br /&gt;
**[[Python : Pygame]]&lt;br /&gt;
**[[Python : PySimpleGUI]]&lt;br /&gt;
**[[Python_:_Programmation_Asynchrone|Python : Programmation Asynchrone]] &lt;br /&gt;
**[[Python_:_Programmation_système|Python : Programmation système]] &lt;br /&gt;
**[[Python_:_Réseau|Python : Réseau]] &lt;br /&gt;
**[[Python : simuler des inputs]]&lt;br /&gt;
**[[Python_:_Tkinter|Python : Tkinter]] &lt;br /&gt;
**[[Python : Virtualenv]]&lt;br /&gt;
**[[Python_:_Vocabulaire|Python : Vocabulaire]] &lt;br /&gt;
**[[Python_:_with_et_les_gestionnaires_de_contexte|Python : with et les gestionnaires de contexte]]&lt;br /&gt;
&lt;br /&gt;
=== Rust ===&lt;br /&gt;
Il s&#039;agit de mes notes issues du livre officiel de Rust : [https://doc.rust-lang.org/book/ The Rust book] dans l&#039;ordre des chapitres.&lt;br /&gt;
&lt;br /&gt;
* [[Rust : Structs]]&lt;br /&gt;
* [[Rust: enums]]&lt;br /&gt;
* [[Rust : match]]&lt;br /&gt;
* [[Rust : if let]]&lt;br /&gt;
* [[Rust : packages]]&lt;br /&gt;
* [[Rust : Common collections]]&lt;br /&gt;
* [[Rust : Error handling]]&lt;br /&gt;
* [[Rust : génériques, traits, lifetimes]]&lt;br /&gt;
* [[Rust : tests automatisés]]&lt;br /&gt;
* [[Rust : iterateurs]]&lt;br /&gt;
(Le reste sur mon gitea).&lt;br /&gt;
&lt;br /&gt;
Autres notes:&lt;br /&gt;
* [[Rust : Debug avec GDB]]&lt;br /&gt;
* [[Rust : serde]]&lt;br /&gt;
* [[Rust : Display implementation and Rc + RefCell use demo]]&lt;br /&gt;
* [[Rust : async]]&lt;br /&gt;
&lt;br /&gt;
=== Bash ===&lt;br /&gt;
**[[Bash|Bash : Anciennes notes]] &lt;br /&gt;
**[[Bash_:_Codes_de_retour|Bash : Codes de retour]] &lt;br /&gt;
**[[Bash_:_Fonctions|Bash : Fonctions]] &lt;br /&gt;
**[[Bash_:_généralités|Bash : généralités]] &lt;br /&gt;
**[[Bash_:_Paramètres_de_position|Bash : Paramètres de position]] &lt;br /&gt;
**[[Bash_:_Pattern_Matching|Bash : Pattern Matching]]  &lt;br /&gt;
**[[Bash_:_Tableaux|Bash : Tableaux]] &lt;br /&gt;
**[[Bash_:_Traitement_sur_les_chaînes|Bash : Traitement sur les chaînes]] &lt;br /&gt;
**[[Zsh]]&lt;br /&gt;
&lt;br /&gt;
=== Powershell ===&lt;br /&gt;
**[[PowerShell|PowerShell]] &lt;br /&gt;
**[[PowerShell_:_Scripting|PowerShell : Scripting]] &lt;br /&gt;
**[[PowerShell_:_scripts_complets|PowerShell : scripts complets]] &lt;br /&gt;
**[[PowerShell_:_Exporter_une_boîte_en_pst|PowerShell : Exporter une boîte en pst]]   &lt;br /&gt;
&lt;br /&gt;
=== Généralités ===&lt;br /&gt;
**[[Expressions_Régulières|Expressions Régulières]]&lt;br /&gt;
**[[RPC / REST]]&lt;br /&gt;
&lt;br /&gt;
=== Assembleur ===&lt;br /&gt;
* [[Assembleur|Assembleur (généralités)]]&lt;br /&gt;
* [[Assembleur : boot sector]]&lt;br /&gt;
&lt;br /&gt;
=== Langage C ===&lt;br /&gt;
** [[C : bases]]&lt;br /&gt;
**[[Langage C]]&lt;br /&gt;
&lt;br /&gt;
=== Golang ===&lt;br /&gt;
**[[Golang : bases]]&lt;br /&gt;
&lt;br /&gt;
== Hors-Sujet ==&lt;br /&gt;
&lt;br /&gt;
*[[Coaching_:_CV|Coaching : CV]]&lt;br /&gt;
*[[Droit|Droit]] &lt;br /&gt;
*[[Management|Management]] &lt;br /&gt;
*[[Ondes_radio|Ondes radio]]&lt;br /&gt;
*[[Vérités et contre-vérités]]&lt;br /&gt;
*[[Questions Sysadmin]]&lt;br /&gt;
*[[Comprendre comment fonctionne son organisation]]&lt;br /&gt;
&lt;br /&gt;
=== Musique ===&lt;br /&gt;
*[[Musique modale, musique tonale]]&lt;br /&gt;
*[[Gamme pentatonique]]&lt;br /&gt;
&lt;br /&gt;
== Jouer sur Linux ==&lt;br /&gt;
* [[Steam]]&lt;br /&gt;
&lt;br /&gt;
== Notes Personnelles ==&lt;br /&gt;
&lt;br /&gt;
Cette section contient des notes plus personnelles et moins rédigées, laissées là pour référence future.&lt;br /&gt;
&lt;br /&gt;
*[[Secure boot &amp;amp; pilotes nVIdia]]&lt;br /&gt;
*[[Dual boot et ennuis divers...]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;C’est pour ça : j’lis jamais rien. C’est un vrai piège à cons c’t’histoire-là. En plus j’sais pas lire.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Make&amp;diff=2519</id>
		<title>Make</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Make&amp;diff=2519"/>
		<updated>2024-05-02T15:29:57Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Make : présentation vite fait =&lt;br /&gt;
&lt;br /&gt;
La définition de GNU.org donne:&lt;br /&gt;
&lt;br /&gt;
 GNU Make is a tool which controls the generation of executables and other non-source files of a program from the program&#039;s source files. &lt;br /&gt;
&lt;br /&gt;
Il s&#039;agit d&#039;un outil que l&#039;on rencontre souvent et qui tend à être de moins en moins utilisé malgré sa simplicité. Pour le dire plus simplement, Make sert principalement à compiler et installer des programmes; il orchestre des tâches selon des dépendences, exécute des commandes pour générer des fichiers et les garder à jour de façon efficace.&lt;br /&gt;
&lt;br /&gt;
Il a pour lui:&lt;br /&gt;
* D&#039;exister sur tous les OS ou presque&lt;br /&gt;
* De gérer les dépendances, les valeurs par défaut&lt;br /&gt;
* De ne pas peser bien lourd,&lt;br /&gt;
* etc&lt;br /&gt;
&lt;br /&gt;
= Utilisation simple =&lt;br /&gt;
* [https://gagor.pro/2024/02/how-i-stopped-worrying-and-loved-makefiles/ Source]&lt;br /&gt;
* [https://www.gnu.org/software/make/manual/make.html Documentation]&lt;br /&gt;
&lt;br /&gt;
L&#039;exemple donné dans la sources utilise make pour générer les fichiers d&#039;alias, access et autres dans Postfix. Il s&#039;agit de fichiers de conf que l&#039;on écrit et que l&#039;on compile dans un format particulier (le Berkeley DB, en .db).&lt;br /&gt;
&lt;br /&gt;
On va pouvoir utiliser un makefile pour le faire automatiquement; chacun de nos fichier .db sera une target de notre makefile. Le makefile contient des règles pour créer nos targets.&lt;br /&gt;
&lt;br /&gt;
L&#039;exemple de make donné dans ma source est:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
.PHONY: reload&lt;br /&gt;
&lt;br /&gt;
all: aliases.db access.db virtual.db reload&lt;br /&gt;
&lt;br /&gt;
aliases.db: aliases&lt;br /&gt;
    postalias aliases&lt;br /&gt;
&lt;br /&gt;
access.db: access&lt;br /&gt;
    postmap access&lt;br /&gt;
&lt;br /&gt;
virtual.db: virtual&lt;br /&gt;
    postmap virtual&lt;br /&gt;
&lt;br /&gt;
reload:&lt;br /&gt;
    postfix reload&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le fichier doit être nommé &amp;quot;makefile&amp;quot; ou &amp;quot;Makefile&amp;quot; .&lt;br /&gt;
&lt;br /&gt;
Explication:&lt;br /&gt;
* .PHONY : On déclare ici quelles targets sont &amp;quot;phony&amp;quot; (comme dans &amp;quot;faux&amp;quot; ou &amp;quot;bidon&amp;quot; en français) : il s&#039;agit de cibles qui ne vont pas réellement générer des fichiers. On déclare &amp;quot;reload&amp;quot; comme étant phony : on ne cherche pas à générer un fichier qui s&#039;appellerait &amp;quot;reload&amp;quot;, et même si il y&#039;a un fichier nommé ainsi on n&#039;en tiens pas compte.&lt;br /&gt;
* all : all est une règle particulière, appellée avec la commande &amp;quot;make all&amp;quot; (ou juste &amp;quot;make&amp;quot;, all est la règle par défaut). Ici on déclare que make doit exécuter les règles citées, dans l&#039;ordre.&lt;br /&gt;
* aliases.db: aliases : Ici, on dit que le fichier &amp;quot;aliases.db&amp;quot; dépend du fichier &amp;quot;aliases&amp;quot;. Si aliases.db n&#039;existe pas ou que aliases est plus récent que lui, le fichier aliases.db sera généré avec la commande donnée en dessous.&lt;br /&gt;
* postalias aliases : Il s&#039;agit de la commande utilisée pour générer le fichier aliases.db.&lt;br /&gt;
Le même schéma est utilisé pour les 2 autres fichiers .db.&lt;br /&gt;
* reload : Déclare la target reload. Cette target pourra être appellée avec la commande &amp;quot;make reload&amp;quot;&lt;br /&gt;
* postfix reload : commande exécutée par la target reload.&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
	<entry>
		<id>https://wiki.squi.fr/index.php?title=Make&amp;diff=2518</id>
		<title>Make</title>
		<link rel="alternate" type="text/html" href="https://wiki.squi.fr/index.php?title=Make&amp;diff=2518"/>
		<updated>2024-05-02T15:09:02Z</updated>

		<summary type="html">&lt;p&gt;Justine : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Make =&lt;br /&gt;
&lt;br /&gt;
La définition de GNU.org donne:&lt;br /&gt;
&lt;br /&gt;
{{Blockquote&lt;br /&gt;
|text=GNU Make is a tool which controls the generation of executables and other non-source files of a program from the program&#039;s source files. &lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Justine</name></author>
	</entry>
</feed>