fa
Feedback
LinuxCamp | DevOps

LinuxCamp | DevOps

رفتن به کانال در Telegram

Обо мне: C/C++/Linux эксперт. Говорим про разработку, Linux, DevOps, сети и администрирование. Админ (реклама): @XoDefender Чат: @linuxcamp_chat Менеджер: @Spiral_Yuri Биржа: https://telega.in/c/linuxcamp_tg РКН: https://clck.ru/3RWA3C

نمایش بیشتر

📈 تحلیل کانال تلگرام LinuxCamp | DevOps

کانال LinuxCamp | DevOps (@linuxcamp_tg) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 13 926 مشترک است و جایگاه 9 160 را در دسته فناوری و برنامه‌ها و رتبه 47 344 را در منطقه روسيا دارد.

📊 شاخص‌های مخاطب و پویایی

از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 13 926 مشترک جذب کرده است.

بر اساس آخرین داده‌ها در تاریخ 09 ژوئیه, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر -116 و در ۲۴ ساعت گذشته برابر -26 بوده و همچنان دسترسی گسترده‌ای حفظ شده است.

  • وضعیت تأیید: تأیید نشده
  • نرخ تعامل (ER): میانگین تعامل مخاطب 21.35% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 11.55% واکنش نسبت به کل مشترکان کسب می‌کند.
  • دسترسی پست‌ها: هر پست به طور میانگین 2 974 بازدید دریافت می‌کند. در اولین روز معمولاً 1 608 بازدید جمع‌آوری می‌شود.
  • واکنش‌ها و تعامل: مخاطبان به‌طور فعال حمایت می‌کنند؛ میانگین واکنش به هر پست 24 است.
  • علایق موضوعی: محتوا بر موضوعات کلیدی مانند linuxcamp, ядро, linux, диск, docker تمرکز دارد.

📝 توضیح و سیاست محتوایی

نویسنده این فضا را محل بیان دیدگاه‌های شخصی توصیف می‌کند:
Обо мне: C/C++/Linux эксперт. Говорим про разработку, Linux, DevOps, сети и администрирование. Админ (реклама): @XoDefender Чат: @linuxcamp_chat Менеджер: @Spiral_Yuri Биржа: https://telega.in/c/linuxcamp_tg РКН: https://clck.ru/3RWA3C

به لطف به‌روزرسانی‌های پرتکرار (آخرین داده در تاریخ 10 ژوئیه, 2026)، کانال همواره به‌روز و دارای دسترسی بالاست. تحلیل‌ها نشان می‌دهد مخاطبان به‌طور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامه‌ها تبدیل کرده‌اند.

13 926
مشترکین
-2624 ساعت
-527 روز
-11630 روز
آرشیو پست ها
Файл групп: /etc/group В недавнем посте мы кратко затронули системный файл "/etc/group". Сегодня мы чуть подробнее рассмотрим его практическую ценность и структуру содержимого. Го! Пользователей для различных административных целей, в частности для управления доступом к файлам и другим системным ресурсам, полезно свести в группы. Это нужно по той причине, что не всем юзерам системы доступны для чтения, записи и выполнения все существующие ресурсы. Мы ведь не можем просто так взять и поменять содержимое какого-нибудь системного конфига из директории etc. Например dhcpcd.conf. Нам, для того, чтобы воспроизвести запись, нужно выполнить рад действий: 1) проверить группу, к которой принадлежит файл; 2) проверить права, которыми располагает группа;

$ ls -l | grep dhcp
-rw-r--r--  1 root  root 1429 Mar 31 11:48 dhcpcd.conf
Тут мы видим следующее: файл принадлежит пользователю root и его одноименной группе. Также, права для пользователя, позволяют ему выполнять запись и чтение. Членам группы позволено только читать содержимое файла, т.к. указан только 1 бит "r". Давайте, для начала, поменяем файлу группу так, чтобы конкретный пользователь смог к нему обратиться:

$ sudo chgrp xodefender dhcpcd.conf
$ ls -l | grep  dhcp  
-rw-r-----  1 root   xodefender  1437 Sep 27 11:02 dhcpcd.conf
Вот, хорошо, теперь мы, от пользователя xodefender можем, хотя бы, прочитать файл:

$ cat dhcpcd.conf
# A sample configuration for dhcpcd.  
# See dhcpcd.conf(5) for details.
...
Можем ли мы записать что-то... Пока нет. Для этого нам нужно добавить бит "w" на запись для группы:

$ sudo chmod g+w dhcpcd.conf
$ ls -l | grep  dhcp  
-rw-rw----  1 root   xodefender  1437 Sep 27 11:05 dhcpcd.conf
Хорошо, теперь с правами все норм, можем воспроизвести запись в файл от пользователя xodefender:

$ echo "Some useful data" >>  dhcpcd.conf
Ага, а если мы хотим выполнять данные операции от пулла доверенных пользователей... В таком случае, нам нужно создать для них группу и присвоить ее целевому файлу. Давайте действовать поступательно и начнем с создания группы:

$ sudo groupadd admins
Список групп с соответствующей информацией можно найти в файле "/etc/group", который содержит по одной строке на каждую группу. Каждая строка, как показано в следующем примере, состоит из четырех полей, отделенных друг от друга двоеточиями:

$ cat /etc/group
admins:x:1002:
jambit:x:106:claus,felli,frank,harti,markus
Рассмотрим эти поля в порядке следования: 1) имя группы - легко читаемый символьный идентификатор, соответствующий числовому; 2) зашифрованный пароль группы, который, в действительности, хранится в теневом файле групп "/etc/gshadow"; 3) числовой идентификатор группы (GID); 4) список пользователей, которые входят в группу; Далее, давайте добавим доверенных пользователей в группу:

$ sudo usermod --append --groups admins xodefender
$ sudo usermod --append --groups admins test_1
$ cat /etc/group | grep admins  
admins:x:1002:xodefender,test_1
Теперь нужно повторить процесс из начала поста - изменить группу файла и выставить необходимые права:

