GNU/Linux | Notes
Open in Telegram
Open Source, GNU/Linux, Debian/Ubuntu, Dotfiles, Software, Scripts, Notes, Terminal, Shell, Tools, Games, Fun, Misc, Music, Geek, Free Software Movement. Почта: krekhov.dev@gmail.com Кто я: https://t.me/krxnotes/246 GitHub: https://github.com/krekhovx
Show more2 280
Subscribers
-124 hours
-17 days
-1230 days
Posts Archive
2 280
Разница между su и sudo.
Этот вопрос часто задают на позицию системного администратора Linux =)
su -> switch user
Команда
su позволяет войти в систему под учетной записью другого пользователя, предоставляя полный доступ ко всем ресурсам и привилегиям этого пользователя. При использовании команды su, пользователь должен знать пароль от аккаунта, на который он хочет переключиться.
sudo -> superuser do
Позволяет выполнить определенную команду с правами суперпользователя (root), не выходя из текущей учетной записи. Команда sudo требует, чтобы пользователь был включен в файле настроек sudoers и вводил пароль своей учетной записи для подтверждения действия.
———
@krxnotes2 280
Упрощение скрипта, пример с 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-------, что значительно упрощает скрипт и делает его более читабельным и аккуратным.
———
@krxnotes2 280
Разбор опции 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. Думаю принцип понятен.
———
@krxnotes2 280
Страничный кэш и 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, а не с диска. Когда вы запрашиваете чтение файла, система сначала проверяет, есть ли данные файла в кэше, и если они там есть, то читает их оттуда, минуя необходимость обращения к диску.
———
@krxnotes2 280
Разбор секций вывода команды:
$ free -h
Часть 2.
Секция buff/cache (Page Cache). Забит страничным кэшом.
Наибольший объём оперативной памяти в системе обычно занят так называемым страничным кэшем (Page Cache). Вся работа с файлами на диске (запись или чтение) идет через Page Cache. Запись в Linux всегда быстрее чтения, так как запись вначале идет в Page Cache, а затем сбрасывается на диск. А при чтении ядро ищет файл в Page Cache, и если не находит, то читает файл с диска.
Когда вы создаете новый файл в Linux и записываете в него данные, в первую очередь информация попадает в кэш операционной системы (а страницы памяти для этого файла помечаются как грязные), а не напрямую на диск. Это делается для увеличения производительности, поскольку работа с кэшем памяти быстрее, чем с диском.
———
@krxnotes2 280
Разбор секций вывода команды:
$ free -h
Часть 1.
Секция shared (Shared Memory) хранит загружаемые динамические библиотеки и данные, которые могут быть использованы другими процессами. Все процессы получают доступ к этим данным. Разделяемые библиотеки: когда несколько процессов используют одну и ту же библиотеку, она загружается в память один раз, и этот объем памяти считается разделяемым.
———
@krxnotes2 280
Shared Memory (Разделяемая память).
Это механизм, который позволяет двум или более процессам обмениваться данными путем доступа к одному и тому же участку физической памяти. Это один из методов межпроцессного взаимодействия (Inter-Process Communication, IPC).
В операционных системах, таких как Unix и Linux, разделяемая память позволяет процессам более эффективно обмениваться большими объемами данных, поскольку данные не нужно копировать между процессами; вместо этого данные существуют в общем пространстве памяти, к которому все процессы имеют доступ. Это также может увеличить производительность приложений, поскольку доступ к разделяемой памяти обычно быстрее, чем использование других механизмов IPC, таких, как каналы (pipes) или сокеты.
———
@krxnotes
2 280
Виртуальная память (компоненты).
1. .text
2. .data
3. .bss
4. Heap (куча)
5. Stack (стек)
6. Shared Memory (Разделяемая память).
Эти секции находятся в виртуальном адресном пространстве процесса и управляются страничным механизмом операционной системы для отображения в физическую память.
Более подробный разбор и описание секций в этом посте.
———
@krxnotes
2 280
Физическая память (компоненты).
Вот некоторые компоненты, которые входят в управление памятью в ядре 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): Механизм, позволяющий использовать часть жесткого диска как расширение физической памяти, перемещая на диск те страницы памяти, которые редко используются.
Физическая память ядра обычно защищена от прямого доступа пользовательскими процессами, так как ошибка в таком процессе может привести к сбою всей системы. Вместо этого, пользовательские процессы работают с виртуальной памятью, и когда они нуждаются в ресурсах ядра, они используют системные вызовы, которые являются контролируемым способом взаимодействия с ядром.
———
@krxnotes2 280
Утилита findmnt.
Выводит примонтированные ФС в виде древовидной формы:
$ findmnt
Вывести в виде списка:
$ findmnt -l
Вывести определенный тип файловой системы, например ext4:
$ findmnt -t ext4
———
@krxnotes2 280
Утилита tree, которая выводит содержимое директории в древовидном формате.
Установка:
$ sudo apt-get install tree
Вывод содержимого директории:
$ tree /path/to/directory
Указать глубину:
$ tree -L 2
Указать размер файлов:
$ tree -h
———
@krxnotes2 280
Утилита tig — это текстовый интерфейс для работы с системой контроля версий Git. Она предоставляет удобный способ просмотра истории коммитов, различий между версиями файлов и других данных, связанных с репозиториями Git, в терминале.
Основные функции tig включают:
- Просмотр истории коммитов в виде удобного списка.
- Отображение изменений в файлах между коммитами.
- Навигация по веткам и тегам.
- Интерактивный поиск по истории коммитов.
Тig особенно полезен для разработчиков, которые предпочитают работать в терминале и нуждаются в мощных инструментах для анализа состояния репозитория.
-> Github
Проект написан на С и имеет около 180 issues, на мой взгляд отличный проект, чтобы начать путь вкладчика.
———
@krxnotes
2 280
Foo и Bar - смысл, традиция, история.
Это часто используемые метасинтаксические переменные в программировании и компьютерной литературе. Они служат для обозначения абстрактных переменных, функций, или других объектов, когда конкретные имена не важны или не известны. Использование этих терминов помогает разработчикам сосредоточиться на структуре и логике кода, а не на именах переменных.
Вот несколько причин, почему foo и bar так часто используются:
1. Традиция: Эти термины существуют с самого начала эры программирования и используются в учебниках, документации и примерах кода. Эта традиция продолжается и по сей день, потому что многие разработчики уже знакомы с этими терминами.
2. Универсальность: foo и bar не несут в себе никакого конкретного значения, что делает их идеальными для использования в качестве временных имен. Они могут обозначать что угодно — от переменных и функций до классов и объектов.
3. Легкость в запоминании: Эти короткие и простые слова легко запомнить и набрать, что делает их удобными для использования в примерах и тестовом коде.
4. Избежание конфликтов: Поскольку foo и bar не используются в реальных проектах, они минимизируют вероятность конфликтов с именами переменных, которые уже могут быть в коде.
История этих метасинтаксических переменных восходит к ранним дням компьютерной науки и хакерской культуры. Они, вероятно, происходят от военных терминов "FUBAR" (fouled up beyond all recognition -> испорченный до неузнаваемости), используемых во время Второй мировой войны, которые потом были адаптированы в область компьютерных наук.
Вместе с "foo" и "bar" иногда используются и другие похожие термины, такие как "baz", "qux", "quux" и так далее, особенно когда требуется несколько абстрактных имен.
———
@krxnotes
2 280
Free Software Movement и Open Source - это схожие, но разные концепции.
Free Software Movement (движение за свободное программное обеспечение) фокусируется на свободах пользователей: запускать, изучать, изменять и распространять программы. Его основоположник - Ричард Столлман. Free Software Movement использует термин "свободное программное обеспечение" (free software), где "free" означает свободу, а не отсутствие стоимости.
Open Source (открытое ПО) подчеркивает практические преимущества открытого кода: улучшенная безопасность, гибкость и сотрудничество. Оно менее акцентируется на этических вопросах по сравнению с Free Software Movement.
———
@krxnotes
2 280
Адресное пространство процесса (память процесса).
Когда программа запускается на выполнение, ядро выделяет для нее место в оперативной памяти.
Память запущенной программы (процесса) разделена на ряд непрерывных секций. Команды из секций выполняются последовательно. При развертывании программы секции разделяются и каждая готова для работы.
Некоторые секции уже известны перед запуском процесса
.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 при компиляции, добавляется отладочная информация.
Программист, когда использует в программе указатели, использует память процесса (адресное пространство) и работает только с ней! Указатели = работа с адресным пространством процесса (логические адреса).
———
@krxnotes2 280
+2
Это не реклама, просто делюсь. Приобрел портативную игровую приставку Anbernic RG35XX Plus на базе Linux с возможностью играть в ретро-игры, поддерживает игры с различных платформ типа PSP, PS1, Game Boy и т.д (платформ довольно много, а игр около 5000). Подарок прям радует, сборка отличная, картинка неплохая (IPS экран), но вот для меня экран маловат (разрешение 640x480) глаза устают после часа игры, благо консоль имеет порт Mini HDMI, приобрел кабель и подключаю консоль к монитору, проблема глаз решена. Я удивился как быстро и без проблем картинка подстроилась под большой монитор. Я хотел приобрести Steam Deck, но решил начать с чего-то более простого. Короче, старичкам советую!
———
@krxnotes
2 280
Случайно увидел. Dirk из USA украинизировался! Выглядит очень смешно ))
———
@krxnotes
Available now! Telegram Research 2025 — the year's key insights 
