Compare commits

...

140 Commits

Author SHA1 Message Date
df49f7e8bc modify: Пт 10 апр 2026 16:26:47 MSK 2026-04-10 16:26:50 +03:00
ed0ff16a43 modify: Пт 10 апр 2026 12:17:10 MSK 2026-04-10 12:23:37 +03:00
8c1220fc8e modify: Пт 10 апр 2026 12:17:10 MSK 2026-04-10 12:17:12 +03:00
71c620923a mod 2026-04-10 08:24:23 +03:00
3761be85a0 mod 2026-04-10 08:20:00 +03:00
da679e59c7 modify: Вт 07 апр 2026 13:33:44 MSK 2026-04-07 16:46:02 +03:00
246e89ec75 modify: Вт 07 апр 2026 13:33:44 MSK 2026-04-07 16:06:37 +03:00
fbc9e18612 modify: Вт 07 апр 2026 13:33:44 MSK 2026-04-07 14:38:53 +03:00
dac1146e4c modify: Вт 07 апр 2026 13:33:44 MSK 2026-04-07 14:34:44 +03:00
7059c1bb65 modify: Пн 06 апр 2026 09:15:57 MSK 2026-04-06 11:58:08 +03:00
7dda977baa modify: Пн 06 апр 2026 09:15:57 MSK 2026-04-06 11:43:32 +03:00
3f1090d377 modify: Пн 06 апр 2026 09:15:57 MSK 2026-04-06 09:37:35 +03:00
ee11bed425 modify: Пн 06 апр 2026 09:15:57 MSK 2026-04-06 09:15:59 +03:00
3e2703790e Обновить Перенос_системы_на_другой_раздел.md 2026-03-28 15:35:58 +03:00
b676a04232 Обновить Перенос_системы_на_другой_раздел.md 2026-03-28 15:34:56 +03:00
48dbfdd6ea Обновить Перенос_системы_на_другой_раздел.md 2026-03-28 15:29:59 +03:00
2130104304 Обновить Перенос_системы_на_другой_раздел.md 2026-03-26 15:59:14 +03:00
cd53f15b85 modify: Чт 26 мар 2026 15:46:41 MSK 2026-03-26 15:46:49 +03:00
7a0d4e988e add udo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -i 2026-02-26 12:51:52 +03:00
34b4d0adcc mod git 2025-11-27 11:05:02 +03:00
a22a1a858b mod ssh 2025-10-30 10:47:39 +03:00
19d33f9f1d Обновить git.md
изменился синтаксис в Deb13
2025-09-06 11:06:36 +03:00
fdd3291efd добавил - переименовать сетевой интефейс 2025-09-03 16:24:20 +03:00
e9ba4d4242 обновлена инструкция для SSH приветствия в Debian 12 2025-06-27 14:14:49 +03:00
50dab27a84 mod 2025-02-25 10:52:08 +03:00
ef2f69aa8d mod 2025-02-25 10:51:30 +03:00
9b4fb459c3 mod 2025-02-25 10:50:38 +03:00
af41705fb7 mod 2025-02-23 12:34:32 +03:00
54f48d36cc mod 2025-01-27 11:57:56 +03:00
a2c365cf90 mod 2025-01-27 10:57:08 +03:00
7b62cc396f mod 2025-01-27 10:47:22 +03:00
f9f8e1d8cb mod 2025-01-27 10:46:21 +03:00
b12e88aee0 mod 2025-01-27 10:43:38 +03:00
d588f0605c mod 2025-01-24 13:40:07 +03:00
33d6280c7f mod 2025-01-24 13:38:54 +03:00
a0a1f48236 mod 2025-01-24 13:32:58 +03:00
fd75c942c6 add percona xtrabckup 2025-01-24 13:31:45 +03:00
97f4954df2 mod 2025-01-23 18:32:42 +03:00
1cdc739e3f mod 2025-01-23 17:23:12 +03:00
8948df24b6 mod 2025-01-22 14:23:46 +03:00
c58a957216 mod 2025-01-22 14:20:45 +03:00
4053f59d9b mod 2025-01-22 14:06:42 +03:00
2ef9294e39 mod 2025-01-22 14:05:14 +03:00
ea40e60bfb mod 2025-01-22 12:32:59 +03:00
6097bd38ad mod 2025-01-22 12:32:01 +03:00
d04d94c71f mod 2025-01-22 12:31:30 +03:00
372fcb3bd1 mod 2024-12-25 15:05:40 +03:00
73d51fa11b mod 2024-12-25 13:16:41 +03:00
e23becc410 mod 2024-12-25 12:43:23 +03:00
804a44b598 mod 2024-12-25 12:43:01 +03:00
beff9e4a6b mod 2024-12-25 12:41:18 +03:00
cdd5cb38e8 mod png 2024-12-25 12:36:06 +03:00
c75c0b9623 add ssh_over_jump 2024-12-25 12:31:06 +03:00
dff2c293f4 add link 2024-12-24 21:16:37 +03:00
638e61f0d5 add orange pi 5 plus os to emmc 2024-12-24 21:02:22 +03:00
2efa14d709 add pnet 2024-12-20 13:26:39 +03:00
2b4b1750da mod mysql 2024-12-03 13:38:25 +03:00
f825fc9674 add mysql 2024-12-03 13:34:14 +03:00
ad18f8ffaa mod 2024-11-23 23:06:03 +03:00
9abdd62506 mod 2024-11-23 23:05:04 +03:00
829ed1f289 add clonezilla grub 2024-11-23 23:03:12 +03:00
99d5280363 add pwqgen 2024-11-20 13:56:25 +03:00
f55c0fdc9d mod ssh 2024-08-26 09:23:16 +03:00
f987ef8aaa mod ssh 2024-08-09 12:32:25 +03:00
89cdbc3644 mod 2024-06-12 10:58:00 +03:00
117b60a238 mod 2024-06-12 10:53:43 +03:00
d651e1d6af mod 2024-05-16 14:24:49 +03:00
3ba1ffcd48 mod 2024-05-16 12:54:30 +03:00
c2ef43b47d mod 2024-05-16 12:44:40 +03:00
b10eb896d4 mod 2024-05-13 09:03:06 +03:00
8a38615574 mod 2024-05-13 09:02:17 +03:00
ceadf1b19d mod 2024-05-06 14:30:14 +03:00
5eca6dd649 mod 2024-04-22 10:05:04 +03:00
2e341d835f mod 2024-04-08 10:33:25 +03:00
d705efa0f7 mod 2024-04-08 10:32:09 +03:00
fde745f3c2 mod 2024-04-08 10:10:25 +03:00
9e1d9b8b09 mod 2024-04-05 12:59:55 +03:00
087c8e372e mod 2024-04-05 11:49:45 +03:00
8b22261cc0 mod 2024-04-04 13:38:03 +03:00
9fd8442af7 mod 2024-04-04 13:35:30 +03:00
4b8c97ab03 mod 2024-04-04 13:33:15 +03:00
4045ec9d10 mod 2024-04-04 13:28:42 +03:00
2953871af8 mod 2024-04-04 13:27:00 +03:00
bf5c8863de mod 2024-04-04 13:21:46 +03:00
581a94579e mod 2024-04-04 13:21:17 +03:00
d596e3583e mod 2024-04-04 13:15:58 +03:00
adf13c53fd mod 2024-04-04 13:14:48 +03:00
90ee4e5c03 mod 2024-04-04 13:14:08 +03:00
f4b55c0eaa mod 2024-04-04 13:09:53 +03:00
0b8052a400 mod 2024-04-04 13:08:53 +03:00
432c089d55 mod 2024-04-04 12:49:08 +03:00
add41635c5 mod 2024-04-03 16:40:52 +03:00
9127c054e3 mod 2024-04-03 16:38:22 +03:00
17a5106e39 mod 2024-04-03 15:42:24 +03:00
716cf88968 mod 2024-04-03 15:41:57 +03:00
4830d49d54 mod 2024-04-03 15:41:08 +03:00
83a21ef9cf mod 2024-04-03 13:58:23 +03:00
a4bed79df6 mod 2024-04-03 13:17:50 +03:00
174c9da20a add zfs 2024-04-03 13:16:43 +03:00
d2041fd3dc mod 2024-04-03 10:03:49 +03:00
968aa28372 mod 2024-04-03 10:03:12 +03:00
f125130270 ssh mod 2024-04-03 10:01:52 +03:00
2fc65cae76 ssh mod 2024-04-03 09:14:24 +03:00
644d5d8f0f mod 2024-02-02 12:34:50 +03:00
Долгий Артём
335453e1d4 Merge branch 'master' of ssh://git.da2001.ru:2222/da2001/notes 2023-11-21 11:38:02 +03:00
Долгий Артём
bb3f2027da mod 2023-11-21 11:37:56 +03:00
b0e21e54dc mod 2023-11-20 18:04:09 +03:00
8b86c47d46 mod 2023-11-19 19:37:46 +03:00
ebd2884bbd add OrangePI PVE install 2023-11-17 17:24:08 +03:00
a3123b7dee mod 2023-11-17 17:00:23 +03:00
Долгий Артём
17b1a70b75 ad opi 2023-11-17 16:09:38 +03:00
73c8d04e2f Обновить Самоподписный сертификат (ssl).md 2023-11-01 17:10:12 +03:00
Долгий Артём
05f0c155ed mod 2023-11-01 16:29:36 +03:00
Долгий Артём
b75271b8bf mod 2023-10-16 14:39:11 +03:00
Долгий Артём
d489a7d1d7 mod 2023-10-16 14:37:58 +03:00
Долгий Артём
ded6647ba7 mod 2023-10-16 14:36:55 +03:00
Долгий Артём
b9f2db9e08 mod 2023-10-16 14:32:30 +03:00
Долгий Артём
b3f462262d Merge branch 'master' of ssh://git.da2001.ru:2222/da2001/notes 2023-10-16 14:29:06 +03:00
Долгий Артём
f76f760984 add ssl 2023-10-16 14:28:54 +03:00
38252c3322 mod samba 2023-09-21 15:52:07 +03:00
Долгий Артём
905705174e mod samba 2023-09-21 15:46:18 +03:00
Долгий Артём
c68611eb1d mod samba 2023-09-21 15:43:22 +03:00
Долгий Артём
eee73c4b0c mod samba 2023-09-21 15:42:03 +03:00
Долгий Артём
ffc8999953 mod samba 2023-09-21 15:39:24 +03:00
1468072000 Обновить samba_sc_dns.md 2023-09-18 21:15:10 +03:00
e21538c5a3 Обновить samba_sc_dns.md 2023-09-18 21:14:55 +03:00
7bc9f85bad Обновить samba_sc_dns.md 2023-09-18 21:14:29 +03:00
475d7ff342 add samba_sc_dns 2023-09-16 15:55:54 +03:00
24c0bc8893 add syssoft link 2023-08-09 14:14:21 +03:00
80974b63a2 mod 2023-08-08 21:54:03 +03:00
fc56a8e927 mod autofs 2023-08-08 21:52:45 +03:00
765974be6a Обновить wireguard.md 2023-07-07 19:30:18 +03:00
be5a833b2a add ACME renew DNS 2023-02-14 15:20:24 +03:00
348dad9f4b Изменил(а) на 'Proxmox/shared_clipboard.md' 2022-11-11 15:51:28 +03:00
44846f85db Создал(а) 'Proxmox/shared_clipboard' 2022-11-11 15:51:01 +03:00
706a502dc3 mod last 3 copies command 2022-11-01 16:12:03 +03:00
9512bb4ba2 изменение команды хранения послених 3-х бекапов 2022-10-13 19:57:26 +03:00
a163b2dd42 Merge branch 'master' of ssh://git.da2001.ru:2222/da2001/notes 2022-09-26 16:09:46 +03:00
6a34e4d534 Изменил(а) на 'rpi_backup.md'
изменил команду перезагрузки
2022-09-12 13:29:18 +03:00
6866917126 Изменил(а) на 'rpi_backup.md'
добавил перенапревление вывода в файл
2022-09-02 13:38:22 +03:00
33 changed files with 5909 additions and 255 deletions