$ sudo chgrp admins dhcpcd.conf
$ sudo chmod g+rw dhcpcd.conf
Все, пожалуйста, пользователи xodefender и test_1 (участники группы admins) могут читать файл и записывать в него информацию:

$ su test_1
$ cat dhcpcd.conf
# A sample configuration for dhcpcd.  
# See dhcpcd.conf(5) for details.
...
Linux++ | IT-Образование

Митап про карьерный рост в Linux Эксперты из Orion soft, K2 Cloud и K2 Tech расскажут о ключевых шагах Linux-инженера на пути
Митап про карьерный рост в Linux Эксперты из Orion soft, K2 Cloud и K2 Tech расскажут о ключевых шагах Linux-инженера на пути к большому ИТ. В программе: какие навыки в Linux стоит качать, чего ждать на техническом интервью и как найти своё место в мире инфры. Полезная информация для всех, кто стремится развиваться в DevOps и не только. Встречаемся онлайн 7 октября, в 19:00 (мск). Подробности и регистрация по ссылке

Valve продолжает пушить Linux Разработчики из компании Valve представили проект frog-protocols, в рамках которого планируется
Valve продолжает пушить Linux Разработчики из компании Valve представили проект frog-protocols, в рамках которого планируется развивать дополнительный набор протоколов для Wayland, дополняющих протоколы из набора wayland-protocols. Расширения из wayland-protocols необходимы для создания композитных серверов и пользовательских окружений. Создание отдельного набора протоколов к Wayland объясняется слишком медленным и буксующим в бесконечных обсуждениях процессом принятия новых протоколов в wayland-protocols, который может затягиваться на месяцы и годы. В проекте frog-protocols протоколы намерены доводить до пользователей как можно быстрее. По мнению создателей инициативы, многие пользователи продолжают работать в окружениях на базе протокола X11 из-за отсутствия необходимой функциональности, которая может быть предоставлена уже сейчас, но по тем или иным причинам её продвижение блокируется. Готовые пакеты с первой версией frog-protocols уже приняты в репозитории Arch Linux, Fedora 41 и Fedora 40, а также находятся на стадии включения в состав openSUSE. Первыми двумя Wayland-протоколами, включёнными в состав frog-protocols, стали frog-fifo-v1 и frog-color-management-v1. Протокол frog-color-management добавляет расширения для управления цветом, предоставляющих возможности для работы с HDR в играх. Протокол frog-fifo отмечается как очень примитивный по своей сути, но предоставляющий важные возможности, решающие проблемы с высокой нагрузкой на GPU при использовании VSync, снижением производительности и зависанием приложений при перекрытии их окон другими окнами при включённом FIFO/VSync. Код с реализацией протокола frog-fifo передан для включения в основной состав Mesa. Изменения, добавляющие поддержку протокола, также подготовлены для композитного менеджера KWin, который развивается проектом KDE. Реализация уже опробована в работе и входит в состав SteamOS и композитного сервера Gamescope. Предлагаемое изменение сводится к обеспечению корректной работы Wayland-клиента с FIFO благодаря переходу к ожиданию завершения вертикальной развёртки (vblank) вместо использования callback-вызовов при каждой готовности отобразить новый кадр. В ходе обсуждения, один из разработчиков wlroots, выразил сомнение в целесообразности добавления протоколов, развиваемых в обход основанной на достижении консенсуса модели разработки wayland-protocols или не учитывающих интересы Wayland-сообщества. Пьер-Лу Гриффе из компании Valve ответил, что текущей модели разработки wayland-protocols не хватает быстрого цикла продвижения экспериментальных протоколов, который позволил бы проводить эксперименты, сразу получать обратную связь от пользователей и учитывать её при дальнейшей разработке. Linux++ | IT-Образование

Сколько времени вы готовы потратить на ручную настройку серверов? 🤔 Дадим подсказку – нисколько! За 5 недель обучения на кур
Сколько времени вы готовы потратить на ручную настройку серверов? 🤔 Дадим подсказку – нисколько! За 5 недель обучения на курсе «Ansible: Infrastructure as Code» от Слёрма мы научим вас автоматически настраивать, обновлять и мониторить много серверов сразу, даже если им нужны разные конфигурации. Внутри: ✔️ Infrastructure as Code, плейбуки и роли; ✔️ Инсталляция LEMP стека с помощью Ansible; ✔️ Ansible и работа с PostgreSQL, Mongo и Docker; ✔️ Модули на Python; ✔️ Callbacks, Gitlab runners, Jenkins, Vault; ✔️ Ansible в облаках Google Cloud и AWS. Видеолекции и онлайн-встречи, 42 часа практики и ревью, а еще мощный финальный проект для вашего портфолио. Узнайте, как легко управлять сотнями серверов без рук. 📌 Подробности на сайте #реклама О рекламодателе

Идентификаторы процессов: пользователи и группы [2] И так, в прошлый раз мы посмотрели на первые 3 базовых идентификатора: RUID, EUID и SUID. Сегодня пойдем дальше и добьем последние 2: 1) ID пользователя и группы файловой системы (FSUID); 2) ID дополнительных групп (supplementary group); ID пользователя и группы файловой системы (FSUID) В Linux для определения прав доступа к файлам, применяются не пользовательские и групповые EUID, а соответствующие ID файловой системы (FSUID). Они используются в этом качестве наряду с идентификаторами дополнительных групп, описанных ниже. Обычно идентификаторы файловой системы имеют те же значения, что и соответствующие действующие собраты. Более того, каждый раз при изменении EUID ядро также автоматически изменяет и FSUID, присваивая ему аналогичное значение:

$ ps -eo pid,uid,euid,suid,fsuid,comm
    PID   UID  EUID  SUID FSUID COMMAND
      1     0     0     0     0 systemd
