-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlinux_interactive.html
More file actions
1155 lines (1083 loc) · 86.7 KB
/
Copy pathlinux_interactive.html
File metadata and controls
1155 lines (1083 loc) · 86.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GNU/Linux — Guide interactif</title>
<style>
:root{
--bg:#f8fafc;--card:#ffffff;--border:#cbd5e1;--text:#1e293b;--muted:#475569;
--acc:#b45309;--acc2:#92400e;--blue600:#2563eb;
--green:#16a34a;--red:#dc2626;--orange:#ea580c;--purple:#7c3aed;
--grad1:#451a03;--grad2:#78350f;
}
@media(prefers-color-scheme:dark){
:root{
--bg:#0f172a;--card:#1e293b;--border:#334155;--text:#f1f5f9;--muted:#94a3b8;
}
}
*{box-sizing:border-box;margin:0;padding:0;}
body{font-family:system-ui,-apple-system,sans-serif;background:var(--bg);color:var(--text);line-height:1.6;}
.header{background:linear-gradient(135deg,var(--grad1),var(--grad2));color:white;padding:2rem;text-align:center;}
.header h1{font-size:2rem;font-weight:700;margin-bottom:.4rem;}
.header p{color:#fcd34d;font-size:.95rem;}
.badge{display:inline-block;background:var(--acc);color:white;padding:.2rem .8rem;border-radius:20px;font-size:.8rem;font-weight:700;margin:.3rem .2rem;}
nav{display:flex;flex-wrap:wrap;gap:.4rem;justify-content:center;padding:1.2rem 1rem;background:var(--card);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:100;}
.tab-btn{padding:.45rem 1rem;border-radius:999px;border:none;background:var(--border);color:var(--muted);cursor:pointer;font-size:.88rem;font-weight:500;transition:all .2s;white-space:nowrap;}
.tab-btn:hover{background:#eff6ff;color:var(--blue600);}
.tab-btn.active{background:var(--blue600);color:white;}
.content{max-width:1100px;margin:0 auto;padding:2rem 1rem;}
.tab-panel{display:none;}
.tab-panel.active{display:block;}
.section-title{font-size:1.35rem;font-weight:700;color:var(--text);margin-bottom:1rem;display:flex;align-items:center;gap:.5rem;}
.section-title::before{content:'';display:inline-block;width:4px;height:1.35rem;background:var(--acc);border-radius:2px;}
.card{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:1.4rem;margin-bottom:1.5rem;}
.card h3{font-size:1.05rem;font-weight:700;margin-bottom:.8rem;}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;}
.grid4{display:grid;grid-template-columns:repeat(4,1fr);gap:.8rem;}
@media(max-width:700px){.grid2,.grid3,.grid4{grid-template-columns:1fr;}}
.info-box{background:var(--border);border-radius:8px;padding:.9rem 1rem;margin-bottom:.8rem;}
.info-box.blue{border-left:4px solid var(--blue600);}
.info-box.teal{border-left:4px solid #0d9488;}
.info-box.amber{border-left:4px solid var(--acc);}
.info-box.purple{border-left:4px solid var(--purple);}
.info-box.coral{border-left:4px solid var(--red);}
.info-box.green{border-left:4px solid var(--green);}
.info-box.orange{border-left:4px solid var(--orange);}
.info-box.cyan{border-left:4px solid #0891b2;}
.info-box .label{font-weight:700;font-size:.82rem;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.4rem;}
.info-box.blue .label{color:var(--blue600);}
.info-box.teal .label{color:#0d9488;}
.info-box.amber .label{color:var(--acc);}
.info-box.purple .label{color:var(--purple);}
.info-box.coral .label{color:var(--red);}
.info-box.green .label{color:var(--green);}
.info-box.orange .label{color:var(--orange);}
.info-box.cyan .label{color:#0891b2;}
/* Arch layers */
.arch-layer{display:flex;align-items:center;gap:1rem;width:100%;max-width:680px;margin:.25rem auto;}
.arch-lbl{width:110px;text-align:right;font-size:.78rem;color:var(--muted);font-weight:600;flex-shrink:0;}
.arch-box{flex:1;border-radius:8px;padding:.55rem 1rem;text-align:center;font-size:.85rem;font-weight:600;cursor:pointer;transition:transform .15s,box-shadow .15s;}
.arch-box:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.12);}
.arch-arrow{width:100%;max-width:680px;margin:0 auto;text-align:center;color:var(--muted);}
/* Kernel subsystems */
.kernel-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:.5rem;}
.ks-box{border-radius:8px;padding:.7rem .5rem;text-align:center;cursor:pointer;transition:all .2s;border:2px solid transparent;}
.ks-box:hover,.ks-box.active{border-color:var(--blue600);transform:translateY(-2px);}
.ks-icon{font-size:1.4rem;margin-bottom:.3rem;}
.ks-name{font-weight:700;font-size:.82rem;}
.ks-sub{font-size:.74rem;color:var(--muted);margin-top:.2rem;}
/* Boot steps */
.boot-steps{display:flex;flex-direction:column;gap:0;}
.boot-step{display:flex;gap:1rem;position:relative;}
.boot-step::before{content:'';position:absolute;left:20px;top:40px;bottom:-8px;width:2px;background:var(--border);}
.boot-step:last-child::before{display:none;}
.boot-num{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:.9rem;flex-shrink:0;color:white;margin-top:.4rem;}
.boot-body{flex:1;padding:.6rem 0 1.2rem;}
.boot-title{font-weight:700;font-size:.95rem;}
.boot-desc{font-size:.83rem;color:var(--muted);margin-top:.2rem;}
.boot-detail{font-size:.8rem;color:var(--muted);margin-top:.25rem;font-family:monospace;}
/* FS tree */
.fs-tree{font-family:monospace;font-size:.85rem;line-height:1.9;background:var(--border);border-radius:10px;padding:1rem 1.2rem;}
.fs-dir{color:var(--blue600);font-weight:700;cursor:pointer;}
.fs-dir:hover{text-decoration:underline;}
.fs-desc{color:var(--muted);font-size:.8rem;margin-left:.5rem;}
/* Detail panel */
.detail-panel{background:var(--border);border-radius:10px;padding:1.1rem;margin-top:.8rem;border:1px solid var(--border);display:none;}
.detail-panel.visible{display:block;}
/* Process tree */
.proc-box{border:2px solid var(--border);border-radius:8px;padding:.5rem .8rem;text-align:center;font-size:.82rem;display:inline-block;cursor:pointer;transition:all .2s;}
.proc-box:hover{border-color:var(--blue600);}
.proc-box.highlight{border-color:var(--acc);background:var(--border);}
.proc-arrow{color:var(--muted);font-size:.8rem;text-align:center;}
/* Permissions table */
.perm-table{width:100%;border-collapse:collapse;font-size:.85rem;}
.perm-table th{background:var(--border);padding:.5rem .7rem;text-align:left;font-weight:700;border-bottom:2px solid var(--border);}
.perm-table td{padding:.45rem .7rem;border-bottom:1px solid var(--border);}
.perm-table tr:hover td{background:var(--border);}
/* Syscall */
.syscall-flow{display:flex;align-items:center;flex-wrap:wrap;gap:.4rem;justify-content:center;margin:1rem 0;}
.sf-box{background:var(--border);border-radius:8px;padding:.5rem .9rem;font-size:.83rem;font-weight:600;text-align:center;}
.sf-arrow{color:var(--muted);font-size:1rem;}
/* Signal table */
.sig-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:.5rem;}
.sig-item{background:var(--border);border-radius:6px;padding:.5rem .7rem;}
.sig-name{font-family:monospace;font-weight:700;font-size:.85rem;}
.sig-num{color:var(--muted);font-size:.78rem;}
.sig-desc{font-size:.78rem;color:var(--muted);margin-top:.15rem;}
/* Memory diagram */
.mem-seg{display:flex;align-items:center;gap:.8rem;margin-bottom:3px;}
.mem-bar{flex:1;height:28px;border-radius:4px;display:flex;align-items:center;padding:0 .7rem;font-size:.8rem;font-weight:600;color:white;}
.mem-addr{width:100px;font-family:monospace;font-size:.75rem;color:var(--muted);text-align:right;flex-shrink:0;}
/* Code block */
.codeblk{background:#1e1e2e;color:#cdd6f4;border-radius:10px;padding:1rem 1.2rem;font-family:'Courier New',monospace;font-size:.82rem;line-height:1.75;overflow-x:auto;;white-space:pre-wrap}
.c-kw{color:#89b4fa;font-weight:700;}
.c-comment{color:#6c7086;font-style:italic;}
.c-val{color:#a6e3a1;}
.c-str{color:#f38ba8;}
.c-op{color:#f9e2af;}
/* Tags */
.tag{display:inline-block;padding:.18rem .55rem;border-radius:4px;font-size:.78rem;font-weight:600;margin:.15rem;}
.tag-blue{background:#eff6ff;color:var(--blue600);}
.tag-teal{background:#f0fdfa;color:#0d9488;}
.tag-amber{background:#fffbeb;color:var(--acc);}
.tag-purple{background:#f5f3ff;color:var(--purple);}
.tag-green{background:#f0fdf4;color:var(--green);}
.tag-coral{background:#fff1f2;color:var(--red);}
@media(prefers-color-scheme:dark){
.tag-blue{background:#1e3a5f;}.tag-teal{background:#042f2e;}.tag-amber{background:#451a03;}
.tag-purple{background:#2e1065;}.tag-green{background:#052e16;}.tag-coral{background:#4c0519;}
}
/* Quiz */
.quiz-q{background:var(--card);border:1px solid var(--border);border-radius:10px;padding:1.1rem;margin-bottom:1rem;}
.quiz-q .question{font-weight:600;margin-bottom:.7rem;}
.quiz-answers{display:flex;flex-direction:column;gap:.35rem;}
.quiz-ans{padding:.5rem .9rem;border:1.5px solid var(--border);border-radius:6px;cursor:pointer;font-size:.88rem;transition:all .2s;}
.quiz-ans:hover{border-color:var(--blue600);background:#eff6ff;}
.quiz-ans.correct{background:#dcfce7;border-color:var(--green);color:#166534;}
.quiz-ans.wrong{background:#fee2e2;border-color:var(--red);color:#991b1b;}
@media(prefers-color-scheme:dark){
.quiz-ans.correct{background:#052e16;color:#86efac;}
.quiz-ans.wrong{background:#4c0519;color:#fca5a5;}
}
.quiz-feedback{font-size:.83rem;margin-top:.5rem;padding:.5rem .8rem;border-radius:6px;display:none;}
.quiz-feedback.show{display:block;}
.quiz-feedback.ok{background:#dcfce7;color:#166534;}
.quiz-feedback.ko{background:#fee2e2;color:#991b1b;}
@media(prefers-color-scheme:dark){
.quiz-feedback.ok{background:#052e16;color:#86efac;}
.quiz-feedback.ko{background:#4c0519;color:#fca5a5;}
}
#quiz-result{display:none;background:#eff6ff;border:2px solid var(--blue600);border-radius:10px;padding:1.4rem;text-align:center;margin-top:1rem;}
@media(prefers-color-scheme:dark){
.tab-btn:hover{background:#1e3a5f;}
.quiz-ans:hover{background:#1e3a5f;}
#quiz-result{background:#1e3a5f;}
}
.quiz-btn{background:var(--acc);color:white;border:none;padding:.6rem 1.4rem;border-radius:8px;cursor:pointer;font-size:.95rem;font-weight:700;margin-top:1rem;}
</style>
</head>
<body>
<div class="header">
<h1>🐧 GNU/Linux — Guide interactif</h1>
<p>Kernel, démarrage, système de fichiers, processus, mémoire et sécurité</p>
<span class="badge">Kernel</span>
<span class="badge">Démarrage</span>
<span class="badge">Fichiers</span>
<span class="badge">Processus</span>
<span class="badge">Mémoire</span>
<span class="badge">Sécurité</span>
</div>
<nav>
<button class="tab-btn active" onclick="showTab('overview')">Vue d'ensemble</button>
<button class="tab-btn" onclick="showTab('kernel')">Kernel</button>
<button class="tab-btn" onclick="showTab('boot')">Démarrage</button>
<button class="tab-btn" onclick="showTab('fs')">Système de fichiers</button>
<button class="tab-btn" onclick="showTab('process')">Processus</button>
<button class="tab-btn" onclick="showTab('memory')">Mémoire</button>
<button class="tab-btn" onclick="showTab('security')">Sécurité</button>
<button class="tab-btn" onclick="showTab('quiz')">Quiz</button>
</nav>
<div class="content">
<!-- ===== VUE D'ENSEMBLE ===== -->
<div id="tab-overview" class="tab-panel active">
<div class="section-title">Architecture GNU/Linux</div>
<div class="card">
<h3>Qu'est-ce que GNU/Linux ?</h3>
<p style="color:var(--muted);font-size:.92rem;margin-bottom:1rem;">
<strong>Linux</strong> est un <em>noyau</em> (kernel) libre créé par Linus Torvalds en 1991. Seul, il ne forme pas un système complet : c'est la combinaison avec les outils <strong>GNU</strong> (shell, compilateurs, bibliothèques…) qui constitue un système d'exploitation utilisable — d'où l'appellation <strong>GNU/Linux</strong>. Les <em>distributions</em> (distros) empaquettent le tout avec un gestionnaire de paquets, un installeur et des applications.
</p>
<div class="grid2">
<div class="info-box blue"><div class="label">Familles de distributions</div>
<table style="width:100%;font-size:.82rem;border-collapse:collapse;">
<tr><th style="text-align:left;padding:.2rem .3rem;color:var(--muted)">Famille</th><th style="padding:.2rem .3rem;color:var(--muted)">Distros</th><th style="padding:.2rem .3rem;color:var(--muted)">Gestionnaire</th></tr>
<tr><td style="padding:.2rem .3rem">Debian</td><td style="padding:.2rem .3rem">Debian, Ubuntu, Mint</td><td style="padding:.2rem .3rem">apt / dpkg</td></tr>
<tr><td style="padding:.2rem .3rem">Red Hat</td><td style="padding:.2rem .3rem">RHEL, Fedora, Rocky</td><td style="padding:.2rem .3rem">dnf / rpm</td></tr>
<tr><td style="padding:.2rem .3rem">Arch</td><td style="padding:.2rem .3rem">Arch, Manjaro, EndeavourOS</td><td style="padding:.2rem .3rem">pacman</td></tr>
<tr><td style="padding:.2rem .3rem">SUSE</td><td style="padding:.2rem .3rem">openSUSE, SLES</td><td style="padding:.2rem .3rem">zypper / rpm</td></tr>
<tr><td style="padding:.2rem .3rem">Android</td><td style="padding:.2rem .3rem">Android (kernel Linux)</td><td style="padding:.2rem .3rem">APK</td></tr>
</table>
</div>
<div>
<div class="info-box teal"><div class="label">Composants d'un système GNU/Linux</div>
<ul style="font-size:.85rem;padding-left:1.1rem;color:var(--muted)">
<li><strong>Bootloader</strong> — GRUB2, systemd-boot (démarre le kernel)</li>
<li><strong>Kernel Linux</strong> — cœur du système (drivers, scheduler, mémoire…)</li>
<li><strong>initramfs</strong> — mini-FS de démarrage en RAM</li>
<li><strong>systemd / init</strong> — premier processus (PID 1), démarre les services</li>
<li><strong>Bibliothèques</strong> — glibc, libssl, libz…</li>
<li><strong>Shell</strong> — bash, zsh, fish (interpréteur de commandes)</li>
<li><strong>Outils GNU</strong> — coreutils, binutils, grep, sed, awk…</li>
<li><strong>Serveur graphique</strong> — Wayland / X11 (optionnel)</li>
<li><strong>Applications</strong> — navigateur, éditeur, IDE…</li>
</ul>
</div>
</div>
</div>
</div>
<div class="card">
<h3>Couches du système — cliquez pour les détails</h3>
<div style="display:flex;flex-direction:column;align-items:center;gap:0;">
<div class="arch-layer"><div class="arch-lbl">Applications</div>
<div class="arch-box" style="background:#dbeafe;color:#1e40af;" onclick="showDetail('ov-app')">Applications utilisateur · Shell · Services</div></div>
<div class="arch-arrow">▼</div>
<div class="arch-layer"><div class="arch-lbl">Bibliothèques</div>
<div class="arch-box" style="background:#ede9fe;color:#5b21b6;" onclick="showDetail('ov-lib')">glibc · libstdc++ · openssl · POSIX API</div></div>
<div class="arch-arrow">▼</div>
<div class="arch-layer"><div class="arch-lbl">Appels système</div>
<div class="arch-box" style="background:#fef3c7;color:#92400e;" onclick="showDetail('ov-syscall')">Interface Kernel ↔ User Space (syscall table)</div></div>
<div class="arch-arrow">▼</div>
<div class="arch-layer"><div class="arch-lbl">Kernel Space</div>
<div class="arch-box" style="background:#d1fae5;color:#065f46;" onclick="showDetail('ov-kernel')">Kernel Linux : scheduler · VFS · TCP/IP · drivers · mémoire</div></div>
<div class="arch-arrow">▼</div>
<div class="arch-layer"><div class="arch-lbl">Matériel</div>
<div class="arch-box" style="background:#fee2e2;color:#991b1b;" onclick="showDetail('ov-hw')">CPU · RAM · Disques · NIC · GPU · Périphériques</div></div>
</div>
<div id="detail-ov-app" class="detail-panel"><strong>User Space</strong> — Tout ce qui tourne avec des privilèges limités. Les processus ne peuvent pas accéder directement au matériel. Ils passent obligatoirement par des <em>appels système</em> (syscalls) pour interagir avec le kernel.</div>
<div id="detail-ov-lib" class="detail-panel"><strong>glibc</strong> (GNU C Library) est la bibliothèque standard C qui enveloppe les syscalls raw en fonctions C portables (<code>open()</code>, <code>read()</code>, <code>malloc()</code>…). Elle implémente aussi la libc POSIX et la résolution DNS.</div>
<div id="detail-ov-syscall" class="detail-panel"><strong>Interface syscall</strong> — Mécanisme de transition sécurisée entre user space et kernel space. Sur x86-64, l'instruction <code>syscall</code> déclenche un changement de privilege (ring 3 → ring 0). La table des syscalls Linux en contient ~350 (<code>read</code>=0, <code>write</code>=1, <code>open</code>=2, <code>fork</code>=57…).</div>
<div id="detail-ov-kernel" class="detail-panel"><strong>Kernel monolithique modulaire</strong> — Le kernel Linux est monolithique (tout tourne dans un seul espace d'adressage ring 0) mais modulaire : les drivers peuvent être chargés/déchargés dynamiquement (<code>modprobe</code>). Il gère : ordonnancement des processus, mémoire virtuelle, VFS, pile réseau, IPC, sécurité.</div>
<div id="detail-ov-hw" class="detail-panel"><strong>Matériel</strong> — Le kernel communique avec le matériel via des <strong>drivers</strong> (modules kernel). L'ACPI gère l'alimentation, le DMA les transferts mémoire sans CPU. Les interruptions (IRQ) notifient le kernel des événements matériels.</div>
</div>
<div class="card">
<h3>GNU/Linux en chiffres</h3>
<div class="grid4">
<div class="info-box blue"><div class="label">Noyau</div><div style="font-size:1.3rem;font-weight:800;color:var(--blue600);">~35M</div><div style="font-size:.8rem;color:var(--muted)">lignes de code (kernel 6.x)</div></div>
<div class="info-box teal"><div class="label">Serveurs web</div><div style="font-size:1.3rem;font-weight:800;color:#0d9488;">96%</div><div style="font-size:.8rem;color:var(--muted)">des serveurs web mondiaux</div></div>
<div class="info-box amber"><div class="label">Superordinateurs</div><div style="font-size:1.3rem;font-weight:800;color:var(--acc);">100%</div><div style="font-size:.8rem;color:var(--muted)">du Top500 tourne sous Linux</div></div>
<div class="info-box purple"><div class="label">Cloud</div><div style="font-size:1.3rem;font-weight:800;color:var(--purple);">~90%</div><div style="font-size:.8rem;color:var(--muted)">des VM cloud sont Linux</div></div>
</div>
</div>
</div>
<!-- ===== KERNEL ===== -->
<div id="tab-kernel" class="tab-panel">
<div class="section-title">Le Kernel Linux</div>
<div class="card">
<h3>Sous-systèmes du kernel — cliquez pour les détails</h3>
<div class="kernel-grid" id="ks-grid">
<div class="ks-box" style="background:#dbeafe;" onclick="selectKs('sched')"><div class="ks-icon">⚙️</div><div class="ks-name">Scheduler</div><div class="ks-sub">CFS · RT · Deadline</div></div>
<div class="ks-box" style="background:#d1fae5;" onclick="selectKs('mm')"><div class="ks-icon">🧠</div><div class="ks-name">Gestion mémoire</div><div class="ks-sub">VMM · Paging · Slab</div></div>
<div class="ks-box" style="background:#ede9fe;" onclick="selectKs('vfs')"><div class="ks-icon">📁</div><div class="ks-name">VFS</div><div class="ks-sub">ext4 · xfs · btrfs · tmpfs</div></div>
<div class="ks-box" style="background:#fef3c7;" onclick="selectKs('net')"><div class="ks-icon">🌐</div><div class="ks-name">Réseau</div><div class="ks-sub">TCP/IP · Netfilter · eBPF</div></div>
<div class="ks-box" style="background:#fee2e2;" onclick="selectKs('drv')"><div class="ks-icon">🔌</div><div class="ks-name">Drivers</div><div class="ks-sub">Block · Char · Network</div></div>
<div class="ks-box" style="background:#f0fdfa;" onclick="selectKs('ipc')"><div class="ks-icon">🔗</div><div class="ks-name">IPC</div><div class="ks-sub">Pipes · SHM · Sockets</div></div>
<div class="ks-box" style="background:#fff7ed;" onclick="selectKs('sec')"><div class="ks-icon">🔒</div><div class="ks-name">Sécurité (LSM)</div><div class="ks-sub">SELinux · AppArmor</div></div>
<div class="ks-box" style="background:#f5f3ff;" onclick="selectKs('irq')"><div class="ks-icon">⚡</div><div class="ks-name">Interruptions</div><div class="ks-sub">IRQ · SoftIRQ · Tasklets</div></div>
</div>
<div id="ks-detail" class="detail-panel"></div>
</div>
<div class="card">
<h3>Appels système (syscalls)</h3>
<div class="syscall-flow">
<div class="sf-box" style="background:#dbeafe;">Programme<br><small style="color:var(--muted)">user space</small></div>
<div class="sf-arrow">→</div>
<div class="sf-box">printf("hello")<br><small style="color:var(--muted)">appel glibc</small></div>
<div class="sf-arrow">→</div>
<div class="sf-box" style="background:#fef3c7;">write(1, buf, n)<br><small style="color:var(--muted)">syscall wrapping</small></div>
<div class="sf-arrow">→</div>
<div class="sf-box" style="background:#fee2e2;"><code>syscall</code> x86-64<br><small style="color:var(--muted)">ring 3 → ring 0</small></div>
<div class="sf-arrow">→</div>
<div class="sf-box" style="background:#d1fae5;">sys_write()<br><small style="color:var(--muted)">kernel handler</small></div>
</div>
<div class="grid2" style="margin-top:1rem;">
<div>
<div class="info-box blue"><div class="label">Syscalls courants</div>
<table style="width:100%;font-size:.8rem;border-collapse:collapse;">
<tr><th style="padding:.2rem .3rem;text-align:left;color:var(--muted)">N°</th><th style="padding:.2rem .3rem;text-align:left;color:var(--muted)">Nom</th><th style="padding:.2rem .3rem;text-align:left;color:var(--muted)">Rôle</th></tr>
<tr><td style="padding:.2rem .3rem;font-family:monospace">0</td><td style="padding:.2rem .3rem;font-family:monospace">read</td><td style="padding:.2rem .3rem">Lire depuis un fd</td></tr>
<tr><td style="padding:.2rem .3rem;font-family:monospace">1</td><td style="padding:.2rem .3rem;font-family:monospace">write</td><td style="padding:.2rem .3rem">Écrire dans un fd</td></tr>
<tr><td style="padding:.2rem .3rem;font-family:monospace">2</td><td style="padding:.2rem .3rem;font-family:monospace">open</td><td style="padding:.2rem .3rem">Ouvrir un fichier</td></tr>
<tr><td style="padding:.2rem .3rem;font-family:monospace">3</td><td style="padding:.2rem .3rem;font-family:monospace">close</td><td style="padding:.2rem .3rem">Fermer un fd</td></tr>
<tr><td style="padding:.2rem .3rem;font-family:monospace">57</td><td style="padding:.2rem .3rem;font-family:monospace">fork</td><td style="padding:.2rem .3rem">Dupliquer processus</td></tr>
<tr><td style="padding:.2rem .3rem;font-family:monospace">59</td><td style="padding:.2rem .3rem;font-family:monospace">execve</td><td style="padding:.2rem .3rem">Charger un programme</td></tr>
<tr><td style="padding:.2rem .3rem;font-family:monospace">60</td><td style="padding:.2rem .3rem;font-family:monospace">exit</td><td style="padding:.2rem .3rem">Terminer processus</td></tr>
<tr><td style="padding:.2rem .3rem;font-family:monospace">9</td><td style="padding:.2rem .3rem;font-family:monospace">mmap</td><td style="padding:.2rem .3rem">Mapper mémoire/fichier</td></tr>
<tr><td style="padding:.2rem .3rem;font-family:monospace">41</td><td style="padding:.2rem .3rem;font-family:monospace">socket</td><td style="padding:.2rem .3rem">Créer une socket</td></tr>
<tr><td style="padding:.2rem .3rem;font-family:monospace">42</td><td style="padding:.2rem .3rem;font-family:monospace">connect</td><td style="padding:.2rem .3rem">Connexion TCP</td></tr>
</table>
</div>
</div>
<div>
<div class="info-box teal"><div class="label">Modes CPU (x86)</div>
<ul style="font-size:.85rem;padding-left:1.1rem;color:var(--muted)">
<li><strong>Ring 0 (kernel mode)</strong> — accès total au matériel, instructions privilégiées</li>
<li><strong>Ring 3 (user mode)</strong> — accès restreint, pas d'accès I/O direct</li>
<li>Transition ring 3 → ring 0 via <code>syscall</code> / <code>int 0x80</code></li>
<li>Retour ring 0 → ring 3 via <code>sysret</code> / <code>iret</code></li>
</ul>
</div>
<div class="info-box amber" style="margin-top:.7rem;"><div class="label">Modules kernel</div>
<div class="codeblk" style="font-size:.78rem;padding:.6rem;">
<span class="c-comment"># Lister les modules chargés</span>
<span class="c-kw">lsmod</span>
<span class="c-comment"># Charger un module</span>
<span class="c-kw">modprobe</span> <span class="c-val">nvidia</span>
<span class="c-comment"># Infos sur un module</span>
<span class="c-kw">modinfo</span> <span class="c-val">ext4</span>
<span class="c-comment"># Décharger</span>
<span class="c-kw">rmmod</span> <span class="c-val">nvidia</span>
</div>
</div>
</div>
</div>
</div>
<div class="card">
<h3>Le scheduler — CFS (Completely Fair Scheduler)</h3>
<div class="grid2">
<div>
<div class="info-box purple"><div class="label">Principe CFS</div>
<p style="font-size:.85rem;color:var(--muted);">CFS (kernel 2.6.23+) maintient un <strong>arbre rouge-noir</strong> trié par <em>vruntime</em> (temps CPU virtuel cumulé). À chaque tick, le processus avec le plus petit vruntime est sélectionné. Chaque processus avance son vruntime proportionnellement au temps CPU réel × poids (nice).</p>
</div>
<div class="info-box green" style="margin-top:.7rem;"><div class="label">Classes d'ordonnancement</div>
<table style="width:100%;font-size:.82rem;border-collapse:collapse;">
<tr><td style="padding:.2rem .3rem"><strong>SCHED_OTHER</strong></td><td style="padding:.2rem .3rem;color:var(--muted)">Tâches normales (CFS)</td></tr>
<tr><td style="padding:.2rem .3rem"><strong>SCHED_BATCH</strong></td><td style="padding:.2rem .3rem;color:var(--muted)">Traitements batch (faible réactivité)</td></tr>
<tr><td style="padding:.2rem .3rem"><strong>SCHED_IDLE</strong></td><td style="padding:.2rem .3rem;color:var(--muted)">Priorité très basse (fond)</td></tr>
<tr><td style="padding:.2rem .3rem"><strong>SCHED_FIFO</strong></td><td style="padding:.2rem .3rem;color:var(--muted)">Temps réel FIFO (RT)</td></tr>
<tr><td style="padding:.2rem .3rem"><strong>SCHED_RR</strong></td><td style="padding:.2rem .3rem;color:var(--muted)">Temps réel Round-Robin (RT)</td></tr>
<tr><td style="padding:.2rem .3rem"><strong>SCHED_DEADLINE</strong></td><td style="padding:.2rem .3rem;color:var(--muted)">Échéance (EDF)</td></tr>
</table>
</div>
</div>
<div>
<div class="codeblk" style="font-size:.8rem;">
<span class="c-comment"># Voir la priorité d'un processus</span>
<span class="c-kw">ps</span> -eo pid,ni,pri,comm
<span class="c-comment"># nice : -20 (priorité max) à +19 (min)</span>
<span class="c-kw">nice</span> -n 10 <span class="c-val">./monscript.sh</span>
<span class="c-kw">renice</span> -n -5 -p <span class="c-val">1234</span>
<span class="c-comment"># Processus temps réel (SCHED_FIFO, prio 99)</span>
<span class="c-kw">chrt</span> -f 99 <span class="c-val">./programme-rt</span>
<span class="c-comment"># Affinité CPU (NUMA, isolation)</span>
<span class="c-kw">taskset</span> -c 0,1 <span class="c-val">./prog</span>
<span class="c-comment"># cgroups v2 : limiter CPU d'un groupe</span>
<span class="c-kw">echo</span> <span class="c-str">"50000 100000"</span> > <span class="c-val">/sys/fs/cgroup/mygroup/cpu.max</span>
<span class="c-comment"># → 50% de CPU max</span>
</div>
<div class="info-box cyan" style="margin-top:.7rem;"><div class="label">eBPF — Extension révolutionnaire</div>
<p style="font-size:.83rem;color:var(--muted);">eBPF permet d'exécuter des programmes sandbox dans le kernel <strong>sans module</strong>. Utilisé pour l'observabilité (perf, tracing), la sécurité (seccomp, Falco) et le réseau (XDP, Cilium). Vérificateur statique garantit la sûreté.</p>
</div>
</div>
</div>
</div>
</div>
<!-- ===== DÉMARRAGE ===== -->
<div id="tab-boot" class="tab-panel">
<div class="section-title">Séquence de démarrage</div>
<div class="card">
<h3>Vue d'ensemble — de l'alimentation à la session</h3>
<div class="grid2">
<div class="boot-steps">
<div class="boot-step">
<div class="boot-num" style="background:#6366f1;">1</div>
<div class="boot-body">
<div class="boot-title">Mise sous tension — POST</div>
<div class="boot-desc">Le BIOS/UEFI s'initialise, exécute le POST (Power-On Self Test) : vérifie CPU, RAM, stockage.</div>
<div class="boot-detail">BIOS → MBR (secteur 0) / UEFI → GPT → EFI partition</div>
</div>
</div>
<div class="boot-step">
<div class="boot-num" style="background:#8b5cf6;">2</div>
<div class="boot-body">
<div class="boot-title">BIOS / UEFI</div>
<div class="boot-desc">Firmware intégré à la carte mère. UEFI est le successeur du BIOS : interface graphique, Secure Boot, support disques >2 To (GPT), démarrage réseau (PXE).</div>
<div class="boot-detail">BIOS: 16-bit, MBR 512B | UEFI: 64-bit, GPT, EFI System Partition</div>
</div>
</div>
<div class="boot-step">
<div class="boot-num" style="background:#ec4899;">3</div>
<div class="boot-body">
<div class="boot-title">Bootloader — GRUB2</div>
<div class="boot-desc">GNU GRand Unified Bootloader v2. Lit sa configuration (<code>/boot/grub/grub.cfg</code>), affiche le menu de démarrage, charge le kernel (<code>vmlinuz</code>) et l'initramfs en RAM.</div>
<div class="boot-detail">Stage 1 (MBR 446B) → Stage 1.5 → Stage 2 (/boot)</div>
</div>
</div>
<div class="boot-step">
<div class="boot-num" style="background:#f97316;">4</div>
<div class="boot-body">
<div class="boot-title">Kernel Linux — initramfs</div>
<div class="boot-desc">Le kernel se décompresse en RAM, initialise les sous-systèmes (mémoire, scheduler, réseau…), monte l'<strong>initramfs</strong> (image cpio+gzip) comme FS temporaire pour charger les modules nécessaires au montage du vrai FS.</div>
<div class="boot-detail">vmlinuz-6.x → decompress → init_task → initramfs → /init</div>
</div>
</div>
<div class="boot-step">
<div class="boot-num" style="background:#16a34a;">5</div>
<div class="boot-body">
<div class="boot-title">systemd (PID 1)</div>
<div class="boot-desc">Après montage du FS racine, le kernel exécute <code>/sbin/init</code> → systemd. Il démarre les services en parallèle selon les dépendances (<em>units</em> : service, target, socket, timer…).</div>
<div class="boot-detail">default.target → multi-user.target / graphical.target</div>
</div>
</div>
<div class="boot-step">
<div class="boot-num" style="background:#0891b2;">6</div>
<div class="boot-body">
<div class="boot-title">Targets systemd</div>
<div class="boot-desc">Les targets remplacent les runlevels SysV. <code>graphical.target</code> démarre le serveur d'affichage, le gestionnaire de connexion (GDM, SDDM…) puis la session utilisateur.</div>
<div class="boot-detail">sysinit → basic → network → multi-user → graphical</div>
</div>
</div>
</div>
<div>
<div class="info-box blue"><div class="label">BIOS vs UEFI</div>
<table style="width:100%;font-size:.82rem;border-collapse:collapse;">
<tr><th style="text-align:left;padding:.2rem;color:var(--muted)">Critère</th><th style="padding:.2rem;color:var(--muted)">BIOS</th><th style="padding:.2rem;color:var(--muted)">UEFI</th></tr>
<tr><td style="padding:.2rem">Table de partition</td><td style="padding:.2rem">MBR</td><td style="padding:.2rem">GPT</td></tr>
<tr><td style="padding:.2rem">Taille disque max</td><td style="padding:.2rem">2 To</td><td style="padding:.2rem">9,4 Zo</td></tr>
<tr><td style="padding:.2rem">Mode CPU au boot</td><td style="padding:.2rem">16-bit réel</td><td style="padding:.2rem">64-bit protégé</td></tr>
<tr><td style="padding:.2rem">Secure Boot</td><td style="padding:.2rem">Non</td><td style="padding:.2rem">Oui</td></tr>
<tr><td style="padding:.2rem">Interface</td><td style="padding:.2rem">Texte</td><td style="padding:.2rem">GUI + souris</td></tr>
<tr><td style="padding:.2rem">Démarrage réseau</td><td style="padding:.2rem">Limité</td><td style="padding:.2rem">PXE, HTTP</td></tr>
</table>
</div>
<div class="info-box teal" style="margin-top:.7rem;"><div class="label">Commandes systemd</div>
<div class="codeblk" style="font-size:.78rem;padding:.6rem;">
<span class="c-comment"># Voir le temps de démarrage</span>
<span class="c-kw">systemd-analyze</span>
<span class="c-kw">systemd-analyze</span> blame
<span class="c-comment"># Gérer les services</span>
<span class="c-kw">systemctl</span> status nginx
<span class="c-kw">systemctl</span> start|stop|restart nginx
<span class="c-kw">systemctl</span> enable|disable nginx
<span class="c-kw">systemctl</span> list-units --type=service
<span class="c-comment"># Changer de target (runlevel)</span>
<span class="c-kw">systemctl</span> isolate multi-user.target
<span class="c-kw">systemctl</span> set-default graphical.target
<span class="c-comment"># Voir les logs de démarrage</span>
<span class="c-kw">journalctl</span> -b <span class="c-comment"># boot actuel</span>
<span class="c-kw">journalctl</span> -b -1 <span class="c-comment"># boot précédent</span>
</div>
</div>
<div class="info-box amber" style="margin-top:.7rem;"><div class="label">Secure Boot</div>
<p style="font-size:.83rem;color:var(--muted);">UEFI Secure Boot vérifie la <strong>signature cryptographique</strong> du bootloader et du kernel avant de les exécuter. Empêche les rootkits au niveau du bootloader. Linux utilise <em>shim</em> (signé par Microsoft) pour amorcer GRUB.</p>
</div>
</div>
</div>
</div>
<div class="card">
<h3>initramfs — le FS de démarrage</h3>
<div class="grid2">
<div class="info-box purple"><div class="label">Rôle de l'initramfs</div>
<ul style="font-size:.85rem;padding-left:1.1rem;color:var(--muted)">
<li>FS temporaire en RAM (cpio + gzip/lz4/zstd)</li>
<li>Contient les modules kernel nécessaires au démarrage</li>
<li>Monte le vrai FS racine (LUKS, LVM, RAID, NFS…)</li>
<li>Charge les firmwares des périphériques critiques</li>
<li>Passe la main à <code>/sbin/init</code> via <code>switch_root</code></li>
</ul>
</div>
<div class="codeblk" style="font-size:.8rem;">
<span class="c-comment"># Voir le contenu de l'initramfs</span>
<span class="c-kw">lsinitramfs</span> /boot/initrd.img-6.8.0
<span class="c-comment"># Reconstruire l'initramfs</span>
<span class="c-kw">update-initramfs</span> -u <span class="c-comment"># Debian/Ubuntu</span>
<span class="c-kw">dracut</span> --force <span class="c-comment"># RHEL/Fedora</span>
<span class="c-kw">mkinitcpio</span> -P <span class="c-comment"># Arch Linux</span>
<span class="c-comment"># Paramètres kernel (cmdline)</span>
<span class="c-kw">cat</span> /proc/cmdline
<span class="c-comment"># → root=/dev/sda2 ro quiet splash</span>
<span class="c-comment"># Kernel panic → boot de secours</span>
<span class="c-comment"># Dans GRUB : ajouter "init=/bin/bash"</span>
</div>
</div>
</div>
</div>
<!-- ===== SYSTÈME DE FICHIERS ===== -->
<div id="tab-fs" class="tab-panel">
<div class="section-title">Système de fichiers</div>
<div class="card">
<h3>FHS — Filesystem Hierarchy Standard</h3>
<p style="color:var(--muted);font-size:.88rem;margin-bottom:1rem;">Cliquez sur un répertoire pour en savoir plus.</p>
<div class="grid2">
<div class="fs-tree">
<span class="fs-dir" onclick="showFsDetail('root')">/</span> <span class="fs-desc">Racine de tout le système</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('bin')">bin</span> <span class="fs-desc">Binaires essentiels (ls, cp, bash)</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('boot')">boot</span> <span class="fs-desc">Kernel, initramfs, GRUB</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('dev')">dev</span> <span class="fs-desc">Fichiers de périphériques</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('etc')">etc</span> <span class="fs-desc">Configuration système</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('home')">home</span> <span class="fs-desc">Répertoires personnels</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('lib')">lib / lib64</span> <span class="fs-desc">Bibliothèques partagées</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('media')">media / mnt</span> <span class="fs-desc">Points de montage</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('opt')">opt</span> <span class="fs-desc">Logiciels optionnels</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('proc')">proc</span> <span class="fs-desc">FS virtuel — infos kernel/processus</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('root2')">root</span> <span class="fs-desc">Home de root</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('run')">run</span> <span class="fs-desc">Données runtime (PIDs, sockets)</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('sbin')">sbin</span> <span class="fs-desc">Binaires d'administration</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('srv')">srv</span> <span class="fs-desc">Données des services</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('sys')">sys</span> <span class="fs-desc">FS virtuel — bus, drivers, périph.</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('tmp')">tmp</span> <span class="fs-desc">Fichiers temporaires (effacés au reboot)</span><br>
├─ <span class="fs-dir" onclick="showFsDetail('usr')">usr</span> <span class="fs-desc">Programmes et données utilisateur</span><br>
└─ <span class="fs-dir" onclick="showFsDetail('var')">var</span> <span class="fs-desc">Données variables (logs, spool, DB)</span>
</div>
<div id="fs-detail-box" class="info-box blue">
<div class="label">Cliquez sur un répertoire</div>
<p style="font-size:.85rem;color:var(--muted);">Chaque répertoire a un rôle précis défini par le standard FHS (Filesystem Hierarchy Standard). Tout dans Linux est un fichier — y compris les périphériques, sockets et processus.</p>
</div>
</div>
</div>
<div class="card">
<h3>Inodes et structure d'un fichier</h3>
<div class="grid2">
<div>
<div class="info-box teal"><div class="label">Inode</div>
<p style="font-size:.85rem;color:var(--muted);margin-bottom:.5rem;">Un <strong>inode</strong> est la structure de métadonnées d'un fichier sur disque. Il contient tout sauf le nom du fichier.</p>
<table style="width:100%;font-size:.8rem;border-collapse:collapse;">
<tr><td style="padding:.2rem">UID / GID</td><td style="padding:.2rem;color:var(--muted)">Propriétaire</td></tr>
<tr><td style="padding:.2rem">Mode (permissions)</td><td style="padding:.2rem;color:var(--muted)">rwxrwxrwx + type</td></tr>
<tr><td style="padding:.2rem">Timestamps</td><td style="padding:.2rem;color:var(--muted)">atime, mtime, ctime</td></tr>
<tr><td style="padding:.2rem">Taille</td><td style="padding:.2rem;color:var(--muted)">en octets</td></tr>
<tr><td style="padding:.2rem">Nlink</td><td style="padding:.2rem;color:var(--muted)">Nombre de liens durs</td></tr>
<tr><td style="padding:.2rem">Blocs de données</td><td style="padding:.2rem;color:var(--muted)">Pointeurs vers les données</td></tr>
</table>
</div>
<div class="info-box purple" style="margin-top:.7rem;"><div class="label">Lien symbolique vs lien dur</div>
<ul style="font-size:.83rem;padding-left:1.1rem;color:var(--muted)">
<li><strong>Lien dur</strong> — même inode, même partition, supprimé quand nlink=0</li>
<li><strong>Lien symbolique</strong> — inode distinct qui pointe vers un chemin, peut traverser les partitions</li>
</ul>
<div class="codeblk" style="font-size:.78rem;padding:.5rem;margin-top:.5rem;">
<span class="c-kw">ln</span> <span class="c-val">fichier.txt</span> lien_dur
<span class="c-kw">ln</span> -s <span class="c-val">fichier.txt</span> lien_symbolique
<span class="c-kw">stat</span> fichier.txt <span class="c-comment"># affiche l'inode</span>
</div>
</div>
</div>
<div>
<div class="info-box amber"><div class="label">Types de systèmes de fichiers</div>
<table style="width:100%;font-size:.82rem;border-collapse:collapse;">
<tr><th style="text-align:left;padding:.2rem;color:var(--muted)">FS</th><th style="padding:.2rem;color:var(--muted)">Usage</th><th style="padding:.2rem;color:var(--muted)">Caractéristiques</th></tr>
<tr><td style="padding:.2rem"><strong>ext4</strong></td><td style="padding:.2rem">Général Linux</td><td style="padding:.2rem;color:var(--muted)">Journalisé, stable, jusqu'à 1 Eio</td></tr>
<tr><td style="padding:.2rem"><strong>xfs</strong></td><td style="padding:.2rem">Hautes perfs</td><td style="padding:.2rem;color:var(--muted)">Journalisé, B-tree, grands fichiers</td></tr>
<tr><td style="padding:.2rem"><strong>btrfs</strong></td><td style="padding:.2rem">Moderne</td><td style="padding:.2rem;color:var(--muted)">COW, snapshots, RAID intégré</td></tr>
<tr><td style="padding:.2rem"><strong>zfs</strong></td><td style="padding:.2rem">Entreprise</td><td style="padding:.2rem;color:var(--muted)">Checksums, dédup, compression</td></tr>
<tr><td style="padding:.2rem"><strong>tmpfs</strong></td><td style="padding:.2rem">RAM</td><td style="padding:.2rem;color:var(--muted)">Volatile, très rapide</td></tr>
<tr><td style="padding:.2rem"><strong>procfs</strong></td><td style="padding:.2rem">/proc</td><td style="padding:.2rem;color:var(--muted)">Virtuel, infos kernel</td></tr>
<tr><td style="padding:.2rem"><strong>sysfs</strong></td><td style="padding:.2rem">/sys</td><td style="padding:.2rem;color:var(--muted)">Virtuel, arbre de périphériques</td></tr>
<tr><td style="padding:.2rem"><strong>vfat</strong></td><td style="padding:.2rem">ESP / USB</td><td style="padding:.2rem;color:var(--muted)">Compatible Windows/UEFI</td></tr>
</table>
</div>
</div>
</div>
</div>
<div class="card">
<h3>VFS — Virtual Filesystem Switch</h3>
<p style="color:var(--muted);font-size:.88rem;margin-bottom:.8rem;">Le VFS est une couche d'abstraction du kernel qui présente une interface unifiée (<code>open</code>, <code>read</code>, <code>write</code>…) quel que soit le FS sous-jacent.</p>
<div class="grid2">
<div class="info-box green"><div class="label">Objets VFS</div>
<ul style="font-size:.85rem;padding-left:1.1rem;color:var(--muted)">
<li><strong>superblock</strong> — métadonnées du FS monté</li>
<li><strong>inode</strong> — représentation en mémoire d'un fichier</li>
<li><strong>dentry</strong> — entrée de répertoire (cache de chemin)</li>
<li><strong>file</strong> — instance ouverte d'un fichier (descripteur)</li>
</ul>
</div>
<div class="info-box cyan"><div class="label">Commandes FS</div>
<div class="codeblk" style="font-size:.78rem;padding:.6rem;">
<span class="c-kw">df</span> -h <span class="c-comment"># espace disque</span>
<span class="c-kw">du</span> -sh /var/log <span class="c-comment"># taille répertoire</span>
<span class="c-kw">mount</span> | <span class="c-kw">findmnt</span> <span class="c-comment"># points de montage</span>
<span class="c-kw">lsblk</span> -f <span class="c-comment"># blocs + FS</span>
<span class="c-kw">blkid</span> <span class="c-comment"># UUID des partitions</span>
<span class="c-kw">tune2fs</span> -l /dev/sda2 <span class="c-comment"># infos ext4</span>
<span class="c-kw">fsck</span> /dev/sdb1 <span class="c-comment"># vérifier/réparer</span>
</div>
</div>
</div>
</div>
</div>
<!-- ===== PROCESSUS ===== -->
<div id="tab-process" class="tab-panel">
<div class="section-title">Processus et signaux</div>
<div class="card">
<h3>fork() · exec() · wait() — cycle de vie</h3>
<div class="grid2">
<div>
<div style="text-align:center;margin-bottom:1rem;">
<div class="proc-box highlight">systemd (PID 1)</div>
<div class="proc-arrow">│ fork()</div>
<div class="proc-box">bash (PID 1234)</div>
<div class="proc-arrow">│ fork()</div>
<div class="proc-box">bash (PID 5678) — copie</div>
<div class="proc-arrow">│ execve("ls")</div>
<div class="proc-box highlight">ls (PID 5678)</div>
<div class="proc-arrow">│ exit(0)</div>
<div class="proc-arrow">bash reçoit SIGCHLD, wait()</div>
</div>
</div>
<div>
<div class="info-box blue"><div class="label">fork() — Copy-on-Write</div>
<p style="font-size:.85rem;color:var(--muted);">Après <code>fork()</code>, parent et enfant partagent les mêmes pages mémoire physiques en lecture. Une copie n'est créée que lors d'une première écriture (<strong>CoW</strong>). Évite une copie complète coûteuse.</p>
</div>
<div class="info-box teal" style="margin-top:.7rem;"><div class="label">États d'un processus</div>
<table style="width:100%;font-size:.82rem;border-collapse:collapse;">
<tr><td style="padding:.2rem"><strong>R</strong> Running</td><td style="padding:.2rem;color:var(--muted)">S'exécute ou prêt à s'exécuter</td></tr>
<tr><td style="padding:.2rem"><strong>S</strong> Sleeping</td><td style="padding:.2rem;color:var(--muted)">Interruptible (attend I/O, signal)</td></tr>
<tr><td style="padding:.2rem"><strong>D</strong> Disk wait</td><td style="padding:.2rem;color:var(--muted)">Ininterruptible (I/O bloquant)</td></tr>
<tr><td style="padding:.2rem"><strong>T</strong> Stopped</td><td style="padding:.2rem;color:var(--muted)">Stoppé (SIGSTOP/SIGTSTP)</td></tr>
<tr><td style="padding:.2rem"><strong>Z</strong> Zombie</td><td style="padding:.2rem;color:var(--muted)">Terminé mais non collecté</td></tr>
<tr><td style="padding:.2rem"><strong>I</strong> Idle</td><td style="padding:.2rem;color:var(--muted)">Thread kernel inactif</td></tr>
</table>
</div>
</div>
</div>
</div>
<div class="card">
<h3>Signaux</h3>
<div class="sig-grid">
<div class="sig-item"><div class="sig-name">SIGTERM <span class="sig-num">(15)</span></div><div class="sig-desc">Demande de terminaison propre. Peut être ignoré/intercepté.</div></div>
<div class="sig-item"><div class="sig-name">SIGKILL <span class="sig-num">(9)</span></div><div class="sig-desc">Terminaison forcée. Impossible à ignorer ni capturer.</div></div>
<div class="sig-item"><div class="sig-name">SIGINT <span class="sig-num">(2)</span></div><div class="sig-desc">Interruption clavier (Ctrl+C).</div></div>
<div class="sig-item"><div class="sig-name">SIGQUIT <span class="sig-num">(3)</span></div><div class="sig-desc">Quitter + core dump (Ctrl+\).</div></div>
<div class="sig-item"><div class="sig-name">SIGHUP <span class="sig-num">(1)</span></div><div class="sig-desc">Déconnexion terminal / rechargement de config.</div></div>
<div class="sig-item"><div class="sig-name">SIGSTOP <span class="sig-num">(19)</span></div><div class="sig-desc">Pause forcée. Non capturable.</div></div>
<div class="sig-item"><div class="sig-name">SIGCONT <span class="sig-num">(18)</span></div><div class="sig-desc">Reprendre un processus stoppé.</div></div>
<div class="sig-item"><div class="sig-name">SIGSEGV <span class="sig-num">(11)</span></div><div class="sig-desc">Accès mémoire invalide (segfault).</div></div>
<div class="sig-item"><div class="sig-name">SIGCHLD <span class="sig-num">(17)</span></div><div class="sig-desc">Enfant terminé ou stoppé.</div></div>
<div class="sig-item"><div class="sig-name">SIGUSR1/2 <span class="sig-num">(10/12)</span></div><div class="sig-desc">Signaux libres définis par l'application.</div></div>
<div class="sig-item"><div class="sig-name">SIGALRM <span class="sig-num">(14)</span></div><div class="sig-desc">Alarme timer (alarm()).</div></div>
<div class="sig-item"><div class="sig-name">SIGPIPE <span class="sig-num">(13)</span></div><div class="sig-desc">Écriture sur pipe sans lecteur.</div></div>
</div>
<div class="codeblk" style="font-size:.82rem;margin-top:1rem;">
<span class="c-comment"># Envoyer un signal</span>
<span class="c-kw">kill</span> -15 1234 <span class="c-comment"># SIGTERM au PID 1234</span>
<span class="c-kw">kill</span> -9 1234 <span class="c-comment"># SIGKILL</span>
<span class="c-kw">killall</span> nginx <span class="c-comment"># par nom</span>
<span class="c-kw">pkill</span> -HUP nginx <span class="c-comment"># rechargement config nginx</span>
<span class="c-comment"># Voir les processus</span>
<span class="c-kw">ps</span> aux <span class="c-comment"># tous les processus</span>
<span class="c-kw">pstree</span> -p <span class="c-comment"># arbre avec PIDs</span>
<span class="c-kw">top</span> / <span class="c-kw">htop</span> <span class="c-comment"># temps réel</span>
<span class="c-kw">pidof</span> nginx <span class="c-comment"># PID d'un programme</span>
<span class="c-kw">lsof</span> -p 1234 <span class="c-comment"># fichiers ouverts par PID</span>
</div>
</div>
<div class="card">
<h3>IPC — Communication inter-processus</h3>
<div class="grid3">
<div class="info-box blue"><div class="label">Pipes</div><p style="font-size:.83rem;color:var(--muted);">Pipe anonyme : <code>cmd1 | cmd2</code>. Unidirectionnel, buffer kernel. Named pipe (FIFO) : fichier spécial persistant.</p></div>
<div class="info-box teal"><div class="label">Sockets Unix</div><p style="font-size:.83rem;color:var(--muted);">Communication bidirectionnelle locale via un fichier socket (<code>/var/run/docker.sock</code>). Plus rapide que TCP loopback.</p></div>
<div class="info-box purple"><div class="label">Mémoire partagée</div><p style="font-size:.83rem;color:var(--muted);">POSIX shm (<code>shm_open</code>) ou SysV (<code>shmget</code>). Segment partagé entre processus. Synchronisation par sémaphores.</p></div>
<div class="info-box amber"><div class="label">Sémaphores</div><p style="font-size:.83rem;color:var(--muted);">Compteur d'accès concurrents. POSIX (<code>sem_open</code>) ou SysV. Utilisés pour protéger des sections critiques.</p></div>
<div class="info-box coral"><div class="label">Files de messages</div><p style="font-size:.83rem;color:var(--muted);">POSIX mq (<code>mq_open</code>). Messages typés avec priorités. Asynchrone.</p></div>
<div class="info-box green"><div class="label">D-Bus</div><p style="font-size:.83rem;color:var(--muted);">Bus de messages haut niveau pour le desktop Linux. systemd l'utilise largement (<code>dbus-daemon</code>).</p></div>
</div>
</div>
</div>
<!-- ===== MÉMOIRE ===== -->
<div id="tab-memory" class="tab-panel">
<div class="section-title">Gestion de la mémoire</div>
<div class="card">
<h3>Espace d'adressage d'un processus (x86-64)</h3>
<div class="grid2">
<div>
<div class="mem-seg"><div class="mem-addr">0xFFFF…</div><div class="mem-bar" style="background:#6366f1;">Kernel space (non accessible en user mode)</div></div>
<div class="mem-seg"><div class="mem-addr"></div><div class="mem-bar" style="background:#8b5cf6;opacity:.8;">argv / env / vDSO / vsyscall</div></div>
<div class="mem-seg"><div class="mem-addr">↑ croît</div><div class="mem-bar" style="background:#ec4899;">Stack (variables locales, retours)</div></div>
<div class="mem-seg"><div class="mem-addr"></div><div class="mem-bar" style="background:#475569;font-size:.75rem;">… espace libre …</div></div>
<div class="mem-seg"><div class="mem-addr">↓ croît</div><div class="mem-bar" style="background:#f97316;">Heap (malloc / new)</div></div>
<div class="mem-seg"><div class="mem-addr"></div><div class="mem-bar" style="background:#16a34a;">BSS (données non initialisées)</div></div>
<div class="mem-seg"><div class="mem-addr"></div><div class="mem-bar" style="background:#0891b2;">Data (variables globales initialisées)</div></div>
<div class="mem-seg"><div class="mem-addr">0x400000</div><div class="mem-bar" style="background:#2563eb;">Text (code exécutable — read only)</div></div>
<div style="font-size:.75rem;color:var(--muted);margin-top:.4rem;text-align:center;">ASLR : layout aléatoire à chaque exécution (sécurité)</div>
</div>
<div>
<div class="info-box blue"><div class="label">Mémoire virtuelle</div>
<ul style="font-size:.85rem;padding-left:1.1rem;color:var(--muted)">
<li>Chaque processus voit un espace d'adressage <strong>privé de 128 To</strong> (x86-64)</li>
<li>La <strong>MMU</strong> traduit adresses virtuelles → physiques via les <em>page tables</em></li>
<li>Pages de 4 Ko (hugepages : 2 Mo / 1 Go)</li>
<li><strong>TLB</strong> (Translation Lookaside Buffer) cache les traductions récentes</li>
<li><strong>ASLR</strong> randomise l'adresse du stack, heap, libs → anti-exploitation</li>
</ul>
</div>
<div class="info-box amber" style="margin-top:.7rem;"><div class="label">Swap</div>
<p style="font-size:.85rem;color:var(--muted);">Quand la RAM est pleine, le kernel <em>swaps</em> des pages froides vers le disque (partition swap ou swapfile). Le <strong>swappiness</strong> (0–100) règle l'agressivité. L'<strong>OOM killer</strong> tue un processus en dernier recours.</p>
<div class="codeblk" style="font-size:.78rem;padding:.5rem;margin-top:.4rem;">
<span class="c-kw">free</span> -h <span class="c-comment"># RAM + swap</span>
<span class="c-kw">swapon</span> --show <span class="c-comment"># swap actif</span>
<span class="c-kw">cat</span> /proc/meminfo <span class="c-comment"># détails kernel</span>
<span class="c-kw">vmstat</span> 1 5 <span class="c-comment"># stats mémoire/IO</span>
</div>
</div>
<div class="info-box teal" style="margin-top:.7rem;"><div class="label">Allocateur mémoire</div>
<ul style="font-size:.83rem;padding-left:1.1rem;color:var(--muted)">
<li><strong>brk/sbrk</strong> — expansion du segment heap</li>
<li><strong>mmap</strong> — allocation anonyme (grosses allocs) ou fichier mappé</li>
<li><strong>Slab allocator</strong> — cache kernel pour objets fréquents (inodes, task_struct…)</li>
<li><strong>Buddy system</strong> — gestion des pages physiques libres</li>
</ul>
</div>
</div>
</div>
</div>
<div class="card">
<h3>Page fault et Copy-on-Write</h3>
<div class="grid2">
<div class="info-box purple"><div class="label">Types de page fault</div>
<ul style="font-size:.85rem;padding-left:1.1rem;color:var(--muted)">
<li><strong>Minor fault</strong> — page en mémoire mais non mappée dans la table de pages du processus → résolu sans I/O</li>
<li><strong>Major fault</strong> — page absente de la RAM, doit être lue depuis le disque (swap ou fichier mappé) → I/O coûteux</li>
<li><strong>SIGSEGV</strong> — accès à une adresse non mappée → segmentation fault</li>
</ul>
</div>
<div class="info-box green"><div class="label">Outils de diagnostic mémoire</div>
<div class="codeblk" style="font-size:.78rem;padding:.6rem;">
<span class="c-comment"># Utilisation mémoire par processus</span>
<span class="c-kw">pmap</span> -x 1234
<span class="c-kw">cat</span> /proc/1234/status
<span class="c-comment"># Fuite mémoire (valgrind)</span>
<span class="c-kw">valgrind</span> --leak-check=full ./prog
<span class="c-comment"># Statistiques page faults</span>
<span class="c-kw">ps</span> -o pid,majflt,minflt -p 1234
<span class="c-comment"># Mémoire kernel slabs</span>
<span class="c-kw">cat</span> /proc/slabinfo
<span class="c-kw">slabtop</span>
<span class="c-comment"># Activer/désactiver transparent hugepages</span>
<span class="c-kw">echo</span> always > /sys/kernel/mm/transparent_hugepage/enabled
</div>
</div>
</div>
</div>
</div>
<!-- ===== SÉCURITÉ ===== -->
<div id="tab-security" class="tab-panel">
<div class="section-title">Sécurité Linux</div>
<div class="card">
<h3>Permissions UNIX</h3>
<div class="grid2">
<div>
<div class="info-box blue"><div class="label">Modèle DAC (Discretionary Access Control)</div>
<p style="font-size:.85rem;color:var(--muted);margin-bottom:.6rem;">Chaque fichier a un propriétaire (user), un groupe (group) et des permissions pour les autres (others) :</p>
<div class="codeblk" style="font-size:.83rem;padding:.7rem;">
<span class="c-comment">$ ls -la /etc/passwd</span>
-rw-r--r-- 1 root root 2847 mars 1 /etc/passwd
│├──┤├──┤├──┤
│ u g o
│
└─ type: - fichier, d répertoire, l lien, b bloc, c char, p pipe, s socket
</div>
<table style="width:100%;font-size:.82rem;border-collapse:collapse;margin-top:.6rem;">
<tr><th style="padding:.2rem;text-align:left;color:var(--muted)">Bit</th><th style="padding:.2rem;color:var(--muted)">Fichier</th><th style="padding:.2rem;color:var(--muted)">Répertoire</th></tr>
<tr><td style="padding:.2rem"><strong>r (4)</strong></td><td style="padding:.2rem">Lire le contenu</td><td style="padding:.2rem">Lister (ls)</td></tr>
<tr><td style="padding:.2rem"><strong>w (2)</strong></td><td style="padding:.2rem">Modifier</td><td style="padding:.2rem">Créer/supprimer</td></tr>
<tr><td style="padding:.2rem"><strong>x (1)</strong></td><td style="padding:.2rem">Exécuter</td><td style="padding:.2rem">Traverser (cd)</td></tr>
<tr><td style="padding:.2rem"><strong>s (setuid)</strong></td><td style="padding:.2rem">Exécute en tant que owner</td><td style="padding:.2rem">setgid: héritage groupe</td></tr>
<tr><td style="padding:.2rem"><strong>t (sticky)</strong></td><td style="padding:.2rem">—</td><td style="padding:.2rem">Seul owner peut supprimer</td></tr>
</table>
</div>
</div>
<div>
<div class="codeblk" style="font-size:.82rem;">
<span class="c-comment"># Changer les permissions</span>
<span class="c-kw">chmod</span> 755 script.sh <span class="c-comment"># rwxr-xr-x</span>
<span class="c-kw">chmod</span> u+x,g-w fichier <span class="c-comment"># symbolique</span>
<span class="c-kw">chmod</span> -R 644 /var/www/ <span class="c-comment"># récursif</span>
<span class="c-comment"># Changer propriétaire</span>
<span class="c-kw">chown</span> alice:web fichier
<span class="c-kw">chown</span> -R www-data:www-data /var/www/
<span class="c-comment"># umask — masque de création</span>
<span class="c-kw">umask</span> 022 <span class="c-comment"># → fichiers 644, répertoires 755</span>
<span class="c-comment"># setuid bit (ex: /usr/bin/passwd)</span>
<span class="c-kw">chmod</span> u+s /usr/bin/monprog
<span class="c-comment"># ACL étendues (au-delà de ugo)</span>
<span class="c-kw">setfacl</span> -m u:bob:rw fichier
<span class="c-kw">getfacl</span> fichier
<span class="c-comment"># Attributs étendus</span>
<span class="c-kw">chattr</span> +i fichier <span class="c-comment"># immuable (même root)</span>
<span class="c-kw">lsattr</span> fichier
</div>
</div>
</div>
</div>
<div class="card">
<h3>Capabilities Linux</h3>
<div class="grid2">
<div class="info-box teal"><div class="label">Pourquoi les capabilities ?</div>
<p style="font-size:.85rem;color:var(--muted);margin-bottom:.5rem;">Historiquement, root avait tous les droits. Les <strong>capabilities</strong> (Linux 2.2+) découpent les privilèges root en ~40 capacités distinctes, permettant le <em>principe de moindre privilège</em>.</p>
<table style="width:100%;font-size:.8rem;border-collapse:collapse;">
<tr><td style="padding:.2rem"><code>CAP_NET_BIND_SERVICE</code></td><td style="padding:.2rem;color:var(--muted)">Bind ports < 1024</td></tr>
<tr><td style="padding:.2rem"><code>CAP_NET_RAW</code></td><td style="padding:.2rem;color:var(--muted)">Sockets raw (ping, tcpdump)</td></tr>
<tr><td style="padding:.2rem"><code>CAP_SYS_ADMIN</code></td><td style="padding:.2rem;color:var(--muted)">Mount, namespace… (très puissant)</td></tr>
<tr><td style="padding:.2rem"><code>CAP_KILL</code></td><td style="padding:.2rem;color:var(--muted)">Envoyer signaux à tout processus</td></tr>
<tr><td style="padding:.2rem"><code>CAP_CHOWN</code></td><td style="padding:.2rem;color:var(--muted)">Changer propriétaire arbitrairement</td></tr>
<tr><td style="padding:.2rem"><code>CAP_DAC_OVERRIDE</code></td><td style="padding:.2rem;color:var(--muted)">Ignorer les permissions DAC</td></tr>
</table>
</div>
<div>
<div class="codeblk" style="font-size:.8rem;">
<span class="c-comment"># Capabilities d'un processus</span>
<span class="c-kw">cat</span> /proc/1234/status | grep Cap
<span class="c-kw">capsh</span> --decode=0000003fffffffff
<span class="c-comment"># Donner CAP_NET_BIND_SERVICE à nginx</span>
<span class="c-kw">setcap</span> cap_net_bind_service+ep /usr/sbin/nginx
<span class="c-kw">getcap</span> /usr/sbin/nginx
<span class="c-comment"># sudo sans capabilities : via sudoers</span>
<span class="c-kw">visudo</span>
<span class="c-comment"># alice ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx</span>
</div>
<div class="info-box purple" style="margin-top:.7rem;"><div class="label">LSM — Linux Security Modules</div>
<ul style="font-size:.83rem;padding-left:1.1rem;color:var(--muted)">
<li><strong>SELinux</strong> — Mandatory Access Control, labels sur tous les objets (RHEL/Fedora). Modes : enforcing / permissive / disabled</li>
<li><strong>AppArmor</strong> — Profils de confinement par application (Ubuntu/SUSE). Plus simple que SELinux</li>
<li><strong>seccomp</strong> — Filtre d'appels système (Docker utilise seccomp profiles)</li>
<li><strong>Namespaces</strong> — Isolation : pid, net, mnt, uts, ipc, user, cgroup, time</li>
</ul>
</div>
</div>
</div>
</div>
<div class="card">
<h3>Audit et durcissement</h3>
<div class="grid2">
<div class="info-box orange"><div class="label">Audit Linux (auditd)</div>
<div class="codeblk" style="font-size:.78rem;padding:.6rem;">
<span class="c-comment"># Auditer toutes les exec de root</span>
<span class="c-kw">auditctl</span> -a always,exit -F arch=b64 \
-S execve -F uid=0 -k root_cmds
<span class="c-comment"># Auditer les accès à /etc/passwd</span>
<span class="c-kw">auditctl</span> -w /etc/passwd -p rwxa -k passwd_watch
<span class="c-comment"># Voir les logs</span>
<span class="c-kw">ausearch</span> -k passwd_watch
<span class="c-kw">aureport</span> --auth <span class="c-comment"># rapport auth</span>
</div>
</div>
<div class="info-box coral"><div class="label">Bonnes pratiques de durcissement</div>
<ul style="font-size:.83rem;padding-left:1.1rem;color:var(--muted)">
<li>Désactiver root SSH (<code>PermitRootLogin no</code>)</li>
<li>Authentification par clé SSH uniquement</li>
<li>Configurer un pare-feu (<code>nftables</code>, <code>ufw</code>)</li>
<li>Activer SELinux/AppArmor en mode enforcing</li>
<li>Appliquer régulièrement les mises à jour (<code>unattended-upgrades</code>)</li>
<li>Utiliser <code>fail2ban</code> contre les brute-force</li>
<li>Limiter les capabilities des services (<code>setcap</code>)</li>
<li>Vérifier les cronjobs et services actifs (<code>systemctl list-units</code>)</li>
<li>CIS Benchmarks / OpenSCAP pour l'audit de conformité</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ===== QUIZ ===== -->
<div id="tab-quiz" class="tab-panel">
<div class="section-title">Quiz GNU/Linux</div>
<p style="color:var(--muted);margin-bottom:1.5rem;">12 questions pour valider vos connaissances sur le kernel, le démarrage, les fichiers et la sécurité.</p>
<div id="quiz-container">
<div class="quiz-q" data-q="0">
<div class="question">1. Qu'est-ce que le "mode monolithique modulaire" du kernel Linux ?</div>
<div class="quiz-answers">
<div class="quiz-ans" onclick="answer(this,0,false)">Le kernel est découpé en micro-services indépendants</div>
<div class="quiz-ans" onclick="answer(this,0,true)">Le kernel tourne dans un seul espace mémoire (ring 0) mais peut charger/décharger des modules dynamiquement</div>
<div class="quiz-ans" onclick="answer(this,0,false)">Le kernel est compilé séparément pour chaque architecture</div>
<div class="quiz-ans" onclick="answer(this,0,false)">Seuls les modules essentiels sont chargés au démarrage, le reste est ignoré</div>
</div>
<div class="quiz-feedback">Linux est <strong>monolithique</strong> (tout le code kernel tourne en ring 0, contrairement aux micro-kernels), mais <strong>modulaire</strong> : des drivers et sous-systèmes peuvent être chargés (<code>modprobe</code>) ou déchargés (<code>rmmod</code>) à chaud sans recompiler.</div>
</div>
<div class="quiz-q" data-q="1">
<div class="question">2. Quel est le rôle de l'initramfs dans la séquence de démarrage ?</div>
<div class="quiz-answers">
<div class="quiz-ans" onclick="answer(this,1,false)">C'est le bootloader qui charge le kernel</div>
<div class="quiz-ans" onclick="answer(this,1,false)">C'est le premier processus lancé par le kernel (PID 1)</div>
<div class="quiz-ans" onclick="answer(this,1,true)">C'est un mini-système de fichiers en RAM qui permet de charger les modules nécessaires pour monter le vrai système de fichiers racine</div>
<div class="quiz-ans" onclick="answer(this,1,false)">C'est la partition de swap utilisée lors du démarrage</div>
</div>
<div class="quiz-feedback"><strong>initramfs</strong> = image cpio compressée chargée en RAM. Elle contient les modules kernel (ex: driver LUKS, LVM, pilote RAID) indispensables avant que le vrai FS racine ne soit accessible. Après montage de la racine, <code>switch_root</code> bascule vers le vrai FS.</div>
</div>
<div class="quiz-q" data-q="2">
<div class="question">3. Que contient un inode ?</div>
<div class="quiz-answers">
<div class="quiz-ans" onclick="answer(this,2,false)">Le nom du fichier et son contenu</div>
<div class="quiz-ans" onclick="answer(this,2,true)">Les métadonnées du fichier (permissions, taille, timestamps, pointeurs de blocs) mais PAS son nom</div>
<div class="quiz-ans" onclick="answer(this,2,false)">Uniquement les permissions et le propriétaire</div>
<div class="quiz-ans" onclick="answer(this,2,false)">Le chemin complet du fichier dans l'arborescence</div>
</div>
<div class="quiz-feedback">L'<strong>inode</strong> stocke tout sauf le nom : UID/GID, permissions, type, timestamps (atime/mtime/ctime), taille, nombre de liens et pointeurs vers les blocs de données. Le <em>nom</em> est dans l'entrée de répertoire (dentry) qui associe un nom à un numéro d'inode.</div>
</div>
<div class="quiz-q" data-q="3">
<div class="question">4. Quelle est la différence entre SIGTERM (15) et SIGKILL (9) ?</div>
<div class="quiz-answers">
<div class="quiz-ans" onclick="answer(this,3,false)">SIGTERM tue immédiatement, SIGKILL demande poliment d'arrêter</div>
<div class="quiz-ans" onclick="answer(this,3,true)">SIGTERM peut être intercepté/ignoré par le processus pour un arrêt propre, SIGKILL est traité directement par le kernel et ne peut jamais être ignoré</div>
<div class="quiz-ans" onclick="answer(this,3,false)">Ils sont équivalents, seul le numéro diffère</div>
<div class="quiz-ans" onclick="answer(this,3,false)">SIGKILL ne tue que le processus principal, SIGTERM tue tout l'arbre de processus</div>
</div>
<div class="quiz-feedback"><strong>SIGTERM</strong> : le processus peut définir un handler pour faire un arrêt propre (fermer connexions, vider buffers). <strong>SIGKILL</strong> : traité par le kernel directement, impossible à intercepter, capturer ou ignorer — le processus est détruit immédiatement.</div>
</div>
<div class="quiz-q" data-q="4">
<div class="question">5. Qu'est-ce que le Copy-on-Write (CoW) dans le contexte de fork() ?</div>
<div class="quiz-answers">
<div class="quiz-ans" onclick="answer(this,4,false)">Le processus enfant reçoit une copie complète de la mémoire du parent au moment du fork</div>
<div class="quiz-ans" onclick="answer(this,4,true)">Parent et enfant partagent les mêmes pages physiques jusqu'à ce que l'un d'eux écrive, déclenchant alors une copie uniquement de la page modifiée</div>
<div class="quiz-ans" onclick="answer(this,4,false)">Les copies de fichiers se font automatiquement lors d'une écriture</div>
<div class="quiz-ans" onclick="answer(this,4,false)">C'est un mécanisme de sauvegarde incrémentale du système de fichiers</div>
</div>
<div class="quiz-feedback">Avec <strong>CoW</strong>, le <code>fork()</code> est très rapide : on duplique juste les tables de pages (pas la mémoire physique). Les pages physiques sont marquées read-only et partagées. À la première écriture sur une page, le kernel en crée une copie pour le processus qui écrit.</div>
</div>
<div class="quiz-q" data-q="5">
<div class="question">6. Quel répertoire virtuel expose les informations sur les processus en cours d'exécution ?</div>
<div class="quiz-answers">
<div class="quiz-ans" onclick="answer(this,5,false)">/var/run</div>
<div class="quiz-ans" onclick="answer(this,5,false)">/sys</div>
<div class="quiz-ans" onclick="answer(this,5,true)">/proc</div>
<div class="quiz-ans" onclick="answer(this,5,false)">/dev</div>
</div>
<div class="quiz-feedback"><strong>/proc</strong> est un système de fichiers virtuel (procfs) qui expose les informations du kernel en temps réel. Chaque processus a un sous-répertoire <code>/proc/<PID>/</code> avec ses fichiers ouverts, mappings mémoire, status, etc. <code>/proc/cpuinfo</code>, <code>/proc/meminfo</code> exposent aussi les infos matérielles.</div>
</div>
<div class="quiz-q" data-q="6">
<div class="question">7. Qu'est-ce que le setuid bit sur un exécutable ?</div>
<div class="quiz-answers">
<div class="quiz-ans" onclick="answer(this,6,false)">Il permet à tous les utilisateurs de modifier le fichier</div>
<div class="quiz-ans" onclick="answer(this,6,true)">Il fait que le programme s'exécute avec les privilèges de son propriétaire plutôt que de celui qui le lance</div>
<div class="quiz-ans" onclick="answer(this,6,false)">Il rend le fichier immuable (ne peut être supprimé)</div>
<div class="quiz-ans" onclick="answer(this,6,false)">Il indique que le fichier doit être exécuté en temps réel</div>
</div>
<div class="quiz-feedback">Le bit <strong>setuid</strong> (<code>chmod u+s</code>) est le mécanisme qui permet à <code>/usr/bin/passwd</code> (propriété de root) d'être exécuté par n'importe quel utilisateur avec les privilèges de root, afin de modifier <code>/etc/shadow</code> (lisible uniquement par root).</div>
</div>
<div class="quiz-q" data-q="7">
<div class="question">8. Quelle est la différence entre un lien dur et un lien symbolique ?</div>
<div class="quiz-answers">
<div class="quiz-ans" onclick="answer(this,7,true)">Un lien dur partage le même inode que le fichier source (même partition), un lien symbolique est un fichier distinct qui pointe vers un chemin et peut traverser les partitions</div>
<div class="quiz-ans" onclick="answer(this,7,false)">Un lien dur est plus lent car il copie physiquement les données</div>