Compare commits
104 Commits
335453e1d4
...
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 |
@@ -53,15 +53,13 @@ sudo certbot certonly --dry-run \
|
|||||||
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
|
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 запись предложенного содержания.
|
Добавить в DNS TXT запись предложенного содержания. Let'sEncrypt отправляет запрос авторитативному DNS серверу домена. Таким образом необходимо убедиться, что проверка проходит именно на АВТОРИТАТИВНОМ DNS!
|
||||||
|
|
||||||
Проверить, что запись обновилась на Google (это происходит сразу)
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
nslookup -type=txt _acme-challenge.syssoft.su. 8.8.8.8
|
nslookup -type=txt _acme-challenge.syssoft.su. ns1.reg.ru
|
||||||
```
|
```
|
||||||
|
|
||||||
подождать еще минут 10, затем нажать Enter.
|
как только получен ответ с ожидаемой записью, можно нажать Enter.
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
|
|||||||
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
|
||||||
|
```
|
||||||
153
git.md
153
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. Кроме того, было бы хорошо понимать статус текущего репозитория. Для этого нужно установить специальную утилиту, которая будет показывать статус репозитория. Для установки утилиты надо скопировать её репозиторий в домашний каталог пользователя, под которым вы работаете:
|
Это дополнительный функционал, который не требуется для работы с Git, но очень помогает в этом. При работе с Git очень удобно, когда можно сразу определить, находитесь вы в обычном каталоге или в репозитории Git. Кроме того, было бы хорошо понимать статус текущего репозитория. Для этого нужно установить специальную утилиту, которая будет показывать статус репозитория. Для установки утилиты надо скопировать её репозиторий в домашний каталог пользователя, под которым вы работаете:
|
||||||
```
|
|
||||||
|
```bash
|
||||||
cd ~
|
cd ~
|
||||||
git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
|
git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
|
||||||
```
|
```
|
||||||
|
|
||||||
А затем добавить в конец файла .bashrc такие строки:
|
А затем добавить в конец файла .bashrc такие строки:
|
||||||
```
|
|
||||||
|
```bash
|
||||||
GIT_PROMPT_ONLY_IN_REPO=1
|
GIT_PROMPT_ONLY_IN_REPO=1
|
||||||
source ~/.bash-git-prompt/gitprompt.sh
|
source ~/.bash-git-prompt/gitprompt.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Для того, чтобы изменения применились, перезапустить bash:
|
Для того, чтобы изменения применились, перезапустить bash:
|
||||||
```
|
|
||||||
|
```bash
|
||||||
exec bash
|
exec bash
|
||||||
```
|
```
|
||||||
|
|
||||||
Теперь, если вы находитесь в обычном каталоге, приглашение выглядит стандартно, а если в каталоге, в котором инициализирован репозиторий git, это будет указано.
|
Теперь, если вы находитесь в обычном каталоге, приглашение выглядит стандартно, а если в каталоге, в котором инициализирован репозиторий git, это будет указано.
|
||||||
|
|
||||||
#### 2. Аутентификация на GitHub с помощью SSH-ключа
|
[вверх](#git)
|
||||||
###### Генерация нового SSH-ключа (используйте e-mail, который привязан к GitHub):
|
|
||||||
```
|
***
|
||||||
|
|
||||||
|
## Аутентификация на GitHub с помощью SSH-ключа
|
||||||
|
|
||||||
|
Генерация нового SSH-ключа (используйте e-mail, который привязан к GitHub):
|
||||||
|
|
||||||
|
```bash
|
||||||
ssh-keygen -t rsa -b 4096 -C "github_email@gmail.com"
|
ssh-keygen -t rsa -b 4096 -C "github_email@gmail.com"
|
||||||
```
|
```
|
||||||
|
|
||||||
На всех вопросах достаточно нажать Enter (более безопасно использовать ключ с passphrase, но можно и без, если нажать Enter при вопросе, тогда passphrase не будет запрашиваться у вас постоянно при операциях с репозиторием).
|
На всех вопросах достаточно нажать Enter (более безопасно использовать ключ с passphrase, но можно и без, если нажать Enter при вопросе, тогда passphrase не будет запрашиваться у вас постоянно при операциях с репозиторием).
|
||||||
Запуск SSH-агента (пропускаем на Windows):
|
Запуск SSH-агента (пропускаем на Windows):
|
||||||
```
|
|
||||||
|
```bash
|
||||||
eval "$(ssh-agent -s)"
|
eval "$(ssh-agent -s)"
|
||||||
```
|
```
|
||||||
|
|
||||||
Добавить ключ в SSH-агент (пропускаем на Windows):
|
Добавить ключ в SSH-агент (пропускаем на Windows):
|
||||||
```
|
|
||||||
|
```bash
|
||||||
ssh-add ~/.ssh/id_rsa
|
ssh-add ~/.ssh/id_rsa
|
||||||
```
|
```
|
||||||
###### Добавление SSH-ключа на GitHub
|
|
||||||
|
[вверх](#git)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
## Добавление SSH-ключа на GitHub
|
||||||
|
|
||||||
Для добавления ключа надо его скопировать.
|
Для добавления ключа надо его скопировать.
|
||||||
Например, таким образом можно отобразить ключ для копирования:
|
Например, таким образом можно отобразить ключ для копирования:
|
||||||
```
|
|
||||||
|
```bash
|
||||||
cat ~/.ssh/id_rsa.pub
|
cat ~/.ssh/id_rsa.pub
|
||||||
```
|
```
|
||||||
|
|
||||||
После копирования надо перейти на GitHub. Находясь на любой странице GitHub, в правом верхнем углу нажмите на картинку вашего профиля и в выпадающем списке выберите «Settings». В списке слева надо выбрать поле «SSH and GPG keys». После этого надо нажать «New SSH key» и в поле «Title» написать название ключа (например «Home»), а в поле «Key» вставить содержимое, которое было скопировано из файла ~/.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
|
ssh -T git@github.com
|
||||||
```
|
```
|
||||||
|
|
||||||
Вывод должен быть таким:
|
Вывод должен быть таким:
|
||||||
```
|
|
||||||
|
```bash
|
||||||
$ ssh -T git@github.com
|
$ ssh -T git@github.com
|
||||||
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
|
Hi username! You've successfully authenticated, but GitHub does not provide bash access.
|
||||||
```
|
```
|
||||||
#### 3. Работа с удаленным репозиторием
|
|
||||||
|
[вверх](#git)
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
## Работа с удаленным репозиторием
|
||||||
|
|
||||||
Клонируем удаленный репозиторий в локальную папку
|
Клонируем удаленный репозиторий в локальную папку
|
||||||
```
|
|
||||||
|
```bash
|
||||||
git clone ssh://git@github.com/pyneng/online-2-natasha-samoylenko.git
|
git clone ssh://git@github.com/pyneng/online-2-natasha-samoylenko.git
|
||||||
```
|
```
|
||||||
|
|
||||||
После внесения измений в локальные файлы проверяем состояние локального репозитория
|
После внесения измений в локальные файлы проверяем состояние локального репозитория
|
||||||
```
|
|
||||||
|
```bash
|
||||||
git status
|
git status
|
||||||
```
|
```
|
||||||
|
|
||||||
Необходимо добавить файлы в отслеживаемые
|
Необходимо добавить файлы в отслеживаемые
|
||||||
```
|
|
||||||
|
```bash
|
||||||
git add <имя файла>
|
git add <имя файла>
|
||||||
```
|
```
|
||||||
|
|
||||||
Создадим коммит
|
Создадим коммит
|
||||||
```
|
|
||||||
|
```bash
|
||||||
git commit -m "описание изменений"
|
git commit -m "описание изменений"
|
||||||
```
|
```
|
||||||
|
|
||||||
Синхронизируем локальный и удаленный репозитории
|
Синхронизируем локальный и удаленный репозитории
|
||||||
```
|
|
||||||
|
```bash
|
||||||
git push
|
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
|
||||||
|
```
|
||||||
|
|
||||||
286
linux_usefull.md
286
linux_usefull.md
@@ -1,83 +1,93 @@
|
|||||||
## Linux useful
|
# Linux useful
|
||||||
|
|
||||||
###### top
|
- [Linux useful](#linux-useful)
|
||||||
[Текущая директория сервера в браузере по адресу `http://server_ip:8000/`](#tip001)
|
- [Текущая директория сервера в браузере по адресу `http://server_ip:8000/`](#текущая-директория-сервера-в-браузере-по-адресу-httpserver_ip8000)
|
||||||
[Запустить графическое приложение через ssh соединение `-Y`](#tip002)
|
- [Запустить графическое приложение через ssh соединение `-Y`](#запустить-графическое-приложение-через-ssh-соединение--y)
|
||||||
[Отобразить все группы пользователя](#tip003)
|
- [Отобразить все группы пользователя\*\*](#отобразить-все-группы-пользователя)
|
||||||
[SSH соединение через промежуточный хост](#tip004)
|
- [SSH соединение через промежуточный хост\*\*](#ssh-соединение-через-промежуточный-хост)
|
||||||
[SSH соединение без проверки подлинности ключа и его сохранения](#tip005)
|
- [SSH соединение без проверки подлинности ключа и его сохранения](#ssh-соединение-без-проверки-подлинности-ключа-и-его-сохранения)
|
||||||
[Изменить первичную группу пользователя в текщем сеансе](#tip006)
|
- [Изменить первичную группу пользователя в текщем сеансе](#изменить-первичную-группу-пользователя-в-текщем-сеансе)
|
||||||
[Сохранить man в pdf](#tip007)
|
- [Сохранить man в pdf](#сохранить-man-в-pdf)
|
||||||
[Прервать выполнение команды через 5 секунд](#tip008)
|
- [Прервать выполнение команды через 5 секунд](#прервать-выполнение-команды-через-5-секунд)
|
||||||
[Инфо об ОС](#tip009)
|
- [Инфо об ОС](#инфо-об-ос)
|
||||||
[Выполнить команду несколько раз в цикле](#tip010)
|
- [Выполнить команду несколько раз в цикле](#выполнить-команду-несколько-раз-в-цикле)
|
||||||
[Конвертировать изоражения heic в jpg](#tip011)
|
- [Конвертировать изоражения heic в jpg](#конвертировать-изоражения-heic-в-jpg)
|
||||||
[Конвертировать jpg в pdf](#tip012)
|
- [Конвертировать jpg в pdf](#конвертировать-jpg-в-pdf)
|
||||||
[получить UUID диска для монтирования](#tip013)
|
- [получить UUID диска для монтирования](#получить-uuid-диска-для-монтирования)
|
||||||
[Сброс пароля root](#tip014)
|
- [Сброс пароля root](#сброс-пароля-root)
|
||||||
[Проверить доступность диапазона хостов](#tip015)
|
- [Проверить доступность диапазона хостов](#проверить-доступность-диапазона-хостов)
|
||||||
[Конвертировать pdf в png](#tip016)
|
- [Конвертировать pdf в png](#конвертировать-pdf-в-png)
|
||||||
[Узнать загрузку процессора определённым процессом](#tip017)
|
- [Узнать загрузку процессора определённым процессом](#узнать-загрузку-процессора-определённым-процессом)
|
||||||
|
- [Определить страну, город и др. детали по IP](#определить-страну-город-и-др-детали-по-ip)
|
||||||
|
- [Отобразить файл без комментариев и путых строк](#отобразить-файл-без-комментариев-и-путых-строк)
|
||||||
|
- [Изменить консольный редактор по-умолчанию](#изменить-консольный-редактор-по-умолчанию)
|
||||||
|
- [Перенос строк в nano](#перенос-строк-в-nano)
|
||||||
|
- [Генератор паролей](#генератор-паролей)
|
||||||
|
- [Импорт ssh ключа из Интернет](#импорт-ssh-ключа-из-интернет)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip001
|
## Текущая директория сервера в браузере по адресу `http://server_ip:8000/`
|
||||||
:large_blue_circle: **Текущая директория сервера в браузере по адресу `http://server_ip:8000/`**
|
|
||||||
```bash
|
```bash
|
||||||
python -m SimpleHTTPServer
|
python -m SimpleHTTPServer
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip002
|
## Запустить графическое приложение через ssh соединение `-Y`
|
||||||
:large_blue_circle: **Запустить графическое приложение через ssh соединение `-Y`**
|
|
||||||
*для текущей сессии*
|
*для текущей сессии*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh -Y pi@server_ip
|
ssh -Y pi@server_ip
|
||||||
```
|
```
|
||||||
|
|
||||||
*для всех подключений*
|
*для всех подключений*
|
||||||
|
|
||||||
`ForwardX11 yes` в файле `/etc/ssh/ssh_config`
|
`ForwardX11 yes` в файле `/etc/ssh/ssh_config`
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip003
|
## Отобразить все группы пользователя**
|
||||||
:large_blue_circle: **Отобразить все группы пользователя**
|
|
||||||
```bash
|
```bash
|
||||||
da2001@Metromint:~$ groups da2001
|
da2001@Metromint:~$ groups da2001
|
||||||
da2001 : da2001 adm cdrom sudo dip plugdev kvm lpadmin sambashare wireshark libvirt
|
da2001 : da2001 adm cdrom sudo dip plugdev kvm lpadmin sambashare wireshark libvirt
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip004
|
## SSH соединение через промежуточный хост**
|
||||||
:large_blue_circle: **SSH соединение через промежуточный хост**
|
|
||||||
```bash
|
```bash
|
||||||
ssh -t pi@192.168.89.2 ssh da2001@192.168.1.8
|
ssh -t pi@192.168.89.2 ssh da2001@192.168.1.8
|
||||||
```
|
```
|
||||||
|
|
||||||
*сначала будет запрошен пароль от 192.168.89.2, затем от 192.168.1.8*
|
*сначала будет запрошен пароль от 192.168.89.2, затем от 192.168.1.8*
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip005
|
## SSH соединение без проверки подлинности ключа и его сохранения
|
||||||
:large_blue_circle: **SSH соединение без проверки подлинности ключа и его сохранения**
|
|
||||||
```bash
|
```bash
|
||||||
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.2.1
|
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.2.1
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip006
|
## Изменить первичную группу пользователя в текщем сеансе
|
||||||
:large_blue_circle: **Изменить первичную группу пользователя в текщем сеансе**
|
|
||||||
```bash
|
```bash
|
||||||
[lisa@server1 ~]$ groups
|
[lisa@server1 ~]$ groups
|
||||||
lisa account sales
|
lisa account sales
|
||||||
@@ -89,14 +99,15 @@ sales lisa account
|
|||||||
total 0
|
total 0
|
||||||
-rw-r--r--. 1 lisa sales 0 Feb 6 10:06 file1
|
-rw-r--r--. 1 lisa sales 0 Feb 6 10:06 file1
|
||||||
```
|
```
|
||||||
|
|
||||||
*теперь все новые файлы будут принадлежать группе sales*
|
*теперь все новые файлы будут принадлежать группе sales*
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip007
|
## Сохранить man в pdf
|
||||||
:large_blue_circle: **Сохранить man в pdf**
|
|
||||||
```bash
|
```bash
|
||||||
man -t <программа> | ps2pdf - <filename>.pdf
|
man -t <программа> | ps2pdf - <filename>.pdf
|
||||||
```
|
```
|
||||||
@@ -105,22 +116,22 @@ man -t <программа> | ps2pdf - <filename>.pdf
|
|||||||
man -t tar | ps2pdf - tar_man.pdf
|
man -t tar | ps2pdf - tar_man.pdf
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip008
|
## Прервать выполнение команды через 5 секунд
|
||||||
:large_blue_circle: **Прервать выполнение команды через 5 секунд**
|
|
||||||
```bash
|
```bash
|
||||||
timeout 5s command
|
timeout 5s command
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip009
|
## Инфо об ОС
|
||||||
:large_blue_circle: **Инфо об ОС**
|
|
||||||
```bash
|
```bash
|
||||||
cat /etc/*release
|
cat /etc/*release
|
||||||
```
|
```
|
||||||
@@ -161,12 +172,12 @@ da2001@Metromint:~$ neofetch
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip010
|
## Выполнить команду несколько раз в цикле
|
||||||
:large_blue_circle: **Выполнить команду несколько раз в цикле**
|
|
||||||
```bash
|
```bash
|
||||||
da2001@Metromint:~$ for i in {1..5}; do echo $i; done
|
da2001@Metromint:~$ for i in {1..5}; do echo $i; done
|
||||||
1
|
1
|
||||||
@@ -175,74 +186,92 @@ da2001@Metromint:~$ for i in {1..5}; do echo $i; done
|
|||||||
4
|
4
|
||||||
5
|
5
|
||||||
```
|
```
|
||||||
|
|
||||||
*выполнение скрипта с параметрами в цикле*
|
*выполнение скрипта с параметрами в цикле*
|
||||||
```bash
|
```bash
|
||||||
|
|
||||||
for i in {1..20}; do ./wlt_start.py -c config_m716.cfg; done
|
for i in {1..20}; do ./wlt_start.py -c config_m716.cfg; done
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip011
|
## Конвертировать изоражения heic в jpg
|
||||||
:large_blue_circle: **Конвертировать изоражения heic в jpg**
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install libheif-examples
|
sudo apt-get install libheif-examples
|
||||||
```
|
```
|
||||||
|
|
||||||
*для конвертации одного изображения*
|
*для конвертации одного изображения*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
heif-convert IMG_1234.HEIC IMG_1234.jpg
|
heif-convert IMG_1234.HEIC IMG_1234.jpg
|
||||||
```
|
```
|
||||||
|
|
||||||
*для конвертации всех изображений в папке*
|
*для конвертации всех изображений в папке*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir jpg
|
mkdir jpg
|
||||||
for file in *.heic; do heif-convert $file ./jpg/${file/%.heic/.jpg}; done
|
for file in *.heic; do heif-convert $file ./jpg/${file/%.heic/.jpg}; done
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip012
|
## Конвертировать jpg в pdf
|
||||||
:large_blue_circle: **Конвертировать jpg в pdf**
|
|
||||||
*необходим установленный ImageMagick*
|
*необходим установленный ImageMagick*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt install imagemagick
|
sudo apt install imagemagick
|
||||||
```
|
```
|
||||||
|
|
||||||
*для конвертации одного изображения*
|
*для конвертации одного изображения*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
convert image.jpg out.pdf
|
convert image.jpg out.pdf
|
||||||
```
|
```
|
||||||
|
|
||||||
*для конвертации нескольких изображений*
|
*для конвертации нескольких изображений*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|
||||||
convert image1.jpg image2.jpg image3.jpg out.pdf
|
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.
|
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
|
||||||
```
|
```
|
||||||
|
|
||||||
в файле `/etc/ImageMagick-7/policy.xml` необходимо изменить директиву доступа
|
в файле `/etc/ImageMagick-7/policy.xml` необходимо изменить директиву доступа
|
||||||
*название папки ImageMagick-7 может отличаться в зависимости от установленной версии*
|
*название папки ImageMagick-7 может отличаться в зависимости от установленной версии*
|
||||||
между тегами `<policymap>` и `</policymap>`
|
между тегами `<policymap>` и `</policymap>`
|
||||||
добавить/отредактировать
|
добавить/отредактировать
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
<policy domain="coder" rights="read | write" pattern="PDF" />
|
<policy domain="coder" rights="read | write" pattern="PDF" />
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip013
|
## получить UUID диска для монтирования
|
||||||
:large_blue_circle: **получить UUID диска для монтирования**
|
|
||||||
**Вариант 1**
|
**Вариант 1**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
lsblk -n -o uuid /dev/sda1
|
lsblk -n -o uuid /dev/sda1
|
||||||
```
|
```
|
||||||
|
|
||||||
-n - не выводить заголовки
|
-n - не выводить заголовки
|
||||||
-o - отображаемое поле
|
-o - отображаемое поле
|
||||||
*таким образом, для раздела с ФС ext4, запись в fstab можно добавить таким образом*
|
*таким образом, для раздела с ФС ext4, запись в fstab можно добавить таким образом*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir /mntdir
|
mkdir /mntdir
|
||||||
|
|
||||||
@@ -251,82 +280,103 @@ sudo bash -c 'echo "UUID=$UUID /mntdir ext4 defaults 0 0" >> /etc/fstab'
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Вариант 2**
|
**Вариант 2**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
[root@server1 ~]# blkid -o export /dev/sda2 | grep '^UUID'
|
[root@server1 ~]# blkid -o export /dev/sda2 | grep '^UUID'
|
||||||
UUID=d056212f-b1ea-4bc5-ba4e-99d036e5531e
|
UUID=d056212f-b1ea-4bc5-ba4e-99d036e5531e
|
||||||
```
|
```
|
||||||
|
|
||||||
*таким образом, можно перенаправить вывод в `/etc/fstab` и руками дополнить параметры монтирования*
|
*таким образом, можно перенаправить вывод в `/etc/fstab` и руками дополнить параметры монтирования*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
blkid -o export /dev/sda2 | grep '^UUID' >> /etc/fstab
|
blkid -o export /dev/sda2 | grep '^UUID' >> /etc/fstab
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
|
## Сброс пароля root
|
||||||
###### tip014
|
|
||||||
:large_blue_circle: **Сброс пароля root**
|
|
||||||
|
|
||||||
**CentOS/RedHat Linux**
|
**CentOS/RedHat Linux**
|
||||||
|
|
||||||
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
|
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
|
||||||
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
|
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
|
||||||
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mount -o remount,rw /sysroot
|
mount -o remount,rw /sysroot
|
||||||
```
|
```
|
||||||
4. Изменить корневой каталог
|
|
||||||
|
- Изменить корневой каталог
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
chroot /sysroot
|
chroot /sysroot
|
||||||
```
|
```
|
||||||
5. Теперь можно изменить пароль root
|
|
||||||
|
- Теперь можно изменить пароль root
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
passwd
|
passwd
|
||||||
```
|
```
|
||||||
|
|
||||||
будет предложено ввести новый пароль дважды.
|
будет предложено ввести новый пароль дважды.
|
||||||
6. Поскольку на ранней стадии загрузки SELinux еще не был активирован, тип контекста в `/etc/shadow` будет перепутан. Если сейчас перезагрузиться, никто не сможет войти в систему. Поэтому необходимо убедиться, что тип контекста установлен правильно. Для этого на этом этапе нужно загрузить политику SELinux с помощью команды
|
|
||||||
|
Поскольку на ранней стадии загрузки SELinux еще не был активирован, тип контекста в `/etc/shadow` будет перепутан. Если сейчас перезагрузиться, никто не сможет войти в систему. Поэтому необходимо убедиться, что тип контекста установлен правильно. Для этого на этом этапе нужно загрузить политику SELinux с помощью команды
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
load_policy -i
|
load_policy -i
|
||||||
```
|
```
|
||||||
7. Теперь нужно вручную установить правильный тип контекста в `/etc/shadow`.
|
|
||||||
|
- Теперь нужно вручную установить правильный тип контекста в `/etc/shadow`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
chcon -t shadow_t /etc/shadow
|
chcon -t shadow_t /etc/shadow
|
||||||
```
|
```
|
||||||
|
|
||||||
**вместо 6,7 пунктов можно просто в корне создать файл `.autorelabel`**
|
**вместо 6,7 пунктов можно просто в корне создать файл `.autorelabel`**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
touch /.autorelabel
|
touch /.autorelabel
|
||||||
```
|
```
|
||||||
|
|
||||||
8. Всё, после перезагрузки, у root будет новый пароль.
|
Всё, после перезагрузки, у root будет новый пароль.
|
||||||
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
reboot -f
|
reboot -f
|
||||||
```
|
```
|
||||||
|
|
||||||
**Debian**
|
**Debian**
|
||||||
|
|
||||||
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
|
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
|
||||||
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
|
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
|
||||||
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
3. После появления приглашения консоли необходимо получить доступ к образу системы
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mount -o remount,rw /
|
mount -o remount,rw /
|
||||||
```
|
```
|
||||||
4. Теперь можно изменить пароль root
|
|
||||||
|
Теперь можно изменить пароль root
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
passwd
|
passwd
|
||||||
```
|
```
|
||||||
|
|
||||||
будет предложено ввести новый пароль дважды.
|
будет предложено ввести новый пароль дважды.
|
||||||
5. Всё, после перезагрузки, у root будет новый пароль.
|
Всё, после перезагрузки, у root будет новый пароль.
|
||||||
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
reboot -f
|
reboot -f
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip015
|
## Проверить доступность диапазона хостов
|
||||||
:large_blue_circle: **Проверить доступность диапазона хостов**
|
|
||||||
```bash
|
```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
|
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 - НЕ доступен
|
192.168.1.13 - НЕ доступен
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip016
|
## Конвертировать pdf в png
|
||||||
:large_blue_circle: **Конвертировать pdf в png**
|
|
||||||
```bash
|
```bash
|
||||||
pdftoppm input.pdf outputname -png
|
pdftoppm input.pdf outputname -png
|
||||||
```
|
```
|
||||||
|
|
||||||
*в результате каждая страница в PDF будет сохранена в формате outputname-01.png, где 01 будет номером страницы*
|
*в результате каждая страница в PDF будет сохранена в формате outputname-01.png, где 01 будет номером страницы*
|
||||||
**Конвертировать одну страницу или диапазон**
|
**Конвертировать одну страницу или диапазон**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pdftoppm input.pdf outputname -png -f {page} -singlefile
|
pdftoppm input.pdf outputname -png -f {page} -singlefile
|
||||||
```
|
```
|
||||||
|
|
||||||
*Измените `{page}` на номер страницы. Он проиндексирован как 1, поэтому `-f 1` будет первой страницей.*
|
*Измените `{page}` на номер страницы. Он проиндексирован как 1, поэтому `-f 1` будет первой страницей.*
|
||||||
|
|
||||||
*Если вы хотите работать с диапазоном страниц, вы также можете указать номер для флага `-l` (последняя страница), поэтому при использовании `-f 1 -l 30` будут указаны страницы от 1 до 30.*
|
*Если вы хотите работать с диапазоном страниц, вы также можете указать номер для флага `-l` (последняя страница), поэтому при использовании `-f 1 -l 30` будут указаны страницы от 1 до 30.*
|
||||||
@@ -361,36 +414,113 @@ pdftoppm input.pdf outputname -png -f {page} -singlefile
|
|||||||
*Разрешение по умолчанию для этой команды составляет 150 точек на дюйм.*
|
*Разрешение по умолчанию для этой команды составляет 150 точек на дюйм.*
|
||||||
|
|
||||||
*Чтобы увеличить разрешение преобразованного PDF-файла, добавьте параметры `-rx` {разрешение} и `-ry` {разрешение}.*
|
*Чтобы увеличить разрешение преобразованного PDF-файла, добавьте параметры `-rx` {разрешение} и `-ry` {разрешение}.*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pdftoppm input.pdf outputname -png -rx 300 -ry 300
|
pdftoppm input.pdf outputname -png -rx 300 -ry 300
|
||||||
```
|
```
|
||||||
|
|
||||||
[вверх](#top)
|
[вверх](#linux-useful)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
###### tip017
|
## Узнать загрузку процессора определённым процессом
|
||||||
:large_blue_circle: **Узнать загрузку процессора определённым процессом**
|
|
||||||
**ps**
|
**ps**
|
||||||
*по имени процесса*
|
*по имени процесса*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ps -C iperf -o %cpu=
|
ps -C iperf -o %cpu=
|
||||||
```
|
```
|
||||||
|
|
||||||
*по номеру процесса*
|
*по номеру процесса*
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ps -p 23635 -o %cpu=
|
ps -p 23635 -o %cpu=
|
||||||
```
|
```
|
||||||
|
|
||||||
или
|
или
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ps -p $(pgrep iperf) -o %cpu=
|
ps -p $(pgrep iperf) -o %cpu=
|
||||||
```
|
```
|
||||||
|
|
||||||
**top**
|
**top**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
top -b -n 2 -d 0.2 -p PID_ID | tail -1 | awk '{print $9}'
|
top -b -n 2 -d 0.2 -p PID_ID | tail -1 | awk '{print $9}'
|
||||||
```
|
```
|
||||||
|
|
||||||
**Нагрузить процессор для проверки**
|
**Нагрузить процессор для проверки**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cat /dev/zero > /dev/null
|
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)
|
||||||
|
```
|
||||||
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/>
|
||||||
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"
|
||||||
|
```
|
||||||
|
|
||||||
|
После перезагрузки будет применено новое имя.
|
||||||
@@ -1,7 +1,32 @@
|
|||||||
# Шпаргалка по командам samba-tool
|
# Шпаргалка по командам 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>
|
Больше информации здесь - <https://xinux.net/index.php/Samba-tool>
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
## Пользователи и группы
|
## Пользователи и группы
|
||||||
|
|
||||||
### Создать пользователя
|
### Создать пользователя
|
||||||
@@ -91,13 +116,17 @@ samba_upgradedns --dns-backend=[BIND9_DLZ|SAMBA_INTERNAL]
|
|||||||
samba-tool dns add 10.10.120.24 alt.lan COMP2 A 10.10.120.25 -Uadministrator
|
samba-tool dns add 10.10.120.24 alt.lan COMP2 A 10.10.120.25 -Uadministrator
|
||||||
```
|
```
|
||||||
|
|
||||||
### Создание зоны обратного просмотра для сети 192.168.13.0/24
|
### Создание зоны обратного просмотра
|
||||||
|
|
||||||
|
для сети 192.168.13.0/24
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
samba-tool dns zonecreate 127.0.0.1 13.168.192.in-addr.arpa -Uadministrator
|
samba-tool dns zonecreate 127.0.0.1 13.168.192.in-addr.arpa -Uadministrator
|
||||||
```
|
```
|
||||||
|
|
||||||
### Создание записи в зоне обратного просмотра для узла dc1.alt.lan с адресом 192.168.13.139
|
### Создание записи в зоне обратного просмотра
|
||||||
|
|
||||||
|
для узла dc1.alt.lan с адресом 192.168.13.139
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
samba-tool dns add 127.0.0.1 13.168.192.in-addr.arpa 139 PTR dc1.alt.lan -Uadministrator --password=P@ssw0rd
|
samba-tool dns add 127.0.0.1 13.168.192.in-addr.arpa 139 PTR dc1.alt.lan -Uadministrator --password=P@ssw0rd
|
||||||
|
|||||||
290
ssh.md
290
ssh.md
@@ -1,91 +1,331 @@
|
|||||||
### ssh
|
# SSH
|
||||||
Подключение
|
|
||||||
|
- [SSH](#ssh)
|
||||||
|
- [Подключение](#подключение)
|
||||||
|
- [SSH аутентификация по ключам](#ssh-аутентификация-по-ключам)
|
||||||
|
- [Для дополнительной безопасности можно отключить доступ по паролю](#для-дополнительной-безопасности-можно-отключить-доступ-по-паролю)
|
||||||
|
- [Подключение через промежуточный хост](#подключение-через-промежуточный-хост)
|
||||||
|
- [SCP](#scp)
|
||||||
|
- [Не стандартный порт](#не-стандартный-порт)
|
||||||
|
- [ssh\_config](#ssh_config)
|
||||||
|
- [Общие параметры](#общие-параметры)
|
||||||
|
- [Пример конфигурации](#пример-конфигурации)
|
||||||
|
- [Проброс SSH ключа](#проброс-ssh-ключа)
|
||||||
|
- [Разово](#разово)
|
||||||
|
- [Постоянный проброс](#постоянный-проброс)
|
||||||
|
- [Проброс SSH ключей руту](#проброс-ssh-ключей-руту)
|
||||||
|
|
||||||
|
## Подключение
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh admin@192.168.5.3
|
ssh admin@192.168.5.3
|
||||||
```
|
```
|
||||||
|
|
||||||
если имя пользователя не указывать, соединение произойдет от имени локального пользователя
|
если имя пользователя не указывать, соединение произойдет от имени локального пользователя
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh 192.168.5.3
|
ssh 192.168.5.3
|
||||||
```
|
```
|
||||||
|
|
||||||
не стандартный порт при подключении
|
не стандартный порт при подключении
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh pi@da2001.ru -p 227
|
ssh pi@da2001.ru -p 227
|
||||||
```
|
```
|
||||||
|
|
||||||
не добавлять публичный ключ удаленного хоста в локальный файл _**known_hosts**_, при этом будет запрошено подтверждение подключения
|
не добавлять публичный ключ удаленного хоста в локальный файл _**known_hosts**_, при этом будет запрошено подтверждение подключения
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh -o UserKnownHostsFile=/dev/null admin@192.168.1.2
|
ssh -o UserKnownHostsFile=/dev/null admin@192.168.1.2
|
||||||
```
|
```
|
||||||
|
|
||||||
не проверять публичный ключ удаленного хоста
|
не проверять публичный ключ удаленного хоста
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh -o StrictHostKeyChecking=no admin@192.168.1.2
|
ssh -o StrictHostKeyChecking=no admin@192.168.1.2
|
||||||
```
|
```
|
||||||
|
|
||||||
не добавлять публичный ключ и не проверять удаленный хост
|
не добавлять публичный ключ и не проверять удаленный хост
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.1.2
|
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.1.2
|
||||||
```
|
```
|
||||||
|
|
||||||
выполнить команду на сервере без подключения
|
выполнить команду на сервере без подключения
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh user@host ls
|
ssh user@host ls
|
||||||
```
|
```
|
||||||
|
|
||||||
выполнить локальный скрипт
|
выполнить локальный скрипт
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh da2001@192.168.1.2 'python3' < test.py
|
ssh da2001@192.168.1.2 'python3' < test.py
|
||||||
```
|
```
|
||||||
|
|
||||||
### scp
|
[вверх](#ssh)
|
||||||
```bash
|
|
||||||
scp ./wlt.py pi@da2001.ru:/home/pi
|
|
||||||
```
|
|
||||||
использование не стандартного порта
|
|
||||||
```bash
|
|
||||||
scp -P 227 ./wlt.py pi@da2001.ru:/home/pi
|
|
||||||
```
|
|
||||||
|
|
||||||
|
### SSH аутентификация по ключам
|
||||||
|
|
||||||
|
На локальном хосте linux сгенерировать пару ключей
|
||||||
### ssh аутентификация по ключам
|
|
||||||
|
|
||||||
**На локальном хосте linux сгенерировать пару ключей**
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh-keygen
|
ssh-keygen
|
||||||
```
|
```
|
||||||
|
|
||||||
парольную фразу можно оставить пустой, чтобы не вводить пароль каждый раз при обращении к ключу
|
парольную фразу можно оставить пустой, чтобы не вводить пароль каждый раз при обращении к ключу
|
||||||
_По умолчанию ключи будут храниться в каталоге ~/.ssh в домашнем каталоге текущего пользователя. Закрытый ключ будет называться **id_rsa**, а связанный с ним открытый ключ – **id_rsa.pub**_
|
_По умолчанию ключи будут храниться в каталоге `~/.ssh` в домашнем каталоге текущего пользователя. Закрытый ключ будет называться `id_rsa`, а связанный с ним открытый ключ – `id_rsa.pub`_
|
||||||
|
|
||||||
Теперь необходимо скопировать публичный ключ на сервер, доступ к которому настраиваем
|
Теперь необходимо скопировать публичный ключ на сервер, доступ к которому настраиваем
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh-copy-id login@example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
или
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cat ~/.ssh/id_rsa.pub | ssh login@example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
|
cat ~/.ssh/id_rsa.pub | ssh login@example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
|
||||||
```
|
```
|
||||||
**Для дополнительной безопасности можно отключить доступ по паролю**
|
|
||||||
Для этого необходимо отредактировать конфигурационный файл демона SSH raspberry
|
[вверх](#ssh)
|
||||||
|
|
||||||
|
### Для дополнительной безопасности можно отключить доступ по паролю
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo nano /etc/ssh/sshd_config
|
sudo nano /etc/ssh/sshd_config
|
||||||
```
|
```
|
||||||
Найти директиву _PasswordAuthentication_, раскомментировать ее и присвоить значение _no_
|
|
||||||
`PasswordAuthentication no`
|
`PasswordAuthentication no`
|
||||||
Сохранить файл, закрыть.
|
|
||||||
Перезагрузить сервис
|
Перезагрузить сервис
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo systemctl restart ssh
|
sudo systemctl restart ssh
|
||||||
```
|
```
|
||||||
|
|
||||||
### подключение через промежуточный хост
|
[вверх](#ssh)
|
||||||
_если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой_
|
|
||||||
```
|
### Подключение через промежуточный хост
|
||||||
|
|
||||||
|
если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой
|
||||||
|
|
||||||
|
```bash
|
||||||
ssh -J user1@host1:22 user2@host2
|
ssh -J user1@host1:22 user2@host2
|
||||||
```
|
```
|
||||||
|
|
||||||
но в таком случае придется вводить пароль от host1 и от host2. Чтобы этого избежать можно добавить на хосты публичный ключ клиента
|
но в таком случае придется вводить пароль от host1 и от host2. Чтобы этого избежать можно добавить на хосты публичный ключ клиента
|
||||||
|
|
||||||
если добавить к подключению опции:
|
если добавить к подключению опции:
|
||||||
```
|
|
||||||
|
```bash
|
||||||
-o UserKnownHostsFile=/dev/null
|
-o UserKnownHostsFile=/dev/null
|
||||||
-o StrictHostKeyChecking=no
|
-o StrictHostKeyChecking=no
|
||||||
```
|
```
|
||||||
|
|
||||||
удаленный сервер не будет проверять и не будет добавлять хеш удаленного хоста в файл _**known_hosts**_
|
удаленный сервер не будет проверять и не будет добавлять хеш удаленного хоста в файл _**known_hosts**_
|
||||||
|
|
||||||
это может быть полезно, например, когда часто меняется прошивка зондов и хеш изменяется.
|
это может быть полезно на тестовых стендах, когда узлы часто меняются и хеш изменяется.
|
||||||
Таким образом, полная команда может выглядеть так:
|
Таким образом, полная команда может выглядеть так:
|
||||||
```
|
|
||||||
|
```bash
|
||||||
ssh -J pi@da2001.ru:227 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.5.3
|
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`
|
`sudo tcpdump -D`
|
||||||
|
|
||||||
@@ -26,8 +31,8 @@ n - _не подменять значения на названия, напри
|
|||||||
A - _выводить всё в ASCII_
|
A - _выводить всё в ASCII_
|
||||||
e - _выводить данные L2_
|
e - _выводить данные L2_
|
||||||
|
|
||||||
|
## Подробнее
|
||||||
|
|
||||||
#### Подробнее
|
|
||||||
**Ключи**
|
**Ключи**
|
||||||
_Наиболее часто используемые ключи при запуске tcpdump приведены таблице_
|
_Наиболее часто используемые ключи при запуске tcpdump приведены таблице_
|
||||||
ключ описание
|
ключ описание
|
||||||
@@ -153,3 +158,11 @@ tcpdump dst 172.16.0.1 and not icmp
|
|||||||
```bash
|
```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)'
|
$ 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` - учётная запись разблокирована
|
||||||
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/
|
||||||
|
```
|
||||||
|
|
||||||
|
После перезагрузки видим, что-то типа:
|
||||||
|

|
||||||
Reference in New Issue
Block a user