LinuxCamp | DevOps – Telegram
LinuxCamp | DevOps
14.2K subscribers
193 photos
7 videos
298 links
Обо мне: C/C++/Linux эксперт. Говорим про разработку, Linux, DevOps, сети и администрирование.

Админ (реклама): @XoDefender
Чат: @linuxcamp_chat

Менеджер: @Spiral_Yuri
Биржа: https://telega.in/c/linuxcamp_tg

№ 6327102672
Download Telegram
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-Образование
👍21🔥6❤‍🔥3👎1
Файл групп: /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-Образование
1👍22🔥2❤‍🔥1🌭1
Сори, не удержался)
👍33🤡20🤣16🔥5
Топ каналов по Linux и C++

Сегодняшний пост немного выделится и массы и будет посвящен моим рекомендациям различного медиаконтента по изучению Linux, C и C++.

Тут не будет воды и каких-то "левых" каналов - только то, что лично мной было пройдено и проверено.

Если что, комментарии для вас всегда открыты, можете, с высоты личного опыта, дополнить данный список.

C/C++

1. The Cherno (английский) - ютуб канал С++ разработчика, который ранее работал в EA SPORTS над корпоративным движком Frostbite.

Теперь уже автор пишет свой игровой движок и, к сожалению, не так много времени уделяет обучающему контену, но, в свое время, был находкой для новичков, решивших изучать C++ и OpenGL.

2. Илья Мещерин - публичный спикер, лектор и практикующий С++ разработчик. На сколько я знаю, Илья работал в таких компаниях, как Яндекс, ВК и Ядро. Контент, который им производится, подойдет не только начинающим, но и довольно опытным программистам.

От его лица вы вряд ли найдете разборы библиотек и фреймворков, КРИТИЧЕСКИ необходимых для трудоустройства. По его видео можно хорошо отточить C++ и STL, чего и будет достаточно для определенных целей (например, подготовке к собесам).

Лекции выходят от канала ФПМИ. Также, пулл уроков от 2020 года можно найти в плейлисте.

3. ambushedraccoon - отечественный блогер/интервьюер. Его контент основан на проведении junior/middle C++ собесов. Если хотите проработать ответы на самые актуальные вопросы рынка, рекомендую.

4. Jacob Sorber (английский) - разработчик, специализирующийся на embedded и IOT технологиях. Автор затрагивает как совсем базовые, так и довольно глубокие темы, касающиеся языков программирования C/С++, Linux OS и Computer Science.

Linux

1. NetworkChuck (английский) - канал сетевого инженера, который, помимо всего прочего, научит вас основам работы с Linux.

Да, сейчас уже все переходит в развлекательный формат, т.к. надо фармить просмотры, однако все еще можно "выловить" немало полезного материала.

Так, например, плейлисты по подсетям, основам bash и базовому администрированию.

В чем автор силен, так это в динамической подаче материала. Если вам наскучили унылые лекции, можете обратить внимание на NetworkChuck.

2. Learn Linux TV (английский) - канал системного инженера. Основные хайлайты: bash, разборы системных команд, изучение текстового редактора vim.

Linux++ | IT-Образование
👍117❤‍🔥2🌭1
Файлы паролей: passwd и shadow

В linux для аутентификации пользователя и хранения информации о нем используются 2 файла /etc/passwd и /etc/shadow. Давайте рассмотрим назначения каждого из них.

Файл /etc/passwd

В системном файле паролей /etc/passwd содержится по одной строке для каждой учетной записи пользователя. Каждая строка состоит из семи полей:


mtk:x:1000:100:Michael Kerrisk:/home/mtk:/bin/bash


Рассмотрим эти поля по порядку следования:

1. Имя для входа в систему. Это уникальное имя, которое пользователь должен вводить при входе в систему - легко читаемый символьный идентификатор пользователя, соответствующий числовому (UID).

2. Зашифрованный пароль. В этом поле содержится 13-символьный зашифрованный пароль пользователя. Поскольку этот файл используется многими утилитами типа ls, чтобы отобразить владельца файла и другие подобные сведения, он должен быть открыт на чтение для всех, что, конечно, дает отличный шанс хакерам.

По этой причине, в настоящее время, поле пароля в /etc/passwd содержит букву 'x', чтобы обозначить, что пароль был назначен и сохранен в теневом файле /etc/shadow.

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

3. Числовой идентификатор пользователя (UID). Если поле хранит значение 0, то пользователь с данной учетной записью - привилегированный (суперпользователь).

Как правило, имеется только одна такая учетная запись, у которой в качестве имени для входа в систему используется слово root.

4. Числовой идентификатор первой из групп, в которую входит пользователь (GID). Дальнейшая принадлежность к группам этого пользователя определена в системном файле групп.

