GNU/Linux | Notes – Telegram
GNU/Linux | Notes
2.39K subscribers
111 photos
8 files
75 links
Open Source, Dotfiles, Debian/Ubuntu, Software, Linux, Scripts, Notes, Terminal, Shell, Gnu, Tools, Games, Fun, Free Software Movement.

Автор: Кирилл Рехов
Почта: krekhov.dev@gmail.com
Кто я: https://news.1rj.ru/str/krxnotes/246
GitHub: https://github.com/krekhovx
Download Telegram
Процесс разработки Debian. Архивы пакетов.

#debian
👍1
There’s a kernel of truth in the old Unix joke, "the only command you need to know is man."

#utils
👍2
Что такое виртуальные пакеты?

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

Например, существует виртуальный пакет mail-transport-agent. Он обозначает любую программу, которая может работать как почтовый транспортный агент (MTA). Реальные пакеты, такие как postfix, exim4, sendmail, msmtp и т.д, могут удовлетворять эту роль (смотреть скриншот).

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

Когда пользователь пытается установить виртуальный пакет mail-transport-agent, пакетный менеджер сообщает, что есть несколько реальных пакетов, которые предоставляют эту функциональность. Однако пакетный менеджер не выбирает автоматически один из них, так как они являются альтернативами, и пользователь должен сам выбрать, какой именно реальный пакет установить.

Еще пример, существует виртуальный пакет mcedit, при его установке скачается реальный пакет mc и его компоненты (mcedit связь с mc), грубо говоря это alias на необходимые пакеты. Еще пример, пакет awk предоставляет на выбор три пакета: original-awk, mawk, gawk.

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

#debian
👍3
Довольно часто приходится обращаться к Docker, чтобы не засорять свою основную Debian машину ненужными пакетами/зависимостями. Запустить Debian образ и развернуть его в интерактивном режиме можно так:
$ docker run -it debian


Можно подключиться к нужному контейнеру с другого tty/pts (чтобы было больше рабочих окон, терминалов). Узнать идентификатор контейнера и подключиться. На другом терминале выполнить:
$ docker ps
$ docker exec -it <ID> /bin/bash


Аналогичную работу можно произвести и с другими дистрибутивами, просто найти нужный образ и запустить его, поиск на Docker Hub осуществляется таким образом:
$ docker search <rocky-distr-for-example>


#debian
👍6
Что такое метапакеты?

Существуют пустые пакеты, в которых описаны только зависимости и метаданные (документация и т.д). Они обеспечивают установку группы взаимосвязанных программ. В описании пакета можно увидеть: Section: metapackages (но это необязательно и не всегда встречается). Например, пакет build-essential является метапакетом. В таких пакетах нет исходников и подобного, а есть только debian/ директория с описанием. Такие пакеты существуют лишь ради эффектов, которые их метаданные оказывают на стек работы с пакетами.

build-essential предоставляет необходимые инструменты для сборки пакетов в Debian, включая компиляторы, библиотеки и другие инструменты, но сам по себе не содержит какого-либо программного кода. Он лишь указывает на другие пакеты, которые необходимы для сборки программ в Debian. Вся суть этого пакета в его Depends и метаданных.

Этот пакет необходим для сборки и компиляции программ из исходников. И включает:
1. Компилятор GCC (GNU Compiler Collection).
2. Утилиты для сборки, такие как make.
3. Заголовочные файлы и библиотеки для разработки.

#debian
👍5
Случайно увидел. Dirk из USA украинизировался! Выглядит очень смешно ))

#fun
😱4👍2🥰2🤣21
Это не реклама, просто делюсь. Приобрел портативную игровую приставку Anbernic RG35XX Plus на базе Linux с возможностью играть в ретро-игры, поддерживает игры с различных платформ типа PSP, PS1, Game Boy и т.д (платформ довольно много, а игр около 5000). Подарок прям радует, сборка отличная, картинка неплохая (IPS экран), но вот для меня экран маловат (разрешение 640x480) глаза устают после часа игры, благо консоль имеет порт Mini HDMI, приобрел кабель и подключаю консоль к монитору, проблема глаз решена. Я удивился как быстро и без проблем картинка подстроилась под большой монитор. Я хотел приобрести Steam Deck, но решил начать с чего-то более простого. Короче, старичкам советую!

#games #fun
👍62🔥2
😁21🥰1
Адресное пространство процесса (память процесса)

Когда программа запускается на выполнение, ядро выделяет для нее место в оперативной памяти.

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

Некоторые секции уже известны перед запуском процесса .text, .data, .bss. Их можно посмотреть после компиляции:
$ size ./a.out


.text еще может называться code space.
.data может называться data space.

.text (младшие адреса 0x0)
В этой секции хранится код программы, машинные инструкции (исполняемый код), сюда нельзя ничего записывать. Эта секция существует в read-only чтобы предотвратить несанкционированное изменение кода программы.

.data
Хранятся глобальные, статические переменные, которые определены, например:
int i = 2;
char name[20];

изначально эта секция пуста, и существует на чтение/запись.

