gladilov.org.ru gladilov.org.ua

107 заметок с тегом

сисадминство

Всякие системные и просто нужные компьютерные фичи. Настройка софта, иногда восстановление железа, и прочее, что входит в сферы интересов от эникейшика до «full stack admin’а». В придачу — симулятор системного администратора.



Позднее Ctrl + ↑

Чат сисадминов

xxx: Афигеть. Звонит бух, говорит придумай себе должностные инструкции. Цирк блять
yyy:
1) пить пиво
2) ничего не делать
3) если что то сломали можно бить
zzz:
Не. Так не пропустят.
На системного Администратора возлагаются следующие обязанности:

  1. Поддерживать собственное работоспособное состояние с помощью различных средств (в т.ч. внутреннего употребления).
  2. Наблюдать за работоспособностью сети предприятия.
  3. Проводить нагрузочное тестирование оборудования, а именно, графических адаптеров, в различных условиях.
  4. Контроллировать высокий уровень компьютерной грамотности сотрудников с целью недопущения последствий, влекущих за собой убытки предприятия. В случае наступления таких последствий обеспечить полное и всеобъемлющее понимание сотрудником недопустимости его поступка (в т.ч. с применением подручных средств).

Источник: http://bash.im/quote/446399

2017   работа   сисадминство   юмор

Опять про PS1

В дополнению к первому посту о переменной окружения PS1, для себя определился, что у моего пользователя она такая:

а у рута будет лиловенькая:

Показать

И вообще, на всякий случай привожу краткие выдержки конфигурационных файлов моего BASH’a:
Мой ~/.bashrc

PS1='\[\e]0;`if [[ $? = 0 ]]; then echo "\[\033[1;34m\]"; else echo "\[\033[1;31m\]"; fi`\t \[\033[1;32m\]\u\[\033[0;37m\]@\[\033[1;32m\]\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

alias sus='sudo -s'

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

export PHANTOMJS_EXECUTABLE=/usr/local/bin/phantomjs

Мой ~/.profile

if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
        "$HOME/.bashrc"
    fi
fi

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

export LANG=ru_RU.UTF-8
export LANGUAGE=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8
export PAGER=/usr/bin/most

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

/root/.bashrc

PS1='${debian_chroot:+($debian_chroot)}`if [[ $? = 0 ]]; then echo "\[\033[1;34m\]"; else echo "\[\033[1;31m\]"; fi`\t \[\e[0;95m\]\u\[\033[0;37m\]@\[\033[1;32m\]\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

export LANG=ru_RU.UTF8
export LC_ALL=ru_RU.UTF8
export PAGER=/usr/bin/most

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

/root/.profile

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n || true

Вишенкой на торте — механика процесса инициализации оболочки
(из Вики, чтобы представлять, как оно внутри устроено и заводится).

Когда Bash вызывается как интерактивная оболочка входа в систему, первым делом он читает и вызывает команды из файла /etc/profile, если этот файл существует. После чтения этого файла, он смотрит следующие файлы в следующем порядке: ~/.bash_profile, ~/.bash_login и ~/.profile, читает и вызывает команды из первого, который существует и доступен для чтения. При выходе bash читает и выполняет команды из файла ~/.bash_logout.

Когда запускается интерактивная оболочка, но не для входа в систему, bash читает и исполняет команды из файлов /etc/bash.bashrc и ~/.bashrc, если они существуют. Это может быть отменено опцией -norc. Опция -rcfile file заставит Bash использовать команды из файла file вместо /etc/bash.bashrc и ~/.bashrc.

2017   BASH   Linux   сисадминство   софт

Развоплощение поддоменов

Постепенно развоплощаю кучу поддоменов (вида sun.gladilov.org.ru, checklist.gladilov.org.ru, weather.gladilov.org.ru, exchrate.gladilov.org.ru и тэ дэ и тэ пэ). Если ВНЕЗАПНО не нашёлся нужный поддомен типа

^(http|https)://XXX.gladilov.org.[ru|ua]/

то страница с нужной инфой вероятнее всего лежит по адресу

^(http|https)://gladilov.org.[ru|ua]/XXX/

А совершенно точно адрес новой страницы можно узнать на  главной странице сайта.

Показать

Поддоменчики, которые на сегодня развоплотились:

2017   WEB-серверы   интернет   сеть   сисадминство

Переменная PS1 и её сёстры

Всегда хотел узнать, почему у переменной окружения $PS1 (prompt string) в конце цифра 1.

Оказывается — таких переменных аж четыре штуки ($PS1, $PS2, $PS3, $PS4), и все они отображают приглашения ко вводу в различных ситуациях.