Однако, никто не запрещает вам изменить ID файловой системы и сделать его отличным от действующих ID. Реализовать это можно через вызовы setfsuid и setfsgid:

#include <sys/fsuid.h>

int setfsuid(uid_t fsuid);
int setfsgid(gid_t fsgid);
А зачем в Linux вообще предоставляются идентификаторы файловой системы и при каких обстоятельствах нам могут понадобиться разные значения для EUID и FSUID? Причины главным образом имеют исторические корни. Идентификаторы файловой системы впервые появились в Linux 1.2. В этой версии ядра один процесс мог отправлять сигнал другому, лишь если EUID отправителя совпадал с RUID или EUID целевого процесса. Это повлияло на некоторые программы, например на программу сервера Linux NFS (Network File System), которой нужна была возможность доступа к файлам, как будто у нее есть действующие идентификаторы соответствующих клиентских процессов. Но, если бы NFS-сервер изменял свой действующий идентификатор пользователя, он стал бы уязвим от сигналов непривилегированных пользовательских процессов. Для предотвращения этой возможности были придуманы отдельные FSUID. Оставляя неизмененными свои действующие идентификаторы, но изменяя идентификаторы файловой системы, NFS-сервер может выдавать себя за другого пользователя с целью обращения к файлам без уязвимости от сигналов пользовательских процессов. Начиная с версии ядра 2.0, приняты правила относительно разрешений на отправку сигналов, в результате чего, наличие FSUID утратило свою актуальность. В наше время ID файловой системы считаются некой экзотикой и, как правило, совпадают по значениям с EUID. ID дополнительных групп (supplementary group) В ранних реализациях unix, процесс мог принадлежать только к одной группе, прописанной в "/etc/passwd". Сейчас же можно принадлежать сразу к нескольким. Новый процесс наследует эти идентификаторы от своего родительского процесса. Оболочка входа в систему получает свои дополнительные идентификаторы групп из файла групп системы "/etc/group":

$ cat /etc/group | grep xodefender
adm:x:4:syslog,xodefender
cdrom:x:24:xodefender
sudo:x:27:xodefender
dip:x:30:xodefender
video:x:44:xodefender
Как уже ранее отмечалось, эти идентификаторы используются в совокупности с EUID и FSUID для определения полномочий по доступу к файлам, IPC-объектам и другим системным ресурсам. Процесс может получить список ID дополнительных групп с помощь getgroups, и изменить этот список с помощью setgroups:

#include <unistd.h>
int getgroups(int size, gid_t list[]);

#include <grp.h>
int setgroups(size_t size, const gid_t *_Nullable list);
Linux++ | IT-Образование

👩‍💻 C++ теперь в Telegram! Вот обширная база контента по C++, которая ежедневно пополняется новыми постами: Обучение C++ с
👩‍💻 C++ теперь в Telegram! Вот обширная база контента по C++, которая ежедневно пополняется новыми постами: Обучение C++ с нуля Обучение Qt с нуля Обучение Asio с нуля Обучение Boost с нуля Обучение FLTK с нуля Обучение wxWidgets с нуля 📌 Ресурсы, гайды, шпаргалки, задачи и книги — всё собрано в одном месте: @cpp_ready

Идентификаторы процессов: пользователи и группы [1] У каждого процесса есть набор, связанных с ним числовых идентификаторов пользователей (UID) и групп (GID). В число этих идентификаторов входят: 1) реальный (real) ID пользователя и группы; 2) действующий (effective) ID пользователя и группы; 3) сохранённый ID пользователя (set-user-ID) и группы (set-group-ID); 4) характерный для Linux пользовательский и групповой ID файловой системы; 5) дополнительные идентификаторы групп (supplementary group); Реальный идентификатор пользователя и группы (RUID) Реальные идентификаторы определяют пользователя и группу, которым принадлежит процесс. При входе в систему, оболочка получает свои ID пользователя и группы из полей файла "/etc/passwd". Каждый новый процесс наследует данные идентификаторы у своего родительского процесса:

$ echo $UID
1000

$ grep $LOGNAME /etc/passwd
hiko:x:1000:1000:hiko:/home/hiko:/bin/bash

$ stat -c "%u %g" /proc/$pid/
1000 1000
Действующий идентификатор пользователя и группы (EUID) В большинстве реализаций UNIX действующие UID и GID используются для определения полномочий, которыми наделен процесс, при его попытке выполнения различных операций (в том числе, системных вызовов). Эти ID используются ядром для определения прав, которые будет иметь процесс при доступе к общим ресурсам, таким как: очереди сообщений, общая память, объекты межпроцессного взаимодействия (IPC) и семафоры. В большинстве систем UNIX эти ID также определяют права доступа к файлам (в Linux для этой задачи используются ID файловой системы). Процесс, чей действующий идентификатор пользователя имеет значение 0, называется привилегированным и принадлежит пользователю с именем root (имеет все полномочия суперпользователя). Некоторые системные вызовы могут быть выполнены только привилегированными процессами. ID действующего пользователя и группы процесса можно получить с помощью вызовов geteuid и getegid. Проводя сравнение между EUID и RUID можно сказать, что RUID обозначает пользователя, который владеет процессом, EUID является параметром, на который смотрит ядро ОС для того, чтобы разрешить вам выполнить действие либо отклонить запрос:

$ ps -eo pid,euid,ruid | grep 2254
   2254     0   0
Также, важно помнить, что значение EUID может быть изменено и некоторые программы, такие как sudo, используют это для того, чтобы выполнять ряд привилегированных операций. Сохранённые set-user-ID и set-group-ID (SUID) Эти ID используются в программах с set-user-ID и set-group-ID битами для сохранения копии соответствующих EUID. Бит SUID можно опознать по букве 's', заменяющей обычный бит выполнения 'x'. Это говорит нам о том, что файл будет выполняться с правами владельца, а не пользователя, который его запускает:

$ stat -c "%A %a %n" /usr/bin/passwd
-rwsr-xr-x 4755 /usr/bin/passwd
Когда set-user-ID-программа запускается (загружается в память процесса с помощью команды exec()), ядро устанавливает для действующего EUID точно такое же значение, что и у пользовательского UID исполняемого файла:

$ su
# chown root app
# chmod u+s app
# ls -l app
-rwsr-xr-x 1 root users
После запуска, EUID пользователя будет скопирован в SUID. Идентификаторы процесса будут проставлены следующим образом: RUID=1000, ЕUID=0, SUID=0. Программа с set-user-ID может повышать и понижать права, переключая свой ID действующего пользователя (EUID) между значениями RUID и SUID. Это полезно в случаях, когда, например, привилегированному процессу нужно выполнить непривилегированную задачу. Такое переключение производится с помощью вызовов seteuidsetreuid или setresuid. Программа с set-group-ID выполняет аналогичные задачи с помощью setegidsetregid или setresgid. Сохранённые set-user-ID и set-group-ID процесса можно получить с помощью getresuid и getresgid соответственно. Linux++ | IT-Образование

👩‍💻 Программирование теперь в Telegram! Вот 10 обучающих каналов по самым востребованным направлениям в IT. Выбирай своё на
👩‍💻 Программирование теперь в Telegram! Вот 10 обучающих каналов по самым востребованным направлениям в IT. Выбирай своё направление: 👩‍💻 C/C++: @cpp_ready 👩‍💻 C#: @csharp_ready 👩‍💻 Python: @python_ready 👩‍💻 Java: @java_ready 📖 Общее IT: @roadmap_ready 🖥 Базы Данных & SQL: @sql_ready 👩‍💻 Frontend: @code_ready 👩‍💻 Backend: @backend_ready 📋 IT Архив: @archive_ready 🖥 Design: @time_design 📌 Ресурсы, гайды, шпаргалки, книги и задачи для каждого языка программирования.

Демоны в Linux Демон - это процесс, обладающий длинным жизненным циклом. Часто демоны создаются на этапе загрузки системы и работают до момента ее выключения. Выполняется они в фоновом режиме, не имеют контролирующего терминала и обычно не привязаны к конкретной пользовательской сессии. Примеры системных демонов У каждого системного демона есть своя микроцель существования. Одни контролируют сетевые соединения, другие отвечают за взаимодействие между приложениями по системе dbus. Примерами популярных демонов являются: 1) cron — демон, который выполняет команды в запланированное время; 2) sshd — демон, который отвечает за обработку SSH-подключений; 3) httpd — демон HTTP-сервера (Apache), который обслуживает веб-страницы; Вы можете и сами "поймать" демонов через различные утилиты: ps, top, pstree. Базовыми отличительными параметрами таких процессов являются имя, которое заканчивается на 'd', родительский процесс init и отсутствующий терминал:

$ ps -o pid,ppid,cmd

PID    PPID CMD
1239    1 /usr/lib/snapd/snapd  
1250    1 /usr/libexec/udisks2/udisksd
Дополнительно хочется отметить, что процессам-демонам присуща особенность, которая гарантирует, что ядро не сможет генерировать для них никаких сигналов, связанных с терминалом (SIGINT, SIGTSTP и SIGHUP). Создание демона Глобально существует 2 типа демонов: "SysV Daemons" и "New-Style Daemons". Первый тип является традиционным и преимущественно использовался до появления systemd. Второй, в свою очередь, опирается на инфраструктуру systemd и является сервисом. Сейчас не будем вдаваться в принцип работы сервисов и рассмотрим инициализацию каноничного SysV демона. Для того, чтобы стать демоном, программа должна выполнить следующие шаги: 1. Сделать вызов fork(), после которого родитель завершается, а потомок продолжает работать. Это нужно для отделения демона от терминала, из которого он был запущен. В результате, процесс становится потомком для init:

pid_t pid = fork();

if (pid < 0)
    exit(EXIT_FAILURE);

if (pid > 0)
    exit(EXIT_SUCCESS); 
2. Дочерний процесс вызывает setsid(), чтобы начать новую сессию, стать ее лидером и разорвать любые связи с контролирующим терминалом:

if (setsid() < 0)
    exit(EXIT_FAILURE);
3. Проигнорировать сигнал SIGHUP для того, чтобы не завершиться при закрытии терминала, внутри которого был воспроизведен запуск:

signal(SIGHUP, SIG_IGN);
4. Повторно выполнить fork(). Этот шаг иногда выполняется для предотвращения возможности захвата вновь созданного демона новым управляющим терминалом. 5. Очистить атрибут umask, чтобы файлы и каталоги, созданные демоном, имели запрашиваемые права доступа, указанные в вызовах open() и mkdir():

umask(0);
6. Поменять текущий рабочий каталог процесса (обычно на корневой). Это необходимо для исключения блокировки файловой системы и возможности, в случае необходимости, сделать для нее unmount:

chdir("/");
7. Закрыть все открытые файловые дескрипторы, которые демон унаследовал от своего родителя. Поскольку демон потерял свой контролирующий терминал и работает в фоновом режиме, ему больше не нужно хранить дескрипторы с номерами 0, 1 и 2, их тоже закрываем:

for (int x = sysconf(_SC_OPEN_MAX); x>=0; x--)
    close (x);
8. Переоткрыть дескрипторы STDIN, STDOUT, STDERR и перенаправить стандартные потоки в виртуальное устройство "/dev/null". Данный шаг необходим по нескольким причинам. Во-первых, вновь открытые файлы неизбежно возьмут себе минимально доступный порядковый номер (0, 1, 2 ...), что может привести к нежелательным записям со стороны функций, которые работают с этими дескрипторами. Во-вторых, данное действие позволяет избежать ошибок при вызове библиотечных функций, которые выполняют операции ввода/вывода с этими дескрипторами:

int fd0 = open("/dev/null", O_RDWR); 
int fd1 = dup(0); 
int fd2 = dup(0);
9. Запустить основной цикл, в котором демон будет выполнять свою работу:

while (1) {
}
Linux++ | IT-Образование

Станьте AI-разработчиком на Python и зарабатывайте от 150.000₽ в месяц 🔥🔥🔥 Мы научим вас создавать и тренировать нейронные сети, и вы сможете: 1️⃣ Устроиться разработчиком в крупную компанию и зарабатывать от 150 тыс. ₽ в месяц 2️⃣ Разрабатывать такие проекты на заказ и зарабатывать от 500 тыс. ₽ за проект 3️⃣ Создать нейро-сотрудника в вашей компании и вырасти на +30-100% в зарплате На интенсиве будет много практики: создадим 9 нейросетей за 1 вечер: 🧬 Прогноз стоимости золота 🧬 Сегментация изображения для робота доставщика 🧬 Трекинг людей на видео Ведущий интенсива - Senior AI-разработчик и основатель Университета искусственного интеллекта 🔥 Регистрируйтесь на бесплатный интенсив! Встречаемся в ближайшую среду

Ресурсы процессов Каждый процесс потребляет системные ресурсы, такие как память и процессорное время. Этот пост расскажет вам о системных вызовах, которые необходимы для получения подобной информацией о потребляемых ресурсах и контроля ряда ограничений. Мы начнем с вызова getrusage(), который позволяет процессу следить за ресурсами, потребленными им или его потомками. Затем будут рассмотрены вызовы setrlimit() и getrlimit(), которые позволяют изменять и получать данные об установленных для вызывающего процесса ограничениях на различные ресурсы. Ресурсы, использующиеся процессом: Системный вызов getrusage() возвращает статистику, которая касается различных ресурсов системы, потребленных самим вызывающим процессом или всеми его потомками:

#include <sys/resource.h>

int getrusage(int who, struct rusage *res_usage);
Данный вызов возвращает 0 при успешном завершении или –1, если произошла ошибка. Аргумент who обозначает процесс, для которого будет извлекаться информация о потреблении ресурсов. Он может принимать одно из следующих значений: 1. RUSAGE_SELF — возвращает сведения о вызывающем процессе. 2. RUSAGE_CHILDREN — возвращает сведения обо всех потомках вызывающего процесса. 3. RUSAGE_THREAD — возвращает сведения о вызывающем потоке (поддерживается только в Linux). Аргумент res_usage представляет собой указатель на структуру типа rusage, поля которой заполняются в момент вызова:

struct rusage {
/* Процессорное время, потребленное пользователем */
struct timeval ru_utime; 
/* Процессорное время, потребленное системой */
struct timeval ru_stime; 
/* Размер страницы памяти, выделенной процессу */
long ru_maxrss; 
...
}
Нужно помнить, что далеко не все поля структуры rusage заполняются вызовом getrusage(). Некоторые поля могут игнорироваться в Linux, но учитываться в других реализациях UNIX. В Linux они присутствуют на случай, если их реализуют в будущем - это позволит поддерживать бинарную совместимость с уже существующими приложениями. Давайте на примере посмотрим, как можно получить "user/system" процессорное время, затраченное процессом на выполнение кода:

#include <stdio.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <unistd.h>