.bss
Хранятся глобальные, статические переменные, которые НЕ определены, например:
int i;
int x;


.heap
Динамическая аллокация памяти (для долгоживущих объектов). Она аллоцируется, когда процесс стартует, и не привязана ни какому файлу (месту на диске), а .text, .data, .bss можно увидеть в /proc/$(pidof a.out)/maps файле.

.stack
Может расширяться и сжиматься по мере вызова функций (frames). Содержит аргументы функций, локальные переменные функций (короткоживущие объекты). Вызов функции приводит к помещению в стек (создание кадра), когда функция возвращает управление, кадр уничтожается. Размер у стека фиксированный (8 MiB).

.env (0xfffffff...)
Аргументы командной строки и переменных окружения. Это могут быть argc, argv, envp (переменные окружения).

.debug
Ключ -g при компиляции, добавляется отладочная информация.

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

#memory #theory
7👍4🔥3❤‍🔥1
Утилита tig — это текстовый интерфейс для работы с системой контроля версий Git. Она предоставляет удобный способ просмотра истории коммитов, различий между версиями файлов и других данных, связанных с репозиториями Git, в терминале.

Основные функции tig включают:

- Просмотр истории коммитов в виде удобного списка.
- Отображение изменений в файлах между коммитами.
- Навигация по веткам и тегам.
- Интерактивный поиск по истории коммитов.

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

-> GitHub
Проект написан на С и имеет около 180 issues, на мой взгляд отличный проект, чтобы начать путь вкладчика.

#software #opensource #utils
🔥10👍5
Утилита tree, которая выводит содержимое директории в древовидном формате

Установка:
$ apt-get install tree


Вывод содержимого директории:
$ tree /path/to/directory


Указать глубину:
$ tree -L 2


Указать размер файлов:
$ tree -h


#utils
👍93
Утилита findmnt

Выводит примонтированные ФС в виде древовидной формы:
$ findmnt


Вывести в виде списка:
$ findmnt -l


Вывести определенный тип файловой системы, например ext4:
$ findmnt -t ext4


#utils
👍15
Виртуальная память, общий вид

#memory #theory
🔥8👍54
Физическая память (компоненты)

Вот некоторые компоненты, которые входят в управление памятью в ядре Linux:

1. Менеджер памяти (Memory Manager): Отвечает за управление памятью в системе, включая выделение и освобождение памяти для процессов, управление страницами памяти и своппинг.

2. Страницы памяти (Memory Pages): Физическая память разделена на блоки фиксированного размера, называемые страницами. Ядро управляет этими страницами, отслеживая их использование и перемещая их между различными областями памяти (например, активными, неактивными, свободными).

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

3. Таблицы страниц (Page Tables): Используются для отображения виртуальных адресов памяти на физические адреса. Каждый процесс имеет свою таблицу страниц, которая используется при переводе виртуального адреса в физический.

4. Служба кэширования страниц (Page Cache): Часть памяти, используемая для кэширования содержимого файлов. Это ускоряет доступ к файлам, сохраняя их данные в памяти.

5. Буферы (Buffers): Используются для кэширования данных, предназначенных для блочных устройств, таких как жесткие диски.

6. Слэб аллокатор (Slab Allocator): Специализированный аллокатор памяти для часто создаваемых и уничтожаемых структур данных в ядре, таких как объекты task_struct.

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

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

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

#memory #theory
7
Виртуальная память (компоненты)

1. .text

2. .data

3. .bss

4. Heap (куча)

5. Stack (стек)

6. Shared Memory (Разделяемая память).

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

Более подробный разбор и описание секций в этом посте.

#memory #theory
5
Shared Memory (Разделяемая память)

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

В операционных системах, таких как Unix и Linux, разделяемая память позволяет процессам более эффективно обмениваться большими объемами данных, поскольку данные не нужно копировать между процессами; вместо этого данные существуют в общем пространстве памяти, к которому все процессы имеют доступ. Это также может увеличить производительность приложений, поскольку доступ к разделяемой памяти обычно быстрее, чем использование других механизмов IPC, таких, как каналы (pipes) или сокеты.

#memory #theory
👍101
Разбор секций вывода команды:
$ free -h


Часть 1.

Секция shared (Shared Memory) хранит загружаемые динамические библиотеки и данные, которые могут быть использованы другими процессами. Все процессы получают доступ к этим данным. Разделяемые библиотеки: когда несколько процессов используют одну и ту же библиотеку, она загружается в память один раз, и этот объем памяти считается разделяемым.

#memory #utils #theory
👍9
Разбор секций вывода команды:
$ free -h


Часть 2.

Секция buff/cache (Page Cache). Забит страничным кэшом.

Наибольший объём оперативной памяти в системе обычно занят так называемым страничным кэшем (Page Cache). Вся работа с файлами на диске (запись или чтение) идет через Page Cache. Запись в Linux всегда быстрее чтения, так как запись вначале идет в Page Cache, а затем сбрасывается на диск. А при чтении ядро ищет файл в Page Cache, и если не находит, то читает файл с диска.

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

#memory #utils #theory
👍134