Задать вопрос
Ответы пользователя по тегу Linux
  • Физическое устройство для управления Ubuntu Server?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если близко к "серверу" есть устройства (монитор/клавиатура/мышь), подключенные к обычному компьютеру или ноутбуку, то простой вариант это поставить KVM Switch. Тогда переключаться на "сервер" можно будет буквально одной кнопкой.
    Ответ написан
    2 комментария
  • Как в контейнере opensuse/tumbleweed добавить локаль 866?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Внутри контейнера надо отдельно сгенерировать эту локаль:

    localedef -i ru_RU -f IBM866 ru_RU.IBM866

    (тут локаль будет названа ru_RU.IBM866, но можно назвать как угодно, в том числе ru_RU.CP866 upd: лучше так не делать и оставить имя с названием кодировки по умолчанию, см. комментарии).

    Рецепт работает в любом Linux, но в минималистичных образах обычно много чего вырезают для уменьшения размера, поэтому каталог /usr/share/i18n пустой или значительно подчищен. В случае с opensuse нужно доустановить пакет glibc-i18ndata.

    Образец Dockerfile:

    FROM opensuse/tumbleweed
    
    RUN zypper in -y glibc-i18ndata && localedef -i ru_RU -f IBM866 ru_RU.IBM866
    ENV LC_ALL=ru_RU.IBM866
    Ответ написан
    8 комментариев
  • Как в вашей компании обеспечивается установка пакетов и обслуживание репозиториев?

    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) перекидываем в другую таблицу маршрутизации.
    Ответ написан