# pingwinowanie 2*10 - 8 + 1
# zad 1

## 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

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

## 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
```