init
This commit is contained in:
BIN
Markdown.docx
Normal file
BIN
Markdown.docx
Normal file
Binary file not shown.
BIN
Markdown.pdf
Normal file
BIN
Markdown.pdf
Normal file
Binary file not shown.
30
OnlyOffice.md
Normal file
30
OnlyOffice.md
Normal file
@@ -0,0 +1,30 @@
|
||||
**OnlyOffice + Nextcloud**
|
||||
|
||||
Условия:
|
||||
1. Сервер на Ubuntu 18.04
|
||||
2. Docker
|
||||
3. RAM 6 Гб
|
||||
|
||||
Устанавливаем Docker по этой инструкции
|
||||
https://www.8host.com/blog/ustanovka-i-ispolzovanie-docker-v-ubuntu-18-04/
|
||||
|
||||
Установка серверной версии Community Edition с помощью скрипта
|
||||
https://helpcenter.onlyoffice.com/ru/server/docker/opensource/opensource-script-installation.aspx
|
||||
*Ставил только сервер документов*
|
||||
|
||||
Скрипт изменился, теперь он называется `workspace-install.sh`
|
||||
|
||||
Скачиваем скрипт установки
|
||||
~~`wget http://download.onlyoffice.com/install/opensource-install.sh`~~
|
||||
`wget https://download.onlyoffice.com/install/workspace-install.sh`
|
||||
|
||||
Следующая команда выводит список всех доступных параметров скрипта:
|
||||
~~`bash opensource-install.sh -h`~~
|
||||
`sudo bash workspace-install.sh -h`
|
||||
|
||||
Выбираем ту строку, где только сервер документов
|
||||
Для обновления до актуальной версии также смотрим в параметрах
|
||||
Для связки с Nextcloud, в настройках Nextcloud необходимо указать внешние ссылки сервера документов типа:
|
||||
https://office.da2001.ru
|
||||
https://cloud.da2001.ru
|
||||
|
||||
55
Proxmox/Proxmox Cloud-Init Support.md
Normal file
55
Proxmox/Proxmox Cloud-Init Support.md
Normal file
@@ -0,0 +1,55 @@
|
||||
### Proxmox Cloud-Init Support
|
||||
|
||||
https://pve.proxmox.com/wiki/Cloud-Init_Support
|
||||
|
||||
https://cloud-images.ubuntu.com
|
||||
|
||||
```bash
|
||||
# download the image
|
||||
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
|
||||
|
||||
# create a new VM
|
||||
qm create 3000 --memory 1024 --net0 virtio,bridge=vmbr1
|
||||
qm set 3000 --name ubuntu
|
||||
|
||||
# import the downloaded disk to local-lvm storage
|
||||
qm importdisk 3000 focal-server-cloudimg-amd64.img local-lvm
|
||||
|
||||
# finally attach the new disk to the VM as scsi drive
|
||||
qm set 3000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-3000-disk-0
|
||||
```
|
||||
|
||||
###### Add Cloud-Init CD-ROM drive
|
||||
The next step is to configure a CD-ROM drive, which will be used to pass the Cloud-Init data to the VM.
|
||||
```bash
|
||||
qm set 3000 --ide2 local-lvm:cloudinit
|
||||
```
|
||||
|
||||
To be able to boot directly from the Cloud-Init image, set the bootdisk parameter to scsi0, and restrict BIOS to boot from disk only. This will speed up booting, because VM BIOS skips the testing for a bootable CD-ROM.
|
||||
```bash
|
||||
qm set 3000 --boot c --bootdisk scsi0
|
||||
```
|
||||
|
||||
Also configure a serial console and use it as a display. Many Cloud-Init images rely on this, as it is an requirement for OpenStack images.
|
||||
```bash
|
||||
qm set 3000 --serial0 socket --vga serial0
|
||||
```
|
||||
|
||||
In a last step, it is helpful to convert the VM into a template. From this template you can then quickly create linked clones. The deployment from VM templates is much faster than creating a full clone (copy).
|
||||
```bash
|
||||
qm template 3000
|
||||
```
|
||||
|
||||
|
||||
###### Deploying Cloud-Init Templates
|
||||
|
||||
You can easily deploy such a template by cloning:
|
||||
```bash
|
||||
qm clone 3000 171 --name us171
|
||||
```
|
||||
|
||||
Then configure the SSH public key used for authentication, and configure the IP setup:
|
||||
```bash
|
||||
qm set 171 --sshkey ~/.ssh/id_rsa.pub
|
||||
qm set 171 --ipconfig0 ip=192.168.10.171/24,gw=192.168.10.9
|
||||
```
|
||||
13
Proxmox/Proxmox to KVM.md
Normal file
13
Proxmox/Proxmox to KVM.md
Normal file
@@ -0,0 +1,13 @@
|
||||
Для конвертации резервной копии ВМ из Proxmox
|
||||
Ставим на виртуалку Proxmox, подключаемся к его консоли и:
|
||||
|
||||
1) Разархивируем образ
|
||||
`lzop -d /mnt/pve/qbackvm/100.vma.lzo /home/100.vma`
|
||||
|
||||
2) Конвертируем в raw
|
||||
`vma extract /home/100.vma -v /home/raw`
|
||||
|
||||
3) Конвертируем в qcow2
|
||||
`qemu-img convert -f raw -O qcow2 /home/raw/100.raw /home/100.qcow2`
|
||||
|
||||
Далее в kvm создаем ВМ и подставляем `100.qcow2` в качестве загрузочного диска
|
||||
91
Proxmox/Proxmox_add_hdd_to_vm.md
Normal file
91
Proxmox/Proxmox_add_hdd_to_vm.md
Normal file
@@ -0,0 +1,91 @@
|
||||
### Proxmox, подключение физического жесткого диска в виртуальную машину
|
||||
|
||||
1. В общем случае это можно сделать одной простой командой:
|
||||
```
|
||||
qm set <vm_id> -[virtio|sata|ide|scsi][№] /dev/sd[a|b|c|...]
|
||||
```
|
||||
где:
|
||||
```
|
||||
vm_id — номер виртуальной машины (в интерфейсе Proxmox указывается перед именем VM
|
||||
-[virtio|sata|ide|scsi][№] — допустимый тип и номер HDD интерфейса
|
||||
/dev/sd[a|b|c…] — пробрасывоемое физическое устройство
|
||||
```
|
||||
**Но при таком подходе может случится, что в систему прокинется не тот диск, если перепутать порты на материнской
|
||||
плате, поэтому гораздо эффективней пробросить устройство по его id.**
|
||||
|
||||
Найдем id нашего диска:
|
||||
```
|
||||
ls -l /dev/disk/by-id/
|
||||
```
|
||||
|
||||
```
|
||||
da2001@Metromint:~$ ls -l /dev/disk/by-id/
|
||||
итого 0
|
||||
lrwxrwxrwx 1 root root 9 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK -> ../../sda
|
||||
lrwxrwxrwx 1 root root 10 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK-part1 -> ../../sda1
|
||||
lrwxrwxrwx 1 root root 10 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK-part2 -> ../../sda2
|
||||
lrwxrwxrwx 1 root root 10 июн 9 09:58 ata-ST1000LM035-1RK172_ZDEH8TVK-part3 -> ../../sda3
|
||||
lrwxrwxrwx 1 root root 13 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A -> ../../nvme0n1
|
||||
lrwxrwxrwx 1 root root 15 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A-part1 -> ../../nvme0n1p1
|
||||
lrwxrwxrwx 1 root root 15 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A-part3 -> ../../nvme0n1p3
|
||||
lrwxrwxrwx 1 root root 15 июн 9 09:58 nvme-HFM256GDJTNG-8310A_NJ93N253310403M4A-part4 -> ../../nvme0n1p4
|
||||
```
|
||||
|
||||
```
|
||||
qm set 150 -virtio2 /dev/disk/by-id/ata-ST1000LM035-1RK172_ZDEH8TVK
|
||||
```
|
||||
|
||||
2. Прописать в конфигурационный файл
|
||||
*конфигурационные файлы виртуальных машин лежат по пути*
|
||||
```
|
||||
/etc/pve/qemu-server
|
||||
```
|
||||
|
||||
```
|
||||
root@pve:/etc/pve/qemu-server# ls -l
|
||||
итого 6
|
||||
-rw-r----- 1 root www-data 851 июн 9 13:06 100.conf
|
||||
-rw-r----- 1 root www-data 504 янв 10 12:11 101.conf
|
||||
-rw-r----- 1 root www-data 490 янв 17 11:51 102.conf
|
||||
-rw-r----- 1 root www-data 310 июн 8 02:27 103.conf
|
||||
-rw-r----- 1 root www-data 544 июн 9 13:06 104.conf
|
||||
-rw-r----- 1 root www-data 333 мар 29 10:08 105.conf
|
||||
-rw-r----- 1 root www-data 344 июн 8 02:34 106.conf
|
||||
-rw-r----- 1 root www-data 731 июн 9 13:06 107.conf
|
||||
-rw-r----- 1 root www-data 334 мая 14 09:16 108.conf
|
||||
-rw-r----- 1 root www-data 368 июл 28 2020 109.conf
|
||||
-rw-r----- 1 root www-data 330 июн 8 20:24 110.conf
|
||||
-rw-r----- 1 root www-data 588 июн 9 13:06 112.conf
|
||||
```
|
||||
Выбираем необходимую виртуалку
|
||||
```
|
||||
vi 100.conf
|
||||
```
|
||||
Добавляем нужный диск
|
||||
```
|
||||
scsi1: /dev/disk/by-id/ata-ST2000VN000-1HJ164_W7200J60,backup=0
|
||||
```
|
||||
|
||||
```
|
||||
agent: 1,fstrim_cloned_disks=1
|
||||
boot: cdn
|
||||
bootdisk: scsi0
|
||||
cores: 2
|
||||
ide2: none,media=cdrom
|
||||
memory: 4096
|
||||
name: S-DNAS
|
||||
net0: virtio=F6:79:BA:89:90:D5,bridge=vmbr0,firewall=1
|
||||
numa: 0
|
||||
onboot: 1
|
||||
ostype: l26
|
||||
protection: 1
|
||||
scsi0: local-lvm:vm-100-disk-0,size=32G
|
||||
scsi1: /dev/disk/by-id/ata-ST2000VN000-1HJ164_W7200J60,backup=0
|
||||
scsi2: /dev/disk/by-id/ata-ST2000VN000-1HJ164_W7201D04,backup=0
|
||||
scsihw: virtio-scsi-pci
|
||||
smbios1: uuid=0a43c8e8-33f0-4472-9508-2b4b3d3c196f
|
||||
sockets: 1
|
||||
spice_enhancements: foldersharing=1
|
||||
vga: qxl
|
||||
vmgenid: 2d5bb546-186a-4b01-b469-94f3c56224be
|
||||
```
|
||||
4
Proxmox/proxmox_iso_path.md
Normal file
4
Proxmox/proxmox_iso_path.md
Normal file
@@ -0,0 +1,4 @@
|
||||
**образы iso по-умолчанию лежат в папке**
|
||||
```
|
||||
/var/lib/vz/template/iso
|
||||
```
|
||||
BIN
Proxmox/Настройка Proxmox 6.docx
Normal file
BIN
Proxmox/Настройка Proxmox 6.docx
Normal file
Binary file not shown.
BIN
Proxmox/Настройка Proxmox 6.pdf
Executable file
BIN
Proxmox/Настройка Proxmox 6.pdf
Executable file
Binary file not shown.
61
alias.md
Normal file
61
alias.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# Создание псевдонимов (alias) для часто используемых команд
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Общее](#общее)
|
||||
- [Подключение к сессии Tmux при подключении по SSH](#подключение-к-сессии-tmux-при-подключении-по-ssh)
|
||||
|
||||
## Общее
|
||||
|
||||
Все алиасы прописываются для конкретного пользователя в файле `~/.bashrc`
|
||||
_например, чтобы вывести данные по IP в цвете необходимо ввести `ip --color=auto a`_
|
||||
можно создать такой алиас: `alias ip='ip --color=auto'`
|
||||
|
||||
**Перелогиниться** и теперь при вводе `ip a` вывод будет цветной
|
||||
|
||||
Таким образом можно делать псевдонимы для любых команд:
|
||||
|
||||
```bash
|
||||
alias ll='ls -l'
|
||||
alias upd='apt update && apt upgrade -y && apt autoremove -y'
|
||||
```
|
||||
|
||||
Кроме алиасов в .bashrc можно добавлять целые функции:
|
||||
|
||||
```bash
|
||||
wanip() {
|
||||
wget -q -O - checkip.dyndns.com | awk '{print $6}'| sed 's/<.*>//'
|
||||
}
|
||||
```
|
||||
|
||||
_перелогиниться_. Функция отображает внешний IP
|
||||
|
||||
```bash
|
||||
pi@testberry:~ $ wanip
|
||||
85.143.252.68
|
||||
```
|
||||
|
||||
**_А лучше вынести в отдельный файл, для этого в `.bashrc` добавить_**
|
||||
|
||||
```bash
|
||||
if [ -f ~/.bash_func ]; then
|
||||
. ~/.bash_func
|
||||
fi
|
||||
```
|
||||
|
||||
`.bash_func` — имя файла, где и будем писать функции.
|
||||
|
||||
[⬆ Наверх](#содержание)
|
||||
|
||||
## Подключение к сессии Tmux при подключении по SSH
|
||||
|
||||
В конец файла `.bashrc` добавить:
|
||||
|
||||
```bash
|
||||
# start tmux session for all ssh connections
|
||||
if [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]]; then
|
||||
tmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
|
||||
fi
|
||||
```
|
||||
|
||||
[⬆ Наверх](#содержание)
|
||||
862
ansible.md
Normal file
862
ansible.md
Normal file
@@ -0,0 +1,862 @@
|
||||
###### top
|
||||
## Ansible
|
||||
[Официальная документация](https://docs.ansible.com/ansible/latest/user_guide/)
|
||||
|
||||
***
|
||||
|
||||
[Базовые понятия Ansible](#part1)
|
||||
- [inventory](#chapter1)
|
||||
- [Модули](#chapter2)
|
||||
- [Ad-hoc команды](#chapter3)
|
||||
|
||||
[Ansible playbook](#part2)
|
||||
- [Простой playbook](#chapter4)
|
||||
- [Переменные](#chapter5)
|
||||
- [Отладка](#chapter6)
|
||||
- [Блоки и обработка ошибок](#chapter7)
|
||||
- [Асинхронные задачи](#chapter8)
|
||||
- [Пример playbook - установка Docker + Docker-compose](#chapter9)
|
||||
- [](#chapter10)
|
||||
- [](#chapter11)
|
||||
- [](#chapter12)
|
||||
|
||||
***
|
||||
|
||||
###### part1
|
||||
## Базовые понятия Ansible
|
||||
[вверх](#top)
|
||||
|
||||
Установить ansible можно с помощью пакетного менеджера, будет установлена версия, которая есть в репозиториях дистрибутива, скорее всего, эта версия не будет являться последней.
|
||||
При установке через пакетный менеджер будет создана папка с параметрами по-умолчанию по пути `/etc/ansible/`.
|
||||
|
||||
Также, ansible можно установить с помощью pip. Будет установлена последняя версия, но папка с параметрами по-умолчанию создана не будет.
|
||||
|
||||
###### Chapter1
|
||||
### inventory
|
||||
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#intro-inventory
|
||||
|
||||
Описание хостов, на которых необходимо выполнять какие-то действия производится в файле inventory.
|
||||
Синтаксис файла может быть в виде `ini` или `yaml` форматов.
|
||||
|
||||
Пример описания inventory с использованием ini
|
||||
```dosini
|
||||
my.domain.com
|
||||
|
||||
[mygroup]
|
||||
domain.com
|
||||
app.domain.com
|
||||
|
||||
[dbservers]
|
||||
db.domain.com
|
||||
```
|
||||
|
||||
Пример описания inventory с использованием yaml
|
||||
```yaml
|
||||
all:
|
||||
hosts:
|
||||
my.domain.com:
|
||||
children:
|
||||
mygroup:
|
||||
hosts:
|
||||
domain.com:
|
||||
app.domain.com:
|
||||
dbservers:
|
||||
hosts:
|
||||
db.domain.com:
|
||||
```
|
||||
|
||||
Указывать хосты можно в виде диапазона
|
||||
```dosini
|
||||
[webservers]
|
||||
www[01:50].example.com
|
||||
```
|
||||
|
||||
Для удобства хостам можно задавать свои имена и передавать переменные которые будут доступны на хостах
|
||||
```dosini
|
||||
[db]
|
||||
mydb env=production replicas=2
|
||||
```
|
||||
|
||||
Можно указать параметры подключения
|
||||
```dosini
|
||||
[db]
|
||||
myhost ansible_port=222 ansible_host=192.168.1.23
|
||||
```
|
||||
|
||||
Переменные можно указать для группы хостов
|
||||
```dosini
|
||||
[db]
|
||||
db1.com
|
||||
db2.com
|
||||
|
||||
[db:vars]
|
||||
env=production
|
||||
```
|
||||
|
||||
В inventory можно указать параметры подключения
|
||||
```
|
||||
ansible_connection
|
||||
ansible_host
|
||||
ansible_port
|
||||
ansible_user
|
||||
ansible_password
|
||||
```
|
||||
|
||||
Параметры подключения ssh/sftp/scp
|
||||
```
|
||||
ansible_ssh_private_key_file
|
||||
ansible_ssh_common_args
|
||||
ansible_ssh_extra_args
|
||||
ansible_ssh_pipelining
|
||||
ansible_ssh_executable
|
||||
|
||||
ansible_scp_extra_args
|
||||
ansible_sftp_extra_args
|
||||
```
|
||||
|
||||
Привилегии
|
||||
```
|
||||
ansible_become
|
||||
ansible_become_method
|
||||
ansible_become_user
|
||||
ansible_become_password
|
||||
ansible_become_exe
|
||||
ansible_become_flags
|
||||
```
|
||||
|
||||
Настройки shell
|
||||
```
|
||||
ansible_shell_type
|
||||
ansible_python_interpreter
|
||||
ansible_shell_executable
|
||||
```
|
||||
|
||||
Пример файла inventory
|
||||
```bash
|
||||
user@host$ cat hosts.ini
|
||||
```
|
||||
|
||||
```dosini
|
||||
[deploy]
|
||||
us1 ansible_host=192.168.10.151
|
||||
|
||||
[managers]
|
||||
us2 ansible_host=192.168.10.152
|
||||
us3 ansible_host=192.168.10.153
|
||||
|
||||
[workers]
|
||||
us154 ansible_host=192.168.10.154
|
||||
us155 ansible_host=192.168.10.155
|
||||
|
||||
[all:vars]
|
||||
ansible_user=da2001
|
||||
ansible_port=22
|
||||
ansible_ssh_private_key_file=~/.ssh/id_rsa.pub
|
||||
```
|
||||
|
||||
Пользовательский файл инвентаря
|
||||
*Файл инвентаря по-умолчанию обычно находится в /etc/ansible/hosts, но можно использовать опцию `-i` для указания пользовательских файлов при запуске команд и плейбуков Ansible. Это удобный способ настройки индивидуального инвентаря для каждого проекта, который можно включить в системы контроля версий, такие как Git:*
|
||||
```bash
|
||||
ansible all -m ping -i my_custom_inventory
|
||||
```
|
||||
Такая опция действительна и для ansible-playbook:
|
||||
```bash
|
||||
ansible-playbook myplaybook.yml -i my_custom_inventory
|
||||
```
|
||||
Динамический файл инвентаря
|
||||
*Ansible поддерживает сценарии инвентаризации для создания динамических файлов. Это полезно если инвентарь часто меняется, когда серверы создаются и уничтожаются.*
|
||||
|
||||
*Существуют готовые скрипты с открытым исходным кодом в официальном репозитории [Ansible GitHub](https://github.com/ansible/ansible). После загрузки требуемого сценария на Ansible control machine и настройки необходимых параметров (например, учетных данных API) можно запустить исполняемый файл в качестве пользовательского инвентаря с любой командой Ansible, которая поддерживает эту опцию.*
|
||||
|
||||
*Следующая команда использует скрипт инвентаря my_inventory.py с командой ping для проверки подключения ко всем текущим активным серверам:*
|
||||
```bash
|
||||
ansible all -m ping -i my_inventory.py
|
||||
```
|
||||
*Как использовать динамические файлы инвентаризации описано в [официальной документации Ansible](https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html).*
|
||||
|
||||
Инвентарь можно описывать в отдельной папке и группировать хосты в отдельных файлах.
|
||||
*например, можно создать папку `hosts`, в ней папку `bd` и уже в этой папке создавать файлы с описанием хостов*
|
||||
Запуск в этом случае будет выглядеть так:
|
||||
```bash
|
||||
ansible -i hosts -m ping
|
||||
```
|
||||
или
|
||||
```bash
|
||||
ansible -i bd -m ping
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### Chapter2
|
||||
### Модули
|
||||
|
||||
https://docs.ansible.com/ansible/latest/user_guide/modules.html
|
||||
|
||||
Пример использования модулей
|
||||
```bash
|
||||
ansible webservers -m service -a "name=httpd state=started"
|
||||
```
|
||||
```bash
|
||||
ansible webservers -i /home/user/ansible/hosts.ini -m command -a "/sbin/reboot -t now"
|
||||
```
|
||||
|
||||
[Список доступных модулей на сайте Ansible](https://docs.ansible.com/ansible/2.8/modules/list_of_all_modules.html)
|
||||
*описание модулей можно получить в cli, для этого используется команда*
|
||||
```bash
|
||||
ansible-doc -l
|
||||
```
|
||||
*будет выведен список доступных модулей в less подобном отображении*
|
||||
|
||||
Документация по конкретному модулю `ansible-doc <название модуля>`
|
||||
```bash
|
||||
ansible-doc user
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### Chapter3
|
||||
### Ad-hoc команды
|
||||
|
||||
https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html
|
||||
|
||||
Структура команды
|
||||
```bash
|
||||
ansible -i hosts -m user -a "name=student state=present" all
|
||||
^ ^ ^ ^
|
||||
| | | |
|
||||
инвентарь | аргументы используемые хосты
|
||||
модуль
|
||||
```
|
||||
|
||||
Создание пользователя на хостах
|
||||
*если пользователь существует, вернётся сообщение зеленого цвета*
|
||||
*если пользователь не существует, ansible попытается его создать. Если команда была запущена не от root, вернётся сообщение красного цвета типа __Pemission denied__*
|
||||
```bash
|
||||
ansible -i hosts.ini -m user -a "name=da2001 state=present" all
|
||||
```
|
||||
*создать нового пользователя с повышением привилегий - sudo*
|
||||
```bash
|
||||
ansible -i hosts.ini -m user -a "name=student state=present" -b -K all
|
||||
```
|
||||
`-b` - команда должна выполняться с привилегиями sudo
|
||||
`-K` - запрашивать пароль sudo перед выполнением команды
|
||||
|
||||
*удалить пользователя*
|
||||
```bash
|
||||
ansible -i hosts.ini -m user -a "name=student state=absent" -b -K all
|
||||
```
|
||||
|
||||
*передать sudo пароль в виде аргументов - extra args*
|
||||
```bash
|
||||
ansible -i hosts.ini -m user -a "name=student state=present" -e "ansible_become=true ansible_become_password=USER-PASS" all
|
||||
```
|
||||
`USER-PASS` - пароль пользователя для выполнения команды с привилегиями sudo
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### part2
|
||||
## Ansible playbook
|
||||
[вверх](#top)
|
||||
|
||||
https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html
|
||||
|
||||
###### Chapter4
|
||||
### Простой playbook
|
||||
```bash
|
||||
cat user.yml
|
||||
```
|
||||
```bash
|
||||
---
|
||||
- name: user - имя playbook, произвольное
|
||||
hosts: deploy - группа хостов из файла inventory
|
||||
tasks: - задачи, выполняемые в этом плейбуке
|
||||
- name: Create user - имя задачи, произвольное
|
||||
user: - название модуля, который используется в этой задаче
|
||||
name: da2001 - аргументы модуля
|
||||
state: present - аргументы модуля
|
||||
become: true
|
||||
```
|
||||
|
||||
```bash
|
||||
ansible-playbook -i hosts.ini user.yml -K
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### Chapter5
|
||||
### Переменные
|
||||
|
||||
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html
|
||||
|
||||
Переменные можно задавать в:
|
||||
- playbook
|
||||
- block
|
||||
- tasks
|
||||
- group_vars
|
||||
- host_vars
|
||||
- inventory
|
||||
- extra_vars
|
||||
- var_files
|
||||
|
||||
***переменная задаётся в фигурных скобках, обязательно в кавычках***
|
||||
```bash
|
||||
cat user.yml
|
||||
```
|
||||
```yaml
|
||||
---
|
||||
- name: user
|
||||
hosts: deploy
|
||||
tasks:
|
||||
- name: Create user
|
||||
vars:
|
||||
user: da2001
|
||||
user:
|
||||
name: "{{ user }}"
|
||||
state: present
|
||||
become: true
|
||||
```
|
||||
|
||||
Переменная может быть задана во внешнем файле
|
||||
```bash
|
||||
cat myvars.yml
|
||||
```
|
||||
```yaml
|
||||
user: da2001
|
||||
```
|
||||
*в плейбуке необходимо указать файл с переменными*
|
||||
```yaml
|
||||
---
|
||||
- name: user
|
||||
hosts: deploy
|
||||
vars_files:
|
||||
- ./myvars.yml
|
||||
tasks:
|
||||
- name: Create user
|
||||
user:
|
||||
name: "{{ user }}"
|
||||
state: present
|
||||
become: true
|
||||
```
|
||||
|
||||
Вместе с ansible устанавливается плагин, который позволяет считывать переменные из определённых файлов и папок без явного указания этих файлов и папок в плейбуке
|
||||
- `group_vars` - папка в которой нужно создать папку с названием группы, для которой будут задаваться переменные. Например, для группы хостов `deploy` необходимо создать такой путь/файл - `./group_vars/deploy/vars.yml`
|
||||
```bash
|
||||
cat ./group_vars/deploy/vars.yml
|
||||
```
|
||||
```yaml
|
||||
user: da2001
|
||||
```
|
||||
*в самом плейбуке нет необходимости где-то указывать ссылки на файл с переменными*
|
||||
```bash
|
||||
cat user.yml
|
||||
```
|
||||
```yaml
|
||||
---
|
||||
- name: user
|
||||
hosts: deploy
|
||||
tasks:
|
||||
- name: Create user
|
||||
user:
|
||||
name: "{{ user }}"
|
||||
state: present
|
||||
become: true
|
||||
```
|
||||
Если переменные могут использоваться во всех группах, можно создать папку `all` - `./group_vars/all/vars.yml`
|
||||
|
||||
- `host_vars` - папка, в которой создаётся файл с именем хоста - `./host_vars/us1.yml`. Если для хоста имя не задано - `./host_vars/192.168.10.151.yml`
|
||||
- создание переменных в файле инвентаря
|
||||
*для хоста us1 добавлена переменная `user`*
|
||||
```bash
|
||||
cat hosts.ini
|
||||
```
|
||||
```
|
||||
[deploy]
|
||||
us1 ansible_host=192.168.10.151 user=da2001
|
||||
|
||||
[managers]
|
||||
us2 ansible_host=192.168.10.152
|
||||
us3 ansible_host=192.168.10.153
|
||||
|
||||
[workers]
|
||||
us154 ansible_host=192.168.10.154
|
||||
us155 ansible_host=192.168.10.155
|
||||
|
||||
[all:vars]
|
||||
ansible_user=da2001
|
||||
ansible_port=22
|
||||
ansible_ssh_private_key_file=~/.ssh/id_rsa.pub
|
||||
```
|
||||
|
||||
- `--extra-vars` - передача переменных в команде запуска
|
||||
```bash
|
||||
ansible-playbook -i hosts.ini user.yml -K --extra-vars "user=da2001"
|
||||
```
|
||||
|
||||
- `vars-prompt` - ввод переменных в интерактивном режиме при выполнении playbook
|
||||
```bash
|
||||
cat user.yml
|
||||
```
|
||||
```yaml
|
||||
---
|
||||
- name: user
|
||||
hosts: deploy
|
||||
vars_prompt:
|
||||
- name: user
|
||||
prompt: "Введите имя пользователя"
|
||||
private: no
|
||||
tasks:
|
||||
- name: Create user
|
||||
user:
|
||||
name: "{{ user }}"
|
||||
state: present
|
||||
become: true
|
||||
```
|
||||
`private: no` - отображать ли вводимые символы
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### Chapter6
|
||||
### Отладка
|
||||
|
||||
Очень полезно получать в консоль результат выполнения плейбука.
|
||||
1. Один из способов это создание в плейбуке поля `register` с какой-либо переменной для вывода. Далее этот вывод получаем в таске `debug`. Например:
|
||||
```yaml
|
||||
---
|
||||
- name: user
|
||||
hosts: deploy
|
||||
tasks:
|
||||
- name: Create user
|
||||
vars:
|
||||
user: da2001
|
||||
user:
|
||||
name: "{{ user }}"
|
||||
state: present
|
||||
become: true
|
||||
register: output
|
||||
- debug:
|
||||
var: output
|
||||
```
|
||||
После запуска плейбука
|
||||
```bash
|
||||
ansible-playbook -i hosts.ini user.yml -K
|
||||
```
|
||||
к выводу добавится значение таск `debug` с выводом значения созданной нами переменной `output`
|
||||
```json
|
||||
TASK [debug] ***********************************************************************************************************
|
||||
ok: [us1] => {
|
||||
"output": {
|
||||
"append": false,
|
||||
"changed": false,
|
||||
"comment": "da2001",
|
||||
"failed": false,
|
||||
"group": 1000,
|
||||
"home": "/home/da2001",
|
||||
"move_home": false,
|
||||
"name": "da2001",
|
||||
"shell": "/bin/bash",
|
||||
"state": "present",
|
||||
"uid": 1000
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
2. Debugger
|
||||
https://docs.ansible.com/ansible/latest/user_guide/playbooks_debugger.html#playbook-debugger
|
||||
|
||||
| Значение | Результат |
|
||||
|----------------|-----------|
|
||||
| always | всегда вызывать отладчик, независимо от результата |
|
||||
| never | никогда не запускать отладчик, независимо от результата |
|
||||
| on_failed | вызывать отладчик только в случае сбоя задачи |
|
||||
| on_unreachable | вызывать отладчик только в том случае, если хост недоступен |
|
||||
| on_skipped | вызывать отладчик только в том случае, если задача пропущена |
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: user
|
||||
hosts: deploy
|
||||
tasks:
|
||||
- name: Create user
|
||||
vars:
|
||||
user: da2001
|
||||
user:
|
||||
name: "{{ user }}"
|
||||
state: present
|
||||
become: true
|
||||
debugger: always
|
||||
```
|
||||
При наступлении условия, при котором вызывается отладчик, выполнение задачи приостанавливается и отладчик ожидает действий от пользователя
|
||||
```bash
|
||||
user@host:~$ ansible-playbook -i hosts.ini user.yml -K
|
||||
BECOME password:
|
||||
|
||||
PLAY [user] ************************************************************************************************************
|
||||
|
||||
TASK [Gathering Facts] *************************************************************************************************
|
||||
ok: [us1]
|
||||
|
||||
TASK [Create user] *****************************************************************************************************
|
||||
ok: [us1]
|
||||
[us1] TASK: Create user (debug)>
|
||||
```
|
||||
Отладчик принимает команды:
|
||||
|
||||
| Команда | Сокр. вызов | Действие |
|
||||
| -------------------------- | ----------- | ------------------------------------------------------------ |
|
||||
| print | p | напечатать информацию о задаче |
|
||||
| task.args[*key*] = *value* | no shortcut | изменить значение аргумента |
|
||||
| task_vars[*key*] = *value* | no shortcut | изменить значение переменной (далее необходимо выполнить `update_task`) |
|
||||
| update_task | u | повторно создать задачу с обновленными переменными |
|
||||
| redo | r | заново запустить задачу |
|
||||
| continue | c | продолжить выполнение, запуск следующей задачи |
|
||||
| quit | q | выход из отладчика |
|
||||
|
||||
*Примеры:*
|
||||
```
|
||||
[us1] TASK: Create user (debug)> p task
|
||||
TASK: Create user
|
||||
```
|
||||
```
|
||||
[us1] TASK: Create user (debug)> p task.args
|
||||
{'_ansible_check_mode': False,
|
||||
|
||||
...
|
||||
|
||||
'_ansible_version': '2.11.6',
|
||||
'name': 'da2001',
|
||||
'state': 'present'}
|
||||
```
|
||||
```
|
||||
[us1] TASK: Create user (debug)> p task.vars
|
||||
{'user': 'da2001'}
|
||||
```
|
||||
```
|
||||
[us1] TASK: Create user (debug)> p task_vars
|
||||
{'ansible_all_ipv4_addresses': ['192.168.10.151'],
|
||||
|
||||
...
|
||||
|
||||
'playbook_dir': '/home/da2001/ansible/udemy/ansible',
|
||||
'role_names': [],
|
||||
'user': 'da2001'}}
|
||||
```
|
||||
```
|
||||
[us1] TASK: Create user (debug)> p task_vars['user']
|
||||
'da2001'
|
||||
```
|
||||
```
|
||||
[us1] TASK: Create user (debug)> p host
|
||||
us1
|
||||
```
|
||||
```
|
||||
[us1] TASK: Create user (debug)> task_vars['user'] = 'user'
|
||||
[us1] TASK: Create user (debug)> p task_vars['user']
|
||||
'user'
|
||||
[us1] TASK: Create user (debug)> update_task
|
||||
[us1] TASK: Create user (debug)> redo
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### Chapter7
|
||||
### Блоки и обработка ошибок
|
||||
|
||||
Пример блока
|
||||
```yaml
|
||||
---
|
||||
- name: user
|
||||
hosts: deploy
|
||||
tasks:
|
||||
- name: Preconfig block
|
||||
block:
|
||||
- name: Create user
|
||||
vars:
|
||||
user: da2001
|
||||
user:
|
||||
name: "{{ user }}"
|
||||
state: present
|
||||
- name: Install curl
|
||||
apt:
|
||||
name: curl
|
||||
update-cashe: yes
|
||||
become: true
|
||||
```
|
||||
|
||||
Условие выполнения блока
|
||||
*в начале выполнения плейбука, ansible собирает факты о хостах, на основе полученных фактов можно описывать условия выполнения блоков.*
|
||||
Например: добавим условие, при котором блок будет выполняться только если в качестве хоста используется Ubuntu. Для этого в блок нужно добавить:
|
||||
```yaml
|
||||
when: ansible_facts['distribution' == 'Ubuntu']
|
||||
```
|
||||
|
||||
Обработка ошибок
|
||||
```yaml
|
||||
---
|
||||
- name: user
|
||||
hosts: deploy
|
||||
tasks:
|
||||
- name: Preconfig block
|
||||
block:
|
||||
- name: Create user
|
||||
vars:
|
||||
user: da2001
|
||||
user:
|
||||
name: "{{ user }}"
|
||||
state: present
|
||||
register: error
|
||||
- name: Install curl
|
||||
apt:
|
||||
name: curl
|
||||
update-cashe: yes
|
||||
register: error
|
||||
become: true
|
||||
rescue:
|
||||
- name: Some error print
|
||||
debug:
|
||||
var: error
|
||||
always:
|
||||
- name: Reboot
|
||||
debug:
|
||||
msg: "Rebooooooting"
|
||||
```
|
||||
Обработка ошибок происходит в блоке `rescue`. В каждом задании мы определили `register: error` - переменную, которая будет отображаться при возникновении ошибки. Т.к. в блоке `rescue` определена единственная переменная `var: error` - она будет выводиться при ошибке в любом задании. Для каждого задания можно определить свою переменную.
|
||||
|
||||
Блок `always` будет выполняться всегда, вне зависимости от того, были ошибки в заданиях или нет.
|
||||
|
||||
**Другие возможности управления ошибками**
|
||||
- `any_errors_fatal` - true/false. Если установлено значение `true` - появление любой ошибки будет приводить к остановке плейбука, `false` - имеет обратное значение, плейбук попытается продолжить своё выполнение при любых ошибках.
|
||||
- `ignore_errors` - true/false. В некоторых задачах можно установить параметр, чтобы игнорировать возникающие ошибки и перейти к выполнению следующей задачи.
|
||||
|
||||
- принудительный вызов ошибки. Можно создать отдельную задачу, в которой будет перехвачен вывод и будет сымитирована ошибка, которая приведёт к остановке выполнения плейбука. В нужное место плейбука добавить подобную задачу:
|
||||
```yaml
|
||||
- name: Fail on FAILED
|
||||
command: echo "FAILED"
|
||||
register: command_result
|
||||
failed_when: "'FAILED' in command_result.stdout"
|
||||
```
|
||||
*при выполнении этой задачи, команда echo выведет в консоль слово `FAILED`, следующей строкой происходит перехват вывода и проверяется на соответствие условию - `'FAILED' in command_result.stdout`, если условие выполняется, сформируется ошибка и дальнейшее выполнение будет остановлено.*
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### Chapter8
|
||||
### Асинхронные задачи
|
||||
|
||||
Ansible выполняет задачи плейбука последовательно, иногда возникают ситуации, когда есть независимые друг от друга задачи, которые могут выполняться параллельно. Именно для этого используется асинхронный запуск длинных задач.
|
||||
Т.е. задача запускается и ansible отключается от неё, чтобы подождать выполнение или переключиться на другую задачу.
|
||||
*Пример - 1*
|
||||
`async: 1000` - максимальное время в секундах, в течение которого задача должна выполниться
|
||||
`poll: 5` - интервал в секундах, в течение которого ansible будет проверять состояние задачи
|
||||
|
||||
```bash
|
||||
cat async.yml
|
||||
```
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: user
|
||||
hosts: deploy
|
||||
tasks:
|
||||
- name: Preconfig block
|
||||
block:
|
||||
- name: Sleep
|
||||
command: sleep 15
|
||||
async: 1000
|
||||
poll: 5
|
||||
become: true
|
||||
```
|
||||
|
||||
```bash
|
||||
user@host:~$ ansible-playbook -i hosts.ini async.yml -K
|
||||
BECOME password:
|
||||
|
||||
PLAY [user] ************************************************************************************************************
|
||||
|
||||
TASK [Gathering Facts] *************************************************************************************************
|
||||
ok: [us1]
|
||||
|
||||
TASK [Sleep] ***********************************************************************************************************
|
||||
ASYNC POLL on us1: jid=290251027418.31066 started=1 finished=0
|
||||
ASYNC POLL on us1: jid=290251027418.31066 started=1 finished=0
|
||||
changed: [us1]
|
||||
|
||||
PLAY RECAP *************************************************************************************************************
|
||||
us1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
||||
|
||||
```
|
||||
`ASYNC POLL on us1: jid=290251027418.31066 started=1 finished=0` - каждые 5 секунд (значение poll) ansible подключается к задаче по id (`jid=290251027418.31066`) и проверяет её статус. При этом, переключение на следующую задачу не произойдёт до завершения текущей задачи.
|
||||
|
||||
*Пример - 2*
|
||||
*Задача 1 - спим 15 секунд, не дожидаясь окончания задачи переходим к следующей*
|
||||
*Задача 2 - выполняем команду echo*
|
||||
*Зачада 3 - проверяем статус выполнения первой задачи*
|
||||
*`jid: "{{ sleep.ansible_job_id }}"` - получаем статус задачи __(выполнение задачи и получение её статуса важно делать от одного и того же пользователя, иначе ansible не увидит задачу. Т.е. если основная задача выполняется от sudo (`become: true`), то и проверять статус также нужно от sudo)__.*
|
||||
*ждём выполнения задачи `until: job_result.finished`, при этом задаём необязательные параметры -*
|
||||
*`retries: 100` - проверяем выполнение отслеживаемой задачи 100 раз*
|
||||
*`delay: 1` - задержка между повторами - 1 секунда.*
|
||||
```bash
|
||||
cat async.yml
|
||||
```
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: user
|
||||
hosts: deploy
|
||||
tasks:
|
||||
- name: Preconfig block
|
||||
block:
|
||||
- name: Sleep
|
||||
command: sleep 10
|
||||
async: 1000
|
||||
poll: 0
|
||||
register: sleep
|
||||
- name: Echo
|
||||
command: echo "Задача выполнена"
|
||||
become: true
|
||||
- name: Check sleep status
|
||||
async_status:
|
||||
jid: "{{ sleep.ansible_job_id }}"
|
||||
register: job_result
|
||||
until: job_result.finished
|
||||
retries: 100
|
||||
delay: 1
|
||||
become: true
|
||||
```
|
||||
```bash
|
||||
user@host:~$ ansible-playbook -i hosts.ini async.yml -K
|
||||
BECOME password:
|
||||
|
||||
PLAY [user] ************************************************************************************************************
|
||||
|
||||
TASK [Gathering Facts] *************************************************************************************************
|
||||
ok: [us1]
|
||||
|
||||
TASK [Sleep] ***********************************************************************************************************
|
||||
changed: [us1]
|
||||
|
||||
TASK [Echo] ************************************************************************************************************
|
||||
changed: [us1]
|
||||
|
||||
TASK [Check sleep status] **********************************************************************************************
|
||||
FAILED - RETRYING: Check sleep status (100 retries left).
|
||||
FAILED - RETRYING: Check sleep status (99 retries left).
|
||||
FAILED - RETRYING: Check sleep status (98 retries left).
|
||||
FAILED - RETRYING: Check sleep status (97 retries left).
|
||||
FAILED - RETRYING: Check sleep status (96 retries left).
|
||||
FAILED - RETRYING: Check sleep status (95 retries left).
|
||||
changed: [us1]
|
||||
|
||||
PLAY RECAP *************************************************************************************************************
|
||||
us1 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### Chapter9
|
||||
### Пример playbook - установка Docker + Docker-compose
|
||||
```yaml
|
||||
---
|
||||
- name: Preconfig
|
||||
hosts: deploy
|
||||
tasks:
|
||||
- name: Установка Docker
|
||||
block:
|
||||
- name: Добавление репо Ububntu universe
|
||||
apt_repository:
|
||||
repo: "deb http://archive.ubuntu.com/ubuntu {{ ansible_distribution_release }} main universe restricted multiverse"
|
||||
state: present
|
||||
|
||||
- name: Установка дополнительных пакетов
|
||||
apt:
|
||||
name:
|
||||
- ca-certificates
|
||||
- curl
|
||||
- gnupg
|
||||
- lsb-release
|
||||
update_cache: true
|
||||
|
||||
- name: Добавление ключа Docker
|
||||
apt_key:
|
||||
url: https://download.docker.com/linux/ubuntu/gpg
|
||||
keyring: /usr/share/keyrings/docker-archive-keyring.gpg
|
||||
state: present
|
||||
|
||||
- name: Установка репозитория Docker
|
||||
apt_repository:
|
||||
repo: >
|
||||
deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]
|
||||
https://download.docker.com/linux/ubuntu
|
||||
{{ ansible_distribution_release }} stable
|
||||
state: present
|
||||
update_cache: true
|
||||
filename: docker
|
||||
|
||||
- name: Установка Docker
|
||||
apt:
|
||||
name:
|
||||
- docker-ce
|
||||
- docker-ce-cli
|
||||
- containerd.io
|
||||
update_cache: true
|
||||
|
||||
- name: Проверка корректности установки Docker
|
||||
service:
|
||||
name: docker
|
||||
state: restarted
|
||||
enabled: true
|
||||
become: true
|
||||
|
||||
- name: Установка Docker-compose
|
||||
block:
|
||||
- name: Получение последней версии Docker-compose
|
||||
uri:
|
||||
url: "https://api.github.com/repos/docker/compose/releases/latest"
|
||||
body_format: json
|
||||
register: page
|
||||
|
||||
- name: Установка Docker-compose
|
||||
get_url:
|
||||
url: "https://github.com/docker/compose/releases/download/{{ page.json.tag_name }}/docker-compose-Linux-x86_64"
|
||||
dest: /usr/local/bin/docker-compose
|
||||
mode: 0755
|
||||
become: true
|
||||
|
||||
- name: Завершение установки
|
||||
block:
|
||||
- name: Добавление пользователя в группу Docker
|
||||
user:
|
||||
name: "{{ ansible_user }}"
|
||||
groups: docker
|
||||
append: true
|
||||
|
||||
- name: Перезагрузка
|
||||
reboot:
|
||||
become: true
|
||||
```
|
||||
*перечень необходимых пакетов, ссылки на репозитории и прочие данные, необходимые для установки взяты из официальной документации*
|
||||
*https://docs.docker.com/engine/install/ubuntu/*
|
||||
*https://docs.docker.com/compose/install/*
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
```bash
|
||||
git add . && git commit -m 'mod ansible' && git push
|
||||
```
|
||||
12
atom_default_file_type.md
Normal file
12
atom_default_file_type.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Изменение типа файла для всех вновь создаваемых файлов в Atom
|
||||
|
||||
Cоздать файл инициализации Atom `~/.atom/init.coffee`
|
||||
|
||||
atom.workspace.observeTextEditors (editor) ->
|
||||
return if editor.getPath()?
|
||||
editor.setGrammar(atom.grammars.grammarForScopeName('source.cpp'))
|
||||
|
||||
указать необходимый тип файла вместо `'source.cpp'`
|
||||
Тип файла указать из ScopeName. Узнать ScopeName можно так [Finding a Language's Scope Name](https://flight-manual.atom.io/using-atom/sections/basic-customization/#finding-a-languages-scope-name)
|
||||
|
||||
Например для файлов Markdown необходимо указать `'text.md'`
|
||||
90
autofs.md
Normal file
90
autofs.md
Normal file
@@ -0,0 +1,90 @@
|
||||
#### Автомонтирование удалённых файловых систем по запросу (autofs)
|
||||
|
||||
Настройки autofs производятся только на клиенте, предполагается, что сервер уже настроен соответствующим образом.
|
||||
Проверку того, что сервер настроен, можно выполнить командой на клиенте
|
||||
```bash
|
||||
$ showmount -e
|
||||
```
|
||||
должны отобразится папки удалённого сервера, доступные для монтирования.
|
||||
или на сервере
|
||||
```bash
|
||||
# exportfs -s
|
||||
```
|
||||
|
||||
1. **В первую очередь необходимо установить соответствующий пакет**
|
||||
|
||||
*rpm*
|
||||
```bash
|
||||
# dnf install autofs
|
||||
```
|
||||
*deb*
|
||||
```bash
|
||||
# apt install autofs
|
||||
```
|
||||
|
||||
2. **После установки пакета, необходимо запустить службу в systemd**
|
||||
```bash
|
||||
# systemctl enable --now autofs
|
||||
```
|
||||
|
||||
|
||||
3. **Основной файл настроек находится в `/etc/auto.master`**
|
||||
|
||||
Файл содержит такой комментарий и настройку
|
||||
```
|
||||
# Include /etc/auto.master.d/*.autofs
|
||||
# The included files must conform to the format of this file.
|
||||
#
|
||||
+dir:/etc/auto.master.d
|
||||
```
|
||||
Таким образом, ориентируясь на *best practics*, пользовательские настройки лучше сохранять в директории `/etc/auto.master.d/`, название конфигурационного файла должно заканчиваться на `.autofs`
|
||||
|
||||
Создадим свой конфигурационный файл
|
||||
```bash
|
||||
# vim /etc/auto.master.d/demo.autofs
|
||||
```
|
||||
следующего содержания
|
||||
```bash
|
||||
/demoshare /etc/auto.demo
|
||||
```
|
||||
или
|
||||
```bash
|
||||
/- /etc/auto.demo
|
||||
```
|
||||
явных требований к названию файла `auto.demo` в документации не приводится, но обычно используются такие: `auto.nfs`, `auto.misc`, `auto.home` и пр.
|
||||
|
||||
|
||||
4. **Следующим шагом будет указание пути к удалённой папке**
|
||||
|
||||
*необходимо создать файл, который указали в предыдущем шаге*
|
||||
```bash
|
||||
# vim /etc/auto.demo
|
||||
```
|
||||
*в файле будет указана локальная точка монтирования, опции монтирования и удалённая ФС*
|
||||
```bash
|
||||
localdir -rw,sync 192.168.13.6:/shares
|
||||
```
|
||||
**в данном случае на клиенте должна существовать директория `/demoshare`, при обращении к `/demoshare/localdir` в директории `/demoshare` будет автоматически создаваться директория `localdir` с содержимым смонтированной удалённой директории `192.168.13.6:/shares`**
|
||||
|
||||
или указать полный путь к локальной точке монтирования, если в карте `/etc/auto.master.d/demo.autofs` был указан `/-`
|
||||
```bash
|
||||
/localmnt/localdir -rw,sync 192.168.13.6:/shares
|
||||
```
|
||||
**в этом случае на клиенте при обращении к `/localmnt/localdir` будет создаваться соответствующая директория с содержимым смонтированной удалённой директории `192.168.13.6:/shares`**
|
||||
|
||||
|
||||
5. **Подстановочные маски (Indirect Wildcard Maps)**
|
||||
|
||||
Если NFS сервер экпортирует несколько подкаталогов и эти подкаталоги могут динамически изменяться, автоматическое монтирование можно настроить для доступа к любому из этих подкаталогов с помощью одной записи сопоставления.
|
||||
|
||||
**Пример**
|
||||
*Домашние каталоги пользователей расположены на удалённом сервере. Монтирование домашнего каталога происходит при авторизации пользователя в системе.
|
||||
При использовании подстановочных масок, нет необходимости заранее перечислять домашние каталоги пользователей.*
|
||||
|
||||
При таком способе настройки, конфигурация из предыдущего примера `/etc/auto.demo`, будет выглядеть так:
|
||||
```bash
|
||||
* -rw,sync 192.168.13.6:/shares/&
|
||||
```
|
||||
|
||||
Теперь, если хотим смонтировать удалённую папку `192.168.13.6:/shares/dir1`, необходимо обратиться к ней по адресу `/demoshare/dir1`
|
||||
|
||||
29
autofs_dnas.md
Normal file
29
autofs_dnas.md
Normal file
@@ -0,0 +1,29 @@
|
||||
### Монтирование сетевых папок с помощью NFS
|
||||
|
||||
```bash
|
||||
sudo apt install autofs
|
||||
```
|
||||
|
||||
**Настройка**
|
||||
Для настройки autofs в файле `/etc/auto.master` необходимо добавить строку
|
||||
```
|
||||
/nfs /etc/auto.nfs --timeout=60
|
||||
```
|
||||
Здесь --timeout=60 указывает отмонтировать раздел при отсутствии активности на нём более чем 60 секунд.
|
||||
|
||||
Создаем в корне файловой системы папку `/nfs` :
|
||||
```bash
|
||||
sudo touch /etc/auto.nfs && sudo mkdir /nfs
|
||||
````
|
||||
В файле `/etc/auto.nfs` добавляем строку
|
||||
```
|
||||
disk1 -rw,soft,intr,rsize=8192,wsize=8192 192.168.13.8:/mnt/disk1
|
||||
disk2 -rw,soft,intr,rsize=8192,wsize=8192 192.168.13.8:/mnt/disk2
|
||||
disk3 -rw,soft,intr,rsize=8192,wsize=8192 192.168.13.8:/mnt/disk3
|
||||
|
||||
```
|
||||
|
||||
Перезапускаем службу autofs :
|
||||
```bash
|
||||
sudo service autofs restart
|
||||
```
|
||||
42
certbot.md
Normal file
42
certbot.md
Normal file
@@ -0,0 +1,42 @@
|
||||
```bash
|
||||
sudo certbot certonly --dry-run -d da2001.ru -d www.da2001.ru -d da2001.su -d www.da2001.su -d sync.da2001.ru -d webmin.da2001.ru -d cloud.da2001.ru -d qbt.da2001.ru -d photo.da2001.ru -d syno.da2001.ru -d plex.da2001.ru -d torrent.da2001.ru -d pve.da2001.ru -d office.da2001.ru -d webmail.da2001.ru -d ha.da2001.ru -d vault.da2001.ru -d git.da2001.ru -d remote.da2001.ru
|
||||
```
|
||||
|
||||
|
||||
```bash
|
||||
sudo certbot certonly -d da2001.ru -d www.da2001.ru -d da2001.su -d www.da2001.su -d sync.da2001.ru -d webmin.da2001.ru -d cloud.da2001.ru -d qbt.da2001.ru -d photo.da2001.ru -d syno.da2001.ru -d plex.da2001.ru -d torrent.da2001.ru -d pve.da2001.ru -d office.da2001.ru -d webmail.da2001.ru -d ha.da2001.ru -d vault.da2001.ru -d git.da2001.ru -d remote.da2001.ru
|
||||
```
|
||||
|
||||
Обновить существующие сертификаты
|
||||
```bash
|
||||
sudo certbot renew
|
||||
````
|
||||
|
||||
Обновить определённые сертификаты
|
||||
```bash
|
||||
certbot renew --cert-name domain1.com --dry-run
|
||||
````
|
||||
|
||||
Проверить полученные сертификаты
|
||||
```bash
|
||||
sudo certbot certificates
|
||||
```
|
||||
|
||||
**Получение wildcard сертификата на все поддомены**
|
||||
```bash
|
||||
sudo certbot run -a manual -i nginx -d *.da2001.ru -d da2001.ru
|
||||
```
|
||||
|
||||
Будет выведено сообщение с текстовой строкой - набором символов, например:
|
||||
`byNIAO7n0rnx5DDZoc45QAYnbTMPB6PM975lU-4nOvo`.
|
||||
У регистратора, например https://connect.yandex.ru/portal/services/webmaster/resources/da2001.ru
|
||||
необходимо добавить новую DNS-запись:
|
||||
|
||||
Тип записи: `TXT`
|
||||
Хост: `_acme-challenge`
|
||||
Значение записи: `вставить набор симоволов, который выдал certbot`
|
||||
|
||||
**После добавления записи, обязательно нужно дождаться добавления записи в DNS, примерно 5 минут.
|
||||
Затем нажать Enter в консоли.**
|
||||
|
||||
### !!! Для обновления wildcard сертификата необходимо менять запись _acme-challenge, т.е. заново перевыпускать сертификат в интерактивном (manual) режиме, в противном случае, автопродление завершится ошибкой. Поэтому, от wildcard сертификатов пока решил отказаться.
|
||||
139
dnsmasq_sample_conf.conf
Normal file
139
dnsmasq_sample_conf.conf
Normal file
@@ -0,0 +1,139 @@
|
||||
# Пример настройки конфигурационного файла сервера Dnsmasq
|
||||
# основан на данных из
|
||||
# https://mnorin.com/nastrojka-dnsmasq-dhcp-dns.html
|
||||
# https://linux-admins.ru/article.php?id_article=62&article_title=%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B8%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%20Dnsmasq
|
||||
|
||||
# Конфигурационный файл расположен по адресу:
|
||||
# /etc/dnsmasq.conf
|
||||
|
||||
# DHCP Настройки
|
||||
# Указываем пользователя и группу с правами которых будет запущен демон
|
||||
#user=nobody
|
||||
#group=nobody
|
||||
|
||||
# Указываем интерфейсы на которых будут приниматься запросы
|
||||
interface=eth0
|
||||
#interface=eth1
|
||||
|
||||
# Или интерфейсы на которых не будут приниматься запросы
|
||||
#except-interface="интерфейс"
|
||||
|
||||
# Или ip-адреса
|
||||
#listen-address= "ip-адрес"
|
||||
|
||||
#Если вы хотите что бы интерфейс принимал только DNS запросы
|
||||
#no-dhcp-interface= "интерфейс"
|
||||
|
||||
# Указываем диапозон адресов и время аренды
|
||||
dhcp-range=192.168.5.101,192.168.5.254,24h
|
||||
|
||||
# Для статической привязки адресов указываем MAC-адрес хоста и
|
||||
#адрес, который будем ему выдавать
|
||||
#dhcp-host=11:22:33:44:55:66,192.168.0.51
|
||||
|
||||
# Если записей статической привязки будет много, удобнее выделить их в отдельный файл
|
||||
# все файлы в директории /etc/dnsmasq.d/ будут считываться как дополнииельная конфигурация
|
||||
# например, можно создать файл /etc/dnsmasq.d/static.hosts следующего содержания
|
||||
#dhcp-host=11:22:33:44:56:77,mail-server,192.168.0.55
|
||||
#dhcp-host=22:11:55:44:88:81,cloud,192.168.0.56
|
||||
#и так далее
|
||||
|
||||
# или ip-адрес и имя хоста
|
||||
#dhcp-host=11:22:33:44:56:77,mail-server,192.168.0.55,60m
|
||||
|
||||
# Можем выдать один ip-адрес одному из хостов кто первый успеет
|
||||
#dhcp-host=12:21:33:43:88:11,22:11:55:44:88:81,192.168.0.59
|
||||
|
||||
# Указание опций DHCP
|
||||
# option 1 - маска сети
|
||||
dhcp-option=1,255.255.255.0
|
||||
|
||||
# option 3 - Шлюз по умолчанию
|
||||
dhcp-option=3,192.168.5.1
|
||||
|
||||
# option 42 - NTP сервер
|
||||
dhcp-option=42,192.168.5.1
|
||||
|
||||
# DNS сервер
|
||||
dhcp-option=6,192.168.5.1
|
||||
|
||||
# Лимит на аренду ip-адреса в секундах (по-умолчанию 150)
|
||||
dhcp-lease-max=3600
|
||||
|
||||
# Указание файла для хранения информации об аренде адресов
|
||||
dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases
|
||||
|
||||
# Указание, что DHCP сервер работает в режиме authritative
|
||||
# Указываем что это единственный DHCP сервер.
|
||||
dhcp-authoritative
|
||||
|
||||
####################################################################
|
||||
# DNS Настройки
|
||||
# Указание интерфейсов и ip-адрес мы рассмотрели в секции DHCP
|
||||
|
||||
# Указываем доменое имя
|
||||
domain=da2001.ru
|
||||
|
||||
# можно указать отдельное доменое имя, для отдельной сети
|
||||
#domain=wifi.test.un,192.168.100.0/24
|
||||
|
||||
#Или для определенного диапозона адресов
|
||||
#domain=range.test.un,192.168.100.100,192.168.100.200
|
||||
|
||||
# Указание серверов для форвардинга запросов
|
||||
server=8.8.8.8
|
||||
server=8.8.4.4
|
||||
|
||||
# Указание адресов доменных серверов для перенаправления запроса к определенным зонам
|
||||
#server=/office.un/192.168.50.10
|
||||
|
||||
# Аналогично можно указать для обратной зоны
|
||||
#server=/50.168.192.in-addr.arpa/192.168.50.10
|
||||
|
||||
# По умолчанию dnsmasq использует файл /etc/hosts для сопоставления имен
|
||||
# хостов IP-адресам, но это тоже можно изменить. Если вы не хотите
|
||||
# использовать /etc/hosts, вы можете указать это при помощи опции
|
||||
#no-hosts
|
||||
|
||||
# Если вы хотите использовать для этих целей другой файл
|
||||
#addn-hosts= "путь к файлу"
|
||||
|
||||
# Записи зоны
|
||||
# Запись типа А
|
||||
address=/dns.da2001.ru/192.168.5.1
|
||||
#address=/ldap.test.un/192.168.0.210
|
||||
|
||||
# Запись CNAME
|
||||
#cname=mail-server,mail # алиасом для mail-server будет имя mail
|
||||
|
||||
# Запись типа SRV
|
||||
#srv-host=_ldap._tcp.test.un,ldap.test.un,389
|
||||
|
||||
# Алиасы или подмена ip-адресов
|
||||
# Кроме задания собственных записей DNS можно изменять информацию,
|
||||
# получаемую от внешних DNS-серверов путем подмены полученного IP-адреса.
|
||||
# Для замены одного адреса
|
||||
#alias=10.10.1.1,172.20.1.1 # если при запросе от внешнего DNS сервера мы получили адрес
|
||||
#10.10.1.1 то мы подменим его на 172.20.1.1
|
||||
|
||||
# Или можно заменять целую сеть
|
||||
#alias=10.10.1.0,172.20.1.0,255,255,255,0
|
||||
|
||||
# Dnsmasq читает файл /etc/resolv.conf для определения перечня DNS серверов
|
||||
# для форвардинга, если вы хотите поменять это и указать другой файл для этих целей
|
||||
#resolv-file= "путь к файлу"
|
||||
|
||||
# Для того, чтобы обращения к DNS шли именно на dnsmasq на том же сервере, где он сам работает,
|
||||
# необходимо указать первой записью в /etc/resolv.conf следующую строку:
|
||||
#nameserver 127.0.0.1
|
||||
|
||||
# Сам dnsmasq будет игнорировать эту запись, поскольку предполагает, что эта запись обозначает его собственный сервис,
|
||||
# он начинает использование записей с указанием серверов имен со следующей записи, в которой указывается уже внешний DNS-сервер.
|
||||
# Во многих системах /etc/resolv.conf генерируется автоматически при получении адреса от провайдера по DHCP,
|
||||
# оэтому если просто записать эту строчку руками, при переподключении основного сетевого интерфейса
|
||||
# файл будет перезаписан и эта строка исчезнет.
|
||||
# Этого можно избежать, если раскомментировать в файле /etc/dhcp/dhclient.conf
|
||||
# (или /etc/dhcp3/dhclient.conf, в зависимости от системы) строчку
|
||||
# prepend domain-name-servers 127.0.0.1;
|
||||
|
||||
# Тогда даже при получении списка DNS-серверов по DHCP первой строчкой в /etc/resolv.conf будет строчка «nameserver 127.0.0.1.
|
||||
70
git.md
Normal file
70
git.md
Normal file
@@ -0,0 +1,70 @@
|
||||
## git
|
||||
|
||||
#### 1. Отображение статуса репозитория в приглашении
|
||||
Это дополнительный функционал, который не требуется для работы с Git, но очень помогает в этом. При работе с Git очень удобно, когда можно сразу определить, находитесь вы в обычном каталоге или в репозитории Git. Кроме того, было бы хорошо понимать статус текущего репозитория. Для этого нужно установить специальную утилиту, которая будет показывать статус репозитория. Для установки утилиты надо скопировать её репозиторий в домашний каталог пользователя, под которым вы работаете:
|
||||
```
|
||||
cd ~
|
||||
git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
|
||||
```
|
||||
А затем добавить в конец файла .bashrc такие строки:
|
||||
```
|
||||
GIT_PROMPT_ONLY_IN_REPO=1
|
||||
source ~/.bash-git-prompt/gitprompt.sh
|
||||
```
|
||||
Для того, чтобы изменения применились, перезапустить bash:
|
||||
```
|
||||
exec bash
|
||||
```
|
||||
Теперь, если вы находитесь в обычном каталоге, приглашение выглядит стандартно, а если в каталоге, в котором инициализирован репозиторий git, это будет указано.
|
||||
|
||||
#### 2. Аутентификация на GitHub с помощью SSH-ключа
|
||||
###### Генерация нового SSH-ключа (используйте e-mail, который привязан к GitHub):
|
||||
```
|
||||
ssh-keygen -t rsa -b 4096 -C "github_email@gmail.com"
|
||||
```
|
||||
На всех вопросах достаточно нажать Enter (более безопасно использовать ключ с passphrase, но можно и без, если нажать Enter при вопросе, тогда passphrase не будет запрашиваться у вас постоянно при операциях с репозиторием).
|
||||
Запуск SSH-агента (пропускаем на Windows):
|
||||
```
|
||||
eval "$(ssh-agent -s)"
|
||||
```
|
||||
Добавить ключ в SSH-агент (пропускаем на Windows):
|
||||
```
|
||||
ssh-add ~/.ssh/id_rsa
|
||||
```
|
||||
###### Добавление SSH-ключа на GitHub
|
||||
Для добавления ключа надо его скопировать.
|
||||
Например, таким образом можно отобразить ключ для копирования:
|
||||
```
|
||||
cat ~/.ssh/id_rsa.pub
|
||||
```
|
||||
После копирования надо перейти на GitHub. Находясь на любой странице GitHub, в правом верхнем углу нажмите на картинку вашего профиля и в выпадающем списке выберите «Settings». В списке слева надо выбрать поле «SSH and GPG keys». После этого надо нажать «New SSH key» и в поле «Title» написать название ключа (например «Home»), а в поле «Key» вставить содержимое, которое было скопировано из файла ~/.ssh/id_rsa.pub
|
||||
Чтобы проверить, всё ли прошло успешно, попробуйте выполнить команду:
|
||||
```
|
||||
ssh -T git@github.com
|
||||
```
|
||||
Вывод должен быть таким:
|
||||
```
|
||||
$ ssh -T git@github.com
|
||||
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
|
||||
```
|
||||
#### 3. Работа с удаленным репозиторием
|
||||
Клонируем удаленный репозиторий в локальную папку
|
||||
```
|
||||
git clone ssh://git@github.com/pyneng/online-2-natasha-samoylenko.git
|
||||
```
|
||||
После внесения измений в локальные файлы проверяем состояние локального репозитория
|
||||
```
|
||||
git status
|
||||
```
|
||||
Необходимо добавить файлы в отслеживаемые
|
||||
```
|
||||
git add <имя файла>
|
||||
```
|
||||
Создадим коммит
|
||||
```
|
||||
git commit -m "описание изменений"
|
||||
```
|
||||
Синхронизируем локальный и удаленный репозитории
|
||||
```
|
||||
git push
|
||||
```
|
||||
13
hostname.md
Normal file
13
hostname.md
Normal file
@@ -0,0 +1,13 @@
|
||||
**Изменить имя хоста linux**
|
||||
**Change hostname linux**
|
||||
|
||||
Чтобы сделать изменения постоянными нужно изменить содержимое двух файлов: `/etc/hostname` и `/etc/hosts`
|
||||
```
|
||||
sudo nano /etc/hostname
|
||||
```
|
||||
|
||||
```
|
||||
sudo nano /etc/hosts
|
||||
```
|
||||
|
||||
Изменения вступят в силу после перезагрузки
|
||||
BIN
images/cups_web.png
Normal file
BIN
images/cups_web.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 111 KiB |
BIN
images/greeting.png
Normal file
BIN
images/greeting.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
15
ip_сайта.md
Normal file
15
ip_сайта.md
Normal file
@@ -0,0 +1,15 @@
|
||||
### Узнать IP адреса домена
|
||||
```bash
|
||||
host vk.com
|
||||
```
|
||||
ответ, что-то типа
|
||||
```
|
||||
vk.com has address 87.240.137.158
|
||||
vk.com has address 87.240.139.194
|
||||
vk.com has address 93.186.225.208
|
||||
vk.com has address 87.240.190.78
|
||||
vk.com has address 87.240.190.72
|
||||
vk.com has address 87.240.190.67
|
||||
vk.com mail is handled by 0 mx.vk.com.
|
||||
vk.com mail is handled by 20 mx2.vk.com.
|
||||
```
|
||||
102
iperf.md
Normal file
102
iperf.md
Normal file
@@ -0,0 +1,102 @@
|
||||
### iperf
|
||||
**Совместимость iPerf и iPerf3**
|
||||
Клиент и сервер совместимы, но нужно знать, что по умолчанию, рабочий порт для iPerf — 5001, для iPerf3 — 5201.
|
||||
**Установка**
|
||||
```bash
|
||||
sudo apt install iperf
|
||||
```
|
||||
или
|
||||
```bash
|
||||
sudo apt install iperf3
|
||||
```
|
||||
Запускаем сервер:
|
||||
```bash
|
||||
iperf3 -s
|
||||
```
|
||||
На экране появится:
|
||||
```
|
||||
-----------------------------------------------------------
|
||||
Server listening on 5201
|
||||
-----------------------------------------------------------
|
||||
```
|
||||
Сервер ждет запросов.
|
||||
**Все ключи запуска iPerf**
|
||||
**Общие для сервера и клиента:**
|
||||
Ключ Описание
|
||||
`-p` _Определить порт, на котором будет слушать сервер или отправлять запросы клиент_
|
||||
`-f` _Формат отчетов — kmgKMG (Kbits, Mbits, KBytes, MBytes, ...)_
|
||||
`-i` _Задать интервал, в течение которого выполняется одна проверка_
|
||||
`-F` _Указать файл, из которого будут взяты входные данные для запуска_
|
||||
`-A` _Степень нагрузки на процессор_
|
||||
`-B` _Указать, через какой сетевой интерфейс работать_
|
||||
`-V` _Детализированные сообщения в консоли_
|
||||
`-J` _Вывод в формате json_
|
||||
`--logfile` _Весь вывод в отдельный лог-файл_
|
||||
`-d` _Режим отладки (много сообщений)_
|
||||
`-v` _Показать версию программы_
|
||||
`-h` _Вызвать справку по работе с программой_
|
||||
|
||||
**Для сервера:**
|
||||
Ключ Описание
|
||||
`-s` _Запустить iPerf в режиме сервера_
|
||||
`-D` _Запустить как демона (как службу)_
|
||||
`-I` _Указать pid-файл_
|
||||
`-1` _Принять запрос от одного клиента и завершить работу_
|
||||
|
||||
**Для клиента:**
|
||||
Ключ Описание
|
||||
`-c` _Запустить iPerf в режиме клиента_
|
||||
`-u` _Отправлять UDP-пакеты_
|
||||
`-b` _Формат отчетов для bandwidth (средней скорости)_
|
||||
`-t` _Количество секунд, в течение которых будет идти проверка скорости_
|
||||
`-n` _Объем данных для проверки (применяется вместо времени -t)_
|
||||
`-k` _Количество пакетов для проверки (вместо -t или -n)_
|
||||
`-l` _Размер буфера записи/чтения для TCP (по-умолчанию 128K), размер пакета для UDP (по-умолчанию 1470)_
|
||||
`-P` _Число параллельных запросов_
|
||||
`-R` _Обратный режим — сервер отправляет, клиент принимает_
|
||||
`-w` _Размер сетевого окна_
|
||||
`-C` _Установить алгоритм управления перегрузкой TCP_
|
||||
`-M` _Задать максимальный размер MTU_
|
||||
`-4` _Работать только для IPv4_
|
||||
`-6` _Работать только для IPv6_
|
||||
`-Z` _Использовать метод «нулевой копии» для отправки данных_
|
||||
`-O` _Опустить первые n секунд_
|
||||
`-T` _Задать префикс для каждой строки вывода_
|
||||
|
||||
Также самый свежий список ключей можно получить командой:
|
||||
```bash
|
||||
man iperf3
|
||||
```
|
||||
**Примеры использования iPerf**
|
||||
_Рассмотрим некоторые команды запросов к серверу для проверки скорости соединения._
|
||||
Использование UDP
|
||||
```bash
|
||||
iperf3 -c 192.168.0.15 -u
|
||||
```
|
||||
* сам сервер не нужно запускать в UDP-режиме, так как он принимает любые запросы.
|
||||
|
||||
Альтернативные порты
|
||||
_Для этого необходимо сначала запустить сервер на нужном порту:_
|
||||
```bash
|
||||
iperf3 -s -p 443
|
||||
```
|
||||
* кстати, можно запустить несколько процессов iperf одновременно, которые будут слушать на разных портах.
|
||||
* стоит не забывать про настройки брандмауэра. В данном примере понадобиться ввести команды `firewall-cmd --permanent --add-port=443/tcp и firewall-cmd --reload`.
|
||||
|
||||
Теперь можно запускать клиента:
|
||||
```bash
|
||||
iperf3 -c 192.168.0.15 -p 443
|
||||
```
|
||||
Проверка скорости в течение 30 секунд с интервалами по 2 секунды
|
||||
```bash
|
||||
iperf3 -c 192.168.0.15 -t 30 -i 2
|
||||
```
|
||||
Несколько параллельных запросов
|
||||
```bash
|
||||
iperf3 -c 192.168.0.15 -P 3
|
||||
```
|
||||
Отправляем на проверку 3 Гб данных
|
||||
```bash
|
||||
iperf3 -c 192.168.0.15 -n 3G
|
||||
```
|
||||
|
||||
396
linux_usefull.md
Normal file
396
linux_usefull.md
Normal file
@@ -0,0 +1,396 @@
|
||||
## Linux useful
|
||||
|
||||
###### top
|
||||
[Текущая директория сервера в браузере по адресу `http://server_ip:8000/`](#tip001)
|
||||
[Запустить графическое приложение через ssh соединение `-Y`](#tip002)
|
||||
[Отобразить все группы пользователя](#tip003)
|
||||
[SSH соединение через промежуточный хост](#tip004)
|
||||
[SSH соединение без проверки подлинности ключа и его сохранения](#tip005)
|
||||
[Изменить первичную группу пользователя в текщем сеансе](#tip006)
|
||||
[Сохранить man в pdf](#tip007)
|
||||
[Прервать выполнение команды через 5 секунд](#tip008)
|
||||
[Инфо об ОС](#tip009)
|
||||
[Выполнить команду несколько раз в цикле](#tip010)
|
||||
[Конвертировать изоражения heic в jpg](#tip011)
|
||||
[Конвертировать jpg в pdf](#tip012)
|
||||
[получить UUID диска для монтирования](#tip013)
|
||||
[Сброс пароля root](#tip014)
|
||||
[Проверить доступность диапазона хостов](#tip015)
|
||||
[Конвертировать pdf в png](#tip016)
|
||||
[Узнать загрузку процессора определённым процессом](#tip017)
|
||||
|
||||
***
|
||||
|
||||
###### tip001
|
||||
:large_blue_circle: **Текущая директория сервера в браузере по адресу `http://server_ip:8000/`**
|
||||
```bash
|
||||
python -m SimpleHTTPServer
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip002
|
||||
:large_blue_circle: **Запустить графическое приложение через ssh соединение `-Y`**
|
||||
*для текущей сессии*
|
||||
```bash
|
||||
ssh -Y pi@server_ip
|
||||
```
|
||||
*для всех подключений*
|
||||
`ForwardX11 yes` в файле `/etc/ssh/ssh_config`
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip003
|
||||
:large_blue_circle: **Отобразить все группы пользователя**
|
||||
```bash
|
||||
da2001@Metromint:~$ groups da2001
|
||||
da2001 : da2001 adm cdrom sudo dip plugdev kvm lpadmin sambashare wireshark libvirt
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip004
|
||||
:large_blue_circle: **SSH соединение через промежуточный хост**
|
||||
```bash
|
||||
ssh -t pi@192.168.89.2 ssh da2001@192.168.1.8
|
||||
```
|
||||
*сначала будет запрошен пароль от 192.168.89.2, затем от 192.168.1.8*
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip005
|
||||
:large_blue_circle: **SSH соединение без проверки подлинности ключа и его сохранения**
|
||||
```bash
|
||||
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.2.1
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip006
|
||||
:large_blue_circle: **Изменить первичную группу пользователя в текщем сеансе**
|
||||
```bash
|
||||
[lisa@server1 ~]$ groups
|
||||
lisa account sales
|
||||
[lisa@server1 ~]$ newgrp sales
|
||||
[lisa@server1 ~]$ groups
|
||||
sales lisa account
|
||||
[lisa@server1 ~]$ touch file1
|
||||
[lisa@server1 ~]$ ls -l
|
||||
total 0
|
||||
-rw-r--r--. 1 lisa sales 0 Feb 6 10:06 file1
|
||||
```
|
||||
*теперь все новые файлы будут принадлежать группе sales*
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip007
|
||||
:large_blue_circle: **Сохранить man в pdf**
|
||||
```bash
|
||||
man -t <программа> | ps2pdf - <filename>.pdf
|
||||
```
|
||||
|
||||
```bash
|
||||
man -t tar | ps2pdf - tar_man.pdf
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip008
|
||||
:large_blue_circle: **Прервать выполнение команды через 5 секунд**
|
||||
```bash
|
||||
timeout 5s command
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip009
|
||||
:large_blue_circle: **Инфо об ОС**
|
||||
```bash
|
||||
cat /etc/*release
|
||||
```
|
||||
|
||||
```bash
|
||||
cat /etc/issue
|
||||
```
|
||||
|
||||
```bash
|
||||
uname -a
|
||||
```
|
||||
|
||||
```bash
|
||||
cat /etc/lsb-release
|
||||
```
|
||||
|
||||
```bash
|
||||
da2001@Metromint:~$ neofetch
|
||||
...-:::::-... da2001@Metromint
|
||||
.-MMMMMMMMMMMMMMM-. ----------------
|
||||
.-MMMM`..-:::::::-..`MMMM-. OS: Linux Mint 20.1 x86_64
|
||||
.:MMMM.:MMMMMMMMMMMMMMM:.MMMM:. Host: VivoBook_ASUSLaptop X570DD_M570DD 1.0
|
||||
-MMM-M---MMMMMMMMMMMMMMMMMMM.MMM- Kernel: 5.8.0-59-generic
|
||||
`:MMM:MM` :MMMM:....::-...-MMMM:MMM:` Uptime: 1 day, 1 hour, 41 mins
|
||||
:MMM:MMM` :MM:` `` `` `:MMM:MMM: Packages: 2750 (dpkg)
|
||||
.MMM.MMMM` :MM. -MM. .MM- `MMMM.MMM. Shell: bash 5.0.17
|
||||
:MMM:MMMM` :MM. -MM- .MM: `MMMM-MMM: Resolution: 1920x1080
|
||||
:MMM:MMMM` :MM. -MM- .MM: `MMMM:MMM: DE: Cinnamon
|
||||
:MMM:MMMM` :MM. -MM- .MM: `MMMM-MMM: WM: Mutter (Muffin)
|
||||
.MMM.MMMM` :MM:--:MM:--:MM: `MMMM.MMM. WM Theme: Mint-Y-Dark (Mint-Y-Dark)
|
||||
:MMM:MMM- `-MMMMMMMMMMMM-` -MMM-MMM: Theme: Mint-Y-Darker [GTK2/3]
|
||||
:MMM:MMM:` `:MMM:MMM: Icons: Papirus-Dark [GTK2/3]
|
||||
.MMM.MMMM:--------------:MMMM.MMM. Terminal: gnome-terminal
|
||||
'-MMMM.-MMMMMMMMMMMMMMM-.MMMM-' CPU: AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx (8) @ 2.100GHz
|
||||
'.-MMMM``--:::::--``MMMM-.' GPU: NVIDIA GeForce GTX 1050 Mobile
|
||||
'-MMMMMMMMMMMMM-' GPU: AMD ATI 05:00.0 Picasso
|
||||
``-:::::-`` Memory: 4924MiB / 5952MiB
|
||||
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip010
|
||||
:large_blue_circle: **Выполнить команду несколько раз в цикле**
|
||||
```bash
|
||||
da2001@Metromint:~$ for i in {1..5}; do echo $i; done
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
```
|
||||
*выполнение скрипта с параметрами в цикле*
|
||||
```bash
|
||||
for i in {1..20}; do ./wlt_start.py -c config_m716.cfg; done
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip011
|
||||
:large_blue_circle: **Конвертировать изоражения heic в jpg**
|
||||
```bash
|
||||
sudo apt-get install libheif-examples
|
||||
```
|
||||
*для конвертации одного изображения*
|
||||
```bash
|
||||
heif-convert IMG_1234.HEIC IMG_1234.jpg
|
||||
```
|
||||
*для конвертации всех изображений в папке*
|
||||
```bash
|
||||
mkdir jpg
|
||||
for file in *.heic; do heif-convert $file ./jpg/${file/%.heic/.jpg}; done
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip012
|
||||
:large_blue_circle: **Конвертировать jpg в pdf**
|
||||
*необходим установленный ImageMagick*
|
||||
```bash
|
||||
sudo apt install imagemagick
|
||||
```
|
||||
*для конвертации одного изображения*
|
||||
```bash
|
||||
convert image.jpg out.pdf
|
||||
```
|
||||
*для конвертации нескольких изображений*
|
||||
```bash
|
||||
convert image1.jpg image2.jpg image3.jpg out.pdf
|
||||
```
|
||||
***если в процессе конвертации будет получено сообщение об ошибке***
|
||||
```bash
|
||||
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
|
||||
```
|
||||
в файле `/etc/ImageMagick-7/policy.xml` необходимо изменить директиву доступа
|
||||
*название папки ImageMagick-7 может отличаться в зависимости от установленной версии*
|
||||
между тегами `<policymap>` и `</policymap>`
|
||||
добавить/отредактировать
|
||||
```bash
|
||||
<policy domain="coder" rights="read | write" pattern="PDF" />
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip013
|
||||
:large_blue_circle: **получить UUID диска для монтирования**
|
||||
**Вариант 1**
|
||||
|
||||
```bash
|
||||
lsblk -n -o uuid /dev/sda1
|
||||
```
|
||||
-n - не выводить заголовки
|
||||
-o - отображаемое поле
|
||||
*таким образом, для раздела с ФС ext4, запись в fstab можно добавить таким образом*
|
||||
```bash
|
||||
mkdir /mntdir
|
||||
|
||||
UUID=`lsblk -n -o uuid /dev/sda1`
|
||||
sudo bash -c 'echo "UUID=$UUID /mntdir ext4 defaults 0 0" >> /etc/fstab'
|
||||
```
|
||||
|
||||
**Вариант 2**
|
||||
```bash
|
||||
[root@server1 ~]# blkid -o export /dev/sda2 | grep '^UUID'
|
||||
UUID=d056212f-b1ea-4bc5-ba4e-99d036e5531e
|
||||
```
|
||||
*таким образом, можно перенаправить вывод в `/etc/fstab` и руками дополнить параметры монтирования*
|
||||
```bash
|
||||
blkid -o export /dev/sda2 | grep '^UUID' >> /etc/fstab
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
|
||||
###### tip014
|
||||
:large_blue_circle: **Сброс пароля root**
|
||||
|
||||
**CentOS/RedHat Linux**
|
||||
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
|
||||
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
|
||||
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
||||
```bash
|
||||
mount -o remount,rw /sysroot
|
||||
```
|
||||
4. Изменить корневой каталог
|
||||
```bash
|
||||
chroot /sysroot
|
||||
```
|
||||
5. Теперь можно изменить пароль root
|
||||
```bash
|
||||
passwd
|
||||
```
|
||||
будет предложено ввести новый пароль дважды.
|
||||
6. Поскольку на ранней стадии загрузки SELinux еще не был активирован, тип контекста в `/etc/shadow` будет перепутан. Если сейчас перезагрузиться, никто не сможет войти в систему. Поэтому необходимо убедиться, что тип контекста установлен правильно. Для этого на этом этапе нужно загрузить политику SELinux с помощью команды
|
||||
```bash
|
||||
load_policy -i
|
||||
```
|
||||
7. Теперь нужно вручную установить правильный тип контекста в `/etc/shadow`.
|
||||
```bash
|
||||
chcon -t shadow_t /etc/shadow
|
||||
```
|
||||
**вместо 6,7 пунктов можно просто в корне создать файл `.autorelabel`**
|
||||
```bash
|
||||
touch /.autorelabel
|
||||
```
|
||||
|
||||
8. Всё, после перезагрузки, у root будет новый пароль.
|
||||
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
||||
```bash
|
||||
reboot -f
|
||||
```
|
||||
|
||||
**Debian**
|
||||
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
|
||||
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
|
||||
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
||||
```bash
|
||||
mount -o remount,rw /
|
||||
```
|
||||
4. Теперь можно изменить пароль root
|
||||
```bash
|
||||
passwd
|
||||
```
|
||||
будет предложено ввести новый пароль дважды.
|
||||
5. Всё, после перезагрузки, у root будет новый пароль.
|
||||
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
||||
```bash
|
||||
reboot -f
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip015
|
||||
:large_blue_circle: **Проверить доступность диапазона хостов**
|
||||
```bash
|
||||
for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done
|
||||
```
|
||||
|
||||
```bash
|
||||
[da2001@co1 ~]$ for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done
|
||||
192.168.1.10 - доступен
|
||||
192.168.1.11 - доступен
|
||||
192.168.1.12 - доступен
|
||||
192.168.1.13 - НЕ доступен
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip016
|
||||
:large_blue_circle: **Конвертировать pdf в png**
|
||||
```bash
|
||||
pdftoppm input.pdf outputname -png
|
||||
```
|
||||
*в результате каждая страница в PDF будет сохранена в формате outputname-01.png, где 01 будет номером страницы*
|
||||
**Конвертировать одну страницу или диапазон**
|
||||
```bash
|
||||
pdftoppm input.pdf outputname -png -f {page} -singlefile
|
||||
```
|
||||
*Измените `{page}` на номер страницы. Он проиндексирован как 1, поэтому `-f 1` будет первой страницей.*
|
||||
|
||||
*Если вы хотите работать с диапазоном страниц, вы также можете указать номер для флага `-l` (последняя страница), поэтому при использовании `-f 1 -l 30` будут указаны страницы от 1 до 30.*
|
||||
|
||||
**Указать разрешение преобразованного изображения**
|
||||
*Разрешение по умолчанию для этой команды составляет 150 точек на дюйм.*
|
||||
|
||||
*Чтобы увеличить разрешение преобразованного PDF-файла, добавьте параметры `-rx` {разрешение} и `-ry` {разрешение}.*
|
||||
```bash
|
||||
pdftoppm input.pdf outputname -png -rx 300 -ry 300
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
###### tip017
|
||||
:large_blue_circle: **Узнать загрузку процессора определённым процессом**
|
||||
**ps**
|
||||
*по имени процесса*
|
||||
```bash
|
||||
ps -C iperf -o %cpu=
|
||||
```
|
||||
*по номеру процесса*
|
||||
```bash
|
||||
ps -p 23635 -o %cpu=
|
||||
```
|
||||
или
|
||||
```bash
|
||||
ps -p $(pgrep iperf) -o %cpu=
|
||||
```
|
||||
**top**
|
||||
```bash
|
||||
top -b -n 2 -d 0.2 -p PID_ID | tail -1 | awk '{print $9}'
|
||||
```
|
||||
**Нагрузить процессор для проверки**
|
||||
```bash
|
||||
cat /dev/zero > /dev/null
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
82
luks.md
Normal file
82
luks.md
Normal file
@@ -0,0 +1,82 @@
|
||||
#### LUKS
|
||||
LUKS является стандартом для шифрования жесткого диска Linux. Расшифровать данные на диске можно только имея доступ к секретному ключу и паролю.
|
||||
|
||||
1. Создать зашифрованный раздел
|
||||
```bash
|
||||
[da2001@co1 ~]$ sudo cryptsetup luks
|
||||
luksAddKey luksDelKey luksFormat luksHeaderRestore luksOpen luksResume luksUUID
|
||||
luksClose luksDump luksHeaderBackup luksKillSlot luksRemoveKey luksSuspend
|
||||
```
|
||||
*двойной Tab покажет возможные команды. Для создания нового раздела необходима команда `luksFormat`*
|
||||
```bash
|
||||
[da2001@co1 ~]$ sudo cryptsetup luksFormat /dev/sdc2
|
||||
WARNING: Device /dev/sdb2 already contains a 'crypto_LUKS' superblock signature.
|
||||
|
||||
WARNING!
|
||||
========
|
||||
This will overwrite data on /dev/sdc2 irrevocably.
|
||||
|
||||
Are you sure? (Type 'yes' in capital letters): YES
|
||||
Enter passphrase for /dev/sdb2:
|
||||
Verify passphrase:
|
||||
```
|
||||
*подтвердить заглавными YES*
|
||||
*задать пароль доступа, при этом простой пароль система может не принять, в этом случае будет выведено сообщение*
|
||||
```bash
|
||||
Password quality check failed:
|
||||
The password fails the dictionary check - it is based on a dictionary word
|
||||
```
|
||||
|
||||
2. Открыть раздел и задать ему имя, по которому раздел будет доступен в `/dev/mapper`
|
||||
```bash
|
||||
[da2001@co1 ~]$ sudo cryptsetup luksOpen /dev/sdc2 secret
|
||||
```
|
||||
*ввести пароль доступа*
|
||||
```bash
|
||||
[da2001@co1 ~]$ ls -l /dev/mapper/ | grep secret
|
||||
lrwxrwxrwx. 1 root root 7 Sep 10 14:41 secret -> ../dm-3
|
||||
```
|
||||
|
||||
3. Отформатировать раздел
|
||||
*форматировать необходимо в разблокированном состоянии*
|
||||
```bash
|
||||
[da2001@co1 ~]$ sudo mkfs.xfs /dev/mapper/secret
|
||||
meta-data=/dev/mapper/secret isize=512 agcount=4, agsize=64448 blks
|
||||
= sectsz=512 attr=2, projid32bit=1
|
||||
= crc=1 finobt=1, sparse=1, rmapbt=0
|
||||
= reflink=1
|
||||
data = bsize=4096 blocks=257792, imaxpct=25
|
||||
= sunit=0 swidth=0 blks
|
||||
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
|
||||
log =internal log bsize=4096 blocks=1566, version=2
|
||||
= sectsz=512 sunit=0 blks, lazy-count=1
|
||||
realtime =none extsz=4096 blocks=0, rtextents=0
|
||||
```
|
||||
|
||||
4. Монтирование зашифрованного раздела
|
||||
```bash
|
||||
[da2001@co1 ~]$ sudo mkdir /secret
|
||||
[da2001@co1 ~]$ sudo vi /etc/fstab
|
||||
```
|
||||
*добавить строку*
|
||||
```bash
|
||||
/dev/mapper/secret /secret xfs defaults 0 0
|
||||
```
|
||||
**добавление записи в fstab недостаточно, т.к. для монтирования устройство должно быть доступно**
|
||||
*необходимо добавить конфиг в `/etc/crypttab`*
|
||||
```bash
|
||||
[da2001@co1 ~]$ sudo vi /etc/crypttab
|
||||
```
|
||||
*в файле необходимо указать:*
|
||||
- название устройства, в нашем случае `secret`
|
||||
- блочное устройство, на котором размещён зашифрованный раздел - `/dev/sdb2`
|
||||
- параметр - нужно ли вводить пароль автоматически, `none` - не вводить пароль автоматически, требовать ввода от пользователя
|
||||
*синтаксис конфиг. файла можно узнать в справке `man crypttab`*
|
||||
```bash
|
||||
secret /dev/sdc2 none
|
||||
```
|
||||
|
||||
5. Для вступления изменений в силу, необходимо перезагрузить хост
|
||||
```bash
|
||||
[da2001@co1 ~]$ sudo reboot
|
||||
```
|
||||
42
mikrotik.md
Normal file
42
mikrotik.md
Normal file
@@ -0,0 +1,42 @@
|
||||
### Mikrotik
|
||||
|
||||
1. Обновление ПО
|
||||
скачать прошивку для своего устройства https://mikrotik.com/download
|
||||
в web-интерфейсе в разделе **Files** загрузить ранее скачанную прошивку
|
||||
в разделе **System** выбрать пункт **Reboot**
|
||||
после перезагрузки устройство будет с новой прошивкой
|
||||
|
||||
2. Обновление загрузчика
|
||||
после обновления ПО загрузчик не обновляется автоматически, для его обновления необходимо:
|
||||
в web-интерфейсе в разделе **System** выбрать пункт **RouterBOARD**, нажать кнопку **Upgrade**
|
||||
в разделе **System** выбрать пункт **Reboot**
|
||||
после перезагрузки устройство будет с новой прошивкой
|
||||
_чтобы в будущем, при обновлении ПО загрузчик обновлялся автоматически, необходимо:_
|
||||
в web-интерфейсе в разделе **System** выбрать пункт **RouterBOARD**, нажать кнопку **Settings**
|
||||
отметить пункт **Auto Upgrade**, сохранить изменения
|
||||
|
||||
3. Сохранение конфигурации
|
||||
Для создания конфигурации коммутатора лучше использовать способ сохранения настроек в бинарный файл, потому что такой способ, в отличии от использования команды export (при восстановлении старые и новые настройки объединяются), перед восстановлением стирает старые настройки, заменяя их новыми.
|
||||
|
||||
Подключаемся к коммутатору по ssh
|
||||
```
|
||||
ssh admin@192.168.88.1
|
||||
```
|
||||
без пароля
|
||||
|
||||
Создание бинарного файла конфигурации
|
||||
```
|
||||
/system backup save name=flash/[имя-файла]
|
||||
```
|
||||
**_!файл настроек необходимо сохранять в папку /flash, т.к. она расположена на другом диске и ее содержимое не очистится при восстановлении конфигурационного файла_**
|
||||
|
||||
1.4. Восстановление ранее сохраненного файла конфигурации
|
||||
```
|
||||
/system backup load name=flash/[имя-файла]
|
||||
```
|
||||
будет запрошен пароль, оставляем поле пустым, нажимаем Enter
|
||||
соглашаемся с применением конфигурации
|
||||
```
|
||||
y
|
||||
```
|
||||
коммутатор применит настройки и перезагрузится
|
||||
114
minicom.md
Normal file
114
minicom.md
Normal file
@@ -0,0 +1,114 @@
|
||||
#### minicom
|
||||
|
||||
Для доступа к меню конфигурации
|
||||
```bash
|
||||
sudo minicom -s
|
||||
```
|
||||
|
||||
```bash
|
||||
+-----------[конфигурация]-----------+
|
||||
| Каталоги и файлы |
|
||||
| Протоколы |
|
||||
| Настройка последовательного порта |
|
||||
| Модем и дозвон |
|
||||
| Экран и клавиатура |
|
||||
| Сохранить настройки как dfl |
|
||||
| Сохранить настройки как... |
|
||||
| Выход |
|
||||
| Выход из Minicom |
|
||||
+------------------------------------+
|
||||
|
||||
```
|
||||
|
||||
*при использовании нуль-модемного кабеля, адресом последовательного порта в linux будет
|
||||
COM1 - /dev/ttyS0
|
||||
COM2 - /dev/ttyS1
|
||||
и т.д. В случаях, когда используется адаптер USB-to-COM, в качестве порта ввода-вывода будет использоваться
|
||||
/dev/ttyUSB0 или /dev/ttyUSB1.*
|
||||
|
||||
После физического подключения, увидеть используемый порт
|
||||
```bash
|
||||
dmesg | grep tty
|
||||
```
|
||||
|
||||
Выбираем пункт "Настройка последовательного порта".
|
||||
```bash
|
||||
+-----------------------------------------------------------------------+
|
||||
| A - Последовательный порт : /dev/ttyUSB0 |
|
||||
| B - Размещение lock-файла : /var/lock |
|
||||
| C - Программа при выходе : |
|
||||
| D - Программа при запуске : |
|
||||
| E - Скорость/Чётность/Биты : 115200 8N1 |
|
||||
| F - Аппаратное управление потоком : Нет |
|
||||
| G - Программное управление потоком : Нет |
|
||||
| |
|
||||
| Какую настройку изменить? |
|
||||
+-----------------------------------------------------------------------+
|
||||
```
|
||||
После внесения необходимых изменений сохраняем настройки, выбрав пункт "Сохранить настройки как dfl". Это изменит настройки запуска программы, используемые по умолчанию.
|
||||
|
||||
```bash
|
||||
+---------------------------+
|
||||
| |
|
||||
+-----------[конфигурация]--------| Конфигурация сохранена |
|
||||
| Каталоги и файлы | |
|
||||
| Протоколы +---------------------------+
|
||||
| Настройка последовательного порта |
|
||||
| Модем и дозвон |
|
||||
| Экран и клавиатура |
|
||||
| Сохранить настройки как dfl |
|
||||
| Сохранить настройки как... |
|
||||
| Выход |
|
||||
| Выход из Minicom |
|
||||
+------------------------------------+
|
||||
```
|
||||
Если выбрать пункт "Сохранить настройки как.." и указать имя файла настроек, например "cisco", то это не изменит настройки по умолчанию и в дальнейшем можно будет запускать программу с конкретными параметрами, указав имя файла с настройками. Настройки сохраняются в файлах `minirc.DEVICE_NAME` в папке `/etc/minicom/`
|
||||
```bash
|
||||
minicom cisco
|
||||
```
|
||||
В завершении настройки переходим к пункту "Выход" и если все настроено правильно, то будет установлен сеанс подключения по последовательному порту.
|
||||
|
||||
|
||||
**Запуск minicom с аргументами**
|
||||
|
||||
Minicom можно запускать без выполнения настроек в оконном режиме. Для этого достаточно выполнить запуск программы с заданными аргументами.
|
||||
|
||||
Для подключения к устройству с помощью адаптера USB-to-COM со скоростью 38400:
|
||||
```bash
|
||||
minicom -D /dev/ttyUSB0 -b 38400
|
||||
```
|
||||
|
||||
Для подключения к устройству с использованием нуль-модемного кабеля:
|
||||
```bash
|
||||
minicom -D /dev/ttyS0 -b 38400
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
#### Передача файлов
|
||||
|
||||
После запуска программы увидим окно с подсказкой
|
||||
```bash
|
||||
Добро пожаловать в minicom 2.7.1
|
||||
|
||||
ПАРАМЕТРЫ: I18n
|
||||
Дата компиляции Dec 23 2019, 02:06:26.
|
||||
Port /dev/ttyUSB0, 12:20:47
|
||||
|
||||
Нажмите CTRL-A Z для получения подсказки по клавишам
|
||||
|
||||
```
|
||||
|
||||
1. Необходимо определить директорию из которой будут загружаться файлы
|
||||
`Ctrl+A o`
|
||||
`Каталоги и файлы`
|
||||
`B - Каталог для отправки` - указать полный путь к папке, в которой будут лежать файлы для отправки
|
||||
*если не указывать папку, будет предложено выбрать файл из домашней директории пользователя, при этом, перемещаться по каталогам возможности нет*
|
||||
|
||||
2. Отправка файла
|
||||
`Ctrl+A z`
|
||||
`s` - для отправки файла
|
||||
В следующем окне укажем `xmodem` и пробелом выберем файл который необходимо передать, нажав «Enter» запустим процесс передачи.
|
||||
|
||||
*файл будет загружаться со скоростью, которая указана в настройках при подключении в Кб/с, как в dial-up модемах из детства :)*
|
||||
|
||||
14
nano.md
Normal file
14
nano.md
Normal file
@@ -0,0 +1,14 @@
|
||||
### nano
|
||||
|
||||
**показать/скрыть номера строк**
|
||||
в латинской раскладке **Alt + Shift + 3**
|
||||
|
||||
**номера строк отображаются по умолчанию**
|
||||
в домашней папке пользователя создать/отредактировать файл **.nanorc**, добавить
|
||||
```
|
||||
set linenumbers
|
||||
```
|
||||
|
||||
**переход к определенной строке**
|
||||
Alt + G
|
||||
_работает не во всех эмуляторах терминала (Gnome connection manager)_
|
||||
1
plug-ins_Plex.txt
Normal file
1
plug-ins_Plex.txt
Normal file
@@ -0,0 +1 @@
|
||||
/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-ins
|
||||
107
python/python_notes.md
Normal file
107
python/python_notes.md
Normal file
@@ -0,0 +1,107 @@
|
||||
###### top
|
||||
## Python. Заметки на полях
|
||||
[Официальная документация](https://docs.python.org/3/)
|
||||
|
||||
***
|
||||
|
||||
[Базовые понятия](#part1)
|
||||
- [List comprehension](#chapter1)
|
||||
- [lambda](#chapter2)
|
||||
- [Ad-hoc команды](#chapter3)
|
||||
|
||||
[Ansible playbook](#part2)
|
||||
- [Простой playbook](#chapter4)
|
||||
- [Переменные](#chapter5)
|
||||
- [Отладка](#chapter6)
|
||||
- [Блоки и обработка ошибок](#chapter7)
|
||||
- [Асинхронные задачи](#chapter8)
|
||||
- [](#chapter9)
|
||||
- [](#chapter10)
|
||||
- [](#chapter11)
|
||||
- [](#chapter12)
|
||||
|
||||
***
|
||||
|
||||
###### part1
|
||||
## Базовые понятия
|
||||
[вверх](#top)
|
||||
|
||||
Интрерпретируемый язык
|
||||
|
||||
###### Chapter1
|
||||
### List comprehension
|
||||
Представление списков, списковые включения
|
||||
https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions
|
||||
|
||||
```python
|
||||
list_square = [x ** 2 for x in range(5)]
|
||||
print(list_square)
|
||||
|
||||
[0, 1, 4, 9, 16]
|
||||
```
|
||||
|
||||
```python
|
||||
vlans = [f'vlan {num}' for num in range(10, 16)]
|
||||
print(vlans)
|
||||
|
||||
['vlan 10', 'vlan 11', 'vlan 12', 'vlan 13', 'vlan 14', 'vlan 15']
|
||||
```
|
||||
|
||||
```python
|
||||
prices = [98, 123, 13, 45, 67, 43, 87]
|
||||
|
||||
less = [x for x in prices if x < 100]
|
||||
print(less)
|
||||
|
||||
[98, 13, 45, 67, 43, 87]
|
||||
```
|
||||
|
||||
```python
|
||||
vlans = [100, 110, 150, 200]
|
||||
names = ['mngmt', 'voice', 'video', 'dmz']
|
||||
|
||||
result = ['vlan {}\n name {}'.format(vlan, name) for vlan, name in zip(vlans, names)]
|
||||
|
||||
print(result)
|
||||
|
||||
['vlan 100\n name mngmt', 'vlan 110\n name voice', 'vlan 150\n name video', 'vlan 200\n name dmz']
|
||||
```
|
||||
|
||||
```python
|
||||
users = [{'name': 'Иван', 'age': 29},
|
||||
{'name': 'Андрей', 'age': 31},
|
||||
{'name': 'Настя', 'age': 22},
|
||||
{'name': 'Артём', 'age': 40}]
|
||||
|
||||
users_list = [user['name'] for user in users if user['age'] > 30]
|
||||
print(users_list)
|
||||
|
||||
['Андрей', 'Артём']
|
||||
```
|
||||
|
||||
```python
|
||||
vlans = [[10, 21, 35], [101, 115, 150], [111, 40, 50]]
|
||||
|
||||
result = [vlan for vlan_list in vlans for vlan in vlan_list]
|
||||
print(result)
|
||||
|
||||
[10, 21, 35, 101, 115, 150, 111, 40, 50]
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
### lambda
|
||||
|
||||
|
||||
```python
|
||||
list_square = [x ** 2 for x in range(5)]
|
||||
print(list_square)
|
||||
|
||||
[0, 1, 4, 9, 16]
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
106
rpi_VLAN.md
Normal file
106
rpi_VLAN.md
Normal file
@@ -0,0 +1,106 @@
|
||||
#### Настройка подынтерфейсов (VLAN) Raspberry Pi
|
||||
|
||||
1. Установить необходимый пакет
|
||||
```bash
|
||||
sudo apt install vlan
|
||||
```
|
||||
2. Создать виртуальный интерфейс
|
||||
```bash
|
||||
sudo vi /etc/network/interfaces.d/vlans
|
||||
```
|
||||
*пример содержимого файла*
|
||||
```bash
|
||||
auto eth0.10
|
||||
iface eth0.10 inet manual
|
||||
vlan-raw-device eth0
|
||||
```
|
||||
3. Настройка IP адреса на виртуальном интерфейсе
|
||||
```bash
|
||||
sudo vi /etc/dhcpcd.conf
|
||||
```
|
||||
*пример настройки*
|
||||
```bash
|
||||
# Example static IP configuration:
|
||||
|
||||
interface eth0
|
||||
static ip_address=10.0.20.125/24
|
||||
static routers=10.0.20.1
|
||||
static domain_name_servers=1.1.1.1
|
||||
|
||||
interface eth0.10
|
||||
static ip_address=10.0.10.125/24
|
||||
#static routers=10.0.10.1
|
||||
#static domain_name_servers=1.1.1.1
|
||||
```
|
||||
***static routers (он же шлюз по-умолчанию) может быть только один, поэтому его необходимо использовать где-то в одном месте (или на основном интерфейсе или на интерфейсе VLAN, в зависимости от настроек сети. DNS (static domain_name_servers) также достаточно настроить на одном интерфейсе, на котором этот DNS будет доступен.***
|
||||
|
||||
4. Применение изменений
|
||||
```bash
|
||||
sudo systemctl restart networking
|
||||
```
|
||||
|
||||
5. Убедиться, что настройки применились можно с помощью `hostname`
|
||||
```bash
|
||||
hostname -I
|
||||
```
|
||||
или
|
||||
```bash
|
||||
ip a
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
*По умолчанию в Raspberry для настроек сети используется dhcpcd ~~(не смог разобраться как в нем настраивать подынтерфейсы)~~ **- разобрался, описано выше***
|
||||
|
||||
**Альтернативный вариант настройки с использованием пакета networking.**
|
||||
*Необходимо отключить dhcpcd и включить networking*
|
||||
```bash
|
||||
sudo systemctl disable dhcpcd
|
||||
sudo systemctl enable networking
|
||||
```
|
||||
редактируем файл настроек сети
|
||||
```bash
|
||||
sudo nano /etc/network/interfaces
|
||||
```
|
||||
добавим в него строки:
|
||||
```
|
||||
# management ip
|
||||
auto eth0
|
||||
iface eth0 inet static
|
||||
address 192.168.5.1
|
||||
netmask 255.255.255.0
|
||||
|
||||
# first ntp server
|
||||
auto eth0.10
|
||||
iface eth0.10 inet static
|
||||
address 192.168.10.1
|
||||
netmask 255.255.255.0
|
||||
|
||||
# second ntp server
|
||||
auto eth0.20
|
||||
iface eth0.20 inet static
|
||||
address 192.168.20.1
|
||||
netmask 255.255.255.0
|
||||
|
||||
# wlan
|
||||
auto wlan0
|
||||
iface wlan0 inet dhcp
|
||||
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
|
||||
```
|
||||
сохраняем изменения _ctrl+o_, закрываем редактор _ctrl+x_
|
||||
для проверки правильности внесенных настроек перезагрузим сеть
|
||||
```bash
|
||||
sudo service networking restart
|
||||
```
|
||||
если в консоли не появилось сообщений с ошибками, значит всё настроено правильно
|
||||
увидеть настроенные интерфейсы и ip адреса командой
|
||||
```bash
|
||||
ip addr
|
||||
```
|
||||
|
||||
#### Временный подынтерфейс в Linux
|
||||
```
|
||||
ip link add link eth0 name eth0.103 type vlan id 103
|
||||
ip link set up dev eth0.103
|
||||
ip address add 192.168.130.34/28 dev eth0.103
|
||||
```
|
||||
191
rpi_printserver.md
Normal file
191
rpi_printserver.md
Normal file
@@ -0,0 +1,191 @@
|
||||
# Принт-сервер и сетевой сканер на Raspberry PI
|
||||
|
||||
_МФУ Samsung SCX3405W_
|
||||
|
||||
## Печать
|
||||
|
||||
Подразделени Samsung, которое занималось производством принтером было куплено компанией HP, поэтому справедливо установить драйвера HP и свободные драйвера
|
||||
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install hplip printer-driver-splix -y
|
||||
```
|
||||
|
||||
Установить службу печати линукс CUPS
|
||||
|
||||
```bash
|
||||
sudo apt-get install cups -y
|
||||
```
|
||||
|
||||
Необходимо добавить пользователя в группу lpadmin
|
||||
|
||||
```bash
|
||||
sudo usermod -a -G lpadmin da2001
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
Следующим этапом необходимо отредактировать конфигурационный файл службы печати
|
||||
|
||||
```bash
|
||||
vim /etc/cups/cupsd.conf
|
||||
```
|
||||
|
||||
строку `Listen localhost:631` необходимо изменить на `Port 631`
|
||||
|
||||
добваить две строки
|
||||
|
||||
```
|
||||
BrowseRemoteProtocols CUPS dnssd
|
||||
BrowseAddress @LOCAL
|
||||
```
|
||||
|
||||
Внести изменения в секцию Location, привести к виду:
|
||||
|
||||
```
|
||||
<Location />
|
||||
Order allow,deny
|
||||
Allow all
|
||||
</Location>
|
||||
```
|
||||
|
||||
В секции Location /admin закомментировать строку `Order allow,deny`
|
||||
|
||||
```
|
||||
<Location /admin>
|
||||
</Location>
|
||||
```
|
||||
|
||||
Перезапустить службу печати
|
||||
|
||||
```bash
|
||||
sudo systemctl restart cups
|
||||
```
|
||||
|
||||
Если всё настроено верно, должен отобразиться web-интрефейс https://print-server-ip:631
|
||||
|
||||

|
||||
|
||||
На вкладке Администрирование необходимо добавить новый принтер.
|
||||
В случае с Samsung SCX3405W, его нет в списке, но есть Samsung SCX3200 - он также подойдёт.
|
||||
|
||||
С настройкой принтера закончено, теперь он должен быть доступен в локальной сети.
|
||||
|
||||
## Сканирование
|
||||
|
||||
Необходимо установить пакет sane
|
||||
|
||||
```bash
|
||||
sudo apt install sane -y
|
||||
```
|
||||
|
||||
Далее необходимо убедиться, что сканер опознан в системе
|
||||
|
||||
```bash
|
||||
sudo sane-find-scanner
|
||||
```
|
||||
|
||||
_пример вывода_
|
||||
|
||||
```bash
|
||||
da2001@printserver:~ $ sudo sane-find-scanner
|
||||
|
||||
# sane-find-scanner will now attempt to detect your scanner. If the
|
||||
# result is different from what you expected, first make sure your
|
||||
# scanner is powered up and properly connected to your computer.
|
||||
|
||||
# No SCSI scanners found. If you expected something different, make sure that
|
||||
# you have loaded a kernel SCSI driver for your SCSI adapter.
|
||||
# Also you need support for SCSI Generic (sg) in your operating system.
|
||||
# If using Linux, try "modprobe sg".
|
||||
|
||||
found USB scanner (vendor=0x04e8 [Samsung Electronics Co., Ltd.], product=0x344f [SCX-3400 Series]) at libusb:001:004
|
||||
found USB scanner (vendor=0x0424, product=0xec00) at libusb:001:003
|
||||
# Your USB scanner was (probably) detected. It may or may not be supported by
|
||||
# SANE. Try scanimage -L and read the backend's manpage.
|
||||
|
||||
# Not checking for parallel port scanners.
|
||||
|
||||
# Most Scanners connected to the parallel port or other proprietary ports
|
||||
# can't be detected by this program.
|
||||
```
|
||||
|
||||
Можно попробовать выполнить Сканирование
|
||||
|
||||
```bash
|
||||
sudo scanimage -L
|
||||
```
|
||||
|
||||
пример вывода:
|
||||
|
||||
```bash
|
||||
Created directory: /var/lib/snmp/cert_indexes
|
||||
device 'xerox_mfp:libusb:001:004' is a Samsung Samsung SCX-3400 Series multi-function peripheral
|
||||
```
|
||||
|
||||
свидетельствует о готовности сканера
|
||||
|
||||
Непосредственно само сканирование
|
||||
|
||||
```bash
|
||||
scanimage > ~/test-scan-file.pnm
|
||||
```
|
||||
|
||||
Получить информацию о созданном файле
|
||||
|
||||
```bash
|
||||
file test-scan-file.pnm
|
||||
```
|
||||
|
||||
### Сетевое сканирование
|
||||
|
||||
Изменить конфигурацию для включения демона saned
|
||||
|
||||
```bash
|
||||
sudo vim /etc/default/saned
|
||||
```
|
||||
|
||||
добавить строку `RUN=yes`
|
||||
|
||||
В основном конфигурациооном файле `/etc/sane.d/saned.conf` необходимо указать сеть доступности сканирования
|
||||
|
||||
```
|
||||
192.168.13.0/24
|
||||
```
|
||||
|
||||
кроме этого необходимо раскомментировать строку
|
||||
|
||||
```
|
||||
data_portrange = 10000 - 10100
|
||||
```
|
||||
|
||||
Также необходимо изменить разрешения, чтобы демон saned мог запускаться не от рута. В части вывода `sane-find-scanner` было показано
|
||||
|
||||
```
|
||||
found USB scanner (vendor=0x04e8 [Samsung Electronics Co., Ltd.], product=0x344f [SCX-3400 Series]) at libusb:001:004
|
||||
|
||||
```
|
||||
|
||||
`libusb:001:004` сообщает, что сканер находится по адресу /dev/bus/usb/001/004
|
||||
|
||||
Проверим права этого файла
|
||||
|
||||
```bash
|
||||
da2001@printserver:~ $ ls -l /dev/bus/usb/001
|
||||
итого 0
|
||||
crw-rw-r-- 1 root root 189, 0 мая 6 19:37 001
|
||||
crw-rw-r-- 1 root root 189, 1 мая 6 18:09 002
|
||||
crw-rw-r-- 1 root root 189, 2 мая 6 18:09 003
|
||||
crw-rw-r--+ 1 root lp 189, 3 мая 6 19:39 004
|
||||
```
|
||||
|
||||
как видно из вывода, файлом владеет root с группой lp (linux print). Нам нужно добавить демона sane в группу lp, чтобы дать ему необходимые разрешения:
|
||||
|
||||
```bash
|
||||
sudo adduser saned lp
|
||||
```
|
||||
|
||||
В конце необходимо запустить saned
|
||||
|
||||
```bash
|
||||
sudo systemctl enable --now saned.socket
|
||||
```
|
||||
4
rpi_serial_num.md
Normal file
4
rpi_serial_num.md
Normal file
@@ -0,0 +1,4 @@
|
||||
**Вывести серийный номер Raspberry в консоль**
|
||||
```
|
||||
cat /proc/cpuinfo | grep Serial | cut -d' ' -f2
|
||||
```
|
||||
52
rpi_static_route.md
Normal file
52
rpi_static_route.md
Normal file
@@ -0,0 +1,52 @@
|
||||
### Статический маршрут на Raspberry Pi
|
||||
|
||||
**синтаксис ip ro**
|
||||
```bash
|
||||
ip route add <IP/Net> via <Gateway IP>
|
||||
```
|
||||
Все параметры можно посмотреть `ip route help`
|
||||
|
||||
Пример:
|
||||
```bash
|
||||
ip ro add 192.168.2.0/24 via 192.168.0.1
|
||||
ip ro add 192.168.3.159/32 via 192.168.0.1
|
||||
```
|
||||
*в команде ip можно использовать сокращенный синтаксис ip ro … в место ip route …*
|
||||
Для удаления статического маршрута используйте **del** вместо **add**
|
||||
|
||||
Добавить маршрут по умолчанию
|
||||
```bash
|
||||
ip route add default via 10.7.0.1 dev enp1s0
|
||||
```
|
||||
маршрут через `10.7.0.1` (допустим наш роутер) через интерфейс с именем `enp1s0`
|
||||
|
||||
***
|
||||
|
||||
**Постоянный статический маршрут**
|
||||
```bash
|
||||
pi@raspberrypi:~ $ uname -a
|
||||
Linux raspberrypi 4.19.57-v7+ #1244 SMP Thu Jul 4 18:45:25 BST 2019 armv7l GNU/Linux
|
||||
pi@raspberrypi:~ $ lsb_release -a
|
||||
No LSB modules are available.
|
||||
Distributor ID: Raspbian
|
||||
Description: Raspbian GNU/Linux 10 (buster)
|
||||
Release: 10
|
||||
Codename: buster
|
||||
```
|
||||
|
||||
*чтобы маршрут сохранился после перезагрузки, его необходимо добавить в папку `/lib/dhcpcd/dhcpcd-hooks/`*
|
||||
*по-умолчанию, в этой папке уже есть несколько конфигурационных файлов, можно воспользоваться ими или создать свой*
|
||||
```bash
|
||||
pi@raspberrypi:~ $ cat /lib/dhcpcd/dhcpcd-hooks/
|
||||
01-test 02-dump 10-wpa_supplicant 20-resolv.conf 30-hostname 50-ntp.conf 90-static-routes.conf
|
||||
```
|
||||
Как видно из названия, статические маршруты описываются в этом файле `90-static-routes.conf`
|
||||
*по-умолчанию, файл пустой*
|
||||
Добавим маршрут
|
||||
```bash
|
||||
pi@raspberrypi:~ $ cat /lib/dhcpcd/dhcpcd-hooks/90-static-routes.conf
|
||||
# route to inband management test nets
|
||||
|
||||
ip route add 10.254.0.0/16 via 192.168.90.100
|
||||
|
||||
```
|
||||
13
rpi_wifi_disable.md
Normal file
13
rpi_wifi_disable.md
Normal file
@@ -0,0 +1,13 @@
|
||||
Чтобы полностью отключить встроенный WiFi на Pi3 / Pi4, необходимо добавить строку
|
||||
|
||||
`dtoverlay=disable-wifi`
|
||||
|
||||
в файл `/boot/config.txt`.
|
||||
|
||||
Например, чтобы отключить Wi-Fi и Bluetooth, необходимо добавить две строки:
|
||||
```bash
|
||||
dtoverlay=disable-wifi
|
||||
dtoverlay=disable-bt
|
||||
```
|
||||
|
||||
Замечение: если используется Pi3 и старая версия ПО, необходимо добавить префикс pi3- `dtoverlay=pi3-disable-wifi`
|
||||
97
rpi_Сетевой_мост_(bridge).md
Normal file
97
rpi_Сетевой_мост_(bridge).md
Normal file
@@ -0,0 +1,97 @@
|
||||
#### Сетевой мост (Bridge)
|
||||
*объединение в бридж встроенного сетевого интерфейса Ethernet и USB сетевой карты*
|
||||
|
||||
1. Установить пакет `bridge-utils`
|
||||
```bash
|
||||
sudo apt-get install bridge-utils
|
||||
```
|
||||
2. Создать бридж `br0` и задать ему IP адрес
|
||||
*после подключения USB сетевой карты, в Raspberry имеются следующие сетевые интерфейсы:
|
||||
`eth0` - встроенный интерфейс Ethernet
|
||||
`eth1` - интерфейс USB сетевой карты
|
||||
`wlan0` - беспроводной интерфейс*
|
||||
*объединим в бридж проводные интерфейсы `eth0` `eth1`*
|
||||
```bash
|
||||
sudo nano /etc/network/interfaces
|
||||
```
|
||||
для получения адреса от DHCP сервера:
|
||||
```
|
||||
# Настройка интерфейсов вручную, чтобы избежать конфликтов, например с network manager
|
||||
iface eth0 inet manual
|
||||
iface eth1 inet manual
|
||||
|
||||
auto br0
|
||||
iface br0 inet dhcp
|
||||
bridge_ports eth0 eth1
|
||||
```
|
||||
для ручной настройки IP адреса:
|
||||
```
|
||||
# Настройка интерфейсов вручную, чтобы избежать конфликтов, например с network manager
|
||||
iface eth0 inet manual
|
||||
iface eth1 inet manual
|
||||
|
||||
# Настройки бриджа
|
||||
auto br0
|
||||
iface br0 inet static
|
||||
bridge_ports eth0 eth1
|
||||
address 192.168.5.7
|
||||
netmask 255.255.255.0
|
||||
```
|
||||
3. Необходимо запретить использование интерфейсов `eth0` `eth1` в dhcpcd
|
||||
```bash
|
||||
sudo nano /etc/dhcpcd.conf
|
||||
```
|
||||
вставить следующую строку
|
||||
```
|
||||
denyinterfaces eth0 eth1
|
||||
```
|
||||
4. Восстановление Wi-Fi
|
||||
*после задания статического IP адреса в `/etc/network/interfaces` не работает беспроводная сеть*
|
||||
*для восстановления возможности использования Wi-Fi необходимо:*
|
||||
- отключить службу `dhcpcd`
|
||||
```bash
|
||||
sudo systemctl disable dhcpcd
|
||||
sudo systemctl enable networking
|
||||
```
|
||||
или
|
||||
- запретить использование беспроводного интерфейса службой dhcpcd
|
||||
```bash
|
||||
sudo nano /etc/dhcpcd.conf
|
||||
```
|
||||
вставить следующую строку
|
||||
```
|
||||
denyinterfaces wlan0
|
||||
```
|
||||
|
||||
вне зависимости от выбранного способа, настройки беспроводной сети необходимо произвести вручную
|
||||
```bash
|
||||
sudo nano /etc/network/interfaces
|
||||
```
|
||||
добавить
|
||||
```bash
|
||||
# wlan
|
||||
auto wlan0
|
||||
iface wlan0 inet dhcp
|
||||
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
|
||||
|
||||
```
|
||||
задать параметры конкретной беспроводной сети
|
||||
```bash
|
||||
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
|
||||
```
|
||||
добавить
|
||||
```
|
||||
country=RU
|
||||
|
||||
network={
|
||||
ssid="название сети"
|
||||
psk="пароль"
|
||||
}
|
||||
|
||||
```
|
||||
*в документации описан способ, при котором можно зашифровать отображение пароля
|
||||
https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md*
|
||||
5. Перезагрузить Raspberry для вступления изменений в силу
|
||||
```bash
|
||||
sudo reboot
|
||||
```
|
||||
27
serial_con.md
Normal file
27
serial_con.md
Normal file
@@ -0,0 +1,27 @@
|
||||
**Serial connection via USB**
|
||||
|
||||
1. Необходимо выяснить к какому порту происходит подключение при включении USB кабеля.
|
||||
*до подключения кабеля*
|
||||
```bash
|
||||
ls /dev | grep USB
|
||||
```
|
||||
*подключить кабель и повторить ввод команды*
|
||||
```bash
|
||||
user@host:~$ ls /dev | grep USB
|
||||
ttyUSB0
|
||||
```
|
||||
|
||||
2. Уточнить кому принадлежит устройство (пользователь:группа)
|
||||
```bash
|
||||
ls -l /dev/ttyUSB0
|
||||
```
|
||||
*пример вывода*
|
||||
```bash
|
||||
da2001@Metromint:~$ ls -l /dev/ttyUSB0
|
||||
crw-rw---- 1 root dialout 188, 0 авг 26 09:41 /dev/ttyUSB0
|
||||
```
|
||||
*из вывода понятно, что права на запись есть у владельца и группы. Необходимо добавить своего пользователя в эту группу*
|
||||
```bash
|
||||
sudo usermod -aG dialout $USER
|
||||
```
|
||||
*для вступления изменений в силу необходимо перелогиниться.*
|
||||
91
ssh.md
Normal file
91
ssh.md
Normal file
@@ -0,0 +1,91 @@
|
||||
### ssh
|
||||
Подключение
|
||||
```bash
|
||||
ssh admin@192.168.5.3
|
||||
```
|
||||
если имя пользователя не указывать, соединение произойдет от имени локального пользователя
|
||||
```bash
|
||||
ssh 192.168.5.3
|
||||
```
|
||||
не стандартный порт при подключении
|
||||
```bash
|
||||
ssh pi@da2001.ru -p 227
|
||||
```
|
||||
не добавлять публичный ключ удаленного хоста в локальный файл _**known_hosts**_, при этом будет запрошено подтверждение подключения
|
||||
```bash
|
||||
ssh -o UserKnownHostsFile=/dev/null admin@192.168.1.2
|
||||
```
|
||||
не проверять публичный ключ удаленного хоста
|
||||
```bash
|
||||
ssh -o StrictHostKeyChecking=no admin@192.168.1.2
|
||||
```
|
||||
не добавлять публичный ключ и не проверять удаленный хост
|
||||
```bash
|
||||
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.1.2
|
||||
```
|
||||
выполнить команду на сервере без подключения
|
||||
```bash
|
||||
ssh user@host ls
|
||||
```
|
||||
выполнить локальный скрипт
|
||||
```bash
|
||||
ssh da2001@192.168.1.2 'python3' < test.py
|
||||
```
|
||||
|
||||
### scp
|
||||
```bash
|
||||
scp ./wlt.py pi@da2001.ru:/home/pi
|
||||
```
|
||||
использование не стандартного порта
|
||||
```bash
|
||||
scp -P 227 ./wlt.py pi@da2001.ru:/home/pi
|
||||
```
|
||||
|
||||
|
||||
|
||||
### ssh аутентификация по ключам
|
||||
|
||||
**На локальном хосте linux сгенерировать пару ключей**
|
||||
|
||||
```bash
|
||||
ssh-keygen
|
||||
```
|
||||
парольную фразу можно оставить пустой, чтобы не вводить пароль каждый раз при обращении к ключу
|
||||
_По умолчанию ключи будут храниться в каталоге ~/.ssh в домашнем каталоге текущего пользователя. Закрытый ключ будет называться **id_rsa**, а связанный с ним открытый ключ – **id_rsa.pub**_
|
||||
|
||||
Теперь необходимо скопировать публичный ключ на сервер, доступ к которому настраиваем
|
||||
```bash
|
||||
cat ~/.ssh/id_rsa.pub | ssh login@example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
|
||||
```
|
||||
**Для дополнительной безопасности можно отключить доступ по паролю**
|
||||
Для этого необходимо отредактировать конфигурационный файл демона SSH raspberry
|
||||
```bash
|
||||
sudo nano /etc/ssh/sshd_config
|
||||
```
|
||||
Найти директиву _PasswordAuthentication_, раскомментировать ее и присвоить значение _no_
|
||||
`PasswordAuthentication no`
|
||||
Сохранить файл, закрыть.
|
||||
Перезагрузить сервис
|
||||
```bash
|
||||
sudo systemctl restart ssh
|
||||
```
|
||||
|
||||
### подключение через промежуточный хост
|
||||
_если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой_
|
||||
```
|
||||
ssh -J user1@host1:22 user2@host2
|
||||
```
|
||||
но в таком случае придется вводить пароль от host1 и от host2. Чтобы этого избежать можно добавить на хосты публичный ключ клиента
|
||||
|
||||
если добавить к подключению опции:
|
||||
```
|
||||
-o UserKnownHostsFile=/dev/null
|
||||
-o StrictHostKeyChecking=no
|
||||
```
|
||||
удаленный сервер не будет проверять и не будет добавлять хеш удаленного хоста в файл _**known_hosts**_
|
||||
|
||||
это может быть полезно, например, когда часто меняется прошивка зондов и хеш изменяется.
|
||||
Таким образом, полная команда может выглядеть так:
|
||||
```
|
||||
ssh -J pi@da2001.ru:227 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.5.3
|
||||
```
|
||||
341
start_bash.md
Normal file
341
start_bash.md
Normal file
@@ -0,0 +1,341 @@
|
||||
### Немного bash
|
||||
|
||||
###### top
|
||||
[args | Позиционные аргументы](#args)
|
||||
[var | Переменные](#var)
|
||||
[read | запрос ввода](#read)
|
||||
[if... then... else](#if)
|
||||
[for](#for)
|
||||
[&& и ||](#and-or)
|
||||
[while](#while)
|
||||
[until](#until)
|
||||
[case](#case)
|
||||
|
||||
***
|
||||
|
||||
##### args
|
||||
**Позиционные аргументы**
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# запусти скрипт с несколькими аргументами
|
||||
echo Первый аргумент - $1
|
||||
echo Второй аргумент - $2
|
||||
echo Третий аргумент - $3
|
||||
```
|
||||
*примеры запуска скрипта*
|
||||
```bash
|
||||
user@host:~$ ./scr arg1 arg2 arg3
|
||||
Первый аргумент - arg1
|
||||
Второй аргумент - arg2
|
||||
Третий аргумент - arg3
|
||||
user@host:~$ ./scr arg1 arg2
|
||||
Первый аргумент - arg1
|
||||
Второй аргумент - arg2
|
||||
Третий аргумент -
|
||||
user@host:~$ ./scr arg1 arg2 arg3 arg4
|
||||
Первый аргумент - arg1
|
||||
Второй аргумент - arg2
|
||||
Третий аргумент - arg3
|
||||
```
|
||||
**Перебор аргументов в цикле**
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# run this script with a few arguments
|
||||
echo you have entered $# arguments
|
||||
for i in "$@"; do
|
||||
echo $i
|
||||
done
|
||||
exit 0
|
||||
```
|
||||
`$#` - счетчик, показывающий, сколько аргументов было использовано при запуске сценарий.
|
||||
`$@` - относится ко всем аргументам, которые использовались при запуске сценария.
|
||||
*пример запуска скрипта*
|
||||
```bash
|
||||
user@host:~$ ./scr arg1 arg2 arg3 arg4
|
||||
you have entered 4 arguments
|
||||
arg1
|
||||
arg2
|
||||
arg3
|
||||
arg4
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
##### var
|
||||
Переменные
|
||||
|
||||
`var=value`
|
||||
```bash
|
||||
user@host:~$ var="значение переменной"
|
||||
user@host:~$ echo $var
|
||||
значение переменной
|
||||
|
||||
user@host:~$ var=8
|
||||
user@host:~$ echo $var
|
||||
8
|
||||
|
||||
user@host:~$ today=$(date +%d.%m.%Y)
|
||||
user@host:~$ echo $today
|
||||
03.08.2021
|
||||
|
||||
user@host:~$ today=`date +%d.%m.%Y`
|
||||
user@host:~$ echo $today
|
||||
03.08.2021
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
##### read
|
||||
Запрос ввода
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
if [ -z $1 ]; then
|
||||
echo Введите имя
|
||||
read NAME
|
||||
else
|
||||
NAME=$1
|
||||
fi
|
||||
echo Вы ввели - $NAME
|
||||
exit 0
|
||||
```
|
||||
`-z $1` - проверка существования аргумента
|
||||
все возможные значения проверок в справке
|
||||
`man test`
|
||||
*перевод доступен здесь https://www.opennet.ru/man.shtml?topic=test&category=1&russian=0*
|
||||
|
||||
*пример запуска скрипта*
|
||||
```bash
|
||||
user@host:~$ ./scr Катя
|
||||
Вы ввели - Катя
|
||||
user@host:~$ ./scr
|
||||
Введите имя
|
||||
Ира
|
||||
Вы ввели - Ира
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
##### if
|
||||
if... then... else
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
# скрипт проверяет тип файла, переданного в качестве аргумента при запуске
|
||||
|
||||
if [ -f $1 ]
|
||||
then
|
||||
echo "$1 - это файл"
|
||||
elif [ -d $1 ]
|
||||
then
|
||||
echo "$1 - это директория"
|
||||
else
|
||||
echo "Не понятно, что это \$1"
|
||||
fi
|
||||
exit 0
|
||||
```
|
||||
*пример запуска*
|
||||
```bash
|
||||
[da2001@co1 scripts]$ ./filechk /etc/hosts
|
||||
/etc/hosts - это файл
|
||||
[da2001@co1 scripts]$ ./filechk /etc
|
||||
/etc - это директория
|
||||
[da2001@co1 scripts]$ ./filechk ./non_exist_file
|
||||
Не понятно, что это $1
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
##### for
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
for i in {0..6}
|
||||
do
|
||||
echo "Hi $i"
|
||||
done
|
||||
```
|
||||
|
||||
```bash
|
||||
user@host:~$ ./scr
|
||||
Hi 0
|
||||
Hi 1
|
||||
Hi 2
|
||||
Hi 3
|
||||
```
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
for i in Ира Лена Катя
|
||||
do
|
||||
echo "Hi, $i"
|
||||
done
|
||||
```
|
||||
|
||||
```bash
|
||||
user@host:~$ ./scr
|
||||
Hi, Ира
|
||||
Hi, Лена
|
||||
Hi, Катя
|
||||
```
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
for (( c=1; c<=5; c++ ))
|
||||
do
|
||||
echo "Hi $c"
|
||||
done
|
||||
```
|
||||
|
||||
```bash
|
||||
user@host:~$ ./scr
|
||||
Hi 1
|
||||
Hi 2
|
||||
Hi 3
|
||||
Hi 4
|
||||
Hi 5
|
||||
```
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
for (( c=4; c>=0; c-- ))
|
||||
do
|
||||
echo "Hi $c"
|
||||
done
|
||||
```
|
||||
|
||||
```bash
|
||||
user@host:~$ ./scr
|
||||
Hi 4
|
||||
Hi 3
|
||||
Hi 2
|
||||
Hi 1
|
||||
Hi 0
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
##### and, or
|
||||
&& и ||
|
||||
|
||||
`&&` - логическое И. Вторая часть оператора будет выполнена только если первая часть истинна.
|
||||
`||` - логическое ИЛИ. Вторая часть оператора будет выполнена только если первая часть неверна.
|
||||
|
||||
```bash
|
||||
user@host:~$ for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done
|
||||
192.168.1.10 - доступен
|
||||
192.168.1.11 - доступен
|
||||
192.168.1.12 - доступен
|
||||
192.168.1.13 - НЕ доступен
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
##### while
|
||||
`while` - выполнять пока условие истинно
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
x=1
|
||||
while [ $x -lt 5 ]
|
||||
do
|
||||
echo "Значение счетчика: $x"
|
||||
x=$(( $x + 1 ))
|
||||
done
|
||||
```
|
||||
|
||||
```bash
|
||||
user@host:~$ ./scr
|
||||
Значение счетчика: 1
|
||||
Значение счетчика: 2
|
||||
Значение счетчика: 3
|
||||
Значение счетчика: 4
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
##### until
|
||||
`until` - выполнять пока условие ложно
|
||||
```bash
|
||||
#!/bin/bash
|
||||
count=1
|
||||
until [ $count -gt 4 ]
|
||||
do
|
||||
echo "Значение счетчика: $count"
|
||||
count=$(( $count + 1 ))
|
||||
done
|
||||
```
|
||||
|
||||
```bash
|
||||
user@host:~$ ./scr
|
||||
Значение счетчика: 1
|
||||
Значение счетчика: 2
|
||||
Значение счетчика: 3
|
||||
Значение счетчика: 4
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
|
||||
##### case
|
||||
`case` - перебор условий
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
echo -n "Введите страну: "
|
||||
read COUNTRY
|
||||
|
||||
echo -n "Официальный язык в стране $COUNTRY это "
|
||||
|
||||
case $COUNTRY in
|
||||
|
||||
Литва)
|
||||
echo "Латвийский"
|
||||
;;
|
||||
|
||||
Румыния | Молдова)
|
||||
echo "Румынский"
|
||||
;;
|
||||
|
||||
Италия | "Сан Марино" | Швейцария | "Ватикан")
|
||||
echo "Итальянский"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "unknown"
|
||||
;;
|
||||
esac
|
||||
```
|
||||
- каждое условие заканчивается `)`
|
||||
- после условия описываются команды, которые необходимо выполнить, в конце ставится `;;`
|
||||
- `*)` относится ко всем остальным значениям, которые явно не указаны ранее
|
||||
|
||||
```bash
|
||||
user@host:~$ ./scr
|
||||
Введите страну: Ватикан
|
||||
Официальный язык в стране Ватикан это Итальянский
|
||||
user@host:~$ ./scr
|
||||
Введите страну: Россия
|
||||
Официальный язык в стране Россия это unknown
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
|
||||
***
|
||||
1443
start_linux.md
Normal file
1443
start_linux.md
Normal file
File diff suppressed because it is too large
Load Diff
65
tar.md
Normal file
65
tar.md
Normal file
@@ -0,0 +1,65 @@
|
||||
### TAR
|
||||
|
||||
**Создать архив**
|
||||
```
|
||||
tar -cvf archivename.tar /files-you-want-toarchive
|
||||
```
|
||||
-c, --create create a new archive
|
||||
-v, --verbose verbosely list files processed
|
||||
-f, --file=ARCHIVE use archive file or device ARCHIVE
|
||||
|
||||
|
||||
**Создать архив со сжатием**
|
||||
```
|
||||
tar -czvf archivename.tar.gz /files-you-want-toarchive
|
||||
```
|
||||
-j, --bzip2 filter the archive through bzip2
|
||||
-J, --xz filter the archive through xz
|
||||
-z, --gzip, --gunzip, --ungzip filter the archive through gzip
|
||||
|
||||
|
||||
**Добавить файл в существующий архив**
|
||||
```
|
||||
tar -rvf /root/homes.tar /etc/hosts
|
||||
```
|
||||
-r, --append append files to the end of an archive
|
||||
|
||||
|
||||
**Обновить файлы в существующем архиве**
|
||||
```
|
||||
tar -uvf /root/homes.tar /home
|
||||
```
|
||||
-u, --update only append files newer than copy in archive
|
||||
|
||||
|
||||
**Просмотр содержимого архива**
|
||||
```
|
||||
tar -tvf /root/homes.tar
|
||||
```
|
||||
-t, --list list the contents of an archive
|
||||
|
||||
|
||||
**Извлечь файлы из архива в текущий каталог**
|
||||
```
|
||||
tar -xvf /archivename
|
||||
```
|
||||
-x, --extract, --get extract files from an archive
|
||||
|
||||
|
||||
**Извлечь файлы из сжатого архива**
|
||||
```
|
||||
tar -xzvf archivename.tar.gz
|
||||
```
|
||||
|
||||
|
||||
**Извлечь файлы из архива в другой каталог**
|
||||
```
|
||||
tar -xvf /archivename -C /tmp
|
||||
```
|
||||
-C, --directory=DIR change to directory DIR
|
||||
|
||||
|
||||
**Извлечь определённый файл из архива**
|
||||
```
|
||||
tar -xvf /root/etc.tar etc/hosts
|
||||
```
|
||||
155
tcpdump.md
Normal file
155
tcpdump.md
Normal file
@@ -0,0 +1,155 @@
|
||||
### tcpdump
|
||||
_возможные сетевые интерфейсы для захвата_
|
||||
`sudo tcpdump -D`
|
||||
|
||||
_указать конкретный интерфейс_
|
||||
`sudo tcpdump -i eth0`
|
||||
|
||||
_больше информации в выводе_
|
||||
`sudo tcpdump -v -i eth0`
|
||||
|
||||
host - _имя хоста;_
|
||||
ip - _ip адрес;_
|
||||
proto - _протокол;_
|
||||
net - _адрес сети или подсети;_
|
||||
port - _адрес порта;_
|
||||
src - _параметр, касающийся отправителя;_
|
||||
dst - _параметр, касающейся получателя;_
|
||||
|
||||
`sudo tcpdump -i eth0 src host 192.168.1.2 and not port 22`
|
||||
|
||||
`sudo tcpdump -v -n -A -e not port 22 and not port 123 and not stp`
|
||||
|
||||
`sudo tcpdump -v -n -A -e -i eth0 src host 192.168.5.1 and tcp`
|
||||
v - _более подробный вывод_
|
||||
n - _не подменять значения на названия, например - указывать ff:ff:ff:ff:ff:ff вместо Broadcast_
|
||||
A - _выводить всё в ASCII_
|
||||
e - _выводить данные L2_
|
||||
|
||||
|
||||
#### Подробнее
|
||||
**Ключи**
|
||||
_Наиболее часто используемые ключи при запуске tcpdump приведены таблице_
|
||||
ключ описание
|
||||
|
||||
-a _Преобразовывает сетевые и широковещательные адреса в доменные имена._
|
||||
-e _Отображает данные канального уровня (MAC-адрес, протокол, длина пакета). Помимо IP-адресов будут отображаться MAC-адреса компьютеров._
|
||||
-F _файл. Использовать фильтр, находящийся в файле. Если вы используете этот параметр, фильтр из командной строки будет игнорироваться._
|
||||
-i _Указывает на то, какой сетевой интерфейс будет использоваться для захвата пакетов. По умолчанию — eth0, для выбора всех интерфейсов — any. Если отсутствует локальная сеть, то можно воспользоваться интерфейсом обратной связи lo._
|
||||
-l _Использовать стандартный потоковый вывод tcpdump (stdout), например для записи в файл:
|
||||
`shell# tcpdump -l | tee out.log //отобразит работу tcpdump и сохранит результат в файле out.log`_
|
||||
-N _Не добавляет доменное расширение к именам узлов. Например tcpdump отобразит `net` вместо `net.library.org`_
|
||||
-n _Отображает IP-адрес вместо имени хоста._
|
||||
-nn _Отображает номер порта вместо используемого им протокола._
|
||||
-p _Не переводит интерфейс в режим приема всех пакетов (promiscuous mode)._
|
||||
-q _Выводит минимум информации. Обычно это имя протокола, откуда и куда шел пакет, порты и количество переданных данных._
|
||||
-r _Этот параметр позволяет tcpdump прочесть трафик из файла, если он был предварительно сохранен параметром -w._
|
||||
-S _Позволяет не обрабатывать абсолютные порядковые номера (initial sequence number — ISN) в относительные._
|
||||
-s _число. Количество байтов пакета, которые будет обрабатывать tcpdump. При установке большого числа отображаемых байтов информация может не уместиться на экране и её будет трудно изучать. В зависимости от того, какие цели вы преследуете, и следует выбирать значение этого параметра. По умолчанию tcpdump захватывает первые 68 байт (для SunOS минимум 96 байт), однако если вы хотите увидеть содержимое всего пакета, используйте значение в 1514 байт (максимально допустимый размер кадра в сети Ethernet)._
|
||||
-t _Не отображает метку времени в каждой строке._
|
||||
-T _тип. Интерпретация пакетов заданного типа. Поддерживаются типы aodv, cnfp, rpc, rtp, rtcp, snmp, tftp, vat, wb._
|
||||
-tt _Отображает неформатированную метку времени в каждой строке._
|
||||
-tttt _Показывает время вместе с датой._
|
||||
-v _Вывод подробной информации (TTL; ID; общая длина заголовка, а также его параметры; производит проверку контрольных сумм IP и ICMP-заголовков)_
|
||||
-vv _Вывод ещё более полной информации, в основном касается NFS и SMB._
|
||||
-vvv _Вывод максимально подробной информации._
|
||||
-w _файл. Сохраняет данные tcpdump в двоичном формате. Преимущества использования данного способа по сравнению с обычным перенаправлением в файл является высокая скорость записи и возможность чтения подобных данных другими программами, например snort, но этот файл нельзя прочитать человеку. Возможен вывод двоичных данных на консоль, для этого необходимо использовать -w —_
|
||||
-x _Делает распечатку пакета в шестнадцатеричной системе, полезно для более детального анализа пакета. Количество отображаемых данных зависит от параметра -s_
|
||||
-xx _То же, что и предыдущий параметр -x, но включает в себя заголовок канального уровня_
|
||||
-X _Выводит пакет в ASCII- и hex-формате. Полезно в случае анализа инцидента связанного со взломом, так как позволяет просмотреть какая текстовая информация передавалась во время соединения._
|
||||
-XX _То же, что и предыдущий параметр -X, но включает заголовок канального уровня._
|
||||
-с _число. tcpdump завершит работу после получения указанного числа пакетов._
|
||||
-U _Собранные пакеты будут сразу складываться в файл, а иначе копиться в памяти до тех пор, пока она не закончится_
|
||||
|
||||
**Фильтры tcpdump**
|
||||
Фильтры разделяются на следующие классификации
|
||||
|
||||
Тип
|
||||
host — _адрес узла сети_
|
||||
port – _порт на котором нужно ловить пакеты_
|
||||
portrange – _диапазон портов_
|
||||
net – _сеть_
|
||||
_пример_
|
||||
```bash
|
||||
tcpdump net 192.168.0.0/24
|
||||
```
|
||||
_захват всего трафика в котором в качестве источника или получателя стоят ip адреса из сети 192.168.0.0/24_
|
||||
```bash
|
||||
tcpdump port 80
|
||||
```
|
||||
_Будет захватываться весь трафик на 80-м порту._
|
||||
Направление трафика по отношению к объекту мониторинга
|
||||
src – _отправитель_
|
||||
dst — _получатель_
|
||||
_например команда_
|
||||
```bash
|
||||
src host 172.31.25.200
|
||||
```
|
||||
_Захват трафика у которого отправитель ip адрес 172.31.25.200_
|
||||
|
||||
Протокол
|
||||
ether – _базовая сетевая технология Ethernet, как правило указывает на то что в фильтре используется аппаратный MAC адрес_
|
||||
ip – _протокол IPv4_
|
||||
ip6 – _протокол IPv6_
|
||||
arp – _протокол ARP_
|
||||
tcp – _протокол TCP_
|
||||
udp – _протокол UDP_
|
||||
_Если протокол не указан, то будет захвачен трафик по всем протоколам_
|
||||
_Например команда_
|
||||
```bash
|
||||
udp port 5060
|
||||
```
|
||||
_захват трафика по протоколу udp порт 5060_
|
||||
|
||||
Составные фильтры
|
||||
_Для того что бы более гибко фильтровать трафик можно использовать логические операции_
|
||||
«И» – _and (&&)_
|
||||
«ИЛИ» – _or (||)_
|
||||
«НЕ» – _not (!) – инверсия значения_
|
||||
|
||||
При этом приоритет этих операций следующий:
|
||||
наивысшим приоритетом обладает операция инверсии
|
||||
потом логическое «И»
|
||||
наименьшим приоритетом обладает операция «ИЛИ».
|
||||
|
||||
Приоритет операций можно менять с помощью круглых скобок.
|
||||
`(net 172.16.0.0/24 or host 172.31.0.5) and tcp port 80`
|
||||
_захват трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5, как любому хосту по отдельности так и вместе_
|
||||
`(net 172.16.0.0/24 || host 172.31.0.5) && not tcp port 80`
|
||||
_захват любого трафика кроме трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5 как любому хосту по отдельности так и вместе_
|
||||
|
||||
**Фильтры tcpdump со смещением, пример**
|
||||
Отфильтровать все UDP внутри GRE по смещению
|
||||
Отсчет ведется в байтах начиная от внешнего заголовка IP пакета, отсчет идет с 0, т.е. `ip[0]` это поле версии протокола, обычно это `0x45`
|
||||
```
|
||||
sniff(offline="erspan.pcap", filter="ip[71] == 0x11")
|
||||
```
|
||||
71 - смещение
|
||||
0x11 - 17 в hex, т.е. UDP
|
||||
Смещение не обязательно считать от IP заголовка, можно и от других
|
||||
|
||||
**tcpdump linux примеры**
|
||||
Запись вывода в файл
|
||||
```bash
|
||||
$ sudo tcpdump -w sshtrace.tcpdump tcp port 22
|
||||
```
|
||||
_Файл sshtrace.tcpdump будет по-умолчанию создан в домашнем каталоге текущего пользователя. Для вывода информации из файла myrouter.tcpdump следует использовать опцию -r:_
|
||||
```bash
|
||||
$ tcpdump -r sshtrace.tcpdump
|
||||
```
|
||||
Снять весь трафик с интерфейса eth1
|
||||
```bash
|
||||
$ tcpdump –i eth1
|
||||
```
|
||||
Снять трафик с диапазона портов на интерфейсе eth1
|
||||
```bash
|
||||
$ tcpdump -i eth1 portrange 100-200
|
||||
```
|
||||
весь трафик, идущий к 172.16.0.1, который не является ICMP.
|
||||
```bash
|
||||
tcpdump dst 172.16.0.1 and not icmp
|
||||
```
|
||||
Ловим весь входящий трафик, исключая трафик генерируемый нашей SSH-сессией.
|
||||
```bash
|
||||
$ tcpdump -i eth0 -n -nn -ttt 'dst host 172.16.0.10 and not (src host 172.16.0.11 and dst port 22)'
|
||||
```
|
||||
57
tmux.md
Normal file
57
tmux.md
Normal file
@@ -0,0 +1,57 @@
|
||||
### TMUX
|
||||
|
||||
***Конфиг*** *(пользовательский / системный)*
|
||||
```bash
|
||||
~/.tmux.conf
|
||||
/etc/tmux.conf
|
||||
```
|
||||
|
||||
***Включить поддержку мыши*** *(в конфиг добавить)*
|
||||
```bash
|
||||
set -g mouse on
|
||||
```
|
||||
|
||||
***Запуск*** *(без параметров будет создана сессия `0`)*
|
||||
```bash
|
||||
tmux
|
||||
```
|
||||
новая сессия `session1`. Название отображается снизу-слева в квадратных скобках в статус строке. Далее идет перечисление окон. Текущее окно помечается звездочкой.
|
||||
```bash
|
||||
tmux new -s session1
|
||||
```
|
||||
|
||||
***Окна***
|
||||
`Ctrl+b с` - новое окно
|
||||
`Ctrl+b w` - список окон. переключиться курсором вверх-вниз
|
||||
`Ctrl+b &` - закрыть окно, нужно подтвердить `y`
|
||||
`Ctrl+b {` - переместить активное окно влево по кругу
|
||||
|
||||
***Переключение***
|
||||
`Ctrl+b n` - следующее окно
|
||||
`Ctrl+b p` - предыдущее окно
|
||||
`Ctrl+b 0` - переключиться на номер окна
|
||||
|
||||
***Деление окна***
|
||||
`Ctrl+b "` - деление окна горизонтально или `tmux split-window -h`
|
||||
`Ctrl+b %` - деление окна вертикально или `tmux split-window -v`
|
||||
`Ctrl+b стрелки` - переход между панелей, либо режим мыши
|
||||
`Ctrl+b+стрелки` - изменение размеров панелей или `Ctrl+b Ctrl+стрелки`. Или мышью - потянуть за край панели.
|
||||
`Ctrl+b z` - zoom, выделить окно, повторное нажатие вернёт обратно
|
||||
`Ctrl+b space` - смена разделения на предопределённые расположения
|
||||
`Ctrl+d` - закрыть текущее окно
|
||||
`Ctrl+b x` - закрытие окон, нужно подтвердить `y` или `exit`
|
||||
|
||||
***Сессии***
|
||||
`Ctrl+b d` - отключение от сессии или `tmux detach`
|
||||
`tmux ls` - список сессий
|
||||
|
||||
*Подключиться к работающей сессии*
|
||||
`tmux attach` - подключение к сессии, либо к единственной, либо последней созданной
|
||||
`tmux attach -t session1` - подключение к сессии session1
|
||||
`Ctrl+b s` - выбрать сессию
|
||||
`tmux kill-session -t session1` - завершение сессии
|
||||
`tmux kill-server` - завершить все сессии
|
||||
|
||||
***
|
||||
|
||||
`tmux list-commands` - cписок поддерживаемых команд
|
||||
43
Дополнительный_IP_(secondary_ip).md
Normal file
43
Дополнительный_IP_(secondary_ip).md
Normal file
@@ -0,0 +1,43 @@
|
||||
### Дополнительный IP на интерфейсе (Secondary IP) Linux
|
||||
**!дополнительный IP должен быть из другой подсети!**
|
||||
_Временный IP на интерфейсе до перезагрузки_
|
||||
**ifconfig**
|
||||
```
|
||||
ifconfig [nic]:0 [IP-Address] netmask [mask] up
|
||||
```
|
||||
пример
|
||||
```
|
||||
ifconfig eth0:0 192.168.2.2 netmask 255.255.255.0 up
|
||||
```
|
||||
**ip**
|
||||
```
|
||||
ip address add [ip]/[mask-digits] dev [nic]:0
|
||||
```
|
||||
пример
|
||||
```
|
||||
ip address add 192.168.99.37/24 dev eth0:0
|
||||
```
|
||||
|
||||
_Постоянный дополнительный IP_
|
||||
для Debain/Ubuntu
|
||||
```
|
||||
nano /etc/network/interfaces
|
||||
```
|
||||
общий вид
|
||||
```
|
||||
auto [NIC]:[n]
|
||||
iface [NIC]:[n] inet static
|
||||
address [ip.add.rr.ss]
|
||||
gateway [gw.ip.ad.rs]
|
||||
netmask [ne.tm.as.kk]
|
||||
```
|
||||
пример
|
||||
```
|
||||
auto eth0:1
|
||||
iface eth0:1 inet static
|
||||
address 192.168.0.1
|
||||
gateway 192.168.0.254
|
||||
netmask 255.255.255.0
|
||||
```
|
||||
|
||||
Можно добавлять несколько блоков с IP адресами. Достаточно указать их номера eth0:0, eth0:1, eth0:2 и т.д.
|
||||
52
Изменить имя пользователя Linux.md
Normal file
52
Изменить имя пользователя Linux.md
Normal file
@@ -0,0 +1,52 @@
|
||||
#### **Это пошаговое руководство о том, как изменить имя пользователя в Debian, Ubuntu, Deepin, Linux Mint, elementary OS (и других дистрибутивах Linux на основе Debian или Ubuntu) и Fedora.**
|
||||
|
||||
_В инструкциях объясняется, как изменить (переименовать) имя пользователя вместе с именем домашней папки пользователя, а также простой способ устранения потенциальных проблем с файлами конфигурации, которые все еще указывают на старое имя домашней папки. Также есть шаг для изменения полного имени (отображаемого имени), которое отображается на экране входа в систему и в других местах на рабочем столе._
|
||||
|
||||
Во всех приведенных ниже инструкциях или командах не забудьте заменить `newusername` его новым именем пользователя и `oldusername` старым именем пользователя.
|
||||
|
||||
**1) Создайте временного пользователя и предоставьте ему привилегии sudo**
|
||||
_Мы войдем в систему с временным пользователем, чтобы выполнить команды смены имени пользователя. Таким образом, не будет проблем при запуске их от того же пользователя, которого мы пытаемся переименовать (например, процессы, запущенные для этого пользователя и т. д.)._
|
||||
Добавьте нового временного пользователя `tempuser` и предоставьте ему привилегии `sudo` в Debian, Ubuntu, Deepin, elementary OS или Linux Mint (после ввода пароля вы можете продолжать нажимать, Enter чтобы пропустить ввод остальной информации):
|
||||
```
|
||||
sudo adduser tempuser
|
||||
sudo usermod -aG sudo tempuser
|
||||
```
|
||||
Добавьте новый tempuser и предоставьте ему привилегии sudo на Fedora:
|
||||
```
|
||||
sudo adduser tempuser
|
||||
sudo passwd tempuser
|
||||
sudo usermod -aG wheel tempuser
|
||||
```
|
||||
|
||||
**2) Войдите в систему как tempuser и измените (переименуйте) имя пользователя, домашнюю папку и группу**
|
||||
Выйдите из системы и на экране входа выберите tempuser и войдите под этим пользователем. Затем откройте терминал и выполните эти команды, чтобы изменить имя пользователя, домашнюю папку и группу с oldusername на newusername:
|
||||
```
|
||||
sudo usermod -l newusername -d /home/newusername -m oldusername
|
||||
sudo groupmod -n newusername oldusername
|
||||
```
|
||||
Если вы получили ошибку об использовании процесса для старого имени пользователя, убейте этот процесс (kill PID), но в большинстве случаев этого не должно происходить, поскольку мы вошли в систему, используя временное промежуточное имя пользователя для внесения этих изменений. Если это произойдет, другой обходной путь — это перезагрузить компьютер, а затем войти в `tempuser` напрямую, таким образом, нет никаких процессов, используемых старым именем пользователя.
|
||||
|
||||
**3) Создайте символическую ссылку из `/home/newusername` в `/home/oldusername`**
|
||||
Некоторые приложения будут отображать ошибки при изменении имени пользователя, потому что в некоторых случаях есть файлы конфигурации, которые указывают на домашнюю папку старого имени пользователя. Решением для этого является создание символической ссылки из новой домашней папки на старую домашнюю папку:
|
||||
```
|
||||
sudo ln -s /home/newusername /home/oldusername
|
||||
```
|
||||
|
||||
**4) Измените отображаемое имя или полное имя (имя, фамилия)**
|
||||
В моем случае при попытке переименовать имя пользователя в Ubuntu 19.04 и Fedora 29 отображаемое имя (полное имя) осталось неизменным на экране входа в GDM3 и в меню пользователя. Это можно изменить, используя:
|
||||
```
|
||||
sudo chfn -f "firstname lastname" newusername
|
||||
```
|
||||
Заменить `firstname` и `lastname` с именем и фамилией, или что вы хотите, чтобы показать на экране входа и различных других местах по всей системе. firstname и lastname также может быть одним элементом, например, вашим новым именем пользователя.
|
||||
Команда `chfn` доступна на Fedora в util-linux-user пакете, который не установлен по умолчанию. Вы можете установить его на Fedora, используя:
|
||||
```
|
||||
sudo dnf install util-linux-user
|
||||
```
|
||||
После установки этого пакета chfn команда должна работать на Fedora.
|
||||
|
||||
**5) Войдите в систему с новым (переименованным) именем пользователя и удалите временного пользователя, созданного в шаге 1**
|
||||
Выйдите из системы, выберите новое, переименованное имя пользователя на экране входа в систему и перейдите к входу в систему. Теперь вы можете удалить временного пользователя, созданного в шаге 1 `tempuser`, и его домашнюю папку:
|
||||
```
|
||||
sudo userdel -r tempuser
|
||||
```
|
||||
|
||||
36
Изоляция_сетевых_интерфейсов.md
Normal file
36
Изоляция_сетевых_интерфейсов.md
Normal file
@@ -0,0 +1,36 @@
|
||||
### Изоляция сетевых интерфейсов устройства
|
||||
|
||||
_Проверка стенда, когда один М716 двумя портам подключается к маршрутизатору и необходимо выполнять тестирование с одно порта на другой_
|
||||
**Схема теста**
|
||||
**M716**
|
||||
Порт A соединен с портом маршрутизатора с IP-адресом 192.168.1.2
|
||||
Порт B соединен с портом маршрутизатора с IP-адресом 192.168.2.2
|
||||
Управление через порт Mnt
|
||||
|
||||
**Создаем изолированные пространства для каждого порта**
|
||||
_PORT_A/PORT_B - это просто названия_
|
||||
```
|
||||
ip netns add PORT_A
|
||||
ip netns add PORT_B
|
||||
```
|
||||
**Добавляем порты в свои пространства**
|
||||
```
|
||||
ip link set dev gbe0 netns PORT_A
|
||||
ip link set dev gbe1 netns PORT_B
|
||||
```
|
||||
**Далее выполняем стандартную настройку, но вначале команды необходимо указывать в рамках какого простанства мы работаем**
|
||||
```
|
||||
ip netns exec PORT_A ip addr add 192.168.1.1/24 dev gbe0
|
||||
ip netns exec PORT_B ip addr add 192.168.2.1/24 dev gbe1
|
||||
ip netns exec PORT_A ip link set dev gbe0 up
|
||||
ip netns exec PORT_B ip link set dev gbe1 up
|
||||
ip netns exec PORT_A ip route add 192.168.2.0/24 via 192.168.2.2
|
||||
ip netns exec PORT_B ip route add 192.168.1.0/24 via 192.168.1.2
|
||||
```
|
||||
**Проверка**
|
||||
```
|
||||
ip netns exec PORT_A ping 192.168.2.1
|
||||
ip netns exec PORT_A traceroute 192.168.2.1
|
||||
ip netns exec PORT_B ping 192.168.1.1
|
||||
ip netns exec PORT_B traceroute 192.168.1.1
|
||||
```
|
||||
39
Маршрут_по-умолчанию_(default_gateway).md
Normal file
39
Маршрут_по-умолчанию_(default_gateway).md
Normal file
@@ -0,0 +1,39 @@
|
||||
### Маршрут по-умолчанию Linux (default gateway)
|
||||
|
||||
Маршрут по-умолчанию задается при настройке сетевых интерфейсов в файле
|
||||
`/etc/network/interfaces`
|
||||
пример:
|
||||
```
|
||||
auto eth0
|
||||
iface eth0 inet static
|
||||
address 192.168.5.2
|
||||
netmask 255.255.255.0
|
||||
gateway 192.168.5.1
|
||||
```
|
||||
Применение измений этого файла произойдут после перезагрузки системы.
|
||||
Если необходимо сменить маршрут по-умолчанию немедленно:
|
||||
_Узнать текущее значение можно_
|
||||
```bash
|
||||
ip ro sh
|
||||
```
|
||||
_Сначала необходимо удалить существующее значение маршрута по-умолчанию, это можно сделать несколькими командами_
|
||||
```bash
|
||||
sudo ip route delete default
|
||||
```
|
||||
_или_
|
||||
```bash
|
||||
sudo ip route del 0/0
|
||||
```
|
||||
_Теперь присвоить новое значение_
|
||||
_Например, если IP - адрес роутера 192.168.1.1 и он соединен с локальным интерфейсом eth0, то:_
|
||||
```bash
|
||||
sudo route add default gw 192.168.1.1 eth0
|
||||
```
|
||||
_или_
|
||||
```bash
|
||||
sudo route add default gw 192.168.1.1
|
||||
```
|
||||
_или_
|
||||
```bash
|
||||
sudo ip route add default via 192.168.1.1
|
||||
```
|
||||
10
Маршрутизация_(route).md
Normal file
10
Маршрутизация_(route).md
Normal file
@@ -0,0 +1,10 @@
|
||||
#### Маршрутизация (Route)
|
||||
**Включить маршрутизацию трафика**
|
||||
```bash
|
||||
sudo nano /etc/sysctl.conf
|
||||
```
|
||||
раскомментировать строку `net.ipv4.ip_forward=1`
|
||||
перезагрузить raspberry
|
||||
```bash
|
||||
sudo reboot
|
||||
```
|
||||
22
Монтирование образа.md
Normal file
22
Монтирование образа.md
Normal file
@@ -0,0 +1,22 @@
|
||||
Монтирование образа
|
||||
|
||||
kpartx -- Linux утилита, которая позволяет легко подмонтировать образ SD-карты (в частности для наших приборов):
|
||||
$ sudo kpartx -a etln10g.bin
|
||||
$ lsblk
|
||||
...
|
||||
loop19 7:19 0 3,8G 0 loop
|
||||
├─loop19p1 253:0 0 1M 0 part
|
||||
├─loop19p2 253:1 0 1,4G 0 part
|
||||
├─loop19p3 253:2 0 1K 0 part
|
||||
├─loop19p5 253:3 0 600M 0 part
|
||||
├─loop19p6 253:4 0 600M 0 part
|
||||
├─loop19p7 253:5 0 180M 0 part
|
||||
├─loop19p8 253:6 0 180M 0 part
|
||||
├─loop19p9 253:7 0 360M 0 part
|
||||
└─loop19p10 253:8 0 360M 0 part
|
||||
...
|
||||
$ mkdir p2
|
||||
$ sudo mount -o rw -t ext4 /dev/mapper/loop19p2 p2
|
||||
|
||||
удалять созданный loop по имени образа:
|
||||
sudo kpartx -d etln10g.bin
|
||||
91
Настройка VNC Ubuntu Server 20.04.md
Normal file
91
Настройка VNC Ubuntu Server 20.04.md
Normal file
@@ -0,0 +1,91 @@
|
||||
## Настройка VNC Ubuntu Server 20.04 Rspberry PI 4
|
||||
|
||||
*Установку и настройку ОС выполнял по документации*
|
||||
[How to install Ubuntu on your Raspberry PI](https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview)
|
||||
|
||||
**Установим DE**
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt upgrade
|
||||
sudo apt install xubuntu-desktop
|
||||
sudo reboot
|
||||
|
||||
```
|
||||
|
||||
**TightVNC Server**
|
||||
*За основу взял эти статьи:*
|
||||
[Установка и настройка VNC в Ubuntu 20.04](https://www.8host.com/blog/ustanovka-i-nastrojka-vnc-v-ubuntu-20-04/)
|
||||
[Как настроить и использовать сервер TigerVNC в Linux](https://zalinux.ru/?p=3905)
|
||||
*TigerVNC настроить не получилось, сервер не пускал к себе никого*
|
||||
|
||||
`sudo apt install tightvncserver`
|
||||
|
||||
*при первом запуске нужно задать пароль*
|
||||
`vncserver`
|
||||
|
||||
*Если в будущем понадобиться изменить пароль или добавить пароль для просмотра, это можно сделать с помощью команды vncpasswd:*
|
||||
`vncpasswd`
|
||||
|
||||
*При первом запуске VNC использует порт 5901. Чтобы изменить настройки сервера VNC, нужно остановить экземпляр, использующий порт 5901.*
|
||||
`vncserver -kill :1`
|
||||
|
||||
*Резервная копия файла xstartup:*
|
||||
`mv ~/.vnc/xstartup ~/.vnc/xstartup.bak`
|
||||
|
||||
*Затем создать новый файл xstartup*
|
||||
`nano ~/.vnc/xstartup`
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
PATH=/usr/bin:/usr/sbin
|
||||
unset SESSION*MANAGER
|
||||
unset DBUS*SESSION*BUS*ADDRESS
|
||||
exec ЗАПУСК &
|
||||
```
|
||||
*Вместо слова `ЗАПУСК` должен быть указан исполнимый файл, запускающий X сессию.*
|
||||
|
||||
*Для Cinnamon:* `cinnamon-session-cinnamon`
|
||||
*Для XFCE:* `startxfce4`
|
||||
*Для GNOME:* `/usr/bin/gnome-session`
|
||||
*Для Kodi:* `kodi-standalone`
|
||||
*Для Mate:* `mate-session`
|
||||
*Для lxqt:* `startlxqt`
|
||||
*Узнать исполняемый файл для любого окружения рабочего стола установленного в системе -* `ls /usr/share/xsessions/`
|
||||
*В этой папке лежат файлы с расширением `.desktop`, например:*
|
||||
`cinnamon2d.desktop cinnamon.desktop gnome.desktop gnome-xorg.desktop kodi.desktop`
|
||||
*Открыть любой, найти там строку, которая начинается на «Exec», например для файла xfce.desktop:*
|
||||
`Exec=cinnamon-session-cinnamon`
|
||||
*сделать файл исполняемым:* `chmod +x ~/.vnc/xstartup`
|
||||
|
||||
**Настройка VNC как сервиса systemd**
|
||||
`sudo nano /etc/systemd/system/vncserver@.service`
|
||||
```bash
|
||||
[Unit]
|
||||
Description=Start TightVNC server at startup
|
||||
After=syslog.target network.target
|
||||
[Service]
|
||||
Type=forking
|
||||
User=da2001
|
||||
Group=da2001
|
||||
WorkingDirectory=/home/da2001
|
||||
PIDFile=/home/da2001/.vnc/%H:%i.pid
|
||||
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
|
||||
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x720 :%i
|
||||
ExecStop=/usr/bin/vncserver -kill :%i
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
*сохранить, закрыть*
|
||||
|
||||
*Затем сообщите системе про новый юнит-файл.*
|
||||
`sudo systemctl daemon-reload`
|
||||
*И включите его:*
|
||||
`sudo systemctl enable vncserver@1.service`
|
||||
*Цифра 1, идущая за @, определяет, какой номер дисплея должен отображаться в сервисе, в этом случае это значение по умолчанию :1.*
|
||||
*Остановите текущий экземпляр сервера VNC, если он еще запущен.*
|
||||
`vncserver -kill :1`
|
||||
*Теперь попробуйте запустить его как любой другой сервис systemd:*
|
||||
`sudo systemctl start vncserver@1`
|
||||
*Чтобы убедиться, что сервер запущен, проверьте его состояние:*
|
||||
`sudo systemctl status vncserver@1`
|
||||
BIN
Настройка сервера Debian 9.docx
Executable file
BIN
Настройка сервера Debian 9.docx
Executable file
Binary file not shown.
BIN
Настройка сервера Debian 9.pdf
Executable file
BIN
Настройка сервера Debian 9.pdf
Executable file
Binary file not shown.
19
Не_стартует_NGINX_автоматом.txt
Normal file
19
Не_стартует_NGINX_автоматом.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
При старте системы NGINX не стартовал автоматически, приходилось стартовать руками командой
|
||||
sudo service nginx restart
|
||||
|
||||
Оказалось, это происходило из-за того, что nginx стартовал раньше сети, это приводило к ошибке и остановке nginx.
|
||||
Нужно в скрипте автозапуска nginx прописать запуск сервиса после поднятия сети.
|
||||
|
||||
Для этого в файле
|
||||
|
||||
/lib/systemd/system/nginx.service
|
||||
|
||||
в секцию UNIT добавляем
|
||||
|
||||
[Unit]
|
||||
After=network-online.target remote-fs.target nss-lookup.target
|
||||
Wants=network-online.target
|
||||
|
||||
при этом нужно закомментировать то, что там было в After
|
||||
сохраняем, перезагружаемся.
|
||||
На Debian 9.9 помогло
|
||||
82
Образ_SD_dd.md
Normal file
82
Образ_SD_dd.md
Normal file
@@ -0,0 +1,82 @@
|
||||
### Образ SD-карты с помощью dd
|
||||
|
||||
_Чтобы размер образа занимал как можно меньше места и, соответственно быстрее создавался, необходимо на SD-карте уменьшить размер раздела (отрезать всё свободное место), т.к. в создаваемый образ оно тоже попадает_
|
||||
|
||||
_Уменьшить размер раздела можно с помощью стандартной утилиты **Диски** (Linux Mint), **Gparted**, **parted**_
|
||||
|
||||
1. Расчет размера разделов
|
||||
|
||||
```bash
|
||||
sudo fdisk -l /dev/sdb
|
||||
```
|
||||
|
||||
вывод будет примерно такой:
|
||||
|
||||
Диск /dev/sdb: 29,29 GiB, 31439454208 байт, 61405184 секторов
|
||||
Disk model: Card Reader
|
||||
Единицы: секторов по 1 * 512 = 512 байт
|
||||
Размер сектора (логический/физический): 512 байт / 512 байт
|
||||
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
|
||||
Тип метки диска: dos
|
||||
Идентификатор диска: 0x1238ae1a
|
||||
|
||||
Устр-во Загрузочный начало Конец Секторы Размер Идентификатор Тип
|
||||
/dev/sdb1 8192 532479 524288 256M c W95 FAT32 (LBA)
|
||||
/dev/sdb2 532480 5279743 4747264 2,3G 83 Linux
|
||||
|
||||
Обратим внимание на 2 параметра:
|
||||
Конец - **5279743** (это последний сектор нашего раздела)</br>
|
||||
Размер секторов - **Единицы: секторов по 1 \* 512 = 512 байт**</br>
|
||||
Таким образом нам необходимо сохранить:</br>
|
||||
5279743 + 1 (первый сектор начинается с 0) = 5279744 секторов</br>
|
||||
5279744 \* 512 (размер сектора) = 2703228928 байт</br>
|
||||
2703228928 / 1024 / 1024 = 2578 Мб (обязательно округляем в большую сторону)</br>
|
||||
|
||||
2. Создание образа
|
||||
_необходимо запустить запись с нужными параметрами_
|
||||
|
||||
```bash
|
||||
sudo dd if=/dev/sdb of=$HOME/Backup/image.img bs=1M count=2578 conv=noerror,sync status=progress
|
||||
```
|
||||
|
||||
либо с учетом пустого места (без параметра count)
|
||||
|
||||
```bash
|
||||
sudo dd if=/dev/sdb of=$HOME/Backup/image.img bs=1M conv=noerror,sync status=progress
|
||||
```
|
||||
|
||||
if=/dev/sdb - откуда
|
||||
of=/$HOME/Backup/image.img - куда
|
||||
bs=1M - размер одного блока при передаче данных (влияет на скорость записи)
|
||||
|
||||
с - один символ;
|
||||
b - 512 байт;
|
||||
kB - 1000 байт;
|
||||
K - 1024 байт;
|
||||
MB - 1000 килобайт;
|
||||
M - 1024 килобайт;
|
||||
GB - 1000 мегабайт;
|
||||
G - 1024 мегабайт.
|
||||
|
||||
count=2578 - количество записываемых блоков
|
||||
conv=noerror,sync - norerror -игнорировать ошибки, sync -записывать 0 в ошибочные секторы, чтобы не нарушить структуру
|
||||
status=progress - выводить в консоль сведения о процессе записи
|
||||
|
||||
образ можно сразу сжать при создании
|
||||
|
||||
```bash
|
||||
sudo dd if=/dev/sdb bs=1M count=2578 conv=noerror,sync | gzip -c > /$HOME/Backup/image.img.gz
|
||||
```
|
||||
|
||||
3. Восстановление образа
|
||||
если образ создавали без сжатия
|
||||
|
||||
```bash
|
||||
sudo dd if=$HOME/Backup/image.img of=/dev/sdb bs=1M conv=noerror,sync status=progress
|
||||
```
|
||||
|
||||
если создавали со сжатием
|
||||
|
||||
```bash
|
||||
gunzip -c $HOME/Backup/image.img.gz | sudo dd of=/dev/sdb conv=noerror,sync status=progress
|
||||
```
|
||||
17
Пересоздание ключей ssh сервера.md
Normal file
17
Пересоздание ключей ssh сервера.md
Normal file
@@ -0,0 +1,17 @@
|
||||
### Пересоздание ключей ssh сервера
|
||||
|
||||
_Иногда требуется пересоздать ключи сервера SSH. Например при компрометации системы, чтобы в дальнейшем злоумышленнику было невозможно расшифровать SSH трафик. Или если система распространяется одним образом для всех (например Kali Linux для Raspberry Pi)._
|
||||
|
||||
Для пересоздания ключей сначала удалим старые ключи:
|
||||
```bash
|
||||
rm /etc/ssh/ssh_host_*
|
||||
```
|
||||
Переконфигурируем пакет SSH сервера:
|
||||
```bash
|
||||
dpkg-reconfigure openssh-server
|
||||
```
|
||||
Перезапустим SSH сервер:
|
||||
```bash
|
||||
service ssh restart
|
||||
```
|
||||
Обновление ключей закончено.
|
||||
132
Приветствие ssh Debian 9.md
Normal file
132
Приветствие ssh Debian 9.md
Normal file
@@ -0,0 +1,132 @@
|
||||
#### Изменяем приветствие консоли сервера
|
||||
Изначально видим
|
||||
```
|
||||
Linux DNAS 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13) x86_64
|
||||
|
||||
The programs included with the Debian GNU/Linux system are free software;
|
||||
the exact distribution terms for each program are described in the
|
||||
individual files in /usr/share/doc/*/copyright.
|
||||
|
||||
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
|
||||
permitted by applicable law.
|
||||
Last login: Mon Jun 10 14:15:12 2019 from 193.164.201.34
|
||||
```
|
||||
1) За отказ от ответственности
|
||||
```
|
||||
The programs included with the Debian GNU/Linux system are free software;
|
||||
the exact distribution terms for each program are described in the
|
||||
individual files in /usr/share/doc/*/copyright.
|
||||
|
||||
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
|
||||
permitted by applicable law.
|
||||
```
|
||||
отвечает файл `/etc/motd`
|
||||
для его быстрой очистки используем
|
||||
```bash
|
||||
sudo cp /dev/null /etc/motd
|
||||
```
|
||||
2) Информация о последнем подключении
|
||||
```
|
||||
Last login: Mon Jun 10 14:15:12 2019 from 193.164.201.34
|
||||
```
|
||||
Чтобы отключить сообщение о последнем входе (что я не рекомендую делать), надо отредактировать вот этот файл:
|
||||
`/etc/ssh/sshd_config`
|
||||
Найдите вот эту опцию и замените `yes` на `no`:
|
||||
`PrintLastLog no`
|
||||
Теперь, когда вы будете входить, вы этого сообщения не увидите. Из соображений безопасности всё же не рекомендую так делать.
|
||||
|
||||
3) Вывод данных о системе
|
||||
```
|
||||
Linux DNAS 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13) x86_64
|
||||
```
|
||||
Содержится в файле `/etc/update-motd.d/10-uname`
|
||||
Чтобы отключить его вывод, достаточно снять с файла права на запуск
|
||||
|
||||
4) Создадим свой скрипт вывода
|
||||
_Можно создавать свои скрипты, которые будут отображаться при успешной авторизации. Эти скрипты хранятся по адресу `/etc/profile.d/`_
|
||||
Создадим свой скрипт:
|
||||
```bash
|
||||
sudo nano /etc/profile.d/ssh-info.sh
|
||||
```
|
||||
Вставим следующий текст:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
#
|
||||
# Text Color Variables http://misc.flogisoft.com/bash/tip_colors_and_formatting
|
||||
tcLtG="\033[00;37m" # LIGHT GRAY
|
||||
tcDkG="\033[01;30m" # DARK GRAY
|
||||
tcLtR="\033[01;31m" # LIGHT RED
|
||||
tcLtGRN="\033[01;32m" # LIGHT GREEN
|
||||
tcLtBL="\033[01;34m" # LIGHT BLUE
|
||||
tcLtP="\033[01;35m" # LIGHT PURPLE
|
||||
tcLtC="\033[01;36m" # LIGHT CYAN
|
||||
tcW="\033[01;37m" # WHITE
|
||||
tcRESET="\033[0m"
|
||||
tcORANGE="\033[38;5;209m"
|
||||
#
|
||||
# Время суток
|
||||
HOUR=$(date +"%H")
|
||||
if [ $HOUR -lt 12 -a $HOUR -ge 4 ]; then TIME="Доброе утро!"
|
||||
elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="Добрый день!"
|
||||
elif [ $HOUR -lt 23 -a $HOUR -ge 17 ]; then TIME="Добрый вечер!"
|
||||
else TIME="Доброй ночи!"
|
||||
fi
|
||||
#
|
||||
# Время с момента перезагрузки
|
||||
uptime=`cat /proc/uptime | cut -f1 -d.`
|
||||
upDays=$((uptime/60/60/24))
|
||||
upHours=$((uptime/60/60%24))
|
||||
upMins=$((uptime/60%60))
|
||||
#
|
||||
# System + Memory
|
||||
SYS_LOADS=`cat /proc/loadavg | awk '{print $1}'`
|
||||
MEMORY_USED=`free -m | grep Mem | awk '{print $3}'`
|
||||
MEMORY_TOTAL=`free -m | grep Mem | awk '{print $2}'`
|
||||
SWAP_USED=`free -m | grep Swap | awk '{print $3}'`
|
||||
SWAP_TOTAL=`free -m | grep Swap | awk '{print $2}'`
|
||||
NUM_PROCS=`ps aux | wc -l`
|
||||
IPADDRESS=`hostname --all-ip-addresses`
|
||||
SDA1SIZE=`df -h /dev/sda1 | grep /dev/sda1 | awk '{print $2}'`
|
||||
SDA1OST=`df -h /dev/sda1 | grep /dev/sda1 | awk '{print $3}'`
|
||||
SDA1MOUNT=`df -h /dev/sda1 | grep /dev/sda1 | awk '{print $6}'`
|
||||
SDB1SIZE=`df -h /dev/sdb1 | grep /dev/sdb1 | awk '{print $2}'`
|
||||
SDB1OST=`df -h /dev/sdb1 | grep /dev/sdb1 | awk '{print $3}'`
|
||||
SDB1MOUNT=`df -h /dev/sdb1 | grep /dev/sdb1 | awk '{print $6}'`
|
||||
SDC1SIZE=`df -h /dev/sdc1 | grep /dev/sdc1 | awk '{print $2}'`
|
||||
SDC1OST=`df -h /dev/sdc1 | grep /dev/sdc1 | awk '{print $3}'`
|
||||
SDC1MOUNT=`df -h /dev/sdc1 | grep /dev/sdc1 | awk '{print $6}'`
|
||||
SDD1SIZE=`df -h /dev/sdd1 | grep /dev/sdd1 | awk '{print $2}'`
|
||||
SDD1OST=`df -h /dev/sdd1 | grep /dev/sdd1 | awk '{print $3}'`
|
||||
SDD1MOUNT=`df -h /dev/sdd1 | grep /dev/sdd1 | awk '{print $6}'`
|
||||
#
|
||||
echo -e $tcDkG "==============================================================="
|
||||
echo -e $tcLtG " $TIME $tcORANGE $USER"
|
||||
echo -e $tcDkG "==============================================================="
|
||||
echo -e $tcLtG " * Хост :$tcW `hostname -f`"
|
||||
echo -e $tcLtG " * IP Адрес :$tcW $IPADDRESS"
|
||||
echo -e $tcLtG " * Версия :$tcW $(lsb_release -s -d)"
|
||||
echo -e $tcLtG " * Ядро : `uname -a | awk '{print $1" "$3" "$12}'`"
|
||||
echo -e $tcLtG " * Пользователи : Авторизованных пользователей - `users | wc -w`"
|
||||
echo -e $tcLtG " * Время на сервере : `date +"%A, %d %B %Y г., %T"`"
|
||||
echo -e $tcLtG " * Загрузка системы : $SYS_LOADS / $NUM_PROCS запущенных процессов"
|
||||
echo -e $tcLtG " * Память, RAM : Исп.: $MEMORY_USED Мб / Всего: $MEMORY_TOTAL Мб"
|
||||
echo -e $tcLtG " * SWAP : Исп.: $SWAP_USED Мб / Всего: $SWAP_TOTAL Мб"
|
||||
echo -e $tcLtG " * После включения : $upDays дней $upHours часов $upMins минут"
|
||||
echo -e $tcDkG "==============================================================="
|
||||
echo -e $tcLtG " * Диски : sda1 $SDA1OST / $SDA1SIZE | sdb1 $SDB1OST / $SDB1SIZE"
|
||||
echo -e $tcLtG " Исп. / Всего : sdc1 $SDC1OST / $SDC1SIZE | sdd1 $SDD1OST / $SDD1SIZE"
|
||||
echo -e $tcDkG "==============================================================="
|
||||
echo -e $tcRESET ""
|
||||
#
|
||||
|
||||
```
|
||||
Делаем файл исполняемым
|
||||
```bash
|
||||
sudo chmod +x /etc/profile.d/ssh-info.sh
|
||||
```
|
||||
После перезагрузки видим, что-то типа:
|
||||

|
||||
|
||||
5) Информация о доступных обновлениях
|
||||
В Ubuntu за это отвечает пакет `update-notifier`, но в Debian он считается устаревшим и исключен из репозиториев
|
||||
Пока решение не найдено
|
||||
BIN
Приветствие ssh Debian 9.pdf
Normal file
BIN
Приветствие ssh Debian 9.pdf
Normal file
Binary file not shown.
94
Статический_маршрут_(static_route).md
Normal file
94
Статический_маршрут_(static_route).md
Normal file
@@ -0,0 +1,94 @@
|
||||
#### Статический маршрут (Static route)
|
||||
|
||||
**На Raspberry PI, чтобы маршрут сохранился после рестарта, его необходимо добавлять в эту папку `/lib/dhcpcd/dhcpcd-hooks/`. Подробнее в отдельной заметке**
|
||||
|
||||
Добавить маршрут можно используя route или через ip ro. Он будет сохранен до следующей перезагрузки
|
||||
**синтаксис route**
|
||||
```bash
|
||||
route add [-net|-host] <IP/Net> netmask gw <Gateway IP> dev <Int>X
|
||||
```
|
||||
Пример:
|
||||
```bash
|
||||
route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.0.1
|
||||
route add -net 192.168.2.0/24 gw 192.168.0.1
|
||||
route add -host 192.168.3.158 gw 192.168.0.1
|
||||
```
|
||||
**синтаксис ip ro**
|
||||
```bash
|
||||
ip route add <IP/Net> via <Gateway IP>
|
||||
```
|
||||
Все параметры можно посмотреть ip route help
|
||||
|
||||
Пример:
|
||||
```bash
|
||||
ip ro add 192.168.2.0/24 via 192.168.0.1
|
||||
ip ro add 192.168.3.159/32 via 192.168.0.1
|
||||
```
|
||||
_в команде ip можно использовать сокращенный синтаксис ip ro … в место ip route …_
|
||||
Для удаления статического маршрута используйте **del** вместо **add**
|
||||
|
||||
Добавить маршрут по умолчанию
|
||||
```bash
|
||||
ip route add default via 10.7.0.1 dev enp1s0
|
||||
```
|
||||
маршрут через 10.7.0.1(допустим наш роутер) через интерфейс с именем enp1s0
|
||||
|
||||
**Как сохранить статический маршрут**
|
||||
|
||||
_Все эти маршруты будут добавлены в память и сохранятся до перезагрузки. Если необходимо, добавлять маршруты при загрузке системы, необходимо прописать их в файл конфигурации интерфейсов (для ubuntu и debian). `/etc/network/interfaces`_
|
||||
|
||||
Добавим в конец файла следующую сточку:
|
||||
```bash
|
||||
up ip ro add 192.168.2.0/24 via 192.168.0.1
|
||||
```
|
||||
пример файла конфигурации.
|
||||
```bash
|
||||
root@linux:~# cat /etc/network/interfaces
|
||||
```
|
||||
```
|
||||
# This file describes the network interfaces available on your system
|
||||
# and how to activate them. For more information, see interfaces(5).
|
||||
# The loopback network interface
|
||||
auto lo
|
||||
iface lo inet loopback
|
||||
# The primary network interface
|
||||
auto eth0
|
||||
iface eth0 inet static
|
||||
address 172.16.0.69
|
||||
netmask 255.255.255.0
|
||||
network 172.16.0.0
|
||||
broadcast 172.16.0.255
|
||||
gateway 172.16.0.1
|
||||
# dns-* options are implemented by the resolvconf package, if installed
|
||||
dns-nameservers 172.16.0.1 172.16.0.3
|
||||
#static route
|
||||
up ip ro add 192.168.0.0/16 via 172.16.0.2
|
||||
```
|
||||
**Как посмотреть маршруты в системе**
|
||||
```bash
|
||||
root@linux:~# netstat -rn
|
||||
```
|
||||
```
|
||||
Kernel IP routing table
|
||||
Destination Gateway Genmask Flags MSS Window irtt Iface
|
||||
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
|
||||
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
|
||||
192.168.0.0 172.16.0.2 255.255.0.0 UG 0 0 0 eth0
|
||||
```
|
||||
```bash
|
||||
root@linux:~# ip ro sh
|
||||
```
|
||||
```
|
||||
default via 172.16.0.1 dev eth0
|
||||
172.16.0.0/24 dev eth0 proto kernel scope link src 172.16.0.69
|
||||
192.168.0.0/16 via 172.16.0.2 dev eth0
|
||||
```
|
||||
или ещё короче
|
||||
```bash
|
||||
root@linux:~# ip r s
|
||||
```
|
||||
```
|
||||
default via 172.16.0.1 dev eth0
|
||||
172.16.0.0/24 dev eth0 proto kernel scope link src 172.16.0.69
|
||||
192.168.0.0/16 via 172.16.0.2 dev eth0
|
||||
```
|
||||
79
Уменьшение размера образа img.md
Normal file
79
Уменьшение размера образа img.md
Normal file
@@ -0,0 +1,79 @@
|
||||
### Уменьшение размера образа .img
|
||||
|
||||
При создании образа SD-карты с помощью стандартной утилиты Диски в Linux Mint, образ получается размером равным размеру SD-карты вне зависимости от занятого места на ней. Таким образом, восстановить этот образ на диск меньшего размера не получится. Необходимо привести размер образа максимально к приближенному значению занятого в нем места.
|
||||
*это перевод англоязычной инструкции. Работоспособность метода проверена на себе.*
|
||||
*Используемая ОС - Debian based*
|
||||
|
||||
1. Создать loopback device (как это корректно перевести не понял - устройство петли?)
|
||||
Включим создание петли
|
||||
```bash
|
||||
sudo modprobe loop
|
||||
```
|
||||
Создадим новый (пустой) `loopback device`
|
||||
```bash
|
||||
sudo losetup -f
|
||||
```
|
||||
команда вернет путь к устройству
|
||||
```bash
|
||||
/dev/loop0
|
||||
```
|
||||
Подключаем наш образ к созданному устройству
|
||||
```bash
|
||||
sudo losetup /dev/loop0 myimage.img
|
||||
```
|
||||
Чтобы получить доступ к разделам, которые есть в образе, нужно сказать ядру загрузить и их
|
||||
```bash
|
||||
sudo partprobe /dev/loop0
|
||||
```
|
||||
2. Уменьшение размера раздела в образе
|
||||
После создания `loopback device` в стандартном приложении Диски (Linux Mint) появится новый диск.
|
||||
Чтобы изменить размер раздела в образе нужно: выбрать нужный раздел -> нажать шестеренку ниже -> в выпадающем меню выбрать пункт *Изменить размер*
|
||||
Эту же процедуру можно выполнить с помощью **Gparted**, но при запуске приложения `loopback device` будет отсутствовать в списке доступных дисков. Gparted нужно запускать явно указав на устройство
|
||||
```bash
|
||||
sudo gparted /dev/loop0
|
||||
```
|
||||
После изменения размера образа loopback-устройство нам больше не нужно, отключим его
|
||||
```bash
|
||||
sudo losetup -d /dev/loop0
|
||||
```
|
||||
3. Уменьшение размера образа
|
||||
*уменьшение раздела никак не повлияло на размер самого образа, в нем появилось свободное место*
|
||||
Теперь нужно удалить ненужное свободное место в образе.
|
||||
*узнаем где оно начинается*
|
||||
```bash
|
||||
fdisk -l myimage.img
|
||||
```
|
||||
*увидим нечто подобное*
|
||||
```bash
|
||||
Disk myimage.img: 6144 MB, 6144000000 bytes, 12000000 sectors
|
||||
Units = sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
Disk identifier: 0x000ea37d
|
||||
|
||||
Device Boot Start End Blocks Id System
|
||||
myimage.img1 2048 9181183 4589568 b W95 FAT32
|
||||
```
|
||||
_Обратите внимание на две вещи в выводе:
|
||||
Раздел заканчивается на блоке 9181183 (End).
|
||||
Размер блока составляет 512 байт (Units = sectors of 1 * 512 = 512 bytes)._
|
||||
Теперь уменьшаем файл образа до размера, содержащего данные. С помощью команды *truncate* необходимо указать размер файла в байтах. Последний блок был *9181183*, а номера блоков начинались с *0*. Это означает, что нам нужно **(9181183 + 1) * 512** байт. **Это важно, иначе раздел не поместится в образ.**
|
||||
```bash
|
||||
truncate --size=$[(9181183+1)*512] myimage.img
|
||||
```
|
||||
Если *truncate* по какой-то причине не доступна, можно с помощью *dd* создать новый образ на основе нашего, скопировав в него только необходимые нам сектора (мы их вычислили)
|
||||
`(9181183+1)*512 (размер сектора) = 4700766208 байт`
|
||||
`4700766208 / 1024 / 1024 = 4483 Мб` (обязательно округляем в большую сторону)
|
||||
*образ можно сразу сжать при создании*
|
||||
```bash
|
||||
sudo dd if=myimage.img bs=1M count=2578 conv=noerror,sync | gzip -c > /$HOME/Backup/image.img.gz
|
||||
```
|
||||
4. Восстановление образа
|
||||
если образ создавали без сжатия
|
||||
```bash
|
||||
sudo dd if=$HOME/Backup/image.img of=/dev/sdb bs=1M conv=noerror,sync status=progress
|
||||
```
|
||||
если создавали со сжатием
|
||||
```bash
|
||||
gunzip -c $HOME/Backup/image.img.gz | sudo dd of=/dev/sdb conv=noerror,sync status=progress
|
||||
```
|
||||
27
автозапуск_(startup)_в_Linux.md
Normal file
27
автозапуск_(startup)_в_Linux.md
Normal file
@@ -0,0 +1,27 @@
|
||||
### Как добавить команды в автозапуск Linux (Debian 10 Buster)?
|
||||
Самый простой способ - добавить команду(ы) в `/etc/rc.local`. В Debian 10 Buster файл `/etc/rc.local` хоть и не создан, но как сервис зарегистрирован, соответственно его надо просто создать и активировать сервис:
|
||||
|
||||
```bash
|
||||
su -
|
||||
|
||||
mount -o rw,remount /
|
||||
vi /etc/rc.local
|
||||
```
|
||||
добавить в файл необходимые команды и/или ссылки на пользовательские исполняемые скрипты
|
||||
```bash
|
||||
#!/bin/sh -e
|
||||
|
||||
# команды,
|
||||
# которые
|
||||
# необходимо добавить в автозапуск
|
||||
# или абсолютные пути до пользовательских исполняемых скриптов
|
||||
|
||||
exit 0
|
||||
```
|
||||
сделать файл исполняемым и включить сервис
|
||||
```bash
|
||||
chmod +x /etc/rc.local
|
||||
systemctl enable rc-local
|
||||
systemctl start rc-local.service
|
||||
|
||||
```
|
||||
23
индексация_файлов_Nextcloud.md
Normal file
23
индексация_файлов_Nextcloud.md
Normal file
@@ -0,0 +1,23 @@
|
||||
Если заливаем/удаляем файлы мимо web интерфейса или приложения, в базе данных нет сведений об изменении структуры файлов. Нужно провести индексацию. Это можно сделать встроенной в Nextcloud утилитой occ.
|
||||
|
||||
Переходим в папку с установленным Nextcloud
|
||||
```bash
|
||||
cd /var/www/nc
|
||||
```
|
||||
|
||||
И запускаем команду индексирования
|
||||
```bash
|
||||
sudo -u www-data php occ files:scan --all
|
||||
```
|
||||
|
||||
|
||||
или указывая полный путь
|
||||
```bash
|
||||
sudo -u www-data php /var/www/nc/occ files:scan --all
|
||||
```
|
||||
|
||||
в настройках nextcloud по адресу
|
||||
`/var/www/nextcloud/config/config.php`
|
||||
|
||||
добавим строку
|
||||
`'filesystem_check_changes' => 1,`
|
||||
15
почтовые_уведомления_на_Яндекс.txt
Normal file
15
почтовые_уведомления_на_Яндекс.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
чтобы корректно работали почтовые уведомления с домена da2001.ru
|
||||
с обслуживанием на Яндекс.почте, в настройках необходимо указать следующее:
|
||||
|
||||
адрес почтового сервера — smtp.yandex.ru;
|
||||
защита соединения — SSL;
|
||||
порт — 587 (через 465 порт уведомления не приходят)
|
||||
|
||||
Для доступа к почтовому серверу укажите ваш логин и пароль на Яндексе
|
||||
(или пароль приложения, если вы включили двухфакторную аутентификацию).
|
||||
Если вы настраиваете получение почты с ящика вида «login@yandex.ru»,
|
||||
логином является часть адреса до знака «@». Если вы используете Яндекс.Почту
|
||||
для домена, в качестве логина необходимо указывать
|
||||
полный адрес почтового ящика.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user