diff --git a/tutorial/3/Makefile b/tutorial/3/Makefile index 1ca85ba..2065b17 100644 --- a/tutorial/3/Makefile +++ b/tutorial/3/Makefile @@ -1,9 +1,7 @@ -SOURCES = tutorial.md installation.md chroot.md pseudofs.md capabilities.md cgroups.md oom.md project-intro.md project-body.md project-rendu.md -PANDOCOPTS = --latex-engine=xelatex \ +SOURCES = tutorial.md installation.md chroot.md pseudofs.md mount.md capabilities.md cgroups.md oom.md project-intro.md project-body.md project-rendu.md +PANDOCOPTS = --pdf-engine=xelatex \ --standalone \ - --normalize \ --number-sections \ - --smart \ -M lang=fr-FR \ -M fontsize=12pt \ -M papersize=a4paper \ @@ -12,7 +10,6 @@ PANDOCOPTS = --latex-engine=xelatex \ -M sansfont="Linux Biolinum O" \ -M colorlinks=true \ -M linkcolor="black" \ - -M urlcolor="[rgb]{0.2,0.6,0.4}" \ --include-in-header=../header.tex diff --git a/tutorial/3/capabilities.md b/tutorial/3/capabilities.md index fd109d9..64a0d9a 100644 --- a/tutorial/3/capabilities.md +++ b/tutorial/3/capabilities.md @@ -79,11 +79,11 @@ Par exemple, on peut définir un attribut sur un fichier comme cela :
```shell -42sh$ echo 'Hello World!' > toto -42sh$ setfattr -n user.foo -v bar toto -42sh$ getfattr -d toto -# file: toto -user.foo="bar" + 42sh$ echo 'Hello World!' > toto + 42sh$ setfattr -n user.foo -v bar toto + 42sh$ getfattr -d toto + # file: toto + user.foo="bar" ```
@@ -91,12 +91,12 @@ Encore plus fort, vous pouvez utiliser les ACL POSIX :
```shell -42sh$ sudo chown root:root toto && sudo chmod o-r toto -42sh$ cat toto -cat: toto: Permission denied -42sh$ sudo setfattr -m u:$USER:r toto -42sh$ cat toto -Hello World! + 42sh$ sudo chown root:root toto && sudo chmod o-r toto + 42sh$ cat toto + cat: toto: Permission denied + 42sh$ sudo setfattr -m u:$USER:r toto + 42sh$ cat toto + Hello World! ```
@@ -107,9 +107,9 @@ Vous pouvez voir ces attributs avec la commande :
```shell -42sh$ getfattr -d -m "^system" toto -# file: toto -system.posix_acl_access=0sgAAEAD/////AgAEOgDAEAA/////xAABAD////8= + 42sh$ getfattr -d -m "^system" toto + # file: toto + system.posix_acl_access=0sgAAEAD/////AgAEOgDAEAA/////xAABAD////8= ```
@@ -127,9 +127,9 @@ Si votre distribution profite de ces attributs étendus, vous devriez obtenir :
```shell -42sh$ getfattr -d -m "^security" $(which ping) -# file: bin/ping -security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA= + 42sh$ getfattr -d -m "^security" $(which ping) + # file: bin/ping + security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA= ```
@@ -137,8 +137,8 @@ Ou, dans sa version plus lisible :
```shell -42sh$ getcap $(which ping) -/bin/ping = cap_net_raw+ep + 42sh$ getcap $(which ping) + /bin/ping = cap_net_raw+ep ```
@@ -150,31 +150,31 @@ d'un processus :
```shell -42sh$ ./view_caps 1 -cap_user_header_t ------------------ -Version: 20080522 -PID: 1 + 42sh$ ./view_caps 1 + cap_user_header_t + ----------------- + Version: 20080522 + PID: 1 -cap_user_data_t ---------------- -effective: 0x3fffffffff - CAP_AUDIT_CONTROL - CAP_AUDIT_READ -[...] - CAP_SYS_TIME - CAP_SYS_TTY_CONFIG - CAP_SYSLOG - CAP_WAKE_ALARM -permitted: 0x3fffffffff - CAP_AUDIT_CONTROL - CAP_AUDIT_READ -[...] - CAP_SYS_TIME - CAP_SYS_TTY_CONFIG - CAP_SYSLOG - CAP_WAKE_ALARM -inheritable: 0x0 + cap_user_data_t + --------------- + effective: 0x3fffffffff + CAP_AUDIT_CONTROL + CAP_AUDIT_READ + [...] + CAP_SYS_TIME + CAP_SYS_TTY_CONFIG + CAP_SYSLOG + CAP_WAKE_ALARM + permitted: 0x3fffffffff + CAP_AUDIT_CONTROL + CAP_AUDIT_READ + [...] + CAP_SYS_TIME + CAP_SYS_TTY_CONFIG + CAP_SYSLOG + CAP_WAKE_ALARM + inheritable: 0x0 ```
diff --git a/tutorial/3/cgroups.md b/tutorial/3/cgroups.md index c27ae9f..401de90 100644 --- a/tutorial/3/cgroups.md +++ b/tutorial/3/cgroups.md @@ -24,8 +24,8 @@ procédure suivante :
``` -mkdir /sys/fs/cgroup/freezer/ -mount -t cgroup -o freezer none /sys/fs/cgroup/freezer/ + mkdir /sys/fs/cgroup/freezer/ + mount -t cgroup -o freezer none /sys/fs/cgroup/freezer/ ```
@@ -43,8 +43,8 @@ par exemple la racine :
``` -mkdir /sys/fs/cgroup/freezer/virli/ -ls /sys/fs/cgroup/freezer/virli/ + mkdir /sys/fs/cgroup/freezer/virli/ + ls /sys/fs/cgroup/freezer/virli/ ```
@@ -65,7 +65,7 @@ du groupe. Pour ajouter une tâche à ce groupe, cela se passe de cette manière
``` -echo $PID > /sys/fs/cgroup/freezer/virli/tasks + echo $PID > /sys/fs/cgroup/freezer/virli/tasks ```
@@ -103,7 +103,7 @@ l'exécution s'arrêter. Si vous manquez d'inspiration, utilisez :
``` -for i in $(seq 9999); do echo -n $i; sleep .1; echo -n " - "; sleep .1; done + for i in $(seq 9999); do echo -n $i; sleep .1; echo -n " - "; sleep .1; done ```
@@ -112,7 +112,7 @@ calcul à notre shell et ses fils :
``` -echo FROZEN > /sys/fs/cgroup/freezer/virli/freezer.state + echo FROZEN > /sys/fs/cgroup/freezer/virli/freezer.state ```
@@ -121,7 +121,7 @@ l'exécution :
``` -echo THAWED > /sys/fs/cgroup/freezer/virli/freezer.state + echo THAWED > /sys/fs/cgroup/freezer/virli/freezer.state ```
@@ -139,7 +139,7 @@ l'installer sur notre machine) :
```shell -docker container run --name mytsdb -d -p 8086:8086 influxdb + docker container run --name mytsdb -d -p 8086:8086 influxdb ```
@@ -148,10 +148,10 @@ métriques. Voici comment on s'était débrouillé dans un précédent TP :
```shell -docker container exec -i mytsdb < @@ -184,8 +184,8 @@ Maintenant, envoyons nos données vers la base
``` -curl -i -XPOST 'http://localhost:8086/write?db=metrics' --data-binary \ - "$my_cgroup_name memory.usage_in_bytes=$(cat .../my_cgroup_name/memory.usage_in_bytes)" + curl -i -XPOST 'http://localhost:8086/write?db=metrics' --data-binary \ + "$my_cgroup_name memory.usage_in_bytes=$(cat .../my_cgroup_name/memory.usage_in_bytes)" ```
@@ -194,7 +194,7 @@ requête suivante dans notre client `influx` :
```sql -SELECT * from "$my_cgroup_name"; + SELECT * from "$my_cgroup_name"; ```
@@ -226,8 +226,8 @@ particuliers.
``` -42sh$ sudo ./monitor_init my_cgroup_name -42sh$ ./monitor my_cgroup_name memhog 500 + 42sh$ sudo ./monitor_init my_cgroup_name + 42sh$ ./monitor my_cgroup_name memhog 500 ```
@@ -243,13 +243,13 @@ correspondant à une valeur limite, comme par exemple processus va pouvoir allouer au maximum : ```shell -42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes -0 -# 0 = Aucune limite -42sh$ echo 4M > /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes -# Maintenant, la limite est à 4MB, vérifions... -42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes -4194304 + 42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes + 0 + # 0 = Aucune limite + 42sh$ echo 4M > /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes + # Maintenant, la limite est à 4MB, vérifions... + 42sh$ cat /sys/fs/cgroup/memory/virli/memory.max_usage_in_bytes + 4194304 ``` Chaque *cgroup*s défini de nombreux indicateurs et possède de nombreux diff --git a/tutorial/3/chroot.md b/tutorial/3/chroot.md index b6624d0..33324e0 100644 --- a/tutorial/3/chroot.md +++ b/tutorial/3/chroot.md @@ -16,7 +16,7 @@ commencer par créer le dossier de notre nouvelle racine :
```shell -mkdir newroot + mkdir newroot ```
@@ -30,8 +30,8 @@ première isolation :
```shell -cp $(which busybox) newroot/ -chroot newroot /busybox ash + cp $(which busybox) newroot/ + chroot newroot /busybox ash ```
@@ -40,9 +40,9 @@ Jusque là ... ça fonctionne, rien de surprenant ! Mais qu'en est-il pour
```shell -42sh$ cp $(which bash) newroot/ -42sh# chroot newroot /bash -chroot: failed to run command ‘bash’: No such file or directory + 42sh$ cp $(which bash) newroot/ + 42sh# chroot newroot /bash + chroot: failed to run command ‘bash’: No such file or directory ```
@@ -58,7 +58,7 @@ l'utilisateur lors de l'installation) le système de base.
```shell -debootstrap jessie newroot/ http://httpredir.debian.org/debian/ + debootstrap jessie newroot/ http://httpredir.debian.org/debian/ ```
@@ -67,13 +67,13 @@ debootstrap jessie newroot/ http://httpredir.debian.org/debian/ ### *stage3* -Les distributions « à l'ancienne » proposent encore de télécharger leur système +Les distributions *à l'ancienne* proposent encore de télécharger leur système de base sous forme de tarball :
```shell -wget ftp://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/20160929/stage3-amd64-20160929.tar.bz2 -tar xpf stage3-amd64-*.tar.bz2 -C newroot/ + wget http://gentoo.mirrors.ovh.net/gentoo-distfiles/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20181021T214502Z.tar.xz + tar xpf stage3-amd64-*.tar.xz -C newroot/ ```
@@ -87,9 +87,9 @@ environnement qui tient dans 300 MB.
```shell -make escape -echo bar > ../foo -chroot . + make escape + echo bar > ../foo + chroot . ```
@@ -97,7 +97,7 @@ Dans le nouvel environnement, vous ne devriez pas pouvoir faire :
```shell -cat ../foo + cat ../foo ```
@@ -105,7 +105,7 @@ Mais une fois votre programme `escape` exécuté, vous devriez pouvoir !
```shell -./escape - cat /path/to/foo + ./escape + cat /path/to/foo ```
diff --git a/tutorial/3/installation.md b/tutorial/3/installation.md index 31ac249..7c8fef7 100644 --- a/tutorial/3/installation.md +++ b/tutorial/3/installation.md @@ -46,7 +46,7 @@ Dans les sources, on affiche la liste des options avec la commande :
```shell -make menuconfig + make menuconfig ```
diff --git a/tutorial/4/mount.md b/tutorial/3/mount.md similarity index 85% rename from tutorial/4/mount.md rename to tutorial/3/mount.md index 599a908..2712780 100644 --- a/tutorial/4/mount.md +++ b/tutorial/3/mount.md @@ -8,8 +8,8 @@ Des particularités de `mount` {#mount} Au premier abord, les points de montage dans l'arborescence d'un système de fichiers n'ont pas l'air d'être remplis de notions complexes : un répertoire peut être le point d'entrée d'un montage vers la partition d'un disque -physique... ou d'une partition virtuelle, comme nous l'avons vu au TP -précédent. +physique... ou d'une partition virtuelle, comme nous l'avons vu dans la partie +précédente. Mais avez-vous déjà essayé de monter la même partition d'un disque physique à deux endroits différents de votre arborescence ? @@ -64,7 +64,7 @@ utilise le *bind mount* :
``` - mount --bind olddir newdir + mount --bind olddir newdir ```
@@ -82,10 +82,10 @@ commandes suivantes :
``` - cd newroot - mount --bind /dev dev - mount --bind /proc proc - mount --bind /sys sys + cd newroot + mount --bind /dev dev + mount --bind /proc proc + mount --bind /sys sys ```
@@ -105,10 +105,10 @@ correct de lancer :
``` - cd newroot - mount --rbind /dev dev - mount -t proc none proc - mount --rbind /sys sys + cd newroot + mount --rbind /dev dev + mount -t proc none proc + mount --rbind /sys sys ```
@@ -129,14 +129,14 @@ systèmes de fichiers de ce partage (on parle de *peer group*).
```shell - # Création de nos répertoires de travail - mkdir /mnt/test-shared + # Création de nos répertoires de travail + mkdir /mnt/test-shared - # On s'assure que le dossier que l'on va utiliser pour nos tests utilise bien la politique shared - mount --make-shared /tmp + # On s'assure que le dossier que l'on va utiliser pour nos tests utilise bien la politique shared + mount --make-shared /tmp - # Duplication de l'accroche, sans s'occuper des éventuels sous-accroches - mount --bind /tmp /mnt/test-shared + # Duplication de l'accroche, sans s'occuper des éventuels sous-accroches + mount --bind /tmp /mnt/test-shared ```
@@ -145,8 +145,8 @@ Si l'on attache un nouveau point de montage dans `/tmp` ou dans
```shell - mkdir /mnt/test-shared/toto - mount -t tmpfs none /mnt/test-shared/toto + mkdir /mnt/test-shared/toto + mount -t tmpfs none /mnt/test-shared/toto ```
@@ -162,14 +162,14 @@ esclave ne propagera pas ses nouveaux points de montage à son *maître*.
```shell - # Suite de l'exemple précédent - cd /mnt/test-slave + # Suite de l'exemple précédent + cd /mnt/test-slave - # Duplication de l'accroche, sans s'occuper des éventuels sous-accroches - mount --bind /mnt/test-shared /mnt/test-slave + # Duplication de l'accroche, sans s'occuper des éventuels sous-accroches + mount --bind /mnt/test-shared /mnt/test-slave - # On rend notre dossier esclave - mount --make-slave /mnt/test-slave + # On rend notre dossier esclave + mount --make-slave /mnt/test-slave ```
@@ -177,8 +177,8 @@ Si l'on effectue un montage dans `/mnt/test-shared` :
```shell - mkdir /mnt/test-shared/foo - mount -t tmpfs none /mnt/test-shared/foo + mkdir /mnt/test-shared/foo + mount -t tmpfs none /mnt/test-shared/foo ```
@@ -186,8 +186,8 @@ Le point de montage apparaît bien sous `/mnt/test-slave/foo`. Par contre :
```shell - mkdir /mnt/test-slave/bar - mount -t tmpfs none /mnt/test-slave/bar + mkdir /mnt/test-slave/bar + mount -t tmpfs none /mnt/test-slave/bar ```
@@ -204,7 +204,7 @@ propagation, on utilise l'option suivante :
```shell - mount --make-private mountpoint + mount --make-private mountpoint ```
@@ -215,7 +215,7 @@ Ce mode interdira tout tentative d'attache à un autre endroit.
```shell - mount --make-unbindable /mnt/test-slave + mount --make-unbindable /mnt/test-slave ```
@@ -223,8 +223,8 @@ Il ne sera pas possible de faire :
```shell - mkdir /mnt/test-unbindable - mount --bind /mnt/test-slave /mnt/test-unbindable + mkdir /mnt/test-unbindable + mount --bind /mnt/test-slave /mnt/test-unbindable ```
@@ -237,10 +237,10 @@ contenus dans leur sous-arbre :
``` - mount --make-rshared mountpoint - mount --make-rslave mountpoint - mount --make-rprivate mountpoint - mount --make-runbindable mountpoint + mount --make-rshared mountpoint + mount --make-rslave mountpoint + mount --make-rprivate mountpoint + mount --make-runbindable mountpoint ```
@@ -270,7 +270,7 @@ On utilise pour cela l'option `--move` de `mount(8)` :
```shell - mount --move olddir newdir + mount --move olddir newdir ```
@@ -278,13 +278,13 @@ Par exemple :
```shell - mount --move /dev /newroot/dev + mount --move /dev /newroot/dev ```
Il est courant de faire appel à cette option lorsque l'on souhaite changer la -racine de notre système de fichiers: par exemple pour passer de l'*initramfs* au -système démarré, de notre système hôte au système d'un conteneur, ... +racine de notre système de fichiers : par exemple pour passer de l'*initramfs* +au système démarré, de notre système hôte au système d'un conteneur, ... ## Aller plus loin diff --git a/tutorial/3/oom.md b/tutorial/3/oom.md index 0e279c2..44291c7 100644 --- a/tutorial/3/oom.md +++ b/tutorial/3/oom.md @@ -67,5 +67,5 @@ Grâce à cette notification, il est possible de figer le processus pour l'envoyer sur une autre machine. Et ainsi libérer la mémoire avant que l'OOM killer ne passe. -Jetez un œil à [cet article parru LVM](https://lwn.net/Articles/590960/) à ce -sujet. +Jetez un œil à [cet article parru sur LVM](https://lwn.net/Articles/590960/) à +ce sujet. diff --git a/tutorial/3/project-body.md b/tutorial/3/project-body.md index c4f81ba..faf28f7 120000 --- a/tutorial/3/project-body.md +++ b/tutorial/3/project-body.md @@ -1 +1 @@ -../../subject/project-part1.md \ No newline at end of file +../../subject/2/project-part1.md \ No newline at end of file diff --git a/tutorial/3/project-rendu.md b/tutorial/3/project-rendu.md index 1e46cef..366da47 100644 --- a/tutorial/3/project-rendu.md +++ b/tutorial/3/project-rendu.md @@ -24,11 +24,11 @@ pour chaque exercice) :
``` -login_x-TP3/escape.c -login_x-TP3/procinfo.sh -login_x-TP3/rev_kdb_leds.sh -login_x-TP3/view_caps.c -login_x-TP3/monitor.sh -login_x-TP3/monitor_init.sh + login_x-TP3/escape.c + login_x-TP3/procinfo.sh + login_x-TP3/rev_kdb_leds.sh + login_x-TP3/view_caps.c + login_x-TP3/monitor.sh + login_x-TP3/monitor_init.sh ```
diff --git a/tutorial/3/pseudofs.md b/tutorial/3/pseudofs.md index 28ba0d6..968cf18 100644 --- a/tutorial/3/pseudofs.md +++ b/tutorial/3/pseudofs.md @@ -16,8 +16,8 @@ montage :
``` -/dev/sda1 on / type ext4 (rw,relatime,data=ordered) -/dev/sda3 on /home type ext4 (rw,relatime,data=ordered) + /dev/sda1 on / type ext4 (rw,relatime,data=ordered) + /dev/sda3 on /home type ext4 (rw,relatime,data=ordered) ```
@@ -62,14 +62,14 @@ exemple, pour modifier les paramètres du noyau, on passe par le fichier La consultation d'un élément se fait généralement à l'aide d'un simple `cat` : ```shell -42sh$ cat /sys/power/state -freeze mem + 42sh$ cat /sys/power/state + freeze mem ``` La modification d'un élément se fait avec `echo`, comme ceci : ```shell -echo mem > /sys/power/state + 42sh# echo mem > /sys/power/state ``` Vous devriez constater l'effet de cette commande sans plus attendre ! @@ -84,39 +84,54 @@ afficher des informations sur un processus donné :
``` -42sh$ ./procinfo $$ -PID: 4242 -Path: /bin/bash -Command line: bash -Working directory: /home/nemunaire/virli/ -Root: / -State: S (sleeping) -Threads: 1 + 42sh$ ./procinfo $$ + PID: 4242 + Path: /bin/bash + Command line: bash + Working directory: /home/nemunaire/virli/ + Root: / + State: S (sleeping) + Threads: 1 -CGroups -======= -12:pids:/ -11:net_prio:/ -10:perf_event:/ -9:net_cls:/ -8:freezer:/ -7:devices:/ -6:memory:/ -5:blkio:/ -4:cpuacct:/ -3:cpu:/ -2:cpuset:/ -1:name=openrc:/ + CGroups + ======= + 12:pids:/ + 11:net_prio:/ + 10:perf_event:/ + 9:net_cls:/ + 8:freezer:/ + 7:devices:/ + 6:memory:/ + 5:blkio:/ + 4:cpuacct:/ + 3:cpu:/ + 2:cpuset:/ + 1:name=openrc:/ -Namespaces -========== -cgroup:[4026531835] -ipc:[4026531839] -mnt:[4026531840] -net:[4026531969] -pid:[4026531836] -user:[4026531837] -uts:[4026531838] + Namespaces + ========== + cgroup:[4026531835] + ipc:[4026531839] + mnt:[4026531840] + net:[4026531969] + pid:[4026531836] + user:[4026531837] + uts:[4026531838] +``` +
+ + +### `batinfo.sh` + +Explorons le pseudo système de fichiers `/sys` pour écrire un script +qui va nous renvoyer des statistiques sur votre batterie. + + +Voici un exemple d'utilisation : + +
+```shell + 42sh$ ./rev_kdb_leds.sh input20 ```
@@ -142,6 +157,6 @@ Voici un exemple d'utilisation :
```shell -42sh$ ./rev_kdb_leds.sh input20 + 42sh$ ./rev_kdb_leds.sh input20 ```
diff --git a/tutorial/3/tutorial.md b/tutorial/3/tutorial.md index 30dac27..861a42b 100644 --- a/tutorial/3/tutorial.md +++ b/tutorial/3/tutorial.md @@ -1,16 +1,16 @@ --- -title: Virtualisation légère -- Linux Internals partie 1 -subtitle: Travaux pratiques +title: Virtualisation légère -- TP n^o^ 3 +subtitle: Linux Internals partie 1 author: Pierre-Olivier *Nemunaire* Mercier institute: EPITA -date: Jeudi 26 octobre 2017 +date: Mercredi 24 octobre 2018 ... Ce premier TP consacré aux Linux Internals va nous permettre d'appréhender les notions de pseudos systèmes de fichiers, de cgroups ainsi que de capabilities. Certains éléments de ce TP sont à rendre à au plus tard le -jeudi 2 novembre 2017 à 8 h 42. Consultez la dernière section de chaque partie +mercredi 7 novembre 2018 à 12 h 42. Consultez la dernière section de chaque partie pour plus d'information sur les éléments à rendre. En tant que personnes sensibilisées à la sécurité des échanges électroniques, diff --git a/tutorial/4/Makefile b/tutorial/4/Makefile index 7f92ebd..467a384 100644 --- a/tutorial/4/Makefile +++ b/tutorial/4/Makefile @@ -1,5 +1,5 @@ SOURCES_TUTO = tutorial.md setup.md cmpns.md docker-exec.md mountns.md rendu.md -SOURCES_LESSON = lesson.md mount.md namespaces.md networkns.md pidns.md userns.md +SOURCES_LESSON = lesson.md namespaces.md networkns.md pidns.md userns.md PANDOCOPTS = --latex-engine=xelatex \ --standalone \