Чтобы просмотреть обновленный курс 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 и опубликуйте свой прогресс, используя любую из указанных ниже сред.
- Twitter: @ 100daysofdevops ИЛИ @ lakhera2015
- Facebook: https://www.facebook.com/groups/795382630808645/
- Средний: https://medium.com/@devopslearning
- Slack: https://devops-myworld.slack.com/messages/CF41EFG49/
- Ссылка на GitHub: https://github.com/100daysofdevops
Справка