Всем привет.
На заметку простейший плайбук, как установить веб-сервер из RPM-файла, добавить его в автозагрузку и запустить.
--- - hosts: cmsansible gather_facts: no become: yes tasks: - name: copy httpd file copy: src: /tmp/httpd-2.4.6-90.el7.centos.x86_64.rpm dest: /tmp/httpd-2.4.6-90.el7.centos.x86_64.rpm - name: copy tools copy: src: /tmp/httpd-tools-2.4.6-90.el7.centos.x86_64.rpm dest: /tmp/httpd-tools-2.4.6-90.el7.centos.x86_64.rpm - name: install tools yum: name: /tmp/httpd-tools-2.4.6-90.el7.centos.x86_64.rpm state: present - name: install httpd yum: name: /tmp/httpd-2.4.6-90.el7.centos.x86_64.rpm state: present - name: enable httpd service: name: httpd enabled: yes - name: start httpd service: name: httpd state: started
Пару уточнений:
1. become - для того, чтобы избежать ошибки "You need to be root to perform this command"
2. проверьте, чтобы на управляемой ноде не было установлено ПО апача, иначе будет такая ошибка FAILED! => {"ansible_facts": {"pkg_mgr": "yum"}, "changed": false, "changes": {"installed": ... }
3. Когда пишите плайбук всегда проверяйте отступы - это очень важно!
Всем, привет!
Продолжаю список интересных вопросов, которые задают на собеседовании Linux админам.
Немного практики не повредит :)
Весь список тут
В директории 500 файлов, необходимо найти все файлы свыше 20 ГБ, отсортировать по размеру, отобразить 5 самых больших файлов.
find /data/ -size +20G | sort -r | tail -5
Распакуйте test.tar.gz без использрования google и справки.
tar xvf test.tar.gz
Как разделить файл на несколько частей без архиватора? Например, 10 гб файл разделить по 1 гб.
Для этой цели подойдет команда split split -b 1G somefile
Рекурсивно удалите все файлы с раширением "*.pyc" из тестовой директории?
find /testdir -type f -name '*.pyc' -delete
Найдите строку "my konfu is the best" во всех файлах с расширением *.py.
find / -type f -name '*.py' | grep -rnw -e 'my konfu is the best'
Grep options:
-r or -R включаем рекурсию
-n подсвечиваем номер строки
-w ищем точное совпадение
Замените вхождение фразы "my konfu is the best" на "I'm a linux jedi master" во всех *.txt файлах.
find / -type f -name '*.txt' | grep -rnw -e 'my konfu is the best' | sed -i 's/my konfu is the best/I'm a linux jedi master/g' *
Проверить доступность 443 порта на машине с IP-адресом X.X.X.X
telnet x.x.x.x 443
Получить содержимое http://myinternal.webserver.local/test.html с помощью telnet'a.
telnet myinternal.webserver.local GET /test.html
Отправить письмо используя командную строку(command line).
telnet mailserver.com 25 HELO imfromthere.com MAIL FROM: someaddress@imfromthere.com RCPT TO: some@email.add
DATA
Данные письма, конец письма заканчиваются '.'
Найти все файлы, которые использовались за последние 30 дней.
Всем привет!
Docker выпустил небольшую книжечку "Docker for the Virtualization Admin", поэтому я решил ее быстренько пролистать и поделиться своим мнением, что там интересного.
И вот что я для себя выделил.
Когда начинаешь работать с докером, контейнеры описываются как "легкие виртуальные машины” и это понятно, потому как 2 технологии(docker and VMs) используют похожие характеристики.
2 главных критерия сходства:
Каждый из них предназначен для обеспечения изолированной среды, в которой выполняется некоторое приложение.
Каждая среда представлена в виде двоичного артефакта (binary artifact), и может быть легко перемещена между хостами.
Ключевое различие заключается в архитектуре! Контейнеры и виртуальные машины имеют похожие преимущества изоляции и распределения ресурсов, но функционируют по-разному: контейнеры виртуализируют операционную систему вместо аппаратных ресурсов. Эта облегченная форма показывает эффект создания контейнеров как более портативных, так и более эффективных, чем виртуальные машины. Другая форма сравнения, виртуалка - огромный приусадебный дом, а контейнер - небольшая квартира. Примерно, все тоже самое, но в совсем в других размерах и абстракциях.
Администратор создает образ Docker, который включает в себя только необходимое для запуска своего приложения. Виртуальная машина собирается в обратном направлении: начиная с полной операционной системы и, в зависимости от приложения, добавляются нужные компоненты.
Виртуальная машина по-прежнему рассматривается как сервер, включая традиционное резервное копирование, аварийное восстановления, и другие серверные задачи.
С контейнерами Docker - это движение в сторону микросервисов, единственная служба, которая и является приложением. В архитектуре микросервисов существует множество небольших служб, каждый представлен как одиночный контейнер Docker, содержит
только свое приложение. Большие и тяжелые приложения теперь могут быть деконструированы на небольшие компоненты(контейнеры).
Как забэкапить контейнер?
А никак! Данные приложения не живут в контейнере, они живут в томе(docker volume), который совместно используется между одним или несколькими контейнерами, как определено архитектурой приложения. Тома поддерживают различные виды бэкапирования, включая облачное, поэтому администратор создает резервную копию тома данных, и забывает о контейнере.
Как управлять обновлениями?
Администратор обновляет существующий образ(image) Docker, останавливает выполнение
контейнера, и запускает заново. Контейнер можно запустить за доли секунды, поэтому эти обновления выполняются намного быстрее, чем на виртуальной машине. Нет необходимости перезагружать всю ОС-просто остановите старую версию вашего контейнера и запустите снова из нового образа.
И самый главный вопрос - где лучше запускать контейнеры на виртуальных серверах или на физических?
Эксперты докера отвечают "все зависит от ...". А далее от того чем вы располагаете, то к чему стремитесь, что хотите получить в итоге. Любое ИТ-решение основано на множестве переменных: производительности, масштабируемости, надежности, безопасности и др.
Docker предоставляет вам возможность развернуть приложения без проблем, независимо от базовой инфраструктуры, будь то железный сервер или виртуальная машина, центр обработки данных или публичное облако. Основное тут ,что вы можете в дальнейшем перенести ваше приложение на другую платформу.
Задержка (Latency). Приложения с низким порогом задержки лучше разворачивать на физических серверах. Как пример, торговые приложения(площадки).
Доступное пространство(Capacity). Если ваши контейнерные приложения не потребляют всю емкость на физическом сервере, виртуализация предлагает преимущество преимущество. Например, можно назначить данное пространство для песочницы для разработчиков.
Смешанные Операционные Системы(Mixed Operating Systems). Если вам потребуются контейнеры разных ОС, Windows и Linux на одном хосте, вам нужно будет
использовать виртуализацию.
Мультиарендность(Multitenancy). Некоторые приложения испытывают рабочие нагрузки, которые не могут совместно использовать ядра или ресурсы. В этом случае виртуальные машины предоставляют дополнительный слой изоляции по сравнению с контейнерами на физическом сервере.
Пулы Ресурсов / Квоты(Resource Pools /Quotas). Многие решения для виртуализации имеют широкий спектр функций управления и приоритизации использования общих ресурсов виртуальными машинами. Docker предоставляет концепцию ограничений ресурсов для
контейнера, но если вы обеспокоены что эти разрешения будут проигнорированы, виртуальные машины могут добавить еще один пограничный слой
Всем, привет!
Продолжаю работать над вопросами. Решил вынести в отдельный пост команды, которыми пользую каждый день.
Весь список тут
1. Что выполняет команда ```tee```?
Команда tee считывает стандартный ввод (stdin), после чего записывает его в стандартный вывод (stdout) и одновременно копирует его в подготовленный файл или переменную. Например:
df -h | tee file.txt
2. Что выполняет команда ```awk```?
Команда awk используется для выполнения различных практических задач по обработке текста и извлечения данных
3. Что выполняет команда ```tr```?
Команда tr используется для замены, замещения или удаления символов из стандартного ввода(STDIN), отправляя результат на стандартный вывод(STDOUT). Например, заменим все двоеточия: head -3 /etc/group | tr ':' ' '
4. Что выполняет команда ```cut```?
Команда cut позволяет вырезать данные из текстового файла.
5. Что выполняет команда ```tac```?
Команда cat имеет ряд утилит для создания, копирования, слияния и отображения текстовых файлов. tac делает то же самое, но в обратном порядке.
6. Что выполняет команда ```curl```?
Curl - набор библиотек, в которых реализуются базовые возможности работы с URL страницами и передачи файлов. Библиотека поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP.
7. Что выполняет команда ```wget```?
Wget используется для скачивания файлов или целых страниц из сети.
8. Что выполняет команда ```watch```?
Watch используется для отслеживания изменений в выводе(работе) команнд. Например: watch -d date
9. Что выполняет команда ```head```?
head используется для просмотра нескольких начальных строк файла.
10. Что выполняет команда ```tail```?
tail используется для просмотра нескольких конечных строк файла.
11. Что выполняет команда ```less```?
less используется для пролистывания текста.
12. Что выполняет команда ```cat```?
Команда cat имеет ряд утилит для создания, копирования, слияния и отображения текстовых файлов.
13. Что выполняет команда ```touch```?
touch используется для изменения временных меток файлов, однако одно из наиболее распространенных способов использования команды Touch включает в себя создание нового пустого файла.
14. Что выполняет команда ```sar```?
sar используется для мониторинга системы(сбор информации об активности системы), входит в пакет sysstat
15. Что выполняет команда ```netstat```?
netstat - утилита командной строки выводящая на дисплей состояние TCP-соединений (как входящих, так и исходящих), таблицы маршрутизации, число сетевых интерфейсов и сетевую статистику по протоколам.
16. Что выполняет команда ```tcpdump```?
tcpdump - главный инструмент сетевого анализа.
17. Что выполняет команда ```lsof```?
lsof - утилита, которая предназначена для вывода информации о том, какие файлы используются теми или иными процессами.
18. Что выполняет команда ```cpio```?
cpio - простой инструмент, который может использоваться для помещения информации в архив формата cpio или tar.
find ./* | cpio -o > tree.cpio
Извлечение. Флаг -i указывает cpio считать архив для извлечения файлов, а флаг -d говорит cpio создать при необходимости соответствующие каталоги. cpio -id < cpiofile
19. Что выполняет команда ```ps```?
ps (process state — состояние процессов) — это родная утилита Unix/Linux для просмотра информации о работе запущенных процессов в системе: она считывает эту информацию из виртуальных файлов в файловой системе /proc.
20. Что выполняет команда ```nohup```?
Команда nohup — это команда POSIX, используемая для игнорирования сигнала HUP. Сигнал HUP — это способ, которым терминал предупреждает зависимые процессы о выходе из системы.
Всем, привет!
Продолжаю список интересных вопросов, которые задают на собеседовании админам или девопсам.
В этот раз рассматриваем вопросы, связанные с вебом и сетью.
Весь список тут
Какую функцию выполняет DNS в сети?
DNS — система для получения информации о доменах. Чаще всего используется для получения IP-адреса по имени хоста, получения информации о маршрутизации почты.
Какие записи ДНС вы знаете, для чего они используются?
Записи DNS, или ресурсные записи (resource records), — единицы хранения и передачи информации в DNS. Запись A (address record) или запись адреса связывает имя хоста с адресом протокола IPv4 Запись AAAA (IPv6 address record) связывает имя хоста с адресом протокола IPv6. Запись CNAME (canonical name record) или каноническая запись имени (псевдоним) используется для перенаправления на другое имя. Запись MX (mail exchange) или почтовый обменник указывает сервер(ы) обмена почтой для данного домена. Запись NS (name server) указывает на DNS-сервер для данного домена. Запись PTR (pointer[5][6]) обратная DNS-запись или запись указателя связывает IP-адрес хоста с его каноническим именем.
Что такое HTTP?
HTTP — протокол прикладного уровня передачи данных в виде гипертекстовых документов в формате «HTML», в настоящий момент используется для передачи произвольных данных.
Что такое HTTP-proxy и как он работает?
Сервер-посредник — промежуточный сервер в компьютерных сетях, выполняющий роль посредника между пользователем и целевым сервером, позволяющий клиентам как выполнять косвенные запросы (принимая и передавая их через прокси-сервер) к другим сетевым службам, так и получать ответы.
Клиент подключается к прокси-серверу и запрашивает какой-либо ресурс, расположенный на другом сервере. Затем прокси-сервер либо подключается к указанному серверу и получает ресурс у него, либо возвращает ресурс из собственного кэша (в случаях, если прокси имеет свой кэш).
Кратко опишите как работает HTTPS.
HTTPS - это обычный HTTP, работающий через шифрованные транспортные механизмы SSL и TLS
В TLS используется как асимметричная схема шифрования (для выработки общего секретного ключа), так и симметричная (для обмена данными, зашифрованными общим ключом). Сертификат открытого ключа подтверждает принадлежность данного открытого ключа владельцу сайта. Сертификат открытого ключа и сам открытый ключ посылаются клиенту при установлении соединения; закрытый ключ используется для расшифровки сообщений от клиента.[5]
Что означает директива upstream в настройках nginx'a?
Данная директива включает балансировку нагрузки. По умолчанию, соединения распределяются по серверам циклически (в режиме round-robin) с учётом весов серверов.
Кратко опишите действия по созданию и установке ssl-сертифката для сайта https://foo.example.com
1. Купить сертификат у проверенного центра авторизации или сгенерировать само подписанный
2. В настройках вашего сервера включить поддержку ssl и указать путь к сертификату.
Можно ли использовать несколько SSL-хостов на одном айпи-адресе?
Да, с помощью веб-сервера это можно сделать
Что такое wildcard сертификат?
Wildcard-сертификат — сертификат открытого ключа, который может использоваться с несколькими поддоменами.
Например, один сертификат для *.example.com обеспечит домены payment.example.com, contact.example.com, login-secure.example.com
Всем привет!
В этой статье рассмотрим настройку мониторинга на zabbix'e: подключим шаблон мониторинга, включим мониторинга порта и системных компонентов. В качестве подопытного возьмем сервер Apache.
Что имеем в самом начале - это установленный сервер Zabbix'a на CentOs'e.
Для начала посмотрим, что предлагает использовать сам Zabbix для мониторинга веб-сервера Apache. Вариантов много, остановимся на решении без подключения внешних скриптов (Template App Apache2 for Zabbix 4.0 that works without any external scripts). Из этого решения нам нужен файл xml, загружаем. При импорте у меня он не захотел импортироваться сразу, поэтому пришлось скопировать содержимое, а сам файлик создать отдельно. Проверяем, что модуль status_module в апаче установлен, если нет - устанавливаем. httpd -M 2>/dev/null | grep status_module
В конфиг апача вносим такие настройки: <Location /server-status> SetHandler server-status Order deny,allow </Location> ExtendedStatus On Перегружаем апач. На странице Templates создаем новый шаблон изxml-файла. На странице Configuration-Hosts создаем новый хост: указываем имя и группу(рекомендую создать отдельную групу для ваших серверов, а не использовать группу по умолчанию).
В настройках агента(/etc/zabbix/zabbix_agentd.conf) этого нового хоста, не забудьте добавить разрешения для основного сервера, с которого осуществляется мониторинг, у меня это 10.30.1.41 Server=127.0.0.1, 10.30.1.41
Далее - прицепляем импортированный шаблон "Template App Apache2 Zabbix agent".
Переходим на вкладку Applications, там должно появиться ваше первое приложения для апача. Добавим еще одно, назовем его Open ports, внутри этого приложения кликаем на Add item - добавим новое условие мониторинга. Указываем название и приложение. В настройках нас интересует ключ net.tcp.service[http,10.30.1.41,80] (служба http, айпи-адрес и порт).
Сохраняем. Ждем пару минут, переходим на вкладку Monitoring-Latest data
Итак, для текущего примера получаем минимальный пакет для мониторинга веб-сервера и работающего порта. В дашборд выведу пару графиков, выглядят они, конечно, приятно, но по большому счету это просто красота:)
Всем привет!
Сегодня устанавливаем Zabbix в оффлайн режиме. Как обычно в оф. документации все просто, проверим - так ли это. Для данной задачи используется сервер с CentOs'ом, который имеет доступ в интернет, чтобы можно было скачать нужные пакеты, и второй сервер без доступа к интернету. На этот сервер и будем устанавливать заббикс.
Для начала берем все нужное(загружаем в папку tmp): yum install --downloadonly --downloaddir=/tmp / zabbix40-server-mysql / zabbix40-web-mysql / zabbix40-agent / yum install createrepo -y --downloadonly --downloaddir=/tmp
Возможно, что еще понадобятся и эти зависимости: deltarpm, python-deltarpm
С помощью createrepo сделаем репозитарий из локальной нашей папки с загруженными пакетами:
createrepo /custom_repo/
Перенесем туда все пакеты, далее переподключаем репозиторий. yum clear all yum repolist
Загрузили, перенесли все пакеты на второй сервер.
Приступаем к установке и сразу же получаем ошибку: Error: Package: zabbix40-server-mysql-4.0.12-1.el7.x86_64 (LocalRepo) Requires: libcrypto.so.10(OPENSSL_1.0.2)(64bit)
Версия openssl требует обновления.
Бежим качаем 2 пакета(на текущий момент такая версия): openssl-1.0.2k-19.el7.x86_64.rpm openssl-libs-1.0.2k-19.el7.x86_64.rpm
Далее удаляем старый openssl, обновляемopenssl-libs(зависимости) и устанавливаем новую версию openssl. Продолжаем установку: yum install zabbix40-server-4.0.12-1.el7.noarch.rpm
Далее все гут, едем дальше. yum install zabbix40-web-4.0.12-1.el7.noarch.rpm
Получаю ошибку: Error: Package: php-5.4.16-46.el7.x86_64 (LocalRepo) Requires: httpd-mmn = 20120211x8664
Если вы получаете ошибки такого рода: #systemctl status mysql ● mysql.service Loaded: not-found (Reason: No such file or directory) Active: inactive (dead) # mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
Значит у вас не запущен сервер СУБД - проверьте тот ли пакет вы установили и запустите службу.
systemctl start mariadb.service
Создаем БД и импортируем скрипты для работы(строго по порядку): shell> mysql -uroot -p<пароль> mysql> create database zabbix character set utf8 collate utf8_bin; mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '<пароль>'; mysql> quit;
shell> cd database/mysql shell> mysql -uzabbix -p<пароль> zabbix < schema.sql shell> mysql -uzabbix -p<пароль> zabbix < images.sql shell> mysql -uzabbix -p<пароль> zabbix < data.sql
В конфиге сервера /etc/zabbix/zabbix_server.conf указываем настройки сервера: DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=zabbix_pass
Запускаем сервер systemctl start zabbix-server
Не забываем включить его в автозапуск systemctl enable zabbix-serverЕсли у вас на этом же сервере стоит и агент, то включаем его:
systemctl enable zabbix-agent.service
Вносим изменения в настройки httpd и php. Например, date.timezone = Europe/Moscowр, у меня конфиги из папки http не считывались и возникла ошибка: Time zone for PHP is not set (configuration parameter "date.timezone").
Поэтому пришлось поправить этот параметр в /etc/php.ini date.timezone = Europe/Moscow
Запускаем httpd и браузером заходим на адрес сервера http://ip-servera/zabbix
Заполняем все поля, указывваем параметры подклюбчения, имя сервера и другие настройки.
Установка на этом завершена. Логин-пароль по умолчанию Admin/zabbix.
Всем привет!
Продолжаем контейнеризировать все по-тихонечку. На этот раз переведем сайт на использование вордпресс. Сам официальный туториал не вызывает особого интереса - как мне показалось, там довольно все просто. И когда друг ко мне обратился за помощью, я подумал, что там будет все быстро сделано. Но, есть всегда свои но! Вперед:)
Первое, взглянем на оф. документ по инсталяции. Все просто! Нам понадобится docker-compose, если у вас еще не установлен, устанавливаем.
Второе, создаем директорию, где будем размещать все нужные нам файлы. Для начала хочу заметить, что по оф. доку у меня не получилось так быстро все сделать, т.к. WP не захотел работать без php-fpm, поэтому я сразу решал эту проблему. Далее показываю уже работающий конфиг, а ошибку укажу внизу поста.
Создаем docker-compose.yml version: '3.1' services:
Далее создаем контейнеры для WP, вашей базы данных - на выбор или Myslq или MariaDb, для Nginx и для PHP.
Контейнер WP, зависит от контейнера с базой данных: wordpress: image: wordpress restart: always ports: - 8080:80 depends_on: - db environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: maindb volumes: - ./html:/var/www/html
Контейнер с базой данных: db: image: mysql:5.7 restart: always environment: MYSQL_DATABASE: maindb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - ./database:/var/lib/mysql - ./my.cnf:/etc/my.cnf
Я добавил файл с некоторыми настройками для MySql. Т.к. у меня на сервере мало оперативной памяти, то я сократил размер буфера. если этого не сделать, то демон mysqld будет ругаться и не стартанет. Содержимое my.cnf: [mysqld] innodb_buffer_pool_size = 16M
Контейнер с веб-сервером: nginx: image: nginx3 ports: - 443:443 volumes: - ./nginx:/etc/nginx/ - ./logs/nginx:/var/log/nginx - ./html:/var/www/html links: - wordpress - php restart: always
Я настроил nginx, чтобы он работал только по 443 порту и выложил все конфиги в директории ./nginx, аналогично для логов. Конфиг для Nginx'a: server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; root /var/www/html;
Тут интерес вызывают только самоподписанные сертификаты и настройки php. Для тестов директория /test перекидывает на сайт яндекса.
Последний контейнер для PHP. php: build: ./php/ volumes: - ./html:/var/www/html
Для подключения к WP требуется библиотека mysqli, которая не установлена по умолчанию, поэтому собираем из докерфайла образ. Я образ собираю по докер-файлу, вот содержимое: FROM php:7-fpm RUN docker-php-ext-install mysqli
Далее добавляем: volumes: wordpress: db:
networks: local:
Запустил все с помощью: docker-compose up -d
Проверяю логи контейнеров: docker logs IDContainer
На этом настройка Docker'a закончена и далее уже можно переходить к настройкам самого WP. Теперь расскажу на какие грабли я наступил. Ошибки в студию:)
База показывает ошибку: 1) docker wordpress MySQL Connection Error: (2002) Connection refused 2) PHP Warning: mysqli::__construct(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in Standard input code on line 22
Браузер показывает ошибку: 3) Error establishing a database connection
Неверный формат файла конфига для базы 4) [ERROR] Found option without preceding group in config file /etc/my.cnf at line 1!
Всем, привет!
Продолжаю список интересных вопросов, которые задают на собеседовании Linux админам.
В этот раз рассмотрим вопросы среднего уровня(middle)
Весь список тут
Вопросы среднего уровня:
20. Что обозначает ```&``` после команды?
Амперсанд переводит выполнение команды терминала в фоновый режим(background).
21. Что обозначает ```& disown``` после команды?
& disown переводит выполнение команды в фоновый реджим и "отвязывает" терминал от выполняемого процесса(disown удаляет задачу из списка задач оболочки).
22. Что такое фильтр пакетов (packet filter) и как он работает?
Фильтр пакетов - программа, которая просматривает заголовки пакетов по мере их поступления, и определяет дальнейшую судьбу всего пакета. Фильтр может сбросить (DROP) пакет или принять (ACCEPT) пакет или сделать с ним что-то еще более сложное.
23. Что такое виртуальная память(Virtual Memory)?
Виртуальная память – это адресное пространство процесса. Процесс работает не с физической памятью напрямую, а с виртуальной.
24.Что такое swap и для чего используется?
SWAP (своп) — это механизм виртуальной памяти, при котором часть данных из оперативной памяти (ОЗУ) перемещается на хранение на жёсткий диск. В ОС Linux оперативная память делится на разделы, называемые страницами (pages). Swapping (”подкачка”) – это процесс во время которого страницы памяти копируются на специально сконфигурированный для этого раздел диска, называемый swap space (раздел подкачки, может быть как и файлом, так и разделом жесткого диска), для освобождения ОЗУ.
Что такое "sticky bit"?
Сегодня sticky bit используется в основном для каталогов, чтобы защитить в них файлы. Из такого каталога пользователь может удалить только те файлы, владельцем которых он является. Примером может служить каталог /tmp, в который запись открыта для всех пользователей, но нежелательно удаление чужих файлов.
Для чего предназначен бит неизменяемости(immutable bit)?
Бит (bit) неизменяемости (immutable) может быть назначен файлу, который размещён в расширенной файловой системе (Ext3, Ext4), для его защиты от изменений. "immutable bit" может быть добавлен к атрибутам файла с помощью программы chattr и только супер-пользователем.
Что такое жесткая ссылка, символическая? Чем отличаются? Что произойдет если удалить источник, на который указывает ссылка?
Символическая ссылка(ярлык) - содержит адрес нужного файла в вашей файловой системе. Когда вы пытаетесь открыть такую ссылку, то открывается целевой файл или папка. При удалении источника ссылка указывает в никуда
Жесткая ссылка непосредственно указывает на местоположение файла на жестком диске. Файл можно перемещать между каталогами, и все ссылки останутся рабочими, поскольку для них неважно имя.
Что такое айнод(inode) и какие поля в нем хранятся?
Inode (индексный дескриптор) — структура данных в традиционных для ОС UNIX файловых системах(например, ext4). В этой структуре хранится метаинформация:названии, разрешениях, устройстве размещения, времени последнего доступа и тд.
Посмотреть можно командами: ls -i && stat filename
Что такое SNMP и для чего он используется?
Стандарт SNMP (Simple Network Managment Protocol) был специально разработан для диагностики, управления и мониторинга любых устройств и программных компонентов, доступных по сетевым интерфейсам.
Как уменьшить размер файла, который используется в текущий момент(например, файла лога)?
Используя команду truncate
Например, полностью очистить: truncate -s 0 file
Что такое переадресация SSH-порта?
Переадресация порта SSH создает безопасное соединение между удаленным компьютером, через который можно ретранслировать сервисы, и локальным компьютером, который выдает команды. Это также называется SSH-туннелированием и используется для передачи информации, которая не требует зашифрованного протокола.
Как добавить пользователя без использования команд useradd/adduser?
Добавить запись в /etc/passwd
Добавить запись группы в /etc/group
Создать домашнюю директорию для пользователя
Установить пароль
Опишите команду mknod и расскажите когда вы её используете?
Команда mknod используется для создания файлов устройств. Файлы устройств хранятся в каталоге /dev, и в отличие от обычных файлов, эти файлы устройств — те, о которых ядро знает, и которые читает или записывает в них.
Загрузка диского пространства 100%, вы удалили огромный файл логов, но df показывает - нет свободного места. В чем проблема?
Какой-то процесс держит файл. С помощь lsof some.log определяем какие процессы не отпустили файл, завершаем их и файл удаляется.
Вы получаете ошибку "filesystem is full", хотя 'df' говорит об обратном, место есть. В чем проблема?
Проверьте досутность inode, df -i. Возможно закончились айноды.
Расскажите как работает команда 'ps'.
Команда ps работает путем чтения файлов в файловой системе proc. Каталог / proc / PID содержит различные файлы, содержащие информацию о PID'е процесса. Содержимое этих файлов генерируется ядром на лету, когда процесс их считывает.
Что происходит с дочерним процессом, который завершил свое выполнение, но у которого нет родительского процесса ожидающего его завершение? Почему это плохо?
Процесс при завершении освобождает все свои ресурсы и становится «зомби» — пустой записью в таблице процессов, хранящей код завершения для родительского процесса. Система уведомляет родительский процесс о завершении дочернего с помощью сигнала SIGCHLD. Предполагается, что после получения SIGCHLD он считает код возврата с помощью системного вызова wait(), после чего запись зомби будет удалена из списка процессов. Если родительский процесс игнорирует SIGCHLD, то зомби остаются до завершения родительского процесса.
Кратко опишите каждое состояние процесса(process states) в ОС Linux.
Running состояние, в котором процесс либо запущен, либо готов к запуску. Interruptible является заблокированным состоянием процесса, который ожидает события или сигнала от другого процесса Uninterruptible. Процесс вынужден остановиться при определенном условии, т.к оборудование находится в состоянии ожидания и сигнал не может быть обработан. Stopped возникает, когда процесс завершен. Этот процесс можно перезапустить. Zombie в этом состоянии процесс будет завершен, и информация по-прежнему будет доступна в таблице процессов.
Вы запускаете скрипт и хотите посмотреть вывод в терминале и сохранить в файл, как это можно сделать?
Можно воспользоваться утилитой tee ./script | tee somefile.log
Объясните, что выполнит данная команда echo "1" > /proc/sys/net/ipv4/ip_forward
Команда включает IP Forwarding
Какие типы файлов вы знаете в ОС Linux?
- : обычный файл
d : директория
c : символьное устройство, используется для взаимодействия с периферическими устройствами
b : блочное устройство, используется для взаимодействия с периферическими устройствами:диски, память
s : сокет, используется для взаимодействия между процесами
p : пайп, похож на сокет, используется для взаимодействия 2-х локальных процессов
l : ссылка
В чем разница между процессом и потоком?
Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Поток использует то же самое пространства стека, что и процесс, а множество потоков совместно используют данные своих состояний. Как правило, каждый поток может работать (читать и писать) с одной и той же областью памяти, в отличие от процессов, которые не могут просто так получить доступ к памяти другого процесса. У каждого потока есть собственные регистры и собственный стек, но другие потоки могут их использовать. Поток — определенный способ выполнения процесса. Когда один поток изменяет ресурс процесса, это изменение сразу же становится видно другим потокам этого процесса.
Всем, привет!
Продолжаю список интересных вопросов, которые задают на собеседовании Linux админам.
На этот раз очередь курьезных вопросов или веселых.
Так что будьте готовы к вопросу "чем отличается крокодил от холодильника" :)
Весь список тут
Веселые вопросы:
1. Админ случайно выполнил команду: ```chmod 444 /bin/chmod ```. Как починить?
Запустить загрузчик напрямую /lib/ld-linux.so /bin/chmod +x /bin/chmod
Восстановить разрешения с помощью busybox: busybox chmod +x /bin/chmod
Другие варианты: скопировать с другой системы; написать скрипт, который меняет разрешения.
2. Вы забыли(потеряли) пароль рута, что делать?
Восстановить пароль рута можно с помощью Grub или LiveCD.
3. Вы перезапустили удаленно сервер, но через 10 минут вы по-прежнему не можете к нему подключиться по SSH. В чем может быть проблема?
Нет проблемы с демоном SSH, проблема с командой reboot
Не выполняйте команду reboot now, выполняйте reboot или shutdown -r now для перезагрузки.
Человеческий фактор: изменен порт SSH, файервол заблокировал порт и т.д.
4. Вы застряли на необитаемом острове, какие 5 утилит командной строки вы бы выбрали?
Вряд ли они вам понадобятся на необитаемом острове:) Make help
5. Вы случайно удалили файл с запущенным скриптом, возможно ли его можно восстановить?
Пока скрипт запущен, файл восстановить можно с помощью procfs
Определите PID процесса, в директории /proc/$PID/fd будут находиться все дескрипторы, открытые этим процессом.
Далее просто копируете нужный: cp /proc/1234/fd/4 testing.txt.bk
6. Что приозойдет 19 Января 2038?
На 32-х битных ОС, в которых используется представление времени по стандарту POSIX (UNIX-время), произойдет переход времени в 1970. Чтобы этого не произошло нужно использовать 64-ую битную версию ОС.
7. Как перегрузить сервер, если команда reboot не отвечает?
Использовать команду shutdown
8. Чем отличается rest от json'a?
Это как раз про крокодила;)
Rest - архитектурный стиль взаимодействия компонентов распределённого приложения в сети.
SOAP - простой протокол доступа к объектам. Сейчас протокол используется для обмена произвольными сообщениями в формате XML.
REST поддерживает различные форматы: text, JSON, XML; SOAP - только XML
Коллеги, расскажите о вопросах, которые вам показались курьезными на собеседовании! :)
Успехов!
12. Какой командой можно изменить владельца файла? Установить разрешения на файл?
chown; chmod
13. Что выполнит данная команда ```chmod +x FILENAME```?
Добавит разрешение на запуск файла
14. Что означают разрешение 0750 для файла? Отличается от разрешений для директории?
Владелец имеет полные права доступа, группы - чтение и запись, остальные пользователи - не имеют доступа.
Не отличается
15. Как добавить нового юзера без разрешения на логин(login permissions)?
useradd -r newuser --shell=/sbin/nologin
16. Как добавить/удалить пользователя из группы?
usermod -aG somegroup user deluser user group
17. Что выполнит данная команда CTRL-c?
Отправит сигнал SIGINT, который завершит процесс
18. Что находится в файле /etc/services?
Файл описывает соответствие службы и порта
19. Как перенаправить стандартный вывод STDOUT и стандартный вывод ошибок STDERR? (> /dev/null 2>&1)
Направить стандартный поток вывода и стандартный поток ошибок в файл: some_command > file.log 2>&1
Направить стандартный поток ошибок в файл: some_command > file.log 2> file.err
20. Какая разница между подключением по Telnet и SSH?
ssh использует шифрование
21. Какими командами можно посмотреть среднюю загрузку системы? Объясните 3 основных значения загрузки системы(load average)?
w; top; uptime; загрузка за минуту, загрузка за 5 минут, за 15 минут.
22. Назовите опции в нижнем регистре для команды ```ls```, которые не являются рабочими.
х; у.
23. Что такое модуль ядра Linux'a?
loadable kernel module, LKM — объект, содержащий код, который расширяет функциональность запущенного (базового) ядра ОС.
24. Что такое протокол ICMP? Для чего используется?
протокол межсетевых управляющих сообщений. Используется для передачи сообщений об ошибках и других исключительных ситуациях, возникших при передаче данных, например, запрашиваемая услуга недоступна, или хост, или маршрутизатор не отвечают.
25. Что такое уровень запуска и как посмотреть текущий?
Нумерованный режим функционирования операционной системы, определяет какие функции будут загружены в ОС. Чем выше уровень - тем больше функций. runlevel
26. Как проверить является ли машина виртуальной?
С помощью команды /proc/cpuinfo, Linux добавляет в ответ флаг hypervisor
С помощью команды virt-what
С помощью команды hostnamectl
27. Как принудительно заставить систему выполнить проверку файловой системы при следующем запуске?
Для этого нужно создать файл forcefsck в корневом разделе: touch /forcefsck
28. Какой процесс идет с пидом 1?
Самый первый процесс при запуске системы получает пид 1(PID 1), так называемый инит(init)
Если этот процесс завершается по какой-либо причине, все остальные процессы тоже завершаются
Если завершается процесс, у которогое есть потомки, все потомки переходят(reparented) под процесс с пидом 1
Создадим и запустим простой контейнер на основе Nginx # docker run --name mynginx1 -P -d nginx -P (Publish all exposed ports to random ports) сопоставляем порты Nginx(80,443) с произвольным портом из диапазона между 49153 и 65535. -d (Run container in background and print container ID) запускаем контейнер в бэкграунде.
Стандартного образа в системе нет, поэтому он был скачан с хаба.
проверяем, что нгинкс работает(номер порта - 52267) #curl http://localhost:52267
Если вы хотите настроить образ под себя, то нужно модифицировать докерфайл.
Например, сопируем файлы и папки nginx'a.
Файлы, в том числе и сертификаты, кладем в текущую директорию. Из стандартного образа nginx строим шаблон, открываем порт 443.
FROM nginx
COPY ./html /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
COPY nginx-selfsigned.crt /etc/ssl/certs/nginx-selfsigned.crt
COPY nginx-selfsigned.key /etc/ssl/certs/nginx-selfsigned.key
EXPOSE 443
Генерируем шаблон #docker build -t nginx1 .
Запускаем на 443 порту этот шаблон #docker run -p 443:443 -d nginx1
По умолчанию докер присвоит некоторое имя для вашего контейнера, но вы можете сделать это самостоятельно. Удобнее работать с именованным контейнером. #docker run -d -P --name nginxserver nginx1:latest
Если вы хотите добавить некоторые директории в ваш конфиг(не копировать, а смонтировать), то нужно запускать докер таким образом: docker run --name nginx_server -v /yourfiles/html:/var/www/html:ro \ -v /yourfiles/nginx:/etc/nginx:ro -p 443:443 -d nginx3
\ - используется как перевод каретки(читай объединение строк)
ro - монтируются в контейнер в режиме только чтение
Docker предоставляет возможность упаковывать и запускать приложение в изолированной среде, называемой контейнером. Изоляция и безопасность позволяют запускать много контейнеров одновременно на одной машине(хосте). Контейнеры являются легкими, потому что не используют гипервизор, но только ресурсы хоста. Docker может быть запущен и на виртуальных машинах, главное чтобы хватило ресурсов!
Docker Engine-это клиент-серверное приложение, состоящее их 3-х основных компонентов:
Сервер, который является типом длительной программы, или проще говоря демон (dockerd). Демон прослушивает запросы API Docker и управляет объектами Docker, такими как изображения, контейнеры, сети и тома.
REST API, определяет интерфейсы, которые программы могут использовать для общения с демоном и инструктировать его, что делать.
Клиент интерфейса командной строки (CLI) (команда docker). Клиент отправляет команды в dockerd, который их выполняет(например, docker run).
Посмотрим на архитектуру докера:
Dockerfile используется как шаблон(набор инструкций), по которому можно сделать образ(docker image). Обратите внимание, что файл создается без разрешения! Каждая инструкция в этом файле создает отдельный слой в образе. При изменении Dockerfile и перестроении изображения перестраиваются только те слои, которые были изменены. Поэтому образы такие легкие и небольшого размера, плюс довольно быстрые, по сравнению с другими технологиями виртуализации.
Например, самый простой dockerfile будет выглядеть так, слой за слоеем: FROM centos:7 RUN yum update -y CMD ["bash]
Создаем образ из этого файла: #docker build -t image_from .
-f если файл находится вне текущей директории.
LABEL — описывает метаданные. Например — сведения о том, кто создал и поддерживает образ.
ENV — устанавливает постоянные переменные среды.
RUN — выполняет команду и создаёт слой образа. Используется для установки в контейнер пакетов.
COPY — копирует в контейнер файлы и папки.
ADD — копирует файлы и папки в контейнер, может распаковывать локальные .tar-файлы.
CMD — описывает команду с аргументами, которую нужно
выполнить когда контейнер будет запущен. Аргументы могут быть
переопределены при запуске контейнера. В файле может присутствовать лишь
одна инструкция CMD.
WORKDIR — задаёт рабочую директорию для следующей инструкции.
ARG — задаёт переменные для передачи Docker во время сборки образа.
ENTRYPOINT — предоставляет команду с аргументами для вызова во время выполнения контейнера. Аргументы не переопределяются.
EXPOSE — указывает на необходимость открыть порт.
VOLUME — создаёт точку монтирования для работы с постоянным хранилищем.
Docker Image
С помощью docker файла мы сделали новый образ(read only!), который является шаблоном с инструкциями для создания контейнера. Как видно из примера, получившийся шаблон(docker-image) основан на другом шаблоне centos, но с дополнениями(yum update). Как вариант, вы можете создать свой шаблон, который устанавливает ваше приложение с вашими настройками и конфигами. Также есть возможность опубликовать собственные разработки на docker-hub'e, откуда они будут доступны другим участникам.
Containers(контейнер) - это выполняемый экземпляр образа(самодостаточная ОС, в которой только самое необходимое и код приложения). Вы можете создать, запустить, остановить, переместить или удалить контейнер с помощью Docker API или CLI. Вы можете подключить контейнер к одной или нескольким сетям, присоединить к нему хранилище или даже создать новый образ на основе его текущего состояния.
По умолчанию контейнер изолирован от других контейнеров и от хоста, на котором он запущен. При удалении контейнера все изменения, которые вы сделали за время его работы, если они не хранятся в в постоянном хранилище, потеряются.
Services (сервисы) - позволяют масштабировать контейнеры между несколькими демонами Docker, которые работают вместе в кластере(swarm)с несколькими менеджерами и работниками(manager and workers). Каждый член кластера является демоном Docker, и все демоны взаимодействуют с помощью API Docker.
Служба позволяет определить желаемое состояние, например количество реплик службы, которые должны быть доступны в любой момент времени. По умолчанию служба балансирует нагрузку на всех рабочих узлах кластера.
Допустим, у нас есть сервер с которого мы хотим получать "правильное"(читай, настоящее)
время для нашего сервера centos внутри локальной сети. Для этого воспользуемся демоном Chrony.
Проверяем установлен ли chrony(в противном случае - yum install chrony)
#systemctl status chronyd
Включаем: #systemctl enable chronyd
Редактируем конфигурационный файл: vi /etc/chrony.conf
Добавляем локальные NTP сервера: server 10.30.17.234 server 10.30.17.235
Докер(Docker) - открытая (open) платформа для разработчиков и админов, помогающая проектировать и запускать "контейнеризированные" приложения, главный плюс которого - упаковать приложение со всеми зависимостями в отдельный контейнер(можно даже опубликовать в хабе). Контейнеры не создают такой нагрузки как виртуальные машины, поэтому более эффективно используют ресурсы системы. "Из википедии: программное обеспечение для автоматизации развёртывания и управления
приложениями в среде виртуализации на уровне операционной системы;
позволяет «упаковать» приложение со всем его окружением и зависимостями в
контейнер, а также предоставляет среду по управлению контейнерами".
Установка Docker'a на CentOS.
1. Для начала нужно удалить старые версии, если они существуют:
#sudo yum remove docker
2. Далее устанавливаем необходимые утилиты и добавляем репозиторий с докером
Установщик предлагает принять PGP-key, проверяем, что ключ совпадает с указанным на сайте:
060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
Принимаем.
4. Запускаем Докер
#systemctl start docker
5. Установка завершена, можно запустить первое приложение.
#docker run hello-world
6. Не забудьте добавить пользователю docker права рута, а то будет неудобно запускать команды используя sudo. И да, я делал все под рутом, что не очень правильно:)
Уровень выполнение (запуска). Уровни выполнения определяют, какие задачи могут выполняться в текущем состоянии (или на текущем уровне выполнения) операционной системы Linux.
0 - Завершение работы компьютера.
1 - Однопользовательский режим (обычно имеет псевдоним s или S)
2 - Многопользовательский режим без поддержки сети.
3 - Многопользовательский режим с поддержкой сети.
5 - Многопользовательский режим с поддержкой сети и графической оболочки X Window.
6 - Перезагрузка компьютера.
Посмотреть уровень запуска системы можно командами: #who -r #runlevel
Виды потоков
STDIN (0) Стандартный входной поток. Канал, принимающий данные для обработки и последующей передачи на канал STDOUT и/или STDERR.
STDOUT(-1) Стандартный выходной поток. Представляет собой канал записи результатов выполнения каких-либо процессов.
STDERR(-2) Стандартный выходной поток ошибок. В данный канал попадают сообщения об ошибках.
Управление потоками
> Вывод STDOUT в файл #find /somedir/ -size +20G > /tmp/testfile
>> добавление STDOUT в конец файла #find /somedir/ -size +20G >> /tmp/testfile
>& вывод STDOUT и STDERR в файл #find /somedir/ -size +20G >& /tmp/testfile
>2 вывод STDERR в файл #find /somedir/ -size +20G >2 /tmp/testfile
Комбинированный вывод #find /somedir/ -size +20G > /tmp/testfile >2 /dev/null
Более детально про потоки.
Команды и описание. lsmod - Информация о модулях ядра. Объекты которые расширяют функционал ядра. lspci - информация об устройствах pci lspcmcia - платы расширения для ноутбуков lsusb - информацияо usb
С помощью команды udevadm используем следующие параметры:
info смотрим информацию;
trigger эмуляция некоего события для устройства;
settle ожидание завершения обработки;
control управление демонами;
monitor отслеживание событий;
test симуляция события;
Модули управлением ядром:
lsmod информация о модулях ядра(Драйвер — модуль ядра, подсказывающий шине, как правильно обращаться с устройством);
modinfo информация о конкретном модуле(например, на скрине показана информация о ФС);