5. Комментарий. Это поле содержит текст, описывающий пользователя. Такой текст выводится различными программами, например finger.

6. Домашний каталог. Исходный каталог, в который пользователь попадает после входа в систему. Содержимое этого поля становится значением переменной среды HOME.


$ echo $HOME
/home/xodefender


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

Если это поле является пустым, то в качестве исходной, применяется оболочка /bin/sh. Содержимое поля становится значением для переменной среды SHELL.


$ echo $SHELL
/bin/bash


Теневой файл /etc/shadow

Теневой файл паролей /etc/shadow был разработан, как средство противостояния хакерским атакам.

Замысел заключается в том, что вся неконфиденциальная информация о пользователе находится в открытом, доступном для чтения файле passwd, а зашифрованные пароли хранятся в теневом файле, доступном для чтения только программам с особыми привилегиями.

Файл /etc/shadow хранит данные о пользователе в формате. Как и в файле passwd, каждое поле в файле shadow отделяется двоеточием:


smithj:Ep6mckrOLChF.:10063:0:99999:7:::


1. Имя пользователя (до 8 символов). Совпадает по значению с /etc/passwd.

2. Зашифрованный пароль (13 символов). Пустая запись '::' показывает, что для входа пароль не нужен (обычно идея плохая).

3. Количество дней, начиная с 1 января 1970, когда пароль был сменен в последний раз.

4. Число дней до смены пароля (0, если он может быть сменен всегда).

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

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

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

8. Число дней, начиная с 1 января 1970, после которых пароль будет заблокирован.

9. Зарезервировано для возможного будущего использования.

Linux++ | IT-Образование
🔥19👍17❤‍🔥21🌭1💯1
Копаемся c архивами в Linux

В Linux существует множество консольных утилит для работы с архивами и сжатыми файлами.

Нередко в работе бывают случаи, когда GUI под рукой не оказывается (при работе через ssh) и приходится выкручиваться для того, чтобы прочитать ".tar.gz" или ".zip" архивчик.

команды zip и unzip

zip используется для сжатия и архивирования файлов по одноименному алгоритму.

Через параметр ARCHIVE команда принимает имя архива, в который надо добавить файлы. После этого параметру FILES передается набор архивируемых файлов/каталогов:


zip [OPTIONS] ARCHIVE FILES

$ zip myfiles.zip book.pdf image.png


Команда unzip, наоборот, позволяет распаковать архив и в общем случае имеет следующий формат:


unzip [OPTIONS] ARCHIVE

$ unzip myfiles.zip


команды tar, gzip и gunzip

gzip (GNU zip) - архиватор файлов с расширением ".gz".

Данная команда не умеет упаковывать несколько файлов в один архив и используется для поштучного сжатия. Для каждого переданного экземпляра создается спрессованный ".gz" собрат:


# -k : сохраняет изначальный файл

$ gzip -k file1.txt file2.txt


gunzip - распаковщик архивов ".gz". Команда является эквивалентом для "gzip -d":


$ gunzip file.txt.gz
$ gzip -d file.txt.gz


Для упаковки нескольких файлов, их сначала необходимо архивировать в один через утилиту tar и уже потом сжать результат командой gzip.

tar - это утилита, которая используется для объединения нескольких файлов и директорий в один архив.

Сама по себе команда не сжимает файлы, а просто сохраняет их в один ".tar" файл.

Давайте рассмотрим комбо:


# -c : Создать новый архив
# -f : Указать имя создаваемого архива

$ tar -cf archive.tar file.txt

$ gzip archive.tar


Таким образом, сжатые архивы обычно имеют двойное расширение ".tar.gz" или сокращённое ".tgz".

Для того, чтобы распаковать архив, можно использовать флаг "-x":


$ tar -xf archive.tar


команда zcat

Команда zcat похожа, по сути, на cat и используется для вывода содержимого сжатых файлов формата ".gz" без необходимости их предварительной распаковки:


$ zcat file.txt.gz
Hello world


Linux++ | IT-Образование
👍19🔥3❤‍🔥1🌭1
Valve начинает сотрудничество с Arch Linux

Разработчики дистрибутива Arch Linux объявили о переходе к прямому сотрудничеству с компанией Valve, развивающей операционную систему SteamOS, основанную на Arch Linux.

Компания Valve поможет в сопровождении сборочной инфраструктуры и поддержании анклава для заверения компонентов дистрибутива цифровыми подписями.

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

Ожидается, что сотрудничество с Valve ускорит решение некоторых актуальных проблем дистрибутива, ускорит разработку и позволит быстрее реализовать планы.

Для всех, инициируемых Valve значительных изменений, будут создаваться RFC и публиковаться issue в GitLab, что позволит добиться прозрачности и даст возможность сообществу контролировать ход работы.

