# pingwinowanie 2*10 - 8 + 1 # zad 1 ![image](https://hackmd.io/_uploads/SJyGzCeEC.png) ## Coś z manów ### namespaces Jakaś abstrakcja wykorzystywana do tworzenia kontenerów Ogarnia globalne zasoby, tak aby procesy wewnątrz miały jakąś swoją instancję zasobów Ustawienia odnośnie zasobów można zmienić w każdym momencie (kiedy jest się twórcą) Namespace automatycznie jest niszczony kiedy ostatni proces umiera (look namespace lifetime w namespaces(7)) Jest kilka typów namespace'ów ``` Namespace Flag Page Isolates Cgroup CLONE_NEWCGROUP cgroup_namespaces(7) Cgroup root directory IPC CLONE_NEWIPC ipc_namespaces(7) System V IPC, POSIX message queues Network CLONE_NEWNET network_namespaces(7) Network devices, stacks, ports, etc. Mount CLONE_NEWNS mount_namespaces(7) Mount points PID CLONE_NEWPID pid_namespaces(7) Process IDs Time CLONE_NEWTIME time_namespaces(7) Boot and monotonic clocks User CLONE_NEWUSER user_namespaces(7) User and group IDs UTS CLONE_NEWUTS uts_namespaces(7) Hostname and NIS domain name ``` ### pid_namespaces Rozdziela PID number space W skrócie różne processy w róznych przestrzeniach nazw mogą mieć ten sam PID Stąd np pierwszy proces w nowym namespacie może mieć PID=1 ### user_namespaces Tutaj chyba chodzi głównie o rozdzielanie uprawnień Jakiś proces X użytkownika poza user namespace, ale równocześnie może mieć mieć wszystkie możliwe uprawnienia wewnątrz namespace'a ### namespace.conf `/etc/security/namespace.conf` Plik konfiguracyjny dla namespace'ów ### unshare odpala program w nowym namespace. 1. `-impuf`: - `-i`: IPC (Inter-Process Communication) tworzy namespace ipc, czyli procesy wewnątrz nie mogą mieć nic wspólnego z procesami poza namespacem - `-m`: Montowanie systemu plików tworzy mount namespace czyli wewnątrz nie da się zobaczyć mountpointów spoza namespaca - `-p`: PID (Process ID) tworzy namespace pid, czyli mamy osobną przestrzeń procesów (zaczynamy od 0 itd, osobny `/proc` itd.) - `-u`: uts tworzy, namespace uts czyli ma swoje nazwę hosta i id systemu (chyba nawet wszystkie zmienne środowiskowe, ale nwm) - `-f`: fork spoko gdy tworzymy pid namespace. robi tyle że zamiast odpalać podany program jako nowy, forkuje z unshare'a i chyba jedyny plus że jak zabijemy unshare'a to wtedy dzieciok też ginie 2. `--mount-proc`: podajesz path do którego będziesz montować /proc (chyba?) 3. chroot - program który będziemy wywoływać - /target - nowy root - /bin/bash - komenda (można jeszcze do niej dodać argumenty) ### setns Robi że możesz jakiś program zrobić jako namespace (czyli np najpierw odpalasz basha a potem go robisz żeby był namespace'em) ### nsenter umożliwia użytkownikowi dołączenie do istniejącej przestrzeni nazw ### lsns listoranie aktualnych namespaceów ## Zrób sobie namespace ```bash= sudo debootstrap stable /target http://deb.debian.org/debian/ sudo unshare -impuf --mount-proc chroot /target /bin/bash mount -t proc proc /proc ps -ef mount ip link mount -l # pokaż punkty montażowe ``` ## Czemu PID=1 i PPID=0 No bo to pierwszy proces w nowym namespace'ie Dlatego też ma sens, że proc jest widoczny tylko w tym namespace'ie ## nsenter `nsenter - run program in different namespaces` ```bash= ps aux | grep /bin/bash # przykładowy wydruk root 31584 0.0 0.0 10064 4636 pts/0 S+ 15:33 0:00 sudo unshare -impuf --mount-proc chroot /target /bin/bash root 31585 0.0 0.0 10064 496 pts/1 Ss 15:33 0:00 sudo unshare -impuf --mount-proc chroot /target /bin/bash root 31586 0.0 0.0 5504 976 pts/1 S 15:33 0:00 unshare -impuf --mount-proc chroot /target /bin/bash root 31587 0.0 0.0 4188 3492 pts/1 S+ 15:33 0:00 /bin/bash gk 36905 0.0 0.0 6332 2076 pts/4 S+ 16:24 0:00 grep /bin/bash # widać, że chcemy ten proces 31587 więc # google podpoweidział, że trzeba tak, jak próbowałem mniej to coś nie śmigało i przejmował parametry z hosta idk # może że mieliśmy nie przepiniać wszystkiego i zobaczyć coś innego sudo nsenter -t 31587 -m -u -i -n -p -r -w /bin/bash # -m enter the mount namespace of the target process # -u enter the UTS namespace of the target process # -i enter the IPC namespace of the target process # -n enter the network namespace of the target process # -p enter the PID namespace of the target process # -r set the root directory to the root directory of the target process # -w set the working directory to the working directory of the target process ``` U mnie dało radę (to tworzy jako twój root - historia ta sama itp)  ```bash sudo nsenter -t <pid> -i -m -p -u /bin/bash ``` to co ty dałeś grzesiu to robi ci tą przestrzeń izolowaną co ty zrobiłeś wcześniej ## Co widzi druga powłoka? No to samo co widzi pierwsza, ten same namespace mounting pointy itd ## Jak ją widzi oryginalna? Jako kolejny proces # zad 2 ![image](https://hackmd.io/_uploads/Hk1dSGYV0.png) sudo cgset -r memory.max=16M mygroup ## czytanka ### cgroups (cum groups) mechanizm kontrolowania grup w jądrze (np cum) umożliwia ograniczanie zasobów dla grup procesów, co jest szczególnie przydatne w środowiskach, gdzie działa wiele procesów jednocześnie. ## cgroup_namespaces mechanizm przestrzeni nazw grup w systemie Linuksa. umożliwiają izolowanie grup zasobów pomiędzy różnymi przestrzeniami nazw, co pozwala na tworzenie własnych hierarchii ograniczeń zasobów dla procesów wewnątrz kontenerów, maszyn wirtualnych i innych środowisk izolacji # zad 3 ![image](https://hackmd.io/_uploads/ByFXtRlNC.png) ## systemd-cgls Recursively show control group contents ## systemd-cgtop show top for control groups ## systemd-nspawn spawnij coś synu ## systemd.resource-control Resource control unit settings ## wykorzystaj systemd-nspawn ```bash= sudo systemd-nspawn -D /target ```