Чтобы просмотреть обновленный курс DevOps (101DaysofDevOps)

Ссылка для регистрации на курс: https://www.101daysofdevops.com/register/

Ссылка на курс: https://www.101daysofdevops.com/courses/101-days-of-devops/

Ссылка на YouTube: https://www.youtube.com/user/laprashant/videos

Добро пожаловать в 76-й день "100 дней DevOps". Сегодня в центре внимания то, как устроено ядро ​​Linux

В Linux мы

  • Пространство пользователя: пользователю (процессы / приложение / службы) нужно что-то делать, и для этого типичным интерфейсом является оболочка.
  • Пространство ядра: ядро ​​- единственный компонент, который имеет прямой доступ к оборудованию.
User Space ----> Kernel Space
Signals
                     System Calls

Если пользователю необходимо взаимодействовать с ядром, существует ограниченная опция, которая предоставляется ядром и строго определяется ядром, что пользователь может делать

  • Сигнал
  • Системные вызовы

Системные вызовы

  • Важная часть операционной системы Linux
  • Процессы не могут напрямую обращаться к ядру
  • Системные вызовы используются как интерфейс для процессов в ядре. glibc предоставляет интерфейс библиотеки для использования системных вызовов из программ
  • Обычная задача, такая как открытие, перечисление, чтение и запись файлов, включает системные вызовы.
  • Системные вызовы fork () и exec () определяют способ запуска процесса
  • fork (): ядро ​​создает почти идентичную копию текущего процесса и заменяет его
  • exec (): ядро ​​запускает программу, которая заменяет текущий процесс

Во всем этом процессе участвует еще одна вещь, называемая библиотеками, которая представляет собой просто дополнительный код, используемый оболочкой или процессом для добавления дополнительных функций. Например: наиболее важным из них является glibc, который предоставляет функции и системные вызовы

# ldd $(which passwd)
linux-vdso.so.1 => (0x00007ffe9fff4000)
libuser.so.1 => /lib64/libuser.so.1 (0x00007f4074149000)
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007f4073ef9000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f4073bc1000)
libpopt.so.0 => /lib64/libpopt.so.0 (0x00007f40739b7000)
libpam.so.0 => /lib64/libpam.so.0 (0x00007f40737a8000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f40735a3000)
libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f407337b000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4073154000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4072f37000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4072b76000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f4072972000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f407273a000)
libffi.so.6 => /lib64/libffi.so.6 (0x00007f4072532000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f407232e000)
libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007f4072127000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f4071ec6000)
/lib64/ld-linux-x86–64.so.2 (0x00007f4074576000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f4071cc3000)

Обычно у нас есть два типа библиотек

  • Статические: например, файлы заголовков (stdio.h).
  • Динамический: хранится на диске (например: libc.so), обычно находится внутри / lib64 или / usr / lib64

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

# ls -l /etc/ld.so.conf.d/
total 8
-r — r — r — . 1 root root 63 Oct 19 11:29 kernel-3.10.0–514.el7.x86_64.conf
-rw-r — r — . 1 root root 17 Sep 21 08:18 mariadb-x86_64.conf

Поэтому, если у нас есть некоторые библиотеки по нестандартному пути, мы можем поместить внутрь этого каталога, а затем запустить ldconfig для обновления кеша библиотеки.

# ldconfig -v

Ядро взаимодействует с оборудованием через драйверы.

Kernel → Drivers → Hardware

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

Теперь давайте увеличим масштаб ядра

Ядро имеет интерфейс под названием Управление памятью, который определяет, как информация хранится / извлекается из ОЗУ

Интерфейс планирования определяет, какой процесс привлекает внимание ЦП, а какой процесс должен подождать

Драйверы. Определяют, как ядро ​​взаимодействует с диском

Kernel --> Memory Management --> RAM
Kernel --> Scheduling --> CPU
Kernel --> Drivers --> Disk

Теперь, чтобы проверить загруженный в данный момент модуль, запустите lsmod, который представляет собой просто интерфейс пользовательского пространства для / proc / modules и представляет данные в удобном формате.

# lsmod
Module Size Used by
iptable_filter 12810 0
isofs 39844 0
intel_powerclamp 14419 0
intel_rapl 19321 0
iosf_mbi 13523 1 intel_rapl
crc32_pclmul 13113 0
ghash_clmulni_intel 13259 0
cirrus 24597 1
ttm 93908 1 cirrus
drm_kms_helper 146456 1 cirrus
ppdev 17671 0
syscopyarea 12529 1 drm_kms_helper
sysfillrect 12701 1 drm_kms_helper
sysimgblt 12640 1 drm_kms_helper

Теперь, чтобы получить больше информации о конкретном модуле, запустите modinfo