Linux++ | IT-Образование
🔥33👍141
Процессы и программы: переменные окружения

У каждого процесса есть, связанный с ним строковый массив, который называется списком переменных среды (окружения). Каждая из его строк является элементом вида имя=значение.

Таким образом, среда представляет собой набор пар имя — значение, которые могут применяться для хранения произвольной информации.

Когда создается новый процесс, он наследует копию среды своего родителя. Это простая, но часто используемая форма межпроцессного взаимодействия (IPC), когда среда предоставляет способ переноса информации от родительского процесса к дочернему.

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

Некоторые библиотечные функции позволяют изменять свое поведение путем установки переменных среды. Это дает возможность пользователю управлять поведением приложения без изменения кода или его перекомпоновки с использованием соответствующей зависимости.

Один из классических примеров - переменная среды LD_LIBRARY_PATH, которую мы ранее затрагивали. Когда программа использует динамические библиотеки, загрузчик ищет их в системных каталогах lib или /usr/lib. Однако с помощью LD_LIBRARY_PATH можно указать альтернативные пути поиска:


$ LD_LIBRARY_PATH=/usr/local/lib ./myapp


Определение переменных окружения

В большинстве оболочек значение может быть добавлено к среде с помощью команды export:


$ SHELL=/bin/bash
$ export SHELL


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

В оболочках bash и Korn можно воспользоваться следующей записью:


$ export SHELL=/bin/bash


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


$ unset VARIABLE_NAME


В оболочке Bourne shell и ее потомках (bash и Korn) для добавления значений к окружению выполняемой программы, может использоваться такой синтаксис:


$ NAME=value program


Определение будет добавлено к среде только того дочернего процесса, который выполняет указанную программу. Текущий список переменных среды выводится командой printenv:


$ printenv
LOGNAME=mtk
SHELL=/bin/bash
HOME=/home/mtk
PATH=/usr/local/bin:/usr/bin:/bin:.
TERM=xterm


Список переменных среды любого процесса можно изучить, обратившись к характерному для Linux "/proc/PID/environ":


$ cd /proc/2953
$ cat environ
HOME=/home/xodefenderLANG=en_US.UTF-8LOGNAME=xodefender


Обращение к среде из программы

Из программы на языке C, список переменных среды может быть доступен с помощью глобальной переменной environ. Как и argv, переменная environ содержит список указателей на строки, заканчивающиеся нулевыми байтами. Cам список заканчивается значением NULL:


#include <stdio.h>

extern char **environ;

int
main(int argc, char *argv[])
{
char **list;
for (list = environ; *list != NULL; list++) {
puts(*list);
}
exit(EXIT_SUCCESS);
}


Альтернативный метод обращения к списку переменных среды заключается в объявлении для функции main() третьего аргумента:


int main(int argc, char *argv[], char *envp[])


Отдельные значения из среды процесса извлекаются с помощью getenv():


#include <stdlib.h>
char *getenv(const char *name);


Linux++ | IT-Образование
👍24🔥4👌1
Хочется больше, используй stat

Иногда возникает необходимость в получении дополнительной информации, которую не предоставляет команда ls.

Вдруг, интересно посмотреть на количество блоков с данными или узнать номер ресурса в таблице inode... Полный обзор статуса файла/каталога в файловой системе выдает именно команда stat:


$ stat some_file


В результе вызова команды stat будет показано почти все, что можно узнать о целевом ресурсе, ввплоть до старшего и младшего номеров устройства, на котором хранится файл.

Давайте кратко рассмотрим часть информации, которую выдает stat:

1) File: /var/log/syslog - путь до ресурса, включая название;

2) Size: 15731467 - размер ресурса в байтах;

3) Blocks: 30736 - количесвто, выделенных под информацию блоков, расположенных на носителе;

4) Inode: 527906 - номер ресурса в таблице inode;

5) Links: 1 - количество жестких ссылок на ресурс;

Команда может анализировать и отдельные файловые системы. Для того, чтобы получить пулл данных, нам будет нужен флаг '-f':


$ stat -f /


Если указать в качестве аргумента файл, то информация выведется о файловой системе, на которой он расположен.

Также, если вам требуется через ссылку получить инфу о файле, на который она указывает, можно задействовать флаг '-L', смотрим:


$ stat -L link_to_file


Linux++ | IT-Образование
🔥19👍143
Графический стек Linux

В мучительных потугах проходит изучение необъятного граф. стека нашей любимой ОС.

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

Нашел как-то на хабре норм статью, которая является переводом трудов бывшего разработчика Gnome Shell.

В своей работе автор описывает суть основных компонентов стека (DIX, DDX, DRM, DRI, Xorg, GLX...) и рассказывает, как оно там все рисуется на низком уровне и какие библиотеки для этого используются.