Показать

Далее речь идёт о системной оболочке bash.

В моих системах $PSx выглядят так:

$PS1 — приглашение командной строки, используется в оболочке для отображения запроса ввода и отображается тогда, когда консоль готова считать команду.
Значение по умолчанию:

"\u@\h:\w\$ "

или

"\s-\v\$ "

(расшифровку значений спецсимволов bash см. внизу заметки).
$PS2 — вторичное приглашение командной строки, отображается, когда консоль нуждается в дополнительном вводе для завершения команды, которую уже начала считывать.
Значение по умолчанию:

"> "

Очень длинную команду можно разбить с помощью символа ’\’ в конце строки, при этом приглашение изменится на $PS2, ожидая ввода продолжения команды.

$PS3 — третичное приглашение, выводится тогда, когда оператор select ожидает ввода значений.
Значение по умолчанию:

""

хотя в bash’е вроде как

"#?"

$PS4 — приглашение четвертого уровня, выводится в начале каждой строки вывода во время трассировки выполнения (вызывается с ключом -x).
Значение по умолчанию:

"+ "

Во всех переменных можно использовать следующие спецсимволы (напомню, речь идёт об оболочке bash):

\a

символ Bell (звонок) (код 07)

\d

дата в формате «ДеньНедели Месяц Число» (т. е. «Tue May 26»)

\\

символ обратного слеша (обратная косая черта)

\e

символ Escape (код 033)

\h

имя хоста до первой точки

\H

полное имя хоста

\j

количество заданий, выполняемых оболочкой в фоне

\l

базовое имя наименования терминального устройства оболочки (в случае входа через ssh-клиент возвращает не полное имя, например pts/3, а только 3)

\n

символ перевода строки

\r

символ возврата каретки

\s

имя оболочки, базовое имя от переменной $0 (после последнего символа /)

\t

текущее время в 24-часовом формате (HH:MM:SS)

\T

текущее время в 12-часовом формате (HH:MM:SS)

\@

текущее время в 12-часовом формате (am/pm)

\A

текущее время в 24-часовом формате (HH:MM)

\u

имя текущего пользователя

\v

версия оболочки bash (например, 2.00)

\V

версия и номер релиза bash (например, 2.00.0)

\w

полный путь текущей директории

\W

базовое имя текущей директории

\!

номер истории зтой команды

\#

номер зтой команды

\$

если UID == 0, то символ ’#’, иначе ’$’

\nnn

символ, соответствующий восмеричному числу nnn

\[

начало последовательности невыводимых символов. Может использоваться для осуществления управления терминалом в приглашении

\]

конец последовательности невыводимых символов

\D{format}

строка format передаётся в strftime(3), результат вставляется строку приглашния оболочки, пустой формат приводит к выводу локального времени. Скобки необходимы.

Ну и напоследок бонус — скрипт генерации таблицы цветов в bash

2017   BASH   Linux   сисадминство   софт

Памятка для настройки DebWrt

 Давным-давно появилась у меня железка D-Link DIR-300/A2,  вот такая. Так как на ней есть разъём USB, то я поставил туда прошивку DebWrt, продукт противоестественного скрещивания Debian и OpenWrt

С тех пор на винте лежит текстовый файл, описывающий основные команды настройки этой ОС. Публикую здесь как памятку для себя (с моими комментариями), ну а если сей опус кому-либо когда-либо как-либо чем-то пригодится — я буду только рад!

Показать

cd /etc/network
rm interfaces // это симлинк на interfaces.firstboot
cp interfaces.firstboot interfaces
vi interfaces // настраиваем сетевые интерфейсы как нам нужно
// следующие команды необходимы для настройки доступа в интернет без перезагрузки устройства
// (после доступ будет реализован путём выдачи IP по DHCP от шлюза во внешнюю сеть)
ip a a $IP/$MASK dev $IF && echo '8.8.8.8' > /etc/resolv.conf && ip r a via $GW
// для обновления репозитория со squeeze до wheezy
cp /etc/apt/sources.list /etc/apt/sources.list.old
echo 'deb http://ftp.debian.org/debian wheezy main' > /etc/apt/sources.list
gpg --keyserver pgpkeys.mit.edu --recv-key F120156012B83718 && gpg -a --export F120156012B83718 | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 010908312D230C5F && gpg -a --export 010908312D230C5F | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key CBF8D6FD518E17E1 && gpg -a --export CBF8D6FD518E17E1 | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010 && gpg -a --export 7638D0442B90D010 | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553 && gpg -a --export 8B48AD6246925553 | apt-key add -
// опционально
gpg --keyserver pgpkeys.mit.edu --recv-key 6FB2A1C265FFB764 && gpg -a --export 6FB2A1C265FFB764 | apt-key add -
aptitude update
aptitude upgrade
adduser $USER
echo '$USER ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers
// обновление системы, можно и aptitude upgrade/aptitude dist-upgrade впендюрить, если время позволяет
aptitude update
// установка нужных пакетов
aptitude install mc sudo locales bash-completion ntpdate openssh-server screen wpasupplicant
// установка опциональных пакетов
aptitude install most nload htop ccze telnet wavemon tcpdump fping nmap ipcalc console-cyrillic
// установка совсем уж опциональных пакетов
aptitude install apache2 php5 mysql-server mysql-client
// настройка локали, шрифтов, таймзоны
dpkg-reconfigure locales
dpkg-reconfigure console-cyrillic // если поставлен
dpkg-reconfigure tzdata

