Бэкап windows на linux

Резервное копирование данных — важная часть любой IT-инфраструктуры. В данной статье мы разберем, как настроить автоматическое резервное копирование файлов с Windows сервера на Linux сервер. Я предоставлю рабочий скрипт и подробно объясню его параметры, чтобы вы могли адаптировать его под свои нужды.

  • Подготовка к работе
  • Алгоритм работы скрипта
  • Скрипт для резервного копирования
  • Объяснение параметров
  • Как использовать
  • Заключение

В обслуживании у меня имеется Windows сервер, где с помощью программы Cobian Backup настроен локальный бекап внутренней CRM и рабочих файлов пользователей. Файлы сохраняются на том же сервере, только на другой физический диск. Описанным ниже скриптом, мы будем забирать локальные бекапы и сохранять их на linux сервере с ОС Debian. Если у вас еще не установлен сервер с Debian, рекомендую воспользоваться статьей на сайте Установка Debian 12 в качестве сервера. Подробный алгоритм работы скрипта будет описан далее.

Подготовка к работе

На Windows сервере создайте пользователя (например backup) под которым будете подключаться к нему и расшарьте папку с бекапами только для этого пользователя.

Далее проверьте, что на Linux сервере установлены утилиты cifs-utils (для работы с CIFS/SMB) и rsync (для синхронизации файлов).

Чтобы проверить, установлен ли пакет cifs-utils на вашей системе, выполните команду ниже:

dpkg -l | grep cifs-utils

Если пакет установлен, вы увидите строку с его информацией, примерно как на картинке ниже

Вывод команды dpkg -l | grep cifs-utils

Если строка отсутствует, пакет не установлен, установите его командой:

sudo apt update
sudo apt install cifs-utils

Чтобы проверить, установлен ли rsync на вашей системе, выполните команду ниже:

dpkg -l | grep rsync

Если пакет установлен, вы увидите строку с его информацией, примерно как на картинке ниже

Вывод команды dpkg -l | grep rsync

Если rsync не установлен, его можно установить следующей командой:

sudo apt update
sudo apt install rsync

Алгоритм работы скрипта

Скрипт выполняет следующие шаги:

  1. Проверка точек монтирования и директорий:
    • Проверяется существование точки монтирования для общей папки Windows сервера.
    • Проверяется наличие директории для хранения файлов, изменённых за последние два дня. При отсутствии директории они создаются.
  2. Монтирование общей папки Windows:
    • С использованием mount и протокола CIFS подключается общая папка Windows сервера к локальной точке монтирования на Linux сервере.
  3. Резервное копирование с помощью rsync:
    • Команда rsync синхронизирует содержимое общей папки Windows с локальной резервной директорией.
    • Все изменения фиксируются в логах, включая количество файлов, общий объём данных и объём переданных данных.
  4. Фильтрация файлов по дате:
    • Все файлы, изменённые за последние два дня, копируются в отдельную директорию для краткосрочного хранения, заданную в переменной TWO_DAYS_DIR. Если файлы уже существуют, они не копируются повторно.
  5. Удаление старых файлов:
    • Из директории для краткосрочного хранения удаляются файлы, которые были созданы более семи дней назад.
  6. Размонтирование общей папки Windows:
    • Общая папка размонтируется после завершения операций резервного копирования и фильтрации.
  7. Логирование:
    • Все этапы работы скрипта, включая успешные операции и ошибки, записываются в лог-файл.

Скрипт для резервного копирования

Ниже приведен полный текст скрипта:

#!/bin/bash

# Конфигурация
WINDOWS_SHARE="//WINDOWS-SERVER/Arhive"  # Сетевой путь до расшаренной папки Windows
MOUNT_POINT="/mnt/windows_server"      # Точка монтирования на Debian
BACKUP_DIR="/mnt/Backup/SERVER"         # Локальная папка для сохранения бекапов
TWO_DAYS_DIR="/mnt/Backup/Days_WINDOWS-SERVER" # Папка для копирования файлов не старше двух дней
LOG_FILE="/var/log/backup/WINDOWS-SERVER/WINDOWS-SERVER.log" # Путь до файла логов
USERNAME="backup"             # Имя пользователя для подключения к Windows
PASSWORD="password"             # Пароль для подключения к Windows

# Функция записи логов
log_message() {
    local STATUS="$1"
    local MESSAGE="$2"
    echo "$(date "+%Y-%m-%d %H:%M:%S") [${STATUS}] ${MESSAGE}" >> "$LOG_FILE"
}

# Проверка существования точки монтирования
if [ ! -d "$MOUNT_POINT" ]; then
    mkdir -p "$MOUNT_POINT"
    if [ $? -ne 0 ]; then
        log_message "ERROR" "Не удалось создать точку монтирования $MOUNT_POINT."
        exit 1
    fi
fi

# Проверка существования папки для файлов за два дня
if [ ! -d "$TWO_DAYS_DIR" ]; then
    mkdir -p "$TWO_DAYS_DIR"
    if [ $? -ne 0 ]; then
        log_message "ERROR" "Не удалось создать папку $TWO_DAYS_DIR."
        exit 1
    fi
fi

# Монтирование расшаренной папки Windows
mount -t cifs "$WINDOWS_SHARE" "$MOUNT_POINT" -o username="$USERNAME",password="$PASSWORD"
if [ $? -ne 0 ]; then
    log_message "ERROR" "Не удалось смонтировать $WINDOWS_SHARE."
    exit 1
else
    log_message "INFO" "Папка $WINDOWS_SHARE успешно смонтирована."
fi

# Копирование файлов с расшаренной папки
rsync -av --delete "$MOUNT_POINT/" "$BACKUP_DIR/" > /tmp/rsync_output.log
if [ $? -ne 0 ]; then
    log_message "ERROR" "Ошибка копирования файлов из $WINDOWS_SHARE в $BACKUP_DIR."
    umount "$MOUNT_POINT"
    exit 1
