Compare commits
140 Commits
51ba62dbc6
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| df49f7e8bc | |||
| ed0ff16a43 | |||
| 8c1220fc8e | |||
| 71c620923a | |||
| 3761be85a0 | |||
| da679e59c7 | |||
| 246e89ec75 | |||
| fbc9e18612 | |||
| dac1146e4c | |||
| 7059c1bb65 | |||
| 7dda977baa | |||
| 3f1090d377 | |||
| ee11bed425 | |||
| 3e2703790e | |||
| b676a04232 | |||
| 48dbfdd6ea | |||
| 2130104304 | |||
| cd53f15b85 | |||
| 7a0d4e988e | |||
| 34b4d0adcc | |||
| a22a1a858b | |||
| 19d33f9f1d | |||
| fdd3291efd | |||
| e9ba4d4242 | |||
| 50dab27a84 | |||
| ef2f69aa8d | |||
| 9b4fb459c3 | |||
| af41705fb7 | |||
| 54f48d36cc | |||
| a2c365cf90 | |||
| 7b62cc396f | |||
| f9f8e1d8cb | |||
| b12e88aee0 | |||
| d588f0605c | |||
| 33d6280c7f | |||
| a0a1f48236 | |||
| fd75c942c6 | |||
| 97f4954df2 | |||
| 1cdc739e3f | |||
| 8948df24b6 | |||
| c58a957216 | |||
| 4053f59d9b | |||
| 2ef9294e39 | |||
| ea40e60bfb | |||
| 6097bd38ad | |||
| d04d94c71f | |||
| 372fcb3bd1 | |||
| 73d51fa11b | |||
| e23becc410 | |||
| 804a44b598 | |||
| beff9e4a6b | |||
| cdd5cb38e8 | |||
| c75c0b9623 | |||
| dff2c293f4 | |||
| 638e61f0d5 | |||
| 2efa14d709 | |||
| 2b4b1750da | |||
| f825fc9674 | |||
| ad18f8ffaa | |||
| 9abdd62506 | |||
| 829ed1f289 | |||
| 99d5280363 | |||
| f55c0fdc9d | |||
| f987ef8aaa | |||
| 89cdbc3644 | |||
| 117b60a238 | |||
| d651e1d6af | |||
| 3ba1ffcd48 | |||
| c2ef43b47d | |||
| b10eb896d4 | |||
| 8a38615574 | |||
| ceadf1b19d | |||
| 5eca6dd649 | |||
| 2e341d835f | |||
| d705efa0f7 | |||
| fde745f3c2 | |||
| 9e1d9b8b09 | |||
| 087c8e372e | |||
| 8b22261cc0 | |||
| 9fd8442af7 | |||
| 4b8c97ab03 | |||
| 4045ec9d10 | |||
| 2953871af8 | |||
| bf5c8863de | |||
| 581a94579e | |||
| d596e3583e | |||
| adf13c53fd | |||
| 90ee4e5c03 | |||
| f4b55c0eaa | |||
| 0b8052a400 | |||
| 432c089d55 | |||
| add41635c5 | |||
| 9127c054e3 | |||
| 17a5106e39 | |||
| 716cf88968 | |||
| 4830d49d54 | |||
| 83a21ef9cf | |||
| a4bed79df6 | |||
| 174c9da20a | |||
| d2041fd3dc | |||
| 968aa28372 | |||
| f125130270 | |||
| 2fc65cae76 | |||
| 644d5d8f0f | |||
|
|
335453e1d4 | ||
|
|
bb3f2027da | ||
| b0e21e54dc | |||
| 8b86c47d46 | |||
| ebd2884bbd | |||
| a3123b7dee | |||
|
|
17b1a70b75 | ||
| 73c8d04e2f | |||
|
|
05f0c155ed | ||
|
|
b75271b8bf | ||
|
|
d489a7d1d7 | ||
|
|
ded6647ba7 | ||
|
|
b9f2db9e08 | ||
|
|
b3f462262d | ||
|
|
f76f760984 | ||
| 38252c3322 | |||
|
|
905705174e | ||
|
|
c68611eb1d | ||
|
|
eee73c4b0c | ||
|
|
ffc8999953 | ||
| 1468072000 | |||
| e21538c5a3 | |||
| 7bc9f85bad | |||
| 475d7ff342 | |||
| 24c0bc8893 | |||
| 80974b63a2 | |||
| fc56a8e927 | |||
| 765974be6a | |||
| be5a833b2a | |||
| 348dad9f4b | |||
| 44846f85db | |||
| 706a502dc3 | |||
| 9512bb4ba2 | |||
| a163b2dd42 | |||
| 6a34e4d534 | |||
| 6866917126 |
5
Proxmox/shared_clipboard.md
Normal file
5
Proxmox/shared_clipboard.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# Общий буфер обмена
|
||||
|
||||
Общий буфер обмена будет работать в ВМ с графикой SPICE в vm-viewer, при этом в vm-viewer необходимо включить поддержку общего буфера обмена - Preferences -> Разделить буфер обмена.
|
||||
|
||||
Кроме этого, в самой ВМ необходимо установить пакет spice-vdagent
|
||||
@@ -1,35 +1,45 @@
|
||||
### Монтирование сетевых папок с помощью NFS
|
||||
# Монтирование сетевых папок с помощью NFS
|
||||
|
||||
```bash
|
||||
sudo apt install autofs
|
||||
```
|
||||
|
||||
**Настройка**
|
||||
## Настройка
|
||||
|
||||
Для настройки autofs в файле `/etc/auto.master` необходимо добавить строку
|
||||
```
|
||||
|
||||
```bash
|
||||
/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
|
||||
|
||||
```bash
|
||||
video -rw,soft,intr,rsize=8192,wsize=8192 nas.dav.lan:/mnt/media/video
|
||||
data -rw,soft,intr,rsize=8192,wsize=8192 nas.dav.lan:/mnt/main/data
|
||||
|
||||
```
|
||||
|
||||
Перезапускаем службу autofs :
|
||||
|
||||
```bash
|
||||
sudo service autofs restart
|
||||
```
|
||||
|
||||
```bash
|
||||
mkdir ~/DNAS_nfs
|
||||
ln -s /nfs/disk1 ~/DNAS_nfs/disk1
|
||||
ln -s /nfs/disk2 ~/DNAS_nfs/disk2
|
||||
```
|
||||
mkdir ~/nas_nfs
|
||||
ln -s /nfs/data ~/nas_nfs/data
|
||||
ln -s /nfs/video ~/nas_nfs/video
|
||||
|
||||
mkdir ~/nas_syssoft
|
||||
ln -s /nfs/data/Syssoft ~/nas_syssoft/Syssoft
|
||||
|
||||
```
|
||||
14
certbot.md
14
certbot.md
@@ -47,6 +47,20 @@ sudo certbot certonly --dry-run \
|
||||
|
||||
Настройка производилась по статье из [хабра](https://habr.com/ru/post/318952/)
|
||||
|
||||
**Вручную обновить ACME сертификат Let's Encrypt с помощью записи в DNS**
|
||||
|
||||
```bash
|
||||
sudo certbot --manual --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns certonly --server https://acme-v02.api.letsencrypt.org/directory -d *.syssoft.su -d syssoft.su
|
||||
```
|
||||
|
||||
Добавить в DNS TXT запись предложенного содержания. Let'sEncrypt отправляет запрос авторитативному DNS серверу домена. Таким образом необходимо убедиться, что проверка проходит именно на АВТОРИТАТИВНОМ DNS!
|
||||
|
||||
```bash
|
||||
nslookup -type=txt _acme-challenge.syssoft.su. ns1.reg.ru
|
||||
```
|
||||
|
||||
как только получен ответ с ожидаемой записью, можно нажать Enter.
|
||||
|
||||
***
|
||||
|
||||
**Получение wildcard сертификата на все поддомены**
|
||||
|
||||
54
clonezilla.md
Normal file
54
clonezilla.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Clonezilla на диске в grub
|
||||
|
||||
1. Скачать iso образ clonezilla и сохранить на диске
|
||||
|
||||
например
|
||||
|
||||
```shell
|
||||
mkdir /iso
|
||||
cd /iso
|
||||
wget https://unlimited.dl.sourceforge.net/project/clonezilla/clonezilla_live_stable/3.2.0-5/clonezilla-live-3.2.0-5-amd64.iso
|
||||
```
|
||||
|
||||
2. Определить как диск отображается в grub
|
||||
|
||||
2.1. Загрузится в оболочку grub - (хз, как это сделать, в Альт это делается многократным нажатием Esc в момент загрузки)
|
||||
|
||||
когда появляется меню grub нужно нажать `c`
|
||||
|
||||
после того, как оказался в grub
|
||||
|
||||
```shell
|
||||
grub> ls
|
||||
```
|
||||
|
||||
покажет как grub видит диски системы. Из этих дисков необходимо выбрать тот, на котором расположен iso образ clonezilla.
|
||||
|
||||
3. Добавить запись в меню grub
|
||||
|
||||
в строке `set root` - необходимо указать диск, на котором находится iso образ
|
||||
|
||||
```shell
|
||||
❯ cat /etc/grub.d/40_custom
|
||||
#!/bin/sh
|
||||
exec tail -n +3 $0
|
||||
# This file provides an easy way to add custom menu entries. Simply type the
|
||||
# menu entries you want to add after this comment. Be careful not to change
|
||||
# the 'exec tail' line above.
|
||||
|
||||
# Clonezilla
|
||||
menuentry "Backup/Restore HDD with Clonelilla" {
|
||||
set root=(hd2,gpt2)
|
||||
set isofile="/iso/clonezilla.iso"
|
||||
loopback loop $isofile
|
||||
linux (loop)/live/vmlinuz boot=live union=overlay username=user config components quiet noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" keyboard-layouts= ocs_live_batch=\"no\" locales= vga=788 ip=frommedia nosplash toram=live,syslinux,EFI findiso=$isofile
|
||||
initrd (loop)/live/initrd.img
|
||||
}
|
||||
```
|
||||
|
||||
4. Обновить конфигурацию загрузчика
|
||||
|
||||
```shell
|
||||
update-grub
|
||||
reboot
|
||||
```
|
||||
155
git.md
155
git.md
@@ -1,70 +1,181 @@
|
||||
## git
|
||||
# git
|
||||
|
||||
- [git](#git)
|
||||
- [Отображение статуса репозитория в приглашении](#отображение-статуса-репозитория-в-приглашении)
|
||||
- [Аутентификация на GitHub с помощью SSH-ключа](#аутентификация-на-github-с-помощью-ssh-ключа)
|
||||
- [Добавление SSH-ключа на GitHub](#добавление-ssh-ключа-на-github)
|
||||
- [Работа с удаленным репозиторием](#работа-с-удаленным-репозиторием)
|
||||
- [Указание конкретного ключа для репозитория](#указание-конкретного-ключа-для-репозитория)
|
||||
- [Синхронизация своей ветки с изменениями master](#синхронизация-своей-ветки-с-изменениями-master)
|
||||
- [Полная последовательность для Rebase:](#полная-последовательность-для-rebase)
|
||||
|
||||
## Отображение статуса репозитория в приглашении
|
||||
|
||||
#### 1. Отображение статуса репозитория в приглашении
|
||||
Это дополнительный функционал, который не требуется для работы с Git, но очень помогает в этом. При работе с Git очень удобно, когда можно сразу определить, находитесь вы в обычном каталоге или в репозитории Git. Кроме того, было бы хорошо понимать статус текущего репозитория. Для этого нужно установить специальную утилиту, которая будет показывать статус репозитория. Для установки утилиты надо скопировать её репозиторий в домашний каталог пользователя, под которым вы работаете:
|
||||
```
|
||||
|
||||
```bash
|
||||
cd ~
|
||||
git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
|
||||
```
|
||||
|
||||
А затем добавить в конец файла .bashrc такие строки:
|
||||
```
|
||||
|
||||
```bash
|
||||
GIT_PROMPT_ONLY_IN_REPO=1
|
||||
source ~/.bash-git-prompt/gitprompt.sh
|
||||
```
|
||||
|
||||
Для того, чтобы изменения применились, перезапустить bash:
|
||||
```
|
||||
|
||||
```bash
|
||||
exec bash
|
||||
```
|
||||
|
||||
Теперь, если вы находитесь в обычном каталоге, приглашение выглядит стандартно, а если в каталоге, в котором инициализирован репозиторий git, это будет указано.
|
||||
|
||||
#### 2. Аутентификация на GitHub с помощью SSH-ключа
|
||||
###### Генерация нового SSH-ключа (используйте e-mail, который привязан к GitHub):
|
||||
```
|
||||
[вверх](#git)
|
||||
|
||||
***
|
||||
|
||||
## Аутентификация на GitHub с помощью SSH-ключа
|
||||
|
||||
Генерация нового SSH-ключа (используйте e-mail, который привязан к GitHub):
|
||||
|
||||
```bash
|
||||
ssh-keygen -t rsa -b 4096 -C "github_email@gmail.com"
|
||||
```
|
||||
|
||||
На всех вопросах достаточно нажать Enter (более безопасно использовать ключ с passphrase, но можно и без, если нажать Enter при вопросе, тогда passphrase не будет запрашиваться у вас постоянно при операциях с репозиторием).
|
||||
Запуск SSH-агента (пропускаем на Windows):
|
||||
```
|
||||
|
||||
```bash
|
||||
eval "$(ssh-agent -s)"
|
||||
```
|
||||
|
||||
Добавить ключ в SSH-агент (пропускаем на Windows):
|
||||
```
|
||||
|
||||
```bash
|
||||
ssh-add ~/.ssh/id_rsa
|
||||
```
|
||||
###### Добавление SSH-ключа на GitHub
|
||||
|
||||
[вверх](#git)
|
||||
|
||||
***
|
||||
|
||||
## Добавление SSH-ключа на GitHub
|
||||
|
||||
Для добавления ключа надо его скопировать.
|
||||
Например, таким образом можно отобразить ключ для копирования:
|
||||
```
|
||||
|
||||
```bash
|
||||
cat ~/.ssh/id_rsa.pub
|
||||
```
|
||||
|
||||
После копирования надо перейти на GitHub. Находясь на любой странице GitHub, в правом верхнем углу нажмите на картинку вашего профиля и в выпадающем списке выберите «Settings». В списке слева надо выбрать поле «SSH and GPG keys». После этого надо нажать «New SSH key» и в поле «Title» написать название ключа (например «Home»), а в поле «Key» вставить содержимое, которое было скопировано из файла ~/.ssh/id_rsa.pub
|
||||
Чтобы проверить, всё ли прошло успешно, попробуйте выполнить команду:
|
||||
```
|
||||
|
||||
```bash
|
||||
ssh -T git@github.com
|
||||
```
|
||||
|
||||
Вывод должен быть таким:
|
||||
```
|
||||
|
||||
```bash
|
||||
$ ssh -T git@github.com
|
||||
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
|
||||
```
|
||||
#### 3. Работа с удаленным репозиторием
|
||||
Клонируем удаленный репозиторий в локальную папку
|
||||
Hi username! You've successfully authenticated, but GitHub does not provide bash access.
|
||||
```
|
||||
|
||||
[вверх](#git)
|
||||
|
||||
***
|
||||
|
||||
## Работа с удаленным репозиторием
|
||||
|
||||
Клонируем удаленный репозиторий в локальную папку
|
||||
|
||||
```bash
|
||||
git clone ssh://git@github.com/pyneng/online-2-natasha-samoylenko.git
|
||||
```
|
||||
|
||||
После внесения измений в локальные файлы проверяем состояние локального репозитория
|
||||
```
|
||||
|
||||
```bash
|
||||
git status
|
||||
```
|
||||
|
||||
Необходимо добавить файлы в отслеживаемые
|
||||
```
|
||||
|
||||
```bash
|
||||
git add <имя файла>
|
||||
```
|
||||
|
||||
Создадим коммит
|
||||
```
|
||||
|
||||
```bash
|
||||
git commit -m "описание изменений"
|
||||
```
|
||||
|
||||
Синхронизируем локальный и удаленный репозитории
|
||||
```
|
||||
|
||||
```bash
|
||||
git push
|
||||
```
|
||||
|
||||
[вверх](#git)
|
||||
|
||||
***
|
||||
|
||||
## Указание конкретного ключа для репозитория
|
||||
|
||||
1. Клонировать репозиторий с указанием необходимого ключа
|
||||
|
||||
```bash
|
||||
git clone -c core.sshCommand="/usr/bin/ssh -i /home/da2001/.ssh/sape_a.dolgiy" ssh://git@gitlab.sapient.ru:7999/devops/salt.git
|
||||
```
|
||||
|
||||
2. Указать в настройках локального репозитория необходимый ключ
|
||||
|
||||
```bash
|
||||
git config --local core.sshCommand "/usr/bin/ssh -i /home/da2001/.ssh/sape_a.dolgiy"
|
||||
```
|
||||
|
||||
[вверх](#git)
|
||||
|
||||
***
|
||||
|
||||
## Синхронизация своей ветки с изменениями master
|
||||
|
||||
### Полная последовательность для Rebase:
|
||||
|
||||
```bash
|
||||
# 1. Переключиться на основную ветку
|
||||
git switch master
|
||||
|
||||
# 2. Обновить локальную основную ветку с удаленного репозитория
|
||||
git pull origin master
|
||||
|
||||
# 3. Вернуться на свою рабочую ветку
|
||||
git switch your_branch
|
||||
|
||||
# 4. Перебазировать ваши коммиты на актуальный master
|
||||
git rebase master
|
||||
```
|
||||
|
||||
При возникновении конфликтов
|
||||
|
||||
```bash
|
||||
# Во время rebase Git сообщит о конфликтах
|
||||
# 1. Редактируете файлы, устраняете конфликты
|
||||
# 2. Добавляете исправленные файлы:
|
||||
git add <исправленные-файлы>
|
||||
|
||||
# 3. Продолжаете rebase:
|
||||
git rebase --continue
|
||||
|
||||
# Или отменяете rebase если что-то пошло не так:
|
||||
git rebase --abort
|
||||
```
|
||||
|
||||
[вверх](#git)
|
||||
|
||||
***
|
||||
|
||||
BIN
images/greeting_12.png
Normal file
BIN
images/greeting_12.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 126 KiB |
71
images/ssh01.drawio
Normal file
71
images/ssh01.drawio
Normal file
@@ -0,0 +1,71 @@
|
||||
<mxfile host="65bd71144e">
|
||||
<diagram id="l0u-TbN7LvwXP4Vuh3t5" name="Page-1">
|
||||
<mxGraphModel dx="1041" dy="817" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" background="#ffffff" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="14" value="" style="rounded=1;whiteSpace=wrap;html=1;fontColor=#1b0490;fillColor=#D9FFDD;" vertex="1" parent="1">
|
||||
<mxGeometry x="395" y="165" width="335" height="205" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="13" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#CCFFE6;" vertex="1" parent="1">
|
||||
<mxGeometry x="60" y="225" width="190" height="165" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="8" style="edgeStyle=none;html=1;exitX=0.31;exitY=0.8;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;strokeColor=#000000;" edge="1" parent="1" source="2" target="18">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="230" y="265" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="20" style="edgeStyle=none;html=1;exitX=0.875;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;strokeColor=#0a0000;fontColor=#1b0490;endArrow=none;endFill=0;" edge="1" parent="1" source="2" target="19">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="2" value="<font color="#1b0490">Интернет</font>" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;fillColor=#00FFFF;" vertex="1" parent="1">
|
||||
<mxGeometry x="260" y="180" width="120" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="9" style="edgeStyle=none;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;strokeColor=#0a0000;" edge="1" parent="1" source="18" target="4">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="200" y="280" as="sourcePoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="4" value="" style="fontColor=#0066CC;verticalAlign=top;verticalLabelPosition=bottom;labelPosition=center;align=center;html=1;outlineConnect=0;fillColor=#CCCCCC;strokeColor=#6881B3;gradientColor=none;gradientDirection=north;strokeWidth=2;shape=mxgraph.networks.pc;" vertex="1" parent="1">
|
||||
<mxGeometry x="80" y="310" width="70" height="50" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="22" style="edgeStyle=none;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;strokeColor=#0a0000;fontColor=#1b0490;endArrow=none;endFill=0;" edge="1" parent="1" source="5" target="19">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="23" style="edgeStyle=none;html=1;exitX=0.88;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;strokeColor=#0a0000;fontColor=#1b0490;endArrow=none;endFill=0;" edge="1" parent="1" source="5" target="7">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="5" value="" style="fontColor=#0066CC;verticalAlign=top;verticalLabelPosition=bottom;labelPosition=center;align=center;html=1;outlineConnect=0;fillColor=#CCCCCC;strokeColor=#6881B3;gradientColor=none;gradientDirection=north;strokeWidth=2;shape=mxgraph.networks.proxy_server;" vertex="1" parent="1">
|
||||
<mxGeometry x="512.5" y="267.5" width="60" height="50" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="12" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.14;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=none;endFill=0;strokeColor=#000000;" edge="1" parent="1" source="6" target="7">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="6" value="" style="fontColor=#0066CC;verticalAlign=top;verticalLabelPosition=bottom;labelPosition=center;align=center;html=1;outlineConnect=0;fillColor=#CCCCCC;strokeColor=#6881B3;gradientColor=none;gradientDirection=north;strokeWidth=2;shape=mxgraph.networks.firewall;" vertex="1" parent="1">
|
||||
<mxGeometry x="510" y="180" width="60" height="60" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="7" value="" style="fontColor=#0066CC;verticalAlign=top;verticalLabelPosition=bottom;labelPosition=center;align=center;html=1;outlineConnect=0;fillColor=#CCCCCC;strokeColor=#6881B3;gradientColor=none;gradientDirection=north;strokeWidth=2;shape=mxgraph.networks.server_storage;" vertex="1" parent="1">
|
||||
<mxGeometry x="640" y="260" width="80" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="15" value="SrcHost" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#1b0490;" vertex="1" parent="1">
|
||||
<mxGeometry x="85" y="360" width="60" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="16" value="DstHost" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#1b0490;" vertex="1" parent="1">
|
||||
<mxGeometry x="640" y="340" width="60" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="17" value="Bastion" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#1b0490;" vertex="1" parent="1">
|
||||
<mxGeometry x="507.5" y="317.5" width="60" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="18" value="" style="shape=mxgraph.cisco.routers.router;sketch=0;html=1;pointerEvents=1;dashed=0;fillColor=#036897;strokeColor=#ffffff;strokeWidth=2;verticalLabelPosition=bottom;verticalAlign=top;align=center;outlineConnect=0;fontColor=#1b0490;" vertex="1" parent="1">
|
||||
<mxGeometry x="190" y="252.5" width="50" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="21" style="html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;strokeColor=#0a0000;fontColor=#1b0490;endArrow=none;endFill=0;" edge="1" parent="1" source="19" target="6">
|
||||
<mxGeometry relative="1" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="19" value="" style="shape=mxgraph.cisco.routers.router;sketch=0;html=1;pointerEvents=1;dashed=0;fillColor=#036897;strokeColor=#ffffff;strokeWidth=2;verticalLabelPosition=bottom;verticalAlign=top;align=center;outlineConnect=0;fontColor=#1b0490;" vertex="1" parent="1">
|
||||
<mxGeometry x="420" y="210" width="50" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
BIN
images/ssh01.png
Normal file
BIN
images/ssh01.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 37 KiB |
301
iptables.md
Normal file
301
iptables.md
Normal file
@@ -0,0 +1,301 @@
|
||||
# iptables
|
||||
|
||||
- [iptables](#iptables)
|
||||
- [Таблицы](#таблицы)
|
||||
- [Цепочки](#цепочки)
|
||||
- [Правила - условия и действия](#правила---условия-и-действия)
|
||||
- [Просмотр](#просмотр)
|
||||
- [Управление правилами и цепочками](#управление-правилами-и-цепочками)
|
||||
- [Примеры](#примеры)
|
||||
- [Пример первоначальной настройки](#пример-первоначальной-настройки)
|
||||
- [Сброс всех правил цепочки filter](#сброс-всех-правил-цепочки-filter)
|
||||
- [Отладка](#отладка)
|
||||
- [Логирование отклоненных пакетов journald](#логирование-отклоненных-пакетов-journald)
|
||||
- [Логирование отклоненных пакетов Rsyslog](#логирование-отклоненных-пакетов-rsyslog)
|
||||
|
||||
***
|
||||
|
||||
## Таблицы
|
||||
|
||||
- `filter` - основная таблица для фильтрации пакетов, используется по умолчанию;
|
||||
- `nat` - управление преобразованием сетевых адресов;
|
||||
- `mangle` - модификация и замена содержимого сетевых пакетов вне контекста NAT и фильтрации пакетов;
|
||||
- `raw` - предназначена для работы с сырыми пакетами, пока они еще не прошли обработку
|
||||
|
||||
## Цепочки
|
||||
|
||||
Цепочки бывают базовые/встроенные и пользовательские (можно создать самому).
|
||||
|
||||
В новую цепочку можно направлять пакеты чтобы подвергуть их анализу правил. Например для отладки правил или настройки особого движения пакетов как это сделано в Docker
|
||||
|
||||
- `INPUT` - входящий трафик (адресованный локальному хосту);
|
||||
- `FORWARD` - транзитный трафик поступающий на локальную машину с целью передачи его на другую машину (трафик передаваемый в docker контейнер тоже будет считаться транзитным), при этом транзитный трафик проходит в обоих направлениях;
|
||||
- `OUTPUT` - исходящий из локального хоста трафик
|
||||
|
||||
## Правила - условия и действия
|
||||
|
||||
Правило - состоит из условия/критерия (если нет значит применяется ко всему трафику) действия (может не быть) и счетчика (для учета пакетов попавших под правило).
|
||||
|
||||
основные действия с правилами:
|
||||
|
||||
- `-A` - добавить правило в цепочку;
|
||||
- `-С` - проверить все правила;
|
||||
- `-D` - удалить правило;
|
||||
- `-I` - вставить правило с нужным номером;
|
||||
- `-L` - вывести все правила в текущей цепочке;
|
||||
- `-S` - вывести все правила;
|
||||
- `-F` - очистить все правила;
|
||||
- `-N` - создать цепочку;
|
||||
- `-X` - удалить цепочку;
|
||||
- `-P` - установить действие по умолчанию.
|
||||
|
||||
Условия:
|
||||
|
||||
- `-p` - протокол (TCP, UDP, ICMP, ALL);
|
||||
- `-s` - ip адрес источника (можно с маской 10.0.0.0/24), допускается отрицание (т.е. все кроме) `-s ! 10.0.0.0/24`;
|
||||
- `-d` - ip адрес получателя (аналогично `-s`);
|
||||
- `-i` - интерфейс с которого пришел пакет (только для `INPUT`, `FORWARD`, `PREROUTING`), например `ens3`, допускается указать `ens+` что означает все имена интерфейсов начинающиеся с заданной строки, допускается отрицание `-i ! ens+`;
|
||||
- `-o` - интерфейс локального хоста, из которого выходит трафик (только для `OUTPUT`, `FORWARD`, `PREROUTING`);
|
||||
- `--sport` - порт с которого был отправлен TCP/UDP пакет (допускаются имена служб из `/etc/services`), поддерживаются диапазоны вида `20:80` что значит от 20 до 80 порта, так же можно опустить одно из значений `:80` (от 0 до 80) или `20:` (от 20 до 65535), отрицание поддерживается даже к диапазонам `--sport ! 20:80`;
|
||||
- `--dport` - аналогично `--sport` только речь идет про порт, которому адресован пакет;
|
||||
- `--icmp-type` - тип ICMP сообщения (номер или название), поддерживается отрицание. RFC 792 или `iptables --protocol icmp --help`;
|
||||
- `-m mac --mac-source` - MAC адрес устройства передавшего пакет, поддерживается отрицание;
|
||||
- `-m state --state` - состояние соединения:
|
||||
- `INVALID` - неизвестное соединение, возможно ошибочное;
|
||||
- `NEW` - новое соединение;
|
||||
- `ESTABLISHED` - уже установленное соединение;
|
||||
- `RELATED` - пакет принадлежит уже существующему соединению, но он отправляется по новому
|
||||
- `-m ttl` - Time To Live:
|
||||
- `--ttl-eq N` - TTL пакета равен N;
|
||||
- `--ttl-lt N` - TTL пакета меньше N;
|
||||
- `--ttl-gt N` - TTL пакета больше N
|
||||
- `-m multiport` - указать в правиле несколько портов, диапазон или набор:
|
||||
- `-m multiport --dports 8080,22,80` - применяется к указанным портам;
|
||||
- `-m multiport --dports 1024:65535` - применяется к диапазону портов
|
||||
|
||||
Действия:
|
||||
|
||||
- `ACCEPT` - пакет принят в текущей таблице;
|
||||
- `DROP` - пакет сбрасывается и перестает движение в системе;
|
||||
- `LOG` - пакет журналируется и продолжает дальнейшие движение по цепочке правил и таблицам (рассмотрим ниже)
|
||||
- `REJECT` - аналогично DROP только отдает сообщение об ошибке на хост отправителя (работает на всех цепочках таблицы filter):
|
||||
- `--reject-with` - тип ответа, RFC 793 или `iptables -j REJECT -h`
|
||||
- `RETURN` - возврат пакета в вышестоящую цепочку для применения действия по умолчанию, при отсутствии вышестоящей цепочки применится действие по умолчанию
|
||||
|
||||
## Просмотр
|
||||
|
||||
- Просмотр текущих правил
|
||||
|
||||
```bash
|
||||
iptables -L
|
||||
```
|
||||
|
||||
только для конкретной цепочки
|
||||
|
||||
```bash
|
||||
iptables -L INPUT
|
||||
```
|
||||
|
||||
более наглядно
|
||||
|
||||
```bash
|
||||
iptables -vnL --line-numbers
|
||||
```
|
||||
|
||||
- Список текущих правил
|
||||
|
||||
```bash
|
||||
iptables -S
|
||||
```
|
||||
|
||||
- Очистка правил
|
||||
|
||||
```bash
|
||||
iptables -F
|
||||
```
|
||||
|
||||
очистка правил конкретной цепочки
|
||||
|
||||
```bash
|
||||
iptables -F INPUT
|
||||
```
|
||||
|
||||
**Стоит иметь ввиду, что очистка правил не изменяет правило по-умолчанию, если оно установлено в DROP, после очистки всех правил можно потерять доступ к узлу.**
|
||||
|
||||
- Для полной очистки правил и отключения фильтрации
|
||||
|
||||
```bash
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -F
|
||||
```
|
||||
|
||||
## Управление правилами и цепочками
|
||||
|
||||
Добавить правило (разрешить весь трафик с tun интерфейсов) в конец цепочки INPUT (-A, --append):
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -i tun+ -j ACCEPT
|
||||
```
|
||||
|
||||
Вставить правило в позицию 2 цепочки INPUT (-I, --insert):
|
||||
|
||||
```bash
|
||||
iptables -I INPUT 2 -i lo -j ACCEPT
|
||||
```
|
||||
|
||||
Установить политику по умолчанию DROP для цепочки INPUT (-P, --policy):
|
||||
|
||||
```bash
|
||||
iptables -P INPUT DROP
|
||||
```
|
||||
|
||||
Создание новой цепочки правил:
|
||||
|
||||
```bash
|
||||
iptables -N LOGGING
|
||||
```
|
||||
|
||||
## Примеры
|
||||
|
||||
Предположим что для цепочки `INPUT` политика по умолчанию `DROP`, это значит что все входящие пакеты будут отброшены, но нам нужен некоторый входящий трафик.
|
||||
|
||||
Разрешим трафик на локальный DNS сервер, без этого могут быть долгие подключения по ssh:
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
|
||||
```
|
||||
|
||||
Разрешим движение трафика из интерфейсов создаваемых Docker (при политиках по умолчанию `DROP`, контейнеры не смогут общаться с другими интерфейсами):
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -i br+ -j ACCEPT
|
||||
```
|
||||
|
||||
Разрешим любой входящий трафик из `localhost` и откроем `http/https` порты (80/443), например для случая когда у нас есть веб-сервер и наши сайты должны быть доступны снаружи:
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -i lo -j ACCEPT
|
||||
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
|
||||
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
|
||||
```
|
||||
|
||||
*Если не разрешить входящий трафик от `localhost` то могут быть странные задержки с ответами, а при дебаге можно увидеть отклоенные пакеты от 127.0.0.1*
|
||||
|
||||
Теперь локальный DNS на 53 порту доступен, docker контейнеры тоже, с localhost трафик разрешен, и для внешнего мира открыты 80 и 443 порты для наших сайтов. Но это все только для установления соединения и рукопожатия. Теперь нам нужно разрешить все установленные и связанные с ними соединения чтобы трафик действительно пошел (еще вот):
|
||||
|
||||
```bash
|
||||
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
```
|
||||
|
||||
### Пример первоначальной настройки
|
||||
|
||||
```bash
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -F
|
||||
|
||||
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
iptables -A INPUT -p tcp -m multiport --dports 8080,22,80 -j ACCEPT
|
||||
iptables -A INPUT -p udp --dport 69 -j ACCEPT
|
||||
iptables -A INPUT -p tcp --dport 5000:5678 -j ACCEPT
|
||||
|
||||
iptables -P INPUT DROP
|
||||
|
||||
iptables --line-numbers -L -v -n
|
||||
```
|
||||
|
||||
### Сброс всех правил цепочки filter
|
||||
|
||||
```bash
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -F
|
||||
```
|
||||
|
||||
## Отладка
|
||||
|
||||
### Логирование отклоненных пакетов journald
|
||||
|
||||
Работа iptables происходит на уровне ядра ОС, соответственно все события логируются также на уровне ядра.
|
||||
|
||||
Добавляем правило логирования каждого пакета с префиксом:
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -j LOG --log-level info --log-prefix "IPTABLES-DROP: "
|
||||
```
|
||||
|
||||
Вывод сообщений ядра
|
||||
|
||||
```bash
|
||||
journalctl -k
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
```bash
|
||||
journalctl -k -f
|
||||
```
|
||||
|
||||
### Логирование отклоненных пакетов Rsyslog
|
||||
|
||||
*Полезно иметь возможно отладить свои правила, экономия времени и iptables становится понятнее.*
|
||||
|
||||
Суть отладки правил iptables такова:
|
||||
|
||||
создаем отдельную цепочку, куда будем перенаправлять весь трафик, который должен быть отклонен в новой цепочке ведем логирование и отклоняем пакеты
|
||||
направляем запросы для теста правил и смотрим лог отклоенных пакетов
|
||||
|
||||
Создание новой цепочки:
|
||||
|
||||
```bash
|
||||
iptables -N LOGGING
|
||||
```
|
||||
|
||||
Добавляем правило логирования каждого пакета с префиксом:
|
||||
|
||||
```bash
|
||||
iptables -A LOGGING -j LOG --log-prefix "ipt denied: "
|
||||
```
|
||||
|
||||
Отклоняем пакет:
|
||||
|
||||
```bash
|
||||
iptables -A LOGGING -j DROP
|
||||
```
|
||||
|
||||
В цепочку, откуда будут приходить пакеты для отклонения добавляем новое правило перенаправления в новую цепочку логирования:
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -j LOGGING
|
||||
```
|
||||
|
||||
Теперь добавим конфиг rsyslog:
|
||||
|
||||
```bash
|
||||
nano /etc/rsyslog.d/10-iptables.conf
|
||||
```
|
||||
|
||||
Вставим следующий текст:
|
||||
|
||||
```bash
|
||||
:msg, contains, "ipt denied: " -/var/log/iptables.log
|
||||
& ~
|
||||
```
|
||||
|
||||
Сохраним и перезагрузим демона rsyslog:
|
||||
|
||||
```bash
|
||||
service rsyslog restart
|
||||
```
|
||||
|
||||
Теперь откроем файл и будем следить за 20 последних строк:
|
||||
|
||||
```bash
|
||||
echo > /var/log/iptables.log
|
||||
tail -f -n 20 /var/log/iptables.log
|
||||
```
|
||||
|
||||
374
linux_usefull.md
374
linux_usefull.md
@@ -1,83 +1,93 @@
|
||||
## Linux useful
|
||||
# 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)
|
||||
- [Linux useful](#linux-useful)
|
||||
- [Текущая директория сервера в браузере по адресу `http://server_ip:8000/`](#текущая-директория-сервера-в-браузере-по-адресу-httpserver_ip8000)
|
||||
- [Запустить графическое приложение через ssh соединение `-Y`](#запустить-графическое-приложение-через-ssh-соединение--y)
|
||||
- [Отобразить все группы пользователя\*\*](#отобразить-все-группы-пользователя)
|
||||
- [SSH соединение через промежуточный хост\*\*](#ssh-соединение-через-промежуточный-хост)
|
||||
- [SSH соединение без проверки подлинности ключа и его сохранения](#ssh-соединение-без-проверки-подлинности-ключа-и-его-сохранения)
|
||||
- [Изменить первичную группу пользователя в текщем сеансе](#изменить-первичную-группу-пользователя-в-текщем-сеансе)
|
||||
- [Сохранить man в pdf](#сохранить-man-в-pdf)
|
||||
- [Прервать выполнение команды через 5 секунд](#прервать-выполнение-команды-через-5-секунд)
|
||||
- [Инфо об ОС](#инфо-об-ос)
|
||||
- [Выполнить команду несколько раз в цикле](#выполнить-команду-несколько-раз-в-цикле)
|
||||
- [Конвертировать изоражения heic в jpg](#конвертировать-изоражения-heic-в-jpg)
|
||||
- [Конвертировать jpg в pdf](#конвертировать-jpg-в-pdf)
|
||||
- [получить UUID диска для монтирования](#получить-uuid-диска-для-монтирования)
|
||||
- [Сброс пароля root](#сброс-пароля-root)
|
||||
- [Проверить доступность диапазона хостов](#проверить-доступность-диапазона-хостов)
|
||||
- [Конвертировать pdf в png](#конвертировать-pdf-в-png)
|
||||
- [Узнать загрузку процессора определённым процессом](#узнать-загрузку-процессора-определённым-процессом)
|
||||
- [Определить страну, город и др. детали по IP](#определить-страну-город-и-др-детали-по-ip)
|
||||
- [Отобразить файл без комментариев и путых строк](#отобразить-файл-без-комментариев-и-путых-строк)
|
||||
- [Изменить консольный редактор по-умолчанию](#изменить-консольный-редактор-по-умолчанию)
|
||||
- [Перенос строк в nano](#перенос-строк-в-nano)
|
||||
- [Генератор паролей](#генератор-паролей)
|
||||
- [Импорт ssh ключа из Интернет](#импорт-ssh-ключа-из-интернет)
|
||||
|
||||
***
|
||||
|
||||
###### tip001
|
||||
:large_blue_circle: **Текущая директория сервера в браузере по адресу `http://server_ip:8000/`**
|
||||
## Текущая директория сервера в браузере по адресу `http://server_ip:8000/`
|
||||
|
||||
```bash
|
||||
python -m SimpleHTTPServer
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip002
|
||||
:large_blue_circle: **Запустить графическое приложение через ssh соединение `-Y`**
|
||||
*для текущей сессии*
|
||||
## Запустить графическое приложение через ssh соединение `-Y`
|
||||
|
||||
*для текущей сессии*
|
||||
|
||||
```bash
|
||||
ssh -Y pi@server_ip
|
||||
```
|
||||
|
||||
*для всех подключений*
|
||||
|
||||
`ForwardX11 yes` в файле `/etc/ssh/ssh_config`
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip003
|
||||
:large_blue_circle: **Отобразить все группы пользователя**
|
||||
## Отобразить все группы пользователя**
|
||||
|
||||
```bash
|
||||
da2001@Metromint:~$ groups da2001
|
||||
da2001 : da2001 adm cdrom sudo dip plugdev kvm lpadmin sambashare wireshark libvirt
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip004
|
||||
:large_blue_circle: **SSH соединение через промежуточный хост**
|
||||
## SSH соединение через промежуточный хост**
|
||||
|
||||
```bash
|
||||
ssh -t pi@192.168.89.2 ssh da2001@192.168.1.8
|
||||
```
|
||||
|
||||
*сначала будет запрошен пароль от 192.168.89.2, затем от 192.168.1.8*
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip005
|
||||
:large_blue_circle: **SSH соединение без проверки подлинности ключа и его сохранения**
|
||||
## SSH соединение без проверки подлинности ключа и его сохранения
|
||||
|
||||
```bash
|
||||
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.2.1
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip006
|
||||
:large_blue_circle: **Изменить первичную группу пользователя в текщем сеансе**
|
||||
## Изменить первичную группу пользователя в текщем сеансе
|
||||
|
||||
```bash
|
||||
[lisa@server1 ~]$ groups
|
||||
lisa account sales
|
||||
@@ -89,14 +99,15 @@ sales lisa account
|
||||
total 0
|
||||
-rw-r--r--. 1 lisa sales 0 Feb 6 10:06 file1
|
||||
```
|
||||
|
||||
*теперь все новые файлы будут принадлежать группе sales*
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip007
|
||||
:large_blue_circle: **Сохранить man в pdf**
|
||||
## Сохранить man в pdf
|
||||
|
||||
```bash
|
||||
man -t <программа> | ps2pdf - <filename>.pdf
|
||||
```
|
||||
@@ -105,22 +116,22 @@ man -t <программа> | ps2pdf - <filename>.pdf
|
||||
man -t tar | ps2pdf - tar_man.pdf
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip008
|
||||
:large_blue_circle: **Прервать выполнение команды через 5 секунд**
|
||||
## Прервать выполнение команды через 5 секунд
|
||||
|
||||
```bash
|
||||
timeout 5s command
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip009
|
||||
:large_blue_circle: **Инфо об ОС**
|
||||
## Инфо об ОС
|
||||
|
||||
```bash
|
||||
cat /etc/*release
|
||||
```
|
||||
@@ -161,12 +172,12 @@ da2001@Metromint:~$ neofetch
|
||||
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip010
|
||||
:large_blue_circle: **Выполнить команду несколько раз в цикле**
|
||||
## Выполнить команду несколько раз в цикле
|
||||
|
||||
```bash
|
||||
da2001@Metromint:~$ for i in {1..5}; do echo $i; done
|
||||
1
|
||||
@@ -174,75 +185,93 @@ da2001@Metromint:~$ for i in {1..5}; do echo $i; done
|
||||
3
|
||||
4
|
||||
5
|
||||
```
|
||||
```
|
||||
|
||||
*выполнение скрипта с параметрами в цикле*
|
||||
```bash
|
||||
```bash
|
||||
|
||||
for i in {1..20}; do ./wlt_start.py -c config_m716.cfg; done
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip011
|
||||
:large_blue_circle: **Конвертировать изоражения heic в jpg**
|
||||
## Конвертировать изоражения heic в jpg
|
||||
|
||||
```bash
|
||||
sudo apt-get install libheif-examples
|
||||
```
|
||||
*для конвертации одного изображения*
|
||||
```bash
|
||||
|
||||
*для конвертации одного изображения*
|
||||
|
||||
```bash
|
||||
heif-convert IMG_1234.HEIC IMG_1234.jpg
|
||||
```
|
||||
*для конвертации всех изображений в папке*
|
||||
```bash
|
||||
```
|
||||
|
||||
*для конвертации всех изображений в папке*
|
||||
|
||||
```bash
|
||||
mkdir jpg
|
||||
for file in *.heic; do heif-convert $file ./jpg/${file/%.heic/.jpg}; done
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip012
|
||||
:large_blue_circle: **Конвертировать jpg в pdf**
|
||||
*необходим установленный ImageMagick*
|
||||
```bash
|
||||
## Конвертировать jpg в pdf
|
||||
|
||||
*необходим установленный ImageMagick*
|
||||
|
||||
```bash
|
||||
sudo apt install imagemagick
|
||||
```
|
||||
*для конвертации одного изображения*
|
||||
```bash
|
||||
```
|
||||
|
||||
*для конвертации одного изображения*
|
||||
|
||||
```bash
|
||||
convert image.jpg out.pdf
|
||||
```
|
||||
*для конвертации нескольких изображений*
|
||||
```bash
|
||||
```
|
||||
|
||||
*для конвертации нескольких изображений*
|
||||
|
||||
```bash
|
||||
|
||||
convert image1.jpg image2.jpg image3.jpg out.pdf
|
||||
```
|
||||
***если в процессе конвертации будет получено сообщение об ошибке***
|
||||
```bash
|
||||
```
|
||||
|
||||
***если в процессе конвертации будет получено сообщение об ошибке***
|
||||
|
||||
```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
|
||||
добавить/отредактировать
|
||||
|
||||
```bash
|
||||
<policy domain="coder" rights="read | write" pattern="PDF" />
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip013
|
||||
:large_blue_circle: **получить UUID диска для монтирования**
|
||||
## получить UUID диска для монтирования
|
||||
|
||||
**Вариант 1**
|
||||
|
||||
```bash
|
||||
lsblk -n -o uuid /dev/sda1
|
||||
```
|
||||
```
|
||||
|
||||
-n - не выводить заголовки
|
||||
-o - отображаемое поле
|
||||
*таким образом, для раздела с ФС ext4, запись в fstab можно добавить таким образом*
|
||||
*таким образом, для раздела с ФС ext4, запись в fstab можно добавить таким образом*
|
||||
|
||||
```bash
|
||||
mkdir /mntdir
|
||||
|
||||
@@ -251,82 +280,103 @@ 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)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
|
||||
###### tip014
|
||||
:large_blue_circle: **Сброс пароля root**
|
||||
## Сброс пароля root
|
||||
|
||||
**CentOS/RedHat Linux**
|
||||
|
||||
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
|
||||
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
|
||||
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
||||
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
||||
|
||||
```bash
|
||||
mount -o remount,rw /sysroot
|
||||
```
|
||||
4. Изменить корневой каталог
|
||||
```bash
|
||||
```
|
||||
|
||||
- Изменить корневой каталог
|
||||
|
||||
```bash
|
||||
chroot /sysroot
|
||||
```
|
||||
5. Теперь можно изменить пароль root
|
||||
```
|
||||
|
||||
- Теперь можно изменить пароль root
|
||||
|
||||
```bash
|
||||
passwd
|
||||
```
|
||||
будет предложено ввести новый пароль дважды.
|
||||
6. Поскольку на ранней стадии загрузки SELinux еще не был активирован, тип контекста в `/etc/shadow` будет перепутан. Если сейчас перезагрузиться, никто не сможет войти в систему. Поэтому необходимо убедиться, что тип контекста установлен правильно. Для этого на этом этапе нужно загрузить политику SELinux с помощью команды
|
||||
```
|
||||
|
||||
будет предложено ввести новый пароль дважды.
|
||||
|
||||
Поскольку на ранней стадии загрузки SELinux еще не был активирован, тип контекста в `/etc/shadow` будет перепутан. Если сейчас перезагрузиться, никто не сможет войти в систему. Поэтому необходимо убедиться, что тип контекста установлен правильно. Для этого на этом этапе нужно загрузить политику SELinux с помощью команды
|
||||
|
||||
```bash
|
||||
load_policy -i
|
||||
```
|
||||
7. Теперь нужно вручную установить правильный тип контекста в `/etc/shadow`.
|
||||
```
|
||||
|
||||
- Теперь нужно вручную установить правильный тип контекста в `/etc/shadow`.
|
||||
|
||||
```bash
|
||||
chcon -t shadow_t /etc/shadow
|
||||
```
|
||||
**вместо 6,7 пунктов можно просто в корне создать файл `.autorelabel`**
|
||||
```
|
||||
|
||||
**вместо 6,7 пунктов можно просто в корне создать файл `.autorelabel`**
|
||||
|
||||
```bash
|
||||
touch /.autorelabel
|
||||
```
|
||||
|
||||
8. Всё, после перезагрузки, у root будет новый пароль.
|
||||
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
||||
Всё, после перезагрузки, у root будет новый пароль.
|
||||
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
||||
|
||||
```bash
|
||||
reboot -f
|
||||
```
|
||||
|
||||
**Debian**
|
||||
**Debian**
|
||||
|
||||
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
|
||||
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
|
||||
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
||||
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
||||
|
||||
```bash
|
||||
mount -o remount,rw /
|
||||
```
|
||||
4. Теперь можно изменить пароль root
|
||||
```
|
||||
|
||||
Теперь можно изменить пароль root
|
||||
|
||||
```bash
|
||||
passwd
|
||||
```
|
||||
```
|
||||
|
||||
будет предложено ввести новый пароль дважды.
|
||||
5. Всё, после перезагрузки, у root будет новый пароль.
|
||||
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
||||
Всё, после перезагрузки, у root будет новый пароль.
|
||||
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
||||
|
||||
```bash
|
||||
reboot -f
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### 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
|
||||
```
|
||||
@@ -339,20 +389,23 @@ for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i -
|
||||
192.168.1.13 - НЕ доступен
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### tip016
|
||||
:large_blue_circle: **Конвертировать pdf в png**
|
||||
## Конвертировать 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.*
|
||||
@@ -360,37 +413,114 @@ pdftoppm input.pdf outputname -png -f {page} -singlefile
|
||||
**Указать разрешение преобразованного изображения**
|
||||
*Разрешение по умолчанию для этой команды составляет 150 точек на дюйм.*
|
||||
|
||||
*Чтобы увеличить разрешение преобразованного PDF-файла, добавьте параметры `-rx` {разрешение} и `-ry` {разрешение}.*
|
||||
*Чтобы увеличить разрешение преобразованного PDF-файла, добавьте параметры `-rx` {разрешение} и `-ry` {разрешение}.*
|
||||
|
||||
```bash
|
||||
pdftoppm input.pdf outputname -png -rx 300 -ry 300
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
###### 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**
|
||||
|
||||
**top**
|
||||
|
||||
```bash
|
||||
top -b -n 2 -d 0.2 -p PID_ID | tail -1 | awk '{print $9}'
|
||||
```
|
||||
**Нагрузить процессор для проверки**
|
||||
|
||||
**Нагрузить процессор для проверки**
|
||||
|
||||
```bash
|
||||
cat /dev/zero > /dev/null
|
||||
```
|
||||
|
||||
[вверх](#top)
|
||||
[вверх](#linux-useful)
|
||||
|
||||
***
|
||||
|
||||
## Определить страну, город и др. детали по IP
|
||||
|
||||
```bash
|
||||
curl -s "https://ifconfig.co/json?ip=$1" | jq -r '.country, .city, .hostname, .asn_org'
|
||||
```
|
||||
|
||||
или функция
|
||||
|
||||
```bash
|
||||
getip() {
|
||||
curl -s "https://ifconfig.co/json?ip=$1" | jq -r '.country, .city, .hostname, .asn_org'
|
||||
}
|
||||
```
|
||||
|
||||
[вверх](#linux-useful)
|
||||
|
||||
## Отобразить файл без комментариев и путых строк
|
||||
|
||||
```bash
|
||||
grep -vE '(^[[:space:]]*([#;!].*)?$)' file
|
||||
```
|
||||
|
||||
[вверх](#linux-useful)
|
||||
|
||||
## Изменить консольный редактор по-умолчанию
|
||||
|
||||
```shell
|
||||
which nano
|
||||
/usr/bin/nano
|
||||
|
||||
export EDITOR=/usr/bin/nano
|
||||
```
|
||||
|
||||
[вверх](#linux-useful)
|
||||
|
||||
## Перенос строк в nano
|
||||
|
||||
Для включения переноса строк в текщум редакторе необходимо нажать `Esc` + `$`.
|
||||
|
||||
обозначение `Esc` + `$` означает нажатие и отпускание `Esc`, а затем нажатие `$`.
|
||||
|
||||
Тогда полная последовательность нажатий клавиш будет `Esc`, `Shift+4`
|
||||
|
||||
[вверх](#linux-useful)
|
||||
|
||||
## Генератор паролей
|
||||
|
||||
В качестве простого генератора паролей удобно использовать `pwqgen`. Он генерирует легкозапоминаемые пароли.
|
||||
|
||||
[вверх](#linux-useful)
|
||||
|
||||
## Импорт ssh ключа из Интернет
|
||||
|
||||
```shell
|
||||
wget -qO- https://da2001.ru/ssh.pub >> ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
```shell
|
||||
curl https://da2001.ru/ssh.pub >> ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
[вверх](#linux-useful)
|
||||
|
||||
674
mysql.md
Normal file
674
mysql.md
Normal file
@@ -0,0 +1,674 @@
|
||||
# MySQL
|
||||
|
||||
Описан процесс установки MySQL и настройка базовой репликации мастер -> слейв
|
||||
|
||||
- [MySQL](#mysql)
|
||||
- [Установка сервера MySQL 8 в Debian 12](#установка-сервера-mysql-8-в-debian-12)
|
||||
- [Создание тестовой БД и наполнение данными](#создание-тестовой-бд-и-наполнение-данными)
|
||||
- [Подключение к СУБД](#подключение-к-субд)
|
||||
- [Создание базы данных](#создание-базы-данных)
|
||||
- [Переключение на созданную базу данных](#переключение-на-созданную-базу-данных)
|
||||
- [Создание таблицы в базе данных](#создание-таблицы-в-базе-данных)
|
||||
- [Добавление записей в таблицу](#добавление-записей-в-таблицу)
|
||||
- [Выборка из таблицы](#выборка-из-таблицы)
|
||||
- [Репликация - общие настройки](#репликация---общие-настройки)
|
||||
- [Пользователь для выполнения задач репликации](#пользователь-для-выполнения-задач-репликации)
|
||||
- [Настройка мастера для репликации](#настройка-мастера-для-репликации)
|
||||
- [Репликация средствами mysqldump](#репликация-средствами-mysqldump)
|
||||
- [Дамп БД средствами mysqldump](#дамп-бд-средствами-mysqldump)
|
||||
- [Настройка репликации mysqldump](#настройка-репликации-mysqldump)
|
||||
- [Настройка слейва для репликации](#настройка-слейва-для-репликации)
|
||||
- [Запуск воспроизведения журнала ретрансляции, и проверка статуса репликации mysqldump](#запуск-воспроизведения-журнала-ретрансляции-и-проверка-статуса-репликации-mysqldump)
|
||||
- [Проверка репликации mysqldump](#проверка-репликации-mysqldump)
|
||||
- [Репликация - Percona XtraBackup](#репликация---percona-xtrabackup)
|
||||
- [Установка Percona XtraBackup](#установка-percona-xtrabackup)
|
||||
- [Настройка репликации xtrabackup](#настройка-репликации-xtrabackup)
|
||||
- [Подготовка резервной копии перед восстановлением](#подготовка-резервной-копии-перед-восстановлением)
|
||||
- [Копирование резервной копии на слейв](#копирование-резервной-копии-на-слейв)
|
||||
- [Восстановление БД на слейве](#восстановление-бд-на-слейве)
|
||||
- [Настройка репликации](#настройка-репликации)
|
||||
- [Проверка репликации xtrabackup](#проверка-репликации-xtrabackup)
|
||||
|
||||
## Установка сервера MySQL 8 в Debian 12
|
||||
|
||||
На сайте [MySQL в разделе Community](https://dev.mysql.com/downloads/mysql/) выбрать необходимую версию (8.4.3 LTS на момент написания заметки), в качестве ОС выбрать Debian.
|
||||
После выбора ОС появится предложение выполнить установку используя репозиторий APT, нажимаем ссылку, будет предложено скачать пакет для настройки репозитория (mysql-apt-config_0.8.33-1_all.deb на момент написания заметки). Далее в консоли по документации - <https://dev.mysql.com/doc/refman/8.4/en/linux-installation-apt-repo.html>
|
||||
|
||||
```shell
|
||||
su -
|
||||
|
||||
wget https://dev.mysql.com/get/mysql-apt-config_0.8.33-1_all.deb
|
||||
apt install -y ./mysql-apt-config_0.8.33-1_all.deb
|
||||
```
|
||||
|
||||
В появившемся окне выбрать - `Ok`
|
||||
|
||||
```shell
|
||||
dpkg-reconfigure mysql-apt-config
|
||||
|
||||
apt update
|
||||
apt install mysql-server
|
||||
```
|
||||
|
||||
Можно также выполнить настройки безопасности
|
||||
|
||||
```shell
|
||||
mysql_secure_installation
|
||||
```
|
||||
|
||||
## Создание тестовой БД и наполнение данными
|
||||
|
||||
### Подключение к СУБД
|
||||
|
||||
```shell
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
### Создание базы данных
|
||||
|
||||
```shell
|
||||
CREATE DATABASE IF NOT EXISTS sape_test_db;
|
||||
```
|
||||
|
||||
По ошибке была создана БД с именем - `sape_test_db.db`
|
||||
|
||||
При её удалении полачал ошибку
|
||||
|
||||
```shell
|
||||
mysql> drop database 'sape_test_db.db';
|
||||
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''sape_test_db.db'' at line 1
|
||||
```
|
||||
|
||||
Поиск причин привёл - <https://stackoverflow.com/questions/16135987/error-on-drop-default-database-error>
|
||||
|
||||
при использовании в названии зарезервированных слов, следует заключать имя БД в косые ковычки `
|
||||
|
||||
```shell
|
||||
mysql> drop database `sape_test_db.db`;
|
||||
Query OK, 0 rows affected (0,17 sec)
|
||||
```
|
||||
|
||||
### Переключение на созданную базу данных
|
||||
|
||||
```shell
|
||||
USE sape_test_db;
|
||||
```
|
||||
|
||||
### Создание таблицы в базе данных
|
||||
|
||||
таблица будет содержать три столбца: id, name, surname, address. Первичным ключом будет id. В качестве движка явно укажем InnoDB.
|
||||
|
||||
```shell
|
||||
CREATE TABLE admin_table
|
||||
( id int NOT NULL AUTO_INCREMENT,
|
||||
name char(20) NOT NULL,
|
||||
surname char(20) NOT NULL,
|
||||
city char(20) NULL,
|
||||
PRIMARY KEY (id) )
|
||||
ENGINE=InnoDB;
|
||||
```
|
||||
|
||||
для удаления таблицы
|
||||
|
||||
```shell
|
||||
DROP TABLE admin_table;
|
||||
```
|
||||
|
||||
### Добавление записей в таблицу
|
||||
|
||||
```shell
|
||||
INSERT admin_table(name, surname, city) VALUES ('Andrei', 'Ahmadulin', 'Ekaterinburg');
|
||||
INSERT admin_table(name, surname, city) VALUES ('Kit', 'Root', 'Georgia');
|
||||
INSERT admin_table(name, surname, city) VALUES ('Ilya', 'Paramonov', 'Moscow');
|
||||
INSERT admin_table(name, surname, city) VALUES ('Andrei', 'Zharkov', 'Moscow');
|
||||
INSERT admin_table(name, surname, city) VALUES ('Artem', 'Dolgiy', 'Zelenograd');
|
||||
```
|
||||
|
||||
### Выборка из таблицы
|
||||
|
||||
```shell
|
||||
SELECT * FROM admin_table;
|
||||
```
|
||||
|
||||
## Репликация - общие настройки
|
||||
|
||||
Эти настройки выполняются вне зависимости от выбранного способа репликации
|
||||
|
||||
### Пользователь для выполнения задач репликации
|
||||
|
||||
Будет создан пользователь `repl_user` с паролем `repl_passwd`
|
||||
|
||||
```shell
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
```shell
|
||||
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_passwd';
|
||||
```
|
||||
|
||||
Если возникнет ошибка - `ERROR 1819 (HY000): Your password does not satisfy the current policy requirements` - <https://stackoverflow.com/questions/43094726/your-password-does-not-satisfy-the-current-policy-requirements>
|
||||
|
||||
кратко - достаточно изменить политику паролей
|
||||
|
||||
```shell
|
||||
mysql> SHOW VARIABLES LIKE 'validate_password%';
|
||||
+-------------------------------------------------+--------+
|
||||
| Variable_name | Value |
|
||||
+-------------------------------------------------+--------+
|
||||
| validate_password.changed_characters_percentage | 0 |
|
||||
| validate_password.check_user_name | ON |
|
||||
| validate_password.dictionary_file | |
|
||||
| validate_password.length | 8 |
|
||||
| validate_password.mixed_case_count | 1 |
|
||||
| validate_password.number_count | 1 |
|
||||
| validate_password.policy | MEDIUM |
|
||||
| validate_password.special_char_count | 1 |
|
||||
+-------------------------------------------------+--------+
|
||||
8 rows in set (0,03 sec)
|
||||
|
||||
mysql> SET GLOBAL validate_password.policy = LOW;
|
||||
Query OK, 0 rows affected (0,00 sec)
|
||||
|
||||
mysql>
|
||||
```
|
||||
|
||||
Теперь пользователя можно будет создать с простым паролем - `'repl_passwd'`
|
||||
|
||||
Назначение привилегий для пользователя
|
||||
|
||||
```shell
|
||||
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' WITH GRANT OPTION;
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
|
||||
### Настройка мастера для репликации
|
||||
|
||||
В файл `/etc/mysql/my.cnf` (или в `/etc/mysql/mysql.conf.d/mysqld.cnf`, в зависимости от настроек) в секции `[mysqld]` необходимо добавить следующие параметры:
|
||||
|
||||
```shell
|
||||
server_id = 1 # назначает серверу уникальный целочисленный идентификатор
|
||||
log_bin = mysql-bin # включает двоичный журнал и указывает его расположение
|
||||
```
|
||||
|
||||
После изменения конфигурации необходимо перезагрузить СУБД
|
||||
|
||||
```shell
|
||||
systemctl restart mysql.service
|
||||
```
|
||||
|
||||
Стоит убедиться, что двоичный журнал включен
|
||||
|
||||
```shell
|
||||
SHOW BINARY LOG STATUS;
|
||||
+------------------+----------+--------------+------------------+-------------------+
|
||||
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
|
||||
+------------------+----------+--------------+------------------+-------------------+
|
||||
| mysql-bin.000002 | 158 | | | |
|
||||
+------------------+----------+--------------+------------------+-------------------+
|
||||
1 row in set (0,00 sec)
|
||||
```
|
||||
|
||||
В более ранних версиях используется команда - `SHOW MASTER STATUS;`
|
||||
|
||||
- <https://habr.com/ru/articles/532216/>
|
||||
- <https://www.k-max.name/linux/replikaciya-mysql-master-slave/>
|
||||
|
||||
## Репликация средствами mysqldump
|
||||
|
||||
### Дамп БД средствами mysqldump
|
||||
|
||||
Для того, чтобы начать репликацию данных, необходимо “подтянуть” слейв до состояния мастера. Для этого, нужно временно заблокировать сам мастер, чтобы сделать слепок актуальных данных.
|
||||
|
||||
```shell
|
||||
FLUSH TABLES WITH READ LOCK;
|
||||
```
|
||||
|
||||
Далее, с помощью mysqldump сделать экспорт данных из базы.
|
||||
|
||||
```shell
|
||||
mysqldump -u root -p sape_test_db > sape_test_db.db
|
||||
```
|
||||
|
||||
После этого, необходимо еще раз выполнить команду `SHOW BINARY LOG STATUS;`, и запомнить или записать значения File и Position. Это, так называемые координаты двоичного журнала. Именно от них далее будет указано стартовать слейву.
|
||||
|
||||
Теперь мастер можно разблокировать.
|
||||
|
||||
```shell
|
||||
UNLOCK TABLES;
|
||||
```
|
||||
|
||||
Мастер настроен, и готов реплицироваться на другие сервера.
|
||||
|
||||
### Настройка репликации mysqldump
|
||||
|
||||
#### Настройка слейва для репликации
|
||||
|
||||
В первую очередь на слейв необходимо загрузить дамп, полученный с мастера
|
||||
|
||||
```shell
|
||||
root@master:~# scp sape_test_db.db slave:/root
|
||||
sape_test_db.db 100% 2169 2.5MB/s 00:00
|
||||
root@master:~#
|
||||
```
|
||||
|
||||
```shell
|
||||
CREATE DATABASE `sape_test_db`;
|
||||
```
|
||||
|
||||
```shell
|
||||
mysql -u root -p sape_test_db < /root/sape_test_db.db
|
||||
```
|
||||
|
||||
Изменить конфигурацию слейва `/etc/mysql/my.cnf` (или в `/etc/mysql/mysql.conf.d/mysqld.cnf`, в зависимости от настроек) в секции `[mysqld]`
|
||||
|
||||
```shell
|
||||
log_bin = mysql-bin # указываем слейву вести собственный двоичный журнал
|
||||
server_id = 2 # указываем идентификатор сервера
|
||||
relay-log = /var/lib/mysql/mysql-relay-bin # указываем расположение журнала ретрансляции
|
||||
relay-log-index = /var/lib/mysql/mysql-relay-bin.index # этот файл служит перечнем всех имеющихся журналов ретрансляции
|
||||
read_only = 1 # переводим слейв в режим “только чтение”
|
||||
```
|
||||
|
||||
После изменения конфигурации необходимо перезагрузить службу
|
||||
|
||||
```shell
|
||||
systemctl restart mysql.service
|
||||
```
|
||||
|
||||
Необходимо указать слейву, какой сервер будет являться для него мастером, и откуда начинать реплицировать данные. Вместо `MASTER_LOG_FILE` и `MASTER_LOG_POS` необходимо подставить значения, полученные из `SHOW BINARY LOG STATUS;` на мастере. Эти параметры вместе называются координатами двоичного журнала.
|
||||
|
||||
Адрес мастера указан в `hosts`, поэтому достаточно указать его имя
|
||||
|
||||
Начиная с MySQL 8.4+: `GET_SOURCE_PUBLIC_KEY` является обязательным параметром, который необходимо добавить - <https://stackoverflow.com/questions/69936021/error-002061-authentication-plugin-caching-sha2-password-reported-error-aut>
|
||||
|
||||
```shell
|
||||
CHANGE REPLICATION SOURCE TO
|
||||
SOURCE_HOST='master',
|
||||
SOURCE_USER='repl_user',
|
||||
SOURCE_PASSWORD='repl_passwd',
|
||||
SOURCE_LOG_FILE='mysql-bin.000002',
|
||||
SOURCE_LOG_POS=158,
|
||||
GET_SOURCE_PUBLIC_KEY=1;
|
||||
```
|
||||
|
||||
В более ранних версиях используется команда - `CHANGE MASTER TO...`
|
||||
|
||||
### Запуск воспроизведения журнала ретрансляции, и проверка статуса репликации mysqldump
|
||||
|
||||
```shell
|
||||
start replica;
|
||||
```
|
||||
|
||||
```shell
|
||||
mysql> show replica status\G
|
||||
*************************** 1. row ***************************
|
||||
Replica_IO_State: Waiting for source to send event
|
||||
Source_Host: master
|
||||
Source_User: repl_user
|
||||
Source_Port: 3306
|
||||
Connect_Retry: 60
|
||||
Source_Log_File: mysql-bin.000002
|
||||
Read_Source_Log_Pos: 158
|
||||
Relay_Log_File: mysql-relay-bin.000002
|
||||
Relay_Log_Pos: 328
|
||||
Relay_Source_Log_File: mysql-bin.000002
|
||||
Replica_IO_Running: Yes
|
||||
Replica_SQL_Running: Yes
|
||||
Replicate_Do_DB:
|
||||
Replicate_Ignore_DB:
|
||||
Replicate_Do_Table:
|
||||
Replicate_Ignore_Table:
|
||||
Replicate_Wild_Do_Table:
|
||||
Replicate_Wild_Ignore_Table:
|
||||
Last_Errno: 0
|
||||
Last_Error:
|
||||
Skip_Counter: 0
|
||||
Exec_Source_Log_Pos: 158
|
||||
Relay_Log_Space: 539
|
||||
Until_Condition: None
|
||||
Until_Log_File:
|
||||
Until_Log_Pos: 0
|
||||
Source_SSL_Allowed: No
|
||||
Source_SSL_CA_File:
|
||||
Source_SSL_CA_Path:
|
||||
Source_SSL_Cert:
|
||||
Source_SSL_Cipher:
|
||||
Source_SSL_Key:
|
||||
Seconds_Behind_Source: 0
|
||||
Source_SSL_Verify_Server_Cert: No
|
||||
Last_IO_Errno: 0
|
||||
Last_IO_Error:
|
||||
Last_SQL_Errno: 0
|
||||
Last_SQL_Error:
|
||||
Replicate_Ignore_Server_Ids:
|
||||
Source_Server_Id: 1
|
||||
Source_UUID: 1337616f-ad64-11ef-ba97-bc2411fcdf96
|
||||
Source_Info_File: mysql.slave_master_info
|
||||
SQL_Delay: 0
|
||||
SQL_Remaining_Delay: NULL
|
||||
Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
|
||||
Source_Retry_Count: 10
|
||||
Source_Bind:
|
||||
Last_IO_Error_Timestamp:
|
||||
Last_SQL_Error_Timestamp:
|
||||
Source_SSL_Crl:
|
||||
Source_SSL_Crlpath:
|
||||
Retrieved_Gtid_Set:
|
||||
Executed_Gtid_Set:
|
||||
Auto_Position: 0
|
||||
Replicate_Rewrite_DB:
|
||||
Channel_Name:
|
||||
Source_TLS_Version:
|
||||
Source_public_key_path:
|
||||
Get_Source_public_key: 0
|
||||
Network_Namespace:
|
||||
1 row in set (0,00 sec)
|
||||
```
|
||||
|
||||
Если все прошло успешно, ваш статус должен иметь аналогичный вид. Ключевые параметры здесь:
|
||||
|
||||
`Replica_IO_State`, `Replica_SQL_Running_State` — состояние IO потока, принимающего двоичный журнал с мастера, и состояние потока, применяющего журнал ретрансляции соотвественно. Только наличие обоих потоков свидетельствует об успешном процессе репликации.
|
||||
`Read_Source_Log_Pos` — последняя позиция, прочитанная из журнала мастера.
|
||||
`Relay_Source_Log_File` — текущий файл журнала мастера.
|
||||
`Seconds_Behind_Source` — отставание слейва от мастера, в секундах.
|
||||
`Last_IO_Error`, `Last_SQL_Error` — ошибки репликации, если они есть.
|
||||
|
||||
### Проверка репликации mysqldump
|
||||
|
||||
На мастере добавить данные и убедиться, что они появились на слейве
|
||||
|
||||
```shell
|
||||
mysql -u root -p
|
||||
use sape_test_db;
|
||||
|
||||
INSERT admin_table(name, surname, city) VALUES ('Nikita', 'Samoilov', 'Sankt-Petersburg');
|
||||
```
|
||||
|
||||
```shell
|
||||
mysql> select * from admin_table;
|
||||
+----+--------+-----------+------------------+
|
||||
| id | name | surname | city |
|
||||
+----+--------+-----------+------------------+
|
||||
| 1 | Andrei | Ahmadulin | Ekaterinburg |
|
||||
| 2 | Kit | Root | Georgia |
|
||||
| 3 | Ilya | Paramonov | Moscow |
|
||||
| 4 | Andrei | Zharkov | Moscow |
|
||||
| 5 | Artem | Dolgiy | Zelenograd |
|
||||
| 6 | Nikita | Samoilov | Sankt-Petersburg |
|
||||
+----+--------+-----------+------------------+
|
||||
6 rows in set (0,00 sec)
|
||||
```
|
||||
|
||||
Проверить данные на слейве
|
||||
|
||||
```shell
|
||||
mysql> select * from admin_table;
|
||||
+----+--------+-----------+------------------+
|
||||
| id | name | surname | city |
|
||||
+----+--------+-----------+------------------+
|
||||
| 1 | Andrei | Ahmadulin | Ekaterinburg |
|
||||
| 2 | Kit | Root | Georgia |
|
||||
| 3 | Ilya | Paramonov | Moscow |
|
||||
| 4 | Andrei | Zharkov | Moscow |
|
||||
| 5 | Artem | Dolgiy | Zelenograd |
|
||||
| 6 | Nikita | Samoilov | Sankt-Petersburg |
|
||||
+----+--------+-----------+------------------+
|
||||
6 rows in set (0,00 sec)
|
||||
```
|
||||
|
||||
[вверх](#mysql)
|
||||
|
||||
***
|
||||
|
||||
## Репликация - Percona XtraBackup
|
||||
|
||||
### Установка Percona XtraBackup
|
||||
|
||||
Установка согласно [документации](https://docs.percona.com/percona-xtrabackup/8.4/installation.html)
|
||||
|
||||
Стоит иметь ввиду, что версии MySQL и Percona XtraBackup должны совпадать, иначе создание резервной копии может завершиться ошибкой или невозможностью восстановления.
|
||||
|
||||
Порядок установки:
|
||||
|
||||
- обновление индекса пакетов и установка вспомогательных утилит
|
||||
|
||||
```shell
|
||||
su -
|
||||
apt update && apt install -y curl gnupg2 lsb-release lz4 zstd
|
||||
```
|
||||
|
||||
- установка репозитория percona с помощью пакета
|
||||
|
||||
```shell
|
||||
curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
|
||||
apt install ./percona-release_latest.generic_all.deb
|
||||
```
|
||||
|
||||
общие репозитории percona будут прописаны после установки пакета
|
||||
|
||||
```shell
|
||||
root@master:~# ls -l /etc/apt/sources.list.d/
|
||||
total 16
|
||||
-rw-r--r-- 1 root root 662 Jan 23 18:30 mysql.list
|
||||
-rw-r--r-- 1 root root 294 Jan 23 18:34 percona-pmm2-client-release.list
|
||||
-rw-r--r-- 1 root root 280 Jan 23 18:34 percona-prel-release.list
|
||||
-rw-r--r-- 1 root root 290 Jan 23 18:34 percona-telemetry-release.list
|
||||
```
|
||||
|
||||
- после установки общих репозиториев необходимо обновить индекс пакетов
|
||||
|
||||
```shell
|
||||
apt update
|
||||
```
|
||||
|
||||
- далее выбирается конкретный релиз, который будет использоваться
|
||||
|
||||
```shell
|
||||
percona-release enable pxb-84-lts
|
||||
```
|
||||
|
||||
в результате выполнения команды будет добавлен репозиторий выбранного релиза
|
||||
|
||||
```shell
|
||||
root@master:~# ls -l /etc/apt/sources.list.d/
|
||||
total 20
|
||||
-rw-r--r-- 1 root root 662 Jan 23 18:30 mysql.list
|
||||
-rw-r--r-- 1 root root 294 Jan 23 18:34 percona-pmm2-client-release.list
|
||||
-rw-r--r-- 1 root root 280 Jan 23 18:34 percona-prel-release.list
|
||||
-rw-r--r-- 1 root root 292 Jan 24 13:20 percona-pxb-84-lts-release.list
|
||||
-rw-r--r-- 1 root root 290 Jan 23 18:34 percona-telemetry-release.list
|
||||
```
|
||||
|
||||
- установка Percona XtraBackup
|
||||
|
||||
```shell
|
||||
apt update && apt install percona-xtrabackup-84
|
||||
```
|
||||
|
||||
```shell
|
||||
root@master:~# xtrabackup --version
|
||||
xtrabackup version 8.4.0-2 based on MySQL server 8.4.0 Linux (x86_64) (revision id: d4373834)
|
||||
```
|
||||
|
||||
### Настройка репликации xtrabackup
|
||||
|
||||
<https://docs.percona.com/percona-xtrabackup/8.4/set-up-replication.html>
|
||||
|
||||
```shell
|
||||
xtrabackup --backup --user=root --password --target-dir=/tmp/dump
|
||||
```
|
||||
|
||||
параметров достаточно много, вот некоторые из них:
|
||||
|
||||
`--backup` - создание резервной копии;
|
||||
`--compress` - сжатие резервной копии;
|
||||
`--stream=xbstream` - собрать файлы резервной копии в единый архив;
|
||||
`--datadir` - директория из которой будут копироваться данные. Если этот параметр не указан, будет использован путь по-умолчанию;
|
||||
`--target-dir` - директория, в которую будет сохранена резервная копия
|
||||
|
||||
также могут использоваться дополнительные параметры, например
|
||||
|
||||
`--slave-info` - указывает, что нужно сохранить информацию о репликации (например, позицию бинарного лога) в резервной копии. Это полезно, если планируется использовать резервную копию для настройки реплики;
|
||||
`--use-memory` - ограничения на использование памяти;
|
||||
`--parallel` - использование нескольких ядер процессора для ускорения процесса создания резервной копии;
|
||||
`--compress-threads` - сжатие в несколько потоков.
|
||||
|
||||
### Подготовка резервной копии перед восстановлением
|
||||
|
||||
```shell
|
||||
xtrabackup --prepare --target-dir=/tmp/dump
|
||||
```
|
||||
|
||||
### Копирование резервной копии на слейв
|
||||
|
||||
```shell
|
||||
rsync -avpP -e ssh /tmp/dump slave:/tmp
|
||||
```
|
||||
|
||||
### Восстановление БД на слейве
|
||||
|
||||
Остановить сервер БД и переместить имеющиеся данные на слейве
|
||||
|
||||
```shell
|
||||
systemctl stop mysql
|
||||
|
||||
mkdir /root/mysql_old && mv /var/lib/mysql/* /root/mysql_old
|
||||
```
|
||||
|
||||
Позднее, если не будет ошибок, перемещённые данные можно будет удалить
|
||||
|
||||
```shell
|
||||
rm -rf /root/mysql_old
|
||||
```
|
||||
|
||||
копирование дампа в целевой каталог слейва
|
||||
|
||||
```shell
|
||||
xtrabackup --move-back --target-dir=/tmp/dump --datadir=/var/lib/mysql
|
||||
```
|
||||
|
||||
установить корректные права
|
||||
|
||||
```shell
|
||||
chown -R mysql:mysql /var/lib/mysql
|
||||
```
|
||||
|
||||
### Настройка репликации
|
||||
|
||||
Изменить конфигурацию слейва `/etc/mysql/my.cnf`
|
||||
**!!! (из других конфиг.файлов конфигурация не применялась) !!!** в секции [mysqld]
|
||||
|
||||
```shell
|
||||
[mysqld]
|
||||
server_id = 2
|
||||
```
|
||||
|
||||
Запустить сервер БД
|
||||
|
||||
```shell
|
||||
systemctl start mysql
|
||||
```
|
||||
|
||||
Убедиться в том, что нужные параметры применились можно запросом в БД
|
||||
|
||||
```shell
|
||||
mysql> SHOW VARIABLES LIKE 'server_id';
|
||||
+---------------+-------+
|
||||
| Variable_name | Value |
|
||||
+---------------+-------+
|
||||
| server_id | 2 |
|
||||
+---------------+-------+
|
||||
1 row in set (0,00 sec)
|
||||
```
|
||||
|
||||
Уточнить значение и позицию `bin-log` в каталоге, в который скопировали резервную копию с мастера, в данном примере - `/tmp/dump`
|
||||
|
||||
```shell
|
||||
root@slave:~# cat /tmp/dump/xtrabackup_binlog_info
|
||||
mysql-bin.000002 158
|
||||
```
|
||||
|
||||
Команда для запуска репликации в консоли mysql
|
||||
|
||||
```shell
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
```shell
|
||||
CHANGE REPLICATION SOURCE TO
|
||||
SOURCE_HOST='master',
|
||||
SOURCE_USER='repl_user',
|
||||
SOURCE_PASSWORD='repl_passwd',
|
||||
SOURCE_LOG_FILE='mysql-bin.000002',
|
||||
SOURCE_LOG_POS=158,
|
||||
GET_SOURCE_PUBLIC_KEY=1;
|
||||
```
|
||||
|
||||
```shell
|
||||
START REPLICA;
|
||||
```
|
||||
|
||||
```shell
|
||||
SHOW REPLICA STATUS\G
|
||||
```
|
||||
|
||||
на что обратить внимание в выводе:
|
||||
|
||||
```shell
|
||||
mysql> SHOW REPLICA STATUS\G
|
||||
*************************** 1. row ***************************
|
||||
Replica_IO_State: Waiting for source to send event
|
||||
Source_Host: master
|
||||
Source_User: repl_user
|
||||
...
|
||||
Replica_IO_Running: Yes
|
||||
Replica_SQL_Running: Yes
|
||||
...
|
||||
Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
|
||||
...
|
||||
```
|
||||
|
||||
### Проверка репликации xtrabackup
|
||||
|
||||
На мастере добавить данные и убедиться, что они появились на слейве
|
||||
|
||||
```shell
|
||||
mysql -u root -p
|
||||
use sape_test_db;
|
||||
|
||||
INSERT admin_table(name, surname, city) VALUES ('Nikita', 'Samoilov', 'Sankt-Petersburg');
|
||||
```
|
||||
|
||||
```shell
|
||||
mysql> select * from admin_table;
|
||||
+----+--------+-----------+------------------+
|
||||
| id | name | surname | city |
|
||||
+----+--------+-----------+------------------+
|
||||
| 1 | Andrei | Ahmadulin | Ekaterinburg |
|
||||
| 2 | Kit | Root | Georgia |
|
||||
| 3 | Ilya | Paramonov | Moscow |
|
||||
| 4 | Andrei | Zharkov | Moscow |
|
||||
| 5 | Artem | Dolgiy | Zelenograd |
|
||||
| 6 | Nikita | Samoilov | Sankt-Petersburg |
|
||||
+----+--------+-----------+------------------+
|
||||
6 rows in set (0,00 sec)
|
||||
```
|
||||
|
||||
Проверить данные на слейве
|
||||
|
||||
```shell
|
||||
mysql> select * from admin_table;
|
||||
+----+--------+-----------+------------------+
|
||||
| id | name | surname | city |
|
||||
+----+--------+-----------+------------------+
|
||||
| 1 | Andrei | Ahmadulin | Ekaterinburg |
|
||||
| 2 | Kit | Root | Georgia |
|
||||
| 3 | Ilya | Paramonov | Moscow |
|
||||
| 4 | Andrei | Zharkov | Moscow |
|
||||
| 5 | Artem | Dolgiy | Zelenograd |
|
||||
| 6 | Nikita | Samoilov | Sankt-Petersburg |
|
||||
+----+--------+-----------+------------------+
|
||||
6 rows in set (0,00 sec)
|
||||
```
|
||||
|
||||
[вверх](#mysql)
|
||||
389
mysql_5.7_xtrabackup.md
Normal file
389
mysql_5.7_xtrabackup.md
Normal file
@@ -0,0 +1,389 @@
|
||||
# MySQL 5.7 на Debian 12
|
||||
|
||||
Описан процесс установки MySQL 5.7 и настройка репликации с помощью Percona xtrabackup мастер -> слейв
|
||||
|
||||
- [MySQL 5.7 на Debian 12](#mysql-57-на-debian-12)
|
||||
- [Установка MySQL 5.7 на Debian 12](#установка-mysql-57-на-debian-12)
|
||||
- [xtrabackup на mysql 5.7](#xtrabackup-на-mysql-57)
|
||||
- [Установка Percona xtrabackup](#установка-percona-xtrabackup)
|
||||
- [Создание тестовой БД и наполнение данными](#создание-тестовой-бд-и-наполнение-данными)
|
||||
- [Подключение к СУБД](#подключение-к-субд)
|
||||
- [Создание базы данных](#создание-базы-данных)
|
||||
- [Переключение на созданную базу данных](#переключение-на-созданную-базу-данных)
|
||||
- [Создание таблицы в базе данных](#создание-таблицы-в-базе-данных)
|
||||
- [Добавление записей в таблицу](#добавление-записей-в-таблицу)
|
||||
- [Выборка из таблицы](#выборка-из-таблицы)
|
||||
- [Репликация - общие настройки](#репликация---общие-настройки)
|
||||
- [Пользователь для выполнения задач репликации](#пользователь-для-выполнения-задач-репликации)
|
||||
- [Настройка мастера для репликации](#настройка-мастера-для-репликации)
|
||||
- [Настройка репликации xtrabackup](#настройка-репликации-xtrabackup)
|
||||
- [Создание резервной копии](#создание-резервной-копии)
|
||||
- [Подготовка резервной копии перед восстановлением](#подготовка-резервной-копии-перед-восстановлением)
|
||||
- [Копирование резервной копии на слейв](#копирование-резервной-копии-на-слейв)
|
||||
- [Восстановление БД на слейве](#восстановление-бд-на-слейве)
|
||||
- [Настройка репликации](#настройка-репликации)
|
||||
- [Старт репликации](#старт-репликации)
|
||||
- [Проверка репликации](#проверка-репликации)
|
||||
|
||||
***
|
||||
|
||||
## Установка MySQL 5.7 на Debian 12
|
||||
|
||||
<https://downloads.mysql.com/archives/community/>
|
||||
|
||||
Выбираем версию 5.7.42 для Debian
|
||||
|
||||
```shell
|
||||
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.42-1debian10_amd64.deb-bundle.tar
|
||||
tar -xvf mysql-server_5.7.42-1debian10_amd64.deb-bundle.tar
|
||||
|
||||
apt install ./mysql-community-client_5.7.42-1debian10_amd64.deb
|
||||
apt install ./mysql-client_5.7.42-1debian10_amd64.deb
|
||||
apt install ./mysql-community-server_5.7.42-1debian10_amd64.deb
|
||||
```
|
||||
|
||||
## xtrabackup на mysql 5.7
|
||||
|
||||
### Установка Percona xtrabackup
|
||||
|
||||
<https://docs.percona.com/percona-xtrabackup/8.4/apt-repo.html>
|
||||
|
||||
```shell
|
||||
apt update && apt install curl
|
||||
curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
|
||||
apt install gnupg2 lsb-release ./percona-release_latest.generic_all.deb
|
||||
apt update
|
||||
|
||||
percona-release enable pxb-24
|
||||
apt update
|
||||
apt install percona-xtrabackup-24
|
||||
```
|
||||
|
||||
```shell
|
||||
xtrabackup --version
|
||||
```
|
||||
|
||||
## Создание тестовой БД и наполнение данными
|
||||
|
||||
### Подключение к СУБД
|
||||
|
||||
```shell
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
### Создание базы данных
|
||||
|
||||
```shell
|
||||
CREATE DATABASE IF NOT EXISTS sape_test_db;
|
||||
```
|
||||
|
||||
По ошибке была создана БД с именем - `sape_test_db.db`
|
||||
|
||||
При её удалении полачал ошибку
|
||||
|
||||
```shell
|
||||
mysql> drop database 'sape_test_db.db';
|
||||
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''sape_test_db.db'' at line 1
|
||||
```
|
||||
|
||||
Поиск причин привёл - <https://stackoverflow.com/questions/16135987/error-on-drop-default-database-error>
|
||||
|
||||
при использовании в названии зарезервированных слов, следует заключать имя БД в косые ковычки `
|
||||
|
||||
```shell
|
||||
mysql> drop database `sape_test_db.db`;
|
||||
Query OK, 0 rows affected (0,17 sec)
|
||||
```
|
||||
|
||||
### Переключение на созданную базу данных
|
||||
|
||||
```shell
|
||||
USE sape_test_db;
|
||||
```
|
||||
|
||||
### Создание таблицы в базе данных
|
||||
|
||||
таблица будет содержать три столбца: id, name, surname, address. Первичным ключом будет id. В качестве движка явно укажем InnoDB.
|
||||
|
||||
```shell
|
||||
CREATE TABLE admin_table
|
||||
( id int NOT NULL AUTO_INCREMENT,
|
||||
name char(20) NOT NULL,
|
||||
surname char(20) NOT NULL,
|
||||
city char(20) NULL,
|
||||
PRIMARY KEY (id) )
|
||||
ENGINE=InnoDB;
|
||||
```
|
||||
|
||||
для удаления таблицы
|
||||
|
||||
```shell
|
||||
DROP TABLE admin_table;
|
||||
```
|
||||
|
||||
### Добавление записей в таблицу
|
||||
|
||||
```shell
|
||||
INSERT admin_table(name, surname, city) VALUES ('Andrei', 'Ahmadulin', 'Ekaterinburg');
|
||||
INSERT admin_table(name, surname, city) VALUES ('Ilya', 'Paramonov', 'Moscow');
|
||||
INSERT admin_table(name, surname, city) VALUES ('Andrei', 'Zharkov', 'Moscow');
|
||||
INSERT admin_table(name, surname, city) VALUES ('Artem', 'Dolgiy', 'Zelenograd');
|
||||
```
|
||||
|
||||
### Выборка из таблицы
|
||||
|
||||
```shell
|
||||
SELECT * FROM admin_table;
|
||||
```
|
||||
|
||||
## Репликация - общие настройки
|
||||
|
||||
Эти настройки выполняются вне зависимости от выбранного способа репликации
|
||||
|
||||
### Пользователь для выполнения задач репликации
|
||||
|
||||
Будет создан пользователь `repl_user` с паролем `repl_passwd`
|
||||
|
||||
```shell
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
```shell
|
||||
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_passwd';
|
||||
```
|
||||
|
||||
Если возникнет ошибка - `ERROR 1819 (HY000): Your password does not satisfy the current policy requirements` - <https://stackoverflow.com/questions/43094726/your-password-does-not-satisfy-the-current-policy-requirements>
|
||||
|
||||
кратко - достаточно изменить политику паролей
|
||||
|
||||
```shell
|
||||
mysql> SHOW VARIABLES LIKE 'validate_password%';
|
||||
+-------------------------------------------------+--------+
|
||||
| Variable_name | Value |
|
||||
+-------------------------------------------------+--------+
|
||||
| validate_password.changed_characters_percentage | 0 |
|
||||
| validate_password.check_user_name | ON |
|
||||
| validate_password.dictionary_file | |
|
||||
| validate_password.length | 8 |
|
||||
| validate_password.mixed_case_count | 1 |
|
||||
| validate_password.number_count | 1 |
|
||||
| validate_password.policy | MEDIUM |
|
||||
| validate_password.special_char_count | 1 |
|
||||
+-------------------------------------------------+--------+
|
||||
8 rows in set (0,03 sec)
|
||||
|
||||
mysql> SET GLOBAL validate_password.policy = LOW;
|
||||
Query OK, 0 rows affected (0,00 sec)
|
||||
|
||||
mysql>
|
||||
```
|
||||
|
||||
Теперь пользователя можно будет создать с простым паролем - `'repl_passwd'`
|
||||
|
||||
Назначение привилегий для пользователя
|
||||
|
||||
```shell
|
||||
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' WITH GRANT OPTION;
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
|
||||
### Настройка мастера для репликации
|
||||
|
||||
В файл `/etc/mysql/conf.d/mysqld.cnf`, в секции `[mysqld]` необходимо добавить следующие параметры:
|
||||
|
||||
```shell
|
||||
[mysqld]
|
||||
server_id = 1
|
||||
log_bin = mysql-bin
|
||||
```
|
||||
|
||||
После изменения конфигурации необходимо перезагрузить СУБД
|
||||
|
||||
```shell
|
||||
systemctl restart mysql.service
|
||||
```
|
||||
|
||||
Убедиться в том, что нужные параметры применились можно запросом в БД
|
||||
|
||||
```shell
|
||||
mysql> SHOW VARIABLES LIKE 'server_id';
|
||||
+---------------+-------+
|
||||
| Variable_name | Value |
|
||||
+---------------+-------+
|
||||
| server_id | 1 |
|
||||
+---------------+-------+
|
||||
1 row in set (0,00 sec)
|
||||
```
|
||||
|
||||
```shell
|
||||
mysql> SHOW VARIABLES LIKE 'log_bin';
|
||||
+---------------+-------+
|
||||
| Variable_name | Value |
|
||||
+---------------+-------+
|
||||
| log_bin | ON |
|
||||
+---------------+-------+
|
||||
1 row in set (0,00 sec)
|
||||
```
|
||||
|
||||
## Настройка репликации xtrabackup
|
||||
|
||||
<https://docs.percona.com/percona-xtrabackup/2.4/howtos/setting_up_replication.html>
|
||||
|
||||
### Создание резервной копии
|
||||
|
||||
```shell
|
||||
xtrabackup --backup --user=root --password --target-dir=/tmp/dump
|
||||
```
|
||||
|
||||
## Подготовка резервной копии перед восстановлением
|
||||
|
||||
```shell
|
||||
xtrabackup --prepare --target-dir=/tmp/dump
|
||||
```
|
||||
|
||||
## Копирование резервной копии на слейв
|
||||
|
||||
```shell
|
||||
rsync -avpP -e ssh /tmp/dump slave:/tmp
|
||||
```
|
||||
|
||||
## Восстановление БД на слейве
|
||||
|
||||
Остановить сервер БД и переместить имеющиеся данные на слейве
|
||||
|
||||
```shell
|
||||
systemctl stop mysql
|
||||
|
||||
mkdir /root/mysql_old && mv /var/lib/mysql/* /root/mysql_old
|
||||
```
|
||||
|
||||
Позднее, если не будет ошибок, перемещённые данные можно будет удалить
|
||||
|
||||
```shell
|
||||
rm -rf /root/mysql_old
|
||||
```
|
||||
|
||||
копирование дампа в целевой каталог слейва
|
||||
|
||||
```shell
|
||||
xtrabackup --move-back --target-dir=/tmp/dump --datadir=/var/lib/mysql
|
||||
```
|
||||
|
||||
установить корректные права
|
||||
|
||||
```shell
|
||||
chown -R mysql:mysql /var/lib/mysql
|
||||
```
|
||||
|
||||
## Настройка репликации
|
||||
|
||||
Изменить конфигурацию слейва `/etc/mysql/conf.d/mysqld.cnf`, в секции `[mysqld]`
|
||||
|
||||
```shell
|
||||
[mysqld]
|
||||
server_id = 2
|
||||
```
|
||||
|
||||
Запустить сервер БД
|
||||
|
||||
```shell
|
||||
systemctl start mysql
|
||||
```
|
||||
|
||||
Убедиться в том, что нужные параметры применились можно запросом в БД
|
||||
|
||||
```shell
|
||||
mysql> SHOW VARIABLES LIKE 'server_id';
|
||||
+---------------+-------+
|
||||
| Variable_name | Value |
|
||||
+---------------+-------+
|
||||
| server_id | 1 |
|
||||
+---------------+-------+
|
||||
1 row in set (0,00 sec)
|
||||
```
|
||||
|
||||
### Старт репликации
|
||||
|
||||
В скопированном дампе БД с мастера - `/tmp/dump` уточнить название бинарного лога и позицию
|
||||
|
||||
```shell
|
||||
root@slave:~# cat /tmp/dump/xtrabackup_binlog_info
|
||||
mysql-bin.000001 154
|
||||
```
|
||||
|
||||
Команда для запуска репликации в консоли mysql
|
||||
|
||||
```shell
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
```sql
|
||||
CHANGE MASTER TO
|
||||
MASTER_HOST='master',
|
||||
MASTER_USER='repl_user',
|
||||
MASTER_PASSWORD='repl_passwd',
|
||||
MASTER_LOG_FILE='mysql-bin.000001',
|
||||
MASTER_LOG_POS=154;
|
||||
```
|
||||
|
||||
```shell
|
||||
START SLAVE;
|
||||
```
|
||||
|
||||
```shell
|
||||
SHOW SLAVE STATUS \G
|
||||
```
|
||||
|
||||
Стоит обратить внимание не значения
|
||||
|
||||
```shell
|
||||
Slave_IO_Running: Yes
|
||||
Slave_SQL_Running: Yes
|
||||
```
|
||||
|
||||
## Проверка репликации
|
||||
|
||||
На мастере добавить данные и убедиться, что они появились на слейве
|
||||
|
||||
```shell
|
||||
mysql -u root -p
|
||||
use sape_test_db;
|
||||
|
||||
INSERT admin_table(name, surname, city) VALUES ('Nikita', 'Samoilov', 'Sankt-Petersburg');
|
||||
```
|
||||
|
||||
```shell
|
||||
mysql> select * from admin_table;
|
||||
+----+--------+-----------+------------------+
|
||||
| id | name | surname | city |
|
||||
+----+--------+-----------+------------------+
|
||||
| 1 | Andrei | Ahmadulin | Ekaterinburg |
|
||||
| 2 | Kit | Root | Georgia |
|
||||
| 3 | Ilya | Paramonov | Moscow |
|
||||
| 4 | Andrei | Zharkov | Moscow |
|
||||
| 5 | Artem | Dolgiy | Zelenograd |
|
||||
| 6 | Nikita | Samoilov | Sankt-Petersburg |
|
||||
+----+--------+-----------+------------------+
|
||||
6 rows in set (0,00 sec)
|
||||
```
|
||||
|
||||
Проверить данные на слейве
|
||||
|
||||
```shell
|
||||
mysql -u root -p
|
||||
use sape_test_db;
|
||||
```
|
||||
|
||||
```shell
|
||||
mysql> select * from admin_table;
|
||||
+----+--------+-----------+------------------+
|
||||
| id | name | surname | city |
|
||||
+----+--------+-----------+------------------+
|
||||
| 1 | Andrei | Ahmadulin | Ekaterinburg |
|
||||
| 2 | Ilya | Paramonov | Moscow |
|
||||
| 3 | Andrei | Zharkov | Moscow |
|
||||
| 4 | Artem | Dolgiy | Zelenograd |
|
||||
| 5 | Nikita | Samoilov | Sankt-Petersburg |
|
||||
+----+--------+-----------+------------------+
|
||||
5 rows in set (0,00 sec)
|
||||
```
|
||||
75
mysql_notes.md
Normal file
75
mysql_notes.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# Заметки к книге Обеспечение высокой доступности систем на основе MySQL
|
||||
|
||||
Применяя репликацию для масштабирования, важно знать, что репликация MySQL является асинхронной. То есть, сначала транзакции фиксируются на главном сервере, а затем реплицируются на подчиненный сервер и там исполняются. Это означает, что при непрерывной репликации подчиненный сервер будет «отставать» от главного.
|
||||
|
||||
## Установка MySQL
|
||||
|
||||
Подробнее описано здесь - https://git.da2001.ru/da2001/notes/src/branch/master/mysql.md
|
||||
|
||||
```bash
|
||||
su -
|
||||
wget https://dev.mysql.com/get/mysql-apt-config_0.8.36-1_all.deb
|
||||
apt install -y ./mysql-apt-config_0.8.36-1_all.deb
|
||||
|
||||
dpkg-reconfigure mysql-apt-config
|
||||
|
||||
apt update
|
||||
apt install mysql-server
|
||||
```
|
||||
|
||||
## Репликация - первые шаги
|
||||
|
||||
### Настройка главного сервера
|
||||
|
||||
Для работы репликации необходим двоичный жернал и уникальный идентификатор сервера.
|
||||
|
||||
```bash
|
||||
cat my.cnf
|
||||
...
|
||||
log-bin = master-bin
|
||||
log-bin-index = master-bin.index
|
||||
server-id = 1
|
||||
```
|
||||
|
||||
- `master-bin` - базовое имя для давоичного журнала, журналов может быть несколько
|
||||
- `master-bin.index` - имя индексного файла двоичного журнала, в котором содержится список всех файлов двоичного журнала
|
||||
|
||||
Для того чтобы подключить подчиненный сервер, на главном сервере должен быть пользователь с особыми полномочиями репликации.
|
||||
|
||||
Создание пользователя репликации на главном сервере (в книге используется устаревший вариант, предлагаю современный)
|
||||
|
||||
```bash
|
||||
master> CREATE USER 'repl_user'@'%' IDENTIFIED BY 'strong_password';
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
master> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' WITH GRANT OPTION;
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
```
|
||||
|
||||
### Настройка подчинённого сервера
|
||||
|
||||
```bash
|
||||
cat my.cnf
|
||||
...
|
||||
relay-log = slave-relay-bin
|
||||
relay-log-index = slave-relay-bin.index
|
||||
server-id = 2
|
||||
```
|
||||
|
||||
### Подключение подчинённого сервера к главному
|
||||
|
||||
В книге используется устаревший вариант, предлагаю современный
|
||||
|
||||
```bash
|
||||
slave> CHANGE REPLICATION SOURCE TO
|
||||
SOURCE_HOST = 'master-1',
|
||||
SOURCE_PORT = 3306,
|
||||
SOURCE_USER = 'repl_user',
|
||||
SOURCE_PASSWORD = 'strong_password',
|
||||
SOURCE_LOG_FILE = 'mysql-bin.000002', # обязательно!
|
||||
SOURCE_LOG_POS = 158, # обязательно!
|
||||
SOURCE_CONNECTION_AUTO_FAILOVER = 1, # опционально, для асинхронной реплики
|
||||
GET_SOURCE_PUBLIC_KEY = 1; # для MySQL 8.0 с sha2
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
slave> START REPLICA;
|
||||
Query OK, 0 rows affected (0.15 sec)
|
||||
```
|
||||
111
orangepi5plus_backup.md
Normal file
111
orangepi5plus_backup.md
Normal file
@@ -0,0 +1,111 @@
|
||||
# Описание процесса создания резервной копии eMMC OrangePi 5 Plus
|
||||
|
||||
В OrangePi 5 Plus нельзя изменить приоритет загрузки, в первую очередь загрузка происходит с SD карты, если загрузчик на SD карте не находится, производится попытка загрузки с eMMC и т.д. Таким образом, для того, чтобы создать образ диска eMMC достаточно загрузиться с SD карты и средствами команды `dd` выполнить создание образа диска eMMC.
|
||||
|
||||
1. Обеспечить подключение к хранилищу резервных копий по SSH на основе ключа пользователю root, т.к. скрипт будет выполняться от его имени
|
||||
|
||||
```bash
|
||||
root@opisd:~# ssh-keygen
|
||||
root@opisd:~# ssh-copy-id da2001@nas.dav.lan
|
||||
```
|
||||
|
||||
1. Подготовить скрипт, который выполнит создание образа eMMC и передаст его по SSH в сетевое хранилище
|
||||
|
||||
```bash
|
||||
da2001@opisd:~$ sudo vim /opt/backup_opi/opi_backup.sh
|
||||
```
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
###################################################################################################
|
||||
|
||||
# Скрипт создаёт образ eMMC OrangePI 5 Plus и отправляет его на удалённый сервер по SSH,
|
||||
# при этом на удалённом сервере происходит сжатие образа для экономии места.
|
||||
# Сжатие происходит на удалённом сервере, чтобы минимизировать операции записи на Flash память,
|
||||
# с которой произведена загрузка OrangePI.
|
||||
|
||||
###################################################################################################
|
||||
|
||||
# Убедиться, что запуск происходит от root
|
||||
if [ "$EUID" -ne 0 ]
|
||||
then echo "Скрипт необходимо запускать от администратора"
|
||||
exit
|
||||
fi
|
||||
|
||||
# Удалённый сервер. Необходимо предварительно обеспечить доступ по ключам - ssh-keygen && ssh-sopy-id user@server
|
||||
server=da2001@nas.dav.lan
|
||||
|
||||
# Путь сохранения на удалённом сервре
|
||||
remote_path=/mnt/main/data/Backup/opi1
|
||||
|
||||
# Необходимо синхронизировать время
|
||||
chronyc -a makestep
|
||||
|
||||
# Имя образа
|
||||
name=$(echo $(date +%Y-%m-%d)_${HOSTNAME}_image.img.gz | sed 's/-emmc//')
|
||||
|
||||
# Имя диска, над которым будем работать. SD в RPI называется mmcblk0
|
||||
disk=/dev/mmcblk1
|
||||
|
||||
# запишем в переменную последний сектор последнего раздела диска
|
||||
last_sector=$(fdisk -l -o end $disk | tail -1)
|
||||
|
||||
# Считаем, что размер сектора составляет 512 Байт, тогда необходимо сохранить ($last_sector+1)*512 Байт.
|
||||
# Или ($last_sector+1)*512/1024/1024 Мб.
|
||||
count=$(($(($last_sector+1))*512/1024/1024))
|
||||
|
||||
# Команда создания образа
|
||||
dd if=$disk bs=1M count=$count conv=noerror,sync | ssh $server "gzip -c > $remote_path/$name 2>> $remote_path/lastlog" && \
|
||||
ssh $server "echo `date +"%A, %d %B %Y"` - Образ создан успешно >> $remote_path/log" || \
|
||||
ssh $server "echo `date +"%A, %d %B %Y"` - При создании образа произошла ошибка >> $remote_path/log"
|
||||
|
||||
# Необходимо хранить только последние 20 строк в файле log
|
||||
ssh $server 'echo "$(tail -5 $remote_path/log)" > $remote_path/log'
|
||||
|
||||
# Необходимо хранить только последние 3 резервные копии
|
||||
count_copies=3
|
||||
ssh $server "find $remote_path -type f -name '*_image.img.gz' -printf '%T@ %p\n' | sort -nr | cut -d' ' -f 2- | tail -n +$(($count_copies+1)) | xargs rm -f --"
|
||||
|
||||
# Перезагрузка
|
||||
/usr/sbin/reboot
|
||||
|
||||
```
|
||||
|
||||
Добавить права на выполнение
|
||||
|
||||
```bash
|
||||
da2001@opisd:~$ sudo chmod +x /opt/backup_opi/opi_backup.sh
|
||||
```
|
||||
|
||||
**!!Актуализировать!!**
|
||||
|
||||
7. Обеспечить выполнение скрипта при загрузке с SD. Сервис systemd
|
||||
|
||||
Для этого вам нужно создать скрипт запуска systemd и поместить его в каталог `/etc/systemd/system/`.
|
||||
|
||||
```bash
|
||||
da2001@opisd:~$ sudo vim /etc/systemd/system/rpi_backup.service
|
||||
```
|
||||
|
||||
```bash
|
||||
da2001@opisd:~$ cat /etc/systemd/system/rpi_backup.service
|
||||
[Unit]
|
||||
Description=Run a Backup Script at Startup
|
||||
After=default.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/opt/backup_rpi/rpi_backup.sh
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
```
|
||||
|
||||
Перечитать скрипты и активировать созданный сервис
|
||||
|
||||
```bash
|
||||
pi@host-usb:~ $ sudo systemctl daemon-reload
|
||||
pi@host-usb:~ $ sudo systemctl enable rpi_backup.service
|
||||
```
|
||||
|
||||
***
|
||||
79
orangepi5plus_os_to_emmc.md
Normal file
79
orangepi5plus_os_to_emmc.md
Normal file
@@ -0,0 +1,79 @@
|
||||
# Описание процесса установки ОС на eMMC одноплатного компьютера Orange PI 5 Plus
|
||||
|
||||
Дано:
|
||||
|
||||
- плата Orange PI 5 Plus
|
||||
- SD-карта 16 Гб
|
||||
- модуль eMMC установлен в плату
|
||||
- SSD накопитель для данных установлен в плату
|
||||
|
||||
## Выбор ОС
|
||||
|
||||
Для Orange PI 5 Plus доступно несколько вариантов ОС:
|
||||
|
||||
- от производителя платы - [Shenzhen Xunlong Software](http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-5-plus-32GB.html)
|
||||
- от сообщества [Armbian](https://www.armbian.com/orange-pi-5-plus/)
|
||||
- от энтузиаста [Joshua-Riek/ubuntu-rockchip](https://github.com/Joshua-Riek/ubuntu-rockchip)
|
||||
|
||||
Образы от Joshua-Riek поддерживают аппаратное 3D ускорение и используют стандартные репозитории Ubuntu. В примере будет использован образ на основе Ubuntu 24.04 Desktop с рабочим столом Gnome с Wayland.
|
||||
|
||||
## Запись образа на SD-карту
|
||||
|
||||
- Скачать образ - <https://joshua-riek.github.io/ubuntu-rockchip-download/boards/orangepi-5-plus.html>
|
||||
- Записать образ на SD-карту с помощью утилит типа [balenaEtcher](https://etcher.balena.io/)
|
||||
- Расширить раздел на SD-карте и скопировать туда файл образа в формате `.img`. Таким образом получится на SD-карту образ будет записан дважды: сначала с помощью утилиты [balenaEtcher](https://etcher.balena.io/), а затем на карту скопирован файл образа. Это необходимо для копирования образа на eMMC
|
||||
- Установить SD-карту в плату
|
||||
|
||||
## Запись образа на eMMC
|
||||
|
||||
После включения Orange PI 5 Plus с установленной SD-картой, загрузка будет выполнена с SD-карты.
|
||||
|
||||
При первой загрузке происходит предварительная настройка ОС - установка локали, создание пользователи и т.д.
|
||||
|
||||
Образ ОС хранится в виде `.img` на SD-карте, его необходимо скопировать на eMMC.
|
||||
|
||||
Необходимо определить наименование eMMC в системе, в моём случае это `mmcblk0`
|
||||
|
||||
```shell
|
||||
da2001@opi:~$ lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
loop0 7:0 0 69,2M 1 loop /snap/core22/1624
|
||||
loop1 7:1 0 94,4M 1 loop /snap/lxd/30134
|
||||
loop2 7:2 0 33,7M 1 loop /snap/snapd/21761
|
||||
mtdblock0 31:0 0 16M 0 disk
|
||||
mmcblk1 179:0 0 14,8G 0 disk
|
||||
└─mmcblk1p1 179:1 0 14,8G 0 part /
|
||||
mmcblk0 179:32 0 233G 0 disk
|
||||
mmcblk0boot0 179:64 0 4M 1 disk
|
||||
mmcblk0boot1 179:96 0 4M 1 disk
|
||||
nvme0n1 259:0 0 953,9G 0 disk
|
||||
├─nvme0n1p1 259:1 0 500G 0 part
|
||||
├─nvme0n1p2 259:2 0 300G 0 part
|
||||
└─nvme0n1p3 259:3 0 153,9G 0 part
|
||||
```
|
||||
|
||||
Копирование образа - `dd if=ubuntu-24.04-preinstalled-desktop-arm64-orangepi-5-plus.img of=/dev/mmcblk0 bs=1M status=progress`
|
||||
|
||||
```shell
|
||||
da2001@opi:~$ sudo -i
|
||||
[sudo] password for da2001:
|
||||
root@opi:~# ls
|
||||
snap ubuntu-24.04-preinstalled-desktop-arm64-orangepi-5-plus.img
|
||||
root@opi:~# dd if=ubuntu-24.04-preinstalled-desktop-arm64-orangepi-5-plus.img of=/dev/mmcblk0 bs=1M status=progress
|
||||
7388266496 bytes (7,4 GB, 6,9 GiB) copied, 108 s, 68,4 MB/s
|
||||
7097+0 records in
|
||||
7097+0 records out
|
||||
7441743872 bytes (7,4 GB, 6,9 GiB) copied, 110,743 s, 67,2 MB/s
|
||||
root@opi:~# sync
|
||||
root@opi:~#
|
||||
```
|
||||
|
||||
## Завершение
|
||||
|
||||
После копирования образа на eMMC, компьютер необходимо выключить и извлечь SD-карту.
|
||||
|
||||
Следующая загрузка будет уже с eMMC.
|
||||
|
||||
***
|
||||
|
||||
<https://habr.com/ru/companies/timeweb/articles/861844/>
|
||||
183
orangepi_pve.md
Normal file
183
orangepi_pve.md
Normal file
@@ -0,0 +1,183 @@
|
||||
# Настройка OrangePI 5 Plus Debian
|
||||
|
||||
## Установка Proxmox на OrangePI 5 Plus Debian
|
||||
|
||||
https://github.com/jiangcuo/Proxmox-Arm64/wiki/Install-Proxmox-VE-on-Debian-bullseye
|
||||
|
||||
1. Указать внешний IP в hosts
|
||||
|
||||
```bash
|
||||
da2001@opve:~$ cat /etc/hosts
|
||||
127.0.0.1 localhost
|
||||
192.168.13.14 opve.dav.lan opve
|
||||
|
||||
|
||||
::1 localhost orangepi5plus ip6-localhost ip6-loopback
|
||||
fe00::0 ip6-localnet
|
||||
ff00::0 ip6-mcastprefix
|
||||
ff02::1 ip6-allnodes
|
||||
ff02::2 ip6-allrouters
|
||||
```
|
||||
|
||||
1. Добавить репозиторий Proxmox VE
|
||||
|
||||
```bash
|
||||
echo "deb https://global.mirrors.apqa.cn/proxmox/debian/pve bookworm port" > /etc/apt/sources.list.d/pveport.list
|
||||
```
|
||||
|
||||
2. Добавить ключ репозитория
|
||||
|
||||
```bash
|
||||
curl https://global.mirrors.apqa.cn/proxmox/debian/pveport.gpg -o /etc/apt/trusted.gpg.d/pveport.gpg
|
||||
```
|
||||
|
||||
3. Обновить индексы пакетов
|
||||
|
||||
```bash
|
||||
apt update && apt dist-upgrade -y
|
||||
```
|
||||
|
||||
4. Установить необходимые пакеты
|
||||
|
||||
```bash
|
||||
apt install ifupdown2
|
||||
apt install proxmox-ve postfix open-iscsi
|
||||
```
|
||||
|
||||
5. Перезагрузить устройство
|
||||
|
||||
```bash
|
||||
reboot
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
## Debian 12 преднастроенный
|
||||
|
||||
```bash
|
||||
su -
|
||||
|
||||
adduser da2001
|
||||
|
||||
usermod -aG 5,6,20,27,29,44,46,60,100,101,105,109,111,996,999 da2001
|
||||
|
||||
hostnamectl set-hostname opi.dav.lan
|
||||
|
||||
tee /etc/hosts<<EOF
|
||||
192.168.13.14 opi.dav.lan opi
|
||||
EOF
|
||||
|
||||
apt update && apt dist-upgrade -y
|
||||
apt autoremove -y
|
||||
|
||||
orangepi-config
|
||||
|
||||
```
|
||||
|
||||
## Docker
|
||||
|
||||
Если не получилось настроить Proxmox, можно настроить Docker
|
||||
|
||||
### Сеть MacVLAN
|
||||
|
||||
```bash
|
||||
docker network create -d macvlan \
|
||||
--subnet=192.168.13.0/24 \
|
||||
--gateway=192.168.13.1 \
|
||||
-o parent=enP4p65s0 \
|
||||
macvlan-net
|
||||
```
|
||||
|
||||
где
|
||||
|
||||
`enP4p65s0` - сетевой интерфейс, подключенный к сети
|
||||
|
||||
**Узел docker не сможет взаимодействовать с созданной сетью macvlan, чтобы это изменить, необходимо создать интерфейс macvlan на узле со своим IP и маршрутом в сеть docker macvlan. Другие узлы сети без проблем взаимодействуют с клиентами сети docker macvlan, а это было целью. Таким образом, создавать дополнительный интерфейс и маршрут на узле не обязательно**
|
||||
|
||||
### Portainer
|
||||
|
||||
```bash
|
||||
docker volume create portainer_data
|
||||
|
||||
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
|
||||
```
|
||||
|
||||
### Adguard Home
|
||||
|
||||
```bash
|
||||
cd /home/da2001
|
||||
mkdir /home/da2001/adguardhome && cd /home/da2001/adguardhome
|
||||
|
||||
docker run --name adguardhome\
|
||||
--restart unless-stopped\
|
||||
--network=macvlan-net \
|
||||
--ip=192.168.13.28 \
|
||||
--mac-address=02:42:ac:11:00:02 \
|
||||
-v /home/da2001/adguardhome/work:/opt/adguardhome/work\
|
||||
-v /home/da2001/adguardhome/conf:/opt/adguardhome/conf\
|
||||
-p 53:53/tcp -p 53:53/udp\
|
||||
-p 67:67/udp -p 68:68/udp\
|
||||
-p 80:80/tcp -p 443:443/tcp -p 443:443/udp -p 3000:3000/tcp\
|
||||
-p 853:853/tcp\
|
||||
-p 784:784/udp -p 853:853/udp -p 8853:8853/udp\
|
||||
-p 5443:5443/tcp -p 5443:5443/udp\
|
||||
-d adguard/adguardhome
|
||||
```
|
||||
|
||||
### BIND DNS
|
||||
|
||||
```bash
|
||||
cd /home/da2001
|
||||
mkdir /home/da2001/bind
|
||||
|
||||
docker run --name bind9 \
|
||||
--restart unless-stopped\
|
||||
--network=macvlan-net \
|
||||
--ip=192.168.13.27 \
|
||||
--mac-address=02:42:ac:11:00:03 \
|
||||
-v /etc/timezone:/etc/timezone:ro \
|
||||
-p 53:53 \
|
||||
-v /home/da2001/bind/etc:/etc/bind \
|
||||
-v /home/da2001/bind/cache:/var/cache/bind \
|
||||
-v /home/da2001/bind/records:/var/lib/bind \
|
||||
-e BIND9_USER=bind \
|
||||
-d ubuntu/bind9
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
## Debian 11
|
||||
|
||||
su -
|
||||
|
||||
adduser da2001
|
||||
|
||||
usermod -aG 5,6,20,27,29,44,46,60,100,101,105,109,111,996,999 da2001
|
||||
|
||||
hostnamectl set-hostname opve1.dav.lan
|
||||
|
||||
tee /etc/hosts<<EOF
|
||||
192.168.13.14 opve1.dav.lan opve1
|
||||
EOF
|
||||
|
||||
mkdir /mnt/{iso,vms,backup}
|
||||
sudo tee -a /etc/fstab<<EOF
|
||||
|
||||
UUID=091632c3-e0b2-4d27-9595-a00d59a3e50c /mnt/vms ext4 defaults 0 0
|
||||
UUID=8a388dd8-000d-4f15-8e23-9838a460c378 /mnt/backup ext4 defaults 0 0
|
||||
UUID=6fbd6031-3631-41b5-b4e8-e2b301bb59e5 /mnt/iso ext4 defaults 0 0
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
mount -a
|
||||
|
||||
apt update && apt full-upgrade -y
|
||||
|
||||
echo "deb https://global.mirrors.apqa.cn/proxmox/debian/pve bullseye port">/etc/apt/sources.list.d/pveport.list
|
||||
curl https://global.mirrors.apqa.cn/proxmox/debian/pveport.gpg -o /etc/apt/trusted.gpg.d/pveport.gpg
|
||||
apt update && apt full-upgrade
|
||||
|
||||
apt install ifupdown2 -y
|
||||
apt install proxmox-ve postfix open-iscsi -y
|
||||
|
||||
***
|
||||
377
pnet.md
Normal file
377
pnet.md
Normal file
@@ -0,0 +1,377 @@
|
||||
# Заметки по PNET Lab
|
||||
|
||||
- [Заметки по PNET Lab](#заметки-по-pnet-lab)
|
||||
- [Установка PNET Lab](#установка-pnet-lab)
|
||||
- [Установка Ubuntu 20.04](#установка-ubuntu-2004)
|
||||
- [Установка ishare2](#установка-ishare2)
|
||||
- [Установка платформы PNET Lab](#установка-платформы-pnet-lab)
|
||||
- [Загрузка образов устройств](#загрузка-образов-устройств)
|
||||
- [Добавление своего qemu образа](#добавление-своего-qemu-образа)
|
||||
- [Добавление образа Mikrotik](#добавление-образа-mikrotik)
|
||||
- [Права файлов](#права-файлов)
|
||||
- [Добавление образов Cisco IOL](#добавление-образов-cisco-iol)
|
||||
|
||||
PNETLab (Packet Network Emulator Tool Lab, <https://pnetlab.com>) - форк EVE-NG платформы виртуализации для построения различных сетевых топологий и эмуляции сетевых устройств.
|
||||
|
||||
Кроме этого, PNETLab это платформа, которая позволяет создавать и делиться с сообществом своими лабораторными стендами с целью обучения сетевым технолгиям и тестирования.
|
||||
|
||||
Платформа состоит из двух основных элементов - PNETLab Box и PNETLab store
|
||||
|
||||
PNETLab Box (с 2-мя режимами работы: Offline и Online) - это виртальная машина, которая устаналивается на гипервизор и позволяет создавать и загружать лабораторные стенды.
|
||||
|
||||
PNETLab Store - web платформа с большим количеством бесплатных лабораторных стендов.
|
||||
|
||||
Платформа позволяет эмулировать сетевые устройства Cisco (IOS, Dynapimps), контейнеры Docker, образы устройств в формате Qemu.
|
||||
|
||||
## Установка PNET Lab
|
||||
|
||||
Установка платформы состоит из трёх основных этапов:
|
||||
|
||||
- установка серверной Ubuntu 20.04 (на момент написания заметки поддерживается только эта версия)
|
||||
- установка утилиты ishare2. Утилита позволяет скачивать лабораторные стенды, образы устройств и обновления для платформы
|
||||
- установка платформы PNET Lab
|
||||
|
||||
### Установка Ubuntu 20.04
|
||||
|
||||
Необходимо выполнить установку серверной версии ОС без обновлений в процессе установки.
|
||||
|
||||
### Установка ishare2
|
||||
|
||||
ishare2 - это инструмент, который позволяет загружать образы устройств для сетевых эмуляторов и управлять ими. ishare2 может загружать образы qemu, dynamips, bin/iol и docker. Он также может автоматически загружать образы, необходимые для лабораторий.
|
||||
|
||||
Репозиторий утилиты расположен по адресу: <https://github.com/ishare2-org/ishare2-cli>
|
||||
|
||||
Установка производится от рута командой
|
||||
|
||||
```shell
|
||||
wget -O /usr/sbin/ishare2 https://raw.githubusercontent.com/ishare2-org/ishare2-cli/main/ishare2 && chmod +x /usr/sbin/ishare2 && ishare2
|
||||
```
|
||||
|
||||
В процессе установки будет задано несколько вопросов, нажатие Enter применит значения по-умолчанию.
|
||||
|
||||
### Установка платформы PNET Lab
|
||||
|
||||
После установки ishare2 можно приступать к установке платформы
|
||||
|
||||
```shell
|
||||
root@pnet:~# ishare2 upgrade
|
||||
1) Upgrade ishare2
|
||||
2) Upgrade PNETLab
|
||||
3) Upgrade ishare2 GUI
|
||||
4) Exit
|
||||
Please, select an option: 2
|
||||
1) Upgrade PNETLab v5 STABLE
|
||||
2) Upgrade PNETLab v5 BETA
|
||||
3) Upgrade PNETLab v6 BETA
|
||||
4) Exit
|
||||
```
|
||||
|
||||
- PNETLab v5 STABLE не подходит, т.к. поддерживает только Ubuntu 18.04
|
||||
- Upgrade PNETLab v6 BETA - на момент написания заметки имела ограниченный функционал
|
||||
|
||||
Стоит выбрать `2) Upgrade PNETLab v5 BETA`
|
||||
|
||||
Установка занимает 15-20 минут, после чего консоль вернётся в меню `ishare2`, где нужно выбрать пнукт 4 для выхода и перезагрузить сервер.
|
||||
|
||||
## Загрузка образов устройств
|
||||
|
||||
Для загрузки образов используется утилита `ishare2`
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# ishare2 --help
|
||||
Syntax
|
||||
|
||||
ishare2 [action] [param1] [param2] [--overwrite]
|
||||
|
||||
action:
|
||||
search : Search for images available on LabHub mirrors.
|
||||
pull : Download an image by specifying the type and id.
|
||||
installed : Shows images installed on the server.
|
||||
labs : Shows available labs and downloads the images for the selected lab.
|
||||
mylabs : Same as labs command but you can use a customized path.
|
||||
relicense : Generates an iourc license for iol images.
|
||||
upgrade : Shows a menu to upgrade ishare2 or PNETLab.
|
||||
test : Test internet connectivity to required sites.
|
||||
help : Shows full help information.
|
||||
|
||||
param1:
|
||||
type = all, iol, qemu, dynamips, docker or name.
|
||||
|
||||
param2:
|
||||
id = This can be obtained using ishare2 search <type>
|
||||
|
||||
--overwrite:
|
||||
Used to overwrite an existing image if it already exists on your system.
|
||||
|
||||
Try: ishare2 help for more information.
|
||||
```
|
||||
|
||||
Для поиска доступных образов
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# ishare2 search
|
||||
Usage: ishare2 search <type> [keyword]
|
||||
ishare2 search all
|
||||
Types: qemu, iol, dynamips
|
||||
```
|
||||
|
||||
Показать все доступные образы формата `qemu`
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# ishare2 search qemu
|
||||
=============================
|
||||
Available QEMU images
|
||||
=============================
|
||||
ID NAME SIZE
|
||||
-- ---- ----
|
||||
1 128T-522 2.5 GiB
|
||||
2 6wind-cgnat-ee-x86_64-2.2.6 528.6 MiB
|
||||
3 6wind-router-ee-x86_64-2.2.6 528.3 MiB
|
||||
...
|
||||
1248 zabbix-3.0 3.6 GiB
|
||||
1249 zabbix-3.4 683.3 MiB
|
||||
|
||||
1249 QEMU images found
|
||||
```
|
||||
|
||||
При поиске можно использовать уточняющие критерии
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# ishare2 search qemu debian
|
||||
=============================
|
||||
Available QEMU images
|
||||
=============================
|
||||
ID NAME SIZE
|
||||
-- ---- ----
|
||||
597 linux-debian-10 1.3 GiB
|
||||
598 linux-debian-10 1.3 GiB
|
||||
599 linux-debian-10 1.3 GiB
|
||||
600 linux-debian-10.3.0 581.3 MiB
|
||||
|
||||
4 QEMU images found for the term: "debian"
|
||||
root@pnetlab:~#
|
||||
root@pnetlab:~#
|
||||
root@pnetlab:~# ishare2 search qemu pfsense
|
||||
=============================
|
||||
Available QEMU images
|
||||
=============================
|
||||
ID NAME SIZE
|
||||
-- ---- ----
|
||||
764 pfsense-2.3.3 555.5 MiB
|
||||
765 pfsense-CE-2.4.4 452.7 MiB
|
||||
766 pfsense-CE-2.4.5 521.5 MiB
|
||||
767 pfsense-CE-2.4.5-p1 531.0 MiB
|
||||
768 pfsense-CE-2.5.0-RELEASE 742.6 MiB
|
||||
769 pfsense-CE-2.5.1-RELEASE 742.9 MiB
|
||||
770 pfsense-CE-2.5.2 1.5 GiB
|
||||
771 pfsense-CE-2.5.2-RELEASE 785.2 MiB
|
||||
772 pfsense-CE-2.6 2.3 GiB
|
||||
773 pfsense-pfs-2.6.0 832.4 MiB
|
||||
774 pfsense-pfs-2.7.0 442.3 MiB
|
||||
|
||||
11 QEMU images found for the term: "pfsense"
|
||||
```
|
||||
|
||||
Для установки конкретного образа достаточно указать его ID. Например, для скачивания образа `linux-debian-10.3.0` с идентификатором 600
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# ishare2 pull qemu 600
|
||||
[!] IMAGE INFO
|
||||
- Image Name : linux-debian-10.3.0
|
||||
- Image Size : 581.3 MiB
|
||||
- Image Type : QEMU
|
||||
- Image ID : 600
|
||||
- Image path : /opt/unetlab/addons/qemu/linux-debian-10.3.0
|
||||
- Using host : https://labhub.eu.org
|
||||
[!] DOWNLOADING IMAGE
|
||||
/opt/unetlab/addons/qemu/linux-debian-10.3.0 100%[=============================================================================================>] 581.33M 10.5MB/s in 69s
|
||||
[+] DOWNLOAD COMPLETED!
|
||||
[-] Extracting: linux-debian-10.3.0.tgz file...
|
||||
[+] Extracted: /opt/unetlab/addons/qemu/linux-debian-10.3.0. Image ready to use.
|
||||
[-] Fixing permissions...
|
||||
|
||||
[+] Fix permissions command has been executed correctly
|
||||
```
|
||||
|
||||
## Добавление своего qemu образа
|
||||
|
||||
### Добавление образа Mikrotik
|
||||
|
||||
В репозитории `ishare2` есть несколько версий Mikrotik OS, последняя из доступных на момент написания заметки - 7.6, хотя на официальном сайте уже есть 7.16.2.
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# ishare2 search qemu mikrotik
|
||||
=============================
|
||||
|
||||
Available QEMU images
|
||||
=============================
|
||||
ID NAME SIZE
|
||||
-- ---- ----
|
||||
635 mikrotik-6.39 45.6 MiB
|
||||
...
|
||||
662 mikrotik-7.5 37.2 MiB
|
||||
663 mikrotik-7.6 39.1 MiB
|
||||
|
||||
29 QEMU images found for the term: "mikrotik"
|
||||
```
|
||||
|
||||
Чтобы проще разобраться с форматом и именованием образов, скачаем образ 7.6 из репозитория
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# ishare2 pull qemu 663
|
||||
[!] IMAGE INFO
|
||||
- Image Name : mikrotik-7.6
|
||||
- Image Size : 39.1 MiB
|
||||
- Image Type : QEMU
|
||||
- Image ID : 663
|
||||
- Image path : /opt/unetlab/addons/qemu/mikrotik-7.6
|
||||
- Using host : https://drive.labhub.eu.org
|
||||
[!] DOWNLOADING IMAGE
|
||||
/opt/unetlab/addons/qemu/mikrotik-7.6/hda.qc 100%[==================================>] 39.06M 42.0MB/s in 0.9s
|
||||
[+] DOWNLOAD COMPLETED!
|
||||
[-] Fixing permissions...
|
||||
|
||||
[+] Fix permissions command has been executed correctly
|
||||
```
|
||||
|
||||
Образы сохраняются в зависимости от формата, в соответствующей директории
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# ls /opt/unetlab/addons/
|
||||
docker dynamips iol qemu
|
||||
```
|
||||
|
||||
т.к. образ mikrotik имеет формат qemu, соответственно он и сохранился в
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# tree /opt/unetlab/addons/qemu/
|
||||
/opt/unetlab/addons/qemu/
|
||||
├── linux-debian-10.3.0
|
||||
│ └── virtioa.qcow2
|
||||
└── mikrotik-7.6
|
||||
└── hda.qcow2
|
||||
|
||||
2 directories, 2 files
|
||||
```
|
||||
|
||||
в этой же директории сохранился ранее скачанный образ Debian.
|
||||
|
||||
Теперь, чтобы скачать поледний доступный образ mikrotik 7.16.2 создадим соответсвтующую директорию и скачаем VMDK образ Mikrotik Cloud Hosted Router
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# cd /opt/unetlab/addons/qemu/
|
||||
root@pnetlab:/opt/unetlab/addons/qemu# mkdir mikrotik-7.16.2 && cd mikrotik-7.16.2
|
||||
root@pnetlab:/opt/unetlab/addons/qemu/mikrotik-7.16.2# wget https://download.mikrotik.com/routeros/7.16.2/chr-7.16.2.vmdk.zip
|
||||
```
|
||||
|
||||
Теперь скачанный образ необходимо разархивировать и конвертировать в формат QCOW2
|
||||
|
||||
```shell
|
||||
root@pnetlab:/opt/unetlab/addons/qemu/mikrotik-7.16.2# ls
|
||||
chr-7.16.2.vmdk.zip
|
||||
root@pnetlab:/opt/unetlab/addons/qemu/mikrotik-7.16.2# unzip chr-7.16.2.vmdk.zip
|
||||
Archive: chr-7.16.2.vmdk.zip
|
||||
inflating: chr-7.16.2.vmdk
|
||||
root@pnetlab:/opt/unetlab/addons/qemu/mikrotik-7.16.2# ls -l
|
||||
total 80044
|
||||
-rw-r--r-- 1 root root 41746432 Nov 26 13:16 chr-7.16.2.vmdk
|
||||
-rw-r--r-- 1 root root 40216509 Nov 27 08:24 chr-7.16.2.vmdk.zip
|
||||
```
|
||||
|
||||
Для конвертации в формат QCOW2 необходима утилита `qemu-img`, которая в Ubuntu входит в состав пакета `qemu-utils`.
|
||||
|
||||
```shell
|
||||
root@pnetlab:/opt/unetlab/addons/qemu/mikrotik-7.16.2# apt search qemu-img
|
||||
Sorting... Done
|
||||
Full Text Search... Done
|
||||
qemu-block-extra/now 1:4.2-3ubuntu6.30 amd64 [installed,local]
|
||||
extra block backend modules for qemu-system and qemu-utils
|
||||
|
||||
qemu-utils/now 1:4.2-3ubuntu6.30 amd64 [installed,local]
|
||||
QEMU utilities
|
||||
```
|
||||
|
||||
В состав PNET Lab на основе Ubuntu этот пакет уже входит.
|
||||
|
||||
Для конвертации VMDK в QCOW2
|
||||
|
||||
```shell
|
||||
root@pnetlab:/opt/unetlab/addons/qemu/mikrotik-7.16.2# qemu-img convert -f vmdk -O qcow2 chr-7.16.2.vmdk hda.qcow2
|
||||
```
|
||||
|
||||
**!! стоит обратить внимание - имя файла после конвертации должно быть `hda.qcow2`**
|
||||
|
||||
Скачанный архив и VMDK образ больше не нужны, их необходимо удалить.
|
||||
|
||||
### Права файлов
|
||||
|
||||
Все скачанные образы должны иметь определённые права - 755.
|
||||
|
||||
Изменить права можно вручную для файла или через web-интерфейс в разделе `System` => `System Settings` => `Fix Permissions`
|
||||
|
||||
Кроме этого есть специальный wrapper, изменить права можно также
|
||||
|
||||
```shell
|
||||
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
|
||||
```
|
||||
|
||||
Теперь при добавлении новой ноды в лабораторный стенд в выпадающем списке будет доступен образ Mikrotik 7.16.2
|
||||
|
||||
## Добавление образов Cisco IOL
|
||||
|
||||
С помощью `ishare2` скачал 2 образа Cisco IOL
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# ishare2 installed iol
|
||||
|
||||
====================================
|
||||
Showing installed IOL images
|
||||
====================================
|
||||
/opt/unetlab/addons/iol/bin/
|
||||
├── [-rwxr-xr-x 1.5K] CiscoIOUKeygen.py
|
||||
├── [-rwxr-xr-x 120M] i86bi_LinuxL2-AdvEnterpriseK9-M_152_May_2018.bin
|
||||
├── [-rwxr-xr-x 176M] i86bi_LinuxL3-AdvEnterpriseK9-M2_157_3_May_2018.bin
|
||||
├── [-rwxr-xr-x 38] iourc
|
||||
└── [-rwxr-xr-x 1.7K] keepalive.pl
|
||||
|
||||
0 directories, 5 files
|
||||
```
|
||||
|
||||
НО, скачать образы недостаточно, необходимо ещё сгенерировать лицензионный ключ, который хранится в файле `iourc`. Для генерации ключа необходимо запустить python скрипт `CiscoIOUKeygen.py`
|
||||
|
||||
Пример работы скрипта:
|
||||
|
||||
```shell
|
||||
root@pnetlab:~# /opt/unetlab/addons/iol/bin/CiscoIOUKeygen.py
|
||||
|
||||
*********************************************************************
|
||||
Cisco IOU License Generator - Kal 2011, python port of 2006 C version
|
||||
hostid=007f0101, hostname=pnetlab, ioukey=7f03e7
|
||||
|
||||
*********************************************************************
|
||||
Create the license file $HOME/.iourc with this command:
|
||||
|
||||
The command adds the following text to $HOME/.iourc:
|
||||
[license]
|
||||
pnetlab = b126e08dae13e962;
|
||||
|
||||
*********************************************************************
|
||||
Disable the phone home feature with this command:
|
||||
grep -q -F '127.0.0.1 xml.cisco.com' /etc/hosts || echo '127.0.0.1 xml.cisco.com' | sudo tee -a /etc/hosts
|
||||
|
||||
The command adds the following text to /etc/hosts:
|
||||
127.0.0.1 xml.cisco.com
|
||||
|
||||
*********************************************************************
|
||||
```
|
||||
|
||||
В файл `iourc` необходимо заменить лицензионный ключ на тот, который сгенерирован скриптом.
|
||||
|
||||
В конце необходимо поправить права к файлам:
|
||||
|
||||
- через web-интерфейс в разделе `System` => `System Settings` => `Fix Permissions`
|
||||
- или командой
|
||||
|
||||
```shell
|
||||
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
|
||||
```
|
||||
95
rename_network_int.md
Normal file
95
rename_network_int.md
Normal file
@@ -0,0 +1,95 @@
|
||||
# Переименовать сетевой интерфейс в Linux
|
||||
|
||||
Выполнялось на Debian 12
|
||||
|
||||
## Способ 1 - SystemD
|
||||
|
||||
Порядок действий:
|
||||
1. Погасить интерфейс
|
||||
2. Создать правило именования
|
||||
3. Изменить сетевые настройки - указать новое имя
|
||||
4. Выполнить перезагрузку - `systemctl restart systemd-udev-trigger.service`
|
||||
5. Включить интерфейс
|
||||
|
||||
***
|
||||
|
||||
Имеем:
|
||||
|
||||
```shell
|
||||
root@vm-qw-74:~# ip a sh ens18
|
||||
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||
link/ether bc:24:11:00:1b:aa brd ff:ff:ff:ff:ff:ff
|
||||
altname enp0s18
|
||||
inet 193.3.184.249/24 brd 193.3.184.255 scope global ens18
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::be24:11ff:fe00:1baa/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
root@vm-qw-74:~#
|
||||
root@vm-qw-74:~# ip a sh ens19
|
||||
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||
link/ether bc:24:11:1d:fa:fe brd ff:ff:ff:ff:ff:ff
|
||||
altname enp0s19
|
||||
inet 10.66.11.80/20 brd 10.66.15.255 scope global ens19
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::be24:11ff:fe1d:fafe/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
```
|
||||
|
||||
```shell
|
||||
root@vm-qw-74:~# cat /etc/network/interfaces
|
||||
...
|
||||
allow-hotplug ens18
|
||||
iface ens18 inet static
|
||||
address 193.3.184.249
|
||||
gateway 193.3.184.1
|
||||
|
||||
|
||||
allow-hotplug ens19
|
||||
iface ens19 inet static
|
||||
address 10.66.11.80/20
|
||||
```
|
||||
|
||||
**Необходимо интерфейс `ens18` переименовать в `wan1`**
|
||||
|
||||
Т.к. для выполнения работ интерфейс необходимо отключать, при удалённом подключении все действия нужно выполнить одной командой в конвеере
|
||||
|
||||
Команда - `ip a sh ens18 | grep link/ether | awk '{print $2}'` покажет mac адрес для `ens18`
|
||||
|
||||
```shell
|
||||
old_name=ens18
|
||||
new_name=wan1
|
||||
mac=$(ip a sh $old_name | grep link/ether | awk '{print $2}')
|
||||
|
||||
ifdown $old_name
|
||||
sed -i "s/$old_name/$new_name/" /etc/network/interfaces
|
||||
|
||||
cat << EOF > /etc/systemd/network/10-$new_name.link
|
||||
[Match]
|
||||
MACAddress=$mac
|
||||
[Link]
|
||||
Name=$new_name
|
||||
EOF
|
||||
|
||||
systemctl restart systemd-udev-trigger.service
|
||||
sleep 0.5
|
||||
ifup $new_name
|
||||
```
|
||||
|
||||
_для обратного переименования, предварительно нужно удалить файл - `/etc/systemd/network/10-$new_name.link`_
|
||||
|
||||
## Способ 2 - Правило udev
|
||||
|
||||
Имеем
|
||||
- старое имя - `eth0`
|
||||
- mac - `02:42:ac:11:00:02`
|
||||
- новое имя - `neweth0`
|
||||
|
||||
```shell
|
||||
sudo nano /etc/udev/rules.d/70-persistent-net.rules
|
||||
```
|
||||
|
||||
```shell
|
||||
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="02:42:ac:11:00:02", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="neweth0"
|
||||
```
|
||||
|
||||
После перезагрузки будет применено новое имя.
|
||||
@@ -87,6 +87,9 @@ fi
|
||||
# Директория, в которой хранится конфигурационный файл EEPROM
|
||||
eeprom_conf_path=/opt/backup_from_usb
|
||||
|
||||
# Перенаправить весь вывод и ошибки в файл
|
||||
exec > $eeprom_conf_path/run_log 2>&1
|
||||
|
||||
# Необходимо убедиться, что в папке присутствует конфиг EEPROM для изменения порядка загрузки
|
||||
eeprom_conf="usb_eeprom.conf"
|
||||
|
||||
@@ -99,7 +102,7 @@ fi
|
||||
rpi-eeprom-config -a $eeprom_conf_path/$eeprom_conf
|
||||
|
||||
# Перезагрузка
|
||||
reboot
|
||||
/usr/sbin/reboot
|
||||
```
|
||||
|
||||
Добавить права на выполнение
|
||||
@@ -220,13 +223,13 @@ ssh $server 'echo "$(tail -5 $remote_path/log)" > $remote_path/log'
|
||||
|
||||
# Необходимо хранить только последние 3 резервные копии
|
||||
count_copies=3
|
||||
ssh $server "find . -type f -name '*_image.img.gz' -printf '%T@ %p\n' | sort -n | cut -d' ' -f 2- | tail -n +$(($count_copies+1)) | xargs rm -f --"
|
||||
ssh $server "find $remote_path -type f -name '*_image.img.gz' -printf '%T@ %p\n' | sort -nr | cut -d' ' -f 2- | tail -n +$(($count_copies+1)) | xargs rm -f --"
|
||||
|
||||
# Необходимо переключить EEPROM на загрузку с SD карты
|
||||
rpi-eeprom-config -a $eeprom_conf_path/$eeprom_conf
|
||||
|
||||
# Перезагрузка
|
||||
reboot
|
||||
/usr/sbin/reboot
|
||||
|
||||
```
|
||||
|
||||
|
||||
145
samba-tool.md
Normal file
145
samba-tool.md
Normal file
@@ -0,0 +1,145 @@
|
||||
# Шпаргалка по командам samba-tool
|
||||
|
||||
- [Шпаргалка по командам samba-tool](#шпаргалка-по-командам-samba-tool)
|
||||
- [Пользователи и группы](#пользователи-и-группы)
|
||||
- [Создать пользователя](#создать-пользователя)
|
||||
- [Отключить устаревание пароля для пользователя](#отключить-устаревание-пароля-для-пользователя)
|
||||
- [Удалить пользователя](#удалить-пользователя)
|
||||
- [Создать группу](#создать-группу)
|
||||
- [Удалить группу](#удалить-группу)
|
||||
- [Добавить пользователей в группу](#добавить-пользователей-в-группу)
|
||||
- [Удалить пользователей из группы](#удалить-пользователей-из-группы)
|
||||
- [Показать пользователей группы](#показать-пользователей-группы)
|
||||
- [Работа со встроенным в Samba 4 DNS сервером](#работа-со-встроенным-в-samba-4-dns-сервером)
|
||||
- [Запрос списка зон](#запрос-списка-зон)
|
||||
- [Запрос информации о DNS зоне](#запрос-информации-о-dns-зоне)
|
||||
- [Запрос всех DNS записей](#запрос-всех-dns-записей)
|
||||
- [Смена типа DNS сервера (Встроенный/Bind9)](#смена-типа-dns-сервера-встроенныйbind9)
|
||||
- [Создание записи типа А](#создание-записи-типа-а)
|
||||
- [Создание зоны обратного просмотра](#создание-зоны-обратного-просмотра)
|
||||
- [Создание записи в зоне обратного просмотра](#создание-записи-в-зоне-обратного-просмотра)
|
||||
- [Запрос записей в зоне обратного просмотра](#запрос-записей-в-зоне-обратного-просмотра)
|
||||
- [Специфичные запросы](#специфичные-запросы)
|
||||
|
||||
***
|
||||
|
||||
Больше информации здесь - <https://xinux.net/index.php/Samba-tool>
|
||||
|
||||
***
|
||||
|
||||
## Пользователи и группы
|
||||
|
||||
### Создать пользователя
|
||||
|
||||
```bash
|
||||
amba-tool user create username
|
||||
```
|
||||
|
||||
```bash
|
||||
samba-tool user create ivanov P@ssw0rd \
|
||||
--login-shell=/bin/bash \
|
||||
--gecos='Иван Иванов' \
|
||||
--given-name=Иван --surname=Иванов
|
||||
```
|
||||
|
||||
### Отключить устаревание пароля для пользователя
|
||||
|
||||
```bash
|
||||
samba-tool user setexpiry ivanov --noexpiry
|
||||
```
|
||||
|
||||
### Удалить пользователя
|
||||
|
||||
```bash
|
||||
samba-tool user delete username
|
||||
```
|
||||
|
||||
### Создать группу
|
||||
|
||||
```bash
|
||||
samba-tool group add groupname
|
||||
```
|
||||
|
||||
### Удалить группу
|
||||
|
||||
```bash
|
||||
samba-tool group delete groupname
|
||||
```
|
||||
|
||||
### Добавить пользователей в группу
|
||||
|
||||
```bash
|
||||
samba-tool group addmembers "Domain Users" user[,otheruser[,thirduser[,...]]]
|
||||
```
|
||||
|
||||
### Удалить пользователей из группы
|
||||
|
||||
```bash
|
||||
samba-tool group removemembers "Domain Users" user[,otheruser[,thirduser[,...]]]
|
||||
```
|
||||
|
||||
### Показать пользователей группы
|
||||
|
||||
```bash
|
||||
samba-tool group listmembers "Domain Users"
|
||||
```
|
||||
|
||||
## Работа со встроенным в Samba 4 DNS сервером
|
||||
|
||||
### Запрос списка зон
|
||||
|
||||
```bash
|
||||
samba-tool dns zonelist 127.0.0.1 -U Administrator
|
||||
```
|
||||
|
||||
### Запрос информации о DNS зоне
|
||||
|
||||
```bash
|
||||
samba-tool dns zoneinfo 127.0.0.1 local.acisi.ru -U Administrator
|
||||
```
|
||||
|
||||
### Запрос всех DNS записей
|
||||
|
||||
```bash
|
||||
samba-tool dns query 127.0.0.1 local.acisi.ru @ ALL -U Administrator
|
||||
```
|
||||
|
||||
### Смена типа DNS сервера (Встроенный/Bind9)
|
||||
|
||||
```bash
|
||||
samba_upgradedns --dns-backend=[BIND9_DLZ|SAMBA_INTERNAL]
|
||||
```
|
||||
|
||||
### Создание записи типа А
|
||||
|
||||
```bash
|
||||
samba-tool dns add 10.10.120.24 alt.lan COMP2 A 10.10.120.25 -Uadministrator
|
||||
```
|
||||
|
||||
### Создание зоны обратного просмотра
|
||||
|
||||
для сети 192.168.13.0/24
|
||||
|
||||
```bash
|
||||
samba-tool dns zonecreate 127.0.0.1 13.168.192.in-addr.arpa -Uadministrator
|
||||
```
|
||||
|
||||
### Создание записи в зоне обратного просмотра
|
||||
|
||||
для узла dc1.alt.lan с адресом 192.168.13.139
|
||||
|
||||
```bash
|
||||
samba-tool dns add 127.0.0.1 13.168.192.in-addr.arpa 139 PTR dc1.alt.lan -Uadministrator --password=P@ssw0rd
|
||||
```
|
||||
|
||||
### Запрос записей в зоне обратного просмотра
|
||||
|
||||
```bash
|
||||
samba-tool dns query 127.0.0.1 13.168.192.in-addr.arpa @ ALL -U Administrator
|
||||
```
|
||||
|
||||
### Специфичные запросы
|
||||
|
||||
```bash
|
||||
dig _msdcs.local.acisi.ru @127.0.0.1 SOA
|
||||
```
|
||||
314
ssh.md
314
ssh.md
@@ -1,91 +1,331 @@
|
||||
### ssh
|
||||
Подключение
|
||||
# SSH
|
||||
|
||||
- [SSH](#ssh)
|
||||
- [Подключение](#подключение)
|
||||
- [SSH аутентификация по ключам](#ssh-аутентификация-по-ключам)
|
||||
- [Для дополнительной безопасности можно отключить доступ по паролю](#для-дополнительной-безопасности-можно-отключить-доступ-по-паролю)
|
||||
- [Подключение через промежуточный хост](#подключение-через-промежуточный-хост)
|
||||
- [SCP](#scp)
|
||||
- [Не стандартный порт](#не-стандартный-порт)
|
||||
- [ssh\_config](#ssh_config)
|
||||
- [Общие параметры](#общие-параметры)
|
||||
- [Пример конфигурации](#пример-конфигурации)
|
||||
- [Проброс SSH ключа](#проброс-ssh-ключа)
|
||||
- [Разово](#разово)
|
||||
- [Постоянный проброс](#постоянный-проброс)
|
||||
- [Проброс SSH ключей руту](#проброс-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
|
||||
```
|
||||
```
|
||||
|
||||
[вверх](#ssh)
|
||||
|
||||
### scp
|
||||
```bash
|
||||
scp ./wlt.py pi@da2001.ru:/home/pi
|
||||
```
|
||||
использование не стандартного порта
|
||||
```bash
|
||||
scp -P 227 ./wlt.py pi@da2001.ru:/home/pi
|
||||
```
|
||||
### SSH аутентификация по ключам
|
||||
|
||||
|
||||
|
||||
### ssh аутентификация по ключам
|
||||
|
||||
**На локальном хосте linux сгенерировать пару ключей**
|
||||
На локальном хосте linux сгенерировать пару ключей
|
||||
|
||||
```bash
|
||||
ssh-keygen
|
||||
```
|
||||
```
|
||||
|
||||
парольную фразу можно оставить пустой, чтобы не вводить пароль каждый раз при обращении к ключу
|
||||
_По умолчанию ключи будут храниться в каталоге ~/.ssh в домашнем каталоге текущего пользователя. Закрытый ключ будет называться **id_rsa**, а связанный с ним открытый ключ – **id_rsa.pub**_
|
||||
_По умолчанию ключи будут храниться в каталоге `~/.ssh` в домашнем каталоге текущего пользователя. Закрытый ключ будет называться `id_rsa`, а связанный с ним открытый ключ – `id_rsa.pub`_
|
||||
|
||||
Теперь необходимо скопировать публичный ключ на сервер, доступ к которому настраиваем
|
||||
|
||||
```bash
|
||||
ssh-copy-id login@example.com
|
||||
```
|
||||
|
||||
или
|
||||
|
||||
```bash
|
||||
cat ~/.ssh/id_rsa.pub | ssh login@example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
|
||||
```
|
||||
**Для дополнительной безопасности можно отключить доступ по паролю**
|
||||
Для этого необходимо отредактировать конфигурационный файл демона SSH raspberry
|
||||
```
|
||||
|
||||
[вверх](#ssh)
|
||||
|
||||
### Для дополнительной безопасности можно отключить доступ по паролю
|
||||
|
||||
```bash
|
||||
sudo nano /etc/ssh/sshd_config
|
||||
```
|
||||
Найти директиву _PasswordAuthentication_, раскомментировать ее и присвоить значение _no_
|
||||
```
|
||||
|
||||
`PasswordAuthentication no`
|
||||
Сохранить файл, закрыть.
|
||||
Перезагрузить сервис
|
||||
|
||||
Перезагрузить сервис
|
||||
|
||||
```bash
|
||||
sudo systemctl restart ssh
|
||||
```
|
||||
```
|
||||
|
||||
[вверх](#ssh)
|
||||
|
||||
### подключение через промежуточный хост
|
||||
_если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой_
|
||||
```
|
||||
### Подключение через промежуточный хост
|
||||
|
||||
если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой
|
||||
|
||||
```bash
|
||||
ssh -J user1@host1:22 user2@host2
|
||||
```
|
||||
```
|
||||
|
||||
но в таком случае придется вводить пароль от host1 и от host2. Чтобы этого избежать можно добавить на хосты публичный ключ клиента
|
||||
|
||||
если добавить к подключению опции:
|
||||
```
|
||||
если добавить к подключению опции:
|
||||
|
||||
```bash
|
||||
-o UserKnownHostsFile=/dev/null
|
||||
-o StrictHostKeyChecking=no
|
||||
```
|
||||
```
|
||||
|
||||
удаленный сервер не будет проверять и не будет добавлять хеш удаленного хоста в файл _**known_hosts**_
|
||||
|
||||
это может быть полезно, например, когда часто меняется прошивка зондов и хеш изменяется.
|
||||
Таким образом, полная команда может выглядеть так:
|
||||
```
|
||||
это может быть полезно на тестовых стендах, когда узлы часто меняются и хеш изменяется.
|
||||
Таким образом, полная команда может выглядеть так:
|
||||
|
||||
```bash
|
||||
ssh -J pi@da2001.ru:227 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.5.3
|
||||
```
|
||||
```
|
||||
|
||||
[вверх](#ssh)
|
||||
|
||||
## SCP
|
||||
|
||||
```bash
|
||||
scp ./wlt.py pi@da2001.ru:/home/pi
|
||||
```
|
||||
|
||||
### Не стандартный порт
|
||||
|
||||
```bash
|
||||
scp -P 227 ./wlt.py pi@da2001.ru:/home/pi
|
||||
```
|
||||
|
||||
[вверх](#ssh)
|
||||
|
||||
## ssh_config
|
||||
|
||||
Документация - `man 5 ssh_config`</br>
|
||||
Перевод man - <https://www.opennet.ru/man.shtml?topic=ssh_config&category=5&russian=0>
|
||||
|
||||
Конфигурационный файл клиента распологается в домашнем каталоге пользователя - `~/.ssh/config`
|
||||
|
||||
Для изменения значений клиента по-умолчанию, можно задать свои значения. Также можно задать шаблоны для подключения к определённым хостам с указанием отличных значений для каждого подключения или группы подключений.
|
||||
|
||||
В общем виде подобная настройка может выглядеть подобным образом:
|
||||
|
||||
```bash
|
||||
Host firsthost
|
||||
SSH_OPTION_1 custom_value
|
||||
SSH_OPTION_2 custom_value
|
||||
SSH_OPTION_3 custom_value
|
||||
|
||||
Host secondhost
|
||||
ANOTHER_OPTION custom_value
|
||||
|
||||
Host 192.168.13.24
|
||||
ANOTHER_OPTION custom_value
|
||||
|
||||
Host 192.168.13.*
|
||||
ANOTHER_OPTION custom_value
|
||||
|
||||
Host *host
|
||||
ANOTHER_OPTION custom_value
|
||||
|
||||
Host *
|
||||
CHANGE_DEFAULT custom_value
|
||||
```
|
||||
|
||||
Стоит иметь ввиду - анализ файла осуществляется сверху вниз до соответствия параметрам. Таким образом, если вверху будет указана директива `Host *`, для всех хостов будут применены значения определённые для этой директивы и анализ файла будет остановлен, т.к. `*` подходит для любого хоста.
|
||||
|
||||
### Общие параметры
|
||||
|
||||
Параметры определяются в порядке ключ-значение, при этом нет чёткого требования для разделения между ключом и значением, одинаково будут распознаны подобные определения:
|
||||
|
||||
```bash
|
||||
Port 4567
|
||||
Port=4567
|
||||
Port = 4567
|
||||
```
|
||||
|
||||
### Пример конфигурации
|
||||
|
||||
```bash
|
||||
Host home
|
||||
User da2001
|
||||
VisualHostKey yes
|
||||
PasswordAuthentication no
|
||||
IdentityFile ~/.ssh/personal_id_rsa
|
||||
|
||||
Host test*
|
||||
User testuser
|
||||
StrictHostKeyChecking no
|
||||
UserKnownHostsFile /dev/null
|
||||
LogLevel QUIET
|
||||
|
||||
Host srv1 srv2 srv3
|
||||
User jorn
|
||||
|
||||
Host *
|
||||
User anotheruaser
|
||||
StrictHostKeyChecking ask
|
||||
UserKnownHostsFile ~/.ssh/known_hosts
|
||||
LogLevel INFO
|
||||
ServerAliveInterval 120
|
||||
```
|
||||
|
||||
- отступы не обязательны, просто для удобочитаемости
|
||||
|
||||
[вверх](#ssh)
|
||||
|
||||
## Проброс SSH ключа
|
||||
|
||||
### Разово
|
||||
|
||||
1. Создать `~/.ssh/config`
|
||||
2. Заполните ее (адрес хоста - это адрес хоста, на который вы хотите разрешить пересылку cred'ов):
|
||||
|
||||
```shell
|
||||
Host jumphost.local
|
||||
ForwardAgent yes
|
||||
```
|
||||
|
||||
3. Если вы еще не запустили ssh-agent, запустите его:
|
||||
|
||||
```shell
|
||||
ssh-agent
|
||||
```
|
||||
|
||||
4. Возьмите выходные данные этой команды и вставьте их в терминал. Это настроит переменные среды, которые необходимо установить для работы переадресации агента. При желании вы можете заменить это и шаг 3 на:
|
||||
|
||||
```shell
|
||||
eval "$(ssh-agent)"
|
||||
```
|
||||
|
||||
5. Добавьте ключ, который вы хотите переслать ssh-агенту:
|
||||
|
||||
```shell
|
||||
ssh-add [path to key if there is one]/[key_name]
|
||||
```
|
||||
|
||||
6. Войдите на удаленный хост:
|
||||
|
||||
```shell
|
||||
ssh -A [user]@[jumphost.local]
|
||||
```
|
||||
|
||||
7. Отсюда, если вы войдете на другой хост, который принимает этот ключ, это просто сработает:
|
||||
|
||||
```shell
|
||||
ssh [user]@[hostname]
|
||||
```
|
||||
|
||||
### Постоянный проброс
|
||||
|
||||
В конфиг `~/.ssh/config` добавить
|
||||
|
||||
- `ForwardAgent yes` - проброс SSH-агента
|
||||
- `IdentityFile /home/da2001/.ssh/sape_a.dolgiy` - для подключения использовать этот ключ
|
||||
- `IdentitiesOnly yes` - разрешить проброс только указанного выше ключа, а не всех доступных агенту
|
||||
- `AddKeysToAgent yes` - разрешить проброс ключей агента
|
||||
|
||||
Таким образом, настройка может выглядеть так:
|
||||
|
||||
```shell
|
||||
Host *.qwarta.ru, *.sapientru.net
|
||||
ForwardAgent yes
|
||||
User adolgiy
|
||||
#User root
|
||||
IdentityFile /home/da2001/.ssh/sape_a.dolgiy
|
||||
IdentitiesOnly yes
|
||||
AddKeysToAgent yes
|
||||
```
|
||||
|
||||
[вверх](#ssh)
|
||||
|
||||
### Проброс SSH ключей руту
|
||||
|
||||
Перед подключением локальному ssh-агенту доступны ключи
|
||||
|
||||
```shell
|
||||
❯ ssh-add -l
|
||||
4096 SHA256:l3eDVlDzIyZL+s2TPkBYbNpeRt/ExLMerJjGfODTHv4 artem@da2001.ru (RSA)
|
||||
256 SHA256:/3KxBjovmSsQTnO2YYVO+C8qSegCiOFXX75u0+AhwnQ artem@da2001.ru (ED25519)
|
||||
4096 SHA256:BncZFiTwTodIFrgwjBVnYLo88k7TM/7g62oaNROugVQ /home/da2001/.ssh/sape_a.dolgiy (RSA)
|
||||
```
|
||||
|
||||
При подключении по SSH с пробросом ключей видим эти же ключи
|
||||
|
||||
```shell
|
||||
❯ ssh -A vm-qw-54.sapientru.net
|
||||
adolgiy@vm-qw-54:~$ ssh-add -l
|
||||
4096 SHA256:l3eDVlDzIyZL+s2TPkBYbNpeRt/ExLMerJjGfODTHv4 artem@da2001.ru (RSA)
|
||||
256 SHA256:/3KxBjovmSsQTnO2YYVO+C8qSegCiOFXX75u0+AhwnQ artem@da2001.ru (ED25519)
|
||||
4096 SHA256:BncZFiTwTodIFrgwjBVnYLo88k7TM/7g62oaNROugVQ /home/da2001/.ssh/sape_a.dolgiy (RSA)
|
||||
```
|
||||
|
||||
При переключении на другого пользователя, этир ключи не будут доступны
|
||||
|
||||
```shell
|
||||
adolgiy@vm-qw-54:~$ sudo -i
|
||||
[sudo] password for adolgiy:
|
||||
root@vm-qw-54 ~ # ssh-add -l
|
||||
Could not open a connection to your authentication agent.
|
||||
```
|
||||
|
||||
Чтобы эти ключи были доступны другому пользователю на сервере, например руту, необходимо выполнить проброс сокета ssh-агента
|
||||
|
||||
```shell
|
||||
adolgiy@vm-qw-54:~$ sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -i
|
||||
root@vm-qw-54 ~ # ssh-add -l
|
||||
4096 SHA256:l3eDVlDzIyZL+s2TPkBYbNpeRt/ExLMerJjGfODTHv4 artem@da2001.ru (RSA)
|
||||
256 SHA256:/3KxBjovmSsQTnO2YYVO+C8qSegCiOFXX75u0+AhwnQ artem@da2001.ru (ED25519)
|
||||
4096 SHA256:BncZFiTwTodIFrgwjBVnYLo88k7TM/7g62oaNROugVQ /home/da2001/.ssh/sape_a.dolgiy (RSA)
|
||||
```
|
||||
|
||||
[вверх](#ssh)
|
||||
|
||||
107
ssh_over_jump.md
Normal file
107
ssh_over_jump.md
Normal file
@@ -0,0 +1,107 @@
|
||||
# SSH подключение через промежуточный узел без доступа к промежуточному узлу
|
||||
|
||||
Задача: обеспечить подключение к узлу в закрытом сегменте сети через промежуточный (bastion) узел. При этом закрыть возможность подключения к промежуточному узлу.
|
||||
|
||||
Упрощённая схема представлена на рисунке
|
||||
|
||||

|
||||
|
||||
## Вводные данные
|
||||
|
||||
- `srchost` - узел с которого необходимо обеспечить подключение
|
||||
- `jumpuser` - пользователь, который инициирует подключение
|
||||
- `bastion` - промежуточный узел, через который необходимо обеспечить подключение
|
||||
- `enduser` - пользователь, от имени которого необходимо выполнить подключение
|
||||
- `dsthost` - узел, к которому необходимо подключиться
|
||||
|
||||
Порядок подключения:
|
||||
|
||||
```shell
|
||||
jumpuser@srchost:~$ ssh -A -J jumpuser@bastion enduser@dsthost
|
||||
```
|
||||
|
||||
## Настройка подключения
|
||||
|
||||
### Сгенерировать ssh ключ
|
||||
|
||||
На узле `srchost` для пользователя `jumpuser` сгенерировать ssh-ключ
|
||||
|
||||
```shell
|
||||
jumpuser@srchost:~$ ssh-keygen
|
||||
```
|
||||
|
||||
### Скопировать публичный ключ на узел `bastion`
|
||||
|
||||
```shell
|
||||
jumpuser@srchost:~$ ssh-copy-id jumpuser@bastion
|
||||
```
|
||||
|
||||
### Проверить подключение
|
||||
|
||||
Убедиться, что есть возможность подключения без пароля
|
||||
|
||||
```shell
|
||||
jumpuser@srchost:~$ ssh jumpuser@bastion
|
||||
jumpuser@bastion:~$
|
||||
```
|
||||
|
||||
### Скопировать публичный ключ на узел `dsthost`
|
||||
|
||||
Скопировать публичный ключ `jumpuser` в файл `/home/enduser/.ssh/authorized_keys` на узле `dsthost`
|
||||
|
||||
```shell
|
||||
enduser@dsthost:~$ cat .ssh/authorized_keys
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDqAk2CZKveP6zvYKBlwxhlhontNHOpMiKdS1rIfJ8r5J9CHn3EbZftfwMIPp2dji4YsKkCHVEVHbwLf+efc/8wUxnaBdVZPaP/SUT9+f3NjjVxS7vPfIw24qHTltIIcJaeJMPHZ5BKtF9Gvgkh4N4MLH2e2o7OcekQej/JEQSDneqgEfPe5Xhks34VOOkhaM02skyFjCEacLBfBbYHqlwWDEEtUAMzQGdgt9h85WWcCBA/qRT8eRDvKFYEr7238jREKD0MPQ1R5jIjk37GFa0vr7vEAO9mTI4hGHl89YqnxaWg6P5gO+lXGsemE+0oXpWG7zKt8PF2nPK6dq93RFeb jumpuser@srchost
|
||||
```
|
||||
|
||||
### Проверить подключение через промежуточный хост с пробросом ключа
|
||||
|
||||
```shell
|
||||
jumpuser@srchost ~$ ssh -A -J jumpuser@srchost enduser@dsthost
|
||||
enduser@dsthost ~$
|
||||
```
|
||||
|
||||
### Ограничить возможность подключения пользователем `jumpuser` к `bastion`
|
||||
|
||||
В конфигурационный файл `/etc/ssh/sshd_config` добавить
|
||||
|
||||
```shell
|
||||
jumpuser@bastion:~ $ tail -n 7 /etc/ssh/sshd_config
|
||||
|
||||
Match User jumpuser
|
||||
PermitTTY no
|
||||
X11Forwarding no
|
||||
PermitTunnel no
|
||||
GatewayPorts no
|
||||
ForceCommand /usr/sbin/nologin
|
||||
```
|
||||
|
||||
После внесения изменений, необходимо перезапустить службу `ssh`
|
||||
|
||||
```shell
|
||||
jumpuser@bastion:~ $ sudo systemctl restart ssh
|
||||
```
|
||||
|
||||
Убедиться в отсутствии возможности подключения к узлу `bastion`
|
||||
|
||||
```shell
|
||||
jumpuser@srchost ~$ ssh jumpuser@bastion
|
||||
ssh: PTY allocation request failed on channel 0
|
||||
This account is currently not available.
|
||||
Connection to bastion closed.
|
||||
jumpuser@srchost ~$
|
||||
```
|
||||
|
||||
Таким образом получается подключиться к `enduser@dsthost` через промежуточный узел `jumpuser@bastion` без возможности подключения к `jumpuser@bastion`
|
||||
|
||||
```shell
|
||||
jumpuser@srchost ~$ eval "$(ssh-agent)"
|
||||
jumpuser@srchost ~$ ssh-add .ssh/id_rsa
|
||||
jumpuser@srchost ~$
|
||||
jumpuser@srchost ~$ ssh -A -J jumpuser@srchost enduser@dsthost
|
||||
enduser@dsthost ~$
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
Источник: - <https://habr.com/ru/companies/cloud4y/articles/530516/>
|
||||
17
tcpdump.md
17
tcpdump.md
@@ -1,4 +1,9 @@
|
||||
### tcpdump
|
||||
# tcpdump
|
||||
|
||||
- [tcpdump](#tcpdump)
|
||||
- [Подробнее](#подробнее)
|
||||
- [Сохранить пакеты полностью в дамп для определённого узла](#сохранить-пакеты-полностью-в-дамп-для-определённого-узла)
|
||||
|
||||
_возможные сетевые интерфейсы для захвата_
|
||||
`sudo tcpdump -D`
|
||||
|
||||
@@ -26,8 +31,8 @@ n - _не подменять значения на названия, напри
|
||||
A - _выводить всё в ASCII_
|
||||
e - _выводить данные L2_
|
||||
|
||||
## Подробнее
|
||||
|
||||
#### Подробнее
|
||||
**Ключи**
|
||||
_Наиболее часто используемые ключи при запуске tcpdump приведены таблице_
|
||||
ключ описание
|
||||
@@ -153,3 +158,11 @@ tcpdump dst 172.16.0.1 and not icmp
|
||||
```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)'
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
## Сохранить пакеты полностью в дамп для определённого узла
|
||||
|
||||
```shell
|
||||
tcpdump -i any host 193.232.121.109 -nnXSs 0 -w test.pcap
|
||||
```
|
||||
|
||||
672
termux_android.md
Normal file
672
termux_android.md
Normal file
@@ -0,0 +1,672 @@
|
||||
# Termux Android
|
||||
|
||||
<!--toc:start-->
|
||||
- [Termux Android](#termux-android)
|
||||
- [Предварительная настройка](#предварительная-настройка)
|
||||
- [Доступ к хранилищу](#доступ-к-хранилищу)
|
||||
- [Обновление пакетов и подключение репозиториев](#обновление-пакетов-и-подключение-репозиториев)
|
||||
- [Установка базового набора пакетов](#установка-базового-набора-пакетов)
|
||||
- [SSH доступ](#ssh-доступ)
|
||||
- [Настройка ZSH с Oh-My-Zsh](#настройка-zsh-с-oh-my-zsh)
|
||||
- [Установка ZSH](#установка-zsh)
|
||||
- [Установка Oh-My-Zsh](#установка-oh-my-zsh)
|
||||
- [Установка плагинов](#установка-плагинов)
|
||||
- [Настройка .zshrc](#настройка-zshrc)
|
||||
- [Внешний вид - плагин PowerLevel10K](#внешний-вид---плагин-powerlevel10k)
|
||||
- [Резервное копирование Termux (backup)](#резервное-копирование-termux-backup)
|
||||
- [Создание резервной копии](#создание-резервной-копии)
|
||||
- [Восстановление из резервной копии](#восстановление-из-резервной-копии)
|
||||
- [Настройка энергопотребления (Android)](#настройка-энергопотребления-android)
|
||||
- [Отключение оптимизации батареи](#отключение-оптимизации-батареи)
|
||||
- [Разрешение фоновой активности](#разрешение-фоновой-активности)
|
||||
- [Увеличение лимита процессов через ADB (Phantom Process Killer)](#увеличение-лимита-процессов-через-adb-phantom-process-killer)
|
||||
- [Подготовка](#подготовка)
|
||||
- [Выполнение ADB-команд](#выполнение-adb-команд)
|
||||
- [Установка графического окружения в Termux - XFCE4](#установка-графического-окружения-в-termux---xfce4)
|
||||
- [Запуск XFCE4 через Termux X11](#запуск-xfce4-через-termux-x11)
|
||||
- [Создание скрипта для быстрого запуска](#создание-скрипта-для-быстрого-запуска)
|
||||
- [Запуск XFCE4 через VNC](#запуск-xfce4-через-vnc)
|
||||
- [Установка VNC сервера](#установка-vnc-сервера)
|
||||
- [Настройка пароля](#настройка-пароля)
|
||||
- [Создание конфигурационных файлов](#создание-конфигурационных-файлов)
|
||||
- [Скрипт для запуска / остановки VNC](#скрипт-для-запуска--остановки-vnc)
|
||||
- [Подключение к VNC с планшета](#подключение-к-vnc-с-планшета)
|
||||
- [Изменение масштаба XFCE4](#изменение-масштаба-xfce4)
|
||||
- [TUR (Termux User Repository)](#tur-termux-user-repository)
|
||||
- [Некторые популярные пакеты в TUR](#некторые-популярные-пакеты-в-tur)
|
||||
- [Установка Firefox](#установка-firefox)
|
||||
- [proot](#proot)
|
||||
- [Установка debian](#установка-debian)
|
||||
- [Установка GUI](#установка-gui)
|
||||
<!--toc:end-->
|
||||
|
||||
***
|
||||
|
||||
**Termux** - эмулятор терминала и среда Linux без необходимости получения root на Android устройстве.
|
||||
|
||||
- <https://termux.dev/en/>
|
||||
- <https://github.com/termux/termux-app>
|
||||
- <https://f-droid.org/packages/com.termux/>
|
||||
|
||||
Версия из Google Play имеет ряд ограничений, поэтому приложение необходимо устанавливать из F-Droid (рекомендуется) или GitHub.
|
||||
|
||||
WIKI Termux (открывается через VPN) - <https://wiki.termux.com/wiki/Main_Page>
|
||||
|
||||
Termux:X11 - для отображение графического интерфейса, если будет установлена графическа среда (xfce4, lxqt, kde и т.д.)
|
||||
|
||||
- <https://github.com/termux/termux-x11>
|
||||
|
||||
## Предварительная настройка
|
||||
|
||||
После установки запустить Termux и дождитесь завершения начальной инициализации
|
||||
|
||||
Для планшета Huawei, Termux в горизонтальной ориентации планшета отображался с широкими боковыми рамками, это решилось в настройках планшета: настройки приложений - App Multiplier - найти в списке Termux и отключить.
|
||||
|
||||
Эта настройка позволяет в горизонтальном положении иметь 2 окна приложения. В данном случае это только мешает
|
||||
|
||||
Для увеличения размера шрифта в Termux достаточно изменить масштаб двумя пальцами (раздвинуть). Размер сохранится.
|
||||
|
||||
### Доступ к хранилищу
|
||||
|
||||
После установки Termux необходимо предоставить доступ к хранилищу, иначе он не сможет ничего писать на диск.
|
||||
|
||||
В консоли termux
|
||||
|
||||
```bash
|
||||
termux-setup-storage
|
||||
```
|
||||
|
||||
### Обновление пакетов и подключение репозиториев
|
||||
|
||||
```bash
|
||||
# Обновление списка пакетов
|
||||
pkg update && pkg upgrade
|
||||
|
||||
# Установка необходимых репозиториев (несмотря на архив на GitHub, они нужны)
|
||||
pkg install root-repo x11-repo
|
||||
|
||||
# Ещё раз обновляем после подключения репозиториев
|
||||
pkg update && pkg upgrade
|
||||
```
|
||||
|
||||
### Установка базового набора пакетов
|
||||
|
||||
```bash
|
||||
pkg install -y git nano vim curl wget htop tree openssh termux-api termux-tools android-tools
|
||||
```
|
||||
|
||||
### SSH доступ
|
||||
|
||||
для разового включения демона ssh
|
||||
|
||||
```bash
|
||||
sshd
|
||||
```
|
||||
|
||||
для автозагрузки вместе с Termux
|
||||
|
||||
```bash
|
||||
sv-enable sshd
|
||||
```
|
||||
|
||||
демон ssh работает на порту 8022
|
||||
|
||||
Для подключения необходимо или задать пароль для пользователя устройства
|
||||
|
||||
```bash
|
||||
❯ whoami
|
||||
u0_a529
|
||||
```
|
||||
|
||||
или скопировать на устройство публичную часть ключа
|
||||
|
||||
```bash
|
||||
mkdir ~/.ssh
|
||||
echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL/KY33g1maVDH80bsrfV1bHjkfiYXHu9Xtl3kJc7ofk artem@da2001.ru' >> ~/.ssh/authorized_keys
|
||||
chmod 700 ~/.ssh
|
||||
chmod 600 ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
## Настройка ZSH с Oh-My-Zsh
|
||||
|
||||
### Установка ZSH
|
||||
|
||||
```bash
|
||||
pkg install zsh -y
|
||||
```
|
||||
|
||||
### Установка Oh-My-Zsh
|
||||
|
||||
```bash
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
|
||||
```
|
||||
|
||||
Когда появится вопрос о смене оболочки по умолчанию, указать `Y`.
|
||||
|
||||
### Установка плагинов
|
||||
|
||||
```bash
|
||||
# zsh-autosuggestions (автодополнение из истории)
|
||||
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
|
||||
|
||||
# zsh-syntax-highlighting (подсветка команд)
|
||||
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
|
||||
```
|
||||
|
||||
### Настройка .zshrc
|
||||
|
||||
```bash
|
||||
nano ~/.zshrc
|
||||
```
|
||||
|
||||
Найти строку `plugins=(git)` и заменить на:
|
||||
|
||||
```bash
|
||||
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
|
||||
```
|
||||
|
||||
**Важно: `zsh-syntax-highlighting` должен быть последним в списке!**
|
||||
|
||||
Применение настроек
|
||||
|
||||
```bash
|
||||
source ~/.zshrc
|
||||
```
|
||||
|
||||
### Внешний вид - плагин PowerLevel10K
|
||||
|
||||
<https://git.da2001.ru/da2001/dots#%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%B9-%D0%B2%D0%B8%D0%B4-%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD-powerlevel10k>
|
||||
|
||||
### Резервное копирование Termux (backup)
|
||||
|
||||
Для создания резервных копий есть встроенный скрипт - <https://wiki.termux.dev/wiki/Backing_up_Termux>
|
||||
|
||||
#### Создание резервной копии
|
||||
|
||||
```bash
|
||||
termux-backup /sdcard/termux-backup-$(date +%Y_%m_%d).tar.xz
|
||||
```
|
||||
|
||||
- `/sdcard` - внутрення память устройства Android
|
||||
|
||||
#### Восстановление из резервной копии
|
||||
|
||||
```bash
|
||||
termux-restore /sdcard/backup.tar.xz
|
||||
```
|
||||
|
||||
## Настройка энергопотребления (Android)
|
||||
|
||||
### Отключение оптимизации батареи
|
||||
|
||||
Настройки → Приложения → Termux → Энергопотребление
|
||||
|
||||
Выберите Без ограничений
|
||||
|
||||
Повторите то же самое для приложения Termux:X11
|
||||
|
||||
### Разрешение фоновой активности
|
||||
|
||||
Настройки → Приложения → Termux → Разрешения
|
||||
|
||||
Добавьте разрешение Фоновая активность
|
||||
|
||||
## Увеличение лимита процессов через ADB (Phantom Process Killer)
|
||||
|
||||
Для повышения эффективности энергосбережения Android следит за количеством запущенных процессов и периодически завершает лишние по его мнению. Из-за этого работа Termux может быть не стабильной, т.к. порождает много дочерних процессов, которые Android будет настройчиво завершать.
|
||||
|
||||
Такое агресивное поведение Android можно изменить, через adb попробовать увеличить лимит запущенных процессов до максимального значения.
|
||||
|
||||
### Подготовка
|
||||
|
||||
**На планшете:**
|
||||
|
||||
Включите Режим разработчика (Настройки → Об устройстве → нажмите 7 раз на "Номер сборки")
|
||||
|
||||
Включите Отладку по USB (Настройки → Для разработчиков)
|
||||
|
||||
**На компьютере:**
|
||||
|
||||
Установите ADB (android-tools)
|
||||
|
||||
Подключите планшет к компьютеру через USB. На планшете выбрать режим - Передача данных.
|
||||
|
||||
### Выполнение ADB-команд
|
||||
|
||||
Откройте терминал на компьютере и выполните:
|
||||
|
||||
```bash
|
||||
adb devices
|
||||
```
|
||||
|
||||
Если устройство видно как `<serial_number> device` — всё готово для команд ADB.
|
||||
|
||||
Если `unauthorized` — разблокируйте экран, подтвердите запрос "Разрешить отладку по USB" (поставьте галочку "Всегда разрешать")
|
||||
|
||||
после активации отладки и подключения, можно отправлять команды
|
||||
|
||||
```bash
|
||||
adb bash "/system/bin/device_config set_sync_disabled_for_tests persistent"
|
||||
adb bash "/system/bin/device_config put activity_manager max_phantom_processes 2147483647"
|
||||
adb bash settings put global settings_enable_monitor_phantom_procs false
|
||||
adb reboot
|
||||
```
|
||||
|
||||
Планшет перезагрузится. Изменения сохранятся навсегда.
|
||||
|
||||
## Установка графического окружения в Termux - XFCE4
|
||||
|
||||
**!! ПОКА не удалось заставить работать звук !!**
|
||||
**небольшое дополнение: звук работает в консольном аудиопроигрывателе `cmus`**
|
||||
|
||||
```bash
|
||||
pkg install cmus
|
||||
```
|
||||
|
||||
Для работы графических приложений необходимо настроить
|
||||
|
||||
- Termux X11
|
||||
или
|
||||
- VNC: <https://wiki.termux.com/wiki/Graphical_Environment>
|
||||
|
||||
_**Одномоментно может работать что-то одно: X11 или VNC**_
|
||||
|
||||
```bash
|
||||
# Установка XFCE4
|
||||
pkg install xfce4 xfce4-goodies
|
||||
|
||||
# Установка Termux:X11 (графический сервер)
|
||||
pkg install termux-x11-nightly
|
||||
|
||||
# Установка PulseAudio (для звука)
|
||||
pkg install pulseaudio
|
||||
```
|
||||
|
||||
Пакет `xfce4-goodies` включает полезные плагины и приложения для рабочего стола
|
||||
|
||||
### Запуск XFCE4 через Termux X11
|
||||
|
||||
Способ А: Прямая команда (простой)
|
||||
|
||||
```bash
|
||||
termux-x11 :1 -xstartup "dbus-launch --exit-with-session xfce4-session"
|
||||
```
|
||||
|
||||
Способ Б: С флагом для Kirin (рекомендуется для вашего планшета)
|
||||
|
||||
```bash
|
||||
termux-x11 :1 -legacy-drawing -xstartup "dbus-launch --exit-with-session xfce4-session"
|
||||
```
|
||||
|
||||
После выполнения команды:
|
||||
|
||||
Откройте приложение Termux:X11 на планшете
|
||||
|
||||
Вы должны увидеть рабочий стол XFCE
|
||||
|
||||
#### Создание скрипта для быстрого запуска
|
||||
|
||||
Чтобы каждый раз не вводить длинную команду, создайте скрипт в Termux:
|
||||
|
||||
```bash
|
||||
cat > $PREFIX/bin/x11 << 'EOF'
|
||||
#!/data/data/com.termux/files/usr/bin/bash
|
||||
|
||||
case "$1" in
|
||||
down)
|
||||
echo "🛑 Останавливаем XFCE и Termux:X11..."
|
||||
|
||||
# Убиваем XFCE сессию
|
||||
pkill -f "xfce4-session" 2>/dev/null
|
||||
pkill -f "dbus-launch.*xfce4" 2>/dev/null
|
||||
|
||||
# Останавливаем X сервер
|
||||
pkill -9 termux-x11 2>/dev/null
|
||||
pkill -9 -f "com.termux.x11.Loader" 2>/dev/null
|
||||
|
||||
# Удаляем блокировки (ВСЕ возможные пути)
|
||||
rm -f /data/data/com.termux/files/usr/tmp/.X1-lock 2>/dev/null
|
||||
rm -f /data/data/com.termux/files/usr/tmp/.X2-lock 2>/dev/null
|
||||
rm -f /data/data/com.termux/files/usr/tmp/.X11-unix/X1 2>/dev/null
|
||||
rm -f /data/data/com.termux/files/usr/tmp/.X11-unix/X2 2>/dev/null
|
||||
rm -rf /data/data/com.termux/files/usr/tmp/.X11-unix/ 2>/dev/null
|
||||
|
||||
rm -f /tmp/.X1-lock 2>/dev/null
|
||||
rm -f /tmp/.X2-lock 2>/dev/null
|
||||
rm -rf /tmp/.X11-unix/ 2>/dev/null
|
||||
|
||||
# Удаляем PID файлы
|
||||
rm -f ~/.vnc/*.pid 2>/dev/null
|
||||
|
||||
|
||||
|
||||
# Закрываем окно Termux:X11 через Activity Manager
|
||||
am force-stop com.termux.x11 2>/dev/null
|
||||
|
||||
echo "✅ Termux:X11 остановлен."
|
||||
;;
|
||||
|
||||
up|"")
|
||||
echo "🚀 Запускаем XFCE и Termux:X11..."
|
||||
|
||||
# Останавливаем всё, что могло остаться
|
||||
pkill -9 termux-x11 2>/dev/null
|
||||
rm -f /data/data/com.termux/files/usr/tmp/.X1-lock 2>/dev/null
|
||||
rm -rf /data/data/com.termux/files/usr/tmp/.X11-unix/ 2>/dev/null
|
||||
|
||||
sleep 1
|
||||
|
||||
# Устанавливаем переменные окружения
|
||||
export XDG_RUNTIME_DIR=${TMPDIR}
|
||||
|
||||
# Запускаем X сервер
|
||||
termux-x11 :1 -legacy-drawing > /dev/null 2>&1 &
|
||||
|
||||
# Ждём создания сокета
|
||||
timeout=5
|
||||
while [ ! -e /data/data/com.termux/files/usr/tmp/.X11-unix/X1 ] && [ $timeout -gt 0 ]; do
|
||||
sleep 1
|
||||
((timeout--))
|
||||
done
|
||||
|
||||
# Открываем окно Termux:X11
|
||||
am start --user 0 -n com.termux.x11/.MainActivity > /dev/null 2>&1 &
|
||||
|
||||
# Запускаем XFCE
|
||||
env DISPLAY=:1 dbus-launch --exit-with-session xfce4-session > /dev/null 2>&1 &
|
||||
|
||||
echo "✅ XFCE запущен в Termux:X11!"
|
||||
;;
|
||||
|
||||
status)
|
||||
echo "📊 Статус:"
|
||||
if pgrep -f "termux-x11" > /dev/null; then
|
||||
echo " Termux:X11: 🟢 запущен"
|
||||
else
|
||||
echo " Termux:X11: 🔴 остановлен"
|
||||
fi
|
||||
|
||||
if pgrep -f "xfce4-session" > /dev/null; then
|
||||
echo " XFCE: 🟢 запущен"
|
||||
else
|
||||
echo " XFCE: 🔴 остановлен"
|
||||
fi
|
||||
|
||||
if [ -e /data/data/com.termux/files/usr/tmp/.X11-unix/X1 ]; then
|
||||
echo " Сокет X11: 🟢 существует"
|
||||
else
|
||||
echo " Сокет X11: 🔴 отсутствует"
|
||||
fi
|
||||
;;
|
||||
|
||||
help|--help|-h)
|
||||
echo "Использование: startx [команда]"
|
||||
echo ""
|
||||
echo "Команды:"
|
||||
echo " up - запустить XFCE и Termux:X11 (по умолчанию)"
|
||||
echo " down - остановить XFCE и Termux:X11, освободить ресурсы"
|
||||
echo " status - показать статус сервисов"
|
||||
echo " help - показать эту справку"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "❌ Неизвестная команда: $1"
|
||||
echo "Используйте 'startx help' для списка команд"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
EOF
|
||||
|
||||
chmod +x $PREFIX/bin/x11
|
||||
```
|
||||
|
||||
Параметры скрипта:
|
||||
|
||||
- Запуск
|
||||
|
||||
```bash
|
||||
x11 up
|
||||
# или просто
|
||||
x11
|
||||
```
|
||||
|
||||
- Остановка
|
||||
|
||||
```bash
|
||||
x11 down
|
||||
```
|
||||
|
||||
- Проверка статуса
|
||||
|
||||
```bash
|
||||
x11 status
|
||||
```
|
||||
|
||||
### Запуск XFCE4 через VNC
|
||||
|
||||
Альтернатива X11
|
||||
|
||||
#### Установка VNC сервера
|
||||
|
||||
```bash
|
||||
# Установка TigerVNC сервера
|
||||
pkg install tigervnc -y
|
||||
```
|
||||
|
||||
#### Настройка пароля
|
||||
|
||||
```bash
|
||||
# Установка пароля для подключения к VNC
|
||||
vncpasswd
|
||||
```
|
||||
|
||||
#### Создание конфигурационных файлов
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.vnc
|
||||
|
||||
cat > ~/.vnc/config << 'EOF'
|
||||
# VNC конфиг
|
||||
geometry=2456x1540
|
||||
depth=24
|
||||
localhost=0
|
||||
alwaysshared=1
|
||||
EOF
|
||||
```
|
||||
|
||||
Примечание: 2456x1540 родное разрешение планшета за вычетом строки состояния Android
|
||||
|
||||
```bash
|
||||
cat > ~/.vnc/xstartup << 'EOF'
|
||||
#!/bin/bash
|
||||
unset SESSION_MANAGER
|
||||
unset DBUS_SESSION_BUS_ADDRESS
|
||||
startxfce4 &
|
||||
EOF
|
||||
|
||||
chmod +x ~/.vnc/xstartup
|
||||
```
|
||||
|
||||
#### Скрипт для запуска / остановки VNC
|
||||
|
||||
```bash
|
||||
cat > $PREFIX/bin/vnc << 'EOF'
|
||||
#!/data/data/com.termux/files/usr/bin/bash
|
||||
|
||||
case "$1" in
|
||||
up|start)
|
||||
echo "🚀 Запуск VNC на дисплее :1..."
|
||||
vncserver :1 -geometry 1920x1200 -depth 24 -localhost no
|
||||
echo "✅ VNC запущен на порту 5901"
|
||||
;;
|
||||
down|stop)
|
||||
echo "🛑 Полная остановка VNC..."
|
||||
|
||||
# Убиваем процессы VNC
|
||||
vncserver -kill :1 2>/dev/null
|
||||
vncserver -kill :2 2>/dev/null
|
||||
pkill -9 Xvnc 2>/dev/null
|
||||
|
||||
# Удаляем блокировки (ВСЕ возможные пути)
|
||||
rm -f /data/data/com.termux/files/usr/tmp/.X1-lock 2>/dev/null
|
||||
rm -f /data/data/com.termux/files/usr/tmp/.X2-lock 2>/dev/null
|
||||
rm -f /data/data/com.termux/files/usr/tmp/.X11-unix/X1 2>/dev/null
|
||||
rm -f /data/data/com.termux/files/usr/tmp/.X11-unix/X2 2>/dev/null
|
||||
rm -rf /data/data/com.termux/files/usr/tmp/.X11-unix/ 2>/dev/null
|
||||
|
||||
rm -f /tmp/.X1-lock 2>/dev/null
|
||||
rm -f /tmp/.X2-lock 2>/dev/null
|
||||
rm -rf /tmp/.X11-unix/ 2>/dev/null
|
||||
|
||||
# Удаляем PID файлы
|
||||
rm -f ~/.vnc/*.pid 2>/dev/null
|
||||
|
||||
echo "✅ VNC полностью остановлен, все блокировки удалены"
|
||||
;;
|
||||
status)
|
||||
echo "📊 Статус VNC:"
|
||||
vncserver -list
|
||||
;;
|
||||
restart)
|
||||
echo "🔄 Перезапуск VNC..."
|
||||
$0 down
|
||||
sleep 2
|
||||
$0 up
|
||||
;;
|
||||
*)
|
||||
echo "Использование: vnc [up|down|restart|status]"
|
||||
echo ""
|
||||
echo " up - запустить VNC"
|
||||
echo " down - полностью остановить VNC (с очисткой)"
|
||||
echo " restart - перезапустить VNC"
|
||||
echo " status - показать статус"
|
||||
;;
|
||||
esac
|
||||
EOF
|
||||
|
||||
chmod +x $PREFIX/bin/vnc
|
||||
```
|
||||
|
||||
Параметры скрипта:
|
||||
|
||||
- Запуск
|
||||
|
||||
```bash
|
||||
vnc up
|
||||
# или
|
||||
vnc start
|
||||
```
|
||||
|
||||
- Остановка
|
||||
|
||||
```bash
|
||||
vnc down
|
||||
или
|
||||
vnc stop
|
||||
```
|
||||
|
||||
- Проверка статуса
|
||||
|
||||
```bash
|
||||
vnc status
|
||||
```
|
||||
|
||||
#### Подключение к VNC с планшета
|
||||
|
||||
<https://wiki.termux.dev/wiki/Graphical_Environment>
|
||||
|
||||
Как рекомендует официальная документация - установить клиент [VNC Viewer](https://play.google.com/store/apps/details?id=com.realvnc.viewer.android) (developed by RealVNC Limited)
|
||||
|
||||
Создать новое подключение
|
||||
|
||||
Адрес: 127.0.0.1:5901
|
||||
Качество (Picture quality): High
|
||||
|
||||
Указать пароль
|
||||
|
||||
## Изменение масштаба XFCE4
|
||||
|
||||
На экране 11,5' и разрешением 2456x1540, элементы рабочего стола будут очень мелкими.
|
||||
|
||||
Изменение Масштаба в настройках экрана не работает.
|
||||
|
||||
Изменение DPI влияет только на шрифты.
|
||||
|
||||
Помогло: Setting - Appearance - Settings - Windows Scaling - 2x
|
||||
|
||||
Масштаб увеличится в 2 раза. Стало даже немного крупнее чем хотелось.
|
||||
|
||||
## TUR (Termux User Repository)
|
||||
|
||||
TUR — это пользовательский репозиторий Termux, созданный по аналогии с AUR в Arch Linux. Он существует, потому что официальный репозиторий Termux не может включить все существующие пакеты — некоторые из них слишком нишевые, сложные в сборке или имеют специфические лицензионные ограничения
|
||||
|
||||
<https://github.com/termux-user-repository/tur>
|
||||
|
||||
В чём разница между официальным репозиторием и TUR?
|
||||
|
||||
| Характеристика | Официальный репозиторий | TUR |
|
||||
|-----------------|-------------------------------------|------------------------------------------------------|
|
||||
| Поддержка | Разработчики Termux | Сообщество |
|
||||
| Пакеты | Только проверенные и одобренные | Практически любые, включая Firefox, Chromium, VSCode |
|
||||
| Установка | pkg install <имя> | pkg install tur-repo → затем pkg install <имя> |
|
||||
| Надёжность | Высокая (строгий контроль качества) | Средняя (пакеты собираются сообществом) |
|
||||
|
||||
### Некторые популярные пакеты в TUR
|
||||
|
||||
| Пакет | Команда установки | Что это |
|
||||
|--------------------|----------------------|----------------------------------------|
|
||||
| Firefox | pkg install firefox | Браузер |
|
||||
| Chromium | pkg install chromium | Браузер от Google |
|
||||
| VS Code (code-oss) | pkg install code-oss | Редактор кода без телеметрии Microsoft |
|
||||
| VLC | pkg install vlc | Медиаплеер |
|
||||
|
||||
Полный список пакетов TUR можно посмотреть на официальной странице репозитория — <https://repology.org/repository/tur>
|
||||
|
||||
### Установка Firefox
|
||||
|
||||
```bash
|
||||
# Шаг 1: Подключение TUR репозитория
|
||||
pkg install tur-repo
|
||||
|
||||
# Шаг 2: Обновление списка пакетов (чтобы Termux "увидел" новые пакеты)
|
||||
pkg update
|
||||
|
||||
# Шаг 3: Установка Firefox
|
||||
pkg install firefox
|
||||
```
|
||||
|
||||
После этого Firefox будет доступен для запуска из XFCE4
|
||||
|
||||
***
|
||||
|
||||
## proot
|
||||
|
||||
Установка ОС в псевдорут окружение используя утилиту `proot`
|
||||
|
||||
```bash
|
||||
pkg install proot-distro
|
||||
```
|
||||
|
||||
### Установка debian
|
||||
|
||||
```bash
|
||||
proot-distro login debian
|
||||
proot-distro login debian
|
||||
adduser da2001
|
||||
apt update && apt upgrade -y
|
||||
|
||||
apt install -y mc tree tmux git htop vim sudo curl wget jq
|
||||
echo "da2001 ALL=(ALL:ALL) ALL" > /etc/sudoers.d/da2001
|
||||
chmod 440 /etc/sudoers.d/da2001
|
||||
visudo -c -f /etc/sudoers.d/da2001
|
||||
|
||||
dpkg-reconfigure tzdata
|
||||
```
|
||||
|
||||
### Установка GUI
|
||||
|
||||
```bash
|
||||
apt install tigervnc xfce4 xfce4-goodies
|
||||
```
|
||||
|
||||
Звук в ОС proot также не работает. Не вижу смысла дальше разбираться с proot
|
||||
57
tmux.md
57
tmux.md
@@ -1,57 +0,0 @@
|
||||
### 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
tmux/.tmux.conf
Normal file
43
tmux/.tmux.conf
Normal file
@@ -0,0 +1,43 @@
|
||||
# Enable mouse control (clickable windows, panes, resizable panes)
|
||||
set -g mouse on
|
||||
|
||||
# List of plugins
|
||||
set -g @plugin 'tmux-plugins/tpm'
|
||||
set -g @plugin 'tmux-plugins/tmux-sensible'
|
||||
set -g @plugin 'dracula/tmux'
|
||||
|
||||
# available plugins: battery, cpu-usage, git, gpu-usage, ram-usage, tmux-ram-usage, network, network-bandwidth, network-ping, ssh-session, attached-clients, network-vpn, weather, time, mpc, spotify-tui, kubernetes-context, synchronize-panes
|
||||
set -g @dracula-plugins "cpu-usage ram-usage time"
|
||||
|
||||
# available colors: white, gray, dark_gray, light_purple, dark_purple, cyan, green, orange, red, pink, yellow
|
||||
# set -g @dracula-[plugin-name]-colors "[background] [foreground]"
|
||||
# set -g @dracula-cpu-usage-colors "dark_purple white"
|
||||
set -g @dracula-cpu-usage-colors "green dark_gray"
|
||||
|
||||
set -g @dracula-show-timezone false
|
||||
set -g @dracula-day-month true
|
||||
set -g @dracula-military-time true
|
||||
# set -g @dracula-time-format "%F %R"
|
||||
set -g @dracula-time-format "%H:%M, %d %b %Y г."
|
||||
|
||||
set -g @dracula-show-powerline true
|
||||
|
||||
# for left
|
||||
set -g @dracula-show-left-sep
|
||||
|
||||
# for right symbol (can set any symbol you like as separator)
|
||||
set -g @dracula-show-right-sep
|
||||
|
||||
set -g @dracula-show-flags true
|
||||
|
||||
# it can accept `hostname` (full hostname), `session`, `shortname` (short name), `smiley`, `window`, or any character.
|
||||
set -g @dracula-show-left-icon session
|
||||
|
||||
|
||||
# Other examples:
|
||||
# set -g @plugin 'github_username/plugin_name'
|
||||
# set -g @plugin 'git@github.com:user/plugin'
|
||||
# set -g @plugin 'git@bitbucket.com:user/plugin'
|
||||
|
||||
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
|
||||
run '~/.tmux/plugins/tpm/tpm'
|
||||
172
tmux/tmux.md
Normal file
172
tmux/tmux.md
Normal file
@@ -0,0 +1,172 @@
|
||||
# TMUX
|
||||
|
||||
- [TMUX](#tmux)
|
||||
- [Установка](#установка)
|
||||
- [tmux](#tmux-1)
|
||||
- [TPM (Tmux Plugin Manager)](#tpm-tmux-plugin-manager)
|
||||
- [Dracula Theme](#dracula-theme)
|
||||
- [Разделяемая сессия между 2-мя пользователями](#разделяемая-сессия-между-2-мя-пользователями)
|
||||
- [Заблокировать пользователя после завершения совместной работы](#заблокировать-пользователя-после-завершения-совместной-работы)
|
||||
|
||||
## Установка
|
||||
|
||||
### tmux
|
||||
|
||||
```bash
|
||||
apt-get install tmux
|
||||
```
|
||||
|
||||
### TPM (Tmux Plugin Manager)
|
||||
|
||||
<https://github.com/tmux-plugins/tpm>
|
||||
|
||||
```bash
|
||||
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
|
||||
```
|
||||
|
||||
добавить в конфиг `~/.tmux.conf`
|
||||
|
||||
```bash
|
||||
# List of plugins
|
||||
set -g @plugin 'tmux-plugins/tpm'
|
||||
set -g @plugin 'tmux-plugins/tmux-sensible'
|
||||
|
||||
# Other examples:
|
||||
# set -g @plugin 'github_username/plugin_name'
|
||||
# set -g @plugin 'github_username/plugin_name#branch'
|
||||
# set -g @plugin 'git@github.com:user/plugin'
|
||||
# set -g @plugin 'git@bitbucket.com:user/plugin'
|
||||
|
||||
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
|
||||
run '~/.tmux/plugins/tpm/tpm'
|
||||
```
|
||||
|
||||
### Dracula Theme
|
||||
|
||||
<https://draculatheme.com/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писок поддерживаемых команд
|
||||
|
||||
### Разделяемая сессия между 2-мя пользователями
|
||||
|
||||
Чтобы несколько пользователей могли подключиться к одной сессии tmux, можно выполнить следующие шаги:
|
||||
|
||||
- создать общую группу и добавить пользователей в эту группу
|
||||
|
||||
```bash
|
||||
su -
|
||||
TMUX_GROUP=tmuxgroup
|
||||
groupadd $TMUX_GROUP
|
||||
usermod -aG $TMUX_GROUP user1
|
||||
usermod -aG $TMUX_GROUP user2
|
||||
```
|
||||
|
||||
- создать директорию с битом `setgid`, в которой будет создаваться сокет разделяемой сессии tmux
|
||||
|
||||
```bash
|
||||
mkdir /var/tmux
|
||||
chgrp $TMUX_GROUP /var/tmux
|
||||
chmod g+ws /var/tmux
|
||||
```
|
||||
|
||||
- создать общую сессию
|
||||
|
||||
```bash
|
||||
tmux -S /var/tmux/shared-session
|
||||
```
|
||||
|
||||
- второй пользователь может подключиться к созданной сессии
|
||||
|
||||
```bash
|
||||
tmux -S /var/tmux/shared-session attach
|
||||
```
|
||||
|
||||
### Заблокировать пользователя после завершения совместной работы
|
||||
|
||||
После завершения совместной работы можно заблокировать учётную запись второго пользователя, чтобы не было возможности несанкционированного подключения к узлу.
|
||||
|
||||
```bash
|
||||
usermod -L user2
|
||||
```
|
||||
|
||||
Чтобы разблокировать пользователя, вводим:
|
||||
|
||||
```bash
|
||||
usermod -U user2
|
||||
```
|
||||
|
||||
Текущий статус блокировки учётной записи
|
||||
|
||||
```bash
|
||||
da2001@bastion:~ $ sudo passwd -S tmuxuser
|
||||
tmuxuser L 04/08/2024 0 99999 7 -1
|
||||
da2001@bastion:~ $ sudo passwd -S da2001
|
||||
da2001 P 04/04/2022 0 99999 7 -1
|
||||
da2001@bastion:~ $
|
||||
```
|
||||
|
||||
где
|
||||
|
||||
- `L` - учётная запись заблокирована
|
||||
- `P` - учётная запись разблокирована
|
||||
@@ -64,7 +64,7 @@ Address = 10.10.10.1/24
|
||||
# сохранить конфигурацию
|
||||
SaveConfig = true
|
||||
|
||||
# вкл./откл. подмену IP для VPN
|
||||
# вкл./откл. подмену IP для VPN - ЗАМЕНИТЬ ИМЯ ИНТЕРФЕЙСА!!!
|
||||
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
|
||||
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
|
||||
|
||||
|
||||
294
zfs.md
Normal file
294
zfs.md
Normal file
@@ -0,0 +1,294 @@
|
||||
# ZFS в ОС Альт 10
|
||||
|
||||
- [ZFS в ОС Альт 10](#zfs-в-ос-альт-10)
|
||||
- [Введение](#введение)
|
||||
- [Возможности ZFS](#возможности-zfs)
|
||||
- [Уровни абстракции ZFS](#уровни-абстракции-zfs)
|
||||
- [Virtual Devices](#virtual-devices)
|
||||
- [Pool](#pool)
|
||||
- [Установка](#установка)
|
||||
- [Подготовка](#подготовка)
|
||||
- [Установка модуля ядра и утилиты командной строки](#установка-модуля-ядра-и-утилиты-командной-строки)
|
||||
- [Загрузка модуля ядра](#загрузка-модуля-ядра)
|
||||
- [Автозагрузка модуля ядра](#автозагрузка-модуля-ядра)
|
||||
- [Создание пула](#создание-пула)
|
||||
- [Постоянные идентификаторы диска](#постоянные-идентификаторы-диска)
|
||||
- [Пул из одного диска](#пул-из-одного-диска)
|
||||
- [Просмотр файловых систем в пуле](#просмотр-файловых-систем-в-пуле)
|
||||
- [Удаление пула](#удаление-пула)
|
||||
- [Создание пула с чередованием (RAID0, 2 VDEVs)](#создание-пула-с-чередованием-raid0-2-vdevs)
|
||||
|
||||
## Введение
|
||||
|
||||
ZFS - это современная файловая система и одновременно логический менеджер томов, изначально разработана компанией SUN, далее Oracle
|
||||
|
||||
### Возможности ZFS
|
||||
|
||||
- масштабируемость
|
||||
- защита от потерь данных, программная отказоустойчивость
|
||||
- поддержка больших объемов данных
|
||||
- интеграция управления логическими томами с файловой системой
|
||||
- поддержка снимков и CoW клонирования
|
||||
- непрерывный контроль целостности
|
||||
- автоматическое восстановление
|
||||
|
||||
### Уровни абстракции ZFS
|
||||
|
||||
- Virtual Devices. VDEVs. Виртуальные устройства.
|
||||
- Pool. Пулы.
|
||||
- DataSet. Файловая система внутри пула
|
||||
|
||||
#### Virtual Devices
|
||||
|
||||
VDEVs. Виртуальные устройства. Используются для размещения данных или в служебных целях для тонкой настройки ZFS
|
||||
|
||||
- **физические диски**
|
||||
- **разделы дисков**
|
||||
- **файл образа диска** с указанием полного пути
|
||||
|
||||
Использование виртуальных устройств
|
||||
|
||||
- без явного указания виртуальные устройства объединяются пул уровня RAID0 - запись с чередованием для повышения скорости. Без избыточности и отказоустойчивости.
|
||||
- **mirror** - програмный массив RAID1
|
||||
- **raidz1/2/3** - RAID-массивы с контролем четности
|
||||
- **spare** - диски горячего запаса для RAID. На них не хранятся данные, эти диски включаются в работу в случае выхода из строя диска в пуле
|
||||
- **cache** - устройство для кэша 2го уровня (L2ARC). Рекомендуется использовать на быстрых SSD дисках. Если скорость дисков с данным не отличается от скорости дисков с кешем, смысл выделения отдельных дисков по кеш пропадает. **КРАЙНЕ ЧУВСТВИТЕЛЕН К ПОТЕРЕ ДАННЫХ**
|
||||
- **log** - отдельный журнал (SLOG), содержащий ZFS Intent Log (ZIL). Так же как и кеш есть смысл использовать только для ускорения работы на быстрых дисках
|
||||
|
||||
#### Pool
|
||||
|
||||
| Тип пула | Опция | Мин.дисков/VDEVs | Описание |
|
||||
| -------- | ------------ | :--------------: | --------------------------------- |
|
||||
| RAID-0 | по-умолчанию | 1/1 | сумма дисков, нет избыточности |
|
||||
| RAID-1 | mirror | 2/1 | данные зеркалируются на все диски |
|
||||
| RAID-10 | mirror | 4/2 | сочетание RAID0 и RAID1 |
|
||||
| RAIDZ-1 | raidz | 3/1 | аналог RAID5, одинарная четность |
|
||||
| RAIDZ-2 | raidz2 | 4/1 | аналог RAID6, двойная четность |
|
||||
| RAIDZ-3 | raidz3 | 5/1 | тройная четность |
|
||||
|
||||
RAID0 быстрее RAID1, кот. быстрее RAIDZ-1, кот. быстрее RAIDZ-2, кот. быстрее RAIDZ-3
|
||||
|
||||
Размер пула невозможно уменьшить, только увеличить
|
||||
|
||||
[вверх](#zfs-в-ос-альт-10)
|
||||
|
||||
## Установка
|
||||
|
||||
### Подготовка
|
||||
|
||||
Для включения поддержки ZFS в ОС Альт 10.2 необходимо загрузить соответствующий модуль ядра и утилиту командной строки
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# apt-get update && apt-cache search zfs | grep kernel
|
||||
...
|
||||
kernel-modules-zfs-std-def - ZFS Linux modules
|
||||
kernel-modules-zfs-un-def - ZFS Linux modules
|
||||
kernel-source-zfs - ZFS modules sources for Linux kernel
|
||||
```
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# apt-cache search zfs | grep utils
|
||||
zfs-utils - Native OpenZFS management utilities for Linux
|
||||
```
|
||||
|
||||
В репозитории есть модуль для двух веток ядер: `std-def`, `un-def`. Для того, чтобы понять какой модуль необходим, нужно уточнить какое ядро используется на узле
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# uname -r
|
||||
6.1.83-un-def-alt1
|
||||
```
|
||||
|
||||
Таким образом для включения поддержки на уровне ядра необходимо установить модуль. Т.к. из репозитория будет установлен модуль для актуальной версии ядра, необходимо на узле также выполнить обновление ядра, как и всей системы
|
||||
|
||||
```bash
|
||||
apt-get update && apt-get dist-upgrade -y
|
||||
update-kernel -y
|
||||
reboot
|
||||
```
|
||||
|
||||
[вверх](#zfs-в-ос-альт-10)
|
||||
|
||||
### Установка модуля ядра и утилиты командной строки
|
||||
|
||||
```bash
|
||||
apt-get install kernel-modules-zfs-un-def zfs-utils -y
|
||||
reboot
|
||||
```
|
||||
|
||||
### Загрузка модуля ядра
|
||||
|
||||
Если на узле уже имеются zfs пулы, система их увидит и автоматически загрузит необходимый модуль, если же пулов ещё нет, модуль нужно загрузить
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# modprobe zfs
|
||||
[root@zfs ~]# lsmod | grep zfs
|
||||
zfs 3678208 0
|
||||
zunicode 335872 1 zfs
|
||||
zzstd 581632 1 zfs
|
||||
zlua 176128 1 zfs
|
||||
zavl 16384 1 zfs
|
||||
icp 307200 1 zfs
|
||||
zcommon 94208 2 zfs,icp
|
||||
znvpair 94208 2 zfs,zcommon
|
||||
spl 110592 6 zfs,icp,zzstd,znvpair,zcommon,zavl
|
||||
```
|
||||
|
||||
### Автозагрузка модуля ядра
|
||||
|
||||
Вместе с модулем ядра будет установлен соответствующий конфигурационный файл для автозагрузки `/etc/modules-load.d/zfs.conf`
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# cat /etc/modules-load.d/zfs.conf
|
||||
# The default behavior is to allow udev to load the kernel modules on demand.
|
||||
# Uncomment the following line to unconditionally load them at boot.
|
||||
#zfs
|
||||
```
|
||||
|
||||
В нём необходимо раскоментировать строку zfs
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# cat /etc/modules-load.d/zfs.conf
|
||||
# The default behavior is to allow udev to load the kernel modules on demand.
|
||||
# Uncomment the following line to unconditionally load them at boot.
|
||||
zfs
|
||||
```
|
||||
|
||||
[вверх](#zfs-в-ос-альт-10)
|
||||
|
||||
## Создание пула
|
||||
|
||||
В общем виде создание пула
|
||||
|
||||
```bash
|
||||
zpool create -f -m <mount-point> <pool-name> [raidz(2|3)|mirror] <ids>
|
||||
```
|
||||
|
||||
`-f` - force, очистит диски, если на них есть данные
|
||||
`-m` - указание точки монтирования. По-умолчанию используется `/<pool-name>`
|
||||
|
||||
`<ids>` - в самом простом виде можно использовать имена дисков `/dev/sdb`, но это нежелательно, т.к. при выходе из строя диска `/dev/sdb`, при следующей загрузке системы все последующие диски изменят своё имя - диск, который ранее назывался `/dev/sdc` теперь будет доступен как `/dev/sdb`. Это может привести к полной неработоспособности системы. Поэтому желательным является метод именования дисков по постоянным идентификаторам.
|
||||
|
||||
### Постоянные идентификаторы диска
|
||||
|
||||
- **by-id**
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# ls -lh /dev/disk/by-id
|
||||
итого 0
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 ata-QEMU_DVD-ROM_QM00003 -> ../../sr0
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0 -> ../../sda
|
||||
lrwxrwxrwx 1 root root 10 апр 3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part1 -> ../../sda1
|
||||
lrwxrwxrwx 1 root root 10 апр 3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part2 -> ../../sda2
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 -> ../../sdb
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 -> ../../sdc
|
||||
```
|
||||
|
||||
- **by-path**
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# ls -lh /dev/disk/by-path
|
||||
итого 0
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 pci-0000:00:01.1-ata-2 -> ../../sr0
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 pci-0000:00:01.1-ata-2.0 -> ../../sr0
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 pci-0000:01:01.0-scsi-0:0:0:0 -> ../../sda
|
||||
lrwxrwxrwx 1 root root 10 апр 3 13:13 pci-0000:01:01.0-scsi-0:0:0:0-part1 -> ../../sda1
|
||||
lrwxrwxrwx 1 root root 10 апр 3 13:13 pci-0000:01:01.0-scsi-0:0:0:0-part2 -> ../../sda2
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 pci-0000:01:02.0-scsi-0:0:0:1 -> ../../sdb
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 pci-0000:01:03.0-scsi-0:0:0:2 -> ../../sdc
|
||||
```
|
||||
|
||||
- **GPT labels** - если метка была создана при инициации таблицы разделов GPT
|
||||
|
||||
### Пул из одного диска
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# mkdir -p /srv/zfs_pools/zfs0
|
||||
[root@zfs ~]# ls -lh /dev/disk/by-id | grep sdb
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 -> ../../sdb
|
||||
[root@zfs ~]# zpool create -f -m /srv/zfs_pools/zfs0 zfs0 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1
|
||||
```
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zpool status
|
||||
pool: zfs0
|
||||
state: ONLINE
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
zfs0 ONLINE 0 0 0
|
||||
scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs ~]# df -Th
|
||||
Файловая система Тип Размер Использовано Дост Использовано% Cмонтировано в
|
||||
udevfs devtmpfs 5,0M 96K 5,0M 2% /dev
|
||||
runfs tmpfs 3,9G 644K 3,9G 1% /run
|
||||
/dev/sda2 ext4 30G 3,3G 25G 12% /
|
||||
tmpfs tmpfs 3,9G 0 3,9G 0% /dev/shm
|
||||
tmpfs tmpfs 3,9G 0 3,9G 0% /tmp
|
||||
tmpfs tmpfs 795M 0 795M 0% /run/user/500
|
||||
zfs0 zfs 9,3G 128K 9,3G 1% /srv/zfs_pools/zfs0
|
||||
[root@zfs ~]# zfs list
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
zfs0 123K 9.20G 24K /srv/zfs_pools/zfs0
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
[вверх](#zfs-в-ос-альт-10)
|
||||
|
||||
### Просмотр файловых систем в пуле
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs list
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
zfs0 123K 9.20G 24K /srv/zfs_pools/zfs0
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
### Удаление пула
|
||||
|
||||
```bash
|
||||
zpool destroy zfs0
|
||||
```
|
||||
|
||||
### Создание пула с чередованием (RAID0, 2 VDEVs)
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# ls -lh /dev/disk/by-id/ | grep sd[bc]
|
||||
lrwxrwxrwx 1 root root 9 апр 3 15:14 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 -> ../../sdb
|
||||
lrwxrwxrwx 1 root root 9 апр 3 13:13 scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 -> ../../sdc
|
||||
```
|
||||
|
||||
```bash
|
||||
zpool create -f zpool0 scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 scsi-0QEMU_QEMU_HARDDISK_drive-scsi2
|
||||
```
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zpool status
|
||||
pool: zpool0
|
||||
state: ONLINE
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
zpool0 ONLINE 0 0 0
|
||||
scsi-0QEMU_QEMU_HARDDISK_drive-scsi1 ONLINE 0 0 0
|
||||
scsi-0QEMU_QEMU_HARDDISK_drive-scsi2 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# df -Th
|
||||
Файловая система Тип Размер Использовано Дост Использовано% Cмонтировано в
|
||||
udevfs devtmpfs 5,0M 96K 5,0M 2% /dev
|
||||
runfs tmpfs 3,9G 652K 3,9G 1% /run
|
||||
/dev/sda2 ext4 30G 3,3G 25G 12% /
|
||||
tmpfs tmpfs 3,9G 0 3,9G 0% /dev/shm
|
||||
tmpfs tmpfs 3,9G 0 3,9G 0% /tmp
|
||||
tmpfs tmpfs 795M 0 795M 0% /run/user/500
|
||||
zpool0 zfs 19G 128K 19G 1% /zpool0
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
[вверх](#zfs-в-ос-альт-10)
|
||||
|
||||
|
||||
Больше примеров в [Справочнике команд](zfs_commands.md)
|
||||
830
zfs_commands.md
Normal file
830
zfs_commands.md
Normal file
@@ -0,0 +1,830 @@
|
||||
# ZFS. Справочник команд
|
||||
|
||||
- [ZFS. Справочник команд](#zfs-справочник-команд)
|
||||
- [Работа с пулом ZFS](#работа-с-пулом-zfs)
|
||||
- [Работа с файловой и другими системами ZFS](#работа-с-файловой-и-другими-системами-zfs)
|
||||
- [Файловая система](#файловая-система)
|
||||
- [Snapshots (снапшоты или снимки состояния)](#snapshots-снапшоты-или-снимки-состояния)
|
||||
- [Снова вернемся к пулам](#снова-вернемся-к-пулам)
|
||||
|
||||
Данный справочник является переводом [данной статьи](http://lildude.co.uk/zfs-cheatsheet). Авторы перевода: Евгений Ратников и Сгибнев Михаил.
|
||||
|
||||
Не забывайте про страницы справки по командам работы с ZFS.
|
||||
|
||||
```bash
|
||||
man zpool
|
||||
man zfs
|
||||
```
|
||||
|
||||
Документация доступна на странице проекта - <https://openzfs.github.io/openzfs-docs/index.html#></br>
|
||||
Много примеров в документации FreeBSD - <https://docs.freebsd.org/en/books/handbook/zfs/>
|
||||
|
||||
Так как включить в пул (zpool) можно любые сущности файловой системы, автор приводит примеры построения пулов и работы с ними с использованием простых файлов. Итак, создадим несколько файлов, с которыми будем работать подобно дискам.
|
||||
|
||||
```bash
|
||||
[root@zfs]# cd /
|
||||
[root@zfs /]# for i in {1..3}; do dd if=/dev/zero of=disk$i bs=1M count=1000; done
|
||||
[root@zfs /]# dd if=/dev/zero of=disk4 bs=1M count=500
|
||||
[root@zfs /]# dd if=/dev/zero of=disk5 bs=1M count=1000
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Мы создали 5 «виртуальных дисков». Четыре имеют размер по 1000 Мб, а один - 500 Мб. Это пригодится для демонстрации работы с устройствами (разделами) разной ёмкости.
|
||||
|
||||
## Работа с пулом ZFS
|
||||
|
||||
Теперь создадим простой пул без избыточности, затем проверим его размер и использование.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool create myzfs /disk1 /disk2
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool list
|
||||
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
|
||||
myzfs 1.88G 110K 1.87G - - 0% 0% 1.00x ONLINE -
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Созданы пул автоматически монтируется в каталог `/myzfs`. Посмотрим более детальную информацию о нашем хранилище.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool status
|
||||
pool: myzfs
|
||||
state: ONLINE
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
myzfs ONLINE 0 0 0
|
||||
/disk1 ONLINE 0 0 0
|
||||
/disk2 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Из вывода видно, что в пул включены два диска. Пул без избыточности (не mirror и не RAIDZ).
|
||||
|
||||
[вверх](#zfs-справочник-команд)
|
||||
|
||||
Теперь попробуем удалить только что созданный пул. Должны же мы это уметь.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool destroy myzfs
|
||||
[root@zfs /]# zpool list
|
||||
no pools available
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Попробуем снова создать пул типа `MIRROR` (зеркало), но на этот раз попытаемся включить в него диски разного размера. Zpool не даст нам этого сделать. Чтобы безоговорочно создать такой пул, используйте опцию `-f`, но в этом случае помните --- размер зеркала будет равен объему наименьшего диска.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool create myzfs mirror /disk1 /disk4
|
||||
invalid vdev specification
|
||||
use '-f' to override the following errors:
|
||||
/disk1 is part of active pool 'myzfs'
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Создать зеркалируемое (*MIRROR*) хранилище можно на двух и более устройствах. Сколько устройств в пуле типа `MIRROR` --- столько у нас есть одинаковых копий данных.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool create -f myzfs mirror /disk1 /disk2 /disk3
|
||||
[root@zfs /]# zpool list
|
||||
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
|
||||
myzfs 960M 129K 960M - - 0% 0% 1.00x ONLINE -
|
||||
[root@zfs /]#
|
||||
[root@zfs /]# zpool status
|
||||
pool: myzfs
|
||||
state: ONLINE
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
myzfs ONLINE 0 0 0
|
||||
mirror-0 ONLINE 0 0 0
|
||||
/disk1 ONLINE 0 0 0
|
||||
/disk2 ONLINE 0 0 0
|
||||
/disk3 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Вместо зеркалирования можно использовать массивы `RAID`. Для этого необходимо создавать пул типа `raidz` вместо `mirror`. Подробнее <https://docs.freebsd.org/en/books/handbook/zfs/>.
|
||||
|
||||
[вверх](#zfs-справочник-команд)
|
||||
|
||||
Давайте теперь исключим один из дисков из пула. Так как этот диск относится к зеркалу `MIRROR`, то при его исключении никаких проблем не возникает.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool detach myzfs /disk3
|
||||
[root@zfs /]# zpool status
|
||||
pool: myzfs
|
||||
state: ONLINE
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
myzfs ONLINE 0 0 0
|
||||
mirror-0 ONLINE 0 0 0
|
||||
/disk1 ONLINE 0 0 0
|
||||
/disk2 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Теперь давайте добавим к пулу новый диск. Если пул не был зеркальным, то он им станет после добавления нового диска.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool attach myzfs /disk1 /disk3
|
||||
[root@zfs /]# zpool status
|
||||
pool: myzfs
|
||||
state: ONLINE
|
||||
scan: resilvered 152K in 00:00:00 with 0 errors on Wed Apr 3 16:10:22 2024
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
myzfs ONLINE 0 0 0
|
||||
mirror-0 ONLINE 0 0 0
|
||||
/disk1 ONLINE 0 0 0
|
||||
/disk2 ONLINE 0 0 0
|
||||
/disk3 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
А что будет, если попытаемся *удалить*, а не исключить устройство из пула? Zpool сообщит нам о том, что устройство не может быть удалено. Для начала его нужно отключить.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool remove myzfs /disk3
|
||||
cannot remove /disk3: operation not supported on this type of pool
|
||||
[root@zfs /]# zpool detach myzfs /disk3
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Теперь давайте попробуем добавить диск горячей замены `hot spare` к нашему пулу.
|
||||
|
||||
```bash
|
||||
zpool add myzfs spare /disk3
|
||||
zpool status
|
||||
|
||||
pool: myzfs
|
||||
state: ONLINE
|
||||
scrub: none requested
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
myzfs ONLINE 0 0 0
|
||||
mirror ONLINE 0 0 0
|
||||
/disk1 ONLINE 0 0 0
|
||||
/disk2 ONLINE 0 0 0
|
||||
spares
|
||||
/disk3 AVAIL
|
||||
|
||||
errors: No known data errors
|
||||
```
|
||||
|
||||
А теперь удалим его из пула.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool remove myzfs /disk3
|
||||
[root@zfs /]# zpool status
|
||||
pool: myzfs
|
||||
state: ONLINE
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
myzfs ONLINE 0 0 0
|
||||
mirror-0 ONLINE 0 0 0
|
||||
/disk1 ONLINE 0 0 0
|
||||
/disk2 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
[вверх](#zfs-справочник-команд)
|
||||
|
||||
Теперь попробуем отключить один из дисков. Пока диск отключен, на него не будет производиться запись и с него не будет производиться чтение. Если использовать параметр `-t`, то при перезагрузке сервера диск вернется в состояние онлайн автоматически.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool offline myzfs /disk1
|
||||
[root@zfs /]# zpool status
|
||||
pool: myzfs
|
||||
state: DEGRADED
|
||||
status: One or more devices has been taken offline by the administrator.
|
||||
Sufficient replicas exist for the pool to continue functioning in a
|
||||
degraded state.
|
||||
action: Online the device using 'zpool online' or replace the device with
|
||||
'zpool replace'.
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
myzfs DEGRADED 0 0 0
|
||||
mirror-0 DEGRADED 0 0 0
|
||||
/disk1 OFFLINE 0 0 0
|
||||
/disk2 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Обратите внимание на состояние пула: **DEGRADED**
|
||||
|
||||
Теперь включим этот диск.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool online myzfs /disk1
|
||||
[root@zfs /]# zpool status
|
||||
pool: myzfs
|
||||
state: ONLINE
|
||||
scan: resilvered 36K in 00:00:00 with 0 errors on Wed Apr 3 16:24:12 2024
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
myzfs ONLINE 0 0 0
|
||||
mirror-0 ONLINE 0 0 0
|
||||
/disk1 ONLINE 0 0 0
|
||||
/disk2 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Состояние пула снова **ONLINE**.
|
||||
|
||||
В данный момент в нашем пуле два диска: disk1 и disk2. Также в системе имеется диск disk3, но он не подключен к пулу. Предположим, что disk1 вышел из строя и его нужно заменить на disk3.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool replace myzfs /disk1 /disk3
|
||||
[root@zfs /]# zpool status
|
||||
pool: myzfs
|
||||
state: ONLINE
|
||||
scan: resilvered 264K in 00:00:00 with 0 errors on Wed Apr 3 16:26:44 2024
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
myzfs ONLINE 0 0 0
|
||||
mirror-0 ONLINE 0 0 0
|
||||
/disk3 ONLINE 0 0 0
|
||||
/disk2 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Периодически для исправления ошибок необходимо выполнять процедуру чистки (scrubbing) для пулов типа *MIRROR* или *RAID-Z*. Данная процедура находит ошибки в контрольных суммах и исправляет их. Также восстанавливаются сбойные блоки.
|
||||
|
||||
**Данная операция слишком ресурсоемка! Следует выполнять ее только во время наименьшей нагрузки на пул.**
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool scrub myzfs
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Если необходимо перенести пул в другую систему, то его необходимо сначала экспортировать.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool export myzfs
|
||||
[root@zfs /]# zpool list
|
||||
no pools available
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
[вверх](#zfs-справочник-команд)
|
||||
|
||||
А затем импортировать в новой системе.
|
||||
|
||||
Если ключ `-d` не указать, то команда ищет `/dev/dsk`. Так как в данном примере мы используем файлы, необходимо указать директорию с файлами используемыми хранилищем.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool import -d / myzfs
|
||||
[root@zfs /]# zpool list
|
||||
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
|
||||
myzfs 960M 166K 960M - - 0% 0% 1.00x ONLINE -
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Обновление версии пула. Показать версию используемого пула. Флаг `-v` показывает возможности, поддерживаемые данным пулом. Используйте флаг `-a`, чтобы обновить все доступные пулы до новейшей из них версии. Обновленные пулы больше не будут доступны из систем, на которых работают более старые версии.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool upgrade
|
||||
This system supports ZFS pool feature flags.
|
||||
|
||||
All pools are formatted using feature flags.
|
||||
|
||||
Every feature flags pool has all supported and requested features enabled.
|
||||
[root@zfs /]#
|
||||
[root@zfs /]# zpool upgrade -v
|
||||
This system supports ZFS pool feature flags.
|
||||
|
||||
The following features are supported:
|
||||
|
||||
FEAT DESCRIPTION
|
||||
-------------------------------------------------------------
|
||||
async_destroy (read-only compatible)
|
||||
Destroy filesystems asynchronously.
|
||||
empty_bpobj (read-only compatible)
|
||||
Snapshots use less space.
|
||||
lz4_compress
|
||||
LZ4 compression algorithm support.
|
||||
multi_vdev_crash_dump
|
||||
Crash dumps to multiple vdev pools.
|
||||
spacemap_histogram (read-only compatible)
|
||||
Spacemaps maintain space histograms.
|
||||
enabled_txg (read-only compatible)
|
||||
Record txg at which a feature is enabled
|
||||
hole_birth
|
||||
Retain hole birth txg for more precise zfs send
|
||||
extensible_dataset
|
||||
Enhanced dataset functionality, used by other features.
|
||||
embedded_data
|
||||
Blocks which compress very well use even less space.
|
||||
bookmarks (read-only compatible)
|
||||
"zfs bookmark" command
|
||||
filesystem_limits (read-only compatible)
|
||||
Filesystem and snapshot limits.
|
||||
large_blocks
|
||||
Support for blocks larger than 128KB.
|
||||
large_dnode
|
||||
Variable on-disk size of dnodes.
|
||||
sha512
|
||||
SHA-512/256 hash algorithm.
|
||||
skein
|
||||
Skein hash algorithm.
|
||||
edonr
|
||||
Edon-R hash algorithm.
|
||||
userobj_accounting (read-only compatible)
|
||||
User/Group object accounting.
|
||||
encryption
|
||||
Support for dataset level encryption
|
||||
project_quota (read-only compatible)
|
||||
space/object accounting based on project ID.
|
||||
device_removal
|
||||
Top-level vdevs can be removed, reducing logical pool size.
|
||||
obsolete_counts (read-only compatible)
|
||||
Reduce memory used by removed devices when their blocks are freed or remapped.
|
||||
zpool_checkpoint (read-only compatible)
|
||||
Pool state can be checkpointed, allowing rewind later.
|
||||
spacemap_v2 (read-only compatible)
|
||||
Space maps representing large segments are more efficient.
|
||||
allocation_classes (read-only compatible)
|
||||
Support for separate allocation classes.
|
||||
resilver_defer (read-only compatible)
|
||||
Support for deferring new resilvers when one is already running.
|
||||
bookmark_v2
|
||||
Support for larger bookmarks
|
||||
redaction_bookmarks
|
||||
Support for bookmarks which store redaction lists for zfs redacted send/recv.
|
||||
redacted_datasets
|
||||
Support for redacted datasets, produced by receiving a redacted zfs send stream.
|
||||
bookmark_written
|
||||
Additional accounting, enabling the written#<bookmark> property(space written since a bookmark), and estimates of send stream sizes for incrementals from bookmarks.
|
||||
log_spacemap (read-only compatible)
|
||||
Log metaslab changes on a single spacemap and flush them periodically.
|
||||
livelist (read-only compatible)
|
||||
Improved clone deletion performance.
|
||||
device_rebuild (read-only compatible)
|
||||
Support for sequential mirror/dRAID device rebuilds
|
||||
zstd_compress
|
||||
zstd compression algorithm support.
|
||||
draid
|
||||
Support for distributed spare RAID
|
||||
|
||||
The following legacy versions are also supported:
|
||||
|
||||
VER DESCRIPTION
|
||||
--- --------------------------------------------------------
|
||||
1 Initial ZFS version
|
||||
2 Ditto blocks (replicated metadata)
|
||||
3 Hot spares and double parity RAID-Z
|
||||
4 zpool history
|
||||
5 Compression using the gzip algorithm
|
||||
6 bootfs pool property
|
||||
7 Separate intent log devices
|
||||
8 Delegated administration
|
||||
9 refquota and refreservation properties
|
||||
10 Cache devices
|
||||
11 Improved scrub performance
|
||||
12 Snapshot properties
|
||||
13 snapused property
|
||||
14 passthrough-x aclinherit
|
||||
15 user/group space accounting
|
||||
16 stmf property support
|
||||
17 Triple-parity RAID-Z
|
||||
18 Snapshot user holds
|
||||
19 Log device removal
|
||||
20 Compression using zle (zero-length encoding)
|
||||
21 Deduplication
|
||||
22 Received properties
|
||||
23 Slim ZIL
|
||||
24 System attributes
|
||||
25 Improved scrub stats
|
||||
26 Improved snapshot deletion performance
|
||||
27 Improved snapshot creation performance
|
||||
28 Multiple vdev replacements
|
||||
|
||||
For more information on a particular version, including supported releases,
|
||||
see the ZFS Administration Guide.
|
||||
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
Если нужно получить статистику по операциям ввода/вывода пулов, выполняем команду.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zpool iostat 5
|
||||
capacity operations bandwidth
|
||||
pool alloc free read write read write
|
||||
---------- ----- ----- ----- ----- ----- -----
|
||||
myzfs 135K 960M 0 1 4.17K 8.67K
|
||||
myzfs 135K 960M 0 0 0 0
|
||||
myzfs 135K 960M 0 0 0 0
|
||||
myzfs 135K 960M 0 0 0 0
|
||||
myzfs 135K 960M 0 0 0 0
|
||||
^C
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
[вверх](#zfs-справочник-команд)
|
||||
|
||||
## Работа с файловой и другими системами ZFS
|
||||
|
||||
### Файловая система
|
||||
|
||||
Создадим файловую систему в нашем пуле. Затем проверим автомонтирование новой файловой системы.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zfs create myzfs/colin
|
||||
[root@zfs ~]# df -Th | grep zfs
|
||||
myzfs zfs 832M 128K 832M 1% /myzfs
|
||||
myzfs/colin zfs 832M 128K 832M 1% /myzfs/colin
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Получить список файловых систем ZFS можно следующей командой.
|
||||
|
||||
```bash
|
||||
[root@zfs /]# zfs list
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs 171K 832M 24K /myzfs
|
||||
myzfs/colin 24K 832M 24K /myzfs/colin
|
||||
[root@zfs /]#
|
||||
```
|
||||
|
||||
В данный момент в нашем пуле имеется одно зеркало, в которое входят два диска: disk2 и disk3.
|
||||
|
||||
Давайте попробуем расширить наш пул. Попытаемся добавить к нему disk1
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zpool add myzfs /disk1
|
||||
invalid vdev specification
|
||||
use '-f' to override the following errors:
|
||||
mismatched replication level: pool uses mirror and new vdev is file
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Попытка добавления не удалась, т.к. она неоднозначна и при добавлении диска к существующему зеркалу необходимо указать дополнительно один из
|
||||
существующих в этом зеркале дисков, либо добавить минимум два диска для формирования нового зеркала, которое будет входить в данный пул.
|
||||
|
||||
Добавим к пулу новое зеркало, состоящее из дисков: disk1 и disk5
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zpool add myzfs mirror /disk1 /disk5
|
||||
[root@zfs ~]# zpool status
|
||||
pool: myzfs
|
||||
state: ONLINE
|
||||
scan: scrub repaired 0B in 00:00:00 with 0 errors on Wed Apr 3 16:27:35 2024
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
myzfs ONLINE 0 0 0
|
||||
mirror-0 ONLINE 0 0 0
|
||||
//disk3 ONLINE 0 0 0
|
||||
//disk2 ONLINE 0 0 0
|
||||
mirror-1 ONLINE 0 0 0
|
||||
/disk1 ONLINE 0 0 0
|
||||
/disk5 ONLINE 0 0 0
|
||||
|
||||
errors: No known data errors
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Добавим теперь к пулу еще одну файловую систему и посмотрим, как это отразится на размере файловых систем, входящих в пул.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs create myzfs/colin2
|
||||
[root@zfs ~]# zfs list
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs 216K 1.75G 24K /myzfs
|
||||
myzfs/colin 24K 1.75G 24K /myzfs/colin
|
||||
myzfs/colin2 24K 1.75G 24K /myzfs/colin2
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Обе файловые системы, входящие в пул, по объему равны всему пулу. В этом заключается одно из преимуществ системы ZFS --- по-умолчанию нет никакого ограничения на файловые системы.
|
||||
|
||||
Чтобы явно управлять объемом файловых систем, можно прибегнуть к резервированию --- выделению гарантированного объема для файловой системы, либо квотированию --- ограничению файловой системы по максимальному объему.
|
||||
|
||||
Давайте зарезервируем для файловой системы `/myzfs/colin` место в пуле, равное 200 Мб. Остальные файловые системы, заполняя пул, в любом случае
|
||||
оставят для этой файловой системы 200 Мб места.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs set reservation=200m myzfs/colin
|
||||
[root@zfs ~]# zfs list -o reservation
|
||||
RESERV
|
||||
none
|
||||
200M
|
||||
none
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Теперь для файловой системы `/myzfs/colin2` установим квоту в 250 Мб. Это означает, что данная файловая система не сможет занять в пуле более 250
|
||||
Мб, даже если пул будет полностью свободным.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs set quota=250m myzfs/colin2
|
||||
[root@zfs ~]# zfs list -o quota myzfs/colin myzfs/colin2
|
||||
QUOTA
|
||||
none
|
||||
250M
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
[вверх](#zfs-справочник-команд)
|
||||
|
||||
Также для файловой системы `/myzfs/colin2` включим сжатие. Сжатие достаточно эффективно работает на уровне ZFS практически без потерь производительности (конечно же, при условии, что производительности сервера достаточно).
|
||||
|
||||
ZFS использует несколько различных алгоритмов сжатия, оптимизированных для различных типов данных:
|
||||
|
||||
- **LZ4** – Алгоритм по-умолчанию, использующий сжатие LZ4. Предпочтение отдается скорости, а не степени сжатия.
|
||||
- **LZJB** – Устаревший формат с приемлемым сжатием и скоростью.
|
||||
- **Gzip** – Стандартное сжатие gzip. Несколько уровней сжатия от 1 до 9, чем выше, тем лучше, но медленнее.
|
||||
- **ZLE** оптимизирован для нулевых блоков.
|
||||
|
||||
Алгоритмы адаптивно выбирают оптимальную стратегию сжатия для каждого типа данных.
|
||||
|
||||
При этом, вместо `compression=on` можно явно указать алгоритм сжатия `compression=gzip-9`, `compression=lzjb`, `compression=zle` и т.д.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs set compression=on myzfs/colin2
|
||||
[root@zfs ~]# zfs list -o compression
|
||||
COMPRESS
|
||||
off
|
||||
off
|
||||
on
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Чтобы сделать файловую систему доступной по протоколу NFS, достаточно выполнить одну команду. Причем после перезагрузки сервера доступ к файловой системе утерян не будет. Никаких дополнительных настроек операционной системы производить не нужно.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs set sharenfs=on myzfs/colin2
|
||||
[root@zfs ~]# zfs get sharenfs myzfs/colin2
|
||||
NAME PROPERTY VALUE SOURCE
|
||||
myzfs/colin2 sharenfs on local
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Точно так же в одну команду ресурс можно сделать доступным по протоколу SMB. Что пользователям ОС Windows наверняка пригодится. В системе должен быть установлен пакет `samba-usershares`.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs set sharesmb=on myzfs/colin2
|
||||
[root@zfs ~]# zfs get sharesmb myzfs/colin2
|
||||
NAME PROPERTY VALUE SOURCE
|
||||
myzfs/colin2 sharesmb on local
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Для повышения надежности (если у вас обычный пул, без избыточности), можно использовать следующую опцию файловой системы.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs set copies=2 myzfs/colin2
|
||||
[root@zfs ~]# zfs get copies myzfs/colin2
|
||||
NAME PROPERTY VALUE SOURCE
|
||||
myzfs/colin2 copies 2 local
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Теперь в файловой системе будет храниться по две копии каждого блока. Это имеет смысл, если пул без избыточности (*mirror* / *raidz*).
|
||||
|
||||
[вверх](#zfs-справочник-команд)
|
||||
|
||||
### Snapshots (снапшоты или снимки состояния)
|
||||
|
||||
Создать снапшот файловой системы очень просто. Давайте создадим снапшот для файловой системы `myzfs/colin` и назовем его *test*.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs snapshot myzfs/colin@test
|
||||
[root@zfs ~]# zfs list -t snapshot
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs/colin@test 0B - 24K -
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Если появится необходимость отката к снапшоту, достаточно выполнить одну команду.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs rollback myzfs/colin@test
|
||||
```
|
||||
|
||||
Снапшот можно подмониторовать, как обычно. Например так.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# mount -t zfs myzfs/colin@test /mnt
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# mount | grep /mnt
|
||||
myzfs/colin@test on /mnt type zfs (ro,relatime,xattr,noacl)
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# umount /mnt
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Даже можно клонировать файловую системы из снапшота в новую файловую систему.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs clone myzfs/colin@test myzfs/colin3
|
||||
[root@zfs ~]# zfs list
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs 200M 1.55G 25K /myzfs
|
||||
myzfs/colin 24K 1.75G 24K /myzfs/colin
|
||||
myzfs/colin2 24K 250M 24K /myzfs/colin2
|
||||
myzfs/colin3 0B 1.55G 24K /myzfs/colin3
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Теперь давайте удалим наши файловые системы `/myzfs/colin` и `/myzfs/colin2`
|
||||
|
||||
Сперва удалим пустую файловую систему `/myzfs/colin2`
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs destroy myzfs/colin2
|
||||
[root@zfs ~]# zfs list
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs 200M 1.55G 25K /myzfs
|
||||
myzfs/colin 24K 1.75G 24K /myzfs/colin
|
||||
myzfs/colin3 0B 1.55G 24K /myzfs/colin3
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
[вверх](#zfs-справочник-команд)
|
||||
|
||||
Файловая система удалилась без проблем. Теперь удалим файловую систему, для которой существует снапшот.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs destroy myzfs/colin
|
||||
cannot destroy 'myzfs/colin': filesystem has children
|
||||
use '-r' to destroy the following datasets:
|
||||
myzfs/colin@test
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Удаление невозможно, т.к. у файловой системы имеется дочерний объект. Можно воспользоваться параметром `-r` чтобы удалить файловую систему
|
||||
вместе со всеми дочерними объектами рекурсивно.
|
||||
|
||||
Мы можем отключить снапшот от `/myzfs/colin` и оставить его дочерним только для `/myzfs/colin3`
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs list -t snapshot
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs/colin@test 0B - 24K -
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# zfs promote myzfs/colin3
|
||||
[root@zfs ~]# zfs list -t snapshot
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs/colin3@test 0B - 24K -
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# zfs destroy myzfs/colin
|
||||
[root@zfs ~]# zfs list
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs 264K 1.75G 24K /myzfs
|
||||
myzfs/colin3 24K 1.75G 24K /myzfs/colin3
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# zfs list -t snapshot
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs/colin3@test 0B - 24K -
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Теперь сделанный ранее снапшот для `/myzfs/colin` стал дочерним объектом `/myzfs/colin3`. Таким образом у файловой системы `/myzfs/colin` больше нет дочерних объектов и ее можно без труда разобрать (удалить).
|
||||
|
||||
Если вдруг понадобиться переименовать ранее созданную файловую систему или снапшот, то можно воспользоваться следующими командами.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs rename myzfs/colin3 myzfs/bob
|
||||
[root@zfs ~]# zfs list
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs 270K 1.75G 25K /myzfs
|
||||
myzfs/bob 24K 1.75G 24K /myzfs/bob
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# zfs rename myzfs/bob@test myzfs/bob@newtest
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# zfs list -t snapshot
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs/bob@newtest 0B - 24K -
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
[вверх](#zfs-справочник-команд)
|
||||
|
||||
### Снова вернемся к пулам
|
||||
|
||||
Получить полную информацию о пулах можно следующим образом.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs get all
|
||||
NAME PROPERTY VALUE SOURCE
|
||||
myzfs type filesystem -
|
||||
myzfs creation Ср апр 3 16:15 2024 -
|
||||
myzfs used 270K -
|
||||
myzfs available 1.75G -
|
||||
myzfs referenced 25K -
|
||||
myzfs compressratio 1.00x -
|
||||
[...]
|
||||
```
|
||||
|
||||
Если пул нам более не нужен, можем его удалить. **(не выполняйте это сейчас. Пул нам еще понадобится далее)**
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zpool destroy myzfs
|
||||
[root@zfs ~]# zfs list
|
||||
no datasets available
|
||||
[root@zfs ~]# zpool status
|
||||
no pools available
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Отключить файловую систему от пула можно командой `unmount` или `umount`.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# df -Th | grep zfs
|
||||
myzfs zfs 1,8G 128K 1,8G 1% /myzfs
|
||||
myzfs/bob zfs 1,8G 128K 1,8G 1% /myzfs/bob
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# zfs umount myzfs/bob
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# df -Th | grep zfs
|
||||
myzfs zfs 1,8G 128K 1,8G 1% /myzfs
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Подключить файловую систему к пулу вот так.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs mount myzfs/bob
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# df -Th | grep zfs
|
||||
myzfs zfs 1,8G 128K 1,8G 1% /myzfs
|
||||
myzfs/bob zfs 1,8G 128K 1,8G 1% /myzfs/bob
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Снапшот можно сделать и на удаленный ресурс (или другое место в локальной системе).
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zfs send myzfs/bob@newtest | ssh localhost zfs receive myzfs/backup
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# zfs list
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs 218K 1.75G 25K /myzfs
|
||||
myzfs/backup 24K 1.75G 24K /myzfs/backup
|
||||
myzfs/bob 24K 1.75G 24K /myzfs/bob
|
||||
[root@zfs ~]#
|
||||
[root@zfs ~]# zfs list -t snapshot
|
||||
NAME USED AVAIL REFER MOUNTPOINT
|
||||
myzfs/backup@newtest 0B - 24K -
|
||||
myzfs/bob@newtest 0B - 24K -
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
В данном случае снапшот передан `zfs receive` на локальном узле (в демонстрационных целях). В реальной ситуации таким образом можно сделать снапшот на другой узел сети.
|
||||
|
||||
Zpool ведет собственную историю всех команд. Посмотреть историю можно следующим образом.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zpool history
|
||||
History for 'myzfs':
|
||||
2024-04-04.12:47:12 zpool create -f myzfs mirror /disk1 /disk2
|
||||
2024-04-04.12:50:17 zfs create myzfs/colin3
|
||||
2024-04-04.12:51:01 zfs set compression=on myzfs/colin3
|
||||
2024-04-04.12:53:42 zpool add myzfs mirror /disk3 /disk5
|
||||
2024-04-04.12:55:27 zfs snapshot myzfs/colin3@test
|
||||
2024-04-04.12:55:43 zfs rename myzfs/colin3 myzfs/bob
|
||||
2024-04-04.12:55:50 zfs rename myzfs/bob@test myzfs/bob@newtest
|
||||
2024-04-04.13:02:15 zfs receive myzfs/backup
|
||||
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
Ну вот. Основные команды для работы с пулами ZFS усвоены.
|
||||
|
||||
Теперь можно удалить сам пул и файлы. Они нам больше не пригодятся.
|
||||
|
||||
```bash
|
||||
[root@zfs ~]# zpool destroy myzfs
|
||||
[root@zfs ~]#
|
||||
```
|
||||
|
||||
[вверх](#zfs-справочник-команд)
|
||||
198
Перенос_системы_на_другой_раздел.md
Normal file
198
Перенос_системы_на_другой_раздел.md
Normal file
@@ -0,0 +1,198 @@
|
||||
# Перенос системы на новый раздел
|
||||
|
||||
```shell
|
||||
❯ lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINTS
|
||||
NAME FSTYPE SIZE MOUNTPOINTS
|
||||
nvme0n1 953,9G
|
||||
├─nvme0n1p1 vfat 499M /boot/efi
|
||||
├─nvme0n1p2 ext4 100G
|
||||
├─nvme0n1p3 ext4 400G /home/da2001/oldhome
|
||||
└─nvme0n1p4 ext4 453,4G /
|
||||
❯ df -h | grep nvm
|
||||
/dev/nvme0n1p4 446G 121G 302G 29% /
|
||||
/dev/nvme0n1p3 393G 254G 120G 68% /home/da2001/oldhome
|
||||
```
|
||||
|
||||
```shell
|
||||
❯ cat /etc/fstab
|
||||
proc /proc proc nosuid,noexec,gid=proc 0 0
|
||||
devpts /dev/pts devpts nosuid,noexec,gid=tty,mode=620,ptmxmode=0666 0 0
|
||||
#tmpfs /tmp tmpfs nosuid 0 0
|
||||
UUID=11cb9b94-71bd-4ed2-9467-9e9172525593 / ext4 relatime 1 1
|
||||
UUID=39FA-63AA /boot/efi vfat umask=0,quiet,showexec,iocharset=utf8,codepage=866 1 2
|
||||
# installer-feature-swapfile
|
||||
/swap swap swap defaults 0 0
|
||||
UUID=b1493839-453c-455e-8850-1ab33ca3f511 /home/da2001/oldhome ext4 relatime 0 0
|
||||
```
|
||||
|
||||
```shell
|
||||
❯ ls -ln /home
|
||||
итого 4
|
||||
drwx------ 40 1000 1000 4096 мар 26 15:12 da2001
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
Задача сделать следующую разметку:
|
||||
|
||||
```shell
|
||||
nvme0n1 953,9G
|
||||
├─nvme0n1p1 vfat 499M /boot/efi
|
||||
├─nvme0n1p2 ext4 100G /
|
||||
├─nvme0n1p3 ext4 400G /home
|
||||
└─nvme0n1p4 ext4 453,4G /other
|
||||
```
|
||||
|
||||
## План действий
|
||||
|
||||
### Создание снимка всего диска с помощью Clonezilla на NAS
|
||||
|
||||
| Параметр | Значение |
|
||||
|--------------|-----------------------------------|
|
||||
| DNS | 192.168.13.1 |
|
||||
| NAS | nas.dav.lan или 192.168.13.5 |
|
||||
| Пользователь | da2001 |
|
||||
| Путь | /mnt/main/data/Backup/bkp_sapelen |
|
||||
|
||||
### Копирование текущей системы в LiveUSB на NAS
|
||||
|
||||
1. Смонтировать текущий корневой раздел в /mnt
|
||||
|
||||
```shell
|
||||
mount /dev/nvme0n1p4 /mnt
|
||||
```
|
||||
|
||||
2. Скопировать текущую систему на NAS
|
||||
|
||||
```shell
|
||||
rsync -ahHAXS --numeric-ids --info=progress2 --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*"} -e "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" /mnt da2001@192.168.13.5:/mnt/main/data/Backup/bkp_sapelen
|
||||
```
|
||||
|
||||
### Подготовка разделов (LiveUSB)
|
||||
|
||||
1. Форматируем `nvme0n1p2` (новый корень)
|
||||
|
||||
```shell
|
||||
mkfs.ext4 /dev/nvme0n1p2
|
||||
```
|
||||
|
||||
2. Форматируем `nvme0n1p3` (новый `/home`) — на нём сейчас `oldhome` - уже не нужен
|
||||
|
||||
```shell
|
||||
mkfs.ext4 /dev/nvme0n1p3
|
||||
```
|
||||
|
||||
3. `nvme0n1p4` (старый корень) **!НЕ ФОРМАТИРУЕМ!** — на нём текущая система
|
||||
|
||||
На завершающем шаге смотнируем его в `/other`, данные сохранятся
|
||||
|
||||
4. Копирование системы
|
||||
|
||||
- Создаём точки монтирования
|
||||
|
||||
```shell
|
||||
umount /mnt
|
||||
mkdir -p /mnt/new_root /mnt/old_root
|
||||
```
|
||||
|
||||
- Монтируем новый корень
|
||||
|
||||
```shell
|
||||
mount /dev/nvme0n1p2 /mnt/new_root
|
||||
```
|
||||
|
||||
- Монтируем старый корень (текущая система) только для чтения
|
||||
|
||||
```shell
|
||||
mount -o ro /dev/nvme0n1p4 /mnt/old_root
|
||||
```
|
||||
|
||||
- Копируем систему на новый раздел
|
||||
|
||||
```shell
|
||||
rsync -ahHAXS --numeric-ids --info=progress2 \
|
||||
/mnt/old_root/ /mnt/new_root/ \
|
||||
--exclude=/home
|
||||
```
|
||||
|
||||
- Настройка fstab
|
||||
|
||||
```shell
|
||||
blkid
|
||||
vim /mnt/new_root/etc/fstab
|
||||
```
|
||||
|
||||
```shell
|
||||
UUID=<UUID-nvme0n1p1> /boot/efi vfat umask=0,quiet,showexec,iocharset=utf8,codepage=866 1 2
|
||||
UUID=<UUID-nvme0n1p2> / ext4 relatime 1 1
|
||||
UUID=<UUID-nvme0n1p3> /home ext4 relatime 1 2
|
||||
UUID=<UUID-nvme0n1p4> /other ext4 relatime 0 0
|
||||
```
|
||||
|
||||
5. Перенос `/home`
|
||||
|
||||
- Монтируем новый home раздел
|
||||
|
||||
```shell
|
||||
mount /dev/nvme0n1p3 /mnt/new_root/home
|
||||
```
|
||||
|
||||
- Копируем данные в новый home
|
||||
|
||||
```shell
|
||||
rsync -ahHAXS --numeric-ids --info=progress2 /mnt/old_root/home/da2001/ /mnt/new_root/home/da2001/
|
||||
chown -R 1000:1000 /mnt/new_root/home/da2001
|
||||
```
|
||||
|
||||
6. Обновление загрузчика
|
||||
|
||||
- Монтируем системные каталоги
|
||||
|
||||
```shell
|
||||
# mount /dev/nvme0n1p2 /mnt/new_root - уже должен быть смонтирован
|
||||
mount --bind /dev /mnt/new_root/dev
|
||||
mount --bind /proc /mnt/new_root/proc
|
||||
mount --bind /sys /mnt/new_root/sys
|
||||
mount /dev/nvme0n1p1 /mnt/new_root/boot/efi
|
||||
```
|
||||
|
||||
- Меняем корень - chroot
|
||||
|
||||
```shell
|
||||
chroot /mnt/new_root
|
||||
```
|
||||
|
||||
- Внутри chroot — проверка текущего состояния
|
||||
|
||||
```shell
|
||||
# Проверяем, что видим правильные разделы
|
||||
lsblk
|
||||
|
||||
# Проверяем, что EFI раздел примонтирован
|
||||
mount | grep efi
|
||||
```
|
||||
|
||||
- Генерируем новую конфигурацию GRUB
|
||||
|
||||
```shell
|
||||
grub-mkconfig -o /boot/grub/grub.cfg
|
||||
```
|
||||
|
||||
- Устанавливаем загрузчик в EFI
|
||||
|
||||
```shell
|
||||
grub-install --target=x86_64-efi \
|
||||
--efi-directory=/boot/efi \
|
||||
--bootloader-id=altlinux \
|
||||
--recheck
|
||||
```
|
||||
|
||||
Можно перезагружать систему и проверять.
|
||||
|
||||
После успешной загрузки стоит удалить лишние записи
|
||||
|
||||
```shell
|
||||
sudo efibootmgr -v
|
||||
```
|
||||
|
||||
и исправить меню grub, также удалить лишнее
|
||||
150
Приветствие ssh Debian 12.md
Normal file
150
Приветствие ssh Debian 12.md
Normal file
@@ -0,0 +1,150 @@
|
||||
# Приветствие консоли сервера
|
||||
|
||||
Изначально видим
|
||||
|
||||
```shell
|
||||
Linux test 6.1.0-23-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) 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: Fri Jun 27 12:51:16 2025 from 192.168.13.110
|
||||
```
|
||||
|
||||
## За отказ от ответственности
|
||||
|
||||
```shell
|
||||
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`
|
||||
для его быстрой очистки используем
|
||||
|
||||
```shell
|
||||
sudo :> /etc/motd
|
||||
```
|
||||
|
||||
## Информация о последнем подключении
|
||||
|
||||
```shell
|
||||
Last login: Fri Jun 27 12:51:16 2025 from 192.168.13.110
|
||||
```
|
||||
|
||||
Чтобы отключить сообщение о последнем входе (что не рекомендуется), надо отредактировать `/etc/ssh/sshd_config`
|
||||
заменить `yes` на `no`: `PrintLastLog no`
|
||||
|
||||
## Вывод данных о системе
|
||||
|
||||
```shell
|
||||
Linux bastion 6.12.25+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.25-1+rpt1 (2025-04-30) aarch64
|
||||
```
|
||||
|
||||
Содержится в файле `/etc/update-motd.d/10-uname`
|
||||
Чтобы отключить его вывод, достаточно снять с файла права на запуск
|
||||
|
||||
## Свой скрипт вывода
|
||||
|
||||
_Можно создавать свои скрипты, которые будут отображаться при успешной авторизации. Эти скрипты хранятся по адресу `/etc/update-motd.d`_
|
||||
|
||||
```shell
|
||||
sudo vim /etc/update-motd.d/11-custom
|
||||
```
|
||||
|
||||
```shell
|
||||
#!/bin/sh
|
||||
|
||||
# Text Color Variables http://misc.flogisoft.com/bash/tip_colors_and_formatting
|
||||
COLOR_LIGHT_GRAY="\033[00;37m"
|
||||
COLOR_DARK_GRAY="\033[01;30m"
|
||||
COLOR_LIGHT_RED="\033[01;31m"
|
||||
COLOR_LIGHT_GREEN="\033[01;32m"
|
||||
COLOR_LIGHT_BLUE="\033[01;34m"
|
||||
COLOR_LIGHT_PURPLE="\033[01;35m"
|
||||
COLOR_LIGHT_CYAN="\033[01;36m"
|
||||
COLOR_WHITE="\033[01;37m"
|
||||
COLOR_RESET="\033[0m"
|
||||
COLOR_ORANGE="\033[38;5;209m"
|
||||
|
||||
# Функция для определения времени суток
|
||||
get_time_greeting() {
|
||||
local hour=$(date +"%H")
|
||||
if [ $hour -lt 12 -a $hour -ge 4 ]; then
|
||||
echo "Доброе утро!"
|
||||
elif [ $hour -lt 17 -a $hour -ge 12 ]; then
|
||||
echo "Добрый день!"
|
||||
elif [ $hour -lt 23 -a $hour -ge 17 ]; then
|
||||
echo "Добрый вечер!"
|
||||
else
|
||||
echo "Доброй ночи!"
|
||||
fi
|
||||
}
|
||||
|
||||
# Получить время работы системы
|
||||
get_uptime() {
|
||||
local uptime_seconds=$(cat /proc/uptime | cut -f1 -d.)
|
||||
local days=$((uptime_seconds/60/60/24))
|
||||
local hours=$((uptime_seconds/60/60%24))
|
||||
local minutes=$((uptime_seconds/60%60))
|
||||
echo "$days дней $hours часов $minutes минут"
|
||||
}
|
||||
|
||||
# Получить информацию о системе
|
||||
get_system_info() {
|
||||
# Загрузка системы
|
||||
local load_average=$(cat /proc/loadavg | awk '{print $1}')
|
||||
local process_count=$(ps aux | wc -l)
|
||||
|
||||
# Сетевые данные
|
||||
local ip_address=$(hostname --all-ip-addresses)
|
||||
|
||||
# Вывод информации
|
||||
printf "%b\n" "$COLOR_DARK_GRAY================================================================================$COLOR_RESET"
|
||||
printf "%b %-80s %b%s%b\n" "$COLOR_LIGHT_GRAY" "$(get_time_greeting)" "$COLOR_ORANGE" "$(logname)" "$COLOR_RESET"
|
||||
printf "%b\n" "$COLOR_DARK_GRAY================================================================================$COLOR_RESET"
|
||||
|
||||
printf "%b * Хост :%b %-50s%b\n" "$COLOR_LIGHT_GRAY" "$COLOR_WHITE" "$(hostname -f)" "$COLOR_RESET"
|
||||
printf "%b * IP Адрес :%b %-50s%b\n" "$COLOR_LIGHT_GRAY" "$COLOR_WHITE" "$ip_address" "$COLOR_RESET"
|
||||
printf "%b * Версия :%b %-50s%b\n" "$COLOR_LIGHT_GRAY" "$COLOR_WHITE" "$(lsb_release -s -d)" "$COLOR_RESET"
|
||||
printf "%b * Ядро : %-50s%b\n" "$COLOR_LIGHT_GRAY" "$(uname -a | awk '{print $1" "$3" "$12}')" "$COLOR_RESET"
|
||||
printf "%b * Пользователи : Авторизованных пользователей - %-30s%b\n" "$COLOR_LIGHT_GRAY" "$(users | wc -w)" "$COLOR_RESET"
|
||||
printf "%b * Время на сервере : %-50s%b\n" "$COLOR_LIGHT_GRAY" "$(date +"%A, %d %B %Y г., %T")" "$COLOR_RESET"
|
||||
printf "%b * Загрузка системы : %-50s%b\n" "$COLOR_LIGHT_GRAY" "$load_average / $process_count запущенных процессов" "$COLOR_RESET"
|
||||
printf "%b * Память, RAM : Исп.: %-4s Мб / Всего: %-4s Мб%b\n" "$COLOR_LIGHT_GRAY" "$memory_used" "$memory_total" "$COLOR_RESET"
|
||||
printf "%b * SWAP : Исп.: %-4s Мб / Всего: %-4s Мб%b\n" "$COLOR_LIGHT_GRAY" "$swap_used" "$swap_total" "$COLOR_RESET"
|
||||
printf "%b * После включения : %-50s%b\n" "$COLOR_LIGHT_GRAY" "$(get_uptime)" "$COLOR_RESET"
|
||||
printf "%b\n" "$COLOR_DARK_GRAY================================================================================$COLOR_RESET"
|
||||
printf "%b * Диски:%b\n" "$COLOR_LIGHT_GRAY" "$COLOR_RESET"
|
||||
df -h | awk 'NR==1 || ($1 ~ /^\/dev\// && $6 !~ /^\/run|\/dev|\/sys|\/proc|\/snap/)' | sed "s/^/ /"
|
||||
printf "%b\n" "$COLOR_DARK_GRAY================================================================================$COLOR_RESET"
|
||||
printf "%b * ОЗУ:%b\n" "$COLOR_LIGHT_GRAY" "$COLOR_RESET"
|
||||
free -h
|
||||
printf "%b\n" "$COLOR_DARK_GRAY================================================================================$COLOR_RESET"
|
||||
printf "%b\n" "$COLOR_RESET"
|
||||
}
|
||||
|
||||
# Основной вызов
|
||||
get_system_info
|
||||
```
|
||||
|
||||
Делаем файл исполняемым
|
||||
|
||||
```shell
|
||||
sudo chmod +x /etc/update-motd.d/11-custom
|
||||
```
|
||||
|
||||
Для проверки работы
|
||||
|
||||
```shell
|
||||
run-parts /etc/update-motd.d/
|
||||
```
|
||||
|
||||
После перезагрузки видим, что-то типа:
|
||||

|
||||
165
Самоподписный сертификат (ssl).md
Normal file
165
Самоподписный сертификат (ssl).md
Normal file
@@ -0,0 +1,165 @@
|
||||
# Создание самоподписанного сертификата для локального домена
|
||||
|
||||
В системе необходимо наличие пакета `openssl`
|
||||
|
||||
Debian - `sudo apt install openssl`
|
||||
|
||||
***
|
||||
|
||||
## Простой путь
|
||||
|
||||
Генерируется самоподписный wildcard сертификат для одного домена. Чтобы браузеры доверяли этому сертификату, его необходимо добавить в доверенные.
|
||||
|
||||
### Подготовительный этап
|
||||
|
||||
Создадим директорию в которой будут созданы ключ и сертификат
|
||||
|
||||
```bash
|
||||
mkdir /home/$USER/cert && cd /home/$USER/cert
|
||||
```
|
||||
|
||||
### Создаём ключ SSL и файлы сертификата
|
||||
|
||||
```bash
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /home/$USER/cert/astra.lan.key -out /home/$USER/cert/astra.lan.crt
|
||||
```
|
||||
|
||||
`req -x509` - указывает, что мы хотим использовать управление запросами на подписание сертификатов X.509 (CSR). X.509 — это инфраструктура открытых ключей, используемая стандартами SSL и TLS для управления ключами и сертификатами;
|
||||
`-nodes` - предписывает OpenSSL пропустить опцию защиты нашего сертификата кодовой фразой;
|
||||
`-days 365` - эта опция устанавливает период действия сертификата. Здесь мы устанавливаем срок действия в один год. Многие современные браузеры отклоняют любые сертификаты, срок действия которых превышает один год;
|
||||
`-newkey rsa:2048` - указывает, что мы хотим сгенерировать новый сертификат и новый ключ одновременно. Мы не создали требуемый ключ для подписи сертификата на предыдущем шаге, и поэтому нам нужно создать его вместе с сертификатом. Часть rsa:2048 предписывает создать ключ RSA длиной 2048 бит;
|
||||
`-keyout` - эта строка указывает OpenSSL, где разместить генерируемый файл закрытого ключа;
|
||||
`-out` - указывает OpenSSL, где разместить создаваемый сертификат.
|
||||
|
||||
Далее необходимо ответить на вопросы. Наиболее важная строка `Common Name`. Нужно ввести имя узла, которое будет использоваться для доступа к серверу. Чтобы иметь возможность использования сертификата в поддоменах, необходимо в имени указать маску поддоменов - `*.`. Например Common name для wildcard сертификата для домена astra.lan будет выглядеть так - `*.astra.lan`.
|
||||
|
||||
***
|
||||
|
||||
## Путь сложнее - для нескольких сертификатов
|
||||
|
||||
Если стоит задача сгенерировать несколько сертификатов для разных доменов, мы это можем сделать используя описанный выше простой путь, но, чтобы браузер не ругался на наши самоподписные сертификаты, каждый из них нужно добавить в исключения. Если таких сертификатов много, делать это долго и скучно.
|
||||
|
||||
Для решения такой задачи можно пойти другим путём:
|
||||
|
||||
- создать конревой сертификат;
|
||||
- на основе корневого сертификата создать промежуточные запросы на подписание сертификатов для каждого домена;
|
||||
- сегенерировать сертификаты для каждого домена, подписанные нашим корневым сертификатом;
|
||||
- добавить в исключения в браузер наш корневой сертификат.
|
||||
|
||||
### Подготовительный этап
|
||||
|
||||
```bash
|
||||
mkdir /home/$USER/cert && cd /home/$USER/cert
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
### Сформируем закрытый ключ
|
||||
|
||||
```bash
|
||||
openssl genrsa -out rootCA.key 2048
|
||||
```
|
||||
|
||||
`genrsa` - создать закрытый ключ RSA
|
||||
`-out` - выходной файл
|
||||
Получим файл: `rootCA.key`
|
||||
|
||||
### Создаем корневой сертификат с использованием сгенерированого ключа
|
||||
|
||||
```bash
|
||||
openssl req -new -x509 -days 365 -key rootCA.key -subj "/C=RU/ST=Moscow/O=Syssoft/CN=Syssoft Root Authority" -out rootCA.crt
|
||||
```
|
||||
|
||||
`-x509` – экземпляр сертификата;
|
||||
`-new` – новый запрос сертификата;
|
||||
`-key rootCA.key` – файл ключа;
|
||||
`-subj` – передаваемые параметры, чтобы не запрашивать их интерактивно;
|
||||
`-days 365` – период действия сертификата (в днях);
|
||||
`-out rootCA.crt` – имя сгенерированного сертификата.
|
||||
|
||||
### Проверить содержание сгенерированного сертификата
|
||||
|
||||
```bash
|
||||
openssl x509 -text -noout -in rootCA.crt
|
||||
```
|
||||
|
||||
```bash
|
||||
Certificate:
|
||||
Data:
|
||||
Version: 3 (0x2)
|
||||
Serial Number:
|
||||
6b:f5:ec:27:d9:85:4a:72:22:2d:72:c4:9d:1a:e1:3d:d1:1d:4b:10
|
||||
Signature Algorithm: sha256WithRSAEncryption
|
||||
Issuer: C = RU, ST = Moscow, O = Syssoft, CN = Private Astra Root Authority
|
||||
Validity
|
||||
Not Before: Oct 16 10:29:33 2023 GMT
|
||||
Not After : Jul 3 10:29:33 2043 GMT
|
||||
Subject: C = RU, ST = Moscow, O = Syssoft, CN = Private Astra Root Authority
|
||||
Subject Public Key Info:
|
||||
Public Key Algorithm: rsaEncryption
|
||||
RSA Public-Key: (2048 bit)
|
||||
Modulus:
|
||||
```
|
||||
|
||||
### Убедиться в том, что был создан именно центр сертификации
|
||||
|
||||
```bash
|
||||
openssl x509 -text -noout -in rootCA.crt | grep CA
|
||||
```
|
||||
|
||||
```bash
|
||||
CA:TRUE
|
||||
```
|
||||
|
||||
Для использования созданного сертификата в качестве локального центра сертификации необходимо импортировать его на все доступные устройства. Корневой сертификат можно добавить в хранилище ключей/сертификатов ОС либо загрузить напрямую в браузер.
|
||||
|
||||
### Генерация сертификата для домена
|
||||
|
||||
#### Создание закрытого ключа для домена и запрос на сертификат (CSR)
|
||||
|
||||
```bash
|
||||
openssl req -newkey rsa:2048 -nodes -keyout syssoft.su.key -subj "/C=RU/ST=Moscow/O=Syssoft DEMO Stand/CN=*.syssoft.su" -out syssoft.su.csr
|
||||
```
|
||||
|
||||
#### Выпускаем сертификат
|
||||
|
||||
```bash
|
||||
openssl x509 -req -extfile <(printf "subjectAltName=DNS:*.syssoft.su") -days 365 -in syssoft.su.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out syssoft.su.crt
|
||||
```
|
||||
|
||||
В параметре `-extfile` указано альтернативное имя для домена, если его не прописать, браузеры откажутся принимать такой сертификат;
|
||||
`-in` - вводимый файл запроса;
|
||||
`-CA` - файл корневого сертификата;
|
||||
`-CAkey` - ключ корневого сертификата;
|
||||
`-out` - выходной crt-файл;
|
||||
`-days` - количество дней действия;
|
||||
|
||||
Посмотреть информацию о созданном сертификате
|
||||
|
||||
```bash
|
||||
openssl x509 -in syssoft.su.crt -text -noout
|
||||
```
|
||||
|
||||
#### Заключительный этап
|
||||
|
||||
В итоге получится такой набор файлов:
|
||||
|
||||
```bash
|
||||
sysadmin@doc:~/cert$ ls -l
|
||||
итого 24
|
||||
-rw-r--r-- 1 sysadmin sysadmin 1151 окт 16 14:27 syssoft.su.crt
|
||||
-rw------- 1 sysadmin sysadmin 1675 окт 16 14:26 syssoft.su.key
|
||||
-rw-r--r-- 1 sysadmin sysadmin 960 окт 16 14:27 syssoft.su-req.csr
|
||||
-rw------- 1 sysadmin sysadmin 1679 окт 16 14:25 rootCA.key
|
||||
-rw-r--r-- 1 sysadmin sysadmin 1294 окт 16 14:25 rootCA.crt
|
||||
-rw-r--r-- 1 sysadmin sysadmin 41 окт 16 14:27 rootCA.srl
|
||||
```
|
||||
|
||||
В конфигурации web-сервера (Apache, Nginx) необходимо указать пути
|
||||
|
||||
- к сертификату - `syssoft.su.crt`
|
||||
- к приватному ключу - `syssoft.su.key`
|
||||
|
||||
В браузеры на клиенты добавить в доверенные корневой сертификат нашего удостоверяющего центра `rootCA.crt`
|
||||
|
||||
***
|
||||
Reference in New Issue
Block a user