void main() {
/* Some Work... */

struct rusage usage;
if (getrusage(RUSAGE_SELF, &usage) == 0) {
   printf("User CPU time: %ld.%06ld seconds\n", 
       usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);

   printf("System CPU time: %ld.%06ld seconds\n", 
       usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
  } 
}
Ограничения на ресурсы для отдельных процессов: Каждый процесс обладает набором параметров, с помощью которых можно ограничить объем тех или иных системных ресурсов, которые он может потребить. Сведения об ограничениях на ресурсы процесса можно получать и изменять с помощью системных вызовов getrlimit() и setrlimit():

int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
Аргумент resource обозначает ограничение на ресурсы, которое нужно получить либо изменить. Рассмотрим несколько примеров возможных значений:
RLIMIT_AS Размер виртуальной памяти процесса (байты)
RLIMIT_CORE Размер дампа памяти (байты)
RLIMIT_CPU Процессорное время (секунды)
...
Аргумент rlim используется либо для возвращения существующих значений ограничения, либо для задания новых. Он представляет собой структуру, состоящую из двух полей:

struct rlimit {
rlim_t rlim_cur; 
rlim_t rlim_max;
};
Эти поля имеют целочисленный тип rlim_t и соответствуют двум ограничениям на один ресурс: мягкому (rlim_cur) и жесткому (rlim_max). Эти ограничения управляют тем, какой объем целевого ресурса может быть использован. Мягкое ограничение регулирует количество ресурсов, которые могут быть использованы процессом. Процесс может использовать ресурсы в пределах этого значения. Жесткое ограничение является абсолютным максимумом, который нельзя превысить, даже при попытке изменить мягкое ограничение. Linux++ | IT-Образование

😒2 канала для каждого сетевого инженера и безопасника 👨‍💻 Серверная Админа - большое количество уроков и статей по устройс
😒2 канала для каждого сетевого инженера и безопасника 👨‍💻 Серверная Админа - большое количество уроков и статей по устройству компьютерных сетей. Кладезь информации для безопасника ZeroDay - Уроки по кибербезопасности и хакингу с нуля. Вирусы, взломы, OSINT, криптография и свежие новости

Говорим про либы: GTK и QT [1] Уж очень часто в современной разработке софта под Linux, программистам приходится взаимодействовать с библиотеками GTK и QT. Будь-то приложение по управлению системами IOT (Internet of things) либо сетевой менеджер, не всех может устроить взаимодействие с утилитой через CLI (command line interface), поэтому для повышения комфорта в использовании, приходится прибегать к графическому туллкиту. В этой серии постов я, через призму личного опыта, постараюсь объяснить вам то, что из себя представляют библиотеки GTK и QT, для чего они необходимы, c какими ЯП используются и, на сколько востребованы при трудоустройстве. Что вообще такое это ваше GTK и QT? Для разработки графических приложений нам нужен какой-то, желательно, простой в использовании, инструментарий - API, через которое можно попросить ряд подсистем нашей операционки создать окно, отрисовать кнопку, повесить на нее ивент и выполнить определенный набор инструкций по требованию. Парочка GTK/QT, как раз и является тем самым высокоуровневым API над такими платформозависимыми технологиями, как X11, WinAPI, WaylandAPI и т.д. Целые окружения рабочего стола, со всеми их графическими утилитами, написаны на этих библиотеках - так GNOME использует GTK, KDE, в свою очередь, построен на QT. Вид некоторых виджетов GTK приложений сильно отличается от тех, которые предлагает QT, из-за чего желательно, чтобы системные приложения внутри определенного DE (Desktop Environment) были написаны на том же графическом туллките, что и сами компоненты окружения. GTK - это многомодульный GUI туллкит, который разработан на языке программирования C в рамках проекта GNOME и необходим для создания графических интерфейсов под разные системные платформы: Windows, Linux, MacOS. Преимущественно, конечно же, именно под Linux. Когда-то, еще в бородатые годы, пробовал запуститься на Windows, но, ребята, оно того не стоит. Для MacOS и Windows существуют гораздо более предпочтительные альтернативы. Для GTK, дабы облегчить процесс создания интерфейсов и избавить вас от необходимости кодом прописывать свойства для виджетов, придумали ряд полезных инструментов, которые позволяют визуально прорабатывать дизайн, накидывать виджеты на макет и выдавать готовый XML. Самыми удобными и проработанными утилитами, из тех, что мне приходилось использовать, могу назвать GLADE и Cambalache. Qt уже не отнесешь к группе "просто" GUI туллкитов. В отличии от GTK, Qt является полноценным фреймворком для разработки приложений: гораздо более функциональным, громоздким и, написанным на C++. Тут вам и API по построению клиент-серверной архитектуры и кастомные типы данных и различные медиа классы и готовые сущности для работы с базами данных и SQL. Возможностей фреймворка может сполна хватать для разработки разного рода приложений, благодаря чему, программисту не приходится подключать ряд сторонних зависимостей, разбираться в их структуре и проверять работоспособность на разных платформах. На Qt, без всяких там boost, ASIO и, уж тем более, платформозависимых системных обращений, можно построить многопоточный сетевой аппликейшн. Приложение, написанное на том, что Qt предоставляет из коробки будет структурно выглядеть приемлемо - иметь единый стиль и, с высокой вероятностью, работать корректно на разных поддерживаемых платформах, среди которых: Windows, Linux, MacOS, Android, IOS. При работе с GTK тоже можно использовать реализации различных структур данных, API под разные задачи - все это присутствует в сторонних библиотеках, разработанных проектом GNOME (GLib, GIO и т.д.), но по удобству использования и функциональности это, конечно, не дотягивает до Qt. Qt также может похвастаться, как мне кажется, хорошим IDE (Qt Creator), который позволяет вам удобно вести полный цикл разработки приложения - переключаться между версткой дизайна и кодом, заниматься отладкой и профилированием, взаимодействовать с системой контроля версий и т.д. Linux++ | IT-Образование

Установка Decky Loader через терминал Decky Loader - это самодельный лаунчер плагинов для Steam Deck, который позволяет вам,
Установка Decky Loader через терминал Decky Loader - это самодельный лаунчер плагинов для Steam Deck, который позволяет вам, через подкачку различных дополнений, кастомизировать ваше устройство по всем фронтам: стилизовать меню, изменять системные звуки, модифицировать экран загрузки и т.д. Сам поставил себе это расширение, т.к не осталось баллов для анимаций, да и ассортимент в магазине стима, будем честны, требует расширения) Для установки требуется: 1. Создать пароль для пользователя:

$ passwd deck
2. Подгрузить установочный .sh скрипт и передать его интерпретатору sh на выполнение:

curl -L https://github.com/SteamDeckHomebrew/decky-installer/releases/latest/download/install_release.sh | sh
Тут вам и команда curl и перенаправление вывода через '|' pipe. Аххх, ладно, все это мы еще разберем в отдельных постах, сегодня чилл 🍿

Итоги квартала Для простоты навигации по контенту попробуем внедрить практику подведения квартальных результатов: Разделяемые библиотеки: 1. Общая информация про разделяемые библиотеки 2. Компоновка с динамическими библиотеками [1] 3. Компоновка с динамическими библиотеками [2] 4. Компоновка с динамическими библиотеками [3] 5. Версионирование разделяемых библиотек 6. Отложенное связывание символов (Lazy Binding) 7. Ускорение работы библиотек: отключение ленивого связывания 8. Использование флага компоновщика -Bsymbolic 9. Ускорение работы библиотек: отключение перехвата функций Разбор команд: 1. Разбор команд: strace 2. Разбор команд: strace -c 3. Разбор команд: lsof 4. Разбор команд: source Базовый linux: 1. Процессы и программы 2. Структура памяти процесса 3. Системные и библиотечные вызовы [1] 4. Файловая система proc Создание бинарных пакетов: 1. Разбор пакетов: build-essential 2. Что такое бинарный пакет (deb, rpm)? 3. Cборка бинарного (.deb) пакета

👋 В Telegram появился канал от создателя NetworkAdmin.ru Автор пишет про компьютерные технологии и их тенденции, гайды по ОС
👋 В Telegram появился канал от создателя NetworkAdmin.ru Автор пишет про компьютерные технологии и их тенденции, гайды по ОС Windows/Linux, и немного о жизненных историях. ✅Подпишись: @networkadminru