else
    # Анализ вывода rsync
    FILE_COUNT=$(grep -E "^[^ ]" /tmp/rsync_output.log | grep -vE "^(deleting|sent |total size is|speedup is|sending incremental file list|\./)" | wc -l)
    TOTAL_SIZE_BYTES=$(grep "total size is" /tmp/rsync_output.log | awk '{print $4}' | tr -d '.')
    SENT_BYTES=$(grep "sent " /tmp/rsync_output.log | awk '{print $2}' | tr -d '.')
    if [ -z "$TOTAL_SIZE_BYTES" ]; then
        TOTAL_SIZE_GB="0.00"
    else
        TOTAL_SIZE_GB=$(echo "scale=2; $TOTAL_SIZE_BYTES / 1073741824" | bc)
    fi
    if [ -z "$SENT_BYTES" ]; then
        SENT_SIZE_GB="0.00"
    else
        SENT_SIZE_GB=$(echo "scale=2; $SENT_BYTES / 1073741824" | bc)
    fi
    log_message "INFO" "Файлы из $WINDOWS_SHARE успешно скопированы в $BACKUP_DIR. Количество файлов: $FILE_COUNT. Общий объем: ${TOTAL_SIZE_GB} ГБ. Передано данных: ${SENT_SIZE_GB} ГБ."
fi

# Копирование файлов не старше двух дней в папку заданную в переменной TWO_DAYS_DIR
find "$BACKUP_DIR" -type f -mtime -2 -print0 | while IFS= read -r -d '' file; do
    dest="$TWO_DAYS_DIR/${file#$BACKUP_DIR/}"
    if [ -f "$dest" ]; then
        log_message "INFO" "Файл $file уже существует в $dest. Пропуск копирования."
        continue
    fi
    mkdir -p "$(dirname "$dest")" && cp "$file" "$dest"
    if [ $? -ne 0 ]; then
        log_message "ERROR" "Ошибка копирования файла $file в $dest."
    else
        log_message "INFO" "Файл $file успешно скопирован в $dest."
    fi
done


# Удаление файлов старше 7 дней из папки заданной в переменной TWO_DAYS_DIR
if [ ! -d "$TWO_DAYS_DIR" ]; then
    log_message "ERROR" "Папка $TWO_DAYS_DIR не существует. Пропуск удаления старых файлов."
else
    OLD_FILES_COUNT=$(find "$TWO_DAYS_DIR" -type f -mtime +7 | wc -l)
    find "$TWO_DAYS_DIR" -type f -mtime +7 -exec rm -f {} \;
    if [ $? -ne 0 ]; then
        log_message "ERROR" "Ошибка удаления файлов старше 7 дней из папки $TWO_DAYS_DIR."
    else
        log_message "INFO" "Файлы старше 7 дней успешно удалены из папки $TWO_DAYS_DIR. Количество удаленных файлов: $OLD_FILES_COUNT."
    fi
fi

# Размонтирование папки Windows
umount "$MOUNT_POINT"
if [ $? -ne 0 ]; then
    log_message "ERROR" "Не удалось размонтировать $MOUNT_POINT."
    exit 1
else
    log_message "INFO" "$MOUNT_POINT успешно размонтирована."
fi

exit 0

Объяснение параметров

  1. WINDOWS_SHARE — путь к общей папке на Windows сервере. Указывается в формате //SERVER/SHARE.
  2. MOUNT_POINT — локальная точка монтирования для Windows-папки.
  3. BACKUP_DIR — папка, куда сохраняются резервные копии.
  4. TWO_DAYS_DIR — папка для файлов, измененных за последние два дня.
  5. LOG_FILE — файл для записи логов.
  6. USERNAME и PASSWORD — учетные данные для подключения к Windows серверу.

Как использовать

Скопируйте скрипт в файл (например, /usr/local/bin/backup.sh).

Сделайте файл исполняемым:

chmod +x /usr/local/bin/backup.sh

Настройте расписание выполнения с помощью Cron:

crontab -e

Добавьте строку ниже:

0 2 * * * /usr/local/bin/backup.sh

Должно получиться примерно как на картинке ниже

Вывод crontab

С такими параметрами скрипт backup.sh будет выполняться каждый день в 02:00 утра.

Заключение

Автоматическое резервное копирование данных с Windows на Linux сервер — важный элемент надежности IT-инфраструктуры. Этот процесс позволяет минимизировать риски потери информации и ускорить восстановление данных при сбоях. Настроив соответствующий скрипт, вы получите эффективный инструмент для регулярной синхронизации и архивирования файлов. Использование утилит rsync и cifs обеспечивает гибкость и контроль над процессом, а система логирования позволяет оперативно отслеживать состояние резервного копирования. В общем, это решение, которое я рекомендую внедрить каждому, кто ценит безопасность и стабильность своей инфраструктуры.

Помогла статья? Подписывайся на Telegram канал автора.

Анонсы всех статей, много другой полезной и интересной информации, которая не попадает на сайт.

Если у вас имеются вопросы, задавайте их в комментариях.

Задача:
Резервное копирование файлов с windows сервера на Linux сервер выступающий в роли хранилища.

Инструменты:
Для windows:
CopSSH_3.1.4
cwRsyncServer_4.0.3
Для Linux:
rsyncd
ssh
Цель:
Использовать пакет rsync и ssh для организации безопасного тунелля передачи данных в ethernet сети между двумя серверами с разной ОС.

Инструкция:
На windows сервере:
Устанавливаем пакет CopSSH на windows сервер (жмем далее-далее).
Останавливаем службу OpenSSHD, если запущена, иначе не получится поставить пакет cwRsyncServer (связано с тем, что создается эмулируемая линукс среда и при работе службы OpenSSHD, используется библиотека необходимая для установки cwRsyncServer) — вылезет ошибка.
Ставим cwRsyncServer (жмем далее-далее).
В службах меняем запуск службы RsyncServer с ручного запуска на автоматический.
Проверяем службы OpenSSHD и RsyncServer запустив их. Если запустились — все хорошо, останавливаем их.
Если вылезет ошибка 1069 «Вход невозможен», то поменяйте пароли пользователям CWRSYNC и COPSSH в «Администрирование-Управление данных компьютером-Пользователи». Такое случается, если вы пере устанавливаете эти программы.
Затем, введите новые пароли в свойствах служб OpenSSHD и RsyncServer во вкладке «Вход в систему». Теперь службы должны запуститься.
Создайте нового пользователя (у меня это RSBService) и добавьте его в группу Администраторы.
Добавим пользователя RSBService в пользователи ssh. Выполните: Пуск-Программы-CopSSH-Activate User.
Там выбираем или вписываем имя нашего пользователя и кликаем «Далее»
В passphrase можете ввести что угодно.
Отредактируем конфиг rsyncd.conf
Для этого выполните: Пуск-Программы-cwRsyncServer-rsyncd.conf.
Там все довольно тривиально и идентично настройкам для unix rsync.
Распишу только стандартные опции.