# modinfo isofs
filename: /lib/modules/3.10.0–514.el7.x86_64/kernel/fs/isofs/isofs.ko
license: GPL
alias: iso9660
alias: fs-iso9660
rhelversion: 7.3
srcversion: 3967035CBA55EF4A7821695
depends:
intree: Y
vermagic: 3.10.0–514.el7.x86_64 SMP mod_unload modversions
signer: Red Hat Enterprise Linux kernel signing key
sig_key: 75:FE:A1:DF:24:5A:CC:D9:7A:17:FE:3A:36:72:61:E6:5F:8A:1E:60
sig_hashalgo: sha256

Strace

strace - отслеживание системных вызовов и сигналов

-c - подсчитывать время, вызовы и ошибки для каждого системного вызова и сводку отчета

# strace -fc ls
anaconda-ks.cfg original-ks.cfg
% time seconds usecs/call calls errors syscall
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
34.48 0.000060 2 28 mmap
22.99 0.000040 4 11 open
19.54 0.000034 2 18 mprotect
8.62 0.000015 2 10 read
5.17 0.000009 1 14 close
5.17 0.000009 1 12 fstat
2.30 0.000004 2 2 1 access
0.57 0.000001 0 3 brk
0.57 0.000001 1 1 execve
0.57 0.000001 1 1 arch_prctl
0.00 0.000000 0 1 write
0.00 0.000000 0 1 1 stat
0.00 0.000000 0 3 munmap
0.00 0.000000 0 2 rt_sigaction
0.00 0.000000 0 1 rt_sigprocmask
0.00 0.000000 0 2 ioctl
0.00 0.000000 0 2 getdents
0.00 0.000000 0 1 getrlimit
0.00 0.000000 0 2 2 statfs
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 1 openat
0.00 0.000000 0 1 set_robust_list
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
100.00 0.000174 118 4 total

Чтобы проверить конкретный системный вызов

-e expr - уточняющее выражение: option = [!] all или option = [!] val1 [, val2]…

# strace -e open ls
open(“/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) = 3
open(“/lib64/libselinux.so.1”, O_RDONLY|O_CLOEXEC) = 3
open(“/lib64/libcap.so.2”, O_RDONLY|O_CLOEXEC) = 3
open(“/lib64/libacl.so.1”, O_RDONLY|O_CLOEXEC) = 3
open(“/lib64/libc.so.6”, O_RDONLY|O_CLOEXEC) = 3
open(“/lib64/libpcre.so.1”, O_RDONLY|O_CLOEXEC) = 3
open(“/lib64/libdl.so.2”, O_RDONLY|O_CLOEXEC) = 3
open(“/lib64/libattr.so.1”, O_RDONLY|O_CLOEXEC) = 3
open(“/lib64/libpthread.so.0”, O_RDONLY|O_CLOEXEC) = 3
open(“/proc/filesystems”, O_RDONLY) = 3
open(“/usr/lib/locale/locale-archive”, O_RDONLY|O_CLOEXEC) = 3
anaconda-ks.cfg original-ks.cfg
+++ exited with 0 +++

Чтобы проверить вызов библиотеки, используйте ltrace

ltrace - трассировщик вызовов библиотеки

  • c подсчитывать время и звонки и сообщать сводку при выходе.
  • -f трассировать дочерние элементы (fork () и clone ()).
# ltrace -fc ls
anaconda-ks.cfg original-ks.cfg
% time seconds usecs/call calls function
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
50.80 0.006370 6370 1 __libc_start_main
6.91 0.000866 866 1 exit
6.87 0.000861 50 17 readdir
4.70 0.000589 49 12 __ctype_get_mb_cur_max
4.43 0.000555 55 10 __errno_location
3.55 0.000445 49 9 malloc
3.28 0.000411 51 8 getenv
1.94 0.000243 48 5 memcpy
1.78 0.000223 55 4 free
1.54 0.000193 48 4 __freading
1.51 0.000189 63 3 __overflow
1.24 0.000156 52 3 strlen
1.14 0.000143 71 2 fclose
0.99 0.000124 124 1 setlocale
0.90 0.000113 56 2 fwrite_unlocked
0.79 0.000099 49 2 __fpending
0.78 0.000098 49 2 fileno
0.76 0.000095 47 2 fflush
0.60 0.000075 75 1 closedir
0.57 0.000072 72 1 opendir
0.57 0.000072 72 1 ioctl
0.51 0.000064 64 1 exit_group
0.47 0.000059 59 1 isatty
0.45 0.000056 56 1 strrchr
0.45 0.000056 56 1 bindtextdomain
0.44 0.000055 55 1 __cxa_atexit
0.42 0.000053 53 1 getopt_long
0.42 0.000053 53 1 strcoll
0.41 0.000052 52 1 textdomain
0.40 0.000050 50 1 realloc
0.39 0.000049 49 1 _setjmp
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
100.00 0.012539 101 total

Сигналы

Сигналы обеспечивают программное прерывание, это способ сообщить процессу, что он должен что-то сделать

# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

С нетерпением жду вас, ребята, присоединитесь к этому путешествию и потратите минимум час каждый день в течение следующих 100 дней на работу DevOps и опубликуйте свой прогресс, используя любую из указанных ниже сред.

Справка