Физическая память (компоненты)
Вот некоторые компоненты, которые входят в управление памятью в ядре Linux:
1. Менеджер памяти (Memory Manager): Отвечает за управление памятью в системе, включая выделение и освобождение памяти для процессов, управление страницами памяти и своппинг.
2. Страницы памяти (Memory Pages): Физическая память разделена на блоки фиксированного размера, называемые страницами. Ядро управляет этими страницами, отслеживая их использование и перемещая их между различными областями памяти (например, активными, неактивными, свободными).
Управление памятью с помощью страниц позволяет операционной системе эффективнее использовать память, обеспечивать защиту памяти и использовать техники виртуализации памяти, такие как подкачка (swapping) и разделяемая память.
3. Таблицы страниц (Page Tables): Используются для отображения виртуальных адресов памяти на физические адреса. Каждый процесс имеет свою таблицу страниц, которая используется при переводе виртуального адреса в физический.
4. Служба кэширования страниц (Page Cache): Часть памяти, используемая для кэширования содержимого файлов. Это ускоряет доступ к файлам, сохраняя их данные в памяти.
5. Буферы (Buffers): Используются для кэширования данных, предназначенных для блочных устройств, таких как жесткие диски.
6. Слэб аллокатор (Slab Allocator): Специализированный аллокатор памяти для часто создаваемых и уничтожаемых структур данных в ядре, таких как объекты
Слэб аллокатор используется процессами ядра, включая kworkers и kthreads, для выделения памяти под структуры данных, необходимые им для выполнения своих задач. Слэб аллокатор помогает этим процессам и потокам ядра эффективно управлять памятью, выделяя и освобождая память для часто используемых структур данных, что улучшает общую производительность системы.
7. Система свапа (Swap): Механизм, позволяющий использовать часть жесткого диска как расширение физической памяти, перемещая на диск те страницы памяти, которые редко используются.
Физическая память ядра обычно защищена от прямого доступа пользовательскими процессами, так как ошибка в таком процессе может привести к сбою всей системы. Вместо этого, пользовательские процессы работают с виртуальной памятью, и когда они нуждаются в ресурсах ядра, они используют системные вызовы, которые являются контролируемым способом взаимодействия с ядром.
#memory #theory
Вот некоторые компоненты, которые входят в управление памятью в ядре 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
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
Это механизм, который позволяет двум или более процессам обмениваться данными путем доступа к одному и тому же участку физической памяти. Это один из методов межпроцессного взаимодействия (Inter-Process Communication, IPC).
В операционных системах, таких как Unix и Linux, разделяемая память позволяет процессам более эффективно обмениваться большими объемами данных, поскольку данные не нужно копировать между процессами; вместо этого данные существуют в общем пространстве памяти, к которому все процессы имеют доступ. Это также может увеличить производительность приложений, поскольку доступ к разделяемой памяти обычно быстрее, чем использование других механизмов IPC, таких, как каналы (pipes) или сокеты.
#memory #theory
👍10❤1
Разбор секций вывода команды:
Часть 1.
Секция shared (Shared Memory) хранит загружаемые динамические библиотеки и данные, которые могут быть использованы другими процессами. Все процессы получают доступ к этим данным. Разделяемые библиотеки: когда несколько процессов используют одну и ту же библиотеку, она загружается в память один раз, и этот объем памяти считается разделяемым.
#memory #utils #theory
$ free -h
Часть 1.
Секция shared (Shared Memory) хранит загружаемые динамические библиотеки и данные, которые могут быть использованы другими процессами. Все процессы получают доступ к этим данным. Разделяемые библиотеки: когда несколько процессов используют одну и ту же библиотеку, она загружается в память один раз, и этот объем памяти считается разделяемым.
#memory #utils #theory
👍9
Разбор секций вывода команды:
Часть 2.
Секция buff/cache (Page Cache). Забит страничным кэшом.
Наибольший объём оперативной памяти в системе обычно занят так называемым страничным кэшем (Page Cache). Вся работа с файлами на диске (запись или чтение) идет через Page Cache. Запись в Linux всегда быстрее чтения, так как запись вначале идет в Page Cache, а затем сбрасывается на диск. А при чтении ядро ищет файл в Page Cache, и если не находит, то читает файл с диска.
Когда вы создаете новый файл в Linux и записываете в него данные, в первую очередь информация попадает в кэш операционной системы (а страницы памяти для этого файла помечаются как грязные), а не напрямую на диск. Это делается для увеличения производительности, поскольку работа с кэшем памяти быстрее, чем с диском.
#memory #utils #theory
$ free -h
Часть 2.
Секция buff/cache (Page Cache). Забит страничным кэшом.
Наибольший объём оперативной памяти в системе обычно занят так называемым страничным кэшем (Page Cache). Вся работа с файлами на диске (запись или чтение) идет через Page Cache. Запись в Linux всегда быстрее чтения, так как запись вначале идет в Page Cache, а затем сбрасывается на диск. А при чтении ядро ищет файл в Page Cache, и если не находит, то читает файл с диска.
Когда вы создаете новый файл в Linux и записываете в него данные, в первую очередь информация попадает в кэш операционной системы (а страницы памяти для этого файла помечаются как грязные), а не напрямую на диск. Это делается для увеличения производительности, поскольку работа с кэшем памяти быстрее, чем с диском.
#memory #utils #theory
👍13❤4
Страничный кэш и vmtouch
Существует утилита
Files: 1
Directories: 0
Resident Pages: 1/1 4K/4K 100%
Elapsed: 5.8e-05 seconds
Таким образом, вся информация файла
Если сделать:
то файл будет прочитан из памяти RAM, а не с диска. Когда вы запрашиваете чтение файла, система сначала проверяет, есть ли данные файла в кэше, и если они там есть, то читает их оттуда, минуя необходимость обращения к диску.
#memory #utils #theory
Существует утилита
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
👍14❤1
Разбор опции set -e
или
При использовании данной опции будет происходить немедленный выход из скрипта, если выходное состояние команды ненулевое. Например:
Если в строке
Тогда скрипт отработает полностью, в выводе будет hello.
Еще пример:
Обход произошел, в выводе видно hello. Думаю принцип понятен.
#shell
#!/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
🔥10❤3👍3👏2
Упрощение скрипта, пример с chmod и umask
При создании новых директорий в сценарии или файлов (не важно), часто используются команды
Однако, чтобы избежать повторения команды
Теперь, все создаваемые директории будут автоматически иметь права доступа
#shell
При создании новых директорий в сценарии или файлов (не важно), часто используются команды
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
Команда
sudo -> superuser do
Позволяет выполнить определенную команду с правами суперпользователя (root), не выходя из текущей учетной записи. Команда
#utils #theory
Этот вопрос часто задают на позицию системного администратора Linux =)
su -> switch user
Команда
su позволяет войти в систему под учетной записью другого пользователя, предоставляя полный доступ ко всем ресурсам и привилегиям этого пользователя. При использовании команды su, пользователь должен знать пароль от аккаунта, на который он хочет переключиться.sudo -> superuser do
Позволяет выполнить определенную команду с правами суперпользователя (root), не выходя из текущей учетной записи. Команда
sudo требует, чтобы пользователь был включен в файле настроек sudoers и вводил пароль своей учетной записи для подтверждения действия.#utils #theory
👍13✍5🔥2❤1
Разница между /etc/passwd и /etc/shadow файлами
Этот вопрос часто задают на позицию системного администратора Linux =)
В отличие от
На моей Debian системе:
Когда создаются новые группы и пользователи, файлы
Если в
Если убрать
Раньше хеш-пароля хранился в
#shell #security #theory
Этот вопрос часто задают на позицию системного администратора 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.
Терминал возвращает
Консоль возвращает
Можно отправить что-либо с ввода в вывод другого терминала, это весело:
#kernel #terminal #theory
Меня немного коробит когда терминал называют консолью, контекст: "Попробуй эти команды в консоли" (хотя на самом деле имеют в виду терминал), это совсем разные вещи, а если быть еще правильнее, то не терминал, а эмулятор терминала.
Эмуляторы терминала, такие как GNOME Terminal, Konsole, xfce4-terminal, Terminator и многие другие, имитируют функциональность физических терминалов, обеспечивая удобный доступ к командной строке в графической среде. В прошлом это были физические устройства (терминалы) с экраном и клавиатурой, подключенные к мейнфрейму. Сейчас, в современных операционных системах, мы используем программные эмуляторы терминалов.
Для работы с консолью GUI не нужен. Консоль предоставляет низкоуровневый интерфейс для взаимодействия с системой, особенно полезный в случаях, когда графическая оболочка не работает из-за проблем с драйверами видеокарты или других сбоев. Терминал же был создан для того, чтобы было возможно использовать консольные утилиты в графической среде. Эмуляторы терминалов позволяют запускать интерактивные оболочки в GUI.
Терминал возвращает
/dev/pts/<n> – псевдотерминальное устройство.Консоль возвращает
/dev/tty/<n> – представляет собой физический или виртуальный терминал на уровне ядра.Можно отправить что-либо с ввода в вывод другого терминала, это весело:
$ echo "Hello" > /dev/pts/0
#kernel #terminal #theory
👍17🔥3🥱3❤1❤🔥1👎1👌1
Что такое монолитное ядро?
Монолитное ядро - это архитектура операционной системы, при которой ядро системы является единым целым и работает в одном адресном пространстве. Все основные компоненты системы, такие как драйверы устройств, файловая система, управление памятью и прочее, интегрированы непосредственно в ядро и выполняются в режиме ядра, то есть с максимальными привилегиями.
Это противоположно микроядерной архитектуре, где эти компоненты выполняются отдельно как пользовательские процессы. Примерами операционных систем с монолитным ядром являются: Linux, Windows и macOS.
#kernel #theory
Монолитное ядро - это архитектура операционной системы, при которой ядро системы является единым целым и работает в одном адресном пространстве. Все основные компоненты системы, такие как драйверы устройств, файловая система, управление памятью и прочее, интегрированы непосредственно в ядро и выполняются в режиме ядра, то есть с максимальными привилегиями.
Это противоположно микроядерной архитектуре, где эти компоненты выполняются отдельно как пользовательские процессы. Примерами операционных систем с монолитным ядром являются: Linux, Windows и macOS.
#kernel #theory
✍14👍3👏2🥱1
Immutable files (extended attributes - lsattr, chattr)
Например, необходимо ограничить доступ к файлу (запрет удаления, переименования). Можно добавить биты с помощью chmod и chown, но это не идеальное решение, root все же будет иметь полный доступ к файлу. С помощью chattr можно устанавливать и отключать атрибуты файлов на уровне ФС, независимо от стандартных чтение, запись, выполнение. Такие трюки поддерживают ФС семейства ext (ext2, ext3, ext4), NFS не поддерживает immutable files. Символы '+', '-', '=' - работают аналогично chmod команде.
--------------e------- <file>
Флаг 'e' в выводе команды lsattr показывает, что файл имеет установленный атрибут "extended attributes" (дополнительные атрибуты). Это означает, что можно использовать команду chattr для добавления или изменения дополнительных атрибутов для этого файла.
<file>: Operation not permitted
Можно воспользоваться:
или
Трюк с привилегией CAP_LINUX_IMMUTABLE:
rm: cannot remove '<file>': Operation not permitted
rm: cannot remove '<file>': Operation not permitted
mv: cannot move '<file>' to 'new-name': Operation not permitted
mv: cannot move '<file>' to 'new-name': Operation not permitted
Получился неизменяемый файл.
#theory #security #utils
Например, необходимо ограничить доступ к файлу (запрет удаления, переименования). Можно добавить биты с помощью chmod и chown, но это не идеальное решение, root все же будет иметь полный доступ к файлу. С помощью chattr можно устанавливать и отключать атрибуты файлов на уровне ФС, независимо от стандартных чтение, запись, выполнение. Такие трюки поддерживают ФС семейства ext (ext2, ext3, ext4), NFS не поддерживает immutable files. Символы '+', '-', '=' - работают аналогично chmod команде.
$ touch <file>
$ lsattr <file>
--------------e------- <file>
Флаг 'e' в выводе команды lsattr показывает, что файл имеет установленный атрибут "extended attributes" (дополнительные атрибуты). Это означает, что можно использовать команду chattr для добавления или изменения дополнительных атрибутов для этого файла.
$ chattr =i <file>
<file>: Operation not permitted
Можно воспользоваться:
$ sudo chattr =i <file>
или
Трюк с привилегией CAP_LINUX_IMMUTABLE:
$ sudo setcap cap_linux_immutable+ep /usr/bin/chattr
$ chattr =i <file>
$ rm <file>
rm: cannot remove '<file>': Operation not permitted
$ sudo rm <file>
rm: cannot remove '<file>': Operation not permitted
$ mv <file> new-name
mv: cannot move '<file>' to 'new-name': Operation not permitted
$ sudo mv <file> new-name
mv: cannot move '<file>' to 'new-name': Operation not permitted
$ sudo setcap -r /usr/bin/chattr
Получился неизменяемый файл.
#theory #security #utils
👍9🔥3✍2❤1
Язык программирования Си.pdf
2.3 MB
Язык программирования Си. Брайан Керниган, Деннис Ритчи (3 издание).
Данная классика обязана быть здесь. Вдруг еще остались люди, которые не читали.
#books #software
Данная классика обязана быть здесь. Вдруг еще остались люди, которые не читали.
#books #software
😍8🙏4
Последовательность изучения материала (roadmap)
Я не очень положительно отношусь к таким схемам изучения материала, на мой взгляд они очень обширные (можно утонуть), давит объем информации (ведь ты разработчик - должен знать все в мире). Может вы не обращайте на это внимание и данный репозиторий будет вам полезен, он довольно популярен, часто обновляется и можно использовать как шпаргалку. Там для каждого найдется полезная информация, не только для разработчиков.
> GitHub
Например, вот Linux Roadmap довольно понятный, ничего лишнего.
#misc #thoughts
Я не очень положительно отношусь к таким схемам изучения материала, на мой взгляд они очень обширные (можно утонуть), давит объем информации (ведь ты разработчик - должен знать все в мире). Может вы не обращайте на это внимание и данный репозиторий будет вам полезен, он довольно популярен, часто обновляется и можно использовать как шпаргалку. Там для каждого найдется полезная информация, не только для разработчиков.
> GitHub
Например, вот Linux Roadmap довольно понятный, ничего лишнего.
#misc #thoughts
👍9👎1🤔1
Distrowatch - это сайт, который предоставляет информацию о различных дистрибутивах Linux и других Unix подобных операционных системах, включая обзоры, рейтинги, новости, ссылки на загрузку и сообщества поддержки. Он помогает пользователям выбирать и сравнивать дистрибутивы, оставаться в курсе обновлений и получать доступ к ресурсам для изучения и экспериментов с Linux.
Например, за последние 6 месяцев был очень популярен дистрибутив MX Linux.
Чем больше посетителей просматривают страницу конкретного дистрибутива, тем выше его рейтинг по популярности. Таким образом, этот рейтинг может помочь пользователям оценить, какие дистрибутивы вызывают наибольший интерес в сообществе.
Ссылка: distrowatch.com
#misc
Например, за последние 6 месяцев был очень популярен дистрибутив MX Linux.
Чем больше посетителей просматривают страницу конкретного дистрибутива, тем выше его рейтинг по популярности. Таким образом, этот рейтинг может помочь пользователям оценить, какие дистрибутивы вызывают наибольший интерес в сообществе.
Ссылка: distrowatch.com
#misc
👍4🤷♂1
Как устроена память в Linux и как эффективно с ней работать. Отличный урок, рекомендую, сам узнал много полезного, и главное все можно на практике попробовать, а не сухая теория.
Ссылка: https://www.youtube.com/watch?v=gSsChHMjugs
#memory #theory
Ссылка: https://www.youtube.com/watch?v=gSsChHMjugs
#memory #theory
YouTube
Память в Linux. Cache, swap, dirty pages // Демо-занятие курса «Administrator Linux. Professional»
Приглашаем вас 17 октября, во вторник, в 20:00 мск на бесплатный открытый урок по теме: «Память в Linux. Cache, swap, dirty pages». Мы обсудим, как устроена память в Linux и как эффективно с ней работать.
«Administrator Linux. Professional» - https://otus.pw/kb66/…
«Administrator Linux. Professional» - https://otus.pw/kb66/…
👍2🔥2❤1👏1