FreeBSD 11 и Hyper-V 2012R2, 2016 или NanoServer — старые проблемы установки

Снова всплыла застарелая проблема установки FreeBSD на Hyper-V. Казалось бы, так все хорошо побороли на 2012R2 и FreeBSD 10, но нет, вышла FreeBSD 11 и снова здравствуйте - установщики не видит виртуальный жесткий диск. В итоге на этапе разметки диска получаем отлуп в виде:

Partitioning error
An installation step has been aborted. Would you like to restart the installation or exit the installer?

Решается задача просто, как и ранее. Во время загрузки установщика с dvd на пригласительном скрине "Welcome to FreeBSD" выбираем не 1 пункт меню как обычно а 3 - "Escape to loader prompt". На приглашение "ОК" вводим следующее:

set hw.ata.disk_enable=1
boot

Дальше устанавливаем операционную систему как нам надо, перегружаем виртуальную машину, снова в меню идем в пункт "Escape to loader prompt", повторяем команды представленные выше. Логинимся под рутом, и прописываем в /boot/loader.conf (работает ee /boot/loader.conf) следующее:

autoboot_delay="3"
hw.ata.disk_enable="1"

Сохраняемся, перегружаем виртуалньую машину и успешно запускаемся. Работаем.
С драйверами сетевой карты хоть проблем нет, видит как legacy так и native варианты.

Поделиться

Опубликовать в Facebook
Опубликовать в LiveJournal

Собираем кластер виртуализации на NanoServer

Исходные данные:
Есть два севера HP DL360G8 и FC СХД MSA P2000 G3. Задача - собрать кластер виртуализации на решении NanoServer.
Процесс создания волюмов и маппинга на ноды описывать не буду, это несложно. Для кластера надо кворумный волюм и волюм данных. У меня вышло 2 волюма данных, так как при 24 дисковой хранилке в RAID-группу можно собрать только 16 дисков... Но не суть.

Итак, подготовка и установка нод будущего кластера. Я использую отдельный сервер с Windows 2016 Standard для подготовки заливочной флешки. Сам дистрибутив у меня торчит на флешке по пути F:\

Копируем с дистрибутива 2016 каталог NanoServerGenerator (например в D:\Distribs\NanoServerGenerator\)

Запускаем PS с повышенными привилегиями, меняем текущий каталог на D:\Distribs\NanoServerGenerator\

Импортируем модуль NanoServerImageGenerator (работает в повершелле ОС 8.1, 10, 12R2, 16):
Import-Module .\NanoServerImageGenerator -Verbose

Отступление:
Для создания vhd с nanoserver, для использования nanoserver в качестве виртуалки делаем так:
New-NanoServerImage -Edition Standard -DeploymentType Guest -MediaPath F:\ -BasePath .\Base -TargetPath .\NanoServerVM\nano1.vhd -ComputerName s-mos1-nano1
и указываем административный пароль. В итоге в каталоге D:\Distribs\NanoServerGenerator\ получаем каталог NanoServerVM с vhd виртуалки наносервера.
vhd расширение создаст диск для виртуальной машины первого поколения, а vhdx создаст диск для второго поколения виртуальных машин) для компьютера с именем s-mos1-nano1

Отдельно создаем такой же образ для второй ноды - s-mos1-nano2

