Рубрики
Конспект

Внутреннее устройство linux / Конспект

apt

apt install apt-file
apt-file search bin/7z
apt-file update
apt-file show 


strace

strace
witch -a date
dpkg -S /bin/date
dpkg -L coreutils
dpkg -s coreutils


Управляющие символы терминала: 
нотация   ввод     вывод         клавиши      код_символа код_символа
^C        intr       -           Ctrl+C         0x03         EXT
^        quit       -           Ctrl+         0x1c         FS
^        quit       -           Ctrl+4         0x1c         FS
^Z        susp       -           Ctrl+Z         0x1A         SUB
^D        eof        -           Ctrl+D         0x04         EOT
^?        erase      -           Backspace      0x7F         DEL
^?        erase      -           Ctrl+?         0x7F         DEL
^?        erase      -           Ctrl+8         0x7F         DEL
^H          -      backspace     Ctrl+H         0x08         Del
b          -      backspace     Ctrl+H         0x08         Del
^W        werase     -           Ctrl+W         0x17         ETB
^U        kill       -           Ctrl+U         0x15         NAK
^l          -      tab           TAB            0x09         HT
t          -      tab           Ctrl+I         0x09         HT
^M        eol      cr            Enter          0x0D         CR     
r        eol      cr            Ctrl+M         0x0D         CR
^j        eol      nl            Ctrl+j         0x0A         LF 
n        eol      nl            Ctrl+j         0x0A         LF 
^S        stop       -           Ctrl+S         0x13         DC3
^Q        start      -           Ctrl+Q         0x11         DC1
^R        rprnt      -           Ctrl+R         0x12         DC2
^V        lnext      -           Ctrl+V         0x16         SYN
^N          -      so            Ctrl+N         0x0E         SO
^O          -      si            Ctrl+O         0x0f         SI
^[        esc     esc            ESC            0x1B         ESC
e        esc     esc            ESC            0x1B         ESC
^[        esc     esc            Ctrl+[         0x1B         ESC
e        esc     esc            Ctrl+3         0x1B         ESC


!!! Обратите внимание на код символа / клавиши / ввод / вывод / натацию  !!!
!!! Многие действия можно сделать разными наборам нотация и клавиш !!!

Показать доступные символы для терминала:
stty -a 


whoami
strace -fe uname,getcwd,geteuid,sethostname whoami

hostname
strace -fe uname,getcwd,geteuid,sethostname hostname

pwd 
strace -fe uname,getcwd,geteuid,sethostname pwd

err
strace -fe uname,getcwd,geteuid,sethostname hostname springfield

date
ltrace -x *time*+fwrite date




Стандарты

Организация IEEE
IEEE 1003.1 POSIX.1 - интерфейс API операционной системы
IEEE 1003.2 POSIX.2 - интерфейс командной строки ОС (CLI)

Posix (Portable Operating System Interface)
SUS (Single UNIX Specification)

Телетайпы

ascii(7)
charset(7)
7 - семибитная кодировка

Управляющие символы:
CR - (carriage return) - Возврат головки к началу строки
BS - (back space) - Перемещение головки справа на лево
LF - (line feed) - Прокрутка бумаги  Начало новой строки
LN - (line new) - На новую строку
HT - (Horizantal tab) - На несколько символов вправо
SO - (shift out) - Изменят шрифт на мелкий
SI - (Shift in) - Изменяет шрифт на большой

Виртуальные терминалы:

Когда-то терминалы подключались с помощью RS232 и драйвера ttyS(), сейчас это экзотика.
Узнать к какому терминалу подключены вы используйте команду tty
tty
who
users
w

Переключение между терминалами на лакальном ПК
ALT + F1
ALT + F12
CTRL + ALT + F1

stty

tee

Команда tee используется для того, чтобы одновременно вывести данные на экран и записать их в файл. 
Это особенно полезно для сохранения вывода команды в файл без потери возможности видеть вывод в реальном времени.

Запись вывода команды в файл и отображение в терминале
echo "Hello, World!" | tee output.txt


Добавление данных в файл (с флагом -a)
echo "New line" | tee -a output.txt


Запись вывода команды в несколько файлов
echo "Multi-output" | tee file1.txt file2.txt

Использование tee с пайплайнами
ls -l | tee filelist.txt | grep ".txt"
echo -e "onentwonthree" | tee output.txt | wc -l

Использование с перенаправлением стандартного потока ошибок
ls /nonexistent /tmp |& tee output.txt
/pre> 




Управляющие последовательности: 
Посмотреть все:
infocmp

Задать:
tput smul
tput rev
tput srg0
tput smul | od -ac

Видосики в консоле ASCIIANSI:


ASCII-графика  ANSI-графигка
библиотеки caca и aalib
tty
setfont Uni1Vga8
mpv --quiet -vo caca https://www.yotube.com/что_топосмотреть
mplayer -quiet -vo aa:dim:bold:reverse $(youtube-dl -g https://www.yotube.com/что_топосмотреть)

Определить откуда запускается программа

whereis date
which date
type date

type -a date
type -a ls

Трассировка выполнения команд в bash

Для влечения достаточно выполнить:
set -x 

Для отключения: 
set +x 

Собственно чем отличается "-" "--"

- опция

-- специальная опция сигнализирует о конце списка опций, за которыми следуют лексемы, 
   расцениваемые как аргументы вне зависимости от их написания
   позволяют навести некий порядок

Справочные системы / MAN

whatis intro
whatis whatis
whatis apropos
whatis man

man -w man 


man -w passwd
   /usr/share/man/man1/asn1parse.1ssl.gz
   /usr/share/man/man1/passwd.1.gz
   /usr/share/man/man5/passwd.5.gz
man 5 passwd
man 1 passwd
man asn1parse 



Клавиши в man:
q - выход
h - справка
стрелки - переходы 
/ - поиск по регулярному выражению вперед
? - поиск назад
n - поиск вперед
N - повторить поиск в обратном направлении
G - в конец страницы
g - в начало страницы



help
help -d date
help -d cd 
help -d ls
help -d unset

Пользователи и группы:

UID - User Identifier
GID - Group Identifier

Узнать свой UID  GID
id

Передача полномочий:
su - switch user - переключится на пользователя
sudo - switch user do - контролируемая передача полномочий

su  - реализует повторную регистрацию в системе
sudo - реализует явные правила передачи полномочий описанных в файле "/etc/sudoers" и подтвердить передачу полномочий с помощью пароля пользователя

Пароли и пользователи группы в файле:
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow

Переменные окружения:

Посмотреть можно так:
env
printenv

Вывод env:
SHELL=/bin/bash     - текущий шел
HOME=/home/username - домашний каталог
LANGUAGE=           - язык 
LANG=en_US.UTF-8    - язык
PWD=/home/username/1 - текущий каталог
LOGNAME=username     - пользователь
USER=username        - пользователь
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin - где искать программы
LC_* - наборы переменных определяют другие языковые особенности
LC_TIME - определяет формат вывода даты
PAGER - указывает на программу для постраничного листания например на less / more
EDITOR - имя текущего редактора vim / nano
VISUAL - имя текущего редактора vim / nano
BROWSER - имя html просмоторщика
TERM - устанавливает имя терминала по которому программа использует управляющие символы ESC 

locale - список доступных локалей
locale -a 


Пример:
export LC_TIME=ru_RU.utf8
date 
export LC_TIME=en_US.utf8
date

Переменная PS1  (.bashrc)
Хранит настройки приглашения shell
alias ls='ls --color=auto'
PS1='[u@h W]$ '
u - имя зарегистрированного пользователя в системе 
h - короткое собственное имя компьютера
w - имя текущего каталога
$ - символ приглашения  ($ обычный  # root)
t - время
e - символ управления ESC
и т.д. см "man 5 terminfo"


printenv 
printenv TERM

infocmp


Файлы и каталоги:
.profile
.bashrc
.config
.ssh
.nanorc

Файлы и каталоги:

ls -l /bin/ls /dev/sda /dev/tty /sbin/halt
-rwxr-xr-x 1 root root 137920 Aug 30 14:57 /bin/ls
brw-rw---- 1 root disk   8, 0 Sep 19 11:53 /dev/sda
crw-rw-rw- 1 root tty    5, 0 Sep 25 11:28 /dev/tty
lrwxrwxrwx 1 root root      9 Sep 10 18:06 /sbin/halt -> systemctl

ls -la /run/systemd/notify 
srwxrwxrwx 1 root root 0 Sep  4 11:39 /run/systemd/notify
ls -la /run/systemd/inaccessible/fifo 
p--------- 1 root root 0 Sep  4 11:39 /run/systemd/inaccessible/fifo

- обычный файл
b - блочное устройство (block)
c - символьное устройство (character)
p - именованный канал (pipe)
s - сокет(socket)
l - символьная ссылка (link)

Вот так их можно найти файлы сокетов и именованных каналов 
find / -type p
find / -type

file  file_name - программа может показать что перед вами за файл, так как файл может быть текстовым или бинарным
stat file_name - подробная статистика о файле


Специальные файловые устройства:
/dev/sd* /dev/input/mouse* /dev/video* /dev/snd/pcm* /dev/dri/card*
crw-rw----+ 1 root video 226,  1 Sep 19 11:53  /dev/dri/card1
crw-rw----  1 root input  13, 32 Sep 19 11:53  /dev/input/mouse0
brw-rw----  1 root disk    8,  0 Sep 19 11:53  /dev/sda
brw-rw----  1 root disk    8,  1 Sep 19 11:53  /dev/sda1
brw-rw----  1 root disk    8,  2 Sep 19 11:53  /dev/sda2
brw-rw----  1 root disk    8,  3 Sep 19 11:53  /dev/sda3
brw-rw----  1 root disk    8, 16 Sep 19 11:53  /dev/sdb
brw-rw----  1 root disk    8, 17 Sep 19 11:53  /dev/sdb1
brw-rw----  1 root disk    8, 32 Sep 19 11:53  /dev/sdc
brw-rw----  1 root disk    8, 33 Sep 19 11:53  /dev/sdc1
brw-rw----  1 root disk    8, 48 Sep 23 15:34  /dev/sdd
brw-rw----  1 root disk    8, 64 Sep 23 15:56  /dev/sde
crw-rw----+ 1 root audio 116,  3 Sep 19 16:59  /dev/snd/pcmC0D0c
crw-rw----+ 1 root audio 116,  2 Sep 24 18:10  /dev/snd/pcmC0D0p
crw-rw----+ 1 root audio 116,  4 Sep 19 11:53  /dev/snd/pcmC0D2c
crw-rw----+ 1 root audio 116,  7 Sep 25 12:56  /dev/snd/pcmC1D3p
crw-rw----+ 1 root audio 116,  8 Sep 25 12:56  /dev/snd/pcmC1D7p
crw-rw----+ 1 root audio 116,  9 Sep 25 12:56  /dev/snd/pcmC1D8p
Устройства бывают  символьные c и блочные b


Рассмотрим строки:
brw-rw----  1 root disk    8,  0 Sep 19 11:53  /dev/sda
brw-rw----  1 root disk    8,  1 Sep 19 11:53  /dev/sda1
brw-rw----  1 root disk    8,  2 Sep 19 11:53  /dev/sda2
brw-rw----  1 root disk    8,  3 Sep 19 11:53  /dev/sda3
brw-rw----  1 root disk    8, 16 Sep 19 11:53  /dev/sdb
brw-rw----  1 root disk    8, 17 Sep 19 11:53  /dev/sdb1
brw-rw----  1 root disk    8, 32 Sep 19 11:53  /dev/sdc
brw-rw----  1 root disk    8, 33 Sep 19 11:53  /dev/sdc1
brw-rw----  1 root disk    8, 48 Sep 23 15:34  /dev/sdd
brw-rw----  1 root disk    8, 64 Sep 23 15:56  /dev/sde
Все драйверы ядра пронумерованы главными (major) числами (цифра 8), а под их  управлением дополнительные(minor) числа (0,1,2,3,16,17,32,33,48,64)

Еще в linux есть специальные устройства:
/dev/null - всегда пустое
/dev/full - всегда полное
/dev/zero - всегда бесконечно нулевое
/dev/random  - генератор псевдо случайных чисел
/dev/urandom - генератор псевдо случайных чисел

Именованные каналы и файловые сокеты:

IPC (InterProcess Communication)
Служат для обмена процессов и программ между собой.
Таким устройством могли бы стать и обычные файлы, но файлы служат для сохранения информации.

pipe они де FIFO-файлы(first in first out) / named pipe
socket

Основное отличие именованного канала от сокета состоит в особенности передачи данных.
Через именованный канал организуется однонаправленная (симплексная) передача без мультиплексирования,
а через сокет - двунаправленная (дуплексная) мультиплексированная передача. 

Именованный канал обычно работает по схеме "поставщик - потребитель" (producer-consumer)
Один потребитель принимает информацию от одного поставщика (на самом деле от многих но в разное время)
telinit
init
halt
reboot
shutdown
poweoff
/dev/initctl
/run/initctl

Сокет, схема работы "клиент - сервер" (client-server)
Один сервер принимает и отправляет информацию от многих ко многим (одновременно) клиентам.
cron
cupsd
logger
/dev/log
/run/systemd/journal/dev-log
systemd-journald

Файловые дескрипторы:

Системные вызовы:
open - открытие файла
read - чтение файла 
write - запись файла
close - закрытие файла 
ioctl - используется для управления драйвером устройств ioctl(input output control), применяется в основном для специальных файлов устройств


При запросе на открытие файла системным вызовом open производится его однократный  поиск (относительно медленный поиск) имени файла в дереве каталогов 
и для запросившего процесса создается так называемый файловый дескриптор(descriptor).
Файловый дескриптор содержит информацию, описывающую файл, например: индексный дескриптор inode файла  на файловой системе,
номера major и minor устройства, на котором располагается файловая система файла, режим открытия файла и прочую служебную информацию.
При последующих операция read и write доступ к самим данным файла происходит с использованием файлового дескриптора(что исключает медленный поиск файла).
Файловые дескрипторы пронумерованы и содержатся в таблице открытых процессом файлов, которую можно получить при помощи диагностической программы lsof.
Получить список процессов, открывающих файл, можно при помощи lsof и fuser
lsof
fuser

lsof -p $$

ls -la /dev/log
sudo lsof /run/systemd/journal/dev-log
sudo fuser  /run/systemd/journal/dev-log 
ps p 317

sudo lsof /var/log/syslog
ps up 354


Пример с локалью:
strace -fe open,openat,close,read,write,ioctl date 
file /etc/localtime
file /usr/share/zoneinfo/Europe/Moscow


Пример с сидюком, где только его взять в 2024году....
ls -la /dev/cdrom
strace -fe open,openat,close,read,write,ioctl eject

Пример с клавишей на клаве и ее светодиодом:
strace -fe open,openat,read,write,close,ioctl setleds -L +num +scroll

Файловые системы и процедура монтирования:

mount
mount /dev/cdrom  ~/mnt/cdrom
mount -t iso9660
lsblk -f /dev/cdrom


Сетевые файловые системы:

Файловый сетевой сервер NAS
Network Attached Storage

Протоколы:
NFS(Network File System)
CIFS/SMB (Common Internet file System и Server Message Block


mount -t nfs 10.1.1.1:/share/video /mnt/nas/video
mount -t -cifs -o username=guest //10.1.1.1/share/photos /mnt/nas/photos



Специальные файловые системы:

proc - информация о процессах, нитях и прочих сущностях ядра операционной системы 
и используемых ими ресурсах предоставляет программам в виде файлов псевдо файловая система proc

sysfs - информация об аппаратных устройствах, обнаруженных ядром операционной системы на шинах PCI, USB, SCSI и прочих,
предоставляет псевдо файловая система sysfs.

Пример программ которые используют псевдо файловые системы proc и sysfs:
uptime
ps
lsmod
lspci
lsusb
lsscsi

Проверка:
strace -fe open,openat uptime

cat /proc/uptime
cat /proc/loadavg


strace -fe open,openat lspci -nn

cat /sys/bus/pci/devices/0000:00:14.0/config
cat /sys/bus/pci/devices/0000:00:14.0/vendor
cat /sys/bus/pci/devices/0000:00:14.0/device
cat /sys/bus/pci/devices/0000:00:14.0/class
cat /sys/bus/pci/devices/0000:00:14.0/revision

Внеядерные файловые системы:

FUSE (Filesystem in userspace)

Это:
archivemount
sshfs
encfs
curlftpfs
fusermount

Прова доступа:

stat filename
id
chown
chgrp
usermod

базовые права:
read - 4 
write - 2
execute - 1 (execve)

Пример как это работает:
stat 1
    Access: (0644/-rw-r--r--)

chmod 421 1
stat 1
    Access: (0421/-r---w---x)

chmod 777 1
stat 1
    Access: (0777/-rwxrwxrwx) 


Семантика режима доступа для разных типов файлов:
файлы = r - читать файл 
        w - изменять файл 
        x - исполнять файл

каталоги = w - это значит что из каталога можно стирать файлы из списка
           r - право просмотра списка файлов имен файлов
           x - право прохода в каталог


chmod ugo + rwx filename
chmod ugo - rwx filename
user
group owner

chmod a= filename защитить файл от записи



Дополнительные атрибуты файлов:
s - Set user/group ID (SUID Set User ID или Set Group ID) -  атрибут не явного делегирования полномочий

Типичной задачей, требующей неявного делегирования полномочий, является проблема невозможности изменения пользователями своих учетных записей,
которые хранятся вдух файлах таблицах - passwd и shadow, доступных на чтение и запись только пользователем root,
однако пользователь может воспользоваться программой passwd для изменения своей учетной записи. 
passwd
chfn
chsh
ping 
traceroute
at
crontab



t - sTicky - липучка, атрибут ограниченного удаления
Служит для базового ограничения  записи(w) в каталоге, но только своих файлов. 
Например каталог tmp


Кому то этого было не достаточно и были придуманы еще ACL для файлов. POSIX.1e
ACL - access control lists
getfacl
setfacl
lsattr
chattr
a - append only (только добавление в файл)
i - immutalbe (не прикосаемый файл)
s - secure deletion
S - synchronous update

Прова по умолчанию
umask


Мандатные права пользователя:
DAC - (discretionary access control)


Модуль принудительного разграничения доступа AppArmor:
apparmor-utils
aa-status 


Модуль принудительного разграничения доступа SELinux
SElinux (Security Enhanced Linux)
sestatus

Что ты такое модуль управления принудительного разграничения доступа Astra Linux
PARSEC - обеспечение безопасности информационных потоков
pdp-id
pdp-ls -M

Программы и библиотеки

Программа представляет собой алгоритм, записанный на определенном языке, понятном исполнителю программы.
Различают машинный язык. понятный центральному процессору, и языки более высоких уровней (алгоритмические), понятные
составителю программы - программисту.

Алгоритмы - некий набор инструкций, выполнение которых приводит к решению конкретной задачи.

Согласно hier, откомпилированные до машинного языка программы размещаются в каталогах:
/bin
/sbin
/usr/bin
/usr/sbin
/usr/local/bin
/usr/local/sbin

А библиотеки в каталогах
/lib
/usr/lib
/usr/local/lib

Программы имеют специальный запускаемый формат ELF executalbe


ldd (Loader dependencies)
(SONAME. shared object name)
file /usr/bin/ls
ldd /usr/bin/ls

Стоит заметить:
Файла библиотеки linux-vdso.so.1 (реализующий интерфейс системных вызовов к ядру) не существует, 
так как он является виртуальной(VDSO, virtual dynamic shared object)

Для большинства библиотек зависимости устанавливаются с помощью SONAME вида libNAME.so.X
lib - стандартный префикс(library, библиотека)
.so - суффикс(shared object, разделяемый объект)
NAME - имя собственное
.X - номер версии ее интерфейса 

ld.so
ldconfig

Библиотеки имеют специальный запускаемый формат ELF shared object

Не стоит забывать что самой главной программой является Ядро linux
uname -r 
file /boot/vmlinuz



Модули ядра:
insmod
modprobe
rmmod
modinfo
lsmod
init_module 
delete_module
/proc/modules
lspci -k
lsusb -t

Процессы и нити:

fork - системный вызов порождение нового процесса
COPY - создает копию родительского процесса
exit - уничтожение процесса и завершение процесса
SIGCHILD - сообщение родительскому(parent процессу о завершении дочернего (child)
status - статус завершения от дочернего процесса
wait - родительский процесс ждет завершения дочернего
zombie - состояние дочернего процесса если он вдруг стал сиротой
clone - универсальный вызов позволяющий при порождении процесса, задать и указать общие ресурсы процессов, указать частные ресурсы и т.д.

Примеры:
dd if=/dev/cdrom of=plan9.iso &
ps f

find /usr/share/doc -type f -name '*.html' | xargs -n1 wx -l | sort -k 1 -nr | head 1 &
ps  fj
wait 

ps f -C postgres

ssh server
ps -f -C sshd

ps f -C apache2

ps fo pid,nlwp,cmd -C apache2

ps -fLc rsyslog

ps -fLC systemd



ls -lh plan9.iso
time bzip plan9.iso &
ps f
ps -fLp 5546
fg

ls -lh plan9.iso.bz2
time pbzip2 -d plan9.iso.bz2
time pbzip2 plan9.iso &
ps f 
ps -fLp 5572
fg 



tar czf docs.tgz /usr/share/doc &
ps f
fg 

strace -fe clone,clone3,fork,vfork,execve tar czf docs.tgz /usr/share/doc


pbzip2 plan9.iso &
strace -q -fe clone,clone3,fork,vfork,execve pbzip2 plan9.iso



Дерево процессов:

Процессы операционной системы принято классифицировать на системные (ядерные), демоны и прикладные, исходя из их назначения и свойств.

Прикладные процессы выполняют обычные пользовательские программы(man, ping, etc), для чего  им выделяется индивидуальная память, 
объём которой указан в столбце VSZ вывода команды ps. Такие процессы обычно интерактивно взаимодействуют с пользователем
посредством управляющего терминала(исключение графические программы), указанного в столбце TTY вывода программы ps.


Демоны, процессы класса демоны(daemons) выполняются системные программы, реализующие те или иные службы операционной системы.
Например: cron, sshd, rsyslogd, systemd-udevd. У них отсутствует управляющий терминал в столбце TTY  вывода программы ps.
Зачастую демоны имеют суффикс d в конце названия.


Ядерные процессы, процессы ядра, выполняются параллельные  части ядра операционной системы. 
У них нету индивидуальной виртуальной памяти VSZ, ни управляющего терминала TTY в выводе программы ps.
Более того ядерные процессы не выполняют отдельную программу, загружаемую из ELF файла,
поэтому их имена COMMAND являются условными и изображаются в квадратных скобках,
и имеют особое состояние I в столбе STAT вывода программы ps.
Ядерные нити выполняются в общей памяти ОС.

ps faxu
ps -uaxf
pstree -cnAhT


Маркеры доступа:

Возможность процесса по отношению к объектам, доступ к которым разграничивается при помощи дискреционных механизмов, 
определяются значение его атрибутов, формирующих  его DAC-маркер доступа.
Атрибуты: RUID, RGID, EUID, EGID.
man 7 credentials
man -k credentials

id

ps fo euid,ruid,egid,rgid,user,group,tty,cmd

who

ls -la /etc/shadow /dev/tty2 /dev/tty3 /dev/pts/ptmx

ls -la /usr/bin/passwd /usr/bin/wall
ls -ln /usr/bin/passwd /usr/bin/wall

ps ft pts/1,pts/2 o pid,ruid,rgid,euid,egid,tty,cmd



Для selinux
id -Z
ps Zf
sesearch -T -t dhcpc_exec_t -c process
ls -Z /usr/sbin/dhclient
ps -ZC dhclient



cababilities
CAP_SYS_PTRACE  - эта привилегия позволяет процессам трассировщикам strace и ltrace, использующих системный вызов ptrace, трассировать программы
CAP_SYS_NICE - привилегия позволяющая менять приоритет процесса (nice)
CAP_KILL - привилегия позволяет посылать сигналы процессам
CAP_FOWNER - привилегия позволяет процессам изменить режим доступа, мандатную ветку, флаги, атрибуты
CAP_LINUX_IMMUTABLE  - управления флагами i (immutable) и a(append)
CAP_SETFCAP - устанавливать флаговые привилегии
CAP_NET_RAW - создание необработанных (raw) и пакетных (packet) сокетов

ps fo user,pid,cmd -C NetworkManager,postgres,apache2,systemd
getpcaps 1221

getcap /bin/ping
setcap cap_net_raw+ep /bin/ping


Пример как дать права для шарка:
tshark
strace -fe execve tshark 
getcap /usr/bin/dumpcap
setcap cap_net_raw+ep /usr/bin/dumpcap
tshark -i eth0


Другие атребуты:
ps fe
ps fx
pwdx ID
pwdx 1235

Распределение процессора между процессами:

Переключением центрального процесса между задачами (процессами и нитями) 
выполняет специальная компонента подсистемы управления процессами
называемая планировщиком (scheduler)

Именно планировщик определенным образом выбирает из множества неспящих, готовых к выполнению(runable) задач одну,
которую переводит в состояние выполнения (running).
Выбор задачи происходит естественным образом, когда текущая выполнявшиеся задача переходит в состояние сна(sleep)
Ещё существуют вытесняющие алгоритмы планирования, которые ограничивают непрерывное выполнения задач,
принудительно прерывают ее выполнение по исчерпании выданного ей кванта времени(timeslice) и 
вытесняется она во множество готовых, после чего производит выбор новой задачи, подлежащей выполнению.

Для пользователей применяется алгоритм  CFS(completely fair scheduler)
Согласно которому процессорное время  распределяется между  неспящими задачами справедливым (fair) образом.

Для двух задач с равным приоритетом должно быть выделено 50%.

приоритеты называется любезностью:) NICE
-20 ... +19
-20 сделать немедленно, сейчас же (выдается больше всего процессорного времени)
+19 делать неспеша

При отсутствии конкуренции за процессорное время, приоритет не будет играть никакой роли.

Инфа о cpu:
nproc
lsclpu

Пример управления приоритетом:
bzip2 --best -kf plan9.iso &
bzip2 --best -kf plan9.iso &
ps fo pid,pcpu,pri,ni,psr,cmd

renice +10 ID_process
renice +10 1234

ps fo pid,pcpu,pri,ni,psr,cmd


taskdet -p 3 1222

nice -n 5 time  bzip2 --best -kf plan9.iso &
nice -n 15 time  bzip2 --best -kf plan9.iso &
ps fo pid,pcpu,pri,ni,psr,cmd
wait

Другие планировщики:
FIFO (First in First out)- выполняет задачи пока не завершит
RR (Round Robin) - выполняет задачи по очереди  чуть одна чуть другая  PQ (Priority Queue)
EDF ( Earliest Deadline First) - Алгоритм гарантирует выполнение задачи и не позволяет ее вытеснить пока она выполняется.

Политики планирования:
SCHED_OTHER, SCHED_BATHC, SCHED_IDLE - CFS
SCHED_FIFO, SCHED_RR - FIFO, RR
SCHED_DEADLINE - EDF

taskset - позволяет привязать процесс к одному потоку процессора
chrt - смена алгоритма шедулера

Пример смены планировщика:
ps -f 
chrt -b 0 time bzip2 --best -kf plan9.iso & 
chrt -o 0 time bzip2 --best -kf plan9.iso & 
chrt -i 0 time bzip2 --best -kf plan9.iso & 
ps fo pid,pcpu,class,pri,ni,psr,cmd

ps -f 
chrt -pr 99 ID_PROCESS
ps fo pid,psr,cls,ni.pri,pcpu,comm

chrt -r 1 taskset -c 2 bzip2 --best -kf plan9.iso & 
chrt -r 1 taskset -c 2 bzip2 --best -kf plan9.iso & 
ps fo pid,psr,cls,ni,ori,pcpu,comm

chrt -r 2 taskset -c 2 bzip2 --best -kf plan9.iso & 
ps fo pid,psr,cls,ni.pri,pcpu,comm

top -b -n1 -p ID,ID,ID
top -b -n1 -p 123,321,555



Ввод и вывод

Планировщики ввода и вывода
SCAN, C-SCAN, LOOK, C-LOOK....
I/O scheduler

Сортировка(sorting)
Слияние(mergiring)

Планировщик deadline один из первых для работами с операциями ввода и вывода.
mq-dedline
CFQ
BFQ
kyber -  современный

Посмотреть какой у вас планировщик для дисков:
cat /sys/block/{sda,sdb,sr0}/queue/scheduler
cat /sys/block/sda/queue/scheduler


Пример:
findmnt -T 
cat /sys/block/sda/queue/scheduler
dd if=/dev/urandom of=big1 bs=16384 count=1024
dd if=/dev/urandom of=big2 bs=16384 count=1024
sync
dd if=big1 of=/dev/null iflag=direct &
dd if=big2 of=/dev/null iflag=direct &
wait

ionice -c best-effort -n 7 dd if=big1 of=/dev/null iflag=direct &
ionice -c best-effort -n 0 dd if=big1 of=/dev/null iflag=direct &
wait -n 
wait -n 

Память:

Управление памятью - механизм страничного отображения - MMU
MMU - (Memory Management Unit, Блок управления памятью) 
Процессы работают с виртуальными адресами воображаемой памяти (virtual address),
отображаемым устройством MMU на физические адреса (physical address) настоящей оперативной памяти.
Для отображения оперативной памяти RAM(random access memory) условно разбивается на гранулы по 4Кбайт,
которые выделяются процессам.

Память процесса состоит из:
страниц (page)
специальных таблиц (page table)
сопоставленные выделенные страничные кадры (page frame)

ps fux
вывод в килобайтах
VSZ (virtual size) - суммарный объём всех страниц процесса (в том числе и выгруженных) 
RSS (resident set size) - суммарный объём всех его страничных кадров в оперативной памяти, т.е. реальное потребление


системные вызовы mmap/munmap, mlock, mprotect, msync, madvise


COW - cppy-on-write - любые попытки изменения (write) приводят к созданию их копии(copy), куда попадают изминения

ps fux
pmap -d PID
pmap -d 775
pmap - покажет память процесса

ldd /usr/bin/hostname
strace hostname


top 
для добавления столбика с SWAP нажмите "g 3" а после "f"

top -p $$


free -mw - статистика использования памяти


Пример:
dd if=/dev/urandom of=big bs=4069 count 262144
ld -lh big
free -mw
vi big
pd -f 
free  -mw
top -b -n1 -p enter_PID_vi
kill enter_PID_vi
free -mw


Механизмы сигналов

man signal
man -k signal
man kill

kill - команда отсылки сигналов

Ctrl + C - вызывает kill для выполняемой команды в консоли (SIGINT)

stty -a - покажет сигнал ^C и другие возможные сигналы в текущей консоли

Пример
dd if=/dev/zero of=/dev/null
Ctrl+c
^C

А если мы запустим это в фоне
dd if=/dev/zero of=/dev/null &
jobs
jobs -l
kill -SIGINT enter_PID_jobs
Но такой сигнал убьет процесс без сохранения данных на диск

А если хочется сохранить данные SIGQUIT №3
dd if=/dev/zero of=/dev/null &
jobs -l
kill -SIGQUIT  enter_PID_jobs
^Quit 

Для некоторых процессов и демонов не возможно послать сигнал ^C и ^ но возможно послать SIGTERM №15
dd if=/dev/zero of=/dev/null &
kill -SIGTERM enter_PID_jobs


Есть специальные сигналы для приостановки(№19 SIGSTOP) работы и возобновления(SIGCOUNT №18):
bzip2 big &
top -b -n1 -p enter_PID_bzip2
kill -SIGSTOP enter_PID_bzip2
ps -f 
jobs -l
top -b -n1 -p enter_PID_bzip2
kill -SIGCOUNT enter_PID_bzip2
top -b -n1 -p enter_PID_bzip2


Самый наверно страшный сигнал №9 SIGKILL
Не желательно его использовать бездумно
Чаще всего приводит к созданию зомби
безусловное завершение процесса


Есть еще сигнал безусловной приостановке №19 SIGSTOP


kill -l покажит все возможные сигналы


dc - стековый калькулятор поможет преобразовывать из dec в hex и двоичный
dc -e 26i3o00484004p


Также процесс можно приостановить клавишами Ctrl+s 
Возобновить Ctrl+q

bg  - такой командой продолжить выполнение в фоне
fg - вытащить команду из фона 

Межпроцессорное взаимодействие

IPC (iter-process communication)- средства межпроцессорного взаимодействия
Применяются каналы, сокеты, очереди сообщений и разделяемая память
Синхронизация действий процессов над совместно используемыми объектами - семафоры. 

Неименованные каналы
Самый простой обмен между информацией между родственными процессами (родитель и любой потомок)
Два дескриптора: 
первый передача (записи) в канал
второй   прием (чтения) из канала
Пример:
strace -fe pipe,execve tar cjf /tmp/docs.tgz /usr/share/doc
^Z  (Ctrl+z)

ps -f 
lsof -p enter_PID_tar


Именованные каналы
Именованные каналы повторяют поведение неименованных каналов, 
но предназначены для обмена информацией между неродственными процессами.
Именованные каналы используются крайне редко.
Пример:
ls -l /run/initctl /dev/initctl
lsof /run/initctl


Неименованные локальные сокеты
Именованные каналы = поставщик-> потребитель (односторонний обмен)
Сокет = клиент <-> сервер (двух сторонний обмен)
Сокет - устоявшиеся русская калька с англ. socket, буквально означающая "разъём", например,
220-вольтовые розетку и вилку, или сетевую розетку и вилку RJ-45, или 3.5гнездо для наушников и соответствующий штекер.
Пример:
strace -fe socketpair, execve rsync -a /usr/share/doc /tmp/a
ps f
lsof -p enter_PID_rsync 


Именованные локальные сокеты
Наличие имени канала и сокета
Многие системные сервисы linux  как раз используют именованные локальные сокеты.
Пример: systemd, x-windows-system, wayland, d-bus, wi-fi
Терминальные мультиплексоры screen и tmux
tty
screen
tty
Ctrl+A C

tty
ps fp  enter_PID_screen t pts/1,pts/2
screen ls 
screen -r


Разделяемая память, семафоры и очереди сообщений
ipcs
ipcs -m -p
dc -e enter_ipcs_string
ps up PID
pmap PID

fuser -v /var/cache/nscd/hosts
pmap PID

findmnt /dev/shm
fuser -v /dev/shm/*
ps p PID,PID,PID
pmsp -p PID



Семафоры и очереди сообщений
ipcs -q
ipcs -s 
findmnt /dev/mqueue
ls -l /dev/mqueue
ls -l /dev/shm/sem.*

Программирование:

Интерпретаторы и их сценарии:
ash, dash, ksh, bash, zsh, fish

Языки:
perl, python, tcl

Универсальный комментарий в начале скрипта именованный shebang.
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/python


Примеры:
file /bin/fgrep
head -1 /bin/fgrep
file /bin/gunzip
head -1 /bin/gunzip
file /bin/lsb_release
head -1 /bin/lsb_release
file /usr/bin/mimetype
head -1 /usr/bin/mimetype
file /usr/bin/netwag
head -1  /usr/bin/netwag

printenv PATH
pwd



Встроенные и внешние команды 
which -a cd 
type -a cd 
which -a pwd
type -a pwd

Перенаправление потоков ввода-вывода

0 - Стандартный ввод (stdin) — поток данных, который программа получает на вход (по умолчанию — клавиатура).
1 - Стандартный вывод (stdout) — поток, в который программа записывает результаты (по умолчанию — терминал).
2 - Стандартный поток ошибок (stderr) — поток, куда выводятся сообщения об ошибках (по умолчанию — терминал).

Перенаправление stdout:
Оператор > позволяет записать вывод команды в файл. Если файл существует, он будет перезаписан.
ls > output.txt

Оператор >> добавляет вывод в конец файла, не перезаписывая его.
echo "Hello" >> output.txt

Чтобы перенаправить поток ошибок в файл, используется 2>.
ls /nonexistent 2> errors.txt

2>> добавляет ошибки в конец файла:
ls /nonexistent 2>> errors.txt


Перенаправление stdout и stderr вместе
Можно объединить выводы стандартного вывода и ошибок в один файл с помощью &>.
ls /nonexistent &> all_output.txt

Также можно использовать > file 2>&1, где 2>&1 указывает, что stderr перенаправляется туда же, куда и stdout:
ls /nonexistent > all_output.txt 2>&1


Перенаправление ввода (stdin)
Оператор < позволяет передать данные в команду из файла.
wc -l < input.txt

Конвейеры (Pipelines)
Конвейер | позволяет направить вывод одной команды на вход другой.
ls / | grep "home"



Специальные случаи перенаправления
Удаление вывода — отправка вывода в "черную дыру" (файл /dev/null), где он просто исчезнет:
ls /nonexistent > /dev/null 2>&1
Перенаправление файловых дескрипторов:
В Bash файловые дескрипторы можно перенаправлять с помощью конструкции n>file (где n — номер потока).
Например, 3>file откроет дескриптор 3 для записи в файл file.
Heredoc (встраивание многострочного текста)
cat < output.txt 2> errors.txt 

Чтение из файла и отправка результата в другой файл:
grep "pattern" < input.txt > output.txt

Игнорирование ошибок:
command 2> /dev/null

Запись вывода и ошибок в один файл:
command > output.txt 2>&1

Раздельная запись stdout и stderr:
command > output.txt 2> errors.txt

Отправка всех данных в «черную дыру»:
command > /dev/null 2>&1

Арифметические действия:

set -x
RADIUS=10
CIRCLE=`expr 2 * $RADIUS * 355 / 113`

set -x 
let CIRCLE=2*RADIUS*355/113; echo $CIRCLE


CIRCLE=$((2 * RADIUS * 355/113)) 

Экранирование:

ls -l

file Рабочий стол
file "Рабочий стол"
file 'Рабочий стол'

find . -name *.gz
set -x 
find . -name "*.gz"

" " - слабое игнорирование (не распространяется на метасимволы ` $ )
'' - сильное экранирование, экранирует любые символы

Список команд:

command1 ; command2 ; command3 ; command4  - простой синхронный
command1 & command2 & command3 & command4 - простой асинхронный 

command1 && command2 && command3 && command4 - условный список команд И (следующая команда выполняется если предыдущая выполнилась успешно)
command1 || command2 || command3 || command4 - условный список ИЛИ (следующая команда выполняется если не выполнилась предыдущая)

Составные списки / test / условия

whict test
which [
type -a test


этот тест возвращает 0 если нет ошибок
test -f /etc/passwd
echo $?

этот тест возвращает 0 если нет ошибок
[ -w /etc/passwd ]
echo $?

проверяем блочное устройство сдром. если диска нет , открываем лоток
[ -b /dev/cdrom ] && eject /dev/cdrom


Составной список if
if [!] list; then list; [elif [!] list; then;] ... [else list;] fi

if test -b /dev/csrom; then eject /dev/cdrom; fi


if [[ "$some_variable" == "good input" ]]; then
  echo "You got the right input."
elif [[ "$some_variable" == "ok input" ]]; then
  echo "Close enough"
else
  echo "No way Jose."
fi


! - нет/не
&& - и
|| - или
-lt - меньше, применяется в квадратных скобках []
-gt - больше, применяется в квадратных скобках []
 
[[ Двойные квадратные скобки ]] работают в целом так же, как и [одинарные квадратные скобки], 
но имеют дополнительные возможности вроде лучшей поддержки регулярных выражений.
 
(( Двойные круглые скобки )) это конструкция, позволяющая осуществлять арифметические вычисления внутри Bash. 
 
Пример:
if [[ "$name" == "Ryan" ]] && ! [[ "$time" -lt 2000 ]]; then
  echo "Sleeping"
elif [[ "$day" == "New Year's Eve" ]] || [[ "$coffee_intake" -gt 9000 ]]; then
  echo "Maybe awake"
else
  echo "Probably sleeping"
fi

Порой вам встретятся двойные квадратные скобки, как в примере выше. 
А порой они будут одинарными:
if [ "$age" -gt 30 ]; then
  echo "What an oldy."
fi
 
Иногда могут быть и круглыми:
!!! обрати внимание на age, это переменная и оформлена без ${age}
if (( age > 30 )); then
  echo "Hey, 30 is the new 20, right?"
fi
 
А может и не быть:
if is_upper "$1"; then
  echo "Stop shouting at me."
fi
 
Что происходит на самом деле:
if ANY_COMMAND_YOU_WANT_AT_ALL; then
  # ... stuff to do
fi

Пример 0, скрипта iftst_v1:
#! /bin/sh
# Пример iftst_v0
if test $# -ne 2; then
 echo "Команде должно быть передано ровно два параметра!"
 exit 1 
else
 echo "Параметр 1: $1. Параметр 2: $2" 
fi


Пример for в файле:
for variable in list
do
    commands
done
 
Пример for в командной строке:
for variable in list ; do commands ; done
 
Пример использования for в командной строке:
$ ls
filemgr.png  terminal.png
$ for f in *.png ; do mv $f screenshot-$f ; done
$ ls
screenshot-filemgr.png  screenshot-terminal.png

Пример:
for i in a b с; do echo $i; done 

Пример:
#! /bin/sh
for i in a b c; do 
 echo $i 
done


case

case word in [ [(] pattern1 [| pattern2]... ) list ;;]... esac

ключевые словами case, in, esac
признак окончания ветви ;;

#!/bin/bash
# Скрипт, который использует конструкцию case
# переменная, значение которой сравнивается с набором значений
num=2
case $num in
    1)
    echo "num = 1"
    ;;
    2)
    echo "num = 2"
    ;;
    3)
    echo "num = 3"
    ;;
esac
 
echo "Конец программы"
exit 0



#!/bin/bash
echo "Какой цвет вам нравится больше всего?"
echo "1 - синий"
echo "2 - Красный"
echo "3 - Желтый"
echo "4 - Зеленый"
echo "5 - оранжевый"
read color;
case $color in
    1) echo "Синий - основной цвет.";;
    2) echo "Красный - основной цвет.";;
    3) echo "Желтый - основной цвет.";;
    4) echo "Зеленый - вторичный цвет.";;
    5) echo "Оранжевый - вторичный цвет.";;
    *) echo "Этот цвет недоступен. Пожалуйста, выберите другой.";; 
esac


#!/bin/bash
# Скрипт, который использует конструкцию case
# переменная, значение которой сравнивается с набором значений
num=2
case $num in
    1|2|3)
    echo "num равно или 1 или 2 или 3"
    ;;
    4)
    echo "num равно 4"
    ;;
    *)
    echo "Неизвестное значение"
    ;;
esac
 
echo "Конец программы"
exit 0

for / while / until


for name in [ words ...]; do list; done
и циклы с условием "ПОКА"

while [!] list; do list; done
и "ДО"

until [!] list do list; done
с ключевыми словами for, in, while, until, do, done


for node in $(seq 1 254); do ping -c 1 -W 1 192.168.1.$node; done

while ! ping -c1 -w1 8.8.8.8 ; do sleep 1; date; done
until ping -c1 -w1 8.8.8.8 ; do sleep 1; date; done

Инструментальные средства обработки текста

Базовые регулярные выражения
? - Любой символ
* - Любое количество любых символов (в том числе ни одного), но не *-файлы!
** - Любые файлы и каталоги, в том числе из всех подкаталогов (начиная с версии bash 4.0 — shopt -s globstar)
[abc] - Один из символов, указанных в скобках
[a-f] - Символ из указанного диапазона
[!abc] - Любые символы, кроме тех, что указаны в скобках
[^аЬс] - Аналогично предыдущему
~ - Сокращенное обозначение домашнего каталога
. - Текущий каталог
.. - Каталог на один уровень выше

echo ab{l,2,3} - Возврат abl аЬ2 аЬЗ
echo a{1..4} - Возврат al а2 аЗ а4
echo $[3*4] - Арифметические вычисления

`команда` - Замена команды результатом ее выполнения
$(команда) - Вариант, аналогичный предыдущему

echo $? - вернет с каким результатом завершилась предыдущая команда (0 - нет ошибок)

Команда "символ" - Отмена интерпретацию любых специальных символов, кроме $
Команда 'символ' - Похоже на предыдущий вариант, но с большими ограничениями (не допускает подстановки переменных)

? - любой одиночный символ в шаблоне
* -  любое количество любых символов в шаблоне

. - любой одиночный символ в регулярном выражении
.* - любое количество любых символов в регулярном выражении


grep '^[^#]' /etc/wgetrc
grep [^0-9][0-9][0-9][^0-9] /etc/services

Сетевая подсистема:

lspci 
lspci -ks 02:00.1

modinfo iwlwifi e1000


ifconfig -a
ip link show

ip addr show dev wlp2s0

lsmod
Просмотр статистики по соединениям IPv4:
netstat -4autpn
netstat -4atupn
ss -4atupn

ss -4atplnu

Назначение IP адреса:
ifconfig eno1 10.0.10.10 up
ifconfig eno1
ping -c 1 10.0.0.10


ipaddress add 172.16.16.172/16 dev eno1
ipaddress show dev eno1
ping -c1 172.16.16.172


Маршрутизация:
Добавление маршрута по умолчанию:
ip route add 0.0.0.0/0 via 10.0.0.1

Показать таблицу:
route -n
ip route show 

Диагностика:
traceroute -m 50 bad.horse

Автоматическая настройка сети:
pgrep NetworkManager
lsof -w +E -p ID_NetworkManager -a -U
strace -fe connect nmcli general

Проводная сеть:
nmcli dev
nmcki dev show enp0s25
nmcli con
nmcli conn add type ethernet ifname enp0s25
nmcli conn
nmcli conn up ethernet-enp0s25
nmcli dev show enp0s25

ip a show dev enp0s25
ip route show

Беспроводная сеть:
nmcli dev wifi rescan
nmcli dev wifi list
nmcli con add type wifi ifname wlp2s0 ssid SSID_NAME

nmcli dev show wlp2s0
ip a show dev wlp2s0


nmcli --ask dev wifi connect SSID_NAME
nmcli conn show

WPA cli:
pgrep wpa_supplicant
lsof +E -p ID_Wpa_supplicant -a -U
strace -fe connect wpa_cli -i wlp2s0 status

wpa_cli -i wlp2s0 status
wpa_cli -i wlp2s0 scan
wpa_cli -i wlp2s0 scan_results
wpa_cli -i wlp2s0 list_networks
wpa_cli -i wlp2s0 add_network
wpa_cli -i wlp2s0 select_network 1
wpa_cli -i wlp2s0 list_networks


VPN:
nmcli con edit type vpn

Служба имен и DNS/mDNS-резолверы


Отображение имен
Name service switch configuration
/etc/nsswitch.conf

Соответствующие модули libnss_*.so.

Номера портов
/etc/services
libnss_db.so.2

Примеры:
grep hosts /etc/nsswitch.conf
grep services /etc/nsswitch.conf
find /lib/ -name 'libnss_*'

Файловые таблицы имен:
/etc/hosts
/etc/services

Примеры:
cat /etc/hosts
grep http /etc/services
getent hosts ubuntu
getent services 53/udp

Резолверы:
sytemd-resolved
cat /etc/resolv.conf

Примеры:
ss -4autpn sport = :53
getent hosts ya.ru
host ya.ru
host 8.8.8.8

resolvectl dns

ss -4autpn spot = :5353
avahi-browse -arcl


avahi-resolve --name h1.local
geten hosts h2.local

Сетевые службы ssh



Для удаленного доступа были программы rlogin, rsh, telnet, и данные передавались в открытом виде, не было шифрования.
Служба ssh предназначена для организации безопасного (secure) доступа к сеансу командного интерпретатора (shell) удаленных сетевых узлов.

SSH 
Конфиденциальность (плюс целостность) передаваемых данных. 
Обеспечивается при помощи симметрического шифрования с помощью общего сеансового ключа.

Аутентичность (подлинность) взаимодействующих сторон.
Сеансовый ключ устанавливается обеими взаимодействующими сторонами при помощи 
асимметричного алгоритма открытого согласования ключей протокола Диффи-Хелмана.

MITM (man in the middle) - атака 

Пример:
ssh user@namehost.local
ssh user@192.168.0.124

uname -a
whoami
tty
logout

ssh user@192.168.0.124 uptime


Входы без пароля
ssh-keygen
ssh-copy-id user@192.168.0.124


Копирование:
scp file_name user@192.168.0.124:

sftp user@192.168.0.124

rsync -avzr user@192.168.0.124:/home/user/file.txt .

sshfs


LDAP

https://pro-ldap.ru

Системные вызовы open, read, write, close

LDAP (Lightweight Directory Access Protocol)
DIT (Directory Information Tree)

LDAP состоит в использовании принципа ООП (объектно-ориентированного проектирования), согласно которому
индивидуальные записи каталога (entries) являются объектами, т.е. экземплярами классов (class),
в свою очередь описывающих обязательными (must) и возможные (may) атрибуты (свойства) объектов.

Так, класс для описания персональных данных (objectClass: person) требует,
что бы его конечный экземпляр обязательно содержит атрибут sn (surname, фамилия) и cn (common name), 
и позволяет содержать атрибут telephoneNumber.

А класс для описания свойств учетных записей (ojectClass: posixAccaunt) требуют наличия атрибутов uid (user identifier),
что на деле является "именем" учетной записи, uidNumber, 
gidNumber (UID и GID учетные записи) и homeDirectory (домашний каталог пользователя)
и позволяет (если нужно) содержать атрибуты, такие как userPassword и loginShell.

Надо заметить, что принадлежность объекта к тому или иному классу тоже является атрибутом с именем ojectClass, 
принадлежащему классу с названием top.

Само дерево записей LDAP-каталога организуется универсальным образом.
В LDAP при построении дерева на любом уровне для различия (distinguish) сущностей (записей) 
может быть произвольно любой из атрибутов любых объектов, названных выше, например uid.

Относительно отличимые имена RDN (realtive distignuished name)
состоящих из имен атребута, uid=testla или uid=enstein

Аналогично FQDN в системе DNS записываются справа налево.
Для разделения имен в DNS используется точка "."
www.google.com

Почти также делается в LDAP но для разделения сущностей используется запятая
objectClass: dcObject 
dc (Domain commponent)
dc=www, dc=google, dc=com


ldapsearch -LL -H ldap://ldap.forums.com -x -b "" -s base
ldapsearch -LL -H ldap://ldap.forums.com -x -b "" -s base mamingContexts
-b "" - пустой фильтр
-s base - запрос адресуется только к этому имени (-s scope)

ldapsearch -LLL -H ldap://ldap.forumsys.com -x -b dc=example,dc=com -s sub dn
ldapsearch -LLL -H ldap://ldap.forumsys.com -x -b dc=example,dc=com objectClass=posixAccaunt dn

ldapserach -LL -H ldap://ldap.forumsys.com -x -b uid=tesla,dc=example,dc=com -s base

Сетевые утилиты

tcpdump -i wlp2s0 port 53

hots ya.ru

tshark -i wlp2s0 -V -O http,data-text-lines -Y http port 80

curl https://ya.ru


nmap -n -vvv -reason 192.168.0.1

pgrep lftp

lsof -i 4 -a -p 6056

ss -p dport = :ftp

strace -f trace=network curl http://www.gnu.org/graphics/agnuheadterm-xterm.txt

cd /usr/share/doc
strace -fe trace=network python2 -m SimpleHTTPServer
wget http://localhost:8000

X windows system

X-server и  X-client - рисует окна

Как любая другая сетевых служба, оконная система X состоит из X-сервера и X-клиентов,
взаимодействующих между собой посредством "X протокола"

X-сервер
Основная задача которого заключается в управлении оборудованием графического вывода и ввода.
Под управлением X-сервером находится графические дисплеи (видеоадаптеры и подключенные к ним мониторы), устройства ввода и вывода.
Именно X-сервер принимает подключения от X-клиентов.

Смотрим:
pgrep -l Xorg
ps o pid,tty,cmd p PID_ID_process

lsof -p PID_ID_process -a /dev
lsof -p PID_ID_process -a -U
lsof -p PID_ID_process -a -i

xdpyinfo | grep -A 4 screen

X-клиенты и X-протоколы

X-клиенты всегда создают хотя бы одно окно

xdpyinfo
xrandr - поворот экрана
glxifo
xlsclients
xwininfo - список созданных окон
xprop
Xnest
Xephyr

Примеры:
xwininfo -tree -root | grep gnome-terminal
xwininfo id 0x2aaasdasda | grep Map
xwininfo id 0x2aaasdasda | egrep 'Map|Width|Height'

xprop -id 0x2a00001 | grep ^WM_
     WM_NAME - текст заголовка отображаемых окон
     WM_CLIETN_MACHINE - имя узла сетевого узла X-клиента
     WM_COMMAND - отображает команду, при помощи которой был запущен клиент

xlsclients -l | grep -C 3 gnome-terminal



Взаимодействие X-клиентов и X-сервера происходит при помощи локальных или сетевых сокетов 
в зависимости от их взаимного местоположения и согласно адресу подключения, 
указываемому на стороне X-клиентов при помощи переменой окружения DISPLAY в host:number

В случае сетевого:
DISPLAY=ubuntu.local:0
DISPLAY=192.168.0.100

В случае локального:
DISPLAY=:0


Примеры:
Xnest :0
Xnest :listen tcp &
lsof -p 10950 -a -i 
lsof -p 10950 -a -U 
xeyes
DISPLAY=:1 strace -fe connect xeyes
DISPLAY=ubuntu.local:1 strace -fe connect xeyes

Оконные менеджеры:

Оконные менеджеры - позволяют манипулировать окнами.
Примеры оконных менеджеров: 
twm - один из самых первых
olvm
mwm
IceWM

Настольные пользовательские окружения:

Манипулируют и рисуют и есть свои программы.
GNOME - gnome-session(менеджер сеансов) и gnome-shell(оконный менеджер в свою очередь запускает его dbus-launch)
KDE - startkde(сценарий), ksmserver(менеджер сеансов), kwin(оконный менеджер)
XFCE
LXDE

В современных версиях практически безальтернативно используется D-Bus для взаимодействия с окнами и между окнами.

Библиотеки интерфейсных элементов:

сам X-server умеет рисовать примитивы, точки круги и т.д.
для более сложных используются специальные библиотеки
widget
Xaw
Xview
Motif
Tk
Qt
Xrender
Xlib

Современные это Qt и Gtk, на основе их разрабатывают KDE и GNOME

Пример как посмотреть доступные библиотеки:
ldd $(which xeyes) | grep -i libX
ldd $(which mwm) | grep -i libXm
ldd $(which wish) | grep -i libtk
ldd $(which gnome-shell) | grep -i libgtk
ldd $(which kcacl) | grep -i libqt.gui

Wayland

замена X серверу


Контейнеры и виртуальные машины:


Чрутизация:
Самым древним средством изоляции, известным со времен классической ОС UNIX,
является системный вызов chroot, позволяющий назначить процессам корень дерева каталогов,
от которого вычисляются все абсолютные путевые имена.
Каждый процесс имеет атрибут cwd (current working directory)  и атрибут  rtd(root directory).

pgrep -l avahi-daemon
sudo lsof -p ID_avahi-daemon | grep rtd

Пример Чрутизации:
не правильно но показательно:
mkdir c-137
chroot c-137 sh
sudo chroot c-137 sh 
sudo strace -fe chroot,chdir,execve chroot c-137 sh

более менее правильно:
mkdir c-137/bin
cp /bin/sh c-137/bin
sudo chroot c-137 sh 
ldd /bin/sh


Пространства имен:
namespaces

ps up $$
ls -la /proc/$$/ns
ps o pid,netns,mntns,pidns,comm p $$
stat -L /proc/$$/ns/net


Пример создания контейнера в пространстве имен с использованием unshare:
ps o pid,netns,mntns,pidns,comm p $$
sudo unshare -mnp -f -R c-137 --mount-proc busybox sh


Контейнеризация: runnc и docker
Docker(software)
LXC
OpenVZ
OCI (Open Container Ininitiative) 
Помогает взаимодействовать с контейнерами программа runc
Пример runc:
runc spec
ls config.json
sed -n '/root.*{/,/}/p' config.json
sudo debbootstrap --variant=minbase --include iproute2 jammy rootfs

Docker:
сайт docker.io - образы
docker image ls
ls -l /var/run/docker.sok
docker image pull ubuntu:23.04
docker run -ti --hostname c-123 ubuntu:23.04
docker attach c-123

Группы управления cgroups
Управление ресурсами контейнеров

Загрузка linux

Процесс загрузки абсолютно любой операционной системы начинается с той компоненты, 
которая собственно операционной системой и является - с ядра.
Все остальное это дополнительные компоненты, и нужны по месту, десктоп, сервер, роутер и т.д.

Главной задачей загрузки является размещение ядра ос в оперативной памяти и передача ей управления.
Эти задачи выполняет загрузчик ОС, который принципе не является ее частью.
Чаще всего выступает частью аппаратной платформы на которой выполняется ОС.
Загрузчик сильно зависит от аппаратной платформы, также должен соответствовать спецификациям платформы,
таким как способы разделения носителей на разделы, собственное размещение на этих носителях,
порядок передачи ему управления при старте платформы и т.д.

Платформа персонального компьютера она же "IBM PC Compatible"
BIOS - набор базовых услуг 
Согласно BIOS носитель должны содержать таблицу разделов определенного вида в своем первом блоке "boot sector",
так называемой загрузочной записи MBR, анализировала  таблицу разделов, выбирала активный раздел, 
считывала его PBR(он же VBR (volume boot record) и передавала ему управление.
Установленная на  этот активный раздел ОС обычно размещала свой загрузчик и выполнялась дальнейшая загрузка. 


С развитием платформы BIOS развился в  EFI, позднее в UEFI.
А MRR развился "GUID Partition  table"
Процедура загрузки теперь предполагает наличие наличие специального системного раздела ESP (EFI System Partition),
которая содержит файловую систему FAT (File Allocation Table),
на которой в виде текущей (current) передается управление по умолчанию.


При любом виде загрузке BIOS/UEFI, загрузчик получив управление умеет правильно считать в оперативную память ядро ОС и передать ему управление.

Самым популярным загрузчиком linux является GRUB.

efibootmgr -v 

В современных linux каталог ESP смонтирован в /boot/efi
А файлы grub чаще всего в корневой файловой системе в каталоге /etc и файлах grub.cfg

Само ядро располагается в каталоге /boot
EFI - каталог 
grub - каталог grub
initrd.img - архив модулей (микро версия операционной системы, busybox)
vmlinuz-linux - основной файл, ядро linux

Загрузчик загружает обе части, а затем передает управление.

lsinitramfs /boot/initrd.img-generic | grep.ko$ | wc -l
lsinitramfs /boot/initrd.img-generic | grep bin/

lsinitramfs - показ содержимого
mkinitramfs - запаковка
unmkinitramfs - распаковка

Драйверы

вендор устройства(vendor)
идентификатор модели устройства(device)

find /lib/modules/`uname -r`/kernel/drivers -name '*.ko' | wc -l
lspci -d ::0401 -k
lspci -d ::0401 -n

modinfo snd_intel8x0 | grep alias

lspci
lscsi
lsusb


udevadm monitor -k
mount -t sysfs
cat /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1:1.0/uevent

Ссылки:

https://zip.bhv.ru/9785977518437.zip