Вообще, эти знания являются довольно базовыми и могут быть полезны как для написания софта, так и для решения ряда проблем с графикой, особенно релевантных для X11.

Тут, если копнуть, есть ряд прослоек драйверов на разных уровнях, некоторые могут работать некорректно конкретно с вашим чипсетом, поэтому не всегда будет правильным решением все сразу спихивать на mesa и бежать в issues.

Возможно, ваш кейс требует поставить intel вместо modesetting либо проработать конфиги)

Настоятельно рекомендую, по возможности, читать оригинал, т.к. в переводе есть шанс немного "недопонять" автора в технических разъяснениях.

Linux++ | IT-Образование
🔥25👍6🤯2
Такие похожие, но такие разные

Говоря простыми словами, chown определяет, кому принадлежит файл, а chmod указывает биты доступа, которые трактуют правила о том, кому и что с файлом или каталогом вообще можно делать.

Через команду chown мы можем указать владельца ресурса и группу, которая будет иметь к нему доступ:


$ chown hero:admins file


Утилита chmod, в свою очередь, определяет "rwx" биты для ресурса. Как мы знаем, бит 'r' разрешает чтение файла, 'w' отвечает за его изменение и 'x' за выполнение.

Мы можем сказать "Так, вот пользователь может все, а группа только читать файл!".

Для реализации нужно выполнить:


$ chmod u=rwx,g=r ./file


Также, вы наверняка видели использвание chmod с числовым аргументом, например "777".

Таким способом тоже можно выдавать права. Каждое число относится к отдельной касте (пользователь, группа, остальные).

Грубо говоря, число 7 описывает доступ "по всем фронтам" rwx. Если мы захотим добиться результата команды выше, только с числовым аргументом, нам потребуется:


$ chmod 740 ./file


1) для пользователя: 4 (чтение) + 2 (запись) + 1 (выполнение) = 7;
2) для группы: 4 (чтение) = 4;
3) для кого-то еще: ничего = 0;

Linux++ | IT-Образование
👍28🔥154
Что нового в kde-plasma 6.2?

После четырёх месяцев разработки опубликован релиз среды рабочего стола KDE Plasma 6.2.

Честно говоря, как не нравилось мне kde, так ничего и не меняется с релизами, хотя по функционалу окружение очень неплохое)

Ну ладно, давайте посмотрим на основные изменения, которые пришли с обновой:

1. Добавлена возможность сборки KWin только с поддержкой сеанса Wayland.

2. Добавлена возможность использовать, встроенные в монитор данные цветового профиля.

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

4. Добавлено всплывающее уведомление с запросом пожертвований, которое будет выводиться только раз в год.

5. Реализована звуковая индикация подключения и отключения монитора.

6. При использовании Wayland реализована поддержка механизма "sticky keys" для людей c нарушенной мелкой моторикой.

Со списком всех изменений с приложенными изображениями, можно ознакомиться на русскоязычном ресурсе.

Есть тут фанаты KDE? Давайте проведем оценку:

🔥топлю за GNOME
👍 кайфую от KDE

Linux++ | IT-Образование
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍73🔥60🤔8🤷‍♂3🤮31😁1
Учимся мониторить kernel

На днях, по рабочим задачам, мне нужно было выявить, какая версия ядра фиксит проблему. Тут, конечно же, пришлось вспомнить, как можно установить ядро, посмотреть его версию, запустить систему с целевым образом.

Ядро Linux - это один из самых важных компонентов операционной системы - буквально ее база и основа всех основ.

Самый распространенный способ посмотреть версию ядра - это команда uname. Она выводит некоторую системную информацию, в том числе, о ядре.

Чтобы исключить всю информацию, кроме нас интересующей, можно использовать флаг '-r':


$ uname -r
6.8.0-41-generic


Но это далеко не единственный способ справиться с задачей. Мы можем посмотреть строку запуска Grub с помощью команды:


$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-6.8.0-41-generic


Тут в параметре BOOT_IMAGE мы можем видеть полный путь к образу, который был загружен.

В той же файловой системе proc есть файл version, где хранится версия ядра:


$ cat /proc/version
Linux version 6.8.0-41-generic


Дальше, чтобы получить ту же информацию мы можем посмотреть лог dmesg, в самом начале которого отображается версия ядра:


$ sudo dmesg | grep Linux
Linux version 6.8.0-41-generic


Ага, а как можно посмотреть общий список образов, которые установлены в системе?

Тут тоже есть несколько способов. Во-первых, можно использовать пакетный менеджер:


$ sudo dpkg -l | grep linux-headers | grep ii | awk '{print $3}'