Далее следует настройка переменных и алиасов в ~/.bashrc и ~/.profile (а равно и в /root/.bashrc и /root/.profile).

Если кого заинтересовала эта прошивка — вот  ссылка на мою инструкцию по перепрошивке девайса (DIR-320/A*, версия прошивки — 10.03).

2016   Debian   Linux   маленькие хитрости   ОС   роутер   сисадминство   софт

Have a nice System Administrator Appreciation Day!

Всех сисадминов с праздником!

Так как я тоже немного приобщён к этой разудалой братии — жена мне утром, пока я спал, испекла вот такой бинарный тортик.

Показать

Большое ей спасибо и всех сись-одминов с праздником!

P.S. Торт, кстати, очень вкусный :-)

Скрипт подсчёта размера БД MySQL

Понадобилось мне как-то узнать размер таблиц в MySQL-базе данных. Причём узнать в shell script’е. Поискав в сети, наткнулся на чудесный скриптик.

Показать

Допилив его, стал использовать в MRTG. Привожу полностью, без правок/изменений:

#!/bin/bash
# Calculate the storage space used up by all tables in a given MySQL database
# Ben Dowling - www.coderholic.com
database=$1
username=$2
password=$3

if [ ${#database} -eq 0 ]
then
    echo "Usage: $0 <database> [username [password]]"
    exit
fi

if [ "$password" ]
then
   password="-p$password"
fi

mysql="mysql -u $username $password $database"

$mysql -se "USE $database";

tables=$($mysql -se "SHOW TABLES")

totalData=0
totalIndex=0
totalTables=0

for table in $tables
do
   output=$($mysql -se "SHOW TABLE STATUS LIKE \"$table\"\G")
   data=$(echo "$output" | grep Data_length | awk -F': ' '{print $2}')
   dataMegs=$(echo "scale=2;$data/1048576" | bc)
   index=$(echo "$output" | grep Index_length | awk -F': ' '{print $2}')
   indexMegs=$(echo "scale=2;$index/1048576" | bc)
   total=$(($index+$data))
   totalMegs=$(echo "scale=2;$total/1048576" | bc)
   
   echo "$table Data: ${dataMegs}MB Indexes: ${indexMegs}MB Total: ${totalMegs}MB"
   
   totalData=$(($totalData+$data))
   totalIndex=$(($totalIndex+$index))
   totalTables=$(($totalTables+1))
done

dataMegs=$(echo "scale=2;$totalData/1048576" | bc)
indexMegs=$(echo "scale=2;$totalIndex/1048576" | bc)
total=$(($totalIndex+$totalData))
totalMegs=$(echo "scale=2;$total/1048576" | bc)

echo "*** $totalTables Tables | Data: ${dataMegs}MB Indexes: ${indexMegs}MB Total: ${totalMegs}MB ***"

Размеры выводятся в мегабайтах. Пример вывода:

soul@etcetera:~$ ./db.sh somedatabase root ********
wp_comments Data: 6.60MB Indexes: .15MB Total: 6.75MB
wp_links Data: 0MB Indexes: 0MB Total: 0MB
wp_options Data: 1.57MB Indexes: .01MB Total: 1.58MB
wp_postmeta Data: .01MB Indexes: .01MB Total: .02MB
wp_posts Data: .57MB Indexes: .02MB Total: .60MB
wp_term_relationships Data: 0MB Indexes: .01MB Total: .02MB
wp_term_taxonomy Data: 0MB Indexes: 0MB Total: 0MB
wp_terms Data: 0MB Indexes: 0MB Total: 0MB
wp_tla_data Data: 0MB Indexes: 0MB Total: 0MB
wp_tla_rss_map Data: 0MB Indexes: 0MB Total: 0MB
wp_usermeta Data: 0MB Indexes: 0MB Total: 0MB
wp_users Data: 0MB Indexes: 0MB Total: 0MB
*** 12 Tables | Data: 8.78MB Indexes: .25MB Total: 9.03MB ***

2015   BASH   Linux   маленькие хитрости   сисадминство   скрипт   софт

Настройка NUT в режиме master + slave

Приобретя ИБП Powercom BNT-1000AP Schuko, поставил себе задачу обеспечить гарантированное питание и корректное завершение работы на важных системах. Имелся в виду мой компьютер (естессно!) и роутер D-Link DIR-320/A2E с установленным там DebWRT (носит гордое имя hive, о нём я уже писал).

Показать

Так как ИБП я выбирал с буквой P в конце названия модели, то он имеет порт для связи с компьютером. В моём случае это был USB-порт (RS-232 и другую экзотику уже в них и не используют давно). В комплекте с ИБП прилагался кабель USB(A)male — USB(B)female. Но им я дотянулся только до компьютера.

На компе поставил пакет NUT (Network UPS Tools). Он состоит из сервера upsd, клиента upsmon и вспомогательных программ:

  • upsc — программа общения с сервером вручную
  • upsdrvctl — программа запуска драйвера ИБП вручную
  • upscmd — программа посылки команд в ИБП вручную
  • upssched — скрипт обработки событий от ИБП

Серверный процесс upsd поддерживает связь с ИБП и отвечает на запросы клиентов.
Клиентский процесс upsmon отвечает за своевременное обнаружение проблем с питанием и принятие необходимых решений.

Поскольку к одному ИБП может быть подключено несколько устройств, то клиентов тоже может быть много. Среди многих клиентов выделен один, запущенный на машине с подключённым ИБП, он называется master, остальные клиенты называются slave. Клиент master сообщает при необходимости slave-клиентам о том, что им надо отключиться и завершить работу машин, на которых они работают. Это обычно происходит перед выключением ИБП из-за пониженного заряда батареи.

В моём случае конфигурация свелась к ебле с созданием файла /dev/ttyUSB0 настройке линка через USB-кабель и редактированию конфигурационных файлов:

  • /etc/nut/nut.conf — указывает тип работы nut
MODE=standalone
UPSD_OPTIONS="-u root"
UPSMON_OPTIONS="-u root"
  • /etc/nut/ups.conf — конфигурация драйвера и способа подключения к ИБП
user=root
[bnt-1000]
driver=usbhid-ups
port=auto
productid=0004
desc="Powercom BNT-100AP Schuko"
  • /etc/nut/upsd.conf — конфигурация сервера
LISTEN 127.0.0.1 3493
LISTEN [адрес в моей домашней IP-сети] 3493

Можно просто указать

LISTEN 0.0.0.0 3493

для того, чтобы сервер слушал запросы на всех интерфейсах.

  • /etc/nut/upsd.user — описание клиентов и пользователей
[soul]
password=<пароль>
action=SET
instcmds=ALL
upsmon=master
[hive]
password=<пароль>
upsmon=slave
  • /etc/nut/upsmon.conf — конфигурация клиента, строка соединения с сервером
RUN_AS_USER root
MONITOR bnt-1000@localhost 1 soul <пароль> master

Также

chown -R nut. /var/run/nut/

На сервере hive настройка была более тривиальной и свелась к установке пакетов nut и nut-cgi и редактированию файла /etc/nut/upsmon.conf:

MONITOR bnt-1000@soul 1 soul <пароль> slave

После этого процесс upsmon на сервере hive смог общаться с процессом upsd на моей машине soul.

Итоговая схема выглядит так:

Стандартный вывод nut-cgi меня не очень устроил:

поэтому я нарисовал свой сайтик с бэкджеком и шлю визуализацией данных от ИБП:

Ссылки:
http://www.ignix.ru/book/freebsd/daemon/network_ups_tools
https://sites.google.com/site/plan0metr/home/nut
http://www.linux.kiev.ua/materials/How-to-use-UPS-with-nut.html

2014   Linux   досуг   маленькие хитрости   роутер   сеть   сисадминство

DIR-320. Обратное питание по USB

У меня дома есть маршрутизатор D-Link DIR-320/A2E с изменённой прошивкой (сначала я скомпилировал для него OpenWRT по мануалу от dipcore (архивная ссылка), затем мне понадобился на этом роутере php, т. к. я его ещё и как сервер использую, и теперь на нём живёт практически полноценный Debian с шахматами и поэтессами).

Показать

Выглядит это так:

Приведу необходимые пояснения (на схеме и по тексту):

К стенке  стола привинчены два маршрутизатора, D-Link DIR-615/B2G и D-Link DIR-320/A2E. DIR-615 со штатной прошивкой служит шлюзом в сеть провайдера и интернет. DIR-320 с дебианом на борту связан со шлюзом по беспроводной сети и работает домашним DNS-, NTP-, принт-, файл-сервером эт цетера. На этом-же устройстве настроен apache с несколькими сайтами. Для обеспечения загрузки ОС используется накопитель USB-флеш LG UB2GVMNPB объёмом 2 ГБ, включённый в активный 10-портовый USB-хаб CBR CH 310. Для питания роутера с дебианом использовался стандартный блок питания D-Link номиналом 5 В 2,5 А. Для USB-хаба — его родной БП 5 В 2 А.
Вчера возникла необходимость перегрузить дебиан-маршрутизатор по питанию — поставил на нём vsftpd для складирования изображений с камеры на локальный FTP, но привинченный phpAlbum.net подвис, пытаясь вычитать со всех фоток EXIF-данные сразу. В сетевой удлинитель у меня было воткнуто 3 блока питания — для DIR-615, для DIR-320 и для USB-хаба. Вытащил соответствующий БП, смотрю — роутер остался включённым. Я слегка охренел. Вставил его БП обратно, вытащил другой (USB-хаб). (DIR-320 остался работать).

Ладно, вставил на место, вытащил третий (от DIR-615). Результат не поменялся. При всех выключенных БП он наконец-то погас. Я попробовал включить только его БП, роутер стал загружаться, но без доступа к хабу и, соответственно, к флехе с системой он бы не загрузился. Я вытащил его питание (роутер погас), включил питание USB-хаба и увидел, что DIR-320 опять загружается! Теперь у меня такая итоговая схема соединения железок:

И маршрутизатор вполне себе функционирует нормально:

Принцип прямого соединения внешнего питания с цепью +5 В питания USB-хоста мне уже знаком, но то, что это реализовали в DIR-320 — для меня было открытием. Подобную ситуацию нагуглил только в одном месте — на cxem.net.

Кстати, при такой схеме подключения есть опасность повреждения контроллера USB при отключении хоста от сети и включенном питании хаба (хотя изменение скважности у импульстого БП никто не отменял). У этой железки устраняется удалением элемента с обозначением 000 возле гнезда питания при снятой задней крышке хаба. Для работы без внешнего питания потребуется установить на это место диод Шоттки.

P. S. Справедливости ради нужно сказать, что мне пришлось вернуть старую схему питания устройств, т. к. питания от USB-хаба оказалось недостаточно (роутер перезагружался при load average больше 0,5).

2014   D-Link   железо   маленькие хитрости   роутер   сеть   сисадминство

Веселый переезд

Сегодня со мной связался знакомый, который оказывал мне услугу по поддержке доменных имён у моих проектов, и сообщил, что в течение полутора дней он планирует отказаться от VPS-хостинга, на котором стоит DNS-сервер.

Показать

Я сохранил информацию об именах, заказал услугу NS у хостера моих доменов и начал «процедуру переноса NS», которая заключается в том,что я прописывал canonical name каждого субдомена в панель управления NS хостера. В доменном имени gladilov.org.ua у меня 84 поддомена, т. к. значительное количество проектов веду, много храню в виде наработок, и ещё больше в планах. Например, из реализованных —  погода в Симферополе,  сайт о Солнце,  сайт по роутерам,  православная календарная страничка,  сервер точного времени,  Jabber-сервер,  подборка флагов стран и т. д.
Перевод NS к хостеру, не скрою, делал в спешке, поэтому, когда у меня постепенно начали пропадать все мои поддомены (включая и этот — blog.gladilov.org.ru / blog.gladilov.org.ua), то не сильно и удивился...
Начал разбираться и выяснил, что в результате переноса я получил 84 имени вида sun.gladilov.org.ua.gladilov.org.ua, mail.gladilov.org.ua.gladilov.org.ua, install.gladilov.org.ua.gladilov.org.ua и т. д.
В консоли проверил — точно, sun.gladilov.org.ua.gladilov.org.ua резолвится и пингуется, dig даёт о нём информацию.
Я в спешке вместо имён поддоменов (sun, weather etc.) везде повводил полное имя (sun.gladilov.org.ua, weather.gladilov.org.ua). NS-сервер хостера честно и отработал на основании указанных мною данных, прилепил к введённым поддоменам основной домен и анонсировал полученные имена.

В общем — визуальная улика о моей ошибке:

Сейчас уже всё исправил, теперь буду более внимательным.

2013   интернет   сеть   сисадминство
Ранее Ctrl + ↓
Наверх