Копирование Windows 10 на новые компьютеры с UEFI

Когда нужно установить десяток-другой одинаковых Windows 10 с предустановленным софтом и своими фирменными настройками, а возможности использовать корпоративные средства развертывания от Microsoft наподобие SCCM+MDT нет, можно вручную создать флэшку с эталонным образом системы и сэкономить кучу времени, не устанавливая Windows и приложения на каждом новом компе вручную. Предупреждение: сценарии ниже для компьютеров с UEFI-загрузкой и GPT, в случае MBR и Legacy Boot другая схема разбивки диска!

Понадобится:

  1. компьютер-образец (лучше бы виртуальный)
  2. компьютер с установленным Windows ADK
  3. флэшка

Первым делом устанавливаем и настраиваем Windows на эталонном компьютере (не забыв выставить режим загрузки UEFI), ставим свои любимые приложения. Если используется виртуалка, то по завершении этого этапа рекомендовано ее выключить и сделать снапшот, чтобы иметь возможность вернуться к нему в случае каких-либо проблем.

1. «Обезличивание» Windows с помощью sysprep

Sysprep нужен для удаления уникальных идентификаторов из системы. В нашем случае понадобится дополнительный файл ответов:

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="specialize">
        <component name="Microsoft-Windows-Shell-Setup"
 processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35"
 language="neutral" versionScope="nonSxS"
 xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <RegisteredOrganization>My Corp</RegisteredOrganization>
            <TimeZone>FLE Standard Time</TimeZone>
        </component>
    </settings>
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-Shell-Setup"
 processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35"
 language="neutral" versionScope="nonSxS"
 xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <OOBE>
                <SkipMachineOOBE>true</SkipMachineOOBE>
            </OOBE>
        </component>
    </settings>
    <settings pass="auditSystem">
        <component name="Microsoft-Windows-Deployment"
 processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35"
 language="neutral" versionScope="nonSxS"
 xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <Reseal>
                <ForceShutdownNow>false</ForceShutdownNow>
                <Mode>OOBE</Mode>
            </Reseal>
        </component>
    </settings>
</unattend>

На шаге specialize устанавливается название компании и часовой пояс. Остальное нужно, чтобы Windows при первом запуске не требовал создать нового пользователя. Сохраняем файл на эталонной системе с именем c:\my.xml и там же запускаем sysprep (из командной строки с правами администратора):

cd c:\windows\system32\sysprep
sysprep /generalize /audit /shutdown /unattend:c:\my.xml

После выполнения инициализации система автоматически выключится. Windows «обезличена» и готова к захвату образа. Следующую загрузку уже необходимо делать с внешнего диска с WinPE.

2. Захват образа системного диска

Понадобится загрузочная флэшка с WinPE (или для виртуалки iso-образ, не принципиально). Создается на компьютере с Windows ADK (полная инструкция):

  1. Start the Deployment and Imaging Tools Environment as an administrator.
  2. Create a working copy of the Windows PE files:
    copype amd64 C:\WinPE_amd64
    
  3. Install Windows PE to the USB flash drive:
    MakeWinPEMedia /UFD C:\WinPE_amd64 <USB drive letter>:

Загружаем компьютер-образец в среду WinPE. Подключим сетевой диск, на который будем сохранять образ системы (для простоты лучше сохранять сразу на свой компьютер с установленным ADK, на котором потом будет создаваться установочная флэшка):

net use N: \\mycomp\myshare /USER:username

Если сеть не поднялась по причине отсутствия DHCP, можно назначить сетевой карте статический адрес командой наподобие:

netsh interface ipv4 set address Ethernet0^
 static 192.168.0.88 255.255.255.0 192.168.0.1

И собственно захват образа:

dism /Capture-Image /ImageFile:N:\my.wim /CaptureDir:C:\ /Name:"My"

3. Создание установочной флэшки

Дальнейшие действия выполняются на компьютере с Windows ADK. Создадим загрузочную флэшку, на которой будет лежать эталонный образ системного диска для новых компьютеров и программа для копирования этого образа на жесткий диск. Для этого снова запускаем (от имени администратора) Deployment and Imaging Tools Environment.

1. Создаем рабочую папку с файлами для флэшки:

copype amd64 C:\WinPE_my

Все дополнительные файлы будем размещать в папке C:\WinPE_my\media, которая после загрузки WinPE станет корнем диска D.

2. Разбиваем образ системы на файлы размером не более 4 Гб, так как на флэшке с WinPE файловая система FAT32, и файлы большего размера на нее не записать:

dism /Split-Image /ImageFile:C:\myshare\my.wim^
 /SWMFile:C:\WinPE_my\media\my.swm /FileSize:4000

3. Создаем сценарий C:\WinPE_my\media\partition_disk.txt для diskpart, который создаст разделы на целевом диске:

select disk 0
clean
convert gpt
rem == 1. Windows RE tools partition ===============
create partition primary size=450
format quick fs=ntfs label="Windows RE tools"
assign letter="T"
set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
gpt attributes=0x8000000000000001
rem == 2. System partition =========================
create partition efi size=100
rem    ** NOTE: For Advanced Format 4Kn drives,
rem               change this value to size = 260 **
format quick fs=fat32 label="System"
assign letter="S"
rem == 3. Microsoft Reserved (MSR) partition =======
create partition msr size=16
rem == 4. Windows partition ========================
create partition primary
format quick fs=ntfs label="Windows"
assign letter="W"
rem ================================================
list volume
exit

4. Создаем сценарий C:\WinPE_my\media\setup.cmd, который займется установкой Windows:

@echo off
d:
cd d:\

echo Partitioning disk ...
diskpart -s partition_disk.txt

echo Applying image ...
dism /Apply-Image /ImageFile:my.swm^
 /swmfile:my*.swm /Index:1 /ApplyDir:W:\

echo Copying boot files to the System partition
bcdboot W:\Windows

echo TYPE "exit" TO REBOOT

5. Создаем собственно флэшку:

MakeWinPEMedia /UFD C:\WinPE_my <USB drive letter>:

4. Установка Windows на новый компьютер

На компьютере, на который мы планируем установить Windows 10 с нашей флэшки, необходимо в настройках BIOS включить загрузку с EFI устройств, можно даже отключить Legacy Boot и включить SecureBoot для пущей важности. Возможно, придется руками указать ему грузиться с флэшки. После загрузки вводим команду

D:\setup

Если все прошло успешно, даем команду exit и после перезагрузки имеем свежеустановленную систему.

Рубрика: Windows 10 | Добавить комментарий

Параметры ядра Linux и разрыв соединения при передаче больших файлов

Началось все с перемаршрутизации почты. Приоритеты основного и резервного MX поменялись местами, и поток писем бодро полился через сервер в другом филиале. Ну как «бодро» – очень скоро вылезла неприятность: письма размером больше 10 Мб на дружественную организацию, с которой уже давно был поднят вполне стабильный VPN-туннель, застревали в очереди на отправку, в логах такое:

conversation with relay.friend.local[192.168.0.9] timed out while sending message body

Сервер на CentOS 6.8, почта – postfix. С обратной стороны то же самое – письма от друзей висят в очереди (там Ubuntu 15.10+тот же postfix). Как временный workaround, перенаправили почту друг на друга через Интернет, в обход туннеля – почта залетала. Стало быть, postfix работает нормально, проблема где-то в сетевых настройках.

Проблема воспроизвелась при копировании файла через scp. Причем что странно – проблема возникает только при отправке данных, если тянуть их с той стороны – все OK:

[root@relay.we.local ~] scp test.bin relay.friend.local:
FAIL

[root@relay.friend.local ~] scp relay.we.local:test.bin .
SUCCESS

Копаем дальше. У нас много разных серверов на линуксах в нескольких филиалах, где-то ситуация воспроизводится, где-то все работает без проблем. Внутри одного филиала проблема не проявляется, только через VPN-туннели, хотя каналы у нас неплохие – по 50-100 Мбит. Пытаемся найти отличия между проблемными серверами/каналами и теми, где все работает:

Первая версия – вроде как проблема там, где сетевая карта VMXNET3 (у нас все в виртуальной среде). Меняем на E1000 – не помогло (

Внезапно оказывается, что если отключен файрвол (стандартный линуксовый iptables) – то все работает! Однако, на старом почтовике iptables включен, но все хорошо. Понимаем, что соединение рубится файрволом, осталось разобраться почему.

Прослушка трафика с помощью wireshark показала, что при передаче файла идет куча ретрансмиссий, затем в какой-то момент iptables просто перестает пропускать пакеты. Видимо, перестает считать что пакеты принадлежат существующему соединению и соответственно блокирует. Почему оно так себя ведет – остается загадкой.

Ладно, зайдем с другой стороны. На старом почтовике, так же как и на новом, наш любимый CentOS 6.8, вроде бы системы идентичны. Но на старом проблемы нет, а на новом есть. И построчное сравнение конфигов показало наконец заветное отличие! Всего одна строчка в /etc/sysctl.conf:

net.ipv4.tcp_sack = 0

и проблема исчезает.

Казалось бы, опция tcp_sack наоборот должна улучшать производительность  сети на каналах с большим количеством повторных отправок пакетов. Но то ли сами iptables с этим делом плохо работают, то ли сетевое оборудование где-то по пути модифицирует трафик и этим вставляет палки в колеса iptables, но факт остается фактом: если у вас по непонятным причинам рвутся соединения при передаче больших файлов, попробуйте отключить tcp_sack.

Рубрика: Linux | Добавить комментарий