$ sudo rpm -q kernel


Во-вторых, можно посмотреть содержимое папки boot и выловить от туда все образы ядра с именем vmlinuz:


$ ls /boot | grep vmlinuz
vmlinuz
vmlinuz-6.8.0-36-generic
vmlinuz-6.8.0-41-generic


В-третьих, используя тот же boot, а именно файл "/boot/grub/grub.cfg", можно посмотреть на все доступные версии:


$ grep 'menuentry \|submenu ' /boot/grub/grub.cfg | cut -f2 -d "'"

Ubuntu, with Linux 6.8.0-41-generic
Ubuntu, with Linux 6.8.0-41-generic (recovery mode)


Эта команда ищет строки, которые содержат слова menuentry либо submenu и передает их команде cat на вывод, которая, в свою очередь, предварительно прогоняет их через фильтр по разделителю (-f2 -d "'").

Linux++ | IT-Образование
👍40🔥82
Как не поломать sudo?

Настройки sudo по большей части находятся в файле /etc/sudoers. Для внесения изменений в этот файл крайне нежелательно использовать обычный редактор текста.

Дело в том, что некорректный синтаксис файла sudoers запросто может навредить операционной системе и поломать sudo.

И вот проблема, вы поломали sudo, что будем делать дальше, ведь файл /etc/sudoers может редактировать только превелигированный пользователь?)

У меня уже был однажды такой казус, правда, не из-за файла sudoers, но в результате, sudo отвалился. Пришлось чиниться через live образ, вам оно надо?)

Для редактирования файла существует специальная команда – visudo, которая обычно использует текстовый редактор vi и при сохранении изменений всегда проверяет синтаксис на корректность:


$ sudo visudo


Если кто-то уже редактирует файл, вы получите предупреждение с просьбой попробовать позже и, если вы допустили ошибки, файл просто не будет сохранен.

Также, утилита блокирует sudoers для того, чтобы никто не мог одновременно с вами его изменять.

Если вам не нравится дефолтный текстовый редактор, visudo позволяет его изменить. Команда распологает встроенным списком поддерживаемых редакторов.

Для того, чтобы переопределить редактор, достаточно объявить переменную окружения EDITOR:


$ export EDITOR=nano


Для того, чтобы изменения применялись постоянно, вам требуется прописать команду выше в файл .bashrc для пользователя.

Linux++ | IT-Образование
👍39🔥92
Пора обновляться на Kernel 6.11?

Серия ядер Linux 6.10 достигла конца срока поддержки, и вам следует рассмотреть возможность обновления до ядра Linux 6.11.

Ядро Linux 6.10 было выпущено 14 июля 2024 года и представило новые функции, среди которых:

1) системный вызов mseal() для защиты памяти;
2) поддержку языка Rust для архитектуры RISC-V;
3) поддержку сжатия Zstandard для файловой системы EROFS;

Ядро Linux 6.10 не является веткой с долгосрочной поддержкой (LTS), поэтому поддерживалось только несколько месяцев и получило четырнадцать обновлений.

Ядро Linux 6.11 было выпущено 15 сентября 2024 года и уже было принято различными популярными дистрибутивами: Ubuntu 24.10, Arch Linux, Fedora Linux и openSUSE Tumbleweed.

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

Если вам нужна долгосрочная поддержка, следует использовать либо Linux 6.6, либо Linux 6.1, обе версии будут поддерживаться до декабря 2026 года и являются LTS.

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

Некоторые дистры на ядро накладывают ряд патчей, чтобы все работало и не ломалось. Лучше всего - дождаться стабильной версии дистрибутива и обновить все его компоненты, включая ядро.

Linux++ | IT-Образование
👍26❤‍🔥4🔥2
Слышали про chroot?

Chroot (change root) - это утилита, которая используется для того, чтобы создать закрытое окружение "тюрьму", в которой программа будет видеть определенную часть файловой системы, как корневую '/'.

Это похоже на создание миниатюрного "сейфа" или "контейнера" для запуска приложений. В качестве примера можете вспомнить тот же Docker.

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

Системный вызов chroot()

Каждый процесс обладает корневым каталогом — он представляет собой стартовую точку, от которой интерпретируются абсолютные имена путей, начинающиеся с символа '/'. По умолчанию данным каталогом является реальный корневой каталог файловой системы.

Иногда бывает удобно, чтобы процесс изменил свой корневой каталог. Это может реализовать с помощью системного вызова chroot(). Системный вызов chroot() изменяет корневой каталог процесса на каталог, указанный в аргументе pathname:


#include <unistd.h>
int chroot(const char *pathname);


Затем все абсолютные имена путей интерпретируются, как начинающиеся с указанного местоположения в файловой системе. Иногда это называют заключением в клетку chroot, поскольку программа оказывается замкнутой внутри некоторой части файловой системы.

