ServerAdmin.ru
28.2K subscribers
250 photos
32 videos
10 files
2.58K links
Авторская информация о системном администрировании.

Информация о рекламе: @srv_admin_reklama_bot
Автор: @zeroxzed

Второй канал: @srv_admin_live
Сайт: serveradmin.ru
Download Telegram
🔝 В этот раз ТОП постов за месяц выйдет немного пораньше, потому что завтра будет ещё топ за год.

Навскидку, в этом месяце был побит рекорд по пересылкам, а может и по реакциям и комментариям. Неожиданно много сохранений и пересылок получила заметка с подборкой бесплатных обучающих материалов. Практически каждый 8-й просмотревший сообщение сохранил его к себе. Не совсем понимаю, это всем так хочется учиться, или просто на всякий случай записали?

Несмотря на то, что многие написали, что раз канал про IT, то и заметки должны быть про IT, нетематические посты получили огромную реакцию. Для меня было полнейшей неожиданностью, что заметка про детей так затронет огромное количество людей. Судя по всему, задел за живое. Собрал в том числе кучу негатива, хотя всего лишь описал свой реальный жизненный опыт и взгляды, основанные на нём, а не какие-то абстрактные умозаключения. Если благодаря этой заметке родится хоть один незапланированный ранее ребёнок и осчастливит своих родителей, буду считать, что написал её не зря.

