Когда нужно массово переустановить ОС на компьютерах в корпоративной сети, мы привыкли использовать System Center Configuration Manager (SCCM) и все хорошо, если речь идёт про Windows, но с Linux немного все сложнее, т.к. нет готовых инструментов в SCCM. К счастью, SCCM удобный и гибкий инструмент, чтобы решить любую задачу по переустановке ОС. Если у вас инсталляция SCCM не распределённая, где все ПК находятся в одной сети, то вам подойдёт вот эта статья для установки ОС Linux с сетевой папки. Если у вас распределённая инсталляция SCCM, где много Distribution Point в отдалённых локациях (с «небыстрыми» каналами связи), а установку нужно проводить на 100 ПК одновременно, то с сетевой папки сделать это сложно. Именно эту задачу нам понадобилось решить, попутно улучшив и автоматизировав способ, описанный выше (идея взята из упомянутой статьи и доработана, спасибо fisher51 и моим коллегам, кто помогал). Итак, приступим. Создаём виртуалку с минимальным диском, это важно, т.к. от размера будет зависеть размер итогового образа (для Xubuntu достаточно 9Gb). Устанавливаем Xubuntu (для примера), выбирая стандартное разделение дисков: Как видно на скриншоте, у нас один диск 9Gb со стандартной разбивкой, где /dev/sda1 – загрузочная партиция (FAT32), /dev/sda2 – логический диск, /dev/sda5 – партиция самого Linux (ext4). Далее настраиваете операционную систему, как вам нужно, например, в корпоративной среде можно сразу прописать настройки прокси (PAC файл), временную зону и т.д. Образ можно снять либо на подключённый дополнительный диск, либо подключить сетевой. В последнем случае нам понадобится ещё она компонента: Мы помним, что диск у нас уменьшен для минимизации размера образа, но после его разворачивания на обычных компьютерах, где диск более 9Gb, нам нужно его автоматически расширить без привлечения администратора. Также в виде автоматизации можно сделать ввод в домен при запуске системы, либо запуск любых других скриптов, но этот вопрос подробно рассматривать не буду, оставлю для специалистов. Итак, делаем автоматизацию расширения диска при первом запуске системы.Создаём/изменяем в директории /etc файл rc.local  - это конфиг службы rc-local, которая будет запускаться при запуске системы и стартовать наш/и скрипт/ы. Листинг rc.local где: #!/bin/sh -e   - запуск консоли, exec /usr/sbin/res1.sh – запуск скрипта res1.shЧерез команду exec сюда можно дописывать и другие скрипты, главное не забывать их отсюда удалять, иначе они будут запускаться при каждом запуске (хотя это тоже полезно, но не в моем случае). Делаем этот файл исполняемым chmod +x /etc/rc.local Создаём в директории /usr/sbin/ файл, называем, например, res1.sh Листинг res1.sh где:1 строчка – передаём через конвейерный input команду для утилиты parted выполняем resizepart 2 на 100% диска и resizepart 5 на 100% , т.е. раздвигаем логическую и основную партицию linux до 100% диска;2 строчка – делает обновление информации о диске;3 строчка – расширяется файловая до конца диска;4 строчка – удаление строчки запуска скрипта из службы rc.local;5 строчка – удаление скрипта res1.sh;6 строчка – перезагрузка. Делаем этот файл исполняемым: chmod +x /usr/sbin/res1.sh Я буду снимать образ на сетевой диск, следовательно, подключим его: Теперь запустим снятие образа на добавленную сетевую папку. где:if- указываем с какого диска снимаем копию;of – указываем куда копируем образ;bs- размер блока чтения 8Мб. В итоге на сетевой папке у нас лежит образ sda.dd.img размером 9Gb, сжимаем его архиватором 7z,  в Zip-файл sda.dd.zip  (при выборе максимального сжатия у меня файл получился 2.14 Gb, при минимальном быстром сжатии 2.22 Gb что в целом очень хорошо). Далее создаём сетевую папку, доступную по всей сети компании, с правами подключения под определённым аккаунтом. В папку выкладываем скрипт SetupLinux.ps1, который будет запускать в Task Sequence с определёнными параметрами. Далее переходим в SCCM и создаём пакет. В пакете у нас должны быть: 7z.dll , 7z.exe   - программа 7z, чтобы распаковать архив (достаточно этих файлов); ddrelease64.exe – утилита DD под Windows, берем отсюда, там есть 32- и 64-битная версия (я использую 64-битную, т.к. у меня boot образ x64); sda.dd.zip – собственно сам файл архива; install.cmd – пакетный файл установки. Листинг install.cmd: где:XXX00424 – код текущего пакета, из которого производится запуск; C 3 строчкой поясню, распаковываем через 7z в консоль (параметр -so) файл sda.dd.zip. Далее передаём поток утилите ddrelease64.exe и сразу записываем его на диск \\?\Device\Harddisk0\Partition0 блоком 8Mb. Далее пакет распространяем на Distribution Point’ы. Теперь создадим загрузочный Task Sequence Выбираем Create a new custom task sequence, нажимаем далее. Выбираем 64-битный загрузочный образ, нажимаем далее. Добавляем шаг 1: перезагрузка, если при запуске задания введён неправильный пароль (защита от «дурака»). Добавляем шаг 2: подключаем сетевую папку, доступную под определённым аккаунтом по всей сети, в которой лежит скрипт SetupLinux.ps1 (описанный выше). Добавляем шаг 3: запуск PowerShell скрипта с параметром -WorkType CreatePartition для инициализации, очистки диска и создания временной NTFS партиции для загрузки образа. Добавляем шаг 4: запуск PowerShell скрипта с параметром  -WorkType StartShowProgressLinuxDownload для отображения прогресса скачки образа. Добавляем шаг 5: скачивание пакета SCCM на созданный временный диск NTFS Добавляем шаг 6: запуск PowerShell скрипта с параметром  -WorkType StartShowProgressLinuxInstall для отображения прогресса установки образа. Добавляем шаг 7: запуск командного файла install.cmd из скачанного на временный диск пакета SCCM. Добавляем шаг 8: запуск PowerShell скрипта с параметром  -WorkType SetVariable, в этом шаге на диске, куда уже записали Linux, находим загрузочный диск с FAT32 для сохранения JSON файла с параметрами Task Sequence. Через него можно передать переменные имя компьютера OSDComputerName, нужно ли вводить ПК Linux в домен IN_DOMAIN, либо любые другие параметры. На эту партицию также можно положить любые скрипты, которые вы хотите запустить при запуске ОС Linux. Далее добавляем Deployment для Task Sequence, указываем необходимые переменные. Далее загружаемся по сети PXE и наслаждаемся установкой Linux из SCCM за 5-7 мин. В итоге получилась заливка ОС Linux и партиция раздвинута до конца диска 40gb. Чтобы убедится, что мы передали файл конфига из SCCM в Linux, подключим временно партицию /dev/sda1, командой  mount /dev/sda1 /mnt/cm Параметры, переданные через JSON из Task Sequence: Вот и все, наслаждаемся работой Linux в корпоративной сети. Удачи вам в ваших экспериментах.