Моменты, которые стоит учитывать при работе с chroot

Следует 100% помнить, что вызов chroot() не меняет текущий рабочий каталог процесса. Для обеспечения полной безопасности, либо перед, либо после chroot() необходимо выполнить вызов chdir(), иначе процесс сможет использовать относительные пути для доступа к ресурсам вне клетки.

Также, при переходе в пространство chroot, вы можете столкнуться с тем, что ничего не работает) Это и не удивительно, как оболочка будет выполнять команды, которых для нее просто не существует...

Для решения проблемы вам может понадобиться перенести ряд библиотек и программ из "реальной" корневой системы в имитированную либо использовать команду debootstrap, но это уже отдельная история)

Linux++ | IT-Образование
👍32🔥731🤯1
Микротуториал по управлению пакетами (Debian-based)

В Linux и разработчики и обычные пользователи довольно часто работают с бинарными пакетами: обновляют их, удаляют, переустанавливают, смотрят описание, мониторят содержимое.

Сегодня мы рассмотрим пулл команд по работе с пакетами, которые, на практике, чаще всего используются в "Debian-based" системах.

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

Основные команды apt

1. Обновляет локальный кэш с информацией о доступных пакетах и их версиях из репозиториев, прописанных в "/etc/apt/sources.list":


$ sudo apt update


2. Обновляет все установленные пакеты до актуальных версий, НО существующие пакеты не удаляет.

Если для обновления требуется удаление/установка зависимостей, оно пропускается, и пакет остается нетронутым в текущей версии:


$ sudo apt upgrade


3. Обновляет все установленные пакеты до актуальных версий, устанавливает или удаляет пакеты для разрешения зависимостей:


$ sudo apt dist-upgrade


4. Устанавливает пакет вместе со всеми его зависимостями:


$ sudo apt install <имя_пакета>


5. Переустанавливает пакет и обновляет все его содержимое. Бывает полезно, если какие-то файлы пакета были удалены или повреждены:


$ sudo apt install --reinstall <имя_пакета>


6. Удаляет указанный пакет, но оставляет файлы конфигурации:


$ sudo apt remove <имя_пакета>


7. Полностью удаляет пакет и его конфигурационные файлы:


$ sudo apt purge <имя_пакета>


8. Показывает информацию о пакете: версия, зависимости, описание, размер и т.д.:


$ sudo apt show <имя_пакета>


9. Ищет пакеты в репозиториях по имени или описанию:


$ sudo apt search <имя_пакета>


10. Удаляет пакеты, которые были установлены как зависимости, но больше не требуются:


$ sudo apt autoremove


11. Удаляет все загруженные архивы пакетов из кэша "/var/cache/apt/archives/":


$ sudo apt clean


Основные команды dpkg

1. Устанавливает пакет из локального файла .deb и не подтягивает зависимости:


$ sudo dpkg -i <имя_пакета.deb>


2. Удаляет пакет, но сохраняет конфигурационные файлы:


$ sudo dpkg -r <имя_пакета>


3. Полностью удаляет пакет и его конфигурационные файлы:


$ sudo dpkg -P <имя_пакета>


4. Показывает список всех установленных пакетов либо информацию о конкретном пакете:


$ dpkg -l
$ dpkg -l <имя_пакета>


5. Выводит подробную информацию о пакете/пакетах:


$ dpkg -s
$ dpkg -s <имя_пакета>


6. Показывает список файлов, установленных данным пакетом:


$ dpkg -L <имя_пакета>


7. Показывает содержимое архива .deb (файлы, которые будут установлены):


$ dpkg -c <имя_пакета.deb>


8. Доводит конфигурацию пакета/пакетов до конца при аварийном завершении:


$ sudo dpkg --configure -a
$ sudo dpkg --configure <имя_пакета>


9. Показывает имя пакета, который устанавливает указанный файл:


$ dpkg -S picom.desktop
picom: /etc/xdg/autostart/picom.desktop


Linux++ | IT-Образование
6👍59🔥123🤯2🤬1
Переводим .rpm пакет в .deb (alien)

Представим такую ситуацию - ваш друг очень хочет дать вам потестить свое революционное приложение...

Да, все круто, вы только за то, чтобы дать конструктивный фитбек и потыкаться в утилите, но есть проблема - приятель сидит на какой-нибудь федоре и понятия не имеет, как дебианизировать пакет.

Без паники, есть решение - утилита alien, которая способна перегнать "инородную" для вашего пакетного менеджера бинарную сборку из одного формата в другой.

Поддерживается преобразование между пакетами: Linux Standard Base (.lsb), Redhat (.rpm), Debian (.deb), Stampede (.slp), Solaris (.pkg) и Slackware (.tgz).


