virtualbox
Fstab
Fstab
UUID
Постоянные именования (persistent naming) в обозначении блочных устройств стали возможным с появлением udev и предоставляют несколько преимуществ по сравнению с наименованиями на базе Bus таких как /dev/hda1 или /dev/sda2.
Развитие Linux дистрибутивов и udev сделало более надежным опознавание аппаратных средств, но одновременно с этим поставило необходимость решения ряда новых вопросов:
Порядок подключения при наличии более чем одного контроллера SATA/SCSI или простых контроллеров IDE становится случайным. Как следствие имена одного и того же устройств вида hdx/hdy или sdx/sdy случайно чередуются после каждой загрузки.Использование постоянных именований позволяет больше не беспокоиться об этом. Для машин с контролёрами IDE (включая, например, машины со всеми жёсткими дисками SATA и только одним IDE cdrom), переход на стандартное ядро Squeeze может вызвать проблемы: с введением поддержки новой libata PATA, устройство IDE hdX станет устройством sdX. Опять же, если используется постоянное именование, этого даже не будет заметно. (postinst для пакета linux-base содержит код помогающий с переходом, но сначала имеет смысл получить представление и заранее понять как это работает.) На больших машинах, с большим количеством CPU и Fiber Channel Host Bus Adapters, FC коммутаторами с переменной нагрузкой/задержкой, контролёрами SCSI, и/или высокопроизводительными сетевыми картами, могут возникнуть проблемы с синхронизацией при работе с udev и многолучевым I/O, из за почти непредсказуемого порядка определения устройств и автоматического назначения имен в процессе загрузки. Существуют и другие причины. Но перечисленные - наиболее важны как в настоящий время, так и в ближайшем будущем. Поэтому Debian рекомендует использование схемы наименования блочных устройств с постоянными именами.
Схемы для постоянных наименований
Посредством UUIDs UUID является механизмом присвоения уникальных обозначений каждой файловой системе. Все файловые системы Linux включая swap, поддерживают UUID; файловые системы FAT и NTFS не поддерживают верный UUID, но перечислены в /dev/disk/by-uuid с уникальным идентификатором:
$ ls -l /dev/disk/by-uuid/ total 0 lrwxrwxrwx 1 root root 10 Oct 16 10:27 2d781b26-0285-421a-b9d0-d4a0d3b55680 -> ../../sda1 lrwxrwxrwx 1 root root 10 Oct 16 10:27 31f8eb0d-612b-4805-835e-0e6d8b8c5591 -> ../../sda7 lrwxrwxrwx 1 root root 10 Oct 16 10:27 3FC2-3DDB -> ../../sda6 lrwxrwxrwx 1 root root 10 Oct 16 10:27 5090093f-e023-4a93-b2b6-8a9568dd23dc -> ../../sda2 lrwxrwxrwx 1 root root 10 Oct 16 10:27 912c7844-5430-4eea-b55c-e23f8959a8ee -> ../../sda5 lrwxrwxrwx 1 root root 10 Oct 16 10:27 B0DC1977DC193954 -> ../../sdb1 lrwxrwxrwx 1 root root 10 Oct 16 10:27 bae98338-ec29-4beb-aacf-107e44599b2e -> ../../sdb2
Как видите, разделы файловыми системами FAT и NTSF имеют короткие имена (sda6 и sdb1), но всё равно показаны в uuid. Смысл 32-х разрядных base-62 строк состоит в том, чтобы сделать вероятность совпадения идентификаторов ничтожно малой; если всё случается, что sda1 и sda2 имеют одинаковый UUID система может не загрузиться (или использовать последний найденный идентификатор как основной).
Посредством Меток (Labels)
Практически каждый тип файловой системы может иметь метку. Разделы с меткой находят в каталоге /dev/disk/by-label:
$ ls -l /dev/disk/by-label lrwxrwxrwx 1 root root 10 Oct 16 10:27 data -> ../../sdb2 lrwxrwxrwx 1 root root 10 Oct 16 10:27 data2 -> ../../sda2 lrwxrwxrwx 1 root root 10 Oct 16 10:27 fat -> ../../sda6 lrwxrwxrwx 1 root root 10 Oct 16 10:27 home -> ../../sda7 lrwxrwxrwx 1 root root 10 Oct 16 10:27 root -> ../../sda1 lrwxrwxrwx 1 root root 10 Oct 16 10:27 swap -> ../../sda5 lrwxrwxrwx 1 root root 10 Oct 16 10:27 windows -> ../../sdb1
Так как в качестве меток используются повторяющиеся имена, нужно быть предельно внимательным, чтобы избежать путаницы; также учитывать тот факт, что при перезагрузке устройства USB/firewire подключены могут быть по-разному.
Обозначение метки может изменяться следующими командами:
Type | Command | Notes |
EXT3: | e2label /dev/XXX <label> | также верно и для EXT2/EXT4 |
FAT/VFAT: | dosfslabel /dev/XXX <label> | bug #506786 в Lenny; или mlabelв утилитах mtools |
JFS: | jfs_tune -L <label> /dev/XXX | |
NTFS: | ntfslabel /dev/XXX <label> | или изменить из-под Windows |
ReiserFS: | reiserfstune -l <label> /dev/XXX | |
swap: | mkswap -L <label> /dev/XXX | также см. ниже для swapoff /swaponкоманд |
XFS: | xfs_admin -L <label> /dev/XXX |
Посредством Hardware ID
by-id создает уникальное имя на основе апаратного серийного номера. Они предназначены чтобы быть неизменными для данной аппаратной конфигурации.
# ls -l /dev/disk/by-id/ итого 0 drwxr-xr-x 2 root root 440 фев 1 17:19 . drwxr-xr-x 5 root root 100 ноя 24 20:22 .. lrwxrwxrwx 1 root root 9 фев 1 17:19 ata-SAMSUNG_HD204UI_S2H7J9FZC03394 -> ../../sdb lrwxrwxrwx 1 root root 10 фев 1 17:19 ata-SAMSUNG_HD204UI_S2H7J9FZC03394-part1 -> ../../sdb1 lrwxrwxrwx 1 root root 16 ноя 21 01:17 cciss-3600508b10010463956563832464f0003 -> ../../cciss/c0d1 lrwxrwxrwx 1 root root 18 фев 1 17:14 cciss-3600508b10010463956563832464f0003-part1 -> ../../cciss/c0d1p1 lrwxrwxrwx 1 root root 18 ноя 21 01:17 cciss-3600508b10010463956563832464f0003-part2 -> ../../cciss/c0d1p2 lrwxrwxrwx 1 root root 18 ноя 21 01:17 cciss-3600508b10010463956563832464f0003-part5 -> ../../cciss/c0d1p5 lrwxrwxrwx 1 root root 16 дек 20 03:44 cciss-3600508b10010463956563832464f0005 -> ../../cciss/c0d0 lrwxrwxrwx 1 root root 18 ноя 21 01:17 cciss-3600508b10010463956563832464f0005-part1 -> ../../cciss/c0d0p1 lrwxrwxrwx 1 root root 18 ноя 21 01:17 cciss-3600508b10010463956563832464f0005-part2 -> ../../cciss/c0d0p2 lrwxrwxrwx 1 root root 18 ноя 21 01:17 cciss-3600508b10010463956563832464f0005-part5 -> ../../cciss/c0d0p5 lrwxrwxrwx 1 root root 9 фев 1 17:19 wwn-0x50024e9203f46cb7 -> ../../sdb lrwxrwxrwx 1 root root 10 фев 1 17:19 wwn-0x50024e9203f46cb7-part1 -> ../../sdb1 lrwxrwxrwx 1 root root 16 ноя 21 01:17 wwn-0x600508b10010463956563832464f0003 -> ../../cciss/c0d1 lrwxrwxrwx 1 root root 18 фев 1 17:14 wwn-0x600508b10010463956563832464f0003-part1 -> ../../cciss/c0d1p1 lrwxrwxrwx 1 root root 18 ноя 21 01:17 wwn-0x600508b10010463956563832464f0003-part2 -> ../../cciss/c0d1p2 lrwxrwxrwx 1 root root 18 ноя 21 01:17 wwn-0x600508b10010463956563832464f0003-part5 -> ../../cciss/c0d1p5 lrwxrwxrwx 1 root root 16 дек 20 03:44 wwn-0x600508b10010463956563832464f0005 -> ../../cciss/c0d0 lrwxrwxrwx 1 root root 18 ноя 21 01:17 wwn-0x600508b10010463956563832464f0005-part1 -> ../../cciss/c0d0p1 lrwxrwxrwx 1 root root 18 ноя 21 01:17 wwn-0x600508b10010463956563832464f0005-part2 -> ../../cciss/c0d0p2 lrwxrwxrwx 1 root root 18 ноя 21 01:17 wwn-0x600508b10010463956563832464f0005-part5 -> ../../cciss/c0d0p5
Посредством sysfs Paths
by-path создает единственное обозначение на основе самого короткого физического пути (по sysfs). Оба вышеупомянутых метода содержат строки символов, которые снимают показания, к какой подсистеме они принадлежат, и таким образом не подходят, для решения выше упомянутых проблем и здесь в дальнейшем не обсуждаются.
Подготовка для постоянных именований
Для просмотра вновь созданных, или любых других доступных для монтирования разделов жесткого диска выполните:
$ ls -lR /dev/disk
также есть более удобная команда blkid (которая находится в /sbin, но не требует привилегий root) дающая более удобный вывод:
$ /sbin/blkid /dev/sda1: LABEL=Root UUID="87f2b245-6ab3-4021-bf07-d069b4d387a1" TYPE="ext3" /dev/sda2: TYPE="swap" /dev/sda3: LABEL=Home UUID="a6f7a63f-71ac-4361-b49a-39d62b06f18a" TYPE="ext3"
Как видно, раздел swap здесь не имеет UUID или label; инсталлер Debian Lenny использует версию partman которая не делает раздел swap. Тем не менее, разделу подкачки может быть дано "постоянное имя" через mkswap.
Назначение постоянных имен для раздела Swap Сначала, необходимо чётко убедиться в том, что раздел подкачки определён верно (см. /proc/swaps)! Затем (от имени суперпользователя - root) отмонтировать существующий раздел подкачки, пересоздать его (тут можно добавить также и метку), и вновь примонтировать/запустить, примерно таким образом:
# swapoff /dev/sda2 # mkswap -L Swap /dev/sda2 Setting up swapspace version 1, size = 1998737 kB LABEL=Swap, UUID=7cdfeb21-613b-4588-abb5-9d4049854e9a # swapon /dev/sda2 Результат можно проверить от имени обычного пользователя: $ /sbin/blkid /dev/sda1: LABEL=Root UUID="87f2b245-6ab3-4021-bf07-d069b4d387a1" TYPE="ext3" /dev/sda2: LABEL=Swap UUID="7cdfeb21-613b-4588-abb5-9d4049854e9a" TYPE="swap" /dev/sda3: LABEL=Home UUID="a6f7a63f-71ac-4361-b49a-39d62b06f18a" TYPE="ext3" $ free total used free shared buffers cached Mem: 33017956 298700 32719256 0 17060 148668 -/+ buffers/cache: 132972 32884984 Swap: 1951888 0 1951888
Использование постоянных именований
Выбрав-таки наиболее удобный способ именования устройств, можно приступить к использованию постоянных именований в системе:
В fstab Включение постоянных имён в /etc/fstab легко: для каждой файловой системы в файле fstab нужно заменить имя устройства в первом столбце (где указано что-то вроде /dev/sda7) на постоянное имя. Это делается путём замены соответствующих путей в /dev/disk, примерно так:
/dev/disk/by-label/home
или
/dev/disk/by-uuid/31f8eb0d-612b-4805-835e-0e6d8b8c5591
Тем не менее, вместо задания явных путей в /dev/disk, обычно рекомендуется использовать ключевые слова LABEL=<label> или UUID=<uuid> для монтирования файловых систем, например:
LABEL=home
или
UUID=31f8eb0d-612b-4805-835e-0e6d8b8c5591
Dev - Устройства
Dev - Устройства
Просмотр HDD/SSD устройств
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:00232,9G 0 disk ├─sda1 8:10223,4G 0 part /├─sda2 8:20 1K 0 part └─sda5 8:509,5G 0 part [SWAP] sdd 8:4801,8T 0 disk sde 8:640465,8G 0 disk
Список дисков с указанием UUID
$ blkid /dev/sda1: UUID="dea7b137-e3a0-48fa-8363-5f654ed6d6f5"TYPE="ext4"PARTUUID="9e41fd98-01"/dev/sda5: UUID="d7307b2f-6903-4193-8281-02c17d6aa42a"TYPE="swap"PARTUUID="9e41fd98-05"/dev/sdd: UUID="833ad2a2-23ba-43ea-96bf-f5161b717034"TYPE="ext4"/dev/sde: UUID="929a5b27-8dea-47b5-b6c9-ec90617b6ef2"TYPE="ext4"
fstab
Установка поддержки NTFS
Установка поддержки NTFS
Чтение
- mount -t ntfs /dev/sdb1 /mnt/ntfs
or
- mount -t vfat /dev/sdb1 /mnt/ntfs
Чтение/Запись
- apt-get install fuse ntfs-3g
- mount -t ntfs-3g /dev/sdc1 /mnt/disk2
mount
mount
- mount -o remount,rw /
Ускорение файловой системы EXT2 - EXT4
- В 4 секции /etc/fstab ввести ,noatime,nodiratime
Монтирование tmpfs
/etc/fstab
# Пример none /dev/shm tmpfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 chromium-cache /home/USER/.cache/chromium tmpfs defaults,noatime,mode=1777,size=500M 0 0
Программное обеспечение - [U]
Программное обеспечение
0-9
A
- AB (Apache Benchmark) - тест производительности сервера
- apt - Утилита установки пакетов
- aptitude - Утилита установки пакетов
- ApacheBench - ap
- alsa - Advanced Linux Sound Architecture (ALSA)
- awk - консольный редактор
B
- bind9 - DNSсервер
C
D
- dpkg - Утилита установки пакетов
- Dovecot - Postfix + Dovecot + MYSQL (IMAP/POP3-сервер)
- dovecot_exim - Exim4 + Dovecot + MYSQL
- du - Вычисляем занимаемое место на диске
- DD - Клонирование диска/партиций
- dhclient - Dhclient
- Deluge - Torrent client
- Dialog - Альтернативой dialog может служить whiptail, который даже присутствует в некоторых системах по умолчанию.
E
- Exim4 - SMTP Сервер (MTA)
- elinks - Текстовой брузер с поддержкой JS
- etckeeper - Сохранение настроек сервера в репозитории
- ethtool - Инструмент для анализа сетевых интерфейсов
- smtp-client.pl - Консольный клиент для отправки почты - Send Email test - Консольный Email клиент
F
G
H
- http://www.catch22.net/ HexEditor (Windows 95, 98, ME, Windows NT 4.0, 2000, XP)
I
J
K
L
M
- mc - Midnight Commander
- Mytop - Top для MySql
- mtop
- Mutt - Консольный E-mail клиент
- Mongo - MongoDB
- Система резервного копирования и восстановления данных для MySql - Система резервного копирования / восстановления MySql
N
O
P
- Percona-Server - MySql
- Pureftpd + MySql - Pureftpd сервер FTP (не привязан к директории пользователя)
- Power Dns - DNSсервер
- PIDOF - Списко PID запущеных процессов
Q
R
- Rsync - Система копирования файлов
S
- squirrelmail - почтовый клиент
- sphinx - индексатор (поисковик)
- SSH клиент / сервер - SSH
- sshfs - Монтирование директорий с использованием SSH
- sshd - SSHD
- screen - Менеджер сессий
- Solr - поисковый индексатор
- Swapon - Управление SWAP
- Sed - Inline editor
- systemctl - Анализ служб
- sort - Применяется для сортировки вывода (Пример: ls -1|sort -V)
- SSMTP - Отправка почты через console - Отправка почты через консоль
T
U
V
W
- Wireshark сетевой сканер (Сетевой сканер)
X
Y
Z
mount - Монтирование файловой системы
mount - Монтирование файловой системы
mount rw
- mount -o remount,rw /
Ускорение файловой системы EXT2 - EXT4
- В 4 секции /etc/fstab ввести ,noatime,nodiratime
Монтирование tmpfs
/etc/fstab
# Пример none /dev/shm tmpfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 chromium-cache /home/USER/.cache/chromium tmpfs defaults,noatime,mode=1777,size=500M 0 0
Remote mount / Удаленое монтирование
mount -tfuse sshfs#root@hosting.reklamu.ru:tmp ./test
apt-get install sshfs
mount -tsshfd sshfs#root@hosting.reklamu.ru:tmp ./test
mount -tsshfs sshfs#root@hosting.reklamu.ru:tmp ./test
mount sshfs#root@hosting.reklamu.ru:tmp ./test
Монтирование tmpfs
/etc/fstab
# Пример none /dev/shm tmpfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 chromium-cache /home/USER/.cache/chromium tmpfs defaults,noatime,mode=1777,size=500M 0 0
Размонтирование
umount - размонтирование раздела
umount - размонтирование раздела
Принудительно размонтировать раздел
При возникновении ошибки umount — device is busy
$ umount-l/mnt/disk
Создание загрузочной USB Flash на Linux - [2-й Способ]
Создание загрузочной USB Flash на Linux
1-й Способ
- zcat boot.img.gz > /dev/sdX - соответствует выбранной архитектуре
- mount /dev/sdX /mnt
- cp <path/to/iso/image> /mnt - выбранный дистрибутив (рекомендуется брать netinstall)
- umount /dev/sdX
где X - это номер устройства
2-й Способ
$ hdiutil convert /path/to/downloaded.iso -format UDRW -o/path/to/newimage $ diskutil list $ diskutil unmountDisk /dev/diskX $ sudoddif=/path/to/newimage.dmg of=/dev/diskN bs=1m
3-й Способ
Или воспользоваться unetbootin
Node.JS - [Debian]
Node.JS
Установка nodejs + npm
$ npm install will install both "dependencies" and "devDependencies" $ npm install--production will only install"dependencies" $ npm install--dev will only install"devDependencies"
Debian
$ curl -sL https://deb.nodesource.com/setup |bash - $ curl -L https://npmjs.com/install.sh |sh
Пакетный менеджер npm
с репозитория
Исправление ошибок
- installing from npm fails
npm config set registry http://registry.npmjs.org/
Демонизируем Node.Js / Forever
forever - модуль разработанный nodejitsu, - нужен для того, чтобы запускать приложения в виде демона (режиме постоянного выполнения - отсюда и название модуля). Если приложение по каким-то причинам прекращает свое выполнение, то forever его перезапускает. Также, данный модуль имеет API, так что вы можете использовать его в коде своих проектов.
forver может быть установлен при помощи npm:
sudo npm -g install forever
Отладка
Документация
- npm - Пакетный менеджер
- Архитектура - Событийная работа в nodejs осуществляется библиотекой libUV
Библиотеки
Парсинг / Web console (webkit)
Статьи
Видео
Ссылки
Проекты
Автоматический запуск в linux
Автоматический запуск в linux
UpStart
/etc/init содержит конфигурационные файлы для супервизора сервисов "UpStart".
Команды
$ initctl list $ initctl start {SERVICENAME} $ initctl stop {SERVICENAME}
System-V
/etc/init.d содержит конфигурационные файлы для супервизора сервисов "Systemv". /ect/rc.[n] - содержит ссылки на конфигурационные скрипты, где n - уровень запуска
- Runlevel 0 is halt. - Остановка системы
- Runlevel 1 is single-user. - Однопользовательский режим
- Runlevels 2-5 are multi-user. - Многопользовательский режим
- Runlevel 6 is reboot. - Перезагрузка
/etc/inittab - содержит инструкции запуска /etc/init.d/rc.local - Запускает скрипты из /etc/rc.local
Команды
$ ls/etc/init.d/ $ /etc/init.d/{SERVICENAME} start $ /etc/init.d/{SERVICENAME} stop
Systemd
Команды
$ systemctl list-unit-files $ systemctl start {SERVICENAME} $ systemctl stop {SERVICENAME} $ systemctl enable{SERVICENAME} $ systemctl disable {SERVICENAME}
Runit
Systemd
Systemd
Примеры
Portainer
[Unit]Description=Portainer service with docker-compose Requires=docker.service After=docker.service [Service]Restart=always WorkingDirectory=/var/lib/jenkins/workspace/portainer/ # Remove old containers, network and volumesExecStartPre=/usr/bin/docker-compose -f/var/lib/jenkins/workspace/portainer/docker-compose.yml down -vExecStartPre=-/bin/bash-c'docker network rm docker_jfrog_net'ExecStartPre=-/bin/bash-c'docker ps -aqf "name=artifactory" | xargs docker rm' # Compose upExecStart=/usr/bin/docker-compose -f/var/lib/jenkins/workspace/portainer/docker-compose.yml up # Compose down, remove containersExecStop=/usr/bin/docker-compose -f/var/lib/jenkins/workspace/portainer/docker-compose.yml down [Install]WantedBy=multi-user.target
Удаление Systemd из Debian 8 - [Удаление Systemd]
Удаление Systemd из Debian 8
Устанавливаем SysV init
$ apt-get install sysvinit-core sysvinit-utils $ cp /usr/share/sysvinit/inittab /etc/inittab
Удаление Systemd
$ apt-get remove --purge --auto-remove systemd $ echo -e 'Package: systemd\nPin: release *\nPin-Priority: -1' > /etc/apt/preferences.d/systemd $ echo -e '\n\nPackage: *systemd*\nPin: release *\nPin-Priority: -1' >> /etc/apt/preferences.d/systemd $ echo -e '\nPackage: systemd:amd64\nPin: release *\nPin-Priority: -1' >> /etc/apt/preferences.d/systemd $ echo -e '\nPackage: systemd:i386\nPin: release *\nPin-Priority: -1' >> /etc/apt/preferences.d/systemd
Запуск PHP скрипта с использованием nohup
Запуск PHP скрипта с использованием nohup
Debian / Ubuntu
sysv-init
nano /etc/init.d/price_parser
chmod +x /etc/init.d/price_parser
#!/bin/sh### BEGIN INIT INFO# Provides: price_parser# Required-Start: $remote_fs $syslog# Required-Stop: $remote_fs $syslog# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: Stop/start price_parser### END INIT INFO # Author: Mirocow <mr.mirocow@gmail.com> . /lib/init/vars.sh . /lib/lsb/init-functions PNAME="price_parser"PPATH="/home/some/path/to/app"SCRIPT="/usr/bin/php ./yii some/cotroller/action"PIDFILE="/var/run/${PNAME}.pid"LOCKFILE="/var/lock/${PNAME}" RETVAL=0 start(){echo-n"Starting $PNAME : "if[-s${PIDFILE}]; thenRETVAL=1echo-n"Already running !"echoelsecd${PPATH}&&nohup${SCRIPT}>/dev/null 2>&1&RETVAL=$?PID=$![$RETVAL-eq0]&&touch${LOCKFILE}echoecho$PID>${PIDFILE}fi} stop(){if[-s${PIDFILE}]; thenecho-n"Shutting down ${PNAME} : "kill-9`cat${PIDFILE}`RETVAL="$?"if[$RETVAL-eq0]; thenrm-f${LOCKFILE}rm-f${PIDFILE}fielseRETVAL=1echo-n"Already stoped !"echofireturn"$RETVAL"} restart(){echo-n"Restarting ${PNAME} : " stop sleep2 start } case"$1"in start) start ;; stop) stop ;; status) status ${PNAME};; restart) restart ;;*)echo"Usage: $0 {start|stop|status|restart}";;esac exit0
Upstart
Умерла
systemd
Type
- Type=simple (по умолчанию): systemd предполагает, что служба будет запущена незамедлительно. Процесс при этом не должен разветвляться. Не используйте этот тип, если другие службы зависят от очередности при запуске данной службы. Исключение - активация сокета
- Type=forking: systemd предполагает, что служба запускается однократно и процесс разветвляется с завершением родительского процесса. Используйте данный тип для запуска классических демонов за исключением тех случаев, когда, как вам известно, в таком поведении процесса нет необходимости. Вам следует также определить PIDFile=, чтобы systemd могла отслеживать основной процесс
- Type=oneshot: полезен для скриптов, которые выполняют одно задание и завершаются. Вам может понадобиться также установить параметр RemainAfterExit=yes, чтобы systemd по-прежнему считала процесс активным, даже после его завершения
- Type=notify: идентичен параметру Type=simple, но с той оговоркой, что демон пошлет systemd сигнал о своей готовности. Эталонная реализация данного уведомления представлена в libsystemd-daemon.so
- Type=dbus: сервис считается находящимся в состоянии готовности, когда определенное BusName появляется в системной шине DBus
- Type=idle: systemd will delay execution of the service binary until all jobs are dispatched. Кроме того, поведение очень похоже на Type=simple.
Расположения
- /usr/lib/systemd/system - системные юниты, поставляемые обычно вместе с приложениями;
- /run/systemd/system - динамически создаваемые юниты (т.е. на лету);
- /etc/systemd/system - юниты и исправления, внесённые администратором
Запуск
- service yii-some-listen status
- service yii-some-listen stop
- service yii-some-listen start
- service yii-some-listen restart
Пример
nano /etc/systemd/system/yii-some-listen.service
[Unit]Description=Yii some-listen After=mysql.service apache2.service Requires= [Service]PIDFile=/var/run/yii-some-listen.pid WorkingDirectory=/home/some/path/to/app ExecStart=nohup/usr/bin/php /home/some/path/to/app/yii some/cotroller/action start >/dev/null 2>&1ExecStop=/usr/bin/php /home/some/path/to/app/yii some/cotroller/action stop >/dev/null 2>&1#Restart=always#RestartSec=5RemainAfterExit=yesUser=user Group=www-data [Install]WantedBy=multi-user.target Alias=yii-some-listen.service
Or usep PID file
nano /etc/systemd/system/yii-some-listen.service
[Unit]Description=Yii some-listen After=mysql.service apache2.service Requires= [Service]PIDFile=/var/run/yii-some-listen.pid WorkingDirectory=/home/some/path/to/app ExecStart=nohup/usr/bin/php /home/some/path/to/app/yii some/cotroller/action start >/dev/null 2>&1ExecStop=pkill -9-F/var/run/yii-some-listen.pid #Restart=always#RestartSec=5RemainAfterExit=yesUser=user Group=www-data [Install]WantedBy=multi-user.target Alias=yii-some-listen.service
Mudar
Epoch
CentOS / Fedora
Как загружается Linux
Как загружается Linux
Когда я осваивал Linux, мне было очень интересно что происходит при загрузке системы. Попытка разобраться в процессе загрузки привела меня в исходники загрузочных скриптов (/etc/inittab, /etc/rc*, /etc/init.d/*, ...) и их конфигов (/etc/sysconfig/*, /etc/cond.f/*, ...). Надо отметить серьёзные размеры и сложность этих скриптов - чтобы в них разобраться потребовалось немало времени. Но я в те времена искренне верил, что загрузка это сложный процесс, и что размеры и сложность загрузочных скриптов вполне оправданы.
Когда меня окончательно достал RedHat, я решил собрать свой дистрибутив на базе LFS. Для своего дистрибутива пришлось самостоятельно разрабатывать загрузочные скрипты, и тут-то выяснилась правда: ничего сложного в процессе загрузки нет!
Проработав 2.5 года на своём дистрибутиве (PoWeR Linux) я мигрировал на Gentoo (на качественную поддержку своего просто не хватало времени). Изучив загрузочные скрипты Gentoo я пришёл в ужас! Их размеры и сложность были ещё больше, чем у старого RedHat. После детального изучения стала ясна причина: один и тот же комплект загрузочных скриптов использовался и для LiveCD и для обычной системы - такой себе универсальный монстрик.
Так что при переходе на Gentoo я решил взять загрузочные скрипты из PoWeR Linux а стандартные Gentoo-шные не использовать (т.е. у меня от Gentoo используется только portage). И с тех пор ещё 4 года эти скрипты работают у меня на домашней рабочей станции и кучке удалённых серверов.
Характеристики
Размер скриптов (всех вместе) - 316 строк, 7.5KB:
$ wc 1 3 lib.sh 199 703 5152 1 89 272 1671 3 28 118 770 lib.sh 316 1093 7593 итого
Минусы:
Всё в одном файле - при обновлении приложений практически невозможно автоматически обновить код инициализации этого приложения. Например, когда обновляется ALSA, то пакет может просто заменить файлы /etc/init.d/alsasound, /etc/conf.d/alsasound, /etc/modules.d/alsa. А в моём случае админу нужно будет ручками править /etc/runit/1. Нет поддержки всего на свете. Например, я не использую RAID и LVM - так что команды для их инициализации вам нужно будет добавлять самостоятельно. Вам нужно будет самостоятельно поддерживать эти скрипты. Я обычно при обновлении Gentoo поглядываю на изменения в (неиспользуемых мной) /etc/init.d/* скриптах и если меняется что-то важное - обновляю свои скрипты. Но, на практике, необходимость в таких изменениях возникает примерно раз в два года.
Плюсы:
Всё в одном небольшом файле - нет необходимости разыскивать по куче скриптов и их конфигов где настраивается то, что вам понадобилось; можно быстро и легко увидеть все базовые настройки системы.
Есть поддержка всего, что мне и моим друзьям за 6.5 лет было нужно на домашних компах и серверах.
Идеальны для изучения процесса инициализации Linux. Вы работаете с реальными базовыми командами Linux, которые одинаковы во всех дистрибутивах, а не со скриптами и конфигами специфичными для вашего дистрибутива.
Ускоряют загрузку системы. У меня домашняя машина грузится в single user mode (6 консолек с getty, syslog, klog, gpm) за 16.5 секунд. Я экспериментировал с параллельной загрузкой в стиле initng - эффект скорее отрицательный за счёт усложнения скриптов и порождения лишних процессов. Initng хорош для ускорения загрузки традиционных, раздутых скриптов, выполняющих множество ненужных действий, а в моём случае ускорять просто нечего. :) Не смотря на малый размер эти скрипты не только надёжно и быстро грузят систему, но и поддерживают несколько фич облегчающих жизнь админу:
Выполняемые команды сгруппированы в блоки по типам. В процессе загрузки выводятся названия блоков, с информацией были ли ошибки при выполнении команд блока. Если при выполнении блока команд были ошибки - выводится детальная информация по командам этого блока и возникшим ошибкам, после чего система ждёт 5 секунд нажатия любой кнопки для запуска bash и ручного исправления ошибок. После выхода из bash предлагается либо продолжить загрузку либо перегрузиться. Если ничего не нажимать, загрузка продолжится. Логи всего, что выводится при загрузке и отключении на экран (названия блоков команд и информация по возникающим ошибкам) сохраняются в файлах /var/log/boot, /var/log/shutdown. Благодаря этому можно на удалённых серверах посмотреть, как проходила загрузка/отключение. Пример сообщений выводимых при загрузке
+ UDEV + MODULES + SYSCTL + MTAB - MOUNTALL ++ swapon -a ++ false EXIT CODE: 1 ++ mount -at nocoda,nonfs,noproc,noncpfs,nosmbfs,noshm ... press any key in 5 seconds to open shell ... + CLEANTMP + RANDOMSEED + HWCLOCK + SENSORS + LOADKEYS + SOUND + HOST_NAME + ENVUPDATE + NETWORK + RUNIT + DMESG
Runit
Для загрузки я вместо SysV init использую Runit. Runit не поддерживает /etc/inittab, вместо этого в нём используется простая схема: При загрузке запускается скрипт /etc/runit/1. Его задача полностью проинициализировать систему. По завершению скрипта /etc/runit/1 запускается скрипт /etc/runit/2, который должен запустить все необходимые сервисы (syslog, getty, ssh, apache, ...). Когда пользователь останавливает/перегружает систему запускается скрипт /etc/runit/3 который должен подготовить систему к отключению (завершить все процессы, отмонтировать диски, etc.). При желании можно настроить SysVinit для работы в том же стиле: Запуск /etc/runit/{1,2,3} из SysVinit: /etc/inittab
id:3:initdefault: rc::bootwait:/etc/runit/1 l0:0:wait:/bin/sh -c '/etc/runit/3; exec /sbin/halt' l3:3:once:/etc/runit/2 l6:6:wait:/bin/sh -c '/etc/runit/3; exec /sbin/reboot' ca:12345:ctrlaltdel:/sbin/shutdown -r now
Сервисы Для запуска всех сервисов (getty, syslog, mysql, etc.) я использую тот же runit (по сути это просто немного улучшенный вариант daemontools). Но это отдельная большая тема, так что просто уточню что в этой статье скриптов для запуска сервисов нет, здесь только инициализация/отключение системы.
Исходники Вспомогательные функции: /etc/runit/lib.sh
#!/bin/bash startlog() { exec 3>&1 4>&2 1> >(tee $1) 2>&1; } stoplog() { exec 1>&3- 2>&4-; } wanna() { echo -e "\a... press any key in $2 seconds to $1 ..." read -t $2 -n 1 -s </dev/console } emergency() { if wanna "open shell" 5; then bash --norc </dev/console &>/dev/console if [[ "$0" == "/etc/runit/1" ]] && wanna "reboot now" 3; then exit 100 fi fi } trace() { trap 'ERR=$?' ERR; set -Ex; $1 2>&1; set +Ex; trap ERR; } 2>&- try() { local output=$( trace $1 ) if [[ "$output" =~ "ERR=" ]]; then echo -e "\e[1m\e[31m - \e[37m$1\e[0m" echo "$output" | sed $'s/.*ERR=\(.*\)/\a\033[36mEXIT CODE: \\1\033[0m/g' emergency else echo -e "\e[1m\e[32m + \e[37m$1\e[0m" fi }
Startup: /etc/runit/1
#!/bin/bash CONSOLE() { dmesg -n 1 } INIT() { mount -n -t proc none /proc mount -n -t sysfs none /sys mount -n -t ramfs none /dev mknod -m 660 /dev/console c 5 1 mknod -m 660 /dev/null c 1 3 ln -snf /proc/self/fd /dev/fd # needed for startlog in /etc/runit/lib.sh } UDEV() { udevstart ### Standard add-on ln -snf /proc/self/fd/0 /dev/stdin ln -snf /proc/self/fd/1 /dev/stdout ln -snf /proc/self/fd/2 /dev/stderr ln -snf /proc/kcore /dev/core mkdir /dev/pts mkdir /dev/shm mount -n -t devpts -o gid=5,mode=0620 none /dev/pts ### My custom add-on ln -s vcs /dev/vcs0 ln -s dvd2 /dev/dvd ln -s cdrom2 /dev/cdrom mkdir /dev/lirc mknod /dev/lirc/0 c 61 0 mknod /dev/vmmon c 10 165 mknod /dev/sdb b 8 16 mknod /dev/sdb1 b 8 17 } MODULES() { update-modules ### Network modprobe -q skge modprobe -q 8139too media=56 # 1=10half 17=10full 56=100full modprobe -q sky2 ### Lirc setserial /dev/ttyS1 uart none modprobe -q lirc_serial io=0x2f8 irq=3 # io=0x3f8 irq=4 ### VMware modprobe -q vmmon modprobe -q vmnet } SYSCTL() { sysctl -p /etc/sysctl.conf } MTAB() { # Adding already-mounted fs to /etc/mtab >/etc/mtab mount -f / awk '$2 != "/" {print}' /proc/mounts >> /etc/mtab for i in $(cut -d ' ' -f 2 </etc/mtab); do mount -f -o remount "$i"; done } MOUNTALL() { swapon -a mount -at nocoda,nonfs,noproc,noncpfs,nosmbfs,noshm } CLEANTMP() { # Cleaning up temporary files and locks, prepare utmp & wtmp rm -rf /var/lib/net-scripts/state/* rm -rf /var/run/console.lock /var/run/console/* # reset pam_console find /var/lock -type f -print0 | xargs -0 rm -f -- find /var/run ! -type d ! -name utmp ! -name innd.pid \ ! -name random-seed -exec rm -f -- {} \; > /var/lock/.keep rm -f /tmp/.X*-lock /tmp/esrv* /tmp/kio* /tmp/jpsock.* /tmp/.fam* /tmp/iceauth.* /tmp/xauth.* rm -rf /tmp/.esd* /tmp/orbit-* /tmp/ssh-* /tmp/ksocket-* /tmp/.*-unix rm -rf /tmp/.{ICE,X11}-unix mkdir -p /tmp/.{ICE,X11}-unix chmod 1777 /tmp/.{ICE,X11}-unix } RANDOMSEED() { # Restoring random-seed. [ -f /var/run/random-seed ] && cat /var/run/random-seed >>/dev/urandom rm -f /var/run/random-seed ( umask 077 ; dd if=/dev/urandom of=/var/run/random-seed count=1 2>/dev/null ) } HWCLOCK() { if [ ! -f /etc/adjtime ]; then echo "0.0 0 0.0" > /etc/adjtime ; fi hwclock --adjust --localtime hwclock --hctosys --localtime } SENSORS() { sensors -s } LOADKEYS() { # Commands for TTY initialization like 'setfont' and 'echo -ne "\033(K"' # shouldn't be executed in /etc/runit/1 because: # - which TTYs should be initialized may depend on current runlevel # - if TTY state become broken (for ex. after 'cat /dev/urandom'), # then after logout and login TTY state should be reinitialized # these commands should be executed before each getty invocation instead. loadkeys koi2 # -q windowkeys } SOUND() { alsactl -f /etc/asound.state restore } HOST_NAME() { hostname home echo "HOSTNAME='$(hostname)'" >/etc/env.d/01hostname } ENVUPDATE() { env-update.sh -u } NETWORK() { ifconfig lo 127.0.0.1 up route add -net 127.0.0.0 netmask 255.0.0.0 gw 127.0.0.1 dev lo iptables-restore </etc/iptables ifconfig eth2 192.168.2.1 broadcast 192.168.2.255 netmask 255.255.255.0 ifconfig eth2:0 192.168.2.254 ifconfig eth1 192.168.1.2 broadcast 192.168.1.255 netmask 255.255.255.0 ifconfig eth0 192.168.10.2 broadcast 192.168.10.255 netmask 255.255.255.0 #route add default gw 192.168.1.1 dev eth1 } RUNIT() { # Set default action (shutdown or not) if Ctrl+Alt+Del pressed, # but /etc/runit/ctrlaltdel don't setup /etc/runit/stopit. touch /etc/runit/stopit chmod 100 /etc/runit/stopit # Set default action on shutdown (halt or reboot) if: # - /etc/runit/1 crash or exit 100 # - /etc/runit/2 exit non 111 # - Ctrl+Alt+Del pressed, but /etc/runit/ctrlaltdel don't setup /etc/runit/reboot touch /etc/runit/reboot chmod 100 /etc/runit/reboot # Set runlevel to: # - single if kernel has param: S # - RUNLEVELNAME if kernel has param: runlevel=RUNLEVELNAME # - default if kernel has no params or unable to set requested runlevel grep -q '\(^\| \)S\( \|$\)' /proc/cmdline && runlevel='single' runsvchdir ${runlevel:-default} || runsvchdir default } SEND_MAIL() { echo -e "To: root\nSubject: reboot at $(date)" | sendmail -t } DMESG() { # Create an 'after-boot' dmesg log touch /var/log/dmesg chmod 640 /var/log/dmesg dmesg > /var/log/dmesg } PATH=/sbin:/usr/sbin:/bin:/usr/bin trap ':' INT QUIT TSTP . /etc/runit/lib.sh try CONSOLE try INIT startlog /var/log/boot try UDEV try MODULES try SYSCTL try MTAB try MOUNTALL try CLEANTMP try RANDOMSEED try HWCLOCK try SENSORS try LOADKEYS try SOUND try HOST_NAME try ENVUPDATE try NETWORK try RUNIT #try SEND_MAIL try DMESG stoplog # Select next stage (exit 0 for stage 2, exit 100 for stage 3): exit 0
Shutdown: /etc/runit/3
#!/bin/bash CONSOLE() { chvt 1 # Required in case getty was last process in this console and it leave # console in broken state (\n work as <LF> without <CR>). { stty sane ; echo ; } >/dev/console } TERM() { # Give a chance for all processes for clean exit. # This also will kill all 'runsvdir' and signal all 'runsv' to exit. killall5 -15 } HWCLOCK() { hwclock --systohc --localtime } SERVICES() { sv force-stop /var/service/* &>/dev/null || : } SOUND() { alsactl -f /etc/asound.state store } RANDOMSEED() { umask 077 dd if=/dev/urandom of=/var/run/random-seed count=1 2>/dev/null } NETWORK() { for i in $(ifconfig | grep '^[^ ]' | cut -d ' ' -f 1 | tac); do ifconfig "$i" down done } WTMP() { /sbin/halt -w } KILL() { # Goodbye to everybody... killall5 -9 } UMOUNTPSEUDO() { # Unmounting memory filesystems: umount -a -t tmpfs swapoff -a # Unmounting loopback devices first: for d in $(grep '^/dev/loop' /proc/mounts | cut -d ' ' -f 2 | tac); do eval "umount -d -r -f $'$d'" done umount -d -r -f -a -O bind } UMOUNTHDD() { # Unmounting all filesystems: for d in $(egrep -v '^[^/]|^/dev/root' /proc/mounts | cut -d ' ' -f 2 | tac); do eval "umount -d -r -f $'$d'" done } FINI() { sync; sync mount -n -o remount,ro / || { sleep 1; mount -n -o remount,ro /; } } PATH=/sbin:/usr/sbin:/bin:/usr/bin trap ':' INT QUIT TSTP . /etc/runit/lib.sh try CONSOLE startlog /var/log/shutdown try TERM try HWCLOCK try SERVICES try SOUND try RANDOMSEED try NETWORK try WTMP try KILL try UMOUNTPSEUDO try UMOUNTHDD stoplog try FINI
Использование runit для своих сервисов
Использование runit для своих сервисов
Супервизор сервисов runitпозиционируется как замена стандартным скриптам инициализации Unix.
Но на практике оказалось, что runit идеален для управления сервисами безотносительно инициализации и т.п.
Введение
Супервизор берёт на себя такой функционал, как: превращение любого процесса в демон; логгирование вывода процесса и ротирование логов; запуск, остановка, рестарт, запрос состояния, управляющие скрипты для init.d; выключение и запуск сервисов автоматически при появлении новых сервисов в списке либо удалении старых из списка; возможность ведения нескольких независимых списков сервисов одновременно (например, для каждого пользователя отдельно и для системы в целом); удобный APIдля управления сервисами.
Для большинства операционных систем runit уже входит в репозитории пакетов (apt-get install runit). Кроме того, мы имеем уже готовый набор рецептов (ссылку придётся поправить, хабр сломал её) для популярных сервисов (nginx, apache etc.).
Далее рассмотрим стандартную схему runit (которая используется по умолчанию):
Демонизация
Каждый сервис описывается отдельным каталогом /etc/sv/<название сервиса>.
обычно достаточно иметь в этом каталоге исполняемый скрипт run вида
#!/bin/bash exec 2>&1 exec your_running_command
Важно, чтобы your_running_command не демонизировала себя (не отсоединялась от стандартных потоков stdin, stdout, stderr).
Переадресация ошибок в стандартный вывод нужна для их логгирования. Выполняется логгирование, если в каталоге /etc/sv/<название сервиса>/log/ разместить файл run вида
#!/bin/bash LOG_FOLDER=/var/log/<название сервиса> mkdir -p $LOG_FOLDER exec svlogd -tt $LOG_FOLDER
Сервисы, расположенные в каталоге /etc/sv/, не выполняются, пока ссылки на них не будут размещены в каталоге /etc/service/.
Как только вы сделаете ln -s /etc/sv/<название сервиса> /etc/service/<название сервиса>, сервис runsvdir увидит новый сервис, и запустит его. Более того, в случае остановки сервиса он будет автоматически перезапущен. Это даёт гораздо более быструю реакцию на остановку сервиса по сравнению с использованием сервисов мониторинга (god или monit).
Ротирование логов
При использовании svlogd логи размещаются в папке, которую Вы указали при её запуске. При этом текущий лог находится в файле current, и периодически выполняется ротирование логов в этой папке.
Управление
Запускать, останавливать, перезапускать сервисы можно с помощью команды sv (start|stop|restart...) <название сервиса>.
Кроме того, при запуске сервиса появится каталог /etc/service/<название сервиса>/supervise, в котором будут расположены очень полезные файлы и потоки:
pid — идентификатор процесса Unix; stat — человеко-читаемое состояние сервиса status — машинно-читаемое состояние процесса control — поток управления
и так далее...
Можно отметить, что для остановки или запуска процесса достаточно открыть поток control на запись, и отправить туда символ d (от down) или u (от up) соответственно.
В стиле init.d
Нет ничего проще, чем поддержать управление в стиле init.d.
Просто делаем ln -s /usr/bin/sv /etc/init.d/<название сервиса>. sv поймёт, что его вызвали в стиле init.d, и готов будет принимать команды вида /etc/init.d/<название сервиса> start etc. Совсем немного магии, правда?
Настройка сервисов
В комплекте с runit поставляется утилита chpst, которая позволяет выполнять сервисы с дополнительной настройкой (ограничивать размер памяти, запускать из под определенного пользователя, с другим уровнем nice и т.д.).
Резюме
runit оказался настолько удобен и надёжен для организации своих сервисов, что мы стараемcя переводить все наши демоны под runit, заодно отказываясь от различного геморроя в виде пакетов демонизации а ля daemons gem. Также на части машин мы избавились от Monit (где требовался лишь мониторинг процессов).
Крайне рекомендую к прочтению комментарий от powerman, а также статью про Web-интерфейс к runit.
tcpdump - [tcpdump на unix socket]
tcpdump
Анализ
- tcpdump -n -i eth0 -l | tee resolv.pcap
- ssh root@HOST tcpdump -U -s0 -w - 'not port 22' | wireshark -k -i -
Фильтры
Фильтр | Определение |
host | Служит для указания имени хоста |
net | Указывает IP подсети и сети |
ip | Служит для указания адреса протокола |
src | Выводит пакеты, которые были отправлены с указанного адреса |
dst | Выводит пакеты, которые были получены указанным адресом |
arp, udp, tcp | Фильтрация по одному из протоколов |
port, portrange | Отображает информацию, относящуюся к определенному порту, диапазону портов |
and, or | Служит для объединения нескольких фильтров в команде |
less, greater | Вывод пакетов меньше или больше указанного размера |
Ключи
- -i - Прослушиваемый интерфейс
- port 9000, port 80
- -A - выводить все пакеты в формате ASCII;
- -c - закрыть программу после перехвата n-ого количества пакетов;
- -C - при записи пакетов в файл, проверять размер файла, и если он больше заданного - создать новый файл;
- -D - вывести список доступных сетевых интерфейсов;
- -e - выводить информацию уровня соединения для каждого пакета, это может быть полезно, например, для отображения MAC адреса;
- -f - выводить доменное имя для ip адресов;
- -F - читать пакеты из файла, а не интерфейса;
- -G - создавать новый файл лога через указанный промежуток времени;
- -H - обнаруживать заголовки 802.11s;
- -i - имя интерфейса для перехвата пакетов. Вы можете захватывать пакеты со всех интерфейсов, для этого укажите any;
- -I - переключить интерфейс в режим монитора для захвата всех проходящих пакетов;
- -j - установить формат Timestamp для записи пакетов;
- -J - посмотреть доступные Timestamp;
- -K - не проверять контрольные суммы пакетов;
- -l - добавить поддержку прокрутки к выводу;
- -L - вывести поддерживаемые протоколы подключения для интерфейса;
- -n - не отображать доменные имена;
- -r - прочитать пакеты из файла, созданного с помощью -w;
- -v, -vv, -vvv - более подробный вывод;
- -q - выводить минимум информации;
- -w - записать вывод в файл;
- -Z - пользователь, от имени которого будут создаваться файлы.
Примеры
Анализ DNS трафика
$ tcpdump -i eth0 -s0-w resolv.pcap port 53
Анализ трафика HTTP сервера
$ tcpdump -An tcp port 80
Анализ PHP-FPM на 9000 порту
$ tcpdump -nAs20000-i lo tcp port 9000
Анализирует траффик удаленно через SSH с помощью Wireshark
$ ssh root@HOST tcpdump -U-s0-w - 'not port 22'| wireshark -k-i -
UDP трафик с и на IP xxx.xxx.xxx.251 destined for port 5060:
$ tcpdump -nnvvS udp and host xxx.xxx.xxx.251 and dst port 5060
Записать в файл mbill251 весь трафик с хоста xxx.xxx.xxx.251 за исключением трафика ssh
$ tcpdump -n-i eth0 host xxx.xxx.xxx.251 -vvv and not port 22-w/home/mbill251
Прослушать порт 5060 с ip xxx.xxx.xxx.251
$ tcpdump -i eth0 -n-s0 port 5060 and host xxx.xxx.xxx.251 -vvv-w/usr/local/tcpdumplog/log $ tcpdump -i eth0 -n-s0 port 1720 and host xxx.xxx.xxx.251 -vvv-w/usr/local/tcpdumplog
H.323 сигналинг ловим с двух IP. В таком виде с двух IP отказалось снимать, может быть OR нужно было поставить.
$ tcpdump -i eth0 -n-s0 port 1720 and host xxx.xxx.164.1 and host xxx.xxx.107.1 -vvv-w/usr/local/tcpdumplog/logfile
перечислить доступные интерфейсы (которые можно прослушивать при помощи опции -i)
$ tcpdump -D
посмотреть трафик одного хоста:
$ tcpdump host 1.2.3.4
посмотреть трафик на порте:
$ tcpdump src port 80
посмотреть IP трафик на хост:
$ tcpdump ip host 1.2.3.4
посмотреть ARP трафик на хост:
$ tcpdump arp host 1.2.3.4
посмотреть RARP трафик на хост:
$ tcpdump rarp host 1.2.3.4
посмотреть трафик, кроме хоста unixserver:
$ tcpdump not host unixserver
посмотреть трафик на server1 и server2
$ tcpdump host server1 or host server2
посмотреть содержимое пакетов на интерфейсе tun0 на хост ya.ru
$ tcpdump -X-i tun0 host ya.ru
подсмотреть номера и пароли к icq
$ tcpdump -X-i fxp1 port aol
посмотреть содержимое пакетов на интерфейсе tun0 на хост ya.ru
посмотреть содержимое пакетов на интерфейсе tun0 на хост ya.ru, при этом прочитать из каждого пакета по 1500 байт и не преобразовывать IP в имя хоста
$ tcpdump -X-s1500-n-i tun0 host ya.ru
TCP traffic from 10.5.2.3 destined for port 3389:
$ tcpdump -nnvvS tcp and src 10.5.2.3 and dst port 3389
Traffic originating from the 192.168 network headed for the 10 or 172.16 networks:
$ tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16
Non-ICMP traffic destined for 192.168.0.2 from the 172.16 network:
$ tcpdump -nvvXSs1514 dst 192.168.0.2 and src net 172.16.0.0/16 and not icmp $ tcpdump -nvvvpi rl0 tcp and not port ssh and not port smtp
tcpdump на unix socket
nano ./host.conf, затем перезапускаем nginx
fastcgi_pass unix:/tmp/php-fpm.sock.socat;
Запускаем снифер и смотрим вывод
$ socat -t100-x-v UNIX-LISTEN:/tmp/php-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT:/tmp/php-fpm.sock
Заголовок
$ tcpdump -i eth1 tcp and host 10.27.13.14 and port 6973-s0-vv-X-c1000
Ссылки
DBeaver - [Unknown table 'COLUMN_STATISTICS' in information_schema (1109)]
DBeaver
Universal Database Tool Free multi-platform database tool for developers, database administrators, analysts and all people who need to work with databases. Supports all popular databases: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Apache Hive,
Ошибки
Unknown table 'COLUMN_STATISTICS' in information_schema (1109)
Samba 2/3/4 Установка и настройка - [Samba 2/3/4 Установка и настройка]
Samba 2/3/4 Установка и настройка
[global] client min protocol = SMB2 client max protocol = SMB3
Конфигурация
Основные параметры
- guest ok = Yes – для подключения к ресурсу не требуется пароль
- guest account [UserName] – указанный пользователь UNIX будет получать доступ к ресурсу
- guest only = Yes – разрешить только гостевые соединения к общему ресурсу
- available = yes
- read only = no
- browsable = yes
- public = yes
- writable = yes – можно записывать и удалять
- create mask = 0664 - с этими правами будут создаваться файлы
- directory mask = 0755 - с этими правами будут создаваться директории
- force user = site - действия будут происходить от этого пользователя
- force group = www-data
Переменные
Переменная | Описание |
---|---|
%U | имя пользователя сессии (имя пользователя, которое клиент хотел, не обязательно то же самое как то, которое он получил). |
%G | имя основной группы для %U. |
%h | Интернет имя хоста где запущена Samba. |
%m | NetBIOS имя клиентской машины (очень полезно) Этот параметр недоступен когда Samba слушает на 445 порту, т.к. клиенты больше не посылают эту информацию. Если вы используете этот макрос, то в разделе [global] установите smb ports = 139. Это заставит Самбу не слушать на порту 445 и разрешит, включит функциональные возможности Samba 2.x. |
%L | NetBIOS имя сервера. Это позволяет вам изменять вашу конфигурацию под клиента. У вашего сервера может быть «Раздвоение личности». |
%M | интернет имя клиентской машины. |
%R | Выбранный уровень протокола после протокольных переговоров. Это может быть один из CORE, COREPLUS, LANMAN1, LANMAN2 or NT1. |
%d | процесс id текущего процесса сервера. |
%a | архитектура удаленной машины. В настоящее время признаются Samba (Samba), the Linux CIFS file system (CIFSFS), OS/2, (OS2), Windows for Workgroups (WfWg), Windows 9x/ME (Win95), Windows NT (WinNT), Windows 2000 (Win2K), Windows XP (WinXP), and Windows 2003 (Win2K3). Остальные определяются как UNKNOWN. |
%I | IP адрес клиентской машины. |
%i | Локальный IP адрес с которым соединился клиент. |
%T | текущая дата и время. |
%D | имя домена или рабочей группы для текущего пользователя. |
%w | Разделитель winbind |
%$(envvar) | значение переменной envar. |
Следующие замены применяются только к некоторым вариантам конфигурации (только когда связь была установлена):
Переменная | Описание |
---|---|
%S | имя текушего сервиса для всех. |
%P | корневая директория текущего сервиса для всех. |
%u | имя пользователя для текущего сервися для всех. |
%g | основная группа для %u. |
%H | домашняя директория для пользователя %u. |
%N | имя вашего NIS сервера домашних директорий. Это получено с вашего NIS auto.map entry. Если вы не компилировали Samba c with-automount опцией, это значение принимается как %L. |
%p | путь к сервису домашних директорий, полученный с вашего NIS auto.map entry. NIS auto.map записи разделяются как %N:%p. |
Проверка
$ testparm -S
WINDOWS (net use)
c:\ net use <driveletter>: \\<server>\<sharename> /USER:<domain>\<username> <password> /PERSISTENT:YES
Список
c:\ net use Новые подключения будут запомнены. Состояние Локальный Удаленный Сеть ------------------------------------------------------------------------------- OK K: \\NAS\User Microsoft Windows Network
Подключение
c:\ net use k: \\NAS\User
c:\ net use k: \\NAS\User /USER:mirocow pass
Отключение
c:\ net use k: /delete
c:\ net use \\NAS\User /delete
Ошибки
C:\Windows\system32>net use v: \\NAS\User /USER:www-data pass Системная ошибка 7054. Число разрешенных подключений к этому компьютеру ограничено, и все подключения в данный момент уже используются. Попробуйте подключиться позже или обратитесь к системному администратору.
smbclient
Параметры
Параметр | Описание |
---|---|
L host | Флаг выводит на экран список сервисов, доступных на сервере, заданном параметром host; при использовании этого флага нет необходимости указывать ресурс |
-I IP_address-N | Флаг полезен, если не может быть найден адрес по имени; smbclient полагает, что компьютер расположен по указанному ГР-адресу |
-U usemame | Флаг подавляет приглашение password. Особенно полезен, когда доступ к ресурсу осуществляется без пароля. Если этот флаг не установлен, а пароль не требуется, пользователь все же получает приглашение для ввода и должен нажимать клавишу Enter для ввода пустого пароля Используя этот флаг, можно указать username для установки соединения с ресурсом. Без этого флага сервер использует содержимое переменных среды USER или LOGNAME; и если они пустые, сервер не получает username. Отправить пароль к серверу можно, введя знак процента (%) после username, а затем введя пароль: -U username%pas sword Определяет, какая рабочая группа используется при соединении с сервером |
-W workgroup-Т taroptions | Позволяет перемещать данные в tar-файл локальной системы Linux и обратно. Например, -Тх backup . tar восстанавливает файлы из backup . tar на удаленном ресурсе, в то время как -Тс backup . tar создает tar-файл с именем backup . tar, содержащий все файлы и каталоги удаленного ресурса |
-c 'dir' | Выполняет команды операций с файлами |
Команды операций с файлами
Команда | Описание |
---|---|
cd directory | Переход в другой каталог 8MB совместно используемого ресурса |
del file | Удаление указанного файла с сервера (также используется команда rm) |
dir | Отображение содержимого текущего каталога сервера (также используется команда Is) |
get file | Получение указанного файла с удаленного сервера и сохранение его с тем же именем в текущем каталоге локальной системы; можно задать другое имя для файла на локальной системе: getfile localfilename |
lcd directory | Переход в указанный каталог на локальной системе |
mget filemask | Получение всех файлов на удаленном сервере, удовлетворяющих указанной маске файла |
mkdir directory | Создание указанного каталога на удаленном сервере (также используется команда md) |
mput filemask | Копирование всех файлов локального каталога, удовлетворяющих указанной маске файла, в текущий каталог удаленного сервера |
prompt | Включение/выключение подсказки для операций с несколькими файлами (mput и mget). При задании значения on пользователи получают подсказку при копировании каждого файла |
put file | Копирование указанного файла из текущего локального каталога в текущий каталог на удаленном сервере, имя файла остается прежним. Имя файла на удаленном сервере можно изменить: putfile remote filename |
quit | Выход из программы smbclient (также используется команда exit) |
recurse | Включает/выключает доступ к подкаталогам для операций с несколькими файлами (mput и mget). Когда задано значение on, команда при копировании файлов осуществляет поиск по всем подкаталогам текущего каталога |
rm dirdirectory | Удаление каталога с удаленного сервера (также используется команда rd) |
Примеры
Посмотреть
$ smbclient -L//NAS/Home -U mirocow%pass -W HOME
$ smbclient -U mirocow%pass //NAS/DISK1 --directory/DOWNLOAD -c'dir'
$ smbclient -U MIROCOW-PC/mirocow%pass //NAS/User --directory/-c'dir'
Скачать
$ smbclient -U mirocow%pass //NAS/DISK1 --directory/DOWNLOAD -c'get "Lua.zip"'
Залить
$ smbclient -U mirocow%pass //NAS/DISK1 --directory/DOWNLOAD -c'put "Lua.zip"'
smbpasswd
Создание нового пользователя:
$ smbpasswd -a User_name
Смена пароля у существующего пользователя:
$ smbpasswd User_name
Удаление существующего пользователя:
$ smbpasswd -x User_name
Приостановить действие учетной записи без удаления:
$ smbpasswd -d User_name
Возобновить действие учетной записи:
$ smbpasswd -e User_name
Подключение данного компьютера к существующему домену:
$ smbpasswd -j Domain_name -U Administrator_name
Ошибки
tree connect failed: NT_STATUS_ACCESS_DENIED
Документация
Ссылки
Cron - [Parametrs / Параметры]
Cron
Format / Crontab формат
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
Parametrs / Параметры
- */30 - Запускать каждые 30 минут
- crontab -l - вывести список заданий
- crontab -u - пользователь (root, somebody)
- crontab -e - редактирование пользовательского расписания