Создаем образ для развертывания хоста виртуализации на физическом железе:
Чтобы создать образ с поддержкой OEM драйверов для аппаратной развертки на физический хост используем опцию -OEMDrivers. В моем случае я еще добавляю поддержку кластеризации, файлсервера и Hyper-V (все опции сборки перечислены здесь: https://technet.microsoft.com/ru-ru/windows-server-docs/get-started/deploy-nano-server)
New-NanoServerImage -Edition Datacenter -DeploymentType Host -MediaPath F:\ -BasePath .\Base -TargetPath .\NanoServerPhysical\NanoServer.wim -ComputerName s-mos1-nano1 -OEMDrivers -Clustering -Storage -Compute -Package Microsoft-NanoServer-SecureStartup-Package, Microsoft-NanoServer-Host-Package

Копируем WIM образ на флешку с Windows PE, загружаемся с этой флешки на хосте где надо развернуть наносервер, запускаем diskpart, находим диск, который будет системным для NanoServ (пусть это 0 диск):

select disk 0
clean
create partition primary size=100
select partition 1
format quick fs=ntfs label="SYSTEM"
active
assign letter=s
create partition primary
select partition 2
format quick fs=ntfs label="NANOSERVER"
assign letter=n

выходим из diskpart и применяем образ NanoServer (изменив путь к WIM-файлу):

Dism.exe /apply-image /imagefile:.\nano1.wim /index:1 /applydir:n:\
Bcdboot.exe n:\Windows /s s: /f ALL

Убираем флешку и перезагружаем систему с помощью команды Wpeutil.exe reboot.

На всякий случай, как создать WinPE флешку:
нужен ADK Windows 10, на клиентской машине с Windows 10, или на сервере с Windows Server 2016. Запускаем среду средств развертывания и работы с образами с повышенными привилегиями, а в ней:

copype amd64 C:\WinPE_amd64
MakeWinPEMedia /UFD C:\WinPE_amd64 F:

После запуска нод нужно получить удаленное управление. Добавляем сервера в доверенные на сервере с GUI и RSAT (использовал этот же сервер с Windows Standard 2016 Desktop Experience):
Set-Item WSMan:\localhost\Client\TrustedHosts –Value "10.131.252.13"
Set-Item WSMan:\localhost\Client\TrustedHosts –Value "10.131.252.14"

Подцепляем их в Server Manager с локальной учеткой которая настроена на удаленных серверах и запускаем удаленный PS, настраиваем DNS сервера.
Get-NetAdapter даст нам индексные номера интерфейсов (ifIndex). Даем интерфейсу LAN адреса DNS:
Set-DnsClientServerAddress -InterfaceIndex 4 -ServerAddresses ("10.131.252.98","10.131.252.99")

Добавляем машину в домен, работает только оффлайн метод. На сервере уже находящемся в домене делаем запрос:
Djoin.exe /Provision /Domain "mydomain.ru" /Machine "s-mos1-nano1" /Savefile domainjoin.djoin /REUSE

Копируем на nanserver получившийся файлик (я копирую на c$\Users\Administrator\Documents, так как туда по умолчанию смотрит remote powershell сессия) и присоединяем в домен сервер:
djoin /requestodj /loadfile domainjoin.djoin /windowspath c:\windows /localos

Перегружаем сервер:
shutdown -r -t 0
Exit-PSSession

То же самое проделываем на второй ноде.
Я через Emergency Console назначил IP адреса на вторых интерфейсах для HerartBeat. Можно и через PS.

Для нормального создания кластера нужно прописать ноды в отдельную OU, дать права на создание объектов в этой OU нодам. После этого создаем кластер из серверов:
$Servers = 's-mos1-nano1','s-mos1-nano2'
New-cluster -name s-mos1-nanocl -node $Servers -StaticAddress 10.131.252.15

Далее можно управлять кластером через оснастку на сервере с GUI и нужным компонентом RSAT.
В моем случае еще есть полка, подключенная по избыточным FC линкам к хостам с презентованными дисками кворума и данных. Нужно корректно поднять MPIO и сделать кворумный и дата диски.
Установить MPIO можно через оснастку управления на сервере c GUI или через PS:
Enable-WindowsOptionalFeature -Online -FeatureName MultiPathIO

Для включения MPIO полезен скрипт MultipathIoClaim.ps1, который я взял тут:
https://technet.microsoft.com/en-us/windows-server-docs/get-started/mpio-on-nano-server

Форматируем подключенные диски:
Get-Disk | Where partitionstyle -eq ‘raw’ | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem NTFS -Confirm:$false

Дальше мне понадобилось на хосте Windows Server 2016 развернуть RSAT. Через консоль RSAT Failover Clustering можно определить роли дисков. У меня, как я писал выше, это был один свидетель и два CSV.
Через консоль RSAT создаем нужные виртуальные свичи на нодах. Все, можно создавать виртуальные машины, делать их высокодоступными.

Подмеченные проблемы:
1. Нет поддержки Teaming. Интерфейсы сингловые, что может приводить к нежелательным отказам на сетевом уровне. Ждем включения поддержки Teaming, хоть Microsoft на замену предлагает пользоватся инструментарием виртуалнього свитчинга.
2. Нельзя назначать static IP если на интерфейсе нет линка. Проблема тянется с powershell на 2012R2.
3. Не нашел как можно деинициализировать проинициализированные диски на нодах.

Поделиться

Опубликовать в Facebook
Опубликовать в LiveJournal

Собираем отказоустойчивый Storage Spaces Direct из 5 простых серверов

Итак, в наличии имеется пять дешевых серверов Supermicro с 8 D дисками по 2Tb, подключенных через RAID контроллер Adaptec 6805, одним диском SATA малого размера, подключенным напрямую к материнской плате. На каждом сервере по 2 гигабитные сетевые карты, 16 гигабайт оперативной памяти и по два процессора Xeon E5-2670.
По одному эти сервера для меня представляют мало пользы, но вместе, они представляют из себя сырой объем в 80 терабайт, что уже может быть вкусно для файлового хранилища, без требований к скорости.
Попробую собрать из этого отказоустойчивое хранилище с использованием технологии Storage Spaces Direct. Забегая вперед, скажу что нечетное количество серверов нам понадобится для того, чтобы не заводить в кластере свидетеля. Нечетное количество нод позволяет работать кластеру без свидетеля.

На момент написания статьи в доступе был релиз Windows Server 2016 TP4. Его я и установил на все пять серверов.
ОС определила все оборудование, имеющееся на борту, за исключением SAS контроллера с идентификатором PCI\VEN_8086&DEV_1D6B&CC_0107, что соответствует Intel(R) C600 Series Chipset SAS RAID, который мне сейчас не понадобится.

sas-controller-unidentified

RAID контроллер позволяет презентовать подключенные к нему диски в виде JBOD, что в нашем случае идеальный вариант.

Первая проблема, которую пришлось решать довольно старая, с которой я столкнулся еще в Windows 2008. Представленные диски ОС видит как набор маленьких RAID массивов:
Get-PhysicalDisk | FT FriendlyName, Mediatype, BusType -autosize

primary_drives

Такую шину S2D не поддерживает. Решить это дело в моем случае помог тот же прием, что и раньше - в реестре исправить тип шины на SATA для нужного типа контроллера:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\arcsas\Parameters]
"BusType"=dword:0000000b
вместо
"BusType"=dword:00000008
Делаем эту операцию на всех нодах, перегружаем их. Устанавливаем нужный нам для кластерного файлсервера роли и компоненты:
roles-install features-install