$ sudo apt install alien


Для преобразования .deb файла в .rpm с изменением стандартных для Debian инсталляционных скриптов используется опция -r. На выходе получится RPM-пакет:


$ sudo alien -r --noscripts <some_pkg>.deb

<some_pkg>.rpm generated


Для преобразования .rpm файла в .deb используется опция -d. На выходе получится DEB-пакет:


$ sudo alien -d --noscripts <some_pkg>.rpm

<some_pkg>.deb generated


За дополнительной информацией об утилите направляю вас прямо в мануал.

Linux++ | IT-Образование
🔥43👍16🐳32👏2🤷‍♂1
Как демоны выполняют логгирование?

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

Так вот, в качестве альтернативы сообщения можно записывать в отдельный журнальный файл программы. Основной недостаток такого подхода заключается в сложности менеджмента этих файлов. Для решения проблемы была разработана система syslog.

Что такое syslog?

Система syslog предоставляет единый централизованный механизм, который позволяет любому приложению записывать свои сообщения в единый журнал. Система syslog состоит из двух основных компонентов: демона syslogd и библиотечной функции syslog().

Демон syslogd, принимает сообщения из двух разных источников: сокета UNIX-домена (/dev/log), который хранит сообщения, сгенерированные локально, и сокета интернет-домена, который хранит сообщения, отправленные по TCP/IP.

Для записи сообщений в журнал любой процесс может воспользоваться библиотечной функцией syslog(). На основе переданных ей аргументов она создает сообщение и помещает его в сокет "/dev/log", где оно будет доступно для syslogd.

Файл /etc/syslog.conf

Конфигурационный файл "/etc/syslog.conf" определяет поведение демона syslogd и то, как и куда должны записываться системные сообщения. Он состоит из набора правил, которые имеют следующий вид:


источник.приоритет действие

# Записывать все сообщения от ядра в файл kern.log
kern.* /var/log/kern.log


Программный интерфейс syslog

Программный интерфейс syslog состоит из трех основных функций, которые входят в пространство "syslog.h":

1. Функция openlog() устанавливает настройки, которые по умолчанию применяются ко всем последующим вызовам syslog():


void openlog(const char *ident, int log_options, int facility);

openlog("slog", LOG_PID|LOG_CONS, LOG_DAEMON);


2. Функция syslog() записывает сообщения в журнал:


void syslog(int priority, const char *format, ...);

syslog(LOG_INFO, "Hello world ... ");


‰3. Функция closelog() вызывается после окончания записи сообщений, чтобы разорвать соединение с журналом:


void closelog(void);


Если не прорабатывать конфиги и не указывать альтернативные пути вывода сообщений для различных источников, то последовательное выполнение функций выше приведет к появлению лога в файле "/var/log/syslog":


xodefenderpc slog[754521]: Hello world ...


Linux++ | IT-Образование
👍26🔥85🤔3👎1😈1
Базовые принципы коммуникации "пользователь -> приложение"

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

Обозреваемые концепты относятся к исполняемым файлам в целом, поэтому затрагивают и динамические библиотеки.

Некоторые из нас в курсе про какие-нибудь механизмы IPC (Inter Process Communications), как например: DBUS. IPC подразумевает коммуникацию между приложениями. Выглядеть она может следующим образом "пользователь -> приложение_1 -> приложение_2".

Причем пользователь в этой схеме не является ключевой сущностью - он может как-то повлиять на "приложение_1" и затригерить его обратиться к "приложение_2".

Коммуникация "пользователь -> приложение" обычно реализована 3 способами: конфиги, переменные окружения, аргументы командной строки:

Общение через файлы конфигурации

Приложение может давать пользователю влиять на внутреннюю кухню через конфиги. Тут, чтобы понять, есть ли такая возможность, можно либо почитать описание утилиты, которое она обычно предоставляет, либо посмотреть на список установленных файлов:


# читаем мануал к программе
$ man picom
# смотрим на список установленных файлов
$ dpkg -L picom


Для удобства, в последнем случае можно "грепнуть" вывод, т.к. обычно конфиги заканчиваются ".cnf" и ".conf":


$ dpkg -L picom | grep -e .conf -e .cnf
/usr/share/doc/picom/examples/picom.sample.conf


Также стоит упомянуть тот факт, что конфиги бывают пользовательскими и системными. Пользовательские, как правило, имеют больший приоритет и расположены в скрытой директории внутри хомяка "~/.config". Системные, в свою очередь, где-то внутри "/etc/":


$ dpkg -L openssl | grep -e .conf -e .cnf
/etc/ssl/openssl.cnf


Общение через переменные окружения

