Автоматизированная миграция файлового сервера (FS) на другой диск

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

1. Миграция происходит внутри одного сервера — с жесткого диска на диск, подключенный с сетевого хранилища по iSCSI.

2. Буквы дисков неизвестны. Известны только метки — FS (старый диск) и iSCSI (новый).

3. Список общих папок неизвестен и их названия тоже. Ну то есть на всех 53-х серверах, на котороых предстоит перенос, они могу быть разными. Как и буквы дисков, собственно.

4. Миграция должна быть полностью автоматизированной (запускается через Invoke-Command с другой машины).

Продолжаем осваивать powershell.

Данные-то можно перенести посредством Robocopy (встроенная утилита, более продвинутый вариант xcopy). Но как перенести настройки расшаренных папок на новый диск? Первый пришедший в голову вариант — определить список шар, сохранить куда-то этот список, а также настройки доступа (Женя предлагал XML), пересоздать заново на новом диске. Но процесс определения прав доступа и задания их столь мучителен в Powershell, что разум отверг этот вариант.

Второй идеей была правка реестровых записей на предмет исправления пути к общим папкам. Но как-то тоже ненадёжно. Интуиция подсказывала, что есть ещё варианты. Более простые. Например, перенос данных с одного диска на другой, отключение буквы старого диска и присвоение её новому. Осталось определить — какие же буквы у дисков.

Решением стал следующий скрипт (FSMig-disk2disk.ps1):

#Поиск дискового тома по метке
$OldVol = Get-WmiObject -class win32_volume | where {$_.label -like 'FS'}
$NewVol = Get-WmiObject -class win32_volume | where {$_.label -like 'iSCSI'}
#Определение буквы диска
$OldLetter = $OldVol.DriveLetter
$NewLetter = $NewVol.DriveLetter

#Перенос данных со старого диска на новый
&Robocopy $OldLetter $NewLetter /E /COPYALL /secfix /V /r:1 /LOG:C:\FSMigrate.log
#Создание сценария для diskart
$dp_file = "c:\dp-sc.txt"

#Выбор старого диска
$str="select volume " + $OldLetter
$str| Out-File -FilePath $dp_file -Encoding ascii

#Удаление буквы старого диска
$str="remove letter=" + $OldLetter + " NOERR"
$str| Out-File -FilePath $dp_file -Encoding ascii -Append

#Выбор нового диска
$str="select volume " + $NewLetter
$str| Out-File -FilePath $dp_file -Encoding ascii -Append

#Удаление буквы нового диска
$str="remove letter=" + $NewLetter + " NOERR"
$str| Out-File -FilePath $dp_file -Encoding ascii -Append

#Присвоение новому диску буквы старого диска
$str="assign letter=" + $OldLetter + " NOERR"
$str| Out-File -FilePath $dp_file -Encoding ascii -Append
&diskpart /s c:\dp-sc.txt

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s