❓🤷♀️ Чем отличается команда rm от unlink?
Обе эти команды умеют удалять, но в 99% используется именно rm, потому что про unlink вы либо не слышали, либо rm с головой хватает.
Есть ошибочное мнение, что unlink предназначен для удаления лишь ссылок — команда вполне может удалять обычные файлы. А если углубиться, то весь процесс удаления в Linux, это удаление ссылок.
У unlink есть всего лишь два ключа запуска help и version. Очень ограниченный инструмент, но чем инструмент проще, тем проще его синтаксис.
# unlink /tmp/hardlink
# unlink /tmp/file
Софт очень молчаливый — после удаления, он промолчит и ничего не выведет на экран.
Команда unlink использует системную команду unlink, в то время как команда rm использует системный вызов unlinkat. Оба системных вызова практически одинаковы.
Unlink не умеет работать с wildcard и globbing шаблонами. Так же вы не сможете с помощью нее удалить каталог.
Запустим команду и пытаемся насильно удалить файл которого нет в каталоге:
rm -f test.txt
И получаем - НИЧЕГО. То есть rm -f не вернул ошибку, что файл отсутствует. А если сделать так:
unlink test.txt
получим ошибку:
unlink: cannot unlink 'test.txt': No such file or directory
То есть если нужно будет обработать результат выполнения команды rm -f, то будет непонятно, существовал ли вообще файл.
С unlink можно гибче обрабатывать эксепшены в скриптах. А еще при использовании команды unlink отсутствует проверка безопасности. Она удалит файл, защищенный от записи. Хотя современная версия rm теперь тоже так умеет.
Небольшой секрет: если нужно, чтобы файл никто не смог удалить, включая root:
chattr +i test.txt
chattr позволяет устанавливать и отключать атрибуты файлов, на уровне файловой системы не зависимо от стандартных (чтение, запись, выполнение).
Ключ i - сделает файл неизменяемым. Чтобы снять с файла этот аттрибут, в команде которая выше, замените знак «+» на «-».
Подытожим. Для большинства повседневных задач конечно rm мастхев, но если ты пишете софт для каких-то критичных систем, стоит не упускать из виду unlink.
#гайд
Обе эти команды умеют удалять, но в 99% используется именно rm, потому что про unlink вы либо не слышали, либо rm с головой хватает.
Есть ошибочное мнение, что unlink предназначен для удаления лишь ссылок — команда вполне может удалять обычные файлы. А если углубиться, то весь процесс удаления в Linux, это удаление ссылок.
У unlink есть всего лишь два ключа запуска help и version. Очень ограниченный инструмент, но чем инструмент проще, тем проще его синтаксис.
# unlink /tmp/hardlink
# unlink /tmp/file
Софт очень молчаливый — после удаления, он промолчит и ничего не выведет на экран.
Команда unlink использует системную команду unlink, в то время как команда rm использует системный вызов unlinkat. Оба системных вызова практически одинаковы.
Unlink не умеет работать с wildcard и globbing шаблонами. Так же вы не сможете с помощью нее удалить каталог.
Запустим команду и пытаемся насильно удалить файл которого нет в каталоге:
rm -f test.txt
И получаем - НИЧЕГО. То есть rm -f не вернул ошибку, что файл отсутствует. А если сделать так:
unlink test.txt
получим ошибку:
unlink: cannot unlink 'test.txt': No such file or directory
То есть если нужно будет обработать результат выполнения команды rm -f, то будет непонятно, существовал ли вообще файл.
С unlink можно гибче обрабатывать эксепшены в скриптах. А еще при использовании команды unlink отсутствует проверка безопасности. Она удалит файл, защищенный от записи. Хотя современная версия rm теперь тоже так умеет.
Небольшой секрет: если нужно, чтобы файл никто не смог удалить, включая root:
chattr +i test.txt
chattr позволяет устанавливать и отключать атрибуты файлов, на уровне файловой системы не зависимо от стандартных (чтение, запись, выполнение).
Ключ i - сделает файл неизменяемым. Чтобы снять с файла этот аттрибут, в команде которая выше, замените знак «+» на «-».
Подытожим. Для большинства повседневных задач конечно rm мастхев, но если ты пишете софт для каких-то критичных систем, стоит не упускать из виду unlink.
#гайд
👍24❤4👏2
🪛🔧 Отладка сбоя ядра
Отладка ошибки в ядре может оказаться сложной задачей.
Допустим, ошибка кроется в подсистеме управления памятью, в slub allocator-е или page allocator-е.
В зависимости от инструментов отладки эти инструменты могут обращаться к подсистеме, поскольку им самим необходимо выделить память, чтобы показать вам интересующую трассировку и, следовательно, они могут столкнуться с той же самой ошибкой и не создавать никакого вывода вообще.
Приводится пример файла сбоя. В нем не ошибка ядра, а ошибка стороннего модуля ядра, находящегося out-of-tree:
kannabis@fuse:~$ file 202310190528/dump.202310190528
202310190528/dump.202310190528: Flattened kdump compressed dump v6, system Linux, node debian11, release 5.10.0-26-amd64, version #1 SMP Debian 5.10.197-1 (2023-09-29), machine x86_64, domain (none)
Подробный разбор и отладка ждет вас тут
#туториал
Отладка ошибки в ядре может оказаться сложной задачей.
Допустим, ошибка кроется в подсистеме управления памятью, в slub allocator-е или page allocator-е.
В зависимости от инструментов отладки эти инструменты могут обращаться к подсистеме, поскольку им самим необходимо выделить память, чтобы показать вам интересующую трассировку и, следовательно, они могут столкнуться с той же самой ошибкой и не создавать никакого вывода вообще.
Приводится пример файла сбоя. В нем не ошибка ядра, а ошибка стороннего модуля ядра, находящегося out-of-tree:
kannabis@fuse:~$ file 202310190528/dump.202310190528
202310190528/dump.202310190528: Flattened kdump compressed dump v6, system Linux, node debian11, release 5.10.0-26-amd64, version #1 SMP Debian 5.10.197-1 (2023-09-29), machine x86_64, domain (none)
Подробный разбор и отладка ждет вас тут
#туториал
👍3❤1🔥1
#вопросы_с_собеса
Что такое iowait и почему он может появляться?
iowait это показатель, демонстрирующий процентное соотношение времени процессора, которое он потратил на ожидание ввода-вывода.
Высокий показатель может сказать о том, что система ограничена возможностями дисковой памяти. Выполняется много операций ввода-вывода. Это замедляет систему. Конкретно это обычно означает что блочные устройства работают медленно или они переполнены.
Замеряется в количестве потоков, которые ждут работы.
Что такое iowait и почему он может появляться?
🔥13👍2🥰1
🧑🎓😎 Еще одна серия с мероприятия OFFZONE 2023
Здесь собираются безопасники, разработчики, инженеры, исследователи, преподаватели и студенты из десятков стран мира. В центре внимания — только хардкорный технический контент по кибербезопасности.
Современная автоматизация обратной разработки в декомпиляторе HexRays
В своем докладе спикер кратко расскажет про существующие инструменты автоматизации обратной разработки, а также представит новые
Смотреть
#видео
Здесь собираются безопасники, разработчики, инженеры, исследователи, преподаватели и студенты из десятков стран мира. В центре внимания — только хардкорный технический контент по кибербезопасности.
Современная автоматизация обратной разработки в декомпиляторе HexRays
В своем докладе спикер кратко расскажет про существующие инструменты автоматизации обратной разработки, а также представит новые
Смотреть
#видео
👍6❤1
🤔 Подготовили #дайджест репозиториев для DevOps
♦️ Molecule — проект предназначен для оказания помощи в разработке и тестировании ролей Ansible
♦️ DevOps Exercises — репозиторий содержит вопросы и упражнения по различным техническим темам
♦️ GoReleaser — быстрая доставка бинарников Go
♦️ Kubernetes The Hard Way — руководство, в котором вы на практике познакомитесь с настройкой Kubernetes
♦️ dive — инструмент для изучения образов docker
♦️ Molecule — проект предназначен для оказания помощи в разработке и тестировании ролей Ansible
♦️ DevOps Exercises — репозиторий содержит вопросы и упражнения по различным техническим темам
♦️ GoReleaser — быстрая доставка бинарников Go
♦️ Kubernetes The Hard Way — руководство, в котором вы на практике познакомитесь с настройкой Kubernetes
♦️ dive — инструмент для изучения образов docker
🔥21👍7❤1
😉💪 SOLID ПРИНЦИПЫ простым языком
В видосе спикера расскажет о SOLID-принципах с подробным, простым и наглядным объяснением. Речь будет о: Single responsibility (Принцип единственной ответственности), open–closed (Принцип открытости/закрытости), Liskov substitution (Принцип подстановки Лисков), interface segregation (Принцип разделения интерфейса) и dependency inversion (Принцип инверсии зависимостей).
06:16 ➝ SRP
16:00 ➝ OCP
22:00 ➝ LSP
28:21 ➝ ISP
36:35 ➝ DIP
43:40 ➝ SOLID итоги
#гайд
В видосе спикера расскажет о SOLID-принципах с подробным, простым и наглядным объяснением. Речь будет о: Single responsibility (Принцип единственной ответственности), open–closed (Принцип открытости/закрытости), Liskov substitution (Принцип подстановки Лисков), interface segregation (Принцип разделения интерфейса) и dependency inversion (Принцип инверсии зависимостей).
06:16 ➝ SRP
16:00 ➝ OCP
22:00 ➝ LSP
28:21 ➝ ISP
36:35 ➝ DIP
43:40 ➝ SOLID итоги
#гайд
❤5🔥1
🧑🍳🎯 Restic: эффективное резервное копирование из Stdin
Готовый рецепт того как настроить эффективное резервное копирование из Stdin, с дедупликацией и автоматической очисткой репозитория от старых копий.
Несколько правил:
➖ Не используйте монорепозиторий для бэкапов
Всегда разносите сущности по разным репозиториям, к примеру создавайте репозиторий на каждую базу данных или на каждую виртуальную машину.
Делать это стоит по нескольким причинам. Бэкапить всё в один репо не даст вам никаких преимуществ, а вот неудобства создаст.
➖ Используйте встроенную компрессию restic
При использовании gzip всегда имеет шанс получить неповторяемый набор данных, даже при малейшем изменении источника. Таким образом дедупликация restic не сработает. Тем не менее бэкапить без компрессии идея тоже плохая, потому что размер несжатого бэкапа может различаться в десятки и сотни раз от сжатого.
➖ Всегда проверяйте что бэкап создался полностью
➖ Не восстанавливайте напрямую в Stdout
Другими словами не делайте так: restic dump latest dump.sql | mysql
Подробности вас ждут тут
#туториал
Готовый рецепт того как настроить эффективное резервное копирование из Stdin, с дедупликацией и автоматической очисткой репозитория от старых копий.
Несколько правил:
➖ Не используйте монорепозиторий для бэкапов
Всегда разносите сущности по разным репозиториям, к примеру создавайте репозиторий на каждую базу данных или на каждую виртуальную машину.
Делать это стоит по нескольким причинам. Бэкапить всё в один репо не даст вам никаких преимуществ, а вот неудобства создаст.
➖ Используйте встроенную компрессию restic
При использовании gzip всегда имеет шанс получить неповторяемый набор данных, даже при малейшем изменении источника. Таким образом дедупликация restic не сработает. Тем не менее бэкапить без компрессии идея тоже плохая, потому что размер несжатого бэкапа может различаться в десятки и сотни раз от сжатого.
➖ Всегда проверяйте что бэкап создался полностью
➖ Не восстанавливайте напрямую в Stdout
Другими словами не делайте так: restic dump latest dump.sql | mysql
Подробности вас ждут тут
#туториал
❤4🥱2
✍️ Рассказ про интерпретатор
🤔 Возможно, вы знаете, что скрипт должен начинаться с символов #!. Эта штуковина называется SheBang.
В общем после #! нужно указать путь до интерпретатора, обычно там фигурирует /bin/bash или python, например.
Данная конструкция будет использована системными вызовами семейства exec для запуска нужного интерпретатора, который в свою очередь запустит скрипт.
Если из командной строки запустить скрипт и системный вызов execve возвратит ошибку ENOEXEC. Процесс оболочки bash будет сам пытаться выполнить скрипт.
EXECVE() — выполняет программу, заданную параметром filename. Программа должна быть или бинарником или скриптом, начинающимся с #!
ENOEXEC — исполняемый файл в неизвестном формате, для другой архитектуры, или же встречены какие-то ошибки, препятствующие его выполнению.
В большинстве случаев ENOEXEC возвращается если первая строка не начинается с #! либо первая строка начинается с #! и в строке больше нет символов кроме пробелов и табуляций.
Это запустится:
#!
echo 'Have a nice day'
exit
И это тоже запустится:
# super comment
echo 'Have a nice day'
exit
И это тоже:
echo 'Have a nice bashdays'
exit
🤓 Так что не обязательно указывать #!/bin/bash, интерпретатор сам учитывает такие нюансы.
#гайд
🤔 Возможно, вы знаете, что скрипт должен начинаться с символов #!. Эта штуковина называется SheBang.
В общем после #! нужно указать путь до интерпретатора, обычно там фигурирует /bin/bash или python, например.
Данная конструкция будет использована системными вызовами семейства exec для запуска нужного интерпретатора, который в свою очередь запустит скрипт.
Если из командной строки запустить скрипт и системный вызов execve возвратит ошибку ENOEXEC. Процесс оболочки bash будет сам пытаться выполнить скрипт.
EXECVE() — выполняет программу, заданную параметром filename. Программа должна быть или бинарником или скриптом, начинающимся с #!
ENOEXEC — исполняемый файл в неизвестном формате, для другой архитектуры, или же встречены какие-то ошибки, препятствующие его выполнению.
В большинстве случаев ENOEXEC возвращается если первая строка не начинается с #! либо первая строка начинается с #! и в строке больше нет символов кроме пробелов и табуляций.
Это запустится:
#!
echo 'Have a nice day'
exit
И это тоже запустится:
# super comment
echo 'Have a nice day'
exit
И это тоже:
echo 'Have a nice bashdays'
exit
🤓 Так что не обязательно указывать #!/bin/bash, интерпретатор сам учитывает такие нюансы.
#гайд
👍10❤7👏4🔥3🥰3
🙋 Grafana Beyla
Часто для правильной интеграции инструментов мониторинга в приложение приходится добавлять агент мониторинга Observability в развёртывание или пакет. А в таких языках, как Go, нужно вручную добавлять точки трассировки. В любом случае после добавления инструментов придётся выполнить повторное развёртывание в промежуточную или производственную среду.
Автоинструментарий упрощает внедрение Observability. Grafana Beyla — автоинструментарий eBPF с открытым исходным кодом, который сейчас в стадии публичного тестирования. Beyla сообщает данные о задержках для основных запросов, а также метрики RED (Rate-Errors-Duration) для сервисов Linux HTTP/S и gRPC — и всё это без модификации кода для ручной вставки зондов.
В этой статье рассматривается, как установить и настроить Grafana Beyla с помощью Grafana Cloud для улучшения наблюдаемости приложений.
#туториал
Часто для правильной интеграции инструментов мониторинга в приложение приходится добавлять агент мониторинга Observability в развёртывание или пакет. А в таких языках, как Go, нужно вручную добавлять точки трассировки. В любом случае после добавления инструментов придётся выполнить повторное развёртывание в промежуточную или производственную среду.
Автоинструментарий упрощает внедрение Observability. Grafana Beyla — автоинструментарий eBPF с открытым исходным кодом, который сейчас в стадии публичного тестирования. Beyla сообщает данные о задержках для основных запросов, а также метрики RED (Rate-Errors-Duration) для сервисов Linux HTTP/S и gRPC — и всё это без модификации кода для ручной вставки зондов.
В этой статье рассматривается, как установить и настроить Grafana Beyla с помощью Grafana Cloud для улучшения наблюдаемости приложений.
#туториал
❤5👍2
Forwarded from Библиотека питониста | Python, Django, Flask
☁️🧩 ТОП-10 бессерверных фреймворков
Существует множество различных бессерверных фреймворков, каждый из которых предназначен для определенных задач. В этой статье рассмотрим 10 наиболее популярных из них.
Читать статью
Существует множество различных бессерверных фреймворков, каждый из которых предназначен для определенных задач. В этой статье рассмотрим 10 наиболее популярных из них.
Читать статью
👍3🔥2❤1
🤔 Очередной #дайджест для DevOps
💡 Vet — повышение безопасности при использовании open source компонентов
💡 GitOps используя Flux и Flagger — как просто реализовать в проекте Progressive Delivery
💡 Сервисы Kubernetes: ClusterIP, Nodeport и LoadBalancer — механизм предоставления доступа к внутренним и внешним приложениям
💡 Как мигрировать DoorDash из StatsD в Prometheus — как уйти от проблемы из-за пиковых сбоев трафика при использовании устаревшей StatsD-инфраструктуры
💡 Secrets Leak в CI/CD Pipelines — безопасная передача данных в сторонних ресурсах в CI/CD пайплайнах
💡 Vet — повышение безопасности при использовании open source компонентов
💡 GitOps используя Flux и Flagger — как просто реализовать в проекте Progressive Delivery
💡 Сервисы Kubernetes: ClusterIP, Nodeport и LoadBalancer — механизм предоставления доступа к внутренним и внешним приложениям
💡 Как мигрировать DoorDash из StatsD в Prometheus — как уйти от проблемы из-за пиковых сбоев трафика при использовании устаревшей StatsD-инфраструктуры
💡 Secrets Leak в CI/CD Pipelines — безопасная передача данных в сторонних ресурсах в CI/CD пайплайнах
👍7🥰4🤩3🎉2🔥1
Используете ли вы Terraform cloud?
Anonymous Poll
17%
Да, использую
1%
Нет, использую альтернативу (scalr, env0) т. к. в tfcloud нет фичей, которые мне нужны
2%
Нет, использую альтернативу (scalr, env0) т. к. tfcloud дорого юзать
10%
Нет, использую альтернативу т. к. не слышал про tfcloud
52%
Нет, у меня есть стэйт на s3/local/etc и фичи мне не нужны
17%
Свой вариант
❤3🔥1
📐📏 Протокол RADIUS: Управление доступом и безопасность в сетях
Протокол RADIUS используется для аутентификации, авторизации и учета (AAA) пользователей, пытающихся получить доступ к сетевым ресурсам, таким как сети с доступом по модему, беспроводные сети или VPN. RADIUS предназначен для управления доступом пользователей к сетевым ресурсам и обеспечения безопасности сети.
Основные функции протокола RADIUS:
🔻 Authentication: RADIUS проверяет подлинность пользователей, запросив их учетные данные, такие как имя пользователя и пароль, и сравнив их с данными, хранящимися в центральной базе данных или директории. Это позволяет сетевому оборудованию или серверам убедиться, что пользователь имеет право получить доступ к сетевым ресурсам.
🔻 Authorization: После успешной аутентификации RADIUS определяет, какие ресурсы и услуги пользователь может использовать после подключения к сети. Это включает в себя определение прав доступа, скорости соединения и других параметров.
🔻 Accounting: RADIUS отслеживает использование сетевых ресурсов пользователями, регистрируя информацию о времени, продолжительности сеанса, объеме переданных данных и других деталях. Эти данные могут использоваться для учета и мониторинга использования сети.
RADIUS широко используется в корпоративных и провайдерских сетях для обеспечения безопасности и управления доступом пользователей к сетевым ресурсам. Этот протокол также может интегрироваться с различными типами сетевого оборудования и программными решениями, что делает его важным инструментом для управления сетевой инфраструктурой.
#обучалка
Протокол RADIUS используется для аутентификации, авторизации и учета (AAA) пользователей, пытающихся получить доступ к сетевым ресурсам, таким как сети с доступом по модему, беспроводные сети или VPN. RADIUS предназначен для управления доступом пользователей к сетевым ресурсам и обеспечения безопасности сети.
Основные функции протокола RADIUS:
🔻 Authentication: RADIUS проверяет подлинность пользователей, запросив их учетные данные, такие как имя пользователя и пароль, и сравнив их с данными, хранящимися в центральной базе данных или директории. Это позволяет сетевому оборудованию или серверам убедиться, что пользователь имеет право получить доступ к сетевым ресурсам.
🔻 Authorization: После успешной аутентификации RADIUS определяет, какие ресурсы и услуги пользователь может использовать после подключения к сети. Это включает в себя определение прав доступа, скорости соединения и других параметров.
🔻 Accounting: RADIUS отслеживает использование сетевых ресурсов пользователями, регистрируя информацию о времени, продолжительности сеанса, объеме переданных данных и других деталях. Эти данные могут использоваться для учета и мониторинга использования сети.
RADIUS широко используется в корпоративных и провайдерских сетях для обеспечения безопасности и управления доступом пользователей к сетевым ресурсам. Этот протокол также может интегрироваться с различными типами сетевого оборудования и программными решениями, что делает его важным инструментом для управления сетевой инфраструктурой.
#обучалка
🔥13👍3❤1
😱🔥 Очень монументальная статья со шпаргалками по протоколам коммуникации, DevOps, CI/CD, архитектурным паттернам, базам данных, кэшированию, микросервисам (и монолитам), платежным системам, Git, облачным сервисам etc.
Особую ценность представляют диаграммы — рекомендуем уделить им пристальное внимание. Инфа будет интересна всем, кто хоть как-то связан с разработкой программного обеспечения и, прежде всего, веб-приложений.
Каждая технология описывается на базовом уровне, объясняются основные вещи и подкрепляется все это информативной диаграммой.
Читать статью
#гайд
Особую ценность представляют диаграммы — рекомендуем уделить им пристальное внимание. Инфа будет интересна всем, кто хоть как-то связан с разработкой программного обеспечения и, прежде всего, веб-приложений.
Каждая технология описывается на базовом уровне, объясняются основные вещи и подкрепляется все это информативной диаграммой.
Читать статью
#гайд
👍25❤4🔥2
📦📦 Контейнеры: Rootful, Rootless, Privileged и Super Privileged
Эта статья посвящена контейнерам, различным типам (в зависимости от того, какие привилегии мы им предоставляем) и тому, как создана их изоляция: в основном пространствам имен ядра и возможностям, оверлейным файловым системам, seccomp и SELinux.
Статья подойдет для начинающих инженеров. В ней приведено очень много дополнительных ссылок на полезные материалы и ролики по теме, чтобы немного лучше понять, как комбинация механизмов изоляции контейнеров и привилегий влияет (увеличивая или уменьшая) на риск возникновения дефектов ядра.
#гайд
Эта статья посвящена контейнерам, различным типам (в зависимости от того, какие привилегии мы им предоставляем) и тому, как создана их изоляция: в основном пространствам имен ядра и возможностям, оверлейным файловым системам, seccomp и SELinux.
Статья подойдет для начинающих инженеров. В ней приведено очень много дополнительных ссылок на полезные материалы и ролики по теме, чтобы немного лучше понять, как комбинация механизмов изоляции контейнеров и привилегий влияет (увеличивая или уменьшая) на риск возникновения дефектов ядра.
#гайд
❤5🔥1
#вопросы_с_собеседований
Как процессы в системе взаимодействуют между собой?
🔹 Пайпы — связь между двумя взаимосвязанными процессами. Механизм является полудуплексным, что означает, что первый процесс связан со вторым. Для взаимодействия второго процесса с первым процессом требуется другой канал.
🔹 FIFO — Связь между двумя не связанными процессами. FIFO — это полный дуплекс, что означает, что первый процесс может взаимодействовать со вторым процессом и наоборот одновременно.
🔹 Очереди сообщений — связь между двумя или более процессами с полной дуплексной пропускной способностью. Процессы будут связываться друг с другом, отправляя сообщение и извлекая его из очереди. Полученное сообщение больше не доступно в очереди.
🔹 Совместно используемая память. Связь между двумя или более процессами достигается за счет совместного использования памяти всеми процессами. Совместно используемая память должна быть защищена друг от друга путем синхронизации доступа ко всем процессам.
🔹 Семафоры — предназначены для синхронизации доступа к нескольким процессам. Когда один процесс хочет получить доступ к памяти (для чтения или записи), он должен быть заблокирован (или защищен) и освобожден при удалении доступа. Это должно быть повторено всеми процессами для защиты данных.
🔹 Сигналы — это механизм связи между несколькими процессами посредством сигнализации. Это означает, что исходный процесс отправит сигнал (распознанный по номеру), а целевой процесс обработает его соответствующим образом.
Как процессы в системе взаимодействуют между собой?
👍11🔥2