Приложение может поддерживать коннект с пользователем и обрабатывать запросы в том числе и через переменные. Если мы посмотрим на мануал к проекту mesa, сколько же там всего можно проконтролировать, оставляю ссылочку. Аналогичная история и с такими проектами, как gtk, kwin и т.д.

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

Общение через переменные происходит обычно по 3 сценариям:

1) мы определяем переменную для конкретного пользователя, например через файл "~/.bashrc". В таком случае, каждый раз, как пользователь открывает сессию, переменная становится видимой для приложений внутри:


$ cat ~/.bashrc
export SOME_VARIABLE="some value"


2) мы определяем общесистемную переменную "/etc/environment", которая доступна приложениям любой сессии и всем пользователям:


$ cat /etc/environment
SOME_VARIABLE="some value"


3) мы передаем переменную программе на старте. В результате, только целевая программа и ее потомки будут видеть переменную и смогут с ней работать:


$ SOME_VARIABLE="some value" picom


Общение через аргументы командной строки

Еще одна полезная опция - передавать программе определенный пулл параметром через CLI (Command line interface) в момент запуска. Такой формат очень распространен в "no-GUI" утилитах, работа с которыми происходит исключительно в командной строке: nmcli, pkcs11-tool, ssh и т.д.:


$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -T


Список параметров программа, как правило, выдает через флаг "--help":


$ nmcli --help

nmcli [ПАРАМЕТРЫ] ОБЪЕКТ { КОМАНДА | help }
ПАРАМЕТРЫ
-a, --ask  запрос отсутствующих параметров


Linux++ | IT-Образование
👍31🔥10❤‍🔥3
Топ команд по управлению процессами

Как-то раньше мы с вами говорили про процессы и разбирали их различия с программами. Сегодня посмотрим на основные команды, которые КАЖДЫЙ линуксоид должен знать и уметь применять в работе.

Команда для просмотра процессов "ps":

Команда ps используется для отображения информации о запущенных процессах. Она выводит большинство необходимых данных, которые требуются для администрирования.

Если выполнить ps без каких-либо флагов, то получится просмотреть только процессы, запущенные текущим терминалом:


$ ps
PID TTY       TIME CMD
107468 pts/1  00:00:00 bash
107747 pts/1  00:00:00 ps


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


$ ps -u xodefender | grep picom
109331 ?        00:00:00 picom


Если мы посмотрим на вывод с флагом "--help", то поймем, что команда на столько обширная, что и для "--help" есть ряд параметров:


$ ps --help

Usage:
ps [options]

Try 'ps --help <simple|list|output|threads|misc|all>'


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

'a' говорит о выводе процессов всех пользователей;
'u' требует отобразить пользователя, которому принадлежит процесс;
'x' просит вывести процессы, которые не привязаны к управляющему терминалу (TTY) - демоны и другие фоновые процессы.


$ ps -aux
USER   PID %CPU %MEM    VSZ   RSS TTY  STAT START   TIME COMMAND
root   1   0.0  0.3   23128 13352 ?    Ss   08:57   0:07 /sbin/init


Команды для убийства процессов "kill/pkill":

Бывает же такое, программа просто перестает отвечать на запросы. Да, знаю, частенько бывает. В таком случае может быть полезно, во что бы то ни стало, уничтожить подвисший процесс. Сделать это можно с помощью команд "kill" и "pkill".

Команда "kill" требует указать id процесса, который необходимо терминировать:


$ kill 109331


Работает это через отправку сигнала целевому процессу. Без явного указания, команда пытается "убить" процесс с помощью сигнала "SIGTERM", которые не гарантирует полное и сиюсекундное терминирование.

Для того, чтобы по-настоящему "убить" процесс, требуется отправить сигнал "SIGKILL", который находится под 9 номером:


$ kill -9 109331


Список всех сигналов можно получить через флаг '-l':


$ kill -l
1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP ...


Утилита "pkill" позволяет оперировать именами, а не идентификаторами и отправляет сигнал она всем процессам с указанным именем:


$ pkill -9 picom


Команда для получения id процесса "pgrep":

pgrep позволяет находить идентификаторы (PID) запущенных процессов на основе заданных критериев: имя процесса, его владелец и т.д. Для того, чтобы получить (PID) процесса по его имени, следует выполнить:


$ pgrep picom
109331


Команды для оценки потребления ресурсов системы "top/htop":

Их использование полезно для анализа процессов и определения того, сколько CPU тратится на их выполнение, какое потребление оперативной памяти и т.д. htop является более продвинутой версией, но, в своей основе, они используются для идентичных целей:


$ top
PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND 106676 xodefen+  20   0  495180  92356  63828 S   1.0   2.3   0:34.08 Xorg


Linux++ | IT-Образование
👍42🔥113👌2