Проверяем работу интерфейсов. В моем случае с двумя сетевыми картами, сделал две сети - клиентскую и кластерную. В идеале, нужно иметь 4 сетевых интерфейса на каждой ноде, создать два switch independent тима и подключить их в два независимых свича, исключив отказ сетевого оборудования:
Get-NetAdapter | FT Name, InterfaceDescription, LinkSpeed -autosize

Name      InterfaceDescription                        LinkSpeed
----      --------------------                        ---------
HEARTBEAT Intel(R) I350 Gigabit Network Connection #2 1 Gbps
LAN       Intel(R) I350 Gigabit Network Connection    1 Gbps

Собираем кластер из 5 нод:

cluster-networkscluster-ready
Включаем функционал S2D:
Enable-ClusterStorageSpacesDirect

Смотрим какие локальные диски на нодах могут быть помещены в пул:
Get-PhysicalDisk | ? CanPool -eq $true

У меня это по 8 локальных физических дисков на каждом из 5 серверов:

drives_ready_to_pool

 

Проверяем работоспособность подсистемы StorageSubSystem
Get-StorageSubSystem *cluster*
FriendlyName                          HealthStatus OperationalStatus
------------                          ------------ -----------------
Clustered Windows Storage on s-ssdcl1 Healthy      OK

-----
Собираем пул:
Если у нас в пуле было бы три диска, то их можно собрать только в уровень Mirror:
New-StoragePool -StorageSubSystemName s-ssdcl1.tnt-tv.ru -FriendlyName StorageSpacesDirect -WriteCacheSizeDefault 0 -ProvisioningTypeDefault Fixed -ResiliencySettingNameDefault Mirror -PhysicalDisks (Get-StorageSubSystem -Name s-mos1-w16.tnt-tv.ru | Get-PhysicalDisk)

Так как дисков у нас сильно побольше, создаем пул Parity, который возможен от 4 и более дисков:
New-StoragePool -StorageSubSystemName s-ssdcl1.tnt-tv.ru -FriendlyName StorageSpacesDirect -WriteCacheSizeDefault 0 -ProvisioningTypeDefault Fixed -ResiliencySettingNameDefault Parity -PhysicalDisks (Get-StorageSubSystem -Name s-ssdcl1.tnt-tv.ru | Get-PhysicalDisk)

pool-created

