Задать вопрос
Ответы пользователя по тегу Linux
  • Как в вашей компании обеспечивается установка пакетов и обслуживание репозиториев?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Делаются локальные копии основных репозиториев (reposync, debmirror и другие подобные инструменты), это может касаться и самих дистрибов с пакетами, и всяких менеджеров пакетов для языков типа pip, maven, npm. Либо, как вариант, доступ к ним прописывается через прокси с хорошо контролируемым списком хостов, куда разрешено ходить. Отдельные приложения (вне репозиториев или собственные разработки или свои кастомные сборки) можно класть в свои репозитории либо иногда норм даже просто положить архивом на http, который скрипт раскатки (ansible?) скачает и положит куда надо. Например, именно так у нас по хостам расползается jdk всех нужных версий (в тех проектах, где до контейнеризации нужно ещё космическое количество рефакторинга провести).

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

    Это вообще часть подхода, при котором инфраструктура имеет свой жизненный цикл, свои практики и инструменты, которые отделены от жизненного цикла конечных бизнес-приложений с их совсем другими методами раскатки, обновления, контроля работоспособности.
    Ответ написан
    7 комментариев
  • Сложная маршрутизация на linux роутере. Как правильно готовить policy based routing?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    По поводу этого лучше всего начать с LARTC HOWTO.

    Если кратко, маршрутищация в iproute2 устроена так. Есть несколько таблиц маршрутизации, из которых 3 есть всегда (local, main, default), но можно создать ещё. По правилам (команда ip rule) перебираются таблицы, подходящие под условия, в соответствии с приоритетами (preference, первое число в выводе команды). И в каждой таблице есть свои маршруты. Таблицу local изменять нельзя и перед ней ничего маршрутизировать нельзя (это можно обойти через nat в PREROUTING, но это уже другой вопрос).

    Самый простой вариант - это source routing. Впервые мне это понадобилось, когда я подключил дома второго провайдера с внешним IP, и мне потребовалось отвечать с обоих внешних адресов со всего интернета. Делается так:

    1. В /etc/iproute/rt_tables описываем псевдонимы для новых таблиц (необязательно - можно использовать числовые идентификаторы - но так удобнее). Например, 10 - isp1, 20 - isp2.

    2. Задаём правила, которые приведут к выбору таблицы в зависимости от source address:

    ip rule add pref 10 from IP1 lookup isp1
    ip rule add pref 20 from IP2 lookup isp2

    3. В каждую таблицу добавим маршрут default через нужного оператора:

    ip route add default via GATEWAY1 table isp1
    ip route add default via GATEWAY2 table isp2

    4. В таблице main (которая используется по умолчанию, если не указать таблицу в команде явно) описываем маршрут "по умолчанию" - через того оператора, через которого будет идти исходящий трафик (не ответный на входящий), в данном случае пусть будет isp1:

    ip route add default via GATEWAY1

    Всё это иногда можно в той или иной степени засунуть в конфиги сети (зависит от дистрибутива Linux весьма существенно), а иногда приходится делать скриптами, в том числе, возможно, вызываемыми через hook системы инициализации сети (я, например, обновлял маршрутизацию через postup-хук dhcp-клиента и из скрипта, который поднимал pptp-vpn).

    В дальнейшем всё это обросло кучей других особенностей, например, ip rule fwmark по меткам, которые ставилилсиь в iptables по connmark и иногда другим условиям, но это уже следующий уровень сложности и более специфичне задачи. И LARTC HOWTO почитать всё равно рекомендую, ибо там основа основ и все гуру по нему учились.
    Ответ написан
    3 комментария
  • Как выйти из двух пользователей в Linux, и при этом выполнить команду один раз?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И не будет, ведь такая команда будет исполняться в одном shell, а не в двух разных. После первого exit дальше уже всё, остаток будет проигнорирован.

    Способы есть:

    1. Из суперпользователя убить shell пользователя. Некрасиво и неудобно, но закроет оба шелла.

    2. Переключение в суперпользователя оформить сразу с выходом, тогда выход из внутреннего сделает выход и из внешнего, например:

    sudo -i; exit

    Недостаток - если не удастся правильно ввести пароль - сразу же и выкинет. Ну, можно поразбираться с кодами возврата, чтобы не делать exit.

    3. Вместо предыдущего можно сделать exec, тогда запускаемая команда заместит текущий shell, а не будет запущена как дочерний процесс:

    exec sudo -i

    Недостаток тот же - если не ввести правильно пароль, то выкинет.

    Но в целом я не вижу во всём этом смысла. Выход можно делать комбинацией Ctrl-D. Нажать дважды Ctrl-D ничто не мешает, это даже удобнее.
    Ответ написан
    2 комментария
  • Как скопировать файл на ext4 image без прав root?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, можно, используя debugfs:

    $ dd if=/dev/zero of=test.img bs=1M count=10
    $ mkfs.ext4 test.img
    $ debugfs -w test.img
    debugfs: write my_file.txt new_file.txt
    Ответ написан
    1 комментарий
  • Как перенаправить вывод strace в tail?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нет, так сделать нельзя, но есть утилиты, которыми можно принять через stdin лог и автоматически его ротировать по размеру (в том числе удаляя старые файлы). Например, multilog.

    Примеры есть тут: https://superuser.com/questions/291368/log-rotatio...

    Но в целом strace - это так себе средство отладки, тем более скриптов, лучше логгировать в самом скрипте, потому что в strace много ненужного мусора. Как вариант, можно с помощью опций ограничить системные вызовы, которые он будет логгировать.
    Ответ написан
    Комментировать
  • Сколько места доступно докер контейнеру на linux?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Docker по умолчанию использует "слоённую" файловую систему overlayfs. В ней каждый образ состоит из нескольких слоёв, которые перекрывают друг друга (read only). Плюс собственный слой контейнера (read write). Поэтому если никакой большой записи приложение в контейнере не ведёт, то образ на диске хранится один раз и дополнительно место почти не расходуется. Это нормально, это так и задумано.
    Ответ написан
    Комментировать
  • Как переименовать файлы с определенным условием в Linux?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В Linux есть замечательная утилита rename. Ну, точнее, их две: одна входит в пакет util-linux, другая - скрипт на базе perl-модуля File::Rename. В deb-дистрибутивах нужный нам скрипт устанавливается в составе пакета rename и также имеет имя второе file-rename (а версия из util-linux имеет имя rename.ul). В других дистрибутивах может быть иначе, поэтому смотрим внимательнее параметры запуска (можно запустить rename без параметров и убедиться, что это нужный вариант).

    Синтаксис предельно простой: rename регулярное_выражение_замены_perl имена_файлов

    Синтаксис rename.ul для сравнения: rename что_заменить на_что_заменить имена_файлов

    Вот что можно сделать для решения задачи (в предположении, что других точек, кроме как перед расширением, в имени файла нет):

    rename 's/-\w+\././' *

    Этот скрипт намного удобнее многоэтажных однострочников, да и пригодится в жизни ещё не раз.
    Ответ написан
    7 комментариев
  • Сможет ли Ansible вот такое?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Большинство вещей - без проблем. Например, можно использовать таск authorized_keys для аккуратного прописывания ключа вместо ручного его закидывания на сервер. Есть таски для создания пользователей и групп, установки софта, копирования файлов и создания их по шаблону...

    Некоторые вещи можно делать косвенным путём, копируя и генерируя конфиги, запуская свои кастомные команды через таск shell, итд итп. Например, конфигурить sudo можно через создание файла с нужным содержимым в /etc/sudoers.d, не трогая основной конфиг.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Набираем locate имя_файла. Если ругается что такой команды нет - ставим то что предлагает (думаю, в кали такой же подсказыватель, как в убунте) - и команда появится. При установке вроде даже должен сразу и базу создать, если нет - запустить updatedb из-под root.

    locate ищет не на диске, а в индексе, который обновляется ежедневно из cron. Поэтому свежесозданных файлов он не найдёт. Но зато он ищет очень быстро.
    Ответ написан
    Комментировать
  • Что за папка /root/mdb103/?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Сделай из под root

    lsof -n | grep root/mdb103

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

    В каталоге лежат deb-пакеты, они после установки не нужны. В подкаталоге лежат исходники сервера скомпилированные. В зависимости от того, как они установлены, они могут быть также не нужны. Если их ставили через make install без префикса в /root, то сервер должен, скорее всего, стоять в /usr/local. Если через сборку пакетов с помощью debian/rules (при этом готовые пакеты кладутся в вышестоящий каталог, что весьма логично), то тоже не нужны - они должны быть затем установлены в систему.

    В конце концов, необязательно файлы сразу удалять. Можно попробовать переименовать этот каталог, перезагрузить базу или даже весь сервер и убедиться, что всё работает.
    Ответ написан
    1 комментарий
  • Как пользоваться TTY?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В консоли раскладка клавиатуры грузится с помощью команды loadkeys, раскладки лежат в /usr/share/keymaps (в deb*untu их по умолчанию нет, надо доставить пакетом console-data).

    Шрифт в консоли устанавливается командой setfont, шрифты и таблицы кодировок лежат в /usr/share/console{fonts,trans} (тоже в пакете console-data).

    loadkeys и setfont устанавливают раскладку и шрифт до перезагрузки. Лучше этим не страдать, а использовать штатную настройку, в debubuntu это dpkg-reconfigure console-setup.

    Для использования мыши в консоли надо установить и запустить сервис gpm.
    Ответ написан
    Комментировать
  • Как распространять приложение под linux?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Я не знаю, почему все так активно советуют собирать пакеты. Надо начать с того, что в Linux никогда не было принято использовать pyinstaller... почему? Потому что в Linux python идёт из коробки. В Windows сложно вынуждать пользователей устанавливать интерпретатор языка и все зависимости, тут же с этим проще гораздо.

    Так что можно просто распространять архив с приложением и инструкцией по запуску вида:

    virtualenv -p python3 env
    . env/bin/activate
    pip install -r requirements.txt
    ./app.py
    Ответ написан
    2 комментария
  • Согласование архитектур в Linux?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, конечно, Linux поддерживает кучу архитектур, но код для архитектуры mipsel нельзя запустить на armhf. Поэтому проблемы именно "кучи" нет - никто не использует программы, которые всё равно не запустятся.

    Есть проблема только с поддержкой совместимх архитектур x86 и x86_64. В результате в основном пришли к тому, что есть /lib|/usr/lib|/usr/local/lib и /lib64|/usr/lib64|/usr/local/lib64 или такие же с lib32|lib или даже ортогональный им lib32|lib64 для библиотек, а для бинарников такой проблемы нет, потому что какая разница, будет ли единственный файл /usr/bin/program 32-битной или 64-битной приложенькой? В крайнем случае в имя программы можно добавить 32 (или даже -x86|-x86_64) на конце.

    С учётом того, что в LINUX можно положить библиотеки в /foo/bar, а исполняемые файлы в /lorem/ipsum и разрулить это с помощью PATH и ld.so.conf, можно сделать вообще как душе угодно. Не забываем также, что в грамотно организованной и правильно администрируемой системой всё по возможности ставится из пакетов. Поэтому каждый файл учтён, ничто не будет перезаписано при установке/обновлении.
    Ответ написан
  • Как заставить volumes Docker compose не затирать данные из контейнера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Запись

    - src:/var/www/html

    создаёт именованный том src в хранилище (docker volume ls). Надо указывать путь к каталогу, например, как относительный: ./src.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Тут главная ошибка в том, что у каждого персональная шара, это плохая практика. Правильнее пользователей объединять в группы, а каждой группы завести шару. Плюс могут быть разные перекрёстные шары (для всех сотрудников компании, для конкретных департаментов, для отделов, шары узкотематического характера...). Тогда проблем бы не было. У каждого пользователя есть свой набор доступных помоек в соответствии с его уровнем полномочий, и не нужно всё время перелогиниваться.

    Интересно, что даже в таком случае почему-то некоторые норовят в общей шаре отдела создать многочисленные персональные "именные папки" и держать везде копии одних и тех же иногда не очень отличающихся файлов.
    Ответ написан
    Комментировать
  • Какие права выставить на файл sqlite базы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Лучше не "ставить из пакета". Это лишает смысла проверку целостности пакета по контрольным суммам, усложняет установку обновлений. Поэтому правильнее иметь некую "эталонную" базу, которую копировать в целевое размещение. Как вариант, в пакете держать .sql (.sql.gz) для инициализации базы. Саму инициализацию делать скриптом (как initdb в postgres) или описать в инструкции что куда скопировать/выполнить. К слову, для процесса обновления тоже может потребоваться механизм, так как структура данных может меняться в новых версиях. Процесс первичной инициализации и последующего обновления можно сделать частью post-install скрипта пакета.

    Базу следует класть не в /usr (в классической теории UNIX-систем /usr может вообще монтироваться в read-only, например, по nfs), а в /var, лучше /var/lib/имя_программы. Сделать специальную системную группу без пользователей вполне нормально, так делают. В инструкции следует описать, что пользователей надо в неё добавлять. Соответственно, на файл права 660, на каталог 770.

    Если пользователи будут работать с этой базой параллельно-одновременно, а не строго по очереди, то потребуется ещё механизм блокировок. В этом случае лучше рассмотреть полноценную СУБД или хотя бы вынести работу с базой в отдельный сервис, с которым программа будет взаимодействовать.
    Ответ написан
    7 комментариев
  • Bash-скрипт: как заменить данную строку в файле на переменную?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В данном конкретном случае намного более адекватным было бы использовать include в nginx.conf отдельного конфига, который генерировать скриптом.
    Ответ написан
    Комментировать
  • Как перенаправить трафик пользователя через gateway интерфейс используя iproute2 или iptables?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    iptables -m owner -h

    Маркируем пакет от пользователя (-j MARK) и затем policy routing (ip rule add fwmark XXX lookup vpn) перекидываем в другую таблицу маршрутизации.
    Ответ написан
  • Как правильно выполнить проверку ФС?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    По умолчанию при монтировании файловой системы ставится флаг dirty (для тех, которые имеют поддержку такого флага, а обычные fs для Linux все имеют), а при размонтировании снимается. Если dirty не установлен, то fsck при простом запуске (без дополнительных параметров при запуске из командной строки или через флаг в fstab) не выполняет фактическую проверку файловой системы (точнее, всё же выполняет иногда - через определённое количество монтирований или по прошествии некоторого количества месяцев, но это отдельная настраиваемая история). Просто сразу пишет filesystem clean.

    Если отмонтирование не выполнено корректно (например, система была перезагружена без завершения как надо или флешка была резко выдернута), то fsck будет пытаться восстановить файловую систему. При этом на файловых системах с журналированием это может быть сделано достаточно быстро с помощью replay journal. Если же восстановить легко не получилось, то система выкинет в Shell с предложением прогнать fsck самому. В принципе, если файловая система ещё не превратилась в мелко нашинкованные макароны, это может пройти весьма успешно даже с жёсткими флагами fsck -f -y. Но тут уж пользователь сам берёт на себя ответственность.

    В общем, проверка файловой системы при запуске происходит по сложным правилам, в том числе на основе указанных в fstab параметров. Кроме того, с помощью fsck.*-параметров загрузки ядра (в данном слуаче через grub) можно явно попросить systemd изменить поведение по умолчанию и, например, принудительно проверить файловую систему, даже если она была отмонтирована корректно. Если эти параметры передать в загрузчик вручную через редактирование в самом grub при загрузке, то на последующие перезагрузки это изменение не повлияет.
    Ответ написан
    1 комментарий
  • Как грепать вывод tcpdump?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    tcpdump -i ens18 -w file.pcap фильтры
    tshark -r file.pcap -T fields -e ip.dst | sort | uniq


    Можно сразу всё сделать wireshark'ом, но у него формат фильтров отличается.
    Ответ написан
    1 комментарий