use chroot = false   # Использовать не только диск С
strict modes = false # Проверка файла с паролем. Отключена так как его не использую.
hosts allow = 192.18.0.34 # Откуда подключаться разрешено по rsync
log file = rsyncd.log  # Лог файл

# Module definitions
# Remember cygwin naming conventions: c:\work becomes /cygwin/c/work
#
[backup]               # Название модуля
path = /cygdrive/c/_BackUp     # Путь до папки, путь всегда начинается с cygdrive
read only = yes  # разрешено только чтение
transfer logging = yes  # логировать перемещение

Все. Теперь запустим службы OpenSSHD и RsyncServer.
На windows сервера работы закончили.

На Linux сервере:
Создадим ключ для беспорольной авторизации на windows сервере под пользователем RSBService:

ssh-keygen -t rsa -b 2048 -N ''  # Создаем ключ rsa длиной 2048 байт без парольной фразы.

Скопируем публичный ключ на windows сервер:

ssh-copy-id RSBService@ip-адрес сервера

У вас запросят пароль на пользователя RSBService. Введите его.
Теперь проверим беспарольный вход:

ssh RSBService@ip-адрес сервера

Установите демон rsyncd на Linux сервер.
С помощью следующей команды мы скопируем данные с windows сервера.

rsync -a --delete RSBService@ip-адрес::backup /назначение куда класть данные

PROFIT

Использованные материалы:
Сайт производителя утилиты.
Здесь описано как запустить cwRsync в качестве демона, если вы не найдете версию 4.0.3, так как в 4.0.5 нет отдельного серверного пакета.
Запуск в качестве службы
3 видео мануала, но с использованием windows в качестве сервера и клиента.
1я часть.
2я часть.
3я часть.

GeekyBoy.com

Ok, this may be my last disaster recovery and backup blog for a long time. As you can probably tell from the title this blog entry is all about keeping backup strategies as cheap as possible.

My strategy is to backup all of my Windows and Linux servers to one central Windows server that is running a Tivoli backup agent. All of my servers are hosted elsewhere, and since it costs $99.00 per server to backup I am getting the most for my money by only backing a single server to tape/SAN. However that single server carries all of the files that need to be remotely backed up to tape/SAN.

My earlier posts show how to backup the Windows servers:
Windows backup bat script using xcopy

And I also showed how to backup a Linux server to a local file:
Linux backup using CRON to local directory

Now I will show how I moved the files backed up on the Linux servers to the Windows server prior to tape/SAN backup. I have decided to use Samba and mount a directory pointing to a shared folder on the Windows server. Lets begin:

  1. Create a share on the Windows server to use as your backup location.
  2. Create a user to use this share, and give the user permissions to use it.
  3. Pick, or create, a user that you’re going to use to backup the files. Log in as this user and type ‘id’ to get the numeric ID of the user in the Linux OS. (You will need it later.)
  4. Become ‘root’. (This will enable you to perform the next tasks without problems.)
  5. Install samba and samba-client if they are not installed yet.