-----
Обозначаем тир:
Тиринг нужен, при наличии разнородных носителей (SSD, SAS, SATA). Tier-зеркало (актуальный для SSD носителей) создается так:
New-StorageTier -StoragePoolFriendlyName "StorageSpacesDirect" -FriendlyName "MirrorTier" -MediaType SSD -ResiliencySettingName Mirror

В нашем случае, можно создавать тир, а можно обойтись и без него, так как диски все одинаковые. Я обозначил Parity тир больше для проформы:
New-StorageTier -StoragePoolFriendlyName "StorageSpacesDirect" -FriendlyName "ParityTier" -MediaType HDD -ResiliencySettingName Parity

-----
Создаем VHD с рабочей емкостью:
Для создания VHD, лично мне удобно пользоваться GUI Failover Clustering.

В повершелле это выглядит так. Если несколько тиров:
New-Volume -StoragePoolFriendlyName "StorageSpacesDirect" -FriendlyName "FailSafeData" -AccessPath "S:" -ResiliencySettingName "Parity" -ProvisioningType "Fixed" -StorageTiers (Get-StorageTier -FriendlyName "ParityTier") -StorageTierSizes 55000GB -FileSystem NTFS

Если один тир, можно просто:
New-Volume -StoragePoolFriendlyName "StorageSpacesDirect" -FriendlyName "FailSafeData" -Size 100GB -ResiliencySettingName "Mirror" -FileSystem NTFS -AccessPath "S: "-ProvisioningType Fixed

Выделил опцию Enclosure awareness - это поможет прозрачно отработать отказ одного из серверов в кластере. Тем не менее сразу теряю емкость 5 дисков (одной ноды).

vhd-enclosure-awareness

Полезную емкость у диска выбрал меньшую, чем может дать мой набор дисков. Рекомендуется держать неразмеченный кусок, как кеш для перестроений при замене отказавших дисков:

vhd-creation

Проверил отказоустойчивость отключением любого из серверов, и вытаскиванием двух любых дисков - хранилище доступно и работает!

Напоследок несколько заметок по работе с готовым S2D.
Проверить отказоустойчивость:
Get-StoragePool -FriendlyName "StorageSpacesDirect" | FL FriendlyName, Size, FaultDomainAwarenessDefault

Удаление в обратном порядке:
смотрим какие есть виртуальные диски (тут я его удалил из оснастки, но видно что он не удален раельно а только Detached)

Get-VirtualDisk
FriendlyName ResiliencySettingName OperationalStatus HealthStatus IsManualAttach   Size
------------ --------------------- ----------------- ------------ --------------   ----
StorageSpacesDirect    Parity                Detached          Unknown      True           402 GB

Удаляем диск
Remove-VirtualDisk "StorageSpacesDirect"

Если нужно, изменяем свойство пула IsReadonly на False (иначе не сможем удалить пул):
Set-StoragePool "StorageSpacesDirect" -IsReadOnly $False

Удаляем пул
Remove-StoragePool "StorageSpacesDirect"

Поделиться

Опубликовать в Facebook
Опубликовать в LiveJournal

Настройка отправки сообщений mantis через сервера Яндекс

С имеющимся функционалом почты для доменов от Яндекса для маленьких компаний это спасение. Одно из применений - рассылка уведомлений из багтрекера mantis. В интернете очень много вопросов о том, как подключить mantis к google mail, но нет ничего для Яндекса. Я подключил - работает. Выкладываю параметры настройки mantis: Читать далее Настройка отправки сообщений mantis через сервера Яндекс

Поделиться

Опубликовать в Facebook
Опубликовать в LiveJournal

Изменения в подключении libphp5.so к apache с версии php55-5.5.11

Вчера обновил на двух хостах с FreeBSD php до версии 5.5.11 и получил намертво вставшие сайты на php. А всему виной то, что из стандартной конфигурации php убрали возможность собрать php_module во время сборки самого php.
Как следствие, после portupgrade порта php пропала библиотека libphp5.so и строка конфигурации в httpd.conf:
LoadModule php5_module libexec/apache24/libphp5.so

Задача решается просто - путем сборки отдельного порта. В моем случае для php55 я выбрал /usr/ports/www/mod_php55.
После сборки и библиотека и конфигурация httpd.conf снова вернулись на свои места, осталось только перезапустить apache.

Поделиться

Опубликовать в Facebook
Опубликовать в LiveJournal