View File

@@ -0,0 +1,5 @@
# Общий буфер обмена
Общий буфер обмена будет работать в ВМ с графикой SPICE в vm-viewer, при этом в vm-viewer необходимо включить поддержку общего буфера обмена - Preferences -> Разделить буфер обмена.
Кроме этого, в самой ВМ необходимо установить пакет spice-vdagent

View File

@@ -1,35 +1,45 @@
### Монтирование сетевых папок с помощью NFS
# Монтирование сетевых папок с помощью NFS
```bash
sudo apt install autofs
```
**Настройка**
## Настройка
Для настройки autofs в файле `/etc/auto.master` необходимо добавить строку
```
```bash
/nfs /etc/auto.nfs --timeout=60
```
Здесь --timeout=60 указывает отмонтировать раздел при отсутствии активности на нём более чем 60 секунд.
Создаем в корне файловой системы папку `/nfs` :
```bash
sudo touch /etc/auto.nfs && sudo mkdir /nfs
````
В файле `/etc/auto.nfs` добавляем строку
```
disk1 -rw,soft,intr,rsize=8192,wsize=8192 192.168.13.8:/mnt/disk1
disk2 -rw,soft,intr,rsize=8192,wsize=8192 192.168.13.8:/mnt/disk2
disk3 -rw,soft,intr,rsize=8192,wsize=8192 192.168.13.8:/mnt/disk3
```bash
video -rw,soft,intr,rsize=8192,wsize=8192 nas.dav.lan:/mnt/media/video
data -rw,soft,intr,rsize=8192,wsize=8192 nas.dav.lan:/mnt/main/data
```
Перезапускаем службу autofs :
```bash
sudo service autofs restart
```
```bash
mkdir ~/DNAS_nfs
ln -s /nfs/disk1 ~/DNAS_nfs/disk1
ln -s /nfs/disk2 ~/DNAS_nfs/disk2
mkdir ~/nas_nfs
ln -s /nfs/data ~/nas_nfs/data
ln -s /nfs/video ~/nas_nfs/video
mkdir ~/nas_syssoft
ln -s /nfs/data/Syssoft ~/nas_syssoft/Syssoft
```

View File

@@ -47,6 +47,20 @@ sudo certbot certonly --dry-run \
Настройка производилась по статье из [хабра](https://habr.com/ru/post/318952/)
**Вручную обновить ACME сертификат Let's Encrypt с помощью записи в DNS**
```bash
sudo certbot --manual --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns certonly --server https://acme-v02.api.letsencrypt.org/directory -d *.syssoft.su -d syssoft.su
```
Добавить в DNS TXT запись предложенного содержания. Let'sEncrypt отправляет запрос авторитативному DNS серверу домена. Таким образом необходимо убедиться, что проверка проходит именно на АВТОРИТАТИВНОМ DNS!
```bash
nslookup -type=txt _acme-challenge.syssoft.su. ns1.reg.ru
```
как только получен ответ с ожидаемой записью, можно нажать Enter.
***
**Получение wildcard сертификата на все поддомены**

54
clonezilla.md Normal file
View 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
View File

@@ -1,70 +1,181 @@
## git
# git
- [git](#git)
- [Отображение статуса репозитория в приглашении](#отображение-статуса-репозитория-в-приглашении)
- [Аутентификация на GitHub с помощью SSH-ключа](#аутентификация-на-github-с-помощью-ssh-ключа)
- [Добавление SSH-ключа на GitHub](#добавление-ssh-ключа-на-github)
- [Работа с удаленным репозиторием](#работа-с-удаленным-репозиторием)
- [Указание конкретного ключа для репозитория](#указание-конкретного-ключа-для-репозитория)
- [Синхронизация своей ветки с изменениями master](#синхронизация-своей-ветки-с-изменениями-master)
- [Полная последовательность для Rebase:](#полная-последовательность-для-rebase)
## Отображение статуса репозитория в приглашении
#### 1. Отображение статуса репозитория в приглашении
Это дополнительный функционал, который не требуется для работы с Git, но очень помогает в этом. При работе с Git очень удобно, когда можно сразу определить, находитесь вы в обычном каталоге или в репозитории Git. Кроме того, было бы хорошо понимать статус текущего репозитория. Для этого нужно установить специальную утилиту, которая будет показывать статус репозитория. Для установки утилиты надо скопировать её репозиторий в домашний каталог пользователя, под которым вы работаете:
```
```bash
cd ~
git clone https://github.com/magicmonty/bash-git-prompt.git .bash-git-prompt --depth=1
```
А затем добавить в конец файла .bashrc такие строки:
```
```bash
GIT_PROMPT_ONLY_IN_REPO=1
source ~/.bash-git-prompt/gitprompt.sh
```
Для того, чтобы изменения применились, перезапустить bash:
```
```bash
exec bash
```
Теперь, если вы находитесь в обычном каталоге, приглашение выглядит стандартно, а если в каталоге, в котором инициализирован репозиторий git, это будет указано.
#### 2. Аутентификация на GitHub с помощью SSH-ключа
###### Генерация нового SSH-ключа (используйте e-mail, который привязан к GitHub):
```
[вверх](#git)
***
## Аутентификация на GitHub с помощью SSH-ключа
Генерация нового SSH-ключа (используйте e-mail, который привязан к GitHub):
```bash
ssh-keygen -t rsa -b 4096 -C "github_email@gmail.com"
```
На всех вопросах достаточно нажать Enter (более безопасно использовать ключ с passphrase, но можно и без, если нажать Enter при вопросе, тогда passphrase не будет запрашиваться у вас постоянно при операциях с репозиторием).
Запуск SSH-агента (пропускаем на Windows):
```
```bash
eval "$(ssh-agent -s)"
```
Добавить ключ в SSH-агент (пропускаем на Windows):
```
```bash
ssh-add ~/.ssh/id_rsa
```
###### Добавление SSH-ключа на GitHub
[вверх](#git)
***
## Добавление SSH-ключа на GitHub
Для добавления ключа надо его скопировать.
Например, таким образом можно отобразить ключ для копирования:
```
```bash
cat ~/.ssh/id_rsa.pub
```
После копирования надо перейти на GitHub. Находясь на любой странице GitHub, в правом верхнем углу нажмите на картинку вашего профиля и в выпадающем списке выберите «Settings». В списке слева надо выбрать поле «SSH and GPG keys». После этого надо нажать «New SSH key» и в поле «Title» написать название ключа (например «Home»), а в поле «Key» вставить содержимое, которое было скопировано из файла ~/.ssh/id_rsa.pub
Чтобы проверить, всё ли прошло успешно, попробуйте выполнить команду:
```
```bash
ssh -T git@github.com
```
Вывод должен быть таким:
```
```bash
$ ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
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
```
После внесения измений в локальные файлы проверяем состояние локального репозитория
```
```bash
git status
```
Необходимо добавить файлы в отслеживаемые
```
```bash
git add <имя файла>
```
Создадим коммит
```
```bash
git commit -m "описание изменений"
```
Синхронизируем локальный и удаленный репозитории
```
```bash
git push
```
[вверх](#git)
***
## Указание конкретного ключа для репозитория
1. Клонировать репозиторий с указанием необходимого ключа
```bash
git clone -c core.sshCommand="/usr/bin/ssh -i /home/da2001/.ssh/sape_a.dolgiy" ssh://git@gitlab.sapient.ru:7999/devops/salt.git
```
2. Указать в настройках локального репозитория необходимый ключ
```bash
git config --local core.sshCommand "/usr/bin/ssh -i /home/da2001/.ssh/sape_a.dolgiy"
```
[вверх](#git)
***
## Синхронизация своей ветки с изменениями master
### Полная последовательность для Rebase:
```bash
# 1. Переключиться на основную ветку
git switch master
# 2. Обновить локальную основную ветку с удаленного репозитория
git pull origin master
# 3. Вернуться на свою рабочую ветку
git switch your_branch
# 4. Перебазировать ваши коммиты на актуальный master
git rebase master
```
При возникновении конфликтов
```bash
# Во время rebase Git сообщит о конфликтах
# 1. Редактируете файлы, устраняете конфликты
# 2. Добавляете исправленные файлы:
git add <исправленные-файлы>
# 3. Продолжаете rebase:
git rebase --continue
# Или отменяете rebase если что-то пошло не так:
git rebase --abort
```
[вверх](#git)
***

BIN
images/greeting_12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

71
images/ssh01.drawio Normal file
View 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="&lt;font color=&quot;#1b0490&quot;&gt;Интернет&lt;/font&gt;" 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

301
iptables.md Normal file
View 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
```

View File

@@ -1,83 +1,93 @@
## Linux useful
# Linux useful
###### top
[Текущая директория сервера в браузере по адресу `http://server_ip:8000/`](#tip001)
[Запустить графическое приложение через ssh соединение `-Y`](#tip002)
[Отобразить все группы пользователя](#tip003)
[SSH соединение через промежуточный хост](#tip004)
[SSH соединение без проверки подлинности ключа и его сохранения](#tip005)
[Изменить первичную группу пользователя в текщем сеансе](#tip006)
[Сохранить man в pdf](#tip007)
[Прервать выполнение команды через 5 секунд](#tip008)
[Инфо об ОС](#tip009)
[Выполнить команду несколько раз в цикле](#tip010)
[Конвертировать изоражения heic в jpg](#tip011)
[Конвертировать jpg в pdf](#tip012)
[получить UUID диска для монтирования](#tip013)
[Сброс пароля root](#tip014)
[Проверить доступность диапазона хостов](#tip015)
[Конвертировать pdf в png](#tip016)
[Узнать загрузку процессора определённым процессом](#tip017)
- [Linux useful](#linux-useful)
- [Текущая директория сервера в браузере по адресу `http://server_ip:8000/`](#текущая-директория-сервера-в-браузере-по-адресу-httpserver_ip8000)
- [Запустить графическое приложение через ssh соединение `-Y`](#запустить-графическое-приложение-через-ssh-соединение--y)
- [Отобразить все группы пользователя\*\*](#отобразить-все-группы-пользователя)
- [SSH соединение через промежуточный хост\*\*](#ssh-соединение-через-промежуточный-хост)
- [SSH соединение без проверки подлинности ключа и его сохранения](#ssh-соединение-без-проверки-подлинности-ключа-и-его-сохранения)
- [Изменить первичную группу пользователя в текщем сеансе](#изменить-первичную-группу-пользователя-в-текщем-сеансе)
- [Сохранить man в pdf](#сохранить-man-в-pdf)
- [Прервать выполнение команды через 5 секунд](#прервать-выполнение-команды-через-5-секунд)
- [Инфо об ОС](#инфо-об-ос)
- [Выполнить команду несколько раз в цикле](#выполнить-команду-несколько-раз-в-цикле)
- [Конвертировать изоражения heic в jpg](#конвертировать-изоражения-heic-в-jpg)
- [Конвертировать jpg в pdf](#конвертировать-jpg-в-pdf)
- [получить UUID диска для монтирования](#получить-uuid-диска-для-монтирования)
- [Сброс пароля root](#сброс-пароля-root)
- [Проверить доступность диапазона хостов](#проверить-доступность-диапазона-хостов)
- [Конвертировать pdf в png](#конвертировать-pdf-в-png)
- [Узнать загрузку процессора определённым процессом](#узнать-загрузку-процессора-определённым-процессом)
- [Определить страну, город и др. детали по IP](#определить-страну-город-и-др-детали-по-ip)
- [Отобразить файл без комментариев и путых строк](#отобразить-файл-без-комментариев-и-путых-строк)
- [Изменить консольный редактор по-умолчанию](#изменить-консольный-редактор-по-умолчанию)
- [Перенос строк в nano](#перенос-строк-в-nano)
- [Генератор паролей](#генератор-паролей)
- [Импорт ssh ключа из Интернет](#импорт-ssh-ключа-из-интернет)
***
###### tip001
:large_blue_circle: **Текущая директория сервера в браузере по адресу `http://server_ip:8000/`**
## Текущая директория сервера в браузере по адресу `http://server_ip:8000/`
```bash
python -m SimpleHTTPServer
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip002
:large_blue_circle: **Запустить графическое приложение через ssh соединение `-Y`**
## Запустить графическое приложение через ssh соединение `-Y`
*для текущей сессии*
```bash
ssh -Y pi@server_ip
```
*для всех подключений*
`ForwardX11 yes` в файле `/etc/ssh/ssh_config`
[вверх](#top)
[вверх](#linux-useful)
***
###### tip003
:large_blue_circle: **Отобразить все группы пользователя**
## Отобразить все группы пользователя**
```bash
da2001@Metromint:~$ groups da2001
da2001 : da2001 adm cdrom sudo dip plugdev kvm lpadmin sambashare wireshark libvirt
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip004
:large_blue_circle: **SSH соединение через промежуточный хост**
## SSH соединение через промежуточный хост**
```bash
ssh -t pi@192.168.89.2 ssh da2001@192.168.1.8
```
*сначала будет запрошен пароль от 192.168.89.2, затем от 192.168.1.8*
[вверх](#top)
[вверх](#linux-useful)
***
###### tip005
:large_blue_circle: **SSH соединение без проверки подлинности ключа и его сохранения**
## SSH соединение без проверки подлинности ключа и его сохранения
```bash
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.2.1
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip006
:large_blue_circle: **Изменить первичную группу пользователя в текщем сеансе**
## Изменить первичную группу пользователя в текщем сеансе
```bash
[lisa@server1 ~]$ groups
lisa account sales
@@ -89,14 +99,15 @@ sales lisa account
total 0
-rw-r--r--. 1 lisa sales 0 Feb 6 10:06 file1
```
*теперь все новые файлы будут принадлежать группе sales*
[вверх](#top)
[вверх](#linux-useful)
***
###### tip007
:large_blue_circle: **Сохранить man в pdf**
## Сохранить man в pdf
```bash
man -t <программа> | ps2pdf - <filename>.pdf
```
@@ -105,22 +116,22 @@ man -t <программа> | ps2pdf - <filename>.pdf
man -t tar | ps2pdf - tar_man.pdf
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip008
:large_blue_circle: **Прервать выполнение команды через 5 секунд**
## Прервать выполнение команды через 5 секунд
```bash
timeout 5s command
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip009
:large_blue_circle: **Инфо об ОС**
## Инфо об ОС
```bash
cat /etc/*release
```
@@ -161,12 +172,12 @@ da2001@Metromint:~$ neofetch
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip010
:large_blue_circle: **Выполнить команду несколько раз в цикле**
## Выполнить команду несколько раз в цикле
```bash
da2001@Metromint:~$ for i in {1..5}; do echo $i; done
1
@@ -175,74 +186,92 @@ da2001@Metromint:~$ for i in {1..5}; do echo $i; done
4
5
```
*выполнение скрипта с параметрами в цикле*
```bash
for i in {1..20}; do ./wlt_start.py -c config_m716.cfg; done
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip011
:large_blue_circle: **Конвертировать изоражения heic в jpg**
## Конвертировать изоражения heic в jpg
```bash
sudo apt-get install libheif-examples
```
*для конвертации одного изображения*
```bash
heif-convert IMG_1234.HEIC IMG_1234.jpg
```
*для конвертации всех изображений в папке*
```bash
mkdir jpg
for file in *.heic; do heif-convert $file ./jpg/${file/%.heic/.jpg}; done
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip012
:large_blue_circle: **Конвертировать jpg в pdf**
## Конвертировать jpg в pdf
*необходим установленный ImageMagick*
```bash
sudo apt install imagemagick
```
*для конвертации одного изображения*
```bash
convert image.jpg out.pdf
```
*для конвертации нескольких изображений*
```bash
convert image1.jpg image2.jpg image3.jpg out.pdf
```
***если в процессе конвертации будет получено сообщение об ошибке***
```bash
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
```
в файле `/etc/ImageMagick-7/policy.xml` необходимо изменить директиву доступа
*название папки ImageMagick-7 может отличаться в зависимости от установленной версии*
между тегами `<policymap>` и `</policymap>`
добавить/отредактировать
```bash
<policy domain="coder" rights="read | write" pattern="PDF" />
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip013
:large_blue_circle: **получить UUID диска для монтирования**
## получить UUID диска для монтирования
**Вариант 1**
```bash
lsblk -n -o uuid /dev/sda1
```
-n - не выводить заголовки
-o - отображаемое поле
*таким образом, для раздела с ФС ext4, запись в fstab можно добавить таким образом*
```bash
mkdir /mntdir
@@ -251,82 +280,103 @@ sudo bash -c 'echo "UUID=$UUID /mntdir ext4 defaults 0 0" >> /etc/fstab'
```
**Вариант 2**
```bash
[root@server1 ~]# blkid -o export /dev/sda2 | grep '^UUID'
UUID=d056212f-b1ea-4bc5-ba4e-99d036e5531e
```
*таким образом, можно перенаправить вывод в `/etc/fstab` и руками дополнить параметры монтирования*
```bash
blkid -o export /dev/sda2 | grep '^UUID' >> /etc/fstab
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip014
:large_blue_circle: **Сброс пароля root**
## Сброс пароля root
**CentOS/RedHat Linux**
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
3. После появления приглашения консоли необходимо получить доступ к образу системы
```bash
mount -o remount,rw /sysroot
```
4. Изменить корневой каталог
- Изменить корневой каталог
```bash
chroot /sysroot
```
5. Теперь можно изменить пароль root
- Теперь можно изменить пароль root
```bash
passwd
```
будет предложено ввести новый пароль дважды.
6. Поскольку на ранней стадии загрузки SELinux еще не был активирован, тип контекста в `/etc/shadow` будет перепутан. Если сейчас перезагрузиться, никто не сможет войти в систему. Поэтому необходимо убедиться, что тип контекста установлен правильно. Для этого на этом этапе нужно загрузить политику SELinux с помощью команды
Поскольку на ранней стадии загрузки SELinux еще не был активирован, тип контекста в `/etc/shadow` будет перепутан. Если сейчас перезагрузиться, никто не сможет войти в систему. Поэтому необходимо убедиться, что тип контекста установлен правильно. Для этого на этом этапе нужно загрузить политику SELinux с помощью команды
```bash
load_policy -i
```
7. Теперь нужно вручную установить правильный тип контекста в `/etc/shadow`.
- Теперь нужно вручную установить правильный тип контекста в `/etc/shadow`.
```bash
chcon -t shadow_t /etc/shadow
```
**вместо 6,7 пунктов можно просто в корне создать файл `.autorelabel`**
```bash
touch /.autorelabel
```
8. Всё, после перезагрузки, у root будет новый пароль.
Всё, после перезагрузки, у root будет новый пароль.
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
```bash
reboot -f
```
**Debian**
1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)
3. После появления приглашения консоли необходимо получить доступ к образу системы
```bash
mount -o remount,rw /
```
4. Теперь можно изменить пароль root
Теперь можно изменить пароль root
```bash
passwd
```
будет предложено ввести новый пароль дважды.
5. Всё, после перезагрузки, у root будет новый пароль.
Всё, после перезагрузки, у root будет новый пароль.
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*
```bash
reboot -f
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip015
:large_blue_circle: **Проверить доступность диапазона хостов**
## Проверить доступность диапазона хостов
```bash
for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done
```
@@ -339,20 +389,23 @@ for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i -
192.168.1.13 - НЕ доступен
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip016
:large_blue_circle: **Конвертировать pdf в png**
## Конвертировать pdf в png
```bash
pdftoppm input.pdf outputname -png
```
*в результате каждая страница в PDF будет сохранена в формате outputname-01.png, где 01 будет номером страницы*
**Конвертировать одну страницу или диапазон**
```bash
pdftoppm input.pdf outputname -png -f {page} -singlefile
```
*Измените `{page}` на номер страницы. Он проиндексирован как 1, поэтому `-f 1` будет первой страницей.*
*Если вы хотите работать с диапазоном страниц, вы также можете указать номер для флага `-l` (последняя страница), поэтому при использовании `-f 1 -l 30` будут указаны страницы от 1 до 30.*
@@ -361,36 +414,113 @@ pdftoppm input.pdf outputname -png -f {page} -singlefile
*Разрешение по умолчанию для этой команды составляет 150 точек на дюйм.*
*Чтобы увеличить разрешение преобразованного PDF-файла, добавьте параметры `-rx` {разрешение} и `-ry` {разрешение}.*
```bash
pdftoppm input.pdf outputname -png -rx 300 -ry 300
```
[вверх](#top)
[вверх](#linux-useful)
***
###### tip017
:large_blue_circle: **Узнать загрузку процессора определённым процессом**
## Узнать загрузку процессора определённым процессом
**ps**
*по имени процесса*
```bash
ps -C iperf -o %cpu=
```
*по номеру процесса*
```bash
ps -p 23635 -o %cpu=
```
или
```bash
ps -p $(pgrep iperf) -o %cpu=
```
**top**
```bash
top -b -n 2 -d 0.2 -p PID_ID | tail -1 | awk '{print $9}'
```
**Нагрузить процессор для проверки**
```bash
cat /dev/zero > /dev/null
```
[вверх](#top)
[вверх](#linux-useful)
***
## Определить страну, город и др. детали по IP
```bash
curl -s "https://ifconfig.co/json?ip=$1" | jq -r '.country, .city, .hostname, .asn_org'
```
или функция
```bash
getip() {
curl -s "https://ifconfig.co/json?ip=$1" | jq -r '.country, .city, .hostname, .asn_org'
}
```
[вверх](#linux-useful)
## Отобразить файл без комментариев и путых строк
```bash
grep -vE '(^[[:space:]]*([#;!].*)?$)' file
```
[вверх](#linux-useful)
## Изменить консольный редактор по-умолчанию
```shell
which nano
/usr/bin/nano
export EDITOR=/usr/bin/nano
```
[вверх](#linux-useful)
## Перенос строк в nano
Для включения переноса строк в текщум редакторе необходимо нажать `Esc` + `$`.
обозначение `Esc` + `$` означает нажатие и отпускание `Esc`, а затем нажатие `$`.
Тогда полная последовательность нажатий клавиш будет `Esc`, `Shift+4`
[вверх](#linux-useful)
## Генератор паролей
В качестве простого генератора паролей удобно использовать `pwqgen`. Он генерирует легкозапоминаемые пароли.
[вверх](#linux-useful)
## Импорт ssh ключа из Интернет
```shell
wget -qO- https://da2001.ru/ssh.pub >> ~/.ssh/authorized_keys
```
или
```shell
curl https://da2001.ru/ssh.pub >> ~/.ssh/authorized_keys
```
[вверх](#linux-useful)

674
mysql.md Normal file
View 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
View 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
View File

@@ -0,0 +1,75 @@
# Заметки к книге Обеспечение высокой доступности систем на основе MySQL
Применяя репликацию для масштабирования, важно знать, что репликация MySQL является асинхронной. То есть, сначала транзакции фиксируются на главном сервере, а затем реплицируются на подчиненный сервер и там исполняются. Это означает, что при непрерывной репликации подчиненный сервер будет «отставать» от главного.
## Установка MySQL
Подробнее описано здесь - https://git.da2001.ru/da2001/notes/src/branch/master/mysql.md
```bash
su -
wget https://dev.mysql.com/get/mysql-apt-config_0.8.36-1_all.deb
apt install -y ./mysql-apt-config_0.8.36-1_all.deb
dpkg-reconfigure mysql-apt-config
apt update
apt install mysql-server
```
## Репликация - первые шаги
### Настройка главного сервера
Для работы репликации необходим двоичный жернал и уникальный идентификатор сервера.
```bash
cat my.cnf
...
log-bin = master-bin
log-bin-index = master-bin.index
server-id = 1
```
- `master-bin` - базовое имя для давоичного журнала, журналов может быть несколько
- `master-bin.index` - имя индексного файла двоичного журнала, в котором содержится список всех файлов двоичного журнала
Для того чтобы подключить подчиненный сервер, на главном сервере должен быть пользователь с особыми полномочиями репликации.
Создание пользователя репликации на главном сервере (в книге используется устаревший вариант, предлагаю современный)
```bash
master> CREATE USER 'repl_user'@'%' IDENTIFIED BY 'strong_password';
Query OK, 0 rows affected (0.00 sec)
master> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
```
### Настройка подчинённого сервера
```bash
cat my.cnf
...
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
server-id = 2
```
### Подключение подчинённого сервера к главному
В книге используется устаревший вариант, предлагаю современный
```bash
slave> CHANGE REPLICATION SOURCE TO
SOURCE_HOST = 'master-1',
SOURCE_PORT = 3306,
SOURCE_USER = 'repl_user',
SOURCE_PASSWORD = 'strong_password',
SOURCE_LOG_FILE = 'mysql-bin.000002', # обязательно!
SOURCE_LOG_POS = 158, # обязательно!
SOURCE_CONNECTION_AUTO_FAILOVER = 1, # опционально, для асинхронной реплики
GET_SOURCE_PUBLIC_KEY = 1; # для MySQL 8.0 с sha2
Query OK, 0 rows affected (0.00 sec)
slave> START REPLICA;
Query OK, 0 rows affected (0.15 sec)
```

111
orangepi5plus_backup.md Normal file
View File

@@ -0,0 +1,111 @@
# Описание процесса создания резервной копии eMMC OrangePi 5 Plus
В OrangePi 5 Plus нельзя изменить приоритет загрузки, в первую очередь загрузка происходит с SD карты, если загрузчик на SD карте не находится, производится попытка загрузки с eMMC и т.д. Таким образом, для того, чтобы создать образ диска eMMC достаточно загрузиться с SD карты и средствами команды `dd` выполнить создание образа диска eMMC.
1. Обеспечить подключение к хранилищу резервных копий по SSH на основе ключа пользователю root, т.к. скрипт будет выполняться от его имени
```bash
root@opisd:~# ssh-keygen
root@opisd:~# ssh-copy-id da2001@nas.dav.lan
```
1. Подготовить скрипт, который выполнит создание образа eMMC и передаст его по SSH в сетевое хранилище
```bash
da2001@opisd:~$ sudo vim /opt/backup_opi/opi_backup.sh
```
```bash
#!/bin/bash
###################################################################################################
# Скрипт создаёт образ eMMC OrangePI 5 Plus и отправляет его на удалённый сервер по SSH,
# при этом на удалённом сервере происходит сжатие образа для экономии места.
# Сжатие происходит на удалённом сервере, чтобы минимизировать операции записи на Flash память,
# с которой произведена загрузка OrangePI.
###################################################################################################
# Убедиться, что запуск происходит от root
if [ "$EUID" -ne 0 ]
then echo "Скрипт необходимо запускать от администратора"
exit
fi
# Удалённый сервер. Необходимо предварительно обеспечить доступ по ключам - ssh-keygen && ssh-sopy-id user@server
server=da2001@nas.dav.lan
# Путь сохранения на удалённом сервре
remote_path=/mnt/main/data/Backup/opi1
# Необходимо синхронизировать время
chronyc -a makestep
# Имя образа
name=$(echo $(date +%Y-%m-%d)_${HOSTNAME}_image.img.gz | sed 's/-emmc//')
# Имя диска, над которым будем работать. SD в RPI называется mmcblk0
disk=/dev/mmcblk1
# запишем в переменную последний сектор последнего раздела диска
last_sector=$(fdisk -l -o end $disk | tail -1)
# Считаем, что размер сектора составляет 512 Байт, тогда необходимо сохранить ($last_sector+1)*512 Байт.
# Или ($last_sector+1)*512/1024/1024 Мб.
count=$(($(($last_sector+1))*512/1024/1024))
# Команда создания образа
dd if=$disk bs=1M count=$count conv=noerror,sync | ssh $server "gzip -c > $remote_path/$name 2>> $remote_path/lastlog" && \
ssh $server "echo `date +"%A, %d %B %Y"` - Образ создан успешно >> $remote_path/log" || \
ssh $server "echo `date +"%A, %d %B %Y"` - При создании образа произошла ошибка >> $remote_path/log"
# Необходимо хранить только последние 20 строк в файле log
ssh $server 'echo "$(tail -5 $remote_path/log)" > $remote_path/log'
# Необходимо хранить только последние 3 резервные копии
count_copies=3
ssh $server "find $remote_path -type f -name '*_image.img.gz' -printf '%T@ %p\n' | sort -nr | cut -d' ' -f 2- | tail -n +$(($count_copies+1)) | xargs rm -f --"
# Перезагрузка
/usr/sbin/reboot
```
Добавить права на выполнение
```bash
da2001@opisd:~$ sudo chmod +x /opt/backup_opi/opi_backup.sh
```
**!!Актуализировать!!**
7. Обеспечить выполнение скрипта при загрузке с SD. Сервис systemd
Для этого вам нужно создать скрипт запуска systemd и поместить его в каталог `/etc/systemd/system/`.
```bash
da2001@opisd:~$ sudo vim /etc/systemd/system/rpi_backup.service
```
```bash
da2001@opisd:~$ cat /etc/systemd/system/rpi_backup.service
[Unit]
Description=Run a Backup Script at Startup
After=default.target
[Service]
ExecStart=/opt/backup_rpi/rpi_backup.sh
[Install]
WantedBy=default.target
```
Перечитать скрипты и активировать созданный сервис
```bash
pi@host-usb:~ $ sudo systemctl daemon-reload
pi@host-usb:~ $ sudo systemctl enable rpi_backup.service
```
***

View File

@@ -0,0 +1,79 @@
# Описание процесса установки ОС на eMMC одноплатного компьютера Orange PI 5 Plus
Дано:
- плата Orange PI 5 Plus
- SD-карта 16 Гб
- модуль eMMC установлен в плату
- SSD накопитель для данных установлен в плату
## Выбор ОС
Для Orange PI 5 Plus доступно несколько вариантов ОС:
- от производителя платы - [Shenzhen Xunlong Software](http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-5-plus-32GB.html)
- от сообщества [Armbian](https://www.armbian.com/orange-pi-5-plus/)
- от энтузиаста [Joshua-Riek/ubuntu-rockchip](https://github.com/Joshua-Riek/ubuntu-rockchip)
Образы от Joshua-Riek поддерживают аппаратное 3D ускорение и используют стандартные репозитории Ubuntu. В примере будет использован образ на основе Ubuntu 24.04 Desktop с рабочим столом Gnome с Wayland.
## Запись образа на SD-карту
- Скачать образ - <https://joshua-riek.github.io/ubuntu-rockchip-download/boards/orangepi-5-plus.html>
- Записать образ на SD-карту с помощью утилит типа [balenaEtcher](https://etcher.balena.io/)
- Расширить раздел на SD-карте и скопировать туда файл образа в формате `.img`. Таким образом получится на SD-карту образ будет записан дважды: сначала с помощью утилиты [balenaEtcher](https://etcher.balena.io/), а затем на карту скопирован файл образа. Это необходимо для копирования образа на eMMC
- Установить SD-карту в плату
## Запись образа на eMMC
После включения Orange PI 5 Plus с установленной SD-картой, загрузка будет выполнена с SD-карты.
При первой загрузке происходит предварительная настройка ОС - установка локали, создание пользователи и т.д.
Образ ОС хранится в виде `.img` на SD-карте, его необходимо скопировать на eMMC.
Необходимо определить наименование eMMC в системе, в моём случае это `mmcblk0`
```shell
da2001@opi:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 69,2M 1 loop /snap/core22/1624
loop1 7:1 0 94,4M 1 loop /snap/lxd/30134
loop2 7:2 0 33,7M 1 loop /snap/snapd/21761
mtdblock0 31:0 0 16M 0 disk
mmcblk1 179:0 0 14,8G 0 disk
└─mmcblk1p1 179:1 0 14,8G 0 part /
mmcblk0 179:32 0 233G 0 disk
mmcblk0boot0 179:64 0 4M 1 disk
mmcblk0boot1 179:96 0 4M 1 disk
nvme0n1 259:0 0 953,9G 0 disk
├─nvme0n1p1 259:1 0 500G 0 part
├─nvme0n1p2 259:2 0 300G 0 part
└─nvme0n1p3 259:3 0 153,9G 0 part
```
Копирование образа - `dd if=ubuntu-24.04-preinstalled-desktop-arm64-orangepi-5-plus.img of=/dev/mmcblk0 bs=1M status=progress`
```shell
da2001@opi:~$ sudo -i
[sudo] password for da2001:
root@opi:~# ls
snap ubuntu-24.04-preinstalled-desktop-arm64-orangepi-5-plus.img
root@opi:~# dd if=ubuntu-24.04-preinstalled-desktop-arm64-orangepi-5-plus.img of=/dev/mmcblk0 bs=1M status=progress
7388266496 bytes (7,4 GB, 6,9 GiB) copied, 108 s, 68,4 MB/s
7097+0 records in
7097+0 records out
7441743872 bytes (7,4 GB, 6,9 GiB) copied, 110,743 s, 67,2 MB/s
root@opi:~# sync
root@opi:~#
```
## Завершение
После копирования образа на eMMC, компьютер необходимо выключить и извлечь SD-карту.
Следующая загрузка будет уже с eMMC.
***
<https://habr.com/ru/companies/timeweb/articles/861844/>

183
orangepi_pve.md Normal file
View File

@@ -0,0 +1,183 @@
# Настройка OrangePI 5 Plus Debian
## Установка Proxmox на OrangePI 5 Plus Debian
https://github.com/jiangcuo/Proxmox-Arm64/wiki/Install-Proxmox-VE-on-Debian-bullseye
1. Указать внешний IP в hosts
```bash
da2001@opve:~$ cat /etc/hosts
127.0.0.1 localhost
192.168.13.14 opve.dav.lan opve
::1 localhost orangepi5plus ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
```
1. Добавить репозиторий Proxmox VE
```bash
echo "deb https://global.mirrors.apqa.cn/proxmox/debian/pve bookworm port" > /etc/apt/sources.list.d/pveport.list
```
2. Добавить ключ репозитория
```bash
curl https://global.mirrors.apqa.cn/proxmox/debian/pveport.gpg -o /etc/apt/trusted.gpg.d/pveport.gpg
```
3. Обновить индексы пакетов
```bash
apt update && apt dist-upgrade -y
```
4. Установить необходимые пакеты
```bash
apt install ifupdown2
apt install proxmox-ve postfix open-iscsi
```
5. Перезагрузить устройство
```bash
reboot
```
***
## Debian 12 преднастроенный
```bash
su -
adduser da2001
usermod -aG 5,6,20,27,29,44,46,60,100,101,105,109,111,996,999 da2001
hostnamectl set-hostname opi.dav.lan
tee /etc/hosts<<EOF
192.168.13.14 opi.dav.lan opi
EOF
apt update && apt dist-upgrade -y
apt autoremove -y
orangepi-config
```
## Docker
Если не получилось настроить Proxmox, можно настроить Docker
### Сеть MacVLAN
```bash
docker network create -d macvlan \
--subnet=192.168.13.0/24 \
--gateway=192.168.13.1 \
-o parent=enP4p65s0 \
macvlan-net
```
где
`enP4p65s0` - сетевой интерфейс, подключенный к сети
**Узел docker не сможет взаимодействовать с созданной сетью macvlan, чтобы это изменить, необходимо создать интерфейс macvlan на узле со своим IP и маршрутом в сеть docker macvlan. Другие узлы сети без проблем взаимодействуют с клиентами сети docker macvlan, а это было целью. Таким образом, создавать дополнительный интерфейс и маршрут на узле не обязательно**
### Portainer
```bash
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
```
### Adguard Home
```bash
cd /home/da2001
mkdir /home/da2001/adguardhome && cd /home/da2001/adguardhome
docker run --name adguardhome\
--restart unless-stopped\
--network=macvlan-net \
--ip=192.168.13.28 \
--mac-address=02:42:ac:11:00:02 \
-v /home/da2001/adguardhome/work:/opt/adguardhome/work\
-v /home/da2001/adguardhome/conf:/opt/adguardhome/conf\
-p 53:53/tcp -p 53:53/udp\
-p 67:67/udp -p 68:68/udp\
-p 80:80/tcp -p 443:443/tcp -p 443:443/udp -p 3000:3000/tcp\
-p 853:853/tcp\
-p 784:784/udp -p 853:853/udp -p 8853:8853/udp\
-p 5443:5443/tcp -p 5443:5443/udp\
-d adguard/adguardhome
```
### BIND DNS
```bash
cd /home/da2001
mkdir /home/da2001/bind
docker run --name bind9 \
--restart unless-stopped\
--network=macvlan-net \
--ip=192.168.13.27 \
--mac-address=02:42:ac:11:00:03 \
-v /etc/timezone:/etc/timezone:ro \
-p 53:53 \
-v /home/da2001/bind/etc:/etc/bind \
-v /home/da2001/bind/cache:/var/cache/bind \
-v /home/da2001/bind/records:/var/lib/bind \
-e BIND9_USER=bind \
-d ubuntu/bind9
```
***
## Debian 11
su -
adduser da2001
usermod -aG 5,6,20,27,29,44,46,60,100,101,105,109,111,996,999 da2001
hostnamectl set-hostname opve1.dav.lan
tee /etc/hosts<<EOF
192.168.13.14 opve1.dav.lan opve1
EOF
mkdir /mnt/{iso,vms,backup}
sudo tee -a /etc/fstab<<EOF
UUID=091632c3-e0b2-4d27-9595-a00d59a3e50c /mnt/vms ext4 defaults 0 0
UUID=8a388dd8-000d-4f15-8e23-9838a460c378 /mnt/backup ext4 defaults 0 0
UUID=6fbd6031-3631-41b5-b4e8-e2b301bb59e5 /mnt/iso ext4 defaults 0 0
EOF
systemctl daemon-reload
mount -a
apt update && apt full-upgrade -y
echo "deb https://global.mirrors.apqa.cn/proxmox/debian/pve bullseye port">/etc/apt/sources.list.d/pveport.list
curl https://global.mirrors.apqa.cn/proxmox/debian/pveport.gpg -o /etc/apt/trusted.gpg.d/pveport.gpg
apt update && apt full-upgrade
apt install ifupdown2 -y
apt install proxmox-ve postfix open-iscsi -y
***

377
pnet.md Normal file
View 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
View 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"
```
После перезагрузки будет применено новое имя.

View File

@@ -87,6 +87,9 @@ fi
# Директория, в которой хранится конфигурационный файл EEPROM
eeprom_conf_path=/opt/backup_from_usb
# Перенаправить весь вывод и ошибки в файл
exec > $eeprom_conf_path/run_log 2>&1
# Необходимо убедиться, что в папке присутствует конфиг EEPROM для изменения порядка загрузки
eeprom_conf="usb_eeprom.conf"
@@ -99,7 +102,7 @@ fi
rpi-eeprom-config -a $eeprom_conf_path/$eeprom_conf
# Перезагрузка
reboot
/usr/sbin/reboot
```
Добавить права на выполнение
@@ -220,13 +223,13 @@ ssh $server 'echo "$(tail -5 $remote_path/log)" > $remote_path/log'
# Необходимо хранить только последние 3 резервные копии
count_copies=3
ssh $server "find . -type f -name '*_image.img.gz' -printf '%T@ %p\n' | sort -n | cut -d' ' -f 2- | tail -n +$(($count_copies+1)) | xargs rm -f --"
ssh $server "find $remote_path -type f -name '*_image.img.gz' -printf '%T@ %p\n' | sort -nr | cut -d' ' -f 2- | tail -n +$(($count_copies+1)) | xargs rm -f --"
# Необходимо переключить EEPROM на загрузку с SD карты
rpi-eeprom-config -a $eeprom_conf_path/$eeprom_conf
# Перезагрузка
reboot
/usr/sbin/reboot
```

145
samba-tool.md Normal file
View File

@@ -0,0 +1,145 @@
# Шпаргалка по командам samba-tool
- [Шпаргалка по командам samba-tool](#шпаргалка-по-командам-samba-tool)
- [Пользователи и группы](#пользователи-и-группы)
- [Создать пользователя](#создать-пользователя)
- [Отключить устаревание пароля для пользователя](#отключить-устаревание-пароля-для-пользователя)
- [Удалить пользователя](#удалить-пользователя)
- [Создать группу](#создать-группу)
- [Удалить группу](#удалить-группу)
- [Добавить пользователей в группу](#добавить-пользователей-в-группу)
- [Удалить пользователей из группы](#удалить-пользователей-из-группы)
- [Показать пользователей группы](#показать-пользователей-группы)
- [Работа со встроенным в Samba 4 DNS сервером](#работа-со-встроенным-в-samba-4-dns-сервером)
- [Запрос списка зон](#запрос-списка-зон)
- [Запрос информации о DNS зоне](#запрос-информации-о-dns-зоне)
- [Запрос всех DNS записей](#запрос-всех-dns-записей)
- [Смена типа DNS сервера (Встроенный/Bind9)](#смена-типа-dns-сервера-встроенныйbind9)
- [Создание записи типа А](#создание-записи-типа-а)
- [Создание зоны обратного просмотра](#создание-зоны-обратного-просмотра)
- [Создание записи в зоне обратного просмотра](#создание-записи-в-зоне-обратного-просмотра)
- [Запрос записей в зоне обратного просмотра](#запрос-записей-в-зоне-обратного-просмотра)
- [Специфичные запросы](#специфичные-запросы)
***
Больше информации здесь - <https://xinux.net/index.php/Samba-tool>
***
## Пользователи и группы
### Создать пользователя
```bash
amba-tool user create username
```
```bash
samba-tool user create ivanov P@ssw0rd \
--login-shell=/bin/bash \
--gecos='Иван Иванов' \
--given-name=Иван --surname=Иванов
```
### Отключить устаревание пароля для пользователя
```bash
samba-tool user setexpiry ivanov --noexpiry
```
### Удалить пользователя
```bash
samba-tool user delete username
```
### Создать группу
```bash
samba-tool group add groupname
```
### Удалить группу
```bash
samba-tool group delete groupname
```
### Добавить пользователей в группу
```bash
samba-tool group addmembers "Domain Users" user[,otheruser[,thirduser[,...]]]
```
### Удалить пользователей из группы
```bash
samba-tool group removemembers "Domain Users" user[,otheruser[,thirduser[,...]]]
```
### Показать пользователей группы
```bash
samba-tool group listmembers "Domain Users"
```
## Работа со встроенным в Samba 4 DNS сервером
### Запрос списка зон
```bash
samba-tool dns zonelist 127.0.0.1 -U Administrator
```
### Запрос информации о DNS зоне
```bash
samba-tool dns zoneinfo 127.0.0.1 local.acisi.ru -U Administrator
```
### Запрос всех DNS записей
```bash
samba-tool dns query 127.0.0.1 local.acisi.ru @ ALL -U Administrator
```
### Смена типа DNS сервера (Встроенный/Bind9)
```bash
samba_upgradedns --dns-backend=[BIND9_DLZ|SAMBA_INTERNAL]
```
### Создание записи типа А
```bash
samba-tool dns add 10.10.120.24 alt.lan COMP2 A 10.10.120.25 -Uadministrator
```
### Создание зоны обратного просмотра
для сети 192.168.13.0/24
```bash
samba-tool dns zonecreate 127.0.0.1 13.168.192.in-addr.arpa -Uadministrator
```
### Создание записи в зоне обратного просмотра
для узла dc1.alt.lan с адресом 192.168.13.139
```bash
samba-tool dns add 127.0.0.1 13.168.192.in-addr.arpa 139 PTR dc1.alt.lan -Uadministrator --password=P@ssw0rd
```
### Запрос записей в зоне обратного просмотра
```bash
samba-tool dns query 127.0.0.1 13.168.192.in-addr.arpa @ ALL -U Administrator
```
### Специфичные запросы
```bash
dig _msdcs.local.acisi.ru @127.0.0.1 SOA
```

290
ssh.md
View File

@@ -1,91 +1,331 @@
### ssh
Подключение
# SSH
- [SSH](#ssh)
- [Подключение](#подключение)
- [SSH аутентификация по ключам](#ssh-аутентификация-по-ключам)
- [Для дополнительной безопасности можно отключить доступ по паролю](#для-дополнительной-безопасности-можно-отключить-доступ-по-паролю)
- [Подключение через промежуточный хост](#подключение-через-промежуточный-хост)
- [SCP](#scp)
- [Не стандартный порт](#не-стандартный-порт)
- [ssh\_config](#ssh_config)
- [Общие параметры](#общие-параметры)
- [Пример конфигурации](#пример-конфигурации)
- [Проброс SSH ключа](#проброс-ssh-ключа)
- [Разово](#разово)
- [Постоянный проброс](#постоянный-проброс)
- [Проброс SSH ключей руту](#проброс-ssh-ключей-руту)
## Подключение
```bash
ssh admin@192.168.5.3
```
если имя пользователя не указывать, соединение произойдет от имени локального пользователя
```bash
ssh 192.168.5.3
```
не стандартный порт при подключении
```bash
ssh pi@da2001.ru -p 227
```
не добавлять публичный ключ удаленного хоста в локальный файл _**known_hosts**_, при этом будет запрошено подтверждение подключения
```bash
ssh -o UserKnownHostsFile=/dev/null admin@192.168.1.2
```
не проверять публичный ключ удаленного хоста
```bash
ssh -o StrictHostKeyChecking=no admin@192.168.1.2
```
не добавлять публичный ключ и не проверять удаленный хост
```bash
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.1.2
```
выполнить команду на сервере без подключения
```bash
ssh user@host ls
```
выполнить локальный скрипт
```bash
ssh da2001@192.168.1.2 'python3' < test.py
```
### scp
```bash
scp ./wlt.py pi@da2001.ru:/home/pi
```
использование не стандартного порта
```bash
scp -P 227 ./wlt.py pi@da2001.ru:/home/pi
```
[вверх](#ssh)
### SSH аутентификация по ключам
### ssh аутентификация по ключам
**На локальном хосте linux сгенерировать пару ключей**
На локальном хосте linux сгенерировать пару ключей
```bash
ssh-keygen
```
парольную фразу можно оставить пустой, чтобы не вводить пароль каждый раз при обращении к ключу
о умолчанию ключи будут храниться в каталоге ~/.ssh в домашнем каталоге текущего пользователя. Закрытый ключ будет называться **id_rsa**, а связанный с ним открытый ключ **id_rsa.pub**_
о умолчанию ключи будут храниться в каталоге `~/.ssh` в домашнем каталоге текущего пользователя. Закрытый ключ будет называться `id_rsa`, а связанный с ним открытый ключ `id_rsa.pub`_
Теперь необходимо скопировать публичный ключ на сервер, доступ к которому настраиваем
```bash
ssh-copy-id login@example.com
```
или
```bash
cat ~/.ssh/id_rsa.pub | ssh login@example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
```
**Для дополнительной безопасности можно отключить доступ по паролю**
Для этого необходимо отредактировать конфигурационный файл демона SSH raspberry
[вверх](#ssh)
### Для дополнительной безопасности можно отключить доступ по паролю
```bash
sudo nano /etc/ssh/sshd_config
```
Найти директиву _PasswordAuthentication_, раскомментировать ее и присвоить значение _no_
`PasswordAuthentication no`
Сохранить файл, закрыть.
Перезагрузить сервис
```bash
sudo systemctl restart ssh
```
### подключение через промежуточный хост
_если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой_
```
[вверх](#ssh)
### Подключение через промежуточный хост
если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой
```bash
ssh -J user1@host1:22 user2@host2
```
но в таком случае придется вводить пароль от host1 и от host2. Чтобы этого избежать можно добавить на хосты публичный ключ клиента
если добавить к подключению опции:
```
```bash
-o UserKnownHostsFile=/dev/null
-o StrictHostKeyChecking=no
```
удаленный сервер не будет проверять и не будет добавлять хеш удаленного хоста в файл _**known_hosts**_
это может быть полезно, например, когда часто меняется прошивка зондов и хеш изменяется.
это может быть полезно на тестовых стендах, когда узлы часто меняются и хеш изменяется.
Таким образом, полная команда может выглядеть так:
```
```bash
ssh -J pi@da2001.ru:227 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.5.3
```
[вверх](#ssh)
## SCP
```bash
scp ./wlt.py pi@da2001.ru:/home/pi
```
### Не стандартный порт
```bash
scp -P 227 ./wlt.py pi@da2001.ru:/home/pi
```
[вверх](#ssh)
## ssh_config
Документация - `man 5 ssh_config`</br>
Перевод man - <https://www.opennet.ru/man.shtml?topic=ssh_config&category=5&russian=0>
Конфигурационный файл клиента распологается в домашнем каталоге пользователя - `~/.ssh/config`
Для изменения значений клиента по-умолчанию, можно задать свои значения. Также можно задать шаблоны для подключения к определённым хостам с указанием отличных значений для каждого подключения или группы подключений.
В общем виде подобная настройка может выглядеть подобным образом:
```bash
Host firsthost
SSH_OPTION_1 custom_value
SSH_OPTION_2 custom_value
SSH_OPTION_3 custom_value
Host secondhost
ANOTHER_OPTION custom_value
Host 192.168.13.24
ANOTHER_OPTION custom_value
Host 192.168.13.*
ANOTHER_OPTION custom_value
Host *host
ANOTHER_OPTION custom_value
Host *
CHANGE_DEFAULT custom_value
```
Стоит иметь ввиду - анализ файла осуществляется сверху вниз до соответствия параметрам. Таким образом, если вверху будет указана директива `Host *`, для всех хостов будут применены значения определённые для этой директивы и анализ файла будет остановлен, т.к. `*` подходит для любого хоста.
### Общие параметры
Параметры определяются в порядке ключ-значение, при этом нет чёткого требования для разделения между ключом и значением, одинаково будут распознаны подобные определения:
```bash
Port 4567
Port=4567
Port = 4567
```
### Пример конфигурации
```bash
Host home
User da2001
VisualHostKey yes
PasswordAuthentication no
IdentityFile ~/.ssh/personal_id_rsa
Host test*
User testuser
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
LogLevel QUIET
Host srv1 srv2 srv3
User jorn
Host *
User anotheruaser
StrictHostKeyChecking ask
UserKnownHostsFile ~/.ssh/known_hosts
LogLevel INFO
ServerAliveInterval 120
```
- отступы не обязательны, просто для удобочитаемости
[вверх](#ssh)
## Проброс SSH ключа
### Разово
1. Создать `~/.ssh/config`
2. Заполните ее (адрес хоста - это адрес хоста, на который вы хотите разрешить пересылку cred'ов):
```shell
Host jumphost.local
ForwardAgent yes
```
3. Если вы еще не запустили ssh-agent, запустите его:
```shell
ssh-agent
```
4. Возьмите выходные данные этой команды и вставьте их в терминал. Это настроит переменные среды, которые необходимо установить для работы переадресации агента. При желании вы можете заменить это и шаг 3 на:
```shell
eval "$(ssh-agent)"
```
5. Добавьте ключ, который вы хотите переслать ssh-агенту:
```shell
ssh-add [path to key if there is one]/[key_name]
```
6. Войдите на удаленный хост:
```shell
ssh -A [user]@[jumphost.local]
```
7. Отсюда, если вы войдете на другой хост, который принимает этот ключ, это просто сработает:
```shell
ssh [user]@[hostname]
```
### Постоянный проброс
В конфиг `~/.ssh/config` добавить
- `ForwardAgent yes` - проброс SSH-агента
- `IdentityFile /home/da2001/.ssh/sape_a.dolgiy` - для подключения использовать этот ключ
- `IdentitiesOnly yes` - разрешить проброс только указанного выше ключа, а не всех доступных агенту
- `AddKeysToAgent yes` - разрешить проброс ключей агента
Таким образом, настройка может выглядеть так:
```shell
Host *.qwarta.ru, *.sapientru.net
ForwardAgent yes
User adolgiy
#User root
IdentityFile /home/da2001/.ssh/sape_a.dolgiy
IdentitiesOnly yes
AddKeysToAgent yes
```
[вверх](#ssh)
### Проброс SSH ключей руту
Перед подключением локальному ssh-агенту доступны ключи
```shell
ssh-add -l
4096 SHA256:l3eDVlDzIyZL+s2TPkBYbNpeRt/ExLMerJjGfODTHv4 artem@da2001.ru (RSA)
256 SHA256:/3KxBjovmSsQTnO2YYVO+C8qSegCiOFXX75u0+AhwnQ artem@da2001.ru (ED25519)
4096 SHA256:BncZFiTwTodIFrgwjBVnYLo88k7TM/7g62oaNROugVQ /home/da2001/.ssh/sape_a.dolgiy (RSA)
```
При подключении по SSH с пробросом ключей видим эти же ключи
```shell
ssh -A vm-qw-54.sapientru.net
adolgiy@vm-qw-54:~$ ssh-add -l
4096 SHA256:l3eDVlDzIyZL+s2TPkBYbNpeRt/ExLMerJjGfODTHv4 artem@da2001.ru (RSA)
256 SHA256:/3KxBjovmSsQTnO2YYVO+C8qSegCiOFXX75u0+AhwnQ artem@da2001.ru (ED25519)
4096 SHA256:BncZFiTwTodIFrgwjBVnYLo88k7TM/7g62oaNROugVQ /home/da2001/.ssh/sape_a.dolgiy (RSA)
```
При переключении на другого пользователя, этир ключи не будут доступны
```shell
adolgiy@vm-qw-54:~$ sudo -i
[sudo] password for adolgiy:
root@vm-qw-54 ~ # ssh-add -l
Could not open a connection to your authentication agent.
```
Чтобы эти ключи были доступны другому пользователю на сервере, например руту, необходимо выполнить проброс сокета ssh-агента
```shell
adolgiy@vm-qw-54:~$ sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -i
root@vm-qw-54 ~ # ssh-add -l
4096 SHA256:l3eDVlDzIyZL+s2TPkBYbNpeRt/ExLMerJjGfODTHv4 artem@da2001.ru (RSA)
256 SHA256:/3KxBjovmSsQTnO2YYVO+C8qSegCiOFXX75u0+AhwnQ artem@da2001.ru (ED25519)
4096 SHA256:BncZFiTwTodIFrgwjBVnYLo88k7TM/7g62oaNROugVQ /home/da2001/.ssh/sape_a.dolgiy (RSA)
```
[вверх](#ssh)

107
ssh_over_jump.md Normal file
View File

@@ -0,0 +1,107 @@
# SSH подключение через промежуточный узел без доступа к промежуточному узлу
Задача: обеспечить подключение к узлу в закрытом сегменте сети через промежуточный (bastion) узел. При этом закрыть возможность подключения к промежуточному узлу.
Упрощённая схема представлена на рисунке
![stand](./images/ssh01.png)
## Вводные данные
- `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/>

View File

@@ -1,4 +1,9 @@
### tcpdump
# tcpdump
- [tcpdump](#tcpdump)
- [Подробнее](#подробнее)
- [Сохранить пакеты полностью в дамп для определённого узла](#сохранить-пакеты-полностью-в-дамп-для-определённого-узла)
_возможные сетевые интерфейсы для захвата_
`sudo tcpdump -D`
@@ -26,8 +31,8 @@ n - _не подменять значения на названия, напри
A - _выводить всё в ASCII_
e - _выводить данные L2_
## Подробнее
#### Подробнее
**Ключи**
_Наиболее часто используемые ключи при запуске tcpdump приведены таблице_
ключ описание
@@ -153,3 +158,11 @@ tcpdump dst 172.16.0.1 and not icmp
```bash
$ tcpdump -i eth0 -n -nn -ttt 'dst host 172.16.0.10 and not (src host 172.16.0.11 and dst port 22)'
```
***
## Сохранить пакеты полностью в дамп для определённого узла
```shell
tcpdump -i any host 193.232.121.109 -nnXSs 0 -w test.pcap
```

672
termux_android.md Normal file
View 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
View File

@@ -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
View 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
View 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` - учётная запись разблокирована

View File

@@ -64,7 +64,7 @@ Address = 10.10.10.1/24
# сохранить конфигурацию
SaveConfig = true
# вкл./откл. подмену IP для VPN
# вкл./откл. подмену IP для VPN - ЗАМЕНИТЬ ИМЯ ИНТЕРФЕЙСА!!!
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE

294
zfs.md Normal file
View 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
View 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-справочник-команд)

View 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, также удалить лишнее

View 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/
```
После перезагрузки видим, что-то типа:
![Пример приветствия](images/greeting_12.png)

View File

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