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