Отдельно отмечу цикл моих заметок про спину. Всё, что я там описал, реально работает. Своё состояние улучшил значительно. Можно сказать, что функционально вернулся в состояние среднестатистического здорового человека буквально за пару месяцев. Как минимум, ничего уже не болит. Разобрался в причинах проблем, в лечении, в профилактике. Кто не читал, но имеет проблемы с опорно-двигательным аппаратом, крайне рекомендую ознакомиться (хэштег #спина).

📌 Больше всего просмотров:
◽️Подборка бесплатных обучающих материалов (10373)
◽️Сервис по слежению за torrent раздачами (10195)
◽️Обучающие материалы по сетям (9497)

📌 Больше всего комментариев:
◽️Заметка про детей (305)
◽️Заметка про выбор пути, чтобы войти в IT (141)
◽️Домашняя серверная блоггера Techno Tim (132)

📌 Больше всего пересылок:
◽️Подборка обучающих материалов (1192)
◽️Обучающие материалы по сетям (512)
◽️Сервис по слежению за torrent раздачами (368)
◽️Программа LocalSend для передачи файлов (366)

📌 Больше всего реакций:
◽️Заметка про детей (518)
◽️Моя история про боли в спине (310)
◽️Отладка bash скриптов с помощью set -x (212)

#топ
​​▶️ Канал DevOps Channel перед праздниками опубликовал все выступления с прошедшей в марте 2023 года конференции DevOpsConf. Это чтобы нам не скучно было на выходных. Я аж устал список записей просматривать. Там очень много всего и на разные темы.

Я часто смотрю записи с подобных мероприятий и могу сразу сказать, что практической пользы для подавляющего числа слушателей там нет. Лично мне просто нравится это слушать как развлекательное видео. А если ещё и полезное что-то узнаю, то вдвойне хорошо. Как минимум, расширяется кругозор. Так что я включаю в фоне во время прогулок или когда на машине куда-то еду.

Добавил себе на просмотр следующие выступления:

🔹Топ некритичных ошибок в инфраструктуре, приводящих к критичным проблемам
Как перестать быть YAML-разработчиком. Переходи на сторону CUE
🔹TechTalk "Выбор CI/CD-системы"
Vault — интеграция куда угодно
🔹Гид автостопщика по HashiCorp Vault
Как управлять базой знаний и не сойти с ума
🔹Мимо тёщиного дома я без метрик не хожу
Ваши админы за 10 лет так и не смогли стать девопсами. Разработчики смогли
🔹Хочешь расти в DevOps, но не знаешь как? Приходи, расскажу!
DevOps — путь на социальное дно, или Пробиваем дно DevOps-колодца
🔹Практика применения DevOps-аутсорса на разных этапах жизненного цикла продукта

#видео
Please open Telegram to view this post
VIEW IN TELEGRAM
Как это обычно бывает в обслуживании и поддержке, длинные выходные случаются не только лишь у всех. Я всегда стараюсь выстроить рабочий процесс так, чтобы в выходные всё же не работать. Но почти никогда это не получается. В этот раз поступила просьба, которой я не стал отказывать.

Сторонним разработчикам, нанятым незадолго до НГ, нужна была копия сайта для разработки. Пока с ними договаривались (не я), обсуждали детали, наметили план, наступило 28-е, четверг. В пятницу я уже не успел ничего сделать и благоразумно отложил решение всех вопросов на рабочие дни после праздников, так как не предполагал, что в праздники кто-то будет что-то делать. Но разработчики очень попросили всё сделать заранее, так как планировали начать работы уже 2-го января. Вот ещё категория трудоголиков, которая любит работать в праздники.

В итоге 1-го вечером я уже трудился за ноутом. В целом, задача не трудная, поэтому не стал динамить и всё сделал. В процессе возникло несколько затруднений, которые я решил. Об этом и хочу написать. Там ничего особенного, обычная рутина админа, но это может быть интересным и полезным.

Основная проблема в том, что сайт относительно большой, а свободных мощностей у компании мало. Все арендованные и дорогие. Нужно порядка 400 Гб места на дисках под сам сайт и база данных mysql примерно 10 гигов. Да ещё и сайт планировали с php 7.4 перенести на 8.0, так что нужна была отдельная виртуалка, где можно будет обновлять пакеты и будет полный доступ у разработчиков. Я перед началом работ прикинул и понял, что развернуть копию на длительное время тупо негде.

Что-то докупать или заказывать в праздники не получится, потому что нужно согласовывать расходы, оплачивать и заказывать. Начал искать варианты. У сайта есть директория с пользовательскими прикреплёнными файлами. Для разработки они не нужны, так что решил поднимать без них. Нашёл сервер, где было немного свободного места. Развернул там виртуалку, скопировал сайт без лишних файлов. Начал разворачивать базу, не хватает места. И сам дамп большой, и во время разворачивания надо много места.

Посмотрел, что в базе. Понял, что большая часть информации — это данные, которые регулярно обновляются и удаляются, и для разработки не нужны. Возникла задача из обычного текстового sql дампа вырезать содержимое некоторых таблиц. Так как файл текстовый, то придумал такое решение. Я уже когда-то делал похожую заметку, но раньше мне приходилось вытаскивать отдельную таблицу из дампа, а тут надо наоборот, удалить содержимое таблицы, но сохранить всю структуру базы.

Решил таким образом. Все данные таблицы в дампе располагаются между строк Dumping data for table нужной таблицы и Table structure, где начинается новая таблица. Вывел все такие строки в отдельный текстовый файл:

# grep -n 'Table structure\|Dumping data for table' dump.sql > tables.txt

Нашёл там нужную таблицу и номера первой и второй указанных строк. И потом вырезал всё, что между ними с помощью sed. Первое число — номер строки Dumping data for table, которую нужно удалить и всё, что за ней. Второе — номер строки, предшествующей записи Table structure, так как эту строку нужно оставить. Она относится к структуре новой таблицы.

# sed '22826,26719 d' dump.sql > cleanup.sql

Таким образом можно очистить все ненужные таблицы, оставив только их структуру.

Места в итоге всё равно не хватило. Посмотрел, на каких виртуалках на этом сервере есть свободное место. Нашёл одну, где его было много. Поднял там nfs сервер, примонтировал каталог к новому серверу, разместил там сайт. Всё заработало. Далее настроил проксирование к этому сайту, пробросил со шлюза порты ssh для разработчиков и всё им отправил. Надеюсь, они успешно поработают, а мои праздничные костыли не окажутся напрасными.

Кто ещё работает в праздники? Чем занимаетесь? Я обычно что-то обновляю, переношу, пока никто не мешает. Но на этот НГ ничего не планировал. Столько лет всегда что-то делаю, что решил в этот раз отдохнуть.

#webserver
​​Уже много лет веду свои дела в сервисе todoist.com. Начал это делать ещё до того, как прочитал книгу Тайм-менеджмент для системных администраторов. При этом мне всегда было достаточно бесплатной версии. Правда есть один нюанс. Когда-то давно в сервисе не было ограничения на 5 проектов для бесплатного тарифа. У меня была создана куча проектов, которые до сих пор остались. Я не могу добавить новых, но все старые на месте и мне их хватает.

С нового года сервис выкатил очень крутое обновление. Появилось полноценное отображение проектов в виде календаря с нанесёнными на него задачами. Не понимаю, почему они так долго существовали без этого. Мне приходится использовать связку todoist.com + planyway.com. Первый для задач, второй для календаря и тех задач, что мне важно видеть на календаре. Это закрывает все мои потребности, но очевидно, что 2 сервиса это хуже, чем один, где всё это в единой базе.

И вот у Todoist появился очень похожий календарь. Такое ощущение, что они его с Planyway и скопировали, так как сильно похож и внешне и по возможностям. К сожалению, этот календарь доступен только в платных тарифах. Оплатить из РФ их сейчас невозможно. Прежде чем платить, хотелось лично попробовать, а триал у меня давно уже закончен. Нашёл в инете промокод 6K94QXHTQ6 на 2 месяца тарифа Pro (активировать тут), который на удивление сработал. У Todoist периодически появляются рекламные промокоды, но все, что я нашёл, уже не действовали, кроме этого. Так что если давно пользуетесь сервисом и хотите ещё на какое-то время получить платный тариф, можно воспользоваться. Даже если потом не надумаете покупать, можно себе проектов добавить, сколько нужно, чтобы они потом остались.

Календарь мне понравился. Реализация с привязкой календарей к проектам удобна. Возможностей тоже достаточно. Есть и метки, и продолжительность задач, и подзадачи. Когда все задачи добавлены, можно наглядно оценить план на ближайшие дни. Не понравилось только одно — решённые задачи исчезают из календаря полностью, а не остаются зачёркнутыми, как в Planyway. Для меня это критично, так как хочу видеть завершённые задачи на календаре, а не где-то потом в отдельном списке, как сейчас это реализовано в Todoist.

Я пробовал огромное количество сервисов и программ для ведения календаря. Ничего удобнее Planyway так и не нашёл. Продолжаю использовать его на бесплатном тарифе. Мне возможностей хватает. Если Todoist реализует возможность отображения завершённых задач, перейду на него, так как замкнуть всё на один сервис будет намного удобнее, чем вести два. Есть неплохие календари в yonote, но мне ещё один сервис заводить не хочется. Кто с нуля себе подбирает что-то для заметок, календаря, списка дел, то обратите внимание. Сервис неплохой.

#заметки
​​Пока ещё не закончились праздники, а отдыхать уже надоело, есть возможность изучить что-то новое. Например, OpenStack 🤖 Для тех, кто не в курсе, поясню, что это модульная open source платформа, реализующая типовую функциональность современных облачных провайдеров. Установить её можно самостоятельно на своих мощностях. А для изучения есть упрощённые проекты для быстрого разворачивания.

Одним из таких проектов является snap пакет MicroStack от компании Canonical. С его помощью можно развернуть учебный OpenStack на одном хосте. Поставляется он в виде готового snap пакета под Ubuntu, так что ставится в пару действий. Внутри живёт Kubernetes, а MicroStack разворачивается поверх него. Установить можно даже в виртуальную машину на своём рабочем ноуте.

Cистемные требования MicroStack, заявленные на его сайте:
4 CPUs
16G Memory
50G Disk

Сама установка выполняется в пару команд:

# snap install microstack --beta
# microstack init --auto --control

Минут 10 будет длиться инициализация. Когда закончится, можно идти в веб интерфейс по ip адресу сервера. Логин - admin, а пароль смотрим так:

# snap get microstack config.credentials.keystone-password

Если у вас в браузере указан русский язык, то вы получите 502 ошибку nginx после аутентификации. Так было у меня. Чтобы исправить, нужно залогиниться в систему, получить 502-ю ошибку, зайти по урлу https://10.20.1.29/identity/, он должен нормально открыться. В правом верхнем углу будут настройки пользователя. Нужно зайти туда и выбрать язык интерфейса English. После этого нормально заработает.

В консоли можно работать с кластером через клиента microstack.openstack. К примеру, смотрим список стандартных шаблонов:

# microstack.openstack flavor list

Можно использовать стандартный openstackclient. Для этого там же в настройках пользователя в веб интерфейсе в выпадающем списке качаем OpenStack RC File. Ставим стандартный openstack client:

# apt install python3-openstackclient

Читаем скачанный файл с переменными окружения:

# source ./admin-openrc.sh

Теперь можно использовать консольный клиент openstack, добавляя опцию --insecure, так как сертификат самоподписанный:

# openstack --insecure project list

Если не хочется каждый раз вводить пароль администратора, можно добавить его явно в admin-openrc.sh в переменную OS_PASSWORD.

На этом собирался закончить заметку, но всё же кратко покажу, как с этой штукой работать. Чтобы запустить виртуалку нам нужно:

1️⃣ Создать проект и добавить туда пользователя.
2️⃣ Создать сеть и подсеть в ней.
3️⃣ Создать роутер и связать его с бриджем во внешнюю сеть.
4️⃣ Создать виртуальную машину с бриджем в этой подсети.
5️⃣ Создать группу безопасности и правило в ней для разрешения подключений по ssh.
6️⃣ Связать эту группу безопасности и виртуалку.

Команды приведу кратко, без описаний, опустив в начале openstack --insecure, так как лимит на длину публикации:

# project create LAB01
# role add --user admin --project LAB01 admin
# network create LAB01-NET
# subnet create --network LAB01-NET --subnet-range 192.168.100.0/24 --allocation-pool start=192.168.100.10,end=192.168.100.200 --dns-nameserver 77.88.8.1 LAB01-SUBNET
# router create LAB01-R
# router set LAB01-R --external-gateway external
# router add subnet LAB01-R LAB01-SUBNET
# floating ip create external
# server create --flavor m1.tiny --image cirros --network LAB01-NET --wait VM01
# server add floating ip VM01 596909d8-5c8a-403f-a902-f31f5bd89eae
# security group create LAB01-SG
# security group rule create --remote-ip 0.0.0.0/0 --dst-port 22:22 --protocol tcp --ingress LAB01-SG
# server add security group VM01 LAB01-SG

То же самое можно сделать руками через веб интерфейс. Можно подключиться к новой виртуалке через её floating ip из диапазона 10.20.20.0/24, который будет сопоставлен настроенному IP из 192.168.100.0/24. В веб интерфейсе все настройки будут отражены. Там же и консоль VM.

Поздравляю, теперь вы админ OpenStack. Можете развернуть для собственных нужд и тренироваться.

#виртуализация
​​Продолжу тему OpenStack, так как вчера всё не уместилось в одну публикацию. Я немного поразбирался с ним, посмотрел, как работает. Стала понятна логика работы некоторых облачных провайдеров, так как в основе у них, судя по всему, OpenStack и есть. Все эти проекты, назначение прав, настройка портов на firewall для доступа, сопоставление внешнего IP внутренним и т.д.

🔹Для того, чтобы развернуть OpenStack, есть множество разных проектов помимо MicroStack. Для изучения и разработки наиболее известный - DevStac. Это набор скриптов для поднятия OpenStack как на одиночной машине, так и в составе кластера. Разрабатывается тем же сообществом, что и OpenStack.

🔹Для прода есть Ansible Playbooks - openstack-ansible. Вся функциональность там почему-то упакована в LXC контейнеры, что выглядит немного непривычно. Не знаю, почему выбрали именно их. Это тоже проект команды разработки OpenStack. Есть проект Kolla, который упаковывает стэк в Docker контейнеры. И от них же есть готовые плейбуки на основе docker - kolla-ansible.

🔹Для деплоя в Kubernetes есть helm-chart - OpenStack-Helm. Также развернуть OpenStack в кубере можно с помощью Sunbeam. В настоящий момент в официальном руководстве для MicroStack используется как раз он. Я, когда разбирался с ним, не сразу понял, почему в куче руководств в интернете используется один тип управления, а на самом сайте проекта уже используется Sunbeam. Судя по всему недавно на него перешли.

🔹На голое железо установить OpenStack можно с помощью kayobe. Для деплоя используются упомянутые ранее контейнеры Kolla и плейбуки с ними. Также для железа есть проект от OpenStack Foundation - Airship. Он разворачивает на железо кластер Kubernetes, а поверх уже можно накатить OpenStack.

Обратил внимание при изучении упомянутых выше проектов, что большая часть из них сделана на основе организации OpenInfra Foundation. Они все свои исходники размещают в репозитории opendev.org, который работает на базе gitea.

Кто-нибудь разворачивал кластер OpenStack хотя бы из трёх нод? Какой из описанных способов наиболее простой и дружелюбный для новичков? Когда изучал ceph и kuber, разворачивал из ansible playbooks с помощью kubespray и ceph-ansible соответственно. Не могу сказать, что это было просто.

#виртуализация
​​В Linux существует относительно простой способ шейпирования (ограничения) трафика с помощью утилиты tc (traffic control) из пакета iproute2. Простой в том плане, что какие-то базовые вещи делаются просто и быстро. Но в то же время это очень мощный инструмент с иерархической структурой, который позволяет очень гибко управлять трафиком.

Сразу сделаю важную ремарку, суть которой некоторые не понимают. Шейпировать можно только исходящий трафик. Управлять входящим трафиком без его потери невозможно. На входе вы можете только отбрасывать пакеты, но не выстраивать в определённые очереди.

Я не буду подробно рассказывать, как tc работает, потому что это долго и в целом не имеет смысла в рамках заметки. В интернете очень много материала по этой теме. Покажу для начала простой пример ограничения исходящего трафика на конкретном интерфейсе с помощью алгоритма TBF. В минимальной установке Debian tc уже присутствует, так что отдельно ставить не надо.

# tc qdisc add dev eth0 root tbf rate 10mbit latency 50ms burst 10k

Ограничили исходящую скорость на интерфейсе eth0 10Mbit/s или примерно 1,25MB/s. В данном случае параметры latency - максимальное время пакета в очереди и burst - размер буфера, обязательны. Посмотреть применённые настройки можно так:

# tc qdisc show dev eth0

Тестировать ограничение скорость проще всего с помощью iperf или speedtest-cli. Удалить правило можно так же, как и добавляли, только вместо add указать del:

# tc qdisc del dev eth0 root tbf rate 10mbit latency 50ms burst 10k

В примере выше мы использовали бесклассовую дисциплину с алгоритмом TBF. Его можно применять только к интерфейсу без возможности фильтрации пакетов. Если нужно настроить ограничение по порту или ip адресу, то воспользуемся другим алгоритмом. Укажем ограничение скорости для конкретного TCP порта с помощью классовой дисциплины HTB. Например, ограничим порт 5001, который использует по умолчанию iperf:

# tc qdisc add dev eth0 root handle 1: htb default 20
# tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit
# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 5001 0xffff flowid 1:1

Так как это классовая дисциплина, мы вначале создали общий класс по умолчанию для всего трафика без ограничений. Потом создали класс с идентификатором 1:1 с ограничением скорости. Затем в этот класс с ограничением добавили порт 5001. По аналогии можно создавать другие классы и добавлять туда фильтры на основе разных признаков: порты, ip адреса, протоколы. Примерно так же назначаются и приоритеты трафика.

Подробно настройка tc описана в этом how-to. Разделы 9, 10, 11, 12.

Для tc есть небольшая python обёртка, которая упрощает настройку - traffictoll. Там конфигурацию можно в yaml файлах писать. Причём эта штука поддерживает в том числе фильтрацию по процессам. Честно говоря, я не понял, как там это реализовано. Насколько я знаю, tc по процессам фильтровать не умеет. Поковырялся в исходниках traffictoll, но реализацию так и не нашёл. Вижу, что используется библиотека psutil для получения информации о процессе, подгружается модуль ядра ifb numifbs=1, но где правила для процессов задаются, не понял.

#network
​​Расскажу про необычный инструмент, который в первую очередь будет полезен тем, у кого рабочая машина на Linux. Он для этого был создан. Возможно где-то и на сервере пригодится, но в основном для тестов. Речь пойдёт про Distrobox. Это надстройка над контейнерами, которая позволяет их прозрачно интегрировать в систему.

Допустим, вам надо запустить какой-то софт, возможно с графическим интерфейсом, но его нет под ваш дистрибутив. У вас вариант либо запустить его в виртуальной машине, либо как-то самому наколхозить нужный контейнер и примапить его к хосту. Distrobox решает эту задачу за вас. Вы просто выбираете нужную систему, запускаете её через Distrobox и работаете там с нужным вам приложением. Оно запускается и ведёт себя так, как будто установлено локально. Пробрасываются каталог пользователя, иксы или wayland, звук, d-bus и udev. Приложение ведёт себя как локальное.

Distrobox для популярных дистрибутивов есть в базовых репозиториях. В свежих Debian и Ubuntu присутствует, так что установка стандартна:

# apt install distrobox

Например, запустим в Debian какую-нибудь программу, которая есть в Fedora. Для этого создаём контейнер с последней Федорой. Делать это нужно под обычным пользователем, не под root. Пользователь должен быть в группе docker. В самой свежей версии, установленной вручную, это уже поправлено и можно под root запускать.

# distrobox-create --name fedora --image fedora:latest

Заходим в контейнер:

# distrobox-enter fedora

При первом входе будет выполнена преднастройка. После её окончания окажетесь в оболочке контейнера. Теперь можно установить какую-нибудь программу:

# sudo dnf install appname

После установки выполняем экспорт этой программы из консоли контейнера:

# distrobox-export --app appname

Теперь с этой программой можно работать, как будто она установлена на хосте. По умолчанию distrobox захочет положить ярлык на рабочий стол. Если у вас машина без графического окружения, то получите ошибку. Вместо этого можно выгрузить через ключ --bin, указав явно путь к бинарнику в контейнере:

# distrobox-export --bin /usr/sbin/appname

Бинарник (а точнее скрипт запуска) запуска программы из контейнера будет положен на хост в директорию ~/.local/bin. Она должна существовать. Там же можно посмотреть, как всё это работает:

#!/bin/sh
# distrobox_binary
# name: fedora
if [ -z "${CONTAINER_ID}" ]; then
exec "/usr/local/bin/distrobox-enter" -n fedora -- /bin/sh -l -c '/usr/sbin/appname$@' -- "$@"
elif [ -n "${CONTAINER_ID}" ] && [ "${CONTAINER_ID}" != "fedora" ]; then
exec distrobox-host-exec /home/zerox/.local/bin/appname"$@"
else
exec /usr/sbin/appname"$@"
fi

То есть всё это решение просто SHELL обёртка вокруг докера для удобного применения. Используются заранее подготовленные образы. В принципе, Distrobox удобен и для простого и быстрого запуска контейнеров с различными базовыми системами с примапленными ресурсами к хосту. Ими удобно управлять или работать. Смотрим список контейнеров:

# distrobox list

Устанавливаем, удаляем:

# distrobox stop fedora
# istrobox rm fedora

Можно сделать себе тестовую виртуалку со всеми базовыми системами и заходить в нужную. Все ресурсы у всех систем примаплены к хосту.

Сайт / Исходники / Как это работает

#linux #docker
​​Когда на тестовом стенде разворачиваешь что-то кластерное и надо на нескольких хостах выполнить одни и те же действия, внезапно может помочь tmux. У него есть режим синхронизации панелей. С его помощью можно делать одновременно одно и то же на разных хостах.

Работает это так. Ставим tmux:

# apt install tmux

Запускаем на одном из хостов и открываем несколько панелей. По одной панели на каждый хост. Делается это с помощью комбинации клавиш CTRL-B и дальше либо %, либо ". Первое - это вертикальное разделение, второе - горизонтальное. Переключаться между панелями с помощью CTRL-B и стрелочек. В общем, всё стандартно для тех, кто работает с tmux.

После этого в каждой панели нужно подключиться по SSH к нужному хосту. У вас получится несколько панелей, в каждой отдельная консоль от удалённого хоста. Теперь включаем режим синхронизации панелей. Нажимаем опять префикс CTRL-B и дальше пишем снизу в командной строке tmux:

:setw synchronize-panes

Включён режим синхронизации панелей. Теперь всё, что вводится в активную панель, будет автоматически выполняться во всех остальных. Отключить этот режим можно точно так же, как и включали. Просто ещё раз вводим эту же команду.

Если постоянно используете один и тот же стенд, то можно автоматизировать запуск tmux и подключение по SSH, чтобы не делать это каждый раз вручную.

#linux #terminal
​​Недавно, когда вырезал из дампа mysql содержимое одной таблицы с помощью sed, подумал, что неплохо было бы сделать подборочку с наиболее актуальными и прикладными примерами с sed.

Уже когда начал её составлять вдруг подумал, а нужно ли сейчас вообще всё это? Как считаете? Мы находимся на сломе эпох. Сейчас же ChatGPT сходу приводит все эти команды и практически не ошибается в типовых задачах. Я до сих пор так и не начал им пользоваться. Пробовал несколько раз, но постоянно не использую. По привычке ищу решение в своих записях, чаще всего тут на канале.

Брюзжать, как старый дед, на тему того, что надо своими мозгами думать, а то совсем захиреют, не буду. ИИ помощники это уже наше настоящее и 100% наше будущее, как сейчас калькуляторы. Надо начинать осваивать инструментарий и активно использовать. Ну а пока вернёмся к sed 😁

🟢 Вырезаем всё, что между указанными строками в файле:

# sed -i.back '22826,26719 d' dump.sql

🟢 Вырезать первую и последнюю строки. Часто нужно, когда отправляешь в мониторинг вывод каких-нибудь консольных команд. Там обычно в начале какие-то заголовки столбцов идут, а в конце тоже служебная информация:

# sed -i.back '1d;$d' filename

🟢 Заменить в файле слово old_function на new_function:

# sed -i.back 's/old_function/new_function/g' filename

🟢 Если нужен более гибкий вариант поиска нужного слова, то можно использовать регулярные выражения:

# sed -i.back -r 's/old_function.*?/new_function/g' filename
# sed -i.back -r 's/^post_max_size =.*/post_max_size = 32M/g' php.ini

🟢 Удаляем комментарии и пустые строки:

# sed -i.back '/^;\|^$\|^#/d' php.ini

🟢 Вывести записи в логе веб сервера в интервале 10.01.2024 15:20 - 16:20. Удобная штука, рекомендую сохранить.

# sed -n '/10\/Jan\/2024:15:20/,/10\/Jan\/2024:16:20/p' access.log

🟢 Добавить после каждой строки ещё одну пустую. Иногда нужно, чтобы нагляднее текст оценить. Второй пример - добавление пустой строки после найденного слова в строке:

# sed -i.back G filename
# sed -i.back '/pattern/G' filename

Про sed можно писать бесконечно, но лично я что-то более сложное редко использую, а вот эти простые конструкции постоянно. Чаще всего именно они используются в связке с другими консольными утилитами.

#bash #sed
​​Для мониторинга загрузки сервера MySQL в режиме реального времени есть старый и известный инструмент - Mytop. Из названия понятно, что это топоподобная консольная программа. С её помощью можно смотреть какие пользователи и какие запросы отправляют к СУБД. Как минимум, это удобнее и нагляднее, чем смотреть show full processlist;. Я обычно туда первым делом заглядываю, если на сервере намечаются какие-то проблемы.

Когда попытался установить mytop на Debian 11, удивился, не обнаружив её в репозиториях. Обычно жила там. Немного погуглил и понял, что отдельный пакет mytop убрали, потому что теперь он входит в состав mariadb-client. Если вы используете mariadb, то mytop у вас скорее всего уже установлен. Если у вас другая система, то попробуйте установить mytop через пакетный менеджер. В rpm дистрибутивах она точно была раньше в репах. В Freebsd, кстати, тоже есть.

Для того, чтобы программа могла смотреть информацию обо всех базах и пользователях, у неё должны быть ко всему этому права. Если будете смотреть информацию по отдельной базе данных, то можно создать отдельного пользователя для этого с доступом только к этой базе.

Mytop можно запустить, передав все параметры через ключи, либо создать файл конфигурации ~/.mytop (не забудьте ограничить к нему доступ):

user=root
pass=password
host=127.0.0.1
port=3306
color=1
delay=3
idle=0

Обращаю внимание, что если укажите localhost вместо 127.0.0.1, то скорее всего не подключитесь. Вообще, это распространённая проблема, так что я стараюсь всегда и везде писать именно адрес, а не имя хоста. Локалхост часто отвечает по ipv6, и не весь софт корректно это отрабатывает. Лучше явно прописывать 127.0.0.1.

Теперь можно запускать mytop и смотреть информацию по всем базам. Если набрать ?, то откроется справка. Там можно увидеть все возможности программы. Наиболее актуальны:
d - выбрать конкретную базу данных
p - остановить обновление информации на экране
i - отобразить соединения в статусе Sleep
V - посмотреть параметры СУБД

Хорошая программа в копилку тех, кто работает с MySQL, наряду с:
🔹 mysqltuner
🔹 MyDumper

Ещё полезные ссылки по теме:
Оптимизация запросов в MySQL
MySQL клиенты
Скрипт для оптимизации потребления памяти
Аудит запросов и прочих действия в СУБД
Рекомендации CIS по настройке MySQL
Список настроек, обязательных к проверке
Сравнение mysql vs mariadb
Индексы в Mysql
Полный и инкрементный бэкап MySQL
Мониторинг MySQL с помощью Zabbix

#mysql
​​На прошлой неделе в паре каналов проскочил мем, который сразу привлёк моё внимание, потому что откликнулся внутри. Он актуален только для тех, кто ходил в интернет с помощью модема и обычной телефонной линии.

У меня был такой модем, были карточки в интернет и был бесплатный период ночью. Как сейчас всё это помню. Карточка стоила 300 р. на 10 часов интернета. У меня как раз была стипендия 300 рублей и я мог себе позволить купить на месяц 10 часов интернета. Провайдеры РОЛ и МТУ-ИНТЕЛ.

А в довесок к этой карточке давалась возможность подключаться к интернету без тарификации с 2 ночи до 7 утра. Я ставил будильник на 2 ночи, вставал и начинал пользоваться интернетом. Пару часов там лазил, что-то оставлял на загрузку до 7 утра и снова ложился спать. Иногда играл в Ultima Online. Но это было тяжело, потому что игра затягивала и сидел до самого утра. Утром ехал в универ учиться.

В таком режиме я довольно долго жил, пока не появился первый безлимитный ADSL от СТРИМ по тем же телефонным линиям. Скорость была 128 кбит/c. Началась другая эпоха безлимитного интернета и увлечения Lineage 2.

#мем
​​Небольшой совет, основанный на личном опыте. Сделать отдельную заметку по теме меня натолкнул недавний пример с mytop, когда подключение по localhost не сработало. Я тогда не стал подробно разбираться с вопросом, а просто заменил на 127.0.0.1 и всё заработало.

С подобной ошибкой я сталкивался не раз, поэтому у меня давно появилась привычка не использовать localhost в настройках. В данном случае mytop при использовании localhost почему-то пытается подключиться через socket, а не tcp. Я впервые с таким сталкиваюсь. Не знал о подобной особенности. Перепроверил, всё так и есть. Если взять обычный консольный mysql клиент на этом же хосте, то он в обоих случаях подключается по tcp, а вот у mytop почему-то другое поведение.

Это ещё один пример в копилку по данной теме. Я чаще всего сталкивался с тем, что localhost отвечает по ipv6, который где-то может быть не настроен. Например, в конфигурации nginx он отключен, а ты пытаешься статистику сервиса забирать через curl http://localhost/status и получаешь ошибку. Если это делается в консоли, сразу будет понятно, в чём проблема.

А вот если какая-то проверка выполняется через Zabbix с использованием localhost, бывает трудно понять, что не так. Я как-то раз провозился с подобной проблемой, не догадавшись сразу, в чём там дело. И с тех пор всегда пишу явно 127.0.0.1, чтобы просто не тратить на это время.

Стандартный вид файла hosts может быть примерно таким:

127.0.0.1 localhost
127.0.1.1 debian11
::1   localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Пингуя localhost, вы обращаетесь к нему по ipv6:

# ping localhost
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.023 ms

Так что нужно либо отключать ipv6 на localhost, либо явно обращаться по тому протоколу, который вам нужен.

#совет #linux
​​Короткая справочная заметка. С недавних пор (последние ~два года) для просмотра информации о системе использую простую команду:

# hostnamectl

Static hostname: serveradmin.ru
Icon name: computer-vm
Chassis: vm
Machine ID: 3cdf45d116364add90df898f553e5665
Boot ID: de9b9d3b12e54447abd7fdccc4543ebd
Virtualization: microsoft
Operating System: Debian GNU/Linux 11 (bullseye)
Kernel: Linux 5.10.0-26-amd64
Architecture: x86-64

Потихоньку ушёл от всех других вариантов. Раньше пользовался:

# lsb_release -a
# uname -a
# cat /etc/os-release
# cat /etc/redhat-release

Уже забывать всё это стал. Hostnamectl даёт всю базовую информацию сразу, так что никуда заглядывать больше не надо. Тут и имя системы, и версия ОС, и ядро. Сразу видно, виртуальная машина это или контейнер. Если контейнер, то будет показан его тип: docker, lxc или openvz. Если VM, то тип виртуализации.

#systemd
​​При использовании виртуализации на базе QEMU (например, Proxmox) я всегда в обязательном порядке использую qemu-guest-agent, который позволяет гипервизору взаимодействовать с установленной системой. Для этого в свойствах виртуальной машины нужно включить использование агента, а на систему установить соответствующий пакет.

Для Debian пакет так и называется - qemu-guest-agent:

# apt install qemu-guest-agent
# systemctl enable --now qemu-guest-agent

В общем случае в процессе эксплуатации системы вам не обязательно взаимодействовать с агентом. Он нужен гипервизору, например, для корректного завершения работы гостевой системы, для её заморозки во время бэкапа, для синхронизации времени и т.д.

При необходимости, вы тоже можете использовать возможности агента, обращаясь к гостевой системе через него. Для проверки связи с агентом, в консоли гипервизора можно набрать:

# qm agent <vmid> ping

Если всё в порядке, то вы не увидите никакого вывода, а код завершения будет нулевой. Это был пример команды для хоста Proxmox. Если у вас другая система виртуализации, и там, к примеру, используется virsh для управления, то команда будет следующая:

# virsh qemu-agent-command vmname '{"execute": "guest-ping"}'

Команды будут похожие. Приведу ещё один пример с Proxmox и virsh, а дальше буду только для Proxmox приводить. Смотрим время на гостевой системе:

# qm agent 101 get-time
# virsh qemu-agent-command vmname '{"execute": "guest-get-time"}'

Для взаимодействия с агентом используется отдельный протокол QMP, который возвращает ответы на запросы в формате json, так что для взаимодействия с ним пригодится утилита jq.

Теперь посмотрим, какие команды агента поддерживает конкретная виртуальная машина:

# qm agent 101 info | jq -r '.supported_commands[] | select(.enabled==true) | .name'

Я сразу обработал вывод, выбрав только поддерживаемые команды, и выведя само название. Можете посмотреть на полный вывод без обработки. К сожалению, конкретно в proxmox вывод supported_commands не совпадает с реальным списком, который поддерживается, потому что некоторые команды, типа guest-exec выполняются немного в другом синтаксисе. Те команды, что не работают, выдадут ошибку, а вместе с ошибкой выводится список, который реально поддерживается:

# qm agent 101 get-cpustats
400 Parameter verification failed.
command: value 'get-cpustats' does not have a value in the enumeration 'fsfreeze-freeze, fsfreeze-status, fsfreeze-thaw, fstrim, get-fsinfo, get-host-name, get-memory-block-info, get-memory-blocks, get-osinfo, get-time, get-timezone, get-users, get-vcpus, info, network-get-interfaces, ping, shutdown, suspend-disk, suspend-hybrid, suspend-ram'
qm guest cmd <vmid> <command>

Соответственно, вот этот список более точный. Из названия команд чаще всего понятен смысл. Смотрим информацию об установленной ОС:

# qm agent 101 get-osinfo

{
  "id" : "debian",
  "kernel-release" : "6.1.0-13-amd64",
  "kernel-version" : "#1 SMP PREEMPT_DYNAMIC Debian 6.1.55-1 (2023-09-29)",
  "machine" : "x86_64",
  "name" : "Debian GNU/Linux",
  "pretty-name" : "Debian GNU/Linux 12 (bookworm)",
  "version" : "12 (bookworm)",
  "version-id" : "12"
}

И так далее. Инструмент простой для освоения и использования. Может пригодиться, если нужен будет какой-то свой мониторинг с уровня гипервизора, например, за списком VM на хосте со следующей информацией:

гостевая система;
диски и точки монтирования;
сетевые интерфейсы и ip адреса на них;
количество cpu и ram.

Можно и доступность гостя так проверять. Также с помощью агента можно запускать любые команды на гостевой машине:

# qm guest exec 101 "df"

#kvm #proxmox
​​Расскажу об одной возможности bash, с которой хоть и не часто, но приходится сталкиваться. Я столкнулся, когда писал утреннюю заметку про qemu-guest-agent. С его помощью можно выполнить любую команду на гостевой системе. Например так:

# qm guest exec 101 "df"

Далее мне захотелось добавить некоторые ключи к этой команде:

# qm guest exec 101 "df -Th"
Agent error: Guest agent command failed, error was 'Failed to execute child process “df -Th” (No such file or directory)'

Получил ошибку. Эта команда так не работает. Агент пытается найти бинарник df -Th. Читаю описание команды. Дополнительные аргументы надо передавать отдельно, примерно так:

# qm guest exec 101 "df" "/"

В таком виде работает. Добавляю ключи к df и опять ошибка:

# qm guest exec 101 "df" "/" "-Th"
Unknown option: th
400 unable to parse option

Тут типичная проблема для bash. Команда qm считает, что в конструкции -Th я передаю параметры для неё, а она их не понимает. Как же быть? Для этого существуют два тире --. Они говорят команде, что после них нужно игнорировать любые аргументы. То есть правильно будет вот так:

# qm guest exec 101 "df" "/" -- "-Th"

В таком виде команда отработает так, как ожидается. Двойным тире мы дали понять qm, что -Th не её аргументы.

С подобной проблемой легко столкнуться, когда, к примеру, вам через grep нужно найти строку -v. Как её указать? Это очень наглядный пример по данной теме. Grep будет считать, что -v это её аргумент и вместо поиска будет выводить свою версию. Тут надо действовать аналогично:

# grep -- -v file.txt

-- нужны, когда какая-то строка начинается с тире -, реже с +, но при этом не является аргументом команды, и нам нужно дать ей понять это.

#bash
​​Информация для тех, кто работает с Windows и VPN на базе WireGuard. Есть удобное приложение, которое позволяет настраивать использование приложениями различных туннелей. Например, один браузер направить через VPN, а все остальные приложения напрямую через основное сетевое соединение.

Настроить это можно с помощью TunnlTo. Установка и настройка очень простые. Скачиваете обычный msi пакет, устанавливаете приложение. Добавляете туда настройки туннеля WG, либо вручную, либо импортом файла с настройками. Далее открываете настройки этого туннеля и указываете, каким приложениям можно его использовать.

Помимо настройки приложений, можно указать IP адреса и подсети, в которые нужно ходить через заданный туннель. Настраивать можно как разрешающие правила, так и запрещающие. То есть можно всем разрешить ходить через какой-то туннель, кроме определённого приложения.

Я программу проверил лично, все очень быстро настроил, потестировал. Очень удобно. Приложение поддерживает множественные VPN подключения. Если кто-то знает подобное приложение для OpenVPN, поделитесь информацией. Мне бы очень пригодилось, так как в основной использую OVPN, а не WG.

Исходники

#wireguard
​​В Linux есть инструмент для сохранения состояния работающих процессов, в том числе PID, системные права, открытые файлы, используемую память, сокеты, tcp соединения и т.д. То есть полное состояние процесса сохраняется на диск. Делается это с помощью CRIU (Checkpoint Restore In Userspace). Причём работает она в пространстве пользователя, а не ядра ОС.

В свежих версиях Debian и Ubuntu CRIU есть в базовых репозиториях:

# apt install criu

Покажу сразу на наглядном примере, как это работает. Создаём скрипт test.sh, который выводит в консоль текущую дату:

#!/bin/sh
while :; do
sleep 1
date
done

Запускаем его и наблюдаем работу. Открываем соседнюю консоль. Создадим там директорию, куда сохраним состояние процесса:

# mkdir ~/criu && cd ~/criu

Смотрим pid нашего скрипта:

# ps -C test.sh
  PID TTY     TIME CMD
  748 pts/1  00:00:00 test.sh

Сохраняем состояние процесса. Это пример для процесса, запущенного в консоли, следовательно с привязкой к shell:

# criu dump -vvvv -o dump.log -t 748 --shell-job

Работающий процесс будет остановлен, а его состояние сохранено в локальную директорию. Можете посмотреть содержимое. Там будет много различных файлов с расширением .img.

Восстанавливаем работу процесса, находясь в директории с состоянием:

# criu restore -vvvv -o restore.log --shell-job

Он продолжит работу в открытой консоли. Можно выключить или перезагрузить систему. И после этого восстановить процесс. Он так же продолжит свою работу с момента заморозки.

Я пробовал переносить процесс в другую систему (Debian -> Ubuntu), но там восстановить не получается. Должно быть такое же окружение и системные файлы. У меня он сразу ругался на разные размеры бинарников dash и sleep. Для реальной миграции между системами нужно соблюсти ряд условий, описанных в документации.

Изначально проект был открыт для создания инструмента по заморозке и переноса контейнеров OpenVZ, но сейчас расширил свою работу на LXC/LXD, Docker. Вот пример, как сохранить состояние Docker контейнера и запустить вновь: ⇨ https://criu.org/Docker_External.

Посмотрел немного записей на youtube по этой теме. Люди сохраняют открытые VNC сессии со всем софтом и открытыми TCP соединениями. Пример с открытым видео в браузере. После восстановления, продолжается воспроизведение практически на том же месте. Также инструмент применим для сохранения и восстановления контейнеров в Kubernetes.

Сайт / Исходники

#linux #docker
На днях перебирал свои старые записи, в которых собирал на мой взгляд полезную информацию. Нашёл реальный список вопросов на собеседовании Middle DevOps, который выложил человек после собеса. По сути они все админские. Сейчас админов не осталось, все девопсами стали.

Проверьте себя по списку. Очень кратко к каждому вопросу напишу ответ. Так или иначе ответы почти на все вопросы знал, но где-то точные формулировки не помнил, где-то конкретные названия забыл. Это не полный список из-за ограничение длины заметки.

Какие бывают системы инициализации в Linux. В чём преимущества наиболее популярной?

В прошлом популярны SysV и Upstart, сейчас - Systemd. Основные преимущества - гибкие настройки сервисов и интеграция с системными настройками и компонентами, единая система инициализации для всех популярных дистрибутивов.

Что такое systemd unit, для чего он нужен, в каком каталоге создают файлы юнитов?

Unit - объект systemd, который служит для описания запуска и работы сервиса. Обычно в /etc/systemd/system.

Какие потоки ввода/вывода существуют в Linux, их нумерация?

0 (stdin), 1 (stdout) и 2 (stderr)

Как перенаправить поток вывода ошибок в стандартный вывод, зачем это может пригодиться?

# command 2>&1
Пригодится, чтобы собрать в один лог файл и результаты работы команды, и ошибки.

Есть приложение, которое пишет лог-файл, он занял почти всё свободное место на диске. Приложение останавливать нельзя, каким образом правильно освободить место на диске?

Очистить лог, к примеру, с помощью truncate, или cat /dev/null > log_file не удаляя сам файл. Либо удалить/переместить лог и дать команду приложению на reload, если он подобное поддерживает. Например, nginx reload, kill -USR1 `cat /var/run/nginx.pid`, smb reload, postfix reload и т.д. Если что-то напутали, файл удалили, но место не освободилось, то смотрим удалённые файлы через lsof +L1 и удаляем окончательно.

Что такое файловый дескриптор?

Это число-идентификатор потока ввода/вывода, который связан с файлом. Процессы имеют свои таблицы файловых дескрипторов, с которыми работают. Для ввода/вывода данных процесс обращается к ядру через системный вызов, передавая номер дескриптора.

Какой утилитой можно посмотреть файлы связанные с определенным потоком ввода-вывода?

Если не ошибаюсь, то lsof. В данном случае не понимаю, что подразумевается под определённым потоком. Файловые дескрипторы процесса смотрим так: lsof -p <pid>

Что такое интернет сокет в Linux?

Абстракция в виде файла, которая позволяет двум процессам взаимодействовать друг с другом. Файл нужен как точка входа в сокет и инструмент управления доступом. Все данные хранятся и обрабатываются в памяти ядра напрямую.

Какая встроенная утилита есть в Linux для ротации логов, какой тип ротации бывает?

Logrotate. Ротация по размеру, по времени жизни файла. Если делаем ротацию по размеру, не забываем настроить частый запуск logrotate.

Как проверить доступность порта, слушает ли соединение сервер?

# ss -tulnp

Был ли опыт конфигурирования Nginx, почему его используют как точку входа перед Backend?

Используют для распределения соединений/нагрузки между бэкендами, для удобства управления и контроля за соединениями.

Можно ли удалить default.conf из Nginx, в чем его ключевая фишка?

Можно удалить. Там прописан параметр default_server, его можно перенести в другой виртуальный хост. С этим параметром он будет собирать все запросы по ip адресу и несуществующим доменам.

Где локально в Linux прописать соответствие IP - DNS, как это может помочь в отладке конфигурации Nginx?

В файле /etc/hosts. Как может помочь в отладке - не знаю. Иногда нужно на бэкенде прописать соответствие IP адреса бэкенда доменному имени сайта, чтобы некоторые запросы выполнялись локально, а не ходили на прокси.

В чем принципиальное отличие виртуализации от контейнеризации?

Виртуальная машина — полноценный экземпляр ОС со своим ядром. Контейнеры используют ядро хостовой машины.

Ответы писал сам. Если ошибся, прошу поправить.

#обучение
​​Информация для некрофилов и любителей старины. До сих пор существуют и поддерживаются браузеры для работы в Windows XP. Для меня было удивительно это узнать, так как на прошлой итерации внимания к WinXP я нашёл только какой-то китайский браузер на основе старого chromium, который постоянно ругался на https соединения.

Mypal68 не такой. Работает идеально, регулярно обновляется. Все популярные сайты открываются. Можно даже видюшки на ютубе смотреть, если железо вытянет. Это может вдохнуть жизнь в какую-то старую железку. Браузер портабельный, установка не нужна.

Удивительно, но Kaspersky Free версии 18.0.0.405 тоже до сих пор работает и обновляется.

Летом писал заметку про сайт, совместимый со службой обновления Windows, в том числе версии XP. Там вплоть до 95-й версии поддержка.

Я не знаю, зачем это может кому-то сейчас понадобиться. Мне, к примеру, не надо. Чисто по приколу посмотреть на старую систему. Есть уже набор пылящихся железок на Windows 10.

#windows