sync
Всё что хранилось в памяти, буферах, кэшах, будет записано на диск, предотвращается потеря данных. Ядро хранит данные в памяти во избежание частых (обычно медленных) дисковых операций чтения и записи. Это повышает производительность, но если компьютер аварийно завершает работу, данные могут быть утеряны, либо может быть повреждена файловая система. sync гарантирует, что все, что хранилось в памяти, будет записано на диск.
Например в выводе команды:
В секции buff/cache можно увидеть кол-во используемой памяти и вот именно она будет сброшена на диск.
Например:
Так как это обеспечит более надежное сохранение данных на диск. Команда sync гарантирует, что все данные, находящиеся в оперативной памяти, будут записаны на диск перед тем как размонтировать файловую систему.
Команда sync в Linux предназначена для записи данных из кэша (включая буфер и кэш страниц) на диск. Однако она не очищает кэш и буферы. То есть, после выполнения команды sync, данные остаются в кэше, но они уже записаны на диск, что обеспечивает их сохранность в случае отключения питания или сбоя. Поэтому, если вы используете команду sync и затем проверяете секцию buff/cache с помощью команды free -h, вы не увидите уменьшения этой секции. Это нормальное поведение.
#memory #utils
Всё что хранилось в памяти, буферах, кэшах, будет записано на диск, предотвращается потеря данных. Ядро хранит данные в памяти во избежание частых (обычно медленных) дисковых операций чтения и записи. Это повышает производительность, но если компьютер аварийно завершает работу, данные могут быть утеряны, либо может быть повреждена файловая система. sync гарантирует, что все, что хранилось в памяти, будет записано на диск.
Например в выводе команды:
$ free -h
В секции buff/cache можно увидеть кол-во используемой памяти и вот именно она будет сброшена на диск.
Например:
$ sync; umount /mnt
Так как это обеспечит более надежное сохранение данных на диск. Команда sync гарантирует, что все данные, находящиеся в оперативной памяти, будут записаны на диск перед тем как размонтировать файловую систему.
Команда sync в Linux предназначена для записи данных из кэша (включая буфер и кэш страниц) на диск. Однако она не очищает кэш и буферы. То есть, после выполнения команды sync, данные остаются в кэше, но они уже записаны на диск, что обеспечивает их сохранность в случае отключения питания или сбоя. Поэтому, если вы используете команду sync и затем проверяете секцию buff/cache с помощью команды free -h, вы не увидите уменьшения этой секции. Это нормальное поведение.
#memory #utils
✍6❤2🍌1
gcc: основные переменные для компиляции и линковки
CC
Относится к компилятору (gcc, cc и т.д.).
CFLAGS
Этап компиляции.
(Compiler Flags) - это флаги, передаваемые компилятору (например, gcc) для управления процессом компиляции исходного кода. Они могут включать опции для оптимизации кода, установки уровня предупреждений, определения макросов и т.д. Например: -Wall, -g3, -O0, -I/usr/local/include
LDFLAGS
Этап компоновки.
(Linker Flags) - это флаги, передаваемые компоновщику (линкеру) для управления процессом компоновки объектных файлов в исполняемый файл или библиотеку. Они могут включать опции для указания путей к библиотекам, которые нужно подключить, установки версии библиотеки, определения символов и т.д. Например: -lm
LIBS
Включает в себя статические и динамические библиотеки (-lm, archive.a).
CPPFLAGS
Дополнительные флаги для препроцессора.
Переменные вида CXX относятся к C++, например CXXFLAGS
Опции предупреждений gcc:
-Werror, -Wall
Языковой стандарт:
-std=c99 -ansi
#build #theory
CC
Относится к компилятору (gcc, cc и т.д.).
CFLAGS
Этап компиляции.
(Compiler Flags) - это флаги, передаваемые компилятору (например, gcc) для управления процессом компиляции исходного кода. Они могут включать опции для оптимизации кода, установки уровня предупреждений, определения макросов и т.д. Например: -Wall, -g3, -O0, -I/usr/local/include
LDFLAGS
Этап компоновки.
(Linker Flags) - это флаги, передаваемые компоновщику (линкеру) для управления процессом компоновки объектных файлов в исполняемый файл или библиотеку. Они могут включать опции для указания путей к библиотекам, которые нужно подключить, установки версии библиотеки, определения символов и т.д. Например: -lm
LIBS
Включает в себя статические и динамические библиотеки (-lm, archive.a).
CPPFLAGS
Дополнительные флаги для препроцессора.
Переменные вида CXX относятся к C++, например CXXFLAGS
Опции предупреждений gcc:
-Werror, -Wall
Языковой стандарт:
-std=c99 -ansi
#build #theory
❤3👍1
Что такое Fingerprint?
Fingerprint — это короткий уникальный "отпечаток" (хеш-сумма) публичного ключа SSH-сервера. Он нужен для того, чтобы клиент мог убедиться, что подключается именно к тому серверу, к которому нужно, и избежать атак типа "man-in-the-middle".
При первом подключении по SSH к удаленной машине генерируется fingerprint и добавляется в файл
#theory
Fingerprint — это короткий уникальный "отпечаток" (хеш-сумма) публичного ключа SSH-сервера. Он нужен для того, чтобы клиент мог убедиться, что подключается именно к тому серверу, к которому нужно, и избежать атак типа "man-in-the-middle".
При первом подключении по SSH к удаленной машине генерируется fingerprint и добавляется в файл
~/.ssh/known_hosts, наш ПК запоминает эту комбинацию и сверяет ее при каждом входе, если кто-то переустановит SSH сервер или OC, то мы об этом узнаем, потому что изменится fingerprint.#theory
✍7
Типы файлов
1. Обычный файл (regular file): '-'
2. Каталог (directory): 'd'
3. Именованный канал (named pipe): 'p'
4. Символическая ссылка (soft link): 'l'
5. Специальный файл устройства (device file): 'c' и 'b'
6. Сокет (socket): 's'
#theory
1. Обычный файл (regular file): '-'
2. Каталог (directory): 'd'
3. Именованный канал (named pipe): 'p'
4. Символическая ссылка (soft link): 'l'
5. Специальный файл устройства (device file): 'c' и 'b'
6. Сокет (socket): 's'
#theory
✍8❤2👍2
Этапы компиляции
1. Препроцессинг (обработка - cpp компонент)
Текст обрабатывается, производится:
- замена комментариев пустыми строками
- обрабатывает директивы #define #ifdef
- включает #include (копирует содержимое файлов как текст)
2. Трансляция кода в ассемблер (cpp компонент)
- транслирует исходный текст программы в ассемблерный код
3. Компиляция (объектный файл - as компонент)
- транслирует ассемблерный код в машинный код (бинарный модуль)
- обработка и анализ кода
- выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла
- генерация кода из преобразованного, получается объектный файл
Объектный файл - это программа машинных кодов с частичным сохранением символьной информации, необходимой в процессе сборки.
При отладочной сборке возможно сохранение большого количества символьной информации (переменные,
функции, типы).
4. Компоновка - линковка (связывание воедино всех объектных файлов - ld компонент)
- определяет связь объектных файлов, нужно чтобы файл А увидел переменную в файле Б, этой задачей занимается компоновщик. Когда программа делает ссылку на функцию, содержащуюся в библиотеке, компоновщик отыскивает эту функцию (например printf()) и добавляет ее код к программе. Таким образом, к программе добавляются только те функции, которые действительно будут в ней использоваться.
При этом возможны ошибки связывания, если объявили функцию не в том месте, то получим ошибку на этом этапе.
5. Загрузка
Вызвать загрузчик для загрузки нашей программы в память.
Кратко:
исходный текст -> препроцессинг -> ассемблер -> машинный код -> компоновка -> загрузка.
Можно не вызывать данные компоненты напрямую, в компиляторе они уже включены:
cpp - препроцессор
as - ассемблер
gcc - компилятор
ld - линковка
#utils #build #theory
1. Препроцессинг (обработка - cpp компонент)
$ gcc -E main.c -o main.i
Текст обрабатывается, производится:
- замена комментариев пустыми строками
- обрабатывает директивы #define #ifdef
- включает #include (копирует содержимое файлов как текст)
2. Трансляция кода в ассемблер (cpp компонент)
$ gcc -S main.i -o main.s
- транслирует исходный текст программы в ассемблерный код
3. Компиляция (объектный файл - as компонент)
$ as main.s -o main.o
- транслирует ассемблерный код в машинный код (бинарный модуль)
- обработка и анализ кода
- выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла
- генерация кода из преобразованного, получается объектный файл
Объектный файл - это программа машинных кодов с частичным сохранением символьной информации, необходимой в процессе сборки.
При отладочной сборке возможно сохранение большого количества символьной информации (переменные,
функции, типы).
4. Компоновка - линковка (связывание воедино всех объектных файлов - ld компонент)
$ gcc main.o -o program
- определяет связь объектных файлов, нужно чтобы файл А увидел переменную в файле Б, этой задачей занимается компоновщик. Когда программа делает ссылку на функцию, содержащуюся в библиотеке, компоновщик отыскивает эту функцию (например printf()) и добавляет ее код к программе. Таким образом, к программе добавляются только те функции, которые действительно будут в ней использоваться.
При этом возможны ошибки связывания, если объявили функцию не в том месте, то получим ошибку на этом этапе.
5. Загрузка
Вызвать загрузчик для загрузки нашей программы в память.
Кратко:
исходный текст -> препроцессинг -> ассемблер -> машинный код -> компоновка -> загрузка.
Можно не вызывать данные компоненты напрямую, в компиляторе они уже включены:
cpp - препроцессор
as - ассемблер
gcc - компилятор
ld - линковка
#utils #build #theory
✍13🔥3
Этапы разработки (коротко)
1. Сбор и обработка требований
2. Получение технических заданий, планы работ
3. Разработка
- Дизайн
- Кодирование
- Тестирование
- Документирование
4. Поддержка
- Внедрение (Установка ПО, обучение пользователей)
- Сопровождение (Исправление выявленных ошибок, поддержка пользователей)
#misc
1. Сбор и обработка требований
2. Получение технических заданий, планы работ
3. Разработка
- Дизайн
- Кодирование
- Тестирование
- Документирование
4. Поддержка
- Внедрение (Установка ПО, обучение пользователей)
- Сопровождение (Исправление выявленных ошибок, поддержка пользователей)
#misc
✍11🙏1
Так выглядит официальный сайт текстового редактора vim
Разве этого хочет видеть пользователь, который заходит за техническими новостями своего любимого текстового редактора? Вряд ли. Теперь вы знаете, что администрация этого сайта поддерживает фашистов. Я зашёл НЕ на политический сайт, а на сайт Open Source проекта.
Вездесущий флаг говна и позора, который тыкают во все места, лишь бы собрать побольше звёздочек на GitHub. Инженеры используют Open Source как пропаганду своих (и не своих) политических интересов. Это не место для этого. Не трогайте Open Source!
#thoughts
Разве этого хочет видеть пользователь, который заходит за техническими новостями своего любимого текстового редактора? Вряд ли. Теперь вы знаете, что администрация этого сайта поддерживает фашистов. Я зашёл НЕ на политический сайт, а на сайт Open Source проекта.
Вездесущий флаг говна и позора, который тыкают во все места, лишь бы собрать побольше звёздочек на GitHub. Инженеры используют Open Source как пропаганду своих (и не своих) политических интересов. Это не место для этого. Не трогайте Open Source!
#thoughts
💯58👎18👍7❤4💊4😍3💅2🆒2😢1🥴1🌚1
exec
Пример:
Переменная окружения
#shell #utils
Пример:
$ exec $SHELL
Переменная окружения
$SHELL имеет значение текущей оболочки по-умолчанию (ее путь), в моем случае это /bin/bash. Что делает exec? Он заменяет текущий процесс на новый, то есть заменяет текущий /bin/bash на новый /bin/bash. Таким образом, вы остаетесь в той же оболочке, но все предыдущие настройки и процессы текущей оболочки будут сброшены. Это может быть полезно для обновления или сброса окружения без необходимости открывать новый терминал. Например, мы изменили какие-то файлы окружения пользователя, допустим это /etc/bash.bashrc, чтобы не открывать новый терминал, можно просто запустить команду сброса/запуска нового /bin/bash после изменений.#shell #utils
🔥6✍3❤3❤🔥2
Почему /bin/sh
В различных проектах часто используют НЕ
/bin/sh или Dash (Debian Almquist Shell) - легковесная оболочка командной строки, предназначенная для замены более тяжеловесного Bash. Она была создана для ускорения процесса загрузки и выполнения скриптов в системе. Поэтому многие дистрибутивы Linux, такие как Debian и Ubuntu, используют Dash в качестве оболочки по умолчанию.
Скрипты, написанные на /bin/sh, обычно используются для максимальной переносимости между различными Unix-подобными операционными системами. Оболочка /bin/sh представляет собой стандартную оболочку командной строки в Unix-подобных системах, которая должна быть доступна на всех таких системах.
В то время как /bin/bash (Bourne-Again Shell) является расширенной оболочкой командной строки, которая предоставляет больше функций, чем /bin/sh. Она представляет собой улучшенную версию стандартной оболочки /bin/sh, что делает ее более мощной и удобной для использования. Когда скрипт написан на /bin/sh, он чаще всего будет работать на всех Unix-подобных системах, исключая специфичные возможности, предоставляемые /bin/bash. Но если в скрипте используются уникальные функции /bin/bash, то он может не работать на системах, где /bin/bash не является стандартной оболочкой. Поэтому использование /bin/sh в некоторых проектах может быть обусловлено требованием максимальной переносимости скрипта между различными Unix-подобными системами.
#shell #debian
В различных проектах часто используют НЕ
/bin/bash, а /bin/sh, почему? Он же старый!/bin/sh или Dash (Debian Almquist Shell) - легковесная оболочка командной строки, предназначенная для замены более тяжеловесного Bash. Она была создана для ускорения процесса загрузки и выполнения скриптов в системе. Поэтому многие дистрибутивы Linux, такие как Debian и Ubuntu, используют Dash в качестве оболочки по умолчанию.
Скрипты, написанные на /bin/sh, обычно используются для максимальной переносимости между различными Unix-подобными операционными системами. Оболочка /bin/sh представляет собой стандартную оболочку командной строки в Unix-подобных системах, которая должна быть доступна на всех таких системах.
В то время как /bin/bash (Bourne-Again Shell) является расширенной оболочкой командной строки, которая предоставляет больше функций, чем /bin/sh. Она представляет собой улучшенную версию стандартной оболочки /bin/sh, что делает ее более мощной и удобной для использования. Когда скрипт написан на /bin/sh, он чаще всего будет работать на всех Unix-подобных системах, исключая специфичные возможности, предоставляемые /bin/bash. Но если в скрипте используются уникальные функции /bin/bash, то он может не работать на системах, где /bin/bash не является стандартной оболочкой. Поэтому использование /bin/sh в некоторых проектах может быть обусловлено требованием максимальной переносимости скрипта между различными Unix-подобными системами.
#shell #debian
✍11👍5😁2
Библиотечные функции и системные вызовы
Библиотечные функции - верхний уровень, работает в пространстве пользователя, обеспечивает более удобный интерфейс к функциям, которые выполняют работу (системным вызовам). То есть библиотечные функции обращаются к системным вызовам.
Системные вызовы - работают в привилегированном режиме от имени ядра и предоставляются самим ядром. Например, библиотечная функция printf() формирует строку, в соответствии с заданным форматом, и передает ее низкоуровневому системному вызову write(), который и выводит строку на устройство стандартного вывода.
Цепочка: Программа обращается к библиотечным функциям, находясь в пользовательском режиме. Затем библиотечная функция обращается к системным вызовам. Системные вызовы уже работают в режиме привилегированном (являются частью ядра). Затем когда системный вызов завершает работу, он возвращает управление библиотечной функции и происходит обратный переход в пользовательский режим.
Unix производит переключение из пространства пользователя в пространство ядра всякий раз, когда приложение делает системный вызов или приостанавливается аппаратным прерыванием. Например, код модуля исполняется в пространстве ядра, а обычная программа, исполняется в пространстве пользователя (прикладное ПО).
#kernel #theory
Библиотечные функции - верхний уровень, работает в пространстве пользователя, обеспечивает более удобный интерфейс к функциям, которые выполняют работу (системным вызовам). То есть библиотечные функции обращаются к системным вызовам.
Системные вызовы - работают в привилегированном режиме от имени ядра и предоставляются самим ядром. Например, библиотечная функция printf() формирует строку, в соответствии с заданным форматом, и передает ее низкоуровневому системному вызову write(), который и выводит строку на устройство стандартного вывода.
Цепочка: Программа обращается к библиотечным функциям, находясь в пользовательском режиме. Затем библиотечная функция обращается к системным вызовам. Системные вызовы уже работают в режиме привилегированном (являются частью ядра). Затем когда системный вызов завершает работу, он возвращает управление библиотечной функции и происходит обратный переход в пользовательский режим.
Unix производит переключение из пространства пользователя в пространство ядра всякий раз, когда приложение делает системный вызов или приостанавливается аппаратным прерыванием. Например, код модуля исполняется в пространстве ядра, а обычная программа, исполняется в пространстве пользователя (прикладное ПО).
#kernel #theory
✍5❤5👍1🤝1
dotfiles-debian
В репозитории находятся различные конфигурации инструментов, которые я использую при разработке в окружении XFCE для Debian: bash, vim, vifm, mc, tmux, gdb, git, newsboat, dircolors, bash-completion, xfce4-terminal, различные цветовые схемы для терминала, .bash_aliases, .bashrc, локальные скрипты и т.д.
> GitHub
#shell #terminal #dotfiles #debian #info
В репозитории находятся различные конфигурации инструментов, которые я использую при разработке в окружении XFCE для Debian: bash, vim, vifm, mc, tmux, gdb, git, newsboat, dircolors, bash-completion, xfce4-terminal, различные цветовые схемы для терминала, .bash_aliases, .bashrc, локальные скрипты и т.д.
> GitHub
#shell #terminal #dotfiles #debian #info
✍6👎4❤2👌1
Частый вопрос на позицию системного инженера Linux
В Linux нет технологии которая бы позволяла залезть процессу в память другого процесса. Но почему это может GDB (GNU Debugger)? Это возможно благодаря тому, что GDB использует отладочные интерфейсы ядра Linux (например, системный вызов
Файл
- Значение 0: Разрешает отладку всех процессов
- Значение 1: Разрешает отладку только процессов с тем же UID
- Значение 2: Запрещает отладку процессов с другим UID
#kernel #theory #security
В Linux нет технологии которая бы позволяла залезть процессу в память другого процесса. Но почему это может GDB (GNU Debugger)? Это возможно благодаря тому, что GDB использует отладочные интерфейсы ядра Linux (например, системный вызов
ptrace), которые позволяют отслеживать и изменять состояние других процессов, включая доступ к их памяти для чтения и записи. Таким образом, хотя само ядро Linux не предоставляет прямого доступа к памяти других процессов, GDB может использовать специальные механизмы для отладки и анализа процессов.Файл
/proc/sys/kernel/yama/ptrace_scope контролирует степень безопасности работы ptrace.- Значение 0: Разрешает отладку всех процессов
- Значение 1: Разрешает отладку только процессов с тем же UID
- Значение 2: Запрещает отладку процессов с другим UID
#kernel #theory #security
✍7❤3🙏2👍1
umask
Только владелец должен иметь доступ, достаточный для полноценной работы с файлами и каталогами, а остальные вообще не должны иметь прав. Эту ситуацию можно исправить изменением маски. Я рекомендую установить ее в 077. В этом случае для каталогов права будут определены так: 777 - 077 = 700 (drwx------), а для файлов: 666 - 077 = 600 (или -rw-------). Тогда доступ к файлу имеет только владелец. Все остальные - отдыхают.
Выдержка из книги Linux глазами хакера, 4 издание - Михаил Фленов.
Можно прописать в
Ссылка на калькулятор: https://wintelguy.com/umask-calc.pl
#shell #books #security #dotfiles
Только владелец должен иметь доступ, достаточный для полноценной работы с файлами и каталогами, а остальные вообще не должны иметь прав. Эту ситуацию можно исправить изменением маски. Я рекомендую установить ее в 077. В этом случае для каталогов права будут определены так: 777 - 077 = 700 (drwx------), а для файлов: 666 - 077 = 600 (или -rw-------). Тогда доступ к файлу имеет только владелец. Все остальные - отдыхают.
Выдержка из книги Linux глазами хакера, 4 издание - Михаил Фленов.
Можно прописать в
~/.bashrc для обычного пользователя:# set a secure umask to 077
# files: 600 (rw-------)
# directories: 700 (rwx------)
umask 077
Ссылка на калькулятор: https://wintelguy.com/umask-calc.pl
#shell #books #security #dotfiles
👍12🔥2🤯2