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
Это не реклама, просто делюсь. Приобрел портативную игровую приставку 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
Страничный кэш и vmtouch

Существует утилита vmtouch, она может показать какой процент указанного файла находится в страничном кэше:
$ vmtouch /etc/passwd


Files: 1
Directories: 0
Resident Pages: 1/1 4K/4K 100%
Elapsed: 5.8e-05 seconds

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

Если сделать:
$ cat /etc/passwd

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

#memory #utils #theory
👍141
😁10
Разбор опции set -e

#!/bin/bash -e
...


или

#!/bin/bash
set -e
...


При использовании данной опции будет происходить немедленный выход из скрипта, если выходное состояние команды ненулевое. Например:
#!/bin/bash -e
echo "$list" | grep '.tar.gz'
echo hello
exit 0


Если в строке $list не окажется .tar.gz паттерна, команда grep не сработает, вернется отрицательный код состояния и произойдет выход из скрипта. Строка echo hello (и дальнейшие команды) не отработают, НО, можно писать такие штуки (обход завершения скрипта при ошибке команды):
#!/bin/bash -e
$(echo "$list" | grep '.tar.gz') || true
echo hello
exit 0


Тогда скрипт отработает полностью, в выводе будет hello.

Еще пример:
#!/bin/bash -e
rm /path/to/no/exist/file || true # ENOENT
echo hello
exit 0


Обход произошел, в выводе видно hello. Думаю принцип понятен.

#shell
🔥103👍3👏2
Упрощение скрипта, пример с chmod и umask

При создании новых директорий в сценарии или файлов (не важно), часто используются команды mkdir и chmod, чтобы задать нужные права доступа. Например:
#!/bin/bash
mkdir ~/a
chmod 700 ~/a
mkdir ~/b
chmod 700 ~/b


Однако, чтобы избежать повторения команды chmod, можно установить маску прав доступа в начале скрипта с помощью команды umask. Это позволит автоматически задавать нужные права доступа для всех последующих создаваемых файлов и директорий. Например:
#!/bin/bash
umask 077
mkdir ~/a
mkdir ~/b


Теперь, все создаваемые директории будут автоматически иметь права доступа 0700/drwx------, а файлы 0600/-rw-------, что значительно упрощает скрипт и делает его более читабельным и аккуратным.

#shell
👍13
Разница между su и sudo

Этот вопрос часто задают на позицию системного администратора Linux =)

su -> switch user
Команда su позволяет войти в систему под учетной записью другого пользователя, предоставляя полный доступ ко всем ресурсам и привилегиям этого пользователя. При использовании команды su, пользователь должен знать пароль от аккаунта, на который он хочет переключиться.

sudo -> superuser do
Позволяет выполнить определенную команду с правами суперпользователя (root), не выходя из текущей учетной записи. Команда sudo требует, чтобы пользователь был включен в файле настроек sudoers и вводил пароль своей учетной записи для подтверждения действия.

#utils #theory
👍135🔥21
Разница между /etc/passwd и /etc/shadow файлами

Этот вопрос часто задают на позицию системного администратора Linux =)

/etc/passwd хранит информацию о пользователях.
/etc/shadow хранит информацию, необходимую для аутентификации пользователей при входе в систему.

В отличие от /etc/passwd, файл /etc/shadow доступен только для чтения суперпользователю (root), чтобы обеспечить безопасность хранения паролей.

На моей Debian системе:
/etc/passwd -> 0644/-rw-r--r--
/etc/shadow -> 0640/-rw-r-----


Когда создаются новые группы и пользователи, файлы /etc/passwd, /etc/group, /etc/shadow изменяются. Обычные пользователи начинаются с 1000, а с UID 1-499 или 1-999 это псевдопользователи и они выполняют системные службы (от их лица), у них нет оболочки (nologin). А у обычных пользователей есть (обычно это bash).

Если в /etc/passwd вместо x поставить hash сумму из /etc/shadow пароль подойдет, и все будет работать без ошибок, например:
user1:$y$j9T$ICRkTA/TqMwVPxvGJUJ9Y1$A4spI3g11fRL0mqUB34tmzILUCCVSMoagET3cFjcQhD:1002:1002:,,,:/home/user1:/bin/bash


Если убрать x в /etc/passwd у конкретного пользователя, тогда пользователь будет без пароля (не будет установлен пароль). Это позволяет пользователю user1 входить в систему без ввода пароля, например:
user1::/home/user:/bin/bash


Раньше хеш-пароля хранился в /etc/passwd, но его решили убрать в отдельный файл /etc/shadow, потому что /etc/passwd доступен на чтение всем, а /etc/shadow может читать только root (из соображений безопасности).

#shell #security #theory
❤‍🔥12👍6👏2
Разница между терминалом и консолью. Что такое эмуляторы терминала

Меня немного коробит когда терминал называют консолью, контекст: "Попробуй эти команды в консоли" (хотя на самом деле имеют в виду терминал), это совсем разные вещи, а если быть еще правильнее, то не терминал, а эмулятор терминала.

Эмуляторы терминала, такие как GNOME Terminal, Konsole, xfce4-terminal, Terminator и многие другие, имитируют функциональность физических терминалов, обеспечивая удобный доступ к командной строке в графической среде. В прошлом это были физические устройства (терминалы) с экраном и клавиатурой, подключенные к мейнфрейму. Сейчас, в современных операционных системах, мы используем программные эмуляторы терминалов.

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

Терминал возвращает /dev/pts/<n> – псевдотерминальное устройство.
Консоль возвращает /dev/tty/<n> – представляет собой физический или виртуальный терминал на уровне ядра.

Можно отправить что-либо с ввода в вывод другого терминала, это весело:
$ echo "Hello" > /dev/pts/0


#kernel #terminal #theory
👍17🔥3🥱31❤‍🔥1👎1👌1