You will need to answer ‘y’ to when prompted.

  • By default only the root user can mount or unmount a cifs, so we must open it to other users.
  • Now we need to make a directory to use as our mount point.
  • To enable our desired user to mount and unmount this we need to assign ownership to that user. Changing permissions with chmod is not enough.
  • Now we need to edit the /etc/fstab file and add an entry. Replace the user ID of 500 with your user ID from #1. Replace sharename with your Windows share name. Replace WINDOWSHOST with your hostname or IP address. If you don’t know the shares run smbclient -L WINDOWSHOST
  • Create/Edit a file /root/smblogin and put the following two lines in it.
  • Now we must give our user from #1 access to the file, but still protect it.
  • If you have IPTABLES active on your server you will need to make sure to add a policy to allow OUTPUT port 445.
  • Log in as the user from #1
  • Try to mount the share:
  • If that was successful you are now ready to write a script that will automate the moving of your backup files from the Linux to the Windows share. (Script/File = backup.sh)

    Of course you can add this to the end of the file described in Linux backup using CRON to local directory which would create a complete solution for backing up files, then relocating them to a remote Windows server.

  • Next you will add an entry to the crontab of the user from #1 to happen automagically.
  • Enter this into the crontab.
  • Now once this is all done you can rest a little bit easier knowing that your servers are backed up. I hear the beach calling me now….ttyl.

    Источник

    Бэкап сетевой шары (samba) в Linux по мотивам Windows Server Backup

    Введение

    Чем хороша служба Windows Server Backup и теневые копии? Они входят в поставку Windows Server и не требуют доплаты (если не использовать облачную архивацию), а также хорошо справляются с возложенными на них задачами. Для простых сценариев использования — очень достойное решение. А доступ к теневым копиям через диалог свойств файла — вообще очень удобен. Теперь попробуем сделать аналогично для файлового сервера Linux с Samba.

    Доступ к предыдущим версиям файлов

    Эту возможность нам дает модуль Samba shadow_copy2. Его надо прописывать в секции сетевого ресурса в файле smb.conf:

    В отличие от модуля первой версии, этот позволяет разместить папку с копиями в разных местах и с разными именами.

    Теперь, если внутри папки path = /mnt/.share мы создадим подпапку @GMT-2016.12.25-10.17.52
    то у нас ничего не выйдет. Добавим такие настройки в секции [general]:

    Теперь в свойствах сетевой шары, в разделе предыдущих версий, мы увидим нашу «копию». Обратите внимание, время указывается в UTC и преобразуется в локальное по часовому поясу.

    Создание архивов и snapshot

    Иметь механизм доступа к копиям без механизма их создания — бесполезно. В этом нам поможет следующий скрипт (есть и официальный аналог):

    #!/bin/bash # # LVM-ThinVolume BackUp with rsync script set # # (c) 2016 — # Andrew Leshkevich (magicgts@gmail.com) # # # This script set is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by the # Free Software Foundation, either version 2 of the license or, at your # option, any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # For a list of supported commands, type ‘thin_lv_backup help’ # # . Please forgive me for bad english . # ################################################################################################ ################################################################################################ #Mount the snapshot to the specified mount point, if a snapshot is not active, then activate it # Arguments: # $ <1>— Short path to Volume (in VG/LV format) # $ <2>— Mount point # $ <3>— Optional LMV Volume attribute # Returns: # Return 0 if no errors ################################################################################################ mount_snapshot() < local SRC=$<1>local MNT_TGT=$ <2>[ «$#» -lt 2 ] && echo ‘Error: expected / [ ]’ && return 1 if [ «$#» -eq 2 ]; then local ATTR=$(lvs —noheadings -o lv_attr $) else local ATTR=$ <3>fi findmnt -nf —source /dev/$ >/dev/null 2>&1 && echo «Skip: LV $ is already mounted!» && return 0 findmnt -nf —target $ >/dev/null 2>&1 | grep -v -q $ && echo «Skip: the directory $ is already a mount point» && return 3 if [ ! -d «$» ]; then mkdir -p «$» || echo «Error: Creating directory $» || return 4 echo «Info: directory $ has been created» fi find $ -prune -empty | grep -v -q $ && echo «Skip: $ directory is not empty» && return 5 [[ $ =

    .*a.* ]] || lvchange -ay -K $ || echo «Error: Volume Activation $» || return 6 mount -o ro,nouuid /dev/$ $ || echo «Error: Mounting $» || return 7 return 0 > ################################################################################################ # UnMount snaphot, deactivate volume and remove it mount point directory # Arguments: # $ <1>— Short path to Volume (in VG/LV format) # Returns: # Return 0 if no errors ################################################################################################ umount_snapshot() < local SRC=$<1>local TGT [ «$#» -ne 1 ] && echo ‘Error: expected / ‘ && return 1 local _TGT=(«$( findmnt -nf —source /dev/$ | cut -d ‘ ‘ -f 1 )») if [ ! -z «$_TGT» ]; then umount -A /dev/$ || echo «Error: Umounting $» || return 2 for TGT in «$<_TGT[@]>«; do find $ -prune -empty | grep -q «$» && rm —one-file-system -df $ [ -d «$» ] && echo «Info: Fail to remove target directory $» done fi lvchange -an -K $ || echo «Error: Volume Deactivation $» || return 3 return 0 > ################################################################################################ # Mount all associated snapshots of the volume to its origin mount points # All snapshots must be named on the template: -GMT-%Y.%m.%d-%H.%M.%S # Arguments: # $ <1>— Short path to Origin Volume (in VG/LV format) # $ <2>— Optional archive volume group, that used to mount all archive snapshots # Returns: # Return 0 if no errors ################################################################################################ mount_all_snapshot() < local SRC=$<1>local A_VG=$ <2>local ATTR_S local SNAP [ «$#» -lt 1 ] && echo ‘Error: expected / []’ && exit 1 IFS=$’/’ read -r -a ATTR_S / ‘ && return 1 IFS=$’/’ read -r -a ATTR_S / [

    ]’ && exit 1 local DATE=$(date -u +GMT-%Y.%m.%d-%H.%M.%S) [ «$#» -eq 2 ] && DATE=»$<2>» IFS=$’/’ read -r -a ATTR_S / ‘ && return 1 IFS=$’/’ read -r -a ATTR_S / ‘ && return 1 local VOL_SRC=$ <1>local MNT_TGT=$ <2>mkdir -p $ mount /dev/$ $ || echo «Error: Mounting $» || return 7 > ################################################################################################ # Post archive operation: unmount target volume, remove its mount point, create its snaphot # Arguments: # $ <1>— Short path to Origin Volume (in VG/LV format) # $ <2>— Mount point for $ <1># Returns: # Return 0 if no errors ################################################################################################ post_archive() < [ «$#» -ne 3 ] && echo ‘Error: expected / / ‘ && return 1 local VOL_SRC=$<1>local MNT_TGT=$ <2>local TGT=$ <3>umount /dev/$ && rm -rd $ && lvcreate -n $ -s /dev/$ && return 0 return 1 > ################################################################################################ # Create rsync archive # Arguments: # $ <1>— Short path to Origin Volume (in VG/LV format) # $ <2>— Name of archive Volume Group # $ <3>— Optional connection string in @ format # $ <4>— Optional path to this script on remote machine # $ <5>— Optional prefix name for volume name on remote machine (

    — -GMT-%Y.%m.%d-%H.%M.%S) # $ <6>— Optional also make local archive # Returns: # Return 0 if no errors ################################################################################################ create_archive() < local SRC=$<1>local TGT=$ <2>local CONN=$ <3>local CALL=$ <4>local PREFIX=$ <5>local ATTR_S local ATTR_D local RESULTS local RET [ «$#» -lt 2 ] && echo ‘Error: expected / [

    Источник

    Использование cwRsync для резервного копирования данных с Windows на Linux сервер

    Задача:
    Резервное копирование файлов с windows сервера на Linux сервер выступающий в роли хранилища.

    Инструменты:
    Для windows:
    CopSSH_3.1.4
    cwRsyncServer_4.0.3
    Для Linux:
    rsyncd
    ssh
    Цель:
    Использовать пакет rsync и ssh для организации безопасного тунелля передачи данных в ethernet сети между двумя серверами с разной ОС.

    Инструкция:
    На windows сервере:
    Устанавливаем пакет CopSSH на windows сервер (жмем далее-далее).
    Останавливаем службу OpenSSHD, если запущена, иначе не получится поставить пакет cwRsyncServer (связано с тем, что создается эмулируемая линукс среда и при работе службы OpenSSHD, используется библиотека необходимая для установки cwRsyncServer) — вылезет ошибка.
    Ставим cwRsyncServer (жмем далее-далее).
    В службах меняем запуск службы RsyncServer с ручного запуска на автоматический.
    Проверяем службы OpenSSHD и RsyncServer запустив их. Если запустились — все хорошо, останавливаем их.
    Если вылезет ошибка 1069 «Вход невозможен», то поменяйте пароли пользователям CWRSYNC и COPSSH в «Администрирование-Управление данных компьютером-Пользователи». Такое случается, если вы пере устанавливаете эти программы.
    Затем, введите новые пароли в свойствах служб OpenSSHD и RsyncServer во вкладке «Вход в систему». Теперь службы должны запуститься.
    Создайте нового пользователя (у меня это RSBService) и добавьте его в группу Администраторы.
    Добавим пользователя RSBService в пользователи ssh. Выполните: Пуск-Программы-CopSSH-Activate User.
    Там выбираем или вписываем имя нашего пользователя и кликаем «Далее»
    В passphrase можете ввести что угодно.
    Отредактируем конфиг rsyncd.conf
    Для этого выполните: Пуск-Программы-cwRsyncServer-rsyncd.conf.
    Там все довольно тривиально и идентично настройкам для unix rsync.
    Распишу только стандартные опции.

    Все. Теперь запустим службы OpenSSHD и RsyncServer.
    На windows сервера работы закончили.

    На Linux сервере:
    Создадим ключ для беспорольной авторизации на windows сервере под пользователем RSBService:

    Скопируем публичный ключ на windows сервер:

    У вас запросят пароль на пользователя RSBService. Введите его.
    Теперь проверим беспарольный вход:

    Установите демон rsyncd на Linux сервер.
    С помощью следующей команды мы скопируем данные с windows сервера.

    Использованные материалы:
    Сайт производителя утилиты.
    Здесь описано как запустить cwRsync в качестве демона, если вы не найдете версию 4.0.3, так как в 4.0.5 нет отдельного серверного пакета.
    Запуск в качестве службы
    3 видео мануала, но с использованием windows в качестве сервера и клиента.
    1я часть.
    2я часть.
    3я часть.

    Источник

    Централизованное резервное копирование данных Windows и *nix серверов средствами Bacula

    Приветствую всех хаброжителей!

    Как нетрудно догадаться, речь пойдет о бекапах.
    Своевременный бекап — крайне важная часть работы системного администратора. Своевременный бекап делает сон спокойным, а нервы стальными, придает сил и оберегает здоровье.

    Думаю вполне резонным будет предположение, что данная тема уже набила оскомину, но все же я рискну поделиться своим опытом. На суд читателя будет представлена клиент-серверная реализация схемы резервного копирования. В качестве инструмента я выбрал open source проект Bacula. По более чем полугодовому опыту его использования остаюсь доволен своим выбором.

    Bacula состоит из нескольких демонов, каждый из которых несет свою функциональную нагрузку. На рисунке ниже схематично представлена взаимосвязь этих демонов.

    Под хабракатом я опишу все демоны подробно

    В моем случае резервному копированию подлежат:

    1. Конфигурационные файлы различных демонов со всех серверов.
    2. MySQL базы данных.
    3. Документооборот с файлового сервера Windows.
    4. Различные важные данные с nix серверов(движки сайтов/форумов, etc..)

    1.Описание демонов Bacula

    Система построена по технологии клиент-сервер, и для передачи данных использует протокол TCP. Резервные копии создаются в собственном, полностью открытом формате.

    Система резервирования данных Bacula состоит из четырёх основных элементов: Director Daemon, Storage Daemon, File Daemon и Bacula Console. Все эти элементы реализованы в виде самостоятельных приложений.

    Director Daemon (DD) – это центральный элемент системы, осуществляющий управление её остальными компонентами. В его задачи входит управление процессом резервирования/восстановления данных, обеспечение интерфейса управления для администраторов и многое другое. Говоря проще – это диспетчер, который инициирует все процессы и отслеживает ход их выполнения.

    Storage Daemon (SD) – приложение, отвечающее за чтение/запись данных непосредственно на устройства хранения информации. Принимает управляющие команды от DD, а также резервируемые данные от/к File Daemon.

    File Daemon (FD) – этот элемент ещё можно назвать Агентом. Ведь именно он работает в рамках операционной системы, данные которой необходимо резервировать. File Daemon выполняет всю рутину, осуществляя обращение к резервируемым файлам и их дальнейшую передачу к SD. Также на стороне FD выполняется шифрование резервных копий, если это определено конфигурацией.

    Bacula Console (BC) – интерфейс администратора сиcтемы. По своей сути, это командный интерпретатор для управления Bacula. Строго говоря, Bacula Console может быть расширена с помощью графических систем управления, которые, как правило, являются всего лишь надстройкой над BC. К таким системам можно отнести Tray Monitor и Bat. Первая устанавливается на компьютере администратора системы и осуществляет наблюдение за работой системы резервирования, а вторая обеспечивает возможность управления посредством графического интерфейса.

    Bacula Catalog – база данных, в которой хранятся сведения обо всех зарезервированных файлах и их местонахождении в резервных копиях. Каталог необходим для обеспечения эффективной адресации к требуемым файлам. Поддерживаются MySql, PostgreSql и SqLite.
    Такое структурное деление позволяет организовать очень гибкую систему резервирования, когда Storage Daemon разворачивается на выделенном сервере с несколькими устройствами хранения данных. Также Bacula Director может управлять несколькими экземплярами SD, обеспечивая резервирование части данных на одно устройство хранения, а части – на другое.

    2. ОС и железо

    Теперь, когда у читателя сформировалось представление о работе демонов Bacula, я перейду к описанию того, как я реализовал всю эту красоту у себя.
    В качестве аппаратного обеспечения для DD, SD и Bacula Catalog у меня выступает PC со следующими характеристиками

    Устройство Модель количество Емкость/Частота
    HDD Hitachi HDS723020BLA642 3 2Tb
    CPU AMD Phenom(tm) II X4 970 Processor 1 3500 Mhz
    Motherboard Gigabyte GA-880GA-UD3H 1
    RAM 3541 Mb

    О используемых на сервере ОС и версиях ПО

    Хранением данных занимаются несколько software(mdadm) RAID массивов.
    Под систему три партиции на трех дисках, грузится можно с любого из них, под бекапы один массив из двух партиций.

    Имя массива из каких партиций точка монтирования Файловая система Уровень массива
    md0 /dev/sda1,/dev/sdb1,/dev/sdc1 boot ext2 1
    md1 /dev/sda2,/dev/sdb2,/dev/sdc2 / ext3 1
    md2 /dev/sda3,/dev/sdb3 /backup ext4 1

    3. Описание схемы резервного копирования и настроек демонов Bacula

    Всего у меня сконфигурированы 19 клиентов Bacula, но подробно я остановлюсь на описании бекапа сервера биллинга и документов с файлового сервера Windows. Фокус на эти два сервера обусловлен тем, что остальные клиенты настроены аналогично, и на примере этих серверов-клиентов можно строить свои конфигурации.

    Резервное копирование сервера биллинга это, по сути, бекап базы данных mysql и конфигурационных файлов демонов.
    BD позволяет выполнять локальный скрипт на клиенте как до, так и после задания.
    Каждую ночь, при старте задания на бекап сервере, запускается локальный(на самом сервере биллинга) скрипт, который создает архив базы биллинга, далее этот архив забирает BD и помещает на соответствующий пул томов(на самом деле операциями с чтением/записью управляет SD, но это сейчас не важно). Сразу же после выполнения задания запускается еще один скрипт, который в свою очередь, перемещает созданный архив в отдельную папку на сервере биллинга, для пущей надежности. Таким образом архив БД будет как у Bacula, так и локально на сервере биллинга(да, я параноик). Подробнее эти механизмы и скрипты будут описаны ниже.

    С файлового сервера Windows сохраняем весь необходимый документооборот. В воскресенье создается Full бекап, каждый последующий день, с понедельника по субботу, Diff бекапы.

    Теперь о конфигурационных файлах демонов Bacula. Начнем с самого объемного — bacula-dir.conf.
    Файлы конфигурации всех демонов Bacula состоят из описаний, так называемых, ресурсов. Каждый из ресурсов характеризует определенный функционал демона.
    Я буду комментировать каждую строчку в конфиге, поэтому далее будут следовать блоки-ресурсы файлов Bacula(bacula-dir.conf, bacula-sd.conf, bacula-fd.conf), если что-то нужно объяснить более подробно укажите это в комментариях.
    Ресурс Dirtector

    Ресурс catalog, описываем подключение к БД

    Для каждого клиента в заданиях указаны Pool и Storage.
    Pool, извините за тавтологию, это пул томов(volume) на который размещаются резервные копии данных клиентов. У меня тома — это файлы в формате bacula, размещенные на software raid массиве. Для разных клиентов могут быть определены разные пулы томов. К примеру у меня созданы 6 пулов, для разных типов клиентов. В примере ниже описан лишь один из них, для данных биллинга.
    Storage описывает какие физические устройства будут использованы в качестве томов.
    (Storage BGB-ST описан в конфиге SD)
    Ресурс Pool

    Задание на примере бекапа базы данных биллинга.
    Ресурс Client

    Само задание.
    Ресурс Job

    Я обещал подробнее остановиться на скриптах выполняющихся до и после задания.
    Скрипт до задания

    Скрипт после задания

    Ресурс FileSet(что бекапим, а что нет)

    Расписание запуска задания.
    Ресурс Schedule

    Подробно комментировать ресурсы для резервного копирования документов с сервера Windows я не буду, приведу соответствующую часть конфига bacula-dir.conf полностью

    Конфигурационный файл BD на этом завершен. Переходим к конфигурации SD — описанию файла bacula-sd.conf

    Ресурс Director(связь с BD описанном в конфиге bacula-dir.conf)

    Начинается описание различных девайсов, всего у меня используется 4 разных девайса. Я приведу в качестве примера два, для биллинга и для Windows.
    Ресурс Device для биллинга.

    Ресурс Device для файлового сервера Windows

    Конфигурационный файл bconsole.conf, доступ в консоль Bacula.

    Не забудьте создать соответствующие Storage папки и назначить bacula владельцем этих папок.
    Совет из комментариев

    @/usr/local/etc/bacula/fileset.conf
    Конфиги можно разделить на разные файлы,
    Options < signature = MD5 compression = GZIP >
    и включить компрессию.

    Конфигурирование серверной части завершено.

    Важно отметить, что каждый из клиентов должен резолвить fqdn имя сервера в его ip адрес! Обеспечте это средствами dns или пропишите в hosts!

    В комментариях конфигурационных файлов я упоминал о схеме соответствия паролей и имен демонов в различных конфирурационных файлах, так вот, если вы где-то запутались — воспользуйтесь картинкой ниже.

    4. Пример процедуры востановления

    Для мониторинга и востановления ваших резервных копий удобно использовать утилиту bat.
    В Ubuntu она ставиться так

    В портажах Gentoo я её не нашел, поэтому собирал из исходников.
    Конфигурационный файл bat.conf полностью аналогичен bconsole.conf, приведенному ранее.
    Итак, к примеру я хочу востановить архив базы данных биллинга за определенное число. Алгоритм, которым пользуюсь я, таков:
    1. Открываем bat и находим нужное задание

    2. вводим команду list files jobid=3059 для того чтобы убедиться что в задании есть нужные файлы

    3. Теперь переходим в консоль(мне так удобнее просто=)). В консоли я восстановлю архив биллинга на другого клиента

    4. Ждем успешного выполнения задания, статус можно отслеживать в том же bat

    Еще несколько скриншотов

    Благодарю всех кто дочитал мой опус до конца.
    В качестве завершения позволю себе еще несколько советов.
    Важно не только делать бекапы и отслеживать что они выполнились без ошибок, но так же и регулярно их разворачивать и проверять. Подобная практика даёт еще +100 к указанным в начале спокойствию, крепкости нервов и здоровью. Так же очень хорошей практикой является регулярное резервное копирование базы данных bacula и bsr файлов.

    Источник

    From the world of “why would anyone ever bother to do this?” comes a new approach to backing up your favourite Windows 10 computer! OK so why am I even doing this? I guess the answer to that question is really “just to see if I could.” It’s not the best answer but not everything needs a practical reason right?

    So how does one go about using the awesome rsync utility to perform a Windows backup? Well first off you’ll need to enable the Windows Subsystem for Linux on your Windows 10 computer. There’s some documentation here from Microsoft but essentially you just need to enable the Feature and then go into the Windows Store, search for your favourite supported distribution, and click the Get button. Once the installation has finished you should launch bash and create a user account. Depending on the distribution you chose rsync may not be installed already so you may need to add it as well.

    The actual backup process is really easy from that point. When you launch bash it will automatically mount your Windows drives under /mnt/, so for example the C:\ drive gets mounted as /mnt/c. Therefore if you wanted to backup the whole C:\ drive to an external drive you plugged in that showed up as E:\ in Windows you could simply run something like:

    rsync -rv /mnt/c /mnt/e

    Now while this should more or less work it will result in a load of errors as rsync doesn’t know how to or isn’t allowed to access a bunch of the special directories and files in Windows.

    Also note that I’m only using the -r option above instead of the more “traditional” -a option. This is because of an incompatibility between the linux and Windows file permissions, so it isn’t able to correctly preserve them anyway. There are other options you may want to pass rsync as well, for instance the –delete option which will remove previously copied files on the destination drive if they are subsequently deleted from the source drive to keep them in sync.

    How about an example?

    For the purposes of an example backup let’s say I just wanted to copy the files under the USER (substitute your username here!) directory, excluding some of the nonsense directories I didn’t need. And let’s assume I want the files to end up on that E:\ drive as before. Oh and let’s also assume I want to run this backup on a schedule. Here’s how I would set it up:

    1) Create a script to store our rsync commands

    Technically you don’t need to do this but I find it easier to maintain this way. I created a file in C:\Users\USER\rsyncbackup\ called rsyncbackup.sh. The reason I placed it under my Windows user directory, and not within the linux user directory, was simply one of preference but this way the script itself will also be part of the backup. Finally I placed the following in it:

    #!/bin/bash
    rsync -rv --delete --exclude-from '/mnt/c/Users/USER/rsyncbackup/rsyncbackup.exclude' --progress /mnt/c/Users/USER /mnt/e

    Be careful when saving files in Windows that you use the UNIX line endings and not the Windows line endings option, otherwise rsync may have issues with it. As you can see from above this rsync command is referencing a file call rsyncbackup.exclude. This is the file where I will place directories, files and wildcards for things I don’t want rsync to bother with. Here is what that file could look like:

    *.lnk
    *.url
    AppData
    Application Data
    Cookies
    desktop.ini
    Documents/My Music
    Documents/My Pictures
    Documents/My Videos
    IntelGraphicsProfiles
    Local Settings
    MicrosoftEdgeBackups
    My Documents
    NetHood
    NTUSER.DAT*
    ntuser*
    PrintHood
    Recent
    Searches
    SendTo
    Start Menu
    Templates

    2) Try it out!

    Now we can try to see if this will work. Open up a Windows command prompt (e.g. cmd.exe) and run the following:

    bash -c '/mnt/c/Users/USER/rsyncbackup/rsyncbackup.sh'

    If it all looks good then we can move onto the next step of scheduling it.

    3) Schedule the backup

    This is where you might be thinking

    Well if we’re already using the Windows Subsystem for Linux why don’t we just schedule it with cron?

    The answer is that from my testing it doesn’t appear as though Windows starts the Subsystem automatically after a restart. So if that never gets started, cron never runs and your backup never happens. Instead what we’ll do is simply use good old Windows Task Scheduler to get the job done.

    Create a new task, schedule it accordingly and place the command you used in cmd.exe above as the Action. Feel free to run the task to test and confirm the results!

    4) Other cool tricks

    What’s neat about doing a backup this way is that you get additional access to all of the cool Linux commands and functionality as well. For example what if you wanted to do the same backup above, but weren’t sure what drive letter your external drive would show up under? Well an easy solution would be to place a uniquely named text file on your backup drive, something like “THIS_IS_THE_BACKUP_DRIVE.txt“, and use bash to find it for you!

    #!/bin/bash
    BACKUPDIR="${find /mnt -type d -name "c" -prune -o -type f -name "THIS_IS_THE_BACKUP_DRIVE.txt" -print 2>/dev/null}"
    BACKUPDIR="${BACKUPDIR/THIS_IS_THE_BACKUP_DRIVE.txt/BACKUP}"
    rsync -rv --delete --exclude-from '/mnt/c/Users/USER/rsyncbackup/rsyncbackup.exclude' --progress /mnt/c/Users/USER $BACKUPDIR

    How does this work?

    BACKUPDIR="${find /mnt -type d -name "c" -prune -o -type f -name "THIS_IS_THE_BACKUP_DRIVE.txt" -print 2>/dev/null}"

    This first looks in all of the mounted Windows drives (everything under /mnt), excluding directories that have a “c” in the name (e.g. the C:\ drive) for a file called “THIS_IS_THE_BACKUP_DRIVE.txt” and stores the path to that file in the variable BACKUPDIR. I added 2>/dev/null in order to omit any errors, such as “Permission denied” that rsync may echo out. So for example if the backup drive was mounted under E:\ then my variable BACKUPDIR would contain the text “/mnt/e/THIS_IS_THE_BACKUP_DRIVE.txt

    BACKUPDIR="${BACKUPDIR/THIS_IS_THE_BACKUP_DRIVE.txt/BACKUP}"

    Next it replaces the text “THIS_IS_THE_BACKUP_DRIVE.txt” in the variable with the text “BACKUP” because I want my backup files to end up in a folder on the drive called BACKUP (e.g. E:\BACKUP).

    Finally it runs the normal rsync command put sets the destination directory to the contents of our variable above.

    rsync -rv --delete --exclude-from '/mnt/c/Users/USER/rsyncbackup/rsyncbackup.exclude' --progress /mnt/c/Users/USER $BACKUPDIR

    Neat right? OK but what if I want to back up my computer over the internet using ssh? Well we can certainly do that too! To make this easier I’m going to pre-setup some ssh keys so we don’t need to worry about providing a password. This will make scheduling the backup easier.

    First off in bash on Windows you’ll want to generate some ssh keys:

    ssh-keygen

    Make sure to just hit enter when prompted for the password so that the keys aren’t password protected. Next you’ll want to copy those keys to your remote machine. I find the ssh-copy-id command especially easy for this:

    ssh-copy-id -i ~/.ssh/id_rsa.pub x.x.x.x

    Where x.x.x.x is the IP address of your remote machine. If that was successful you should be able to ssh to the remote machine without providing a password:

    ssh x.x.x.x

    Note that it’s perfectly fine for your linux username to not match your Windows username, you just need to be sure to explicitly provide the correct username as part of the rsync command below. If you were able to ssh then we just need to setup our backup script to use the remote machine as the destination:

    #!/bin/bash
    rsync -rv --delete --exclude-from '/mnt/c/Users/USER/rsyncbackup/rsyncbackup.exclude' -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress /mnt/c/Users/USER USER@x.x.x.x:/home/USER/BACKUP

    Running the script now will automatically connect to the remote machine at x.x.x.x using the linux user USER and run the backup, placing the files under the USER home directory in a folder called BACKUP. If your remote machine listens for ssh connections on a different port you can specify that too using the -p option right after the ssh portion, so something like:

    rsync -rv --delete --exclude-from '/mnt/c/Users/USER/rsyncbackup/rsyncbackup.exclude' -e "ssh -p 1234 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress /mnt/c/Users/USER USER@x.x.x.x:/home/USER/BACKUP

    Anyway I hope you found this information interesting if not helpful. Maybe you too could setup your very own convoluted backup system!

    This post, re-published here with permission, was originally published on my personal site here.

    Опубликовано

    Бэкап общей папки Windows в Linux

    Здравствуйте, уважаемые читатели. Сегодня тема статьи: «Бэкап общей папки Windows в Linux». Рассмотрим организацию резервного копирования общего ресурса Windows, на машину под управлением Linux.

    Предположим на одном из компьютеров локальной сети, под управлением Windows, есть директория с общим доступом, в которой находятся критически важные файлы. С файлами ежедневно производятся какие-то манипуляции. Как обезопасить файлы в директории?

    Можно настроить резервное копирование критически важной директории на машину под управлением Linux. Отдельной машины для этого не понадобится, если в сети есть Linux машина, которая работает в роли DHCP-сервера, шлюза, или в какой-нибудь другой роли, то можно без проблем добавить функционал резервного копирования на неё. Функционал резервного копирования не потребует больших ресурсов, кроме того, производится резервное копирование будет ночью, так что особой нагрузки на сеть также не будет.

    Подготовительные действия

    • Предварительно нам нужно создать необходимую инфраструктуру.
    • Для хранения резервных копий, создадим директорию /rezerv.
    • Кроме того, для монтирования общей папки, создадим директорию /mnt/arhiv.
    # mkdir /rezerv
    # mkdir /mnt/arhiv
    • На компьютере под управлением Windows, создаём нового пользователя с паролем, и даём ему полный доступ на папку с критически важными файлами.
    • Проверяем подключение к общей папке с Linux машины. Монтируем общую папку к созданной для этих целей директории /mnt/arhiv.
    # mount -t cifs //192.168.10.20/123 /mnt/arhiv -o user=user-2,password=123

    — 123 – название общей папки Windows.

    — user-2 – пользователь для подключения к общей папке.

    — 123 – пароль пользователя user-2.

    • Если всё было сделано правильно, то Вы получите доступ к файлам общей папки Windows, зайдя в директорию /mnt/arhiv.
    • Резервное копирование мы будем производить с помощью утилиты tar. В одной из предыдущих статей, мы уже пользовались утилитой для создания бэкапа файлов сайта.

    Ручной бэкап общей папки Windows в Linux

    • Бэкап в ручном режиме, можно сделать используя простую команду:
    # tar -czvf /rezerv/docs-`date +"%Y-%m-%d_%H-%M"`.tar.gz -C /mnt/ arhiv
    • В итоге в директории /rezerv, мы получим резервную копию общей папки Windows, в архиве формата: docs-Дата_Время.tar.gz
    архив с бэкапом общей папки windows

    • После создания бэкапа, можно размонтировать общую папку.
    # umount /mnt/arhiv

    Автоматический бэкап общей папки Windows в Linux

    • Для настройки автоматического резервного копирования, мы будем использовать планировщик заданий Cron. Нужно зайти в /etc/crontab и добавить задание.
    • Можно создать простую задачу, как и в случае с бэкапом сайта.(Общая папка должна быть постоянно подключена)
    • Задание в таком случае будет выглядеть так:
    # Бэкап
    00 23 * * * root /bin/tar -czf /rezerv/docs-`date +\%Y-\%m-\%d_\%H-\%M`.tar.gz -C /mnt/ arhiv
    • Резервное копирование будет производится каждый день в 23:00.
    • Но наиболее удобным вариантом, будет настройка резервного копирования при помощи специального скрипта.
    • Создаем файл /usr/local/bin/backup.sh с таким содержанием:
    #!/bin/sh
    dir_1='/rezerv'
    dir_2='/mnt/'
    dir_3='arhiv'
    time=`date +"%Y-%m-%d_%H-%M"`
    
    mount -t cifs //192.168.10.20/123 /mnt/arhiv -o user=user-2,password=123
    /usr/bin/tar -czvf $dir_1/docs-$time.tar.gz -C $dir_2 $dir_3
    /usr/bin/find $dir_1 -type f -mtime +7 -exec rm {} \;
    umount /mnt/arhiv
    
    

    • Три первые строчки, это директории используемые для резервного копирования.
    • Четвертая строчка, это формат даты и времени.
    • Дальше идёт команда для монтирования общей папки.
    • После монтирования, расположена команда создания бэкапа.
    • Предпоследней идёт команда удаления резервных копий старше семи дней.(Можно изменить под свои нужды)
    • И последней идёт команда размонтирования общей папки Windows.

    • Делаем скрипт исполняемым.
    делаем скрипт исполняемым

    • Добавляем задание на выполнение скрипта в Cron.
    # Бэкап с помощью скрипта 
    00 23 * * * root /usr/local/bin/backup.sh >/dev/null 2>&1
    добавление задание в cron

    • После добавления задания, скрипт backup.sh будет выполнятся каждый день в 23:00.

    Таким способом, можно организовать резервное копирование одной и более общих папок, на разных компьютерах локальной сети. Можно создать несколько скриптов, изменив переменные, и время выполнения скрипта.

    Сегодня мы рассмотрели тему: «Бэкап общей папки Windows в Linux». Произвели настройку резервного копирования критически важных файлов. Смотрите также видео по теме.

    Надеюсь статья была вам полезна. До встречи в новых статьях.

    С уважением, Андрей Бондаренко.


    Видео на тему «Бэкап общей папки Windows в Linux»:

    ✧✧✧

    Поблагодарить автора за полезную статью:

    WMZ-кошелёк = Z667041230317


    ✧ Рубрика «Linux»

    ✧ Комментарии: нет


    Похожие записи


    Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии
  • Как отключить скандиск при загрузке windows 7
  • Blair witch не запускается на windows 11
  • Как установить npm на windows
  • Можно ли установить windows с iso образа
  • Hp g62 ati windows 10