Summary Files Commits Branches @commit @diff @stats
path: root / src / slides / linuxgraphy-by-strabo / index.du
blob: a2535b97e4d33c630387210084300ff6a92a5415 (plain) (blame)
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
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
'def title Linuxgraphy by Strabo
'def  desc A history and feature showcase of Linux-based distributions.

# {title}

{pagenav 38 min;19 January 2023;04 March 2023}

### Custom assets

{i Licensing information in the last slide, at the bottom of the page}

.bulleted
- {url UNIX layers image;./img/unix-layers.png}
- {url UNIX directory tree;./img/unix-dir-tree.png}
- {url mll-set.sh;./mll-set.sh}

### Presented at

:defs
; {bg} Unofficial {url FMI;https://fmi.uni-sofia.bg/en} Computer Science Discord server   {i 04.03.2023 || 14:50 - 17:20}
: In front of a tiny audience of other uni students. Exact revision {url here;https://gitlab.com/Syndamia/syndamiadotcom/-/blob/6feed223ff48fe00cf12fcd63f3f56179c298cae/src/talks/linuxgraphy-by-strabo/index.md}.

; {bg} Unofficial {url FMI;https://fmi.uni-sofia.bg/en} Computer Science Discord server   {i 22.01.2023 || 18:00 - 21:00}
: In front of a tiny audience of other uni students. Exact revision {url here;https://gitlab.com/Syndamia/syndamiadotcom/-/blob/6eb7a8fff01c6814253a0e738efb53734d297be9/src/talks/linuxgraphy-by-strabo/index.md}.


{presentation-controller}

:title_slide

# Linuxgraphy by Strabo

{i Made by {url Syndamia;https://syndamia.com}}

{br4}

:sqrow
	{br1}

	:font22
		2000 years ago {url Strabo;https://en.wikipedia.org/wiki/Strabo} published {url Geography;https://en.wikipedia.org/wiki/Geography}, in which he laid out the world as it was known to the Romans and Greeks.

		{br1}

		Today, I'll lay out Linux as it is known to me.


	{img https://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Strabo.jpg/199px-Strabo.jpg}

	{br1}



:slide35

# Contents

:sqrow
	:column
	:numbered
	1. Historical context
	2. Structure of UNIX-likes
		.numbered
		1. Shell
		2. UNIX-style file system
		2. Kernel

	{br2}

	3. Linux from the inside
		.numbered
		1. Shells
		2. Files and directories
		3. Common configuration files
		4. System management

	4. Software licensing



	:column
	:numbered
	5. What makes up a useful OS
		.numbered
		1. Bootloader
		2. Init system
		3. Package manager
		4. Desktop manager

	6. War on distros
	{br4}

	7. Demos - virtual machine and setup from zero





:slide

# 1. Historical context

{br1}

#### 1945 - 1955

.p
You directly loaded instructions into memory and let it execute your "code" (processor instructions).
Nothing else ran on the machine.

.p
This process was labor intensive: a qualified operator loaded your program, dumped the memory contents, remove any external media, reset the machine and load the next job.

#### 1956 - 1959

.p
Computers became faster, but a lot of time was spend on managing jobs.

.p
{url resident monitors;https://en.wikipedia.org/wiki/Resident_monitor}: very small programs, which always {i resided} in memory, and {i monitored} what the state of the current job was.\n
Jobs were loaded in series ({url batches;https://en.wikipedia.org/wiki/Batch_processing}).
When the current job finished, memory would be dumped and the next one would automatically be loaded and started.


:slide

#### 1960s

{br1}

.p
Peripherals (tapes, punch cards, ...) were extremely slow.\n
{url Multiprogramming;https://en.wikipedia.org/wiki/Computer_multitasking#Multiprogramming}: the current job is waiting for a peripheral, another job would be started.

.p
{url Travel reservation system;https://en.wikipedia.org/wiki/Sabre_%28travel_reservation_system%29} by American Airlines: where travel agents would search, price and book services.
A computer system now had to support:

.bulleted
- User accounts with concurrent access
- Fast response time and ease of use
- Storage organization, also following the rise of disks
- Data communication links (often phone lines)

{br1}

.p
More and more business started using computers, thanks to {url minicomputers;https://en.wikipedia.org/wiki/Minicomputer}, so demand for OS software increased.


:slide

#### 1964 - 1969

.p
IBM's {url System/360;https://en.wikipedia.org/wiki/IBM_System/360} line of computers, each with expansion capabilities, backwards compatibility, all under one instruction set and operating system.

.p
{url Multics;https://en.wikipedia.org/wiki/Multics}, an influential operating system that was designed for a General Electric mainframe.
Some of it's novel ideas include, but are not limited to:

:bulleted
- {url Time-sharing;https://en.wikipedia.org/wiki/Time-sharing}:
  sharing resources of a singular machine among many users
  (via {url multiprogramming;https://en.wikipedia.org/wiki/Multiprogramming} and {url multi-tasking;https://en.wikipedia.org/wiki/Computer_multitasking})

- {url Single level store;https://en.wikipedia.org/wiki/Single-level_store} (aka {url virtual memory;https://en.wikipedia.org/wiki/Virtual_memory}):
  Processes would write into contiguous memory, but in reality it is scattered and managed by the operating system.

- {url Protection rings;https://en.wikipedia.org/wiki/Protection_ring}:
  Allowing different levels of access to different resources (programs).
  In general, this also often requires a {url CPU protected mode;https://en.wikipedia.org/wiki/Protected_mode}.

- {url Hierarchical file system;https://en.wikipedia.org/wiki/Directory_%28computing%29}:
  Arbitrary directories with subdirectories, rather than just having files next to each other or having directories which could only contain files.
- {url Command processor;https://en.wikipedia.org/wiki/Shell_%28computing%29} (that is separated from the OS):
  More on that later



:slide

#### 1969: Death of Multics and birth of UNIX

.p
Ultimately Multics grew too large, becoming unusable and unmaintainable.\n
In the beginning, programming was done mostly by {url Bell Labs;https://en.wikipedia.org/wiki/Bell_Labs}, with {url Ken Thompson;https://en.wikipedia.org/wiki/Ken_Thompson} being one of the developers.

{br1}

:sqrow
	.font18
	{img https://upload.wikimedia.org/wikipedia/commons/f/f8/Ken-Thompson-2019.png}\n
	{i Ken Thompson image by National Inventors Hall of Fame}
	{img ;https://upload.wikimedia.org/wikipedia/commons/1/1b/Ken_Thompson_and_Dennis_Ritchie--1973.jpg}\n
	{i Ken Thompson and Dennis Ritchie in 1973}

	:column
	.p
	Thompson still had some desire to work on operating systems, after Bell Labs pulled out.
	The tools he made while rewriting {url his own video game;https://en.wikipedia.org/wiki/Space_Travel_%28video_game%29} on a PDP-7 lead to a whole operating system: UNIX.

	.p
	Based, expanded on and improved upon many of Multic's ideas, UNIX became the father of modern OSs.




:slide

# 2. Structure of UNIX-likes

.p
Ignoring {url standards;https://unix.stackexchange.com/questions/14368/difference-between-posix-single-unix-specification-and-open-group-base-specifi/14415} and {url specifications;https://unix.stackexchange.com/questions/87686/what-makes-an-operating-system-unix-like}, in my opinion, from the point of a user, a UNIX-like OS has the following components:

{br2}

.ordered
1. {b shell}: A programmable replaceable command-line interpreter, with utilities for managing the whole system and support for pipelines and I/O redirection
2. {b UNIX-style file system}: {url Filesystem;https://en.wikipedia.org/wiki/Unix_filesystem} as a single rooted tree, objects (nodes) in the file system are {url inodes;https://en.wikipedia.org/wiki/Inode} and an inode can be {url (at least);https://en.wikipedia.org/wiki/Unix_file_types} either a regular file, directory or devices. Permissions per users and group.
3. {b kernel}: Program that manages all communication and operations between the hardware and software

{br2}

.font18 {i For now we'll generally just look over some of the common stuff and go into detail later, while in Linux.}


:slide35

## 2.1. shell

{br1}

:sqrow
	:column
		The operating system is divided into layers, {url like an onion;https://youtu.be/-FtCTW2rVFM?t=57}.\n
		Only the kernel has access to the hardware.\n
		shells and executables (binaries) have access to the kernel.

		.p
		shells provide user interfaces, {url both;http://en.wikipedia.org/wiki/Shell_%28computing%29} command-line and graphical.
		While on the topic of UNIX, we'll only discuss the former.


	.centered {img ./img/unix-layers.png}



:slide

### Command-line shells

.p
Command-line shells operate solely with text, often only with ASCII characters.
Usually connecting to a computer (to the shell) is said to be done with either a "terminal" ("console") or "teleprinter" ("teletype").

:row
	.p
	Video displays became widely available in the late 1970s, so before that access was done with a "teleprinter", a typewriter-printer combo.

	.width25%
	.font18
	{img https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/ASR-33_at_CHM.agr.jpg/1280px-ASR-33_at_CHM.agr.jpg}\n
	{i Teletype Model 33 by {url Arnold Reinhold;https://commons.wikimedia.org/wiki/User:ArnoldReinhold}}

	{newrow}

	.p
	With the advent of computer displays, teleprinters were replaced with terminals, video display-keyboard combo.
	Thanks to the widely popular {url VT100;https://en.wikipedia.org/wiki/VT100}, almost all terminals support {url ANSI escape codes;https://en.wikipedia.org/wiki/ANSI_escape_code}.

	.font18
	{img https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/DEC_VT100_terminal.jpg/675px-DEC_VT100_terminal.jpg?20131106192408}\n
	{i DEC VT100 by {url Jason Scott;https://www.flickr.com/people/54568729@N00}}



:slide

.p
Today we don't usually use such specialised hardware, but the names persist with slightly different meanings.

.p
{url Virtual Terminal;https://en.wikipedia.org/wiki/Virtual_console} (Console, tty): on some modern UNIX-likes (like Linux), the kernel/OS provides special devices, where a console is directly implemented/simulated with the connected computer and display.

.bulleted
- systems that don't provide it usually expose another way to connect a console (now external hardware and/or software is required), like a {url serial;https://en.wikipedia.org/wiki/Serial_port} port

.p
{url Terminal Emulator;https://en.wikipedia.org/wiki/Terminal_emulator}: a special program that emulates a virtual terminal (within another display system)

.p
{url Pseudoterminal;https://en.wikipedia.org/wiki/Pseudoterminal} (pty): a program that sits between a terminal and a shell (or other program), and makes them both think they're directly connected

.bulleted
- ssh, a program to remotely connect to a device's shell, establishes a pseudoterminal. Your local terminal thinks it's connected to a local shell and vice versa with the remote shell, however the pty in between handles the true communication.


:middle_slide

### Command location and parameters

.p
Most commands are regular programs, which exist somewhere on the system.
When entering a command name, the shell searches for an executable with that name.
Searching the whole drive is very inefficient, so the search is limited to the few directories, listed in a variable called "PATH".

.p
You can give a full or relative path, and that will be executed directly.

.p
Each command can be given parameters, separated by spaces, each (by convention) being either text values or options (switches).

.p
Options usually start with a hyphen {` -} (like {` -c} or {` -current-time}) and often support abbreviations ({` -a -b -c} to {` -abc}).
Newer conventions also allow start with two hyphens {` --} ({` --current-time}), though if shown as-is indicate the rest is a string.
More rarely you might see {` --OPTION=VALUE} or just {` OPTION=VALUE}.


:middle_slide

### Thompson shell

.p
The first UNIX shell is the {url Thompson shell;https://en.wikipedia.org/wiki/Thompson_shell}.
The two major features that every other shell supports are:

:bulleted
- I/O redirection: redirection of input and output, allowing insertion of input from a file or storage of output into a file:

  ```
command [args...] < filepath
command [args...] > filepath

- pipelines: being able to redirect the output from one command to another without limit

  ```
command1 [args...] | command2 [args...] | ...



:slide

## 2.2. UNIX-style file system

.bulleted
- Rooted singular tree of directories (the root folder of which is called "root", denoted with a "/")
- Each tree object (node) is an {url i(ndex)node;https://en.wikipedia.org/wiki/Inode}, containing type, ownership, access, internal data and any other metadata, but {b not} name!
- Directory inodes (files) contain a table with rows of names and inode numbers, mapping a file name to it's contents. Each row is called a {url hard link;https://en.wikipedia.org/wiki/Hard_link}. Every directory has a hard link to itself, called ".", and a hard link to it's parent, called "..".

.p {img ;./img/unix-dir-tree.png}


:middle_slide

### Attributes of an inode

:bulleted
- {url file type;https://en.wikipedia.org/wiki/Unix_file_types}:
  Each inode represents some sort of file (data), but a "file" can also be a directory or device, so we need to know how to handle it.\n
  There are 7 main types (but there can exist more, depending on OS):

  {br2}

  .bulleted
  - {b regular}: just a plain old file
  - {b directory}: as explained, a file containing hard links to other files. Each directory is allowed to appear {i only once} in a single parent.
  - {b symbolic link}: points to any file (or directory). It contains the (relative) path to that object (as a simple string), so a symlink not could even be valid.
    Think of a C++ pointer (pseudocode).

  ```
symlink /bin/mprog = "/usr/local/bin/mprog";
exec(/bin/mprog); -> Executes /usr/local/bin/mprog



:slide
:bulleted
  - {b FIFO special}: aka {url named pipe;https://en.wikipedia.org/wiki/Named_pipe}, a special type of regular file, where at any moment only one process can read from it and one can write to it. It takes the concept of shell pipes to inter-process communication.

    ```
[Process]     --write->     [FIFO]     x-write--     [Process]
[   A   ]     x--read--     [    ]     --read-->     [   B   ]

  - {b block special}: a device which is randomly accessible, like a hard drive or cdrom drive.
    Think of a C++ array (pseudocode):

    ```
BlockSpecial[438] = 1 ; var = BlockSpecial[438]

  - {b character special}: devices which are accessed via serial streams of input or output, like keyboards, mice, graphics cards and teletypes.\n
    Think of a C++ stream (pseudocode):

    ```
CharacterSpecial << 1 ; CharacterSpecial >> var



:middle_slide
:bulleted
  - {b sockets}: file for inter-process communication. Compared to FIFO specials, they can be used by more than two processes, used in both directions and support {url file descriptors;https://en.wikipedia.org/wiki/File_descriptor} and packets

    {br1}

    ```
[Process A]  <--read&write-->  [Socket 1]
[Process B]  <--read&write-->  [Socket 1]
...
[Process A]  --write-->  [Socket 1]  --read-->  [Process B]
                                     --read-->  [Process C]



:slide

#### Side-step into users and groups

{br3}

.p
A user in UNIX is essentially a small collection of data, most important of it being a {b unique ID} (number), a {b name} (string), a {b group id} (number; files created by the user are in that group) and a {b password}.

.p
Groups are also small collections of data, but much simpler, comprised only of a {b unique ID} (number), a {b name} (string) and a {b list of users} that are "in" the group. Their main purpose is to simplify access control.

.p
User with ID 0 is called root, it is the "system administrator", all actions made by the system itself are done as that user.
Every user has their own "home" folder (under "/home/USERNAME/", except for root, which is "/root/"), in which they store personal files, as well as user-specific configuration files.


:slide
:bulleted
- {url file permissions;https://en.wikipedia.org/wiki/File_system_permissions}:
  control the freedom of a user to read (navigate for directories), change and execute files\n

  File permissions are split into three sets: what the {b owner} can do, what {b group} members can do and what {b anyone else} can do.\n

  Each set contains a mix of three permissions: {b r}ead, {b w}rite and e{b x}ecute, and each set stores some combination of them.

  {br1}

  .p
  Each is represented by a bit in the order above ({` 101} means you {i can} read, {i cannot} write, {i can} execute) and the overall permissions are often shown as a three digit number or character string.\n
  Example: {` 111101100} will be shown as {` 754} or {` rwxr-xr--}

- link count:
  the count of hard links that point to the inode. A file is deleted {b only when there are no hard links left to it}.
  Every directory inode has at least two - one from parent and one from itself ("."), though the latter {b isn't} counted.
  Child and parent directories also {b add} to the count.

  {br1}

- User ID of owner, Group ID, file size and timestamps



:slide

## 2.3. Kernel

.font18
{br1}

.p
The kernel has the core functionality of the operating system and bridges the gap between programs and hardware.
Some important subsystems include scheduling, file, device, process and memory management.

.p
To preserve the {url everything is a file;https://en.wikipedia.org/wiki/Everything_is_a_file} methodology, devices and processes can be handled as files (inside {` /dev} and {` /proc}).
They (most of the time, in modern kernels) aren't actual files on a hard drive, but "virtual" files, where operations on them are handled in a different manner than normal by the kernel.

{br2}

.font35 Linux is {b not} an operating system, it is a kernel!!!

{br2}

.p
Two of the important things a kernel does is manage {b processes} and {b memory}.


:slide35

### 2.3.1 Processes

{br1}

.p
A program is some collection of code and other data, stored in a file (or noncompiled code).\n
A process is the program in motion, the program itself {i alongside} certain system states.

.p
The system states include (but are not limited to):
.bulleted
- the processor state, including the program counter and register values
- memory map, indicating what regions of memory are allocated (to the process)
- {url file descriptors;https://en.wikipedia.org/wiki/File_descriptor}, unique identifiers for files


:middle_slide35

.p
On a multitasking (multiprocessing) system, which is any modern desktop system, multiple processes are always running "at once".

.p
In reality, constantly one process is stopped and another is ran, switching between all of them ({url context switching;https://en.wikipedia.org/wiki/Context_switch}).
All "waiting" processes are put in a prioritized queue ({url run queue;https://en.wikipedia.org/wiki/Run_queue}).

.p
Stopping is either done by the process itself (more on that later), or by the system when the process has been actively running for too much time.


:slide35

#### Process Control Block

.p
All process information is stored in a data structure, called a {i process control block} (or process descriptor).
Not to be confused with a {url printed circuit board;https://en.wikipedia.org/wiki/Printed_circuit_board}!\n
A PCB's data can be split into three categories:

.numbered
1. {b Process identification} - the ID of the process itself, of it's parent process, of it's owner (user), etc.
2. {b Process state} - as described, the processor state, etc.\n
   On a context switch, values in registers are put into the stopped PCB and then are loaded from the running PCB.
3. {b Process control information} - process state, memory map, privileges, etc.

.p
A process can be {b forked}, meaning a new process is created, with the same underlying code (but not process states and ...).


:middle_slide35

#### Process states

.bulleted
- {b Created}: This is the initial state given to a new process. In this state, the process awaits a "ready" state.
- {b Ready} (Waiting): A process is put in the run queue and awaits being executed ("running" state).
- {b Running}: When the process's program is being currently executed by the CPU. The process can run in either {i kernel mode}, having access to the kernel and user addresses, or {i user mode}, having access only to it's own code and data.
- {b Blocked}: When a process cannot continue without external change, usually when waiting for an I/O device.
- {b Terminated}: The process has either completed execution or has been killed. The process itself is called a {url "zombie process";https://en.wikipedia.org/wiki/Zombie_process} (until it is removed).


:middle_slide35

#### Exit status

.p
Every process, before being deleted (and after being in a Terminated state) passes a small number, called the {url exit status;https://en.wikipedia.org/wiki/Exit_status} (exit code), to it's parent process.
For all intents and purposes, this number is an 8bit unsigned integer, meaning it's value is between 0 and 255.

.p
Pretty much universally, an exit code of 0 signifies a successful termination, and anything else specifies some sort of error code.
Different programs specify the meaning of an exit code in different ways, some assign each number to a specific error, other use the bits representing the number as flags.


:slide35

### 2.3.2 Memory management

{br2}

.p
In ye olde days, you would save a bit of memory for the operating system and give all of the rest to the current process ({url monoprogramming;https://en.wiktionary.org/wiki/monoprogramming}), which we wait until completion.

.p
This doesn't allow for context switching (disks are slow) and a blocked state forces the CPU to wait.

.p
Some bad ideas include: depending on the code of all processes to not use the same addresses, use only {url relative addresses;https://en.wikipedia.org/wiki/Position-independent_code} ({` -fPIC} option in {` gcc}) or use a {url table;https://en.wikipedia.org//wiki/Relocation_%28computing%29#Relocation_table} that the kernel fills out with addresses.


:slide35

### Virtual memory

{br2}

.fright
	{img ./img/virtual-memory-by-Ehamberg.png}\n
	.font18
	{i Image by {url Ehamberg;https://commons.wikimedia.org/wiki/File:Virtual_memory.svg}}

.p
A program (process) works with some (sequential) addresses, and the OS (with the help of {url hardware;https://en.wikipedia.org/wiki/Memory_management_unit}) translates/maps the process' addresses (logical/{url virtual addresses;https://en.wikipedia.org/wiki/Virtual_address_space}) to real ones (physical addresses).

.p
Simplified memory management for the program, protected address space for each process and improved flexibility.


:slide35

#### Segmentation (without paging)

{br2}

.p
Initially, virtual memory was implemented with segmentation, where a process' memory is divided into segments for code, stack, heap, etc.
Each segment is given a chunk of contiguous memory, which can be resized, and addresses are defined as the base segment (physical) address with an offset.

.p
In the modern day, segmentation isn't used by itself, since resizing segments could require reordering of memory and {url external fragmentation;https://en.wikipedia.org/wiki/Fragmentation_%28computing%29#External_fragmentation}, where there simply isn't enough contiguous memory, could occur.


:slide35

#### Paging

{br3}

.p
The virtual and physical memory is divided into fixed-sized chunks of consecutive addresses.
A virtual memory chunk is called a {b page}, while a physical memory chunk is called a (page) {b frame}.
Usually both have the same size of (at least) 4 KiB.

.p
Every process has a {url page table;https://en.wikipedia.org/wiki/Page_table}, which maps the process' pages to system frames.
Thus every memory address is translated from it's page location to a frame location.


:slide35

.p Advantages include:

.bulleted
- elimination of {url external fragmentation;https://en.wikipedia.org/wiki/Fragmentation_%28computing%29#External_fragmentation}
- increased flexibility, allowed sharing of memory between processes (useful for shared libraries)
- finding free memory is fast and easy, just use the first free pages you see
- frames can be scattered
- more efficient swapping, moving of memory from RAM to disk and back

.p Disadvantages include:

.bulleted
- longer memory access, because of the page table
- {url internal fragmentation;https://en.wikipedia.org/wiki/Fragmentation_%28computing%29#Internal_fragmentation}, where one or multiple pages might be partially empty, leaving free space that cannot be used


:slide

# 3. Linux from the inside

.p
Enough theory, time to have some fun and learn Linux!

.p
We'll be using {url Linux Minimal Live;https://ivandavidov.github.io/minimal/#home} (just a bootable ISO) because it's:

.bulleted
- very small, comprised of only the Linux kernel, GNU C library and Busybox\n
- made by a fellow Bulgarian {bg}

.p
We're going to explore and look around the following stuff:

.bulleted
- {b Shells}: What a modern shell would often support on a Linux based OS
- {b Files and directories}: Naming conventions and commands to work with them
- {b Common configuration files}: Relevant configuration files, their purpose and syntax
- {b System management}: Other commands with which to modify your system


:middle_slide18

#### If you're following at home

.p
Owing to it's size, not everything we need comes out of the box, so I created {url a script;./mll-set.sh} which installs what's needed.
If you want to try it out yourself, after booting up Minimal Linux Live, type out and run:

```
wget -q http://unsecure.syndamia.com/mll-set.sh && chmod +x mll-set.sh && ./mll-set.sh

.p
You might've noticed that the command above doesn't use the normal {url https://syndamia.com/talks/linuxgraphy-by-strabo/mll-set.sh;./mll-set.sh} link.
That is because, out of the box, MLL doesn't really support secure connections (https), so I've made only that file available without it.

.p
The script, in summary, installs bash, coreutils and shadow "packages" (from {url http://s.minos.io/archive/bifrost/x86\_64;http://s.minos.io/archive/bifrost/x86_64}) to /usr/local/bin, creates /etc/passwd, /etc/bashrc and /etc/profile with some values in them and starts bash.


:slide

## 3.1. Shells

{br2}

### Variables and data types

.p
Before talking about the different features newer shells support, we'll roughly cover variables and data types (mostly {url bash;https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameters} specifics).

.p
A variable, also called parameter, is created with the syntax (NO spaces between the =):

```
name=value

.p
Where {` name} is either a combination of letters (upper and lower case), numbers and the underscore character, which cannot begin with a number, or one of select few {b positional} and {b special} parameters.


:slide35

#### Positional and special parameters

.p
{url Positional parameters;https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Positional-Parameters} are numbers from 1 to N, where each one corresponds to a shell (or function, or script) argument.

.p
Some of the {url special parameters;https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Special-Parameters} are:

.bulleted
- {` 0}, corresponding to the shell's or script's name,
- {` @} is all positional parameters, separated by spaces
- {` #} is the number of positional parameters
- {` ?} is the last executed (foreground) process
- {` $} is process ID of the current shell.

.p
{` value}, without any special surrounding characters (more on that later), is treated as a string (but it mustn't have spaces!), however it may also be omitted, in which case it is the empty string {` ""}.


:slide35

#### Data types

.p
In most shells, there are 3 data types: strings, integers and (one-dimensional) indexed arrays.
{url bash has more;https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#index-declare}, like references and associative arrays, but those aren't universal.

.p
A value is a {b string} when surrounded by single {` '} or double {` "} quotes,\n
an {b integer} when it isn't surrounded by anything and composed only of digits (if there are letters, it is a string; it's {url quite tricky;https://tldp.org/LDP/abs/html/untyped.html} when a value is interpreted as a string or integer) and\n
an {b array} when surrounded by braces {` ()}, where inside elements are strings or integers, separated by spaces.
An indexed array can also be created by specifying the value at any index:

```
name[index\}value


:slide

#### Mixing types and operations

{br1}

```
name=value

:table
:4
|= Type
|= string operation
|= integer operation
|= array operation

|: string
|: value
|: 0
|: value when index is 0, empty string otherwise

|: integer
|: empty string, but sometimes value
|: value
|: value when index is 0, empty string otherwise

|: array
|: operation is done on element at index 0
|: operation is done on element at index 0
|: value




:slide

#### Parameter expansion

.p
With {url parameter expansion;https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion}, actions are done with the general variable (entity) or on strings and arrays values.
Operations on integers are done with {url arithmetic expansion;https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Arithmetic-Expansion}.

.p
Parameter expansion is started with the character {` \$} and either a name or curly braces.
Retrieving a value is done with the forms {` \$name}, {` \${name}} and {` \${name[index]}} for arrays.

.p
Some parameter expansions in bash:
.bulleted
- {` \${#parameter}} length of characters
- {` \${parameter:offset}} and {` \${parameter:offset:length}} return substring from index offset
- {` \${parameter/pattern/string}} return a string, where every match on pattern is replaced by string
- {` \${name[@]}} a (space separated) sequence of indices from 0 to length (for defined values) of array name


:slide

#### Arithmetic expansion

.p
Arithmetic expansions allow evaluation of {url arithmetic expressions;https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Arithmetic}.
They're in the form {` \$(( expression ))}.

.p
Some useful expressions are:
.bulleted
- {` ++name}, {` name++}, {` --name}, {` name++} postfix and prefix incrementation and decrementation
- {` +}, {` -}, {` *}, {` /}, {` %} normal arithmetic operators, {` **} exponentiation
- {` ~}, {` <<}, {` >>}, {` &}, {` ^}, {` |} bitwise operators
- {` ==}, {` !=}, {` >}, {` >=}, {` <}, {` <=} logical comparison
- {` !}, {` &&}, {` ||} logical not, and, or
- {` expr ? exprTrue : exprFalse} conditional
- {` =}, {` +=}, ..., {` <<=}, ... assignment operators
- {` expr1 , expr2} consecutive expressions and {` (expr)} bracing

.p
Expressions work with both variable names and integers.


:middle_slide

### Bourne shell

.p
Most modern shells support a lot of the more defying features of the {url Bourne Shell;https://en.wikipedia.org/wiki/Bourne_shell}, which include:

:bulleted
- {url Job control;https://en.wikipedia.org/wiki/Job_control_%28Unix%29}: Management of currently running groups of processes\n
  :bulleted
  - {` &}: A process can be ran in the background with an ampersand (&) at the end of the command:
    ```
command [args...] &

  - {` Ctrl+z}: suspend the currently running (foreground) job
  - {` bg}: start a suspended job in the background
  - {` fg}: resume the last job to be put in the background and make it the current job with which we're interacting
  - {` jobs}: list all active (background) jobs




:middle_slide
:bulleted
- &emsp;
  :bulleted
  - Every job is identified with a {b Job ID} (number), which you can use by prepending a percentage sign. Example, to resume the job with JID 4:

    ```
fg %4

  - For managing everything, usually there is a {i job table}.
    Upon shell termination, the shell tells all jobs in that table to terminate and waits for them.\n
    {` disown}: remove a job from the job table

  - {` kill}: send a signal to the process or job. Then that process will have to handle it accordingly.\n
    Common ones are {` -KILL} to immediately stop the process, {` -QUIT} to quit it, {` -ABRT} to cancel the current action, {` -TERM} shut down (orderly), {` -STOP} shut down (forcefully)




:middle_slide27
:bulleted
- {url heredoc;https://en.wikipedia.org/wiki/Here_document}: File literal, meaning it is a user "string" which is interpreted as a file
  .bulleted
  - start with {` << NAME}, where NAME can be anything you want, it is used to mark the beginning and end of a heredoc. {` <<} is also a redirection symbol
  - on every new line write out your text, all characters will be preserved
  - to end it, write out {` NAME} on the beginning of a new empty line. Example:
  ```
cat << MYFILE
This is
  some
      text
MYFILE

- control operators: Control what command is executed, depending on {url exit status;https://en.wikipedia.org/wiki/Exit_status}
  .bulleted
  - {` expr1 && expr2}: Run expr2, only if expr1 exited successfully
  - {` expr1 || expr2}: Run expr2 if expr1 exited unsuccessfully
  - {` expr1 ; expr2}: Run expr2 after expr1 (sequential execution)



:middle_slide27
:bulleted
- {url redirection;https://en.wikipedia.org/wiki/Redirection_%28computing%29}: Outside of having {` <} and {` >} for I/O redirection, often there is also
  :bulleted
  - {` >>}: Acts like {` >}, putting text into a file, but rather than overwriting everything, it appends it
  - {` <<}: As explained, for heredocs
  - {` <<<}: To the right is a string ({url herestring;https://en.wikipedia.org/wiki/Here_document#Here_strings}), and it is interpreted as a file

    ```
cat <<< "Hello World!"

  - {b Standard input}, {b standard output} and {b standard error} are all {b files} with which the shell works.
    Typing text in the shell puts it into stdin, command output are put into stdout (and shown to the user) and errors are put into stderr (also shown to the user).
    .p
    Each one of them is numbered from 0 to 2, and you can specify redirection by appending or prepending it to the redirection symbol.\n
    .p
    .bulleted
    - {` N>outputfile}: redirects the output from standard stream N into outputfile
    - {` N>&M}: redirects the output from standard stream N into standard stream M
    - {` N&lt;inputfile}: redirects input file contents to standard stream N
    - {` N&lt;&M}: redirects standard stream M to standard stream N




:middle_slide27
:bulleted
- {url built-in test command;https://en.wikipedia.org/wiki/Test_%28Unix%29}: With {` test} you can do conditional expressions. You can also often use brackets {` [ args... ]} instead of {` test args...}

  :p
  :bulleted
  - Some of the available file checks
    .bulleted
    - {` -e FILENAME}: FILENAME exists
    - {` -d FILENAME}: if FILENAME is a directory
    - {` -h FILENAME}: if FILENAME is a symbolic link
    - {` -w FILENAME}: you can write in FILENAME

  - Some of the available string checks
    .bulleted
    - {` -n STR}: string STR has nonzero length
    - {` -z STR}: string STR has length zero
    - {` STR1 = STR2} and {` STR1 != STR2}: self explanatory

  - Some of the available number checks
    .bulleted
    - {` INT1 -eq INT2}: equal integers
    - {` INT1 -gt INT2}: INT1 > INT2
    - {` INT1 -gt INT2}: INT1 >= INT2

  - Operators: {` !} - negation, {` -a} - binary AND, {` -o} - binary OR, parentheses for grouping (escaped with {` \\})





:slide
:bulleted
- {url scripting support;https://en.wikipedia.org/wiki/Shell_script}: Running commands from top to bottom of a file
  .p
  .bulleted
  - {` #}: Everything between a # and the end of the line denotes a comment
  - {` #!}: If on the first line of the file, is treated as a {url shebang;https://en.wikipedia.org/wiki/Shebang_%28Unix%29}, which specifies what interpreter to be used for the script

- compound commands: Structures for flow control\n
  In all examples, {` test-command} is any command (or combination with control operators), and logic is based on exit code.

  :p
  :bulleted
  - conditional (if)

    ```
if test-command ; then commands-if-true
elif test-command ; then commands-if-true
else commands-if-true
fi

    {` elif} statements can appear multiple times, both elif and else are optional





:slide
:bulleted
- &emsp;
  {br1}

  :bulleted
  - conditional (case)

    ```
case word in (pattern | ...) commands-if-true ;; ... esac

    .p
    Where the beginning brace can be ommited.\n
    Patterns are according to {url bash's pattern matching;https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Pattern-Matching}

  - loops

    ```
while test-command; do commands-if-true; done

    ```
for name in words...; do commands-if-true; done

    If {` in words...} is ommited, positional arguments are used




:middle_slide35

## 3.2. Files and directories

.bulleted
- {` /dev}: devices
- {` /proc}: process information

{br3}

.bulleted
- {` /bin}: main command programs (binaries), used by users
- {` /sbin}: command programs, used for the system operation
- {` /usr}: other system resources
  .bulleted
  - {` /usr/bin}: all other user command binaries


:slide

#### Everyday file system commands

.bulleted
- {` mkdir}: create directories
- {` rm}: remove a (hardlink to) file or directory
- {` mv}: move file (or directory) to another directory
- {` cp}: copy a file
- {` ln}: create hard (or soft, with {` -s}) links to files (inodes)
- {` ls}: list directory contents

#### Other useful file system commands

.bulleted
- {` shred}: overwrite file contents
- {` dd}: do many things with files, like modifying and duplicating data across devices and partitions, (basic) data recovery and generating files
- {` du}: estimate file usage
- {` stat}: display status for file or file system
- {` chwon}: change owner of an inode
- {` chgrp}: change group of an inode
- {` chmod}: change file modes
- {` find}: search for a file inside a directory (recursively)


:slide

#### Everyday text (file) commands

.bulleted
- {` echo}: prints a given string to standard output
- {` cat}: sequentially prints files to standard output
- {` less}: view files with support for scrolling
- {` head}: print the first lines (or characters) of a file
- {` tail}: print the last lines (or characters) of a file

#### Other useful text (file) commands

.bulleted
- {` grep}: searches for matches in a file, using simplified regular expressions. {` egrep} for extended regex and {` fgrep} for string match (as-is).
- {` sed}: filter and transform text from files, according to regex
- {` tr}: translate, map (more than one to one for example) and delete characters
- {` cut}: remove parts of text from each line
- {` strings}: find embedded text inside binary files
- {` truncate}: shrink or extend the size of a file
- {` wc}: count words inside file
- {` diff}: compare files and show their differences


:middle_slide

#### Device commands

.bulleted
- {` mount}: bind another file system to a location in the file system
- {` umount}: remove binding to a file system
- {` lsusb}: lists USB devices
- {` lspci}: lists PCI devices

#### System information commands

.bulleted
- {` date}: display current date and time
- {` hostname}: show (or set) the systems hostname (network name)
- {` free}: display free memory on the system


:slide

#### User and group management

.bulleted
- {` useradd}: creates a new user (with a password)
- {` userdel}: remove a user and all of his files
- {` usermod}: modify a user account, including his name and groups
- {` passwd}: change password of a user. With {` -l} user could be locked (impossible to log in)

{br3}

.bulleted
- {` groupadd}: create a new group
- {` groupdel}: remove a group
- {` groupmod}: modify an existing group

{br3}

.bulleted
- {` w}: show who is logged in and what they are doing
- {` who}: show who is logged in
- {` whomai}: print username
- {` login}: establish a new connection to the system


:slide
:bulleted
- {` /etc}: system configuration files
  {br2}

  :bulleted
  - {` /etc/group}: the data for all groups is stored here, in the format

    ```
GROUPNAME:PASSWORD:GID:USERS...

  - {` /etc/passwd}: the data for all users is stored here, in the format

    ```
USERNAME:PASSWORD:UID:GID:USERINFO:HOMEDIR:SHELL

  - {` /etc/shadow}: stores other user data, especially the password as an encrypted string, in the format

    ```
USERNAME:PASSWORD:LASTCHANGED:MINBETWEENCHANGES:MAXBETWEENCHANGES:WARNEXPIRE:INACTIVEDAYS:EXPIRE




:slide27
:bulleted
- &emsp;
  :bulleted
  - {` /etc/fstab}: read on boot by mount to setup devices in fs

    ```
'emplace
# device-spec   mount-point  fs-type  options              dump  pass
/dev/sda1       /            ext4     defaults             1     1
UUID=123A-456B  /boot        vfat     noauto,noatime       1     2
LABEL=Vault     /mnt/Vault   auto     nosuid,nodev,nofail  0     0
'endemplace

  - {` /etc/hosts}: list of host names (domain names) and their corresponding IP address, when a DNS server doesn't do the job

    ```
'emplace
# ipaddress    domains
127.0.0.1      localhost mywebsite.com something.else
62.44.101.138  my.uni
'endemplace

  - {` /etc/bashrc}: global defaults and aliases used by the bash shell
  - {` /etc/motd}: message of the day (unexecuted text), shown after login but before the shell is ran




:middle_slide35
:bulleted
- {` /usr}: other system resources
  .bulleted
  - {` /usr/lib}: library files
  - {` /usr/local}: local, system software
  - {` /usr/share}: architecture independent data, like manuals

- {` /var}: variable data, like logs and cache
- {` /home}: home directories of all users
- {` /lib}: libraries and kernel modules
- {` /mnt}: mounted temporary filesystems
- {` /root}: home directory for the root user



:slide

# 4. Software licensing

.p
It is important to note that most software in Linux, including the kernel itself, is under a variety of open licenses.
An open license is a license which allows others to reuse the original work, under some restrictions.

.p
For software, such a license is applied to the source code from which the original application was made.
Some commonly used ones, with a (NON-LEGALLY BINDING) summary include:

.bulleted
- {url MIT;https://en.wikipedia.org/wiki/MIT_License}: the author is not responsible for anything that the code does
- {url BSD-3-Clause;https://en.wikipedia.org/wiki/BSD_licenses}: use the same license (copyleft), the author is not responsible for anything that the code does
- {url GNU GPL;https://en.wikipedia.org/wiki/GNU_General_Public_License}: disclose the original project and use the same license ({url copyleft;https://en.wikipedia.org/wiki/Copyleft})

.p
This is important, since pretty much everything can be freely modified by anyone (for the better or worse, but generally better).


:slide35

# 5. What makes up a useful OS

{br1}

.p
A Linux-based operating system is nothing more than the Linux kernel, combined with an assortment of programs.\n
Overall, the main elements that make up a useful {i desktop} operating system (alongside a command-line shell) are:

{br1}

.numbered
1. {b Bootloader}: load the kernel and operating system
2. {b Init system}: well managed way to start everything inside the OS
3. {b Package manager}: way to manage our binaries
4. {b Desktop manager}: graphical shell


:slide

## 5.1. Bootloader

.p
The computer boot process is a relay race.

.p
In a "standard" BIOS-MBR boot configuration:

```
BIOS -> Master Boot Record -> Active Parition -> Bootloader ->
-> Boot menu (optional) -> Kernel -> Everything else

.bulleted
- {url BIOS;https://en.wikipedia.org/wiki/BIOS}: a small chip with code that is ran upon power up
- {url MBR;https://en.wikipedia.org/wiki/Master_boot_record}: small amount of space at the very start of the disk, that contains some (bootstrap) code and partition information. The BIOS hands off execution to the bootstrap code.
- Active partition: MBR loads and runs code from the beginning of the partition (boot sector), which starts the bootloader
- {url Bootloader;https://en.wikipedia.org/wiki/Bootloader}: the first complex program, which manages kernels, shows a menu, allows for debugging and so on


:middle_slide

.p
The BIOS is baked into the motherboard, the MBR is pretty universal (and it's less than 512 bytes) and the kernel we know and love.

.p
That leaves us with the need for a bootloader.
On Linux, the most used one is called {url GRUB;https://en.wikipedia.org/wiki/GNU_GRUB}.

.p
It's config is found in {` /etc/default/grub} (which is then fully generated with {` grub-mkconfig}) and can be "installed in the partition" with {` grub-install}.

```
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE=menu
GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_GFXMODE=640x480


:slide27

## 5.2. Init system

.p
Now we need to load the user stuff, like a network manager, the graphical user interface and so on.\n
In Minimal Linux Live, this is done by some hard written scripts, which aren't very modular or extensible.

.p
{url Init systems;https://en.wikipedia.org/wiki/Init} use configuration files, called service, to start a program in some way.

:bulleted
- {url systemd;https://en.wikipedia.org/wiki/Systemd}, which also aims to also provide easy system configuration

  'def LANG ini
  ```
[Unit]
Description=Service
[Service]
Type=simple
User=root
ExecStart=/usr/local/sbin/script.sh
[Install]
WantedBy=multi-user.target

- {url openrc;https://en.wikipedia.org/wiki/OpenRC}, a simple and modern system



:slide

## 5.3. Package manager

{br1}

.p
Programs are just executable files, usually placed in a specific folder, like {` /usr/bin}.

.bulleted
- MLL comes with ~100 executables (and ~230 after my script)
- my Debian server has ~1000 installed packages
- my current desktop Gentoo setup has ~1500 installed packages
- my old Fedora setups have reached ~3000 packages on multiple occasions

.p
Updating all of them means replacing all of the binaries, means tracking where each one came from, installing a new one might require installing multiple others and so on.

.p
On modern systems, managing binaries is automated by an application called a package manager.


:middle_slide35

.p
Additional benefits of package management automation include:

.bulleted
- checking for package validity (and tampering)
- utilising multiple server mirrors
- automatic dependency management and installation
- version caveats
- (indirectly) improved stability because of maintainer compatibility checks

{br1}

```
apt install PKG
apt remove PKG
apt upgrade


:slide

## 5.4. Window systems

.p
A widow system is your graphical shell: the graphical way to interact with your computer (the kernel).
It's main components are:

{br1}

:bulleted
- {b Window manager}: the overall system with which you create, remove, resize and work with windows. They are generally separated into two types:

  .bulleted
  - {i Stacked}: this is what you know, windows are just rectangles floating about, and can be put one over each other
  - {i Tiled}: windows take up a predefined (but changeable) portion of the screen

- {b Compositor}: adds an unseen window buffer, allowing additional processing, before a window is shown. This powers transparency, animation effects and more.

- {b Session manager}: graphical application that manages the window managers (outside WMs), think of it as a login window



:slide27

# 6. War on distros

.p
A distribution is a complete set of of all applications that you might use.

.p
Overall, there are 4-5 distributions from which 90% of all other distros are based upon:

.numbered
1. {url Slackware;http://www.slackware.com/}:
   as the oldest still maintained distro, it served as inspiration for a lot of other distros.
   It aims to be as simple and as close to UNIX as possible.
2. {url Debian;https://www.debian.org/} (and {url Ubuntu;https://ubuntu.com/}):
   it is the most popular distribution (if we also include Ubuntu).
   Ubuntu aims to be modern and fancy, while Debian aims to be as stable as possible, which makes it the most popular in server usage.
3. {url Gentoo;https://www.gentoo.org/}:
   the distribution which defined non-binary software distribution
4. {url Arch Linux;https://archlinux.org/}:
   a very popular and modern distribution with the goal of providing the latest and greatest software.

.p
We haven't touched too much, but Linux distributions aren't limited to desktop or server computers.

.numbered
1. {url AOSP;https://en.wikipedia.org/wiki/Android_%28operating_system%29#AOSP}: the base of the whole Android operating system
2. {url OpenWRT;https://en.wikipedia.org/wiki/OpenWrt}: a router operating system


:slide35

# 7. Demos - virtual machine and setup from zero

{br2}

.p
Now for the best part: we'll be installing a Linux distribution on a virtual machine and then directly on a laptop, running Windows 10!

.p
I've chosen to install {url Linux Mint;https://linuxmint.com/}, since it is generally targeted towards newcomers and will feel familiar enough to Windows users.

.p
Currently there won't be an official recording of the process, you should've been here live!


:title_slide35

# Thank you for your time


:slide18

# Sources

.p
All of these contain, at most, small paraphrased sentences in the slides.
They served as personal educational and reference tools.

.bulleted
- {url wikipedia;https://en.wikipedia.org/} and {url stackexchange;https://stackexchange.com/} have been used extensively and linked where appropriate.
- {url CS416 - Operating Systems Design;https://people.cs.rutgers.edu/~pxk/416/index.html} by {url Paul Krzyzanowski;https://people.cs.rutgers.edu/~pxk/rutgers/} at {url Rutgers State University;https://www.cs.rutgers.edu/}
- {url Origins and History of UNIX, 1969-1995;https://web.archive.org/web/20220713165958/https://homepage.cs.uri.edu/~thenry/resources/unix_art/ch02s01.html} from {url The Art of Unix Programming;https://web.archive.org/web/20220611160552/https://homepage.cs.uri.edu/~thenry/resources/unix_art/index.html} by Eric Steven Raymond
- {url Ken Thompson interviewed by Brian Kernighan at VCF East 2019;https://www.youtube.com/watch?v=EY6q5dv_B-o} by {url Vintage Computer Federation;https://vcfed.org/}
- {url Pseudo Terminals presentation;http://www.cs.uah.edu/~kkeen/CS590/Pseudo%20Terminals.ppt} from {url CS590;http://www.cs.uah.edu/~kkeen/CS590/} by {url Kevin J. Keen;http://www.cs.uah.edu/~kkeen/kkeen.html} at {url University of Alabama in Huntsville;https://www.uah.edu/}
- {url Hard links and Unix file system nodes;https://teaching.idallen.com/dat2330/04f/notes/links_and_inodes.html} from {url DAT 2330 Introduction to Operating Systems;https://teaching.idallen.com/dat2330/04f/} by {url Ian D. Allen;http://www.idallen.com/}
- {url Virtual Memory, OS Course Notes;https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/9_VirtualMemory.html} by {url Dr. John T. Bell;https://www.cs.uic.edu/~jbell/} at {url University of Illinois Chicago;https://www.cs.uic.edu},\n
  which is directly based on {url Operating System Concepts, 9th Edition;https://archive.org/details/operating-system-concepts-9e} by {url Abraham Silberschatz;https://codex.cs.yale.edu/avi/}
- {url Chapter 9 Preview - Virtual Memory;http://csapp.cs.cmu.edu/3e/home.html} from {url Computer Systems: A Programmer's Perspective;http://csapp.cs.cmu.edu/} by {url Randal E. Bryant;http://www.cs.cmu.edu/~bryant} and {url David R. O'Hallaron;http://www.cs.cmu.edu/~droh}
- {url Memory Management, Lecture Notes;https://www.cse.iitb.ac.in/~mythili/teaching/cs347_autumn2016/notes/07-memory.pdf} by {url Mythili Vutukuru;https://www.cse.iitb.ac.in/~mythili/}
- {url Paging advantages and disadvantages;http://www.cs.iit.edu/~cs561/cs351/VM/paging%20advantages%20and%20disadvantages.html} by Charles R. Bauer at {url Computer Science Departmemnt of Illinois Institute of Technology;http://www.cs.iit.edu/}
- {url Bash Reference Manual;https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html} by the {url GNU project;https://www.gnu.org/} and {url ksh manual;https://man.openbsd.org/ksh} by the {url OpenBSD project;https://www.openbsd.org/}
- {url Manual of the Bourne Shell on Version 7;https://www.in-ulm.de/~mascheck/bourne/v7/}, archived by {url Sven Mascheck;https://www.in-ulm.de/~mascheck/}
- {url /usr hierarchy;https://www.linuxbase.org/betaspecs/fhs/fhs/ch04.html} from {url Filesystem Hierarchy Standard;https://www.linuxbase.org/betaspecs/fhs/fhs/index.html} by {url Linux Foundation;https://www.linuxfoundation.org/}, Daniel Quinlan, Paul 'Rusty' Russell, Christopher Yeoh
- {url Filesystem Hierarchy Standard;https://www.pathname.com/fhs/pub/fhs-2.3.pdf} by Rusty Russel, Daniel Quinlan and Christopher Yeoh
- {url User & Group Names;https://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/usernames.html#FTN.AEN26405} from {url Linux Standard Base Core Specification;https://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/book1.html} by {url Free Standards Group;https://en.wikipedia.org/wiki/Free_Standards_Group}
- {url Managing User Accounts;https://docstore.mik.ua/orelly/linux/run/ch05_07.htm} from {url Running Linux, Third Edition;https://docstore.mik.ua/orelly/linux/run/index.htm} by Matt Welsh, Matthias Kalle Dalheimer, and Lar Kaufman
- {url The BIOS/MBR Boot Process;https://neosmart.net/wiki/mbr-boot-process/} by {url NeoSmart's Knowledgebase;https://wiki.neosmart.net/}

# Licensing

.p
Images on slides "2.1. shell" and "2.2. UNIX-style file system" are made by me and {url licensed as content;/license.html}.\n
The script {url mll-set.sh;http://syndamia.com/talks/linuxgraphy-by-strabo/mll-set.sh} is licensed under MIT (though I don't see it as substatial enough to be licensed under anything).