Файловая система proc Ранее мы уже затрагивали виртуальную файловую систему proc, когда говорили про команду lsof. Сегодня копнем глубже и научимся получать из нее различную информацию о системе и процессах. В старых реализациях UNIX не было простого способа выполнить интроспективный анализ атрибутов ядра для получения ответов на следующие вопросы: 1. Сколько процессов запущено в системе и кто их владельцы? 2. Какие файлы открыты процессом? 3. Какие файлы в данный момент заблокированы и какие процессы удерживают эти блокировки? 4. Какие сокеты используются в системе? Чтобы предоставить более легкий доступ к информации ядра, во многих современных реализациях UNIX предусмотрена VFS (Virtual File System) proc. Она находится в одноименном каталоге и содержит различные файлы, предоставляющие информацию о ядре. Называется она виртуальной потому, что фактически не располагается на диске и заполняется ядром на лету. Процессам можно беспрепятственно считывать эту информацию и, в некоторых случаях, вносить в нее изменения, используя обычные системные вызовы файлового ввода-вывода: read, write, open, close и т.д. Получение информации о процессе (/proc/PID): Для каждого процесса в системе ядро создает соответствующий каталог по имени /proc/PID (process id). Внутри этого каталога находятся различные файлы и подкаталоги, содержащие информацию о процессе. Важно помнить, что данные директории не существуют постоянно и затираются, как только процесс прекратил свое существование. Например, просмотрев файлы в каталоге /proc/1, можно получить информацию о процессе init, PID которого всегда имеет значение 1. Давайте посмотрим на базовую информацию процесса init через файл status, который существует в каждом каталоге /proc/PID и предоставляет множество данных о целевом процессе:

$ cat /proc/1/status

Name: init - Имя исполняемого файла
State: S (sleeping) - Состояние процесса
Tgid: 1 - ID группы потоков (обычный PID, getpid())
Pid: 1 - Фактически ID потока (gettid())
PPid: 0 - ID родительского процесса
TracerPid: 0 - PID отслеживающего процесса
...
Описание файлов и директорий для каждого каталога (/proc/PID): 1) cmdline - аргументы командной строки; 2) cwd - символьная ссылка на текущий рабочий каталог; 3) environ - пары вида ИМЯ=значение списка переменных среды; 4) exe - символьная ссылка на исполняемый файл; 5) fd - каталог, содержащий символьные ссылки на файлы, открытые процессом; 6) maps - отображения памяти; 7) mem - виртуальная память процесса; 😍 mounts - точки монтирования для рассматриваемого процесса; 9) root - символьная ссылка на корневой каталог; 10) status - различная информация (идентификаторы процесса, права, использование памяти, сигналы); 11) task - содержит по одному подкаталогу для каждого потока в процессе; Системная информация, находящаяся в proc: Доступ к информации, распространяющейся на всю систему также предоставляется через различные файлы и директории внутри VFS proc. Давайте посмотрим на назначения отдельных из них: 1) /proc/net - информация состояния сети и сокетов; 2) /proc/sys/fs - настройки, относящиеся к файловым системам; 3) /proc/sys/kernel - различные общие настройки ядра; 4) /proc/sys/net - настройки сети и сокетов; 5) /proc/sys/vm - настройки, касающиеся управления памятью; 6) /proc/sysvipc - информация об IPC-объектах System V; 7) /proc/cpuinfo - информация о центральном процессоре; Обычно, команд cat, more и less должно хватать для того, чтобы разобрать различную информацию внутри proc. В качестве примера, давайте выхватим немного данных про наш CPU:

$ cat /proc/cpuinfo

processor        : 0
vendor_id        : GenuineIntel
cpu family       : 6
model            : 154
model name       : 12th Gen Intel(R) Core(TM) i7-1260P
stepping         : 3
microcode        : 0x423
cpu MHz          : 710.883
cache size       : 18432 KB
Однако из некоторых файлов бывает тяжело выцепить что-то полезное. Для таких случаев существуют утилиты lsof, lspci, apm и top, которые являются интерфейсом для proc и предоставляют легко читаемую для пользователя информацию.

Cборка бинарного (.deb) пакета: Ранее мы уже говорили о том, что такое бинарный пакет. Сегодня разберемся с тем, как его создать, рассмотрим архитектурные правила сборки и узнаем про практическую ценность некоторых файлов, которые используются при дебианизации. Сразу хочу указать на то, что данный пост не является абсолютным HOWTO по созданию пакетов. Тут мы разберем основы и потом, в следующий публикациях будем уходить вглубь по отдельным аспектам, тем самым, шаг за шагом, формируя целостную картину. Что такое дебианизация? Дебианизация - это процесс упаковки ПО в .deb бинарный пакет для распространения внутри "Debian based" операционных системах, таких как Ubuntu, Mint, сам Debian и т.д. Хорошо проработанный пакет позволит без особых проблем развернуть необходимое ПО на целевой системе, без необходимости в ручной компиляции и сборке. Что нужно для создания .deb пакета? На примере моего любимого композитора picom разберем основные правила дебианизации, посмотрим на уже рабочую структуру и поймем, что к чему. Сборка любого .deb пакета начинается с создания debian директории в корне проекта. Данный каталог будет содержать в себе все необходимые для дебианизации файлы, в которых будет прописан ряд правил по упаковке софта:

$ cd picom-10.2/debian
$ ls -l
-rw-rw-r-- changelog
-rw-rw-r-- control
drwxrwxr-x patches
-rwxrwxr-x rules
...
Для конфигурации пакета может использоваться множество различных файлов, основными необходимыми являются control, rules и changelog: 1. control - содержит различного рода информацию, необходимую инструментам пакетирования: dpkgapt-getapt-cache и т.д. В данный файл принято прописывать список зависимостей, которые пакетный менеджер будет проверять и, по возможности, подтягивать из репозиториев. Control может включать в себя уйму полей. Как пример, Package: <name>, необходим для определения имени пакета и создания, на этапе сборки, каталога установки:

$ pwd
picom-10.2/debian/picom/
$ ls
etc  usr
$ cd usr/bin && ls
compton   picom
При инсталляции, файлы, которые лежать внутри picom, по идентичной иерархии перенесутся в системные директории. 2. rules - исполняемый Makefile, который в полной мере управляет процессом сборки и отрабатывает через утилиту make. Тут можно указать набор правил и инструкций, которые будут выполняться на разных этапах: 1) на этапе конфигурации создаем директорию build, в которю помещяем результат работы команды meson:

override_dh_auto_configure:
    mkdir -p debian/build
    cd debian/build
    meson --prefix=/usr ../..
2) на этапе сборки вызываем, сгенерированные утилитой meson, ninja файлы и выполняем компиляцию проекта. Результат компиляции будет лежать в рамках каталога build:

override_dh_auto_build:
    cd debian/build && ninja -v
3) на этапе установки заходим в директорию build, записываем в переменную DESTDIR путь, по которому ninja install выполнит перенос готовых бинарников и конфигов:

override_dh_auto_install:
    cd debian/build
    DESTDIR=${CURDIR}/debian/picom ninja install
3. changelog - файл версионирования, который содержит историю изменений, внесенных в ПО. Его роль не ограничивается только отслеживанием правок. По указанной в нем информации, которая находится после названия приложения (<версия>-<ревизия>), формируется итоговое имя пакета:

picom (9.1-1) unstable; urgency=medium

* New upstream version 9.1

-- Nikos Tsipinakis <nikos@tsipinakis.com>
В результате сборки мы получим пакет с именем picom_9.1-1_amd64.deb, где picom сформировался по значению поля Package из файла control, версия 9.1-1 подставилась из changelog и архитектура amd64 определилась автоматически. И вот уже с этим минимальным набором файлов можно создать бинарный пакет. После того, как конфигурация готова, выходим из директории debian на уровень выше и запускаем сборочный процесс:

$ cd ..
$ sudo dpkg-buildpackage -b -us -uc

разбор команд: source Разбирал я значит баш скрипты на сборочных серверах и наткнулся на интересную команду source. Вызов выглядел следующим образом:

source <filename>.build
Мне сразу стало интересно, что лежит в .build файле... Там был прописан обычный bash скрипт, который определял ряд переменных и функций для компиляции и установки приложения:

#!/bin/bash

BDIR="Release"

src_config() {
    cmake -DCMAKE_BUILD_TYPE=${BDIR}
}

src_compile() {
    make
}
Следующий вопрос - почему именно source? Можно же выполнить скрипт внутри командной оболочки через обращение к файлу через путь:

./<filename>.build
Как оказалось, есть несколько причин, по которым данная команда существует и используется, давайте разбираться. Принцип работы команды source: Данная команда является полным аналогом оператора . - встроенным в оболочку инструментом, который позволяет выполнять ряд инструкций целевого файла в рамках текущего "shell environment", что, как минимум, сохраняет доступ ко всем, локально определенным, переменным оболочки:

$ MY_VAR=123
$ cat script.sh
echo $MY_VAR

$ source script.sh
123
$ . script.sh
123
Когда вы вызываете source и передаете ему файл на чтение, все команды внутри будут последовательно выполнены так, будто вы их вручную прописали в терминале. Файл тут можно передавать несколькими способами: 1) Через абсолютный/относительный путь:

source ./XTouch/xtouch.sq
2) По имени. В данном случае утилита попытается найти файл в одном из каталогов, указанных для переменной $PATH. Если попытка окончилась провалом, программа попытается взять его из текущей активной директории:

source xtouch.sq
Отличия в запуске скрипта по пути "./" и через команду source: Как говорилось ранее, команда source выполняет инструкции в рамках текущей оболочки, не отпочковываясь и не создавая новый процесс, что позволяет использовать локальные переменные. Запуск скрипта по пути, в свою очередь, создает дочерний процесс и запускает дополнительную оболочку со своим пуллом переменных:

$ ps -auxf
\_ /bin/bash  
 \_ /bin/bash ./test.sh
Если переменная оболочки не была переведена в переменную окружения через ключевое слово "export", дочерний процесс не сможет к ней обратиться. В таком случае, необходимо явно передать и определить ее при запуске:

$ MY_VAR=123
$ source script.sh
123
$ MY_VAR="$MY_VAR" script.sh
123
Также, нужно помнить, что, когда вы вызываете скрипт по имени, для корректной работы следует прописывать shebang "#!<path to app>" в начале файла. Таким образом, системе будет понятно то, каким приложением необходимо обработать указанные инструкции:

#!/usr/bin/make -f

install:
    dh_installdirs
    dh_install
В случае с source это не имеет смысла - тут мы работаем на уровне текущей оболочки. Операционной системой не будет запущен очередной интерпретатор, как следствие, данная строка будет проигнорирована. Пример использования команды source: Как говорилось в начале поста, я наткнулся на source, пока шарился на сборочном сервере. Стояла задача дебианизировать пакет, который должен был при инсталляции корректно встроить в систему ряд медиа библиотек и конфигов для декодирования видео на GPU. Как правило, проекты такой сложности требуют выполнения немалого количества действий на разных этапах: при конфигурации нужно передать "миллион" флагов в cmake, при установке построить глубокую иерархию директорий, перенести файлы по путям и т.д. Все эти процессы могли бы быть отображены и проработаны в файле rules, но тогда в нем было бы безумно тяжело ориентироваться. Было принято решение разделить логику на группу функций: src_install(), src_compile(), src_config(). После чего, локально, не в рамках новой оболочки, их определять и вызывать. Определения были скомпонованы в отдельном файле, что позволило красиво и локанично оформить rules:

install:
    source debian/pipeline.build && src_config && src_install
    
build:
    source debian/pipeline.build && src_config && src_compile

build: source debian/pipeline.build && src_config && src_compile```