Wednesday, 21 November 2018

Configure CentOS 7 PXE Server to Install Windows 10

Configure CentOS 7 PXE Server to Install Windows 10

In our previous posts, we have configured a PXE boot server for automated installation of RHEL 7.5 operating system that supports both BIOS and UEFI based clients. Later on, we added RHEL 6 and Ubuntu 18.10 installation options in our PXE boot server. We have also writed Kickstart files for automated installations of both operating systems.

Before concluding our PXE server configuration series, we decided to write an article to add the installation option of a Microsoft’s operating system. Therefore, we have selected the Microsoft Windows 10 (the latest OS at the time of this writeup) as the candidate for our PXE boot server.

In this article, we will add the installation option of MS Windows 10 to our PXE server.

Note: In this article, we are performing everything from CLI, therefore, it is highly recommended that, you should have Linux Pocket Guide: Essential Commands by O'Reilly Media for quick reference.

 

This Article Provides:

     

    System Specification:

    We use the same Linux server that we have configured as PXE Boot Server in our previous article. These specifications have been re-mentioned below for convenience of the readers.

    • CPU - 2 Core (2.4 Mhz)
    • Memory - 2 GB
    • Storage - 50 GB
    • Operating System - RHEL 7.5
    • Hostname - pxe-server.itlab.com
    • IP Address - 192.168.116.41/24

    Furthermore, we need a client system to create Windows PE iso file. Here, we are using a MS Windows 8.1 machine for this purpose, however, you can use other versions of MS Windows as well (be noted that configurations are slightly different in MS Windows versions prior to 8.1).

     

    Install and Configure Samba Server:

    We used Samba server to share installation media of MS Windows 10 Operating System with PXE clients.

    Connect to pxe-server.itlab.com using ssh and install Samba server.

    [root@pxe-server ~]# yum install -y samba Loaded plugins: product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. localyum | 4.3 kB 00:00 Resolving Dependencies --> Running transaction check ---> Package samba.x86_64 0:4.7.1-6.el7 will be installed --> Processing Dependency: libwbclient = 4.7.1-6.el7 for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: samba-client-libs = 4.7.1-6.el7 for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: samba-common = 4.7.1-6.el7 for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: samba-common = 4.7.1-6.el7 for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: samba-common-libs = 4.7.1-6.el7 for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: samba-common-tools = 4.7.1-6.el7 for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: samba-libs = 4.7.1-6.el7 for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libCHARSET3-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libauth-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libcli-cldap-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libcli-nbt-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libcli-smb-common-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libcliauth-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libdbwrap-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libgenrand-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libgse-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: liblibsmb-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libmessages-dgm-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libmsghdr-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libndr-nbt.so.0(NDR_NBT_0.0.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libndr-samba-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libndr-standard.so.0(NDR_STANDARD_0.0.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libndr.so.0(NDR_0.0.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libpopt-samba3-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libreplace-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-cluster-support-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-debug-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-errors.so.1(SAMBA_ERRORS_1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-hostconfig.so.0(SAMBA_HOSTCONFIG_0.0.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-passdb.so.0(SAMBA_PASSDB_0.2.0)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-security-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-sockets-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-util.so.0(SAMBA_UTIL_0.0.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba3-util-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsecrets3-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libserver-id-db-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsmb-transport-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsmbconf.so.0(SMBCONF_0)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsmbd-base-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsmbd-shim-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsocket-blocking-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsys-rw-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libtalloc.so.2(TALLOC_2.0.2)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libtdb.so.1(TDB_1.2.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libtdb.so.1(TDB_1.2.5)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libtevent-util.so.0(TEVENT_UTIL_0.0.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libtevent.so.0(TEVENT_0.9.16)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libtevent.so.0(TEVENT_0.9.9)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libutil-reg-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libutil-tdb-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libxattr-tdb-samba4.so(SAMBA_4.7.1)(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libCHARSET3-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libauth-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libcli-cldap-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libcli-nbt-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libcli-smb-common-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libcliauth-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libdbwrap-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libgenrand-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libgse-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: liblibsmb-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libmessages-dgm-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libmsghdr-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libndr-nbt.so.0()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libndr-samba-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libndr-standard.so.0()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libndr.so.0()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libpopt-samba3-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libreplace-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-cluster-support-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-debug-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-errors.so.1()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-hostconfig.so.0()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-passdb.so.0()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-security-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-sockets-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba-util.so.0()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsamba3-util-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsecrets3-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libserver-id-db-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsmb-transport-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsmbconf.so.0()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsmbd-base-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsmbd-shim-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsocket-blocking-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libsys-rw-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libtalloc.so.2()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libtdb.so.1()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libtevent-util.so.0()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libtevent.so.0()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libutil-reg-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libutil-tdb-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Processing Dependency: libxattr-tdb-samba4.so()(64bit) for package: samba-4.7.1-6.el7.x86_64 --> Running transaction check ---> Package libtalloc.x86_64 0:2.1.10-1.el7 will be installed ---> Package libtdb.x86_64 0:1.3.15-1.el7 will be installed ---> Package libtevent.x86_64 0:0.9.33-2.el7 will be installed ---> Package libwbclient.x86_64 0:4.7.1-6.el7 will be installed ---> Package samba-client-libs.x86_64 0:4.7.1-6.el7 will be installed --> Processing Dependency: libldb.so.1(LDB_0.9.10)(64bit) for package: samba-client-libs-4.7.1-6.el7.x86_64 --> Processing Dependency: libldb.so.1(LDB_0.9.15)(64bit) for package: samba-client-libs-4.7.1-6.el7.x86_64 --> Processing Dependency: libldb.so.1(LDB_0.9.23)(64bit) for package: samba-client-libs-4.7.1-6.el7.x86_64 --> Processing Dependency: libldb.so.1(LDB_1.1.1)(64bit) for package: samba-client-libs-4.7.1-6.el7.x86_64 --> Processing Dependency: libldb.so.1(LDB_1.1.19)(64bit) for package: samba-client-libs-4.7.1-6.el7.x86_64 --> Processing Dependency: libldb.so.1(LDB_1.1.30)(64bit) for package: samba-client-libs-4.7.1-6.el7.x86_64 --> Processing Dependency: libldb.so.1()(64bit) for package: samba-client-libs-4.7.1-6.el7.x86_64 ---> Package samba-common.noarch 0:4.7.1-6.el7 will be installed ---> Package samba-common-libs.x86_64 0:4.7.1-6.el7 will be installed ---> Package samba-common-tools.x86_64 0:4.7.1-6.el7 will be installed ---> Package samba-libs.x86_64 0:4.7.1-6.el7 will be installed --> Processing Dependency: libpytalloc-util.so.2(PYTALLOC_UTIL_2.0.6)(64bit) for package: samba-libs-4.7.1-6.el7.x86_64 --> Processing Dependency: libpytalloc-util.so.2(PYTALLOC_UTIL_2.1.6)(64bit) for package: samba-libs-4.7.1-6.el7.x86_64 --> Processing Dependency: libpytalloc-util.so.2(PYTALLOC_UTIL_2.1.9)(64bit) for package: samba-libs-4.7.1-6.el7.x86_64 --> Processing Dependency: libpytalloc-util.so.2()(64bit) for package: samba-libs-4.7.1-6.el7.x86_64 --> Running transaction check ---> Package libldb.x86_64 0:1.2.2-1.el7 will be installed ---> Package pytalloc.x86_64 0:2.1.10-1.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: samba x86_64 4.7.1-6.el7 localyum 661 k Installing for dependencies: libldb x86_64 1.2.2-1.el7 localyum 131 k libtalloc x86_64 2.1.10-1.el7 localyum 33 k libtdb x86_64 1.3.15-1.el7 localyum 48 k libtevent x86_64 0.9.33-2.el7 localyum 37 k libwbclient x86_64 4.7.1-6.el7 localyum 107 k pytalloc x86_64 2.1.10-1.el7 localyum 17 k samba-client-libs x86_64 4.7.1-6.el7 localyum 4.8 M samba-common noarch 4.7.1-6.el7 localyum 205 k samba-common-libs x86_64 4.7.1-6.el7 localyum 162 k samba-common-tools x86_64 4.7.1-6.el7 localyum 464 k samba-libs x86_64 4.7.1-6.el7 localyum 275 k Transaction Summary ================================================================================ Install 1 Package (+11 Dependent packages) Total download size: 6.9 M Installed size: 23 M Downloading packages: -------------------------------------------------------------------------------- Total 24 MB/s | 6.9 MB 00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : libtalloc-2.1.10-1.el7.x86_ 1/12 Installing : libtdb-1.3.15-1.el7.x86_64 2/12 Installing : libtevent-0.9.33-2.el7.x86_ 3/12 Installing : samba-common-4.7.1-6.el7.no 4/12 Installing : libldb-1.2.2-1.el7.x86_64 5/12 Installing : samba-common-libs-4.7.1-6.e 6/12 Installing : libwbclient-4.7.1-6.el7.x86 7/12 Installing : samba-client-libs-4.7.1-6.e 8/12 Installing : pytalloc-2.1.10-1.el7.x86_6 9/12 Installing : samba-libs-4.7.1-6.el7.x86_ 10/12 Installing : samba-common-tools-4.7.1-6. 11/12 Installing : samba-4.7.1-6.el7.x86_64 12/12 Verifying : libtevent-0.9.33-2.el7.x86_64 1/12 Verifying : libtdb-1.3.15-1.el7.x86_64 2/12 Verifying : samba-client-libs-4.7.1-6.el7.x86_64 3/12 Verifying : samba-common-libs-4.7.1-6.el7.x86_64 4/12 Verifying : samba-libs-4.7.1-6.el7.x86_64 5/12 Verifying : samba-common-tools-4.7.1-6.el7.x86_64 6/12 Verifying : samba-common-4.7.1-6.el7.noarch 7/12 Verifying : libtalloc-2.1.10-1.el7.x86_64 8/12 Verifying : libwbclient-4.7.1-6.el7.x86_64 9/12 Verifying : libldb-1.2.2-1.el7.x86_64 10/12 Verifying : samba-4.7.1-6.el7.x86_64 11/12 Verifying : pytalloc-2.1.10-1.el7.x86_64 12/12 Installed: samba.x86_64 0:4.7.1-6.el7 Dependency Installed: libldb.x86_64 0:1.2.2-1.el7 libtalloc.x86_64 0:2.1.10-1.el7 libtdb.x86_64 0:1.3.15-1.el7 libtevent.x86_64 0:0.9.33-2.el7 libwbclient.x86_64 0:4.7.1-6.el7 pytalloc.x86_64 0:2.1.10-1.el7 samba-client-libs.x86_64 0:4.7.1-6.el7 samba-common.noarch 0:4.7.1-6.el7 samba-common-libs.x86_64 0:4.7.1-6.el7 samba-common-tools.x86_64 0:4.7.1-6.el7 samba-libs.x86_64 0:4.7.1-6.el7 Complete!

    Create a directory to share Windows 10 installation media.

    [root@pxe-server ~]# mkdir /smbshare

    Adjust SELinux permissions.

    [root@pxe-server ~]# semanage fcontext -a '/smbshare(/.*)?' -t samba_share_t [root@pxe-server ~]# restorecon -Rv /smbshare

    Create an user to control access to Samba share.

    [root@pxe-server ~]# useradd -s /sbin/nologin ahmer [root@pxe-server ~]# smbpasswd -a ahmer

    Change owner of the shared directory with user ahmer.

    [root@pxe-server /]# chown ahmer:ahmer /smbshare/

    Allow Samba service in Linux Firewall.

    [root@pxe-server ~]# firewall-cmd --permanent --add-service=samba success [root@pxe-server ~]# firewall-cmd --reload success

    Add directives in /etc/samba/smb.conf to share the directory /smbshare with clients.

    [root@pxe-server ~]# cat >> /etc/samba/smb.conf << EOF > [install] > comment = Installation Media > path = /smbshare > public = yes > writable = no > printable = no > browseable = yes > EOF [root@pxe-server ~]#

    Start and enable Samba services.

    [root@pxe-server ~]# systemctl start smb nmb [root@pxe-server ~]# systemctl enable smb nmb

    Attach MS Windows 10 ISO/DVD and mount it at /mnt/iso (you can use any mountpoint, according to your choice).

    [root@pxe-server ~]# mount -t iso9660 /dev/cdrom /mnt/iso mount: /dev/sr0 is write-protected, mounting read-only

    Copy contents of /mnt/iso to /smbshare/windows10 directory.

    [root@pxe-server ~]# cp -rf /mnt/iso /smbshare/windows10

     

    Create a Customized Windows PE ISO:

    Connect to MS Windows 8.1 client.

    We required Windows ADK (Assessment and Deployment Kit) to create our Windows PE iso. Therefore, we have downloaded it from Microsoft's website and installed it on our Windows 8.1 client.

    After installation, run Deployment and Imaging Tools Environment as Administrator.

    Run the following command to create working directories for Win PE. (Command output has been trimmed to show only success status)

    C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Windows Pr einstallation Environment> copype x86 c:\WinPE_x86 --- 186 File(s) copied 1 file(s) copied. 1 file(s) copied. 1 file(s) copied. Success c:\WinPE_x86>

    We will customize the startup script startcmd.net, so MS Windows 10 setup will start automatically. Therefore, mount the image file and customize it accordingly.

    c:\WinPE_x86> Dism /Mount-Image /ImageFile:"c:\WinPE_x86\media\sources\boot.wim" /index:1 /MountDir:"c:\WinPE_x86\mount" Deployment Image Servicing and Management tool Version: 6.2.9200.16384 Mounting image [==========================100.0%==========================] The operation completed successfully. c:\WinPE_x86>

    Now, edit startnet.cmd.

    c:\WinPE_x86> notepad c:\WinPE_x86\mount\Windows\System32\Startnet.cmd

    And add following lines therein.

    wpeinit net use z: \\192.168.116.41\install\windows10 /user:ahmer 123 z:\setup.exe

    Save and unmount the image file.

    c:\WinPE_x86> Dism /Unmount-Image /MountDir:"c:\WinPE_x86\mount" /commit Deployment Image Servicing and Management tool Version: 6.2.9200.16384 Saving image [==========================100.0%==========================] Unmounting image [==========================100.0%==========================] The operation completed successfully. c:\WinPE_x86>

    Generate winpe.iso file.

    c:\WinPE_x86> MakeWinPEMedia /ISO c:\WinPE_x86 c:\winpe.iso Creating c:\winpe.iso... 100% complete Success c:\WinPE_x86>

    Transfer winpe.iso file to pxe-server-itlab.com and copy it to /var/lib/tftpboot/networkboot/windows10/ directory.

     

    Add MS Windows 10 installation option to PXE boot menu:

    Now, connect to pxe-server.itlab.com again using ssh.

    Copy Kernel boot image for MS Windows in tftpboot directory.

    [root@pxe-server ~]# cp /usr/lib/syslinux/memdisk /var/lib/tftpboot/

    Edit PXE boot menu for BIOS based clients.

    [root@pxe-server ~]# vi /var/lib/tftpboot/pxelinux.cfg/default

    And add following menu option at the end of file.

    label Install MS Windows 10 menu label Install MS Windows 10 kernel memdisk initrd /networkboot/windows10/winpe.iso append iso raw

    Connect a new client to your network and turn it on. It should get the IP address from DHCP server and display our PXE boot Menu as follows:

    pxe-boot-menu-01

    Select Install MS Windows 10 option and press <ENTER>.

    win-10-install-01win-10-install-02

    We have successfully added the MS Windows 10 installation option in our Linux based PXE server.

    Configure CentOS 7 PXE Server to Install Windows 10


    YOU MIGHT ALSO LIKE:

    23 comments:

    1. Great manual thank you very much !!

      ReplyDelete
    2. Hi Ahmer,
      Thanks for the document. How can I add for UEFI based clients?

      ReplyDelete
      Replies
      1. Hi, Thank you for liking this article.
        Lately, I worked on adding UEFI support to Windows 10 PXE installation, but didn't succeed. Please let me know if you have workaround this issue.

        Delete
    3. Hello, well detailed tutorial. By the way, i'm unable to make it working... :(
      My Winpe ISO file is fine, i tested it and booted on it but when using it with PXE server, nothing happens, WINPE does not launch... RHEL 7 installation is working... Any suggestion please?

      ReplyDelete
      Replies
      1. Hi Alex, I am afraid, I cannot help you with this little information. But, I am advicing you to look into /var/log/messages at CentOS server. Contact me, if you find anything notable there.

        Delete
    4. Please add steps to setup auto-answer of the Windows10 installation.

      ReplyDelete
    5. Hello Ahmer
      thanks a lot for your great job,
      i've successfully launched WINPE, but cant mount Windows image from samba share
      however i cannot ping to server from winpe.
      it seems that nic driver is missed on winpe image

      ReplyDelete
      Replies
      1. Thanks for your kind remarks.
        - If you are unable to mount Windows 10 DVD. then you can also copy the contents of DVD to disk and use it by using the same steps above.
        - If your client is obtaining an IP from DHCP then this is not an NIC issue. Otherwise, troubleshoot it.

        Delete
      2. Hi Ahmer
        I have the same issue,ping my server failed after wpeinit. However if I don't edit startnet.cmd when i create winpe.iso, I can manual mount use command "net use z: \\192.168.116.41\install\windows10 /user:ahmer 123", I also found the size of winpe.iso are different between edit startnet.cmd and not edit. Is it possible the network driver is not include when I follow the instruction to edit startnet.cmd ?

        Thanks

        Delete
      3. Hi,
        1) I wonder how do you manage to mount the share, if you are unable to ping the server. May be there is a Firewall in between that was restricting ICMP, although the connectivity is there.
        2) The size of WinPE.iso may vary based on what you have included in c:\WinPE_x86 folder before running MakeWinPEMedia command.

        Delete
    6. I've been able to get to the point where Windows10 boots up and is about to map the share, but when running setup.exe it says 'Access is denied'.

      ReplyDelete
      Replies
      1. Check user permissions and SELinux context on the directory. Try
        # ls -alZ /smbshare

        Delete
      2. You forgot to mention, that you need to copy memdisk from /usr/share/syslinux to /var/lib/tftpboot/

        Delete
      3. Thanks for the correction.
        The above post has been updated accordingly.

        Delete
    7. This blog, the related post and most others from internet search deal with setting up a PXE server and sending an OS installation image. I'm looking for something that would describe the process/steps to create the boot images that the PXE server sends to the client machine. Ideally I would have a client machine all setup and configured with my working application running linux (centOS) from a local drive. (1) Want to create a boot image of this client drive, (2) change things as required for PXE needs, (3)put image on PXE server, (4)make it boot over PXE process, (5)when local drive is removed from the client. Items (1) and (2) are steps/procedures I'm in search of. Thank you for any advice.

      ReplyDelete
      Replies
      1. Hi,
        Your requirements have been noted, We will work on it very soon.

        Delete
    8. Hi Ahmer,
      I am getting Error 50 while creating WinPE.iso.

      ReplyDelete
      Replies
      1. Please contact me on Facebook Page and share the complete error screenshot there.

        Delete
    9. Dear Mr. Ahmer. Thank you for the wonderful article regarding PXE boot. Your steps worked perfectly fine before on my test server. But now when I am trying same steps, I find that the new server does not boot on to the command line of WinPE but instead takes me to the GUI and asks me for the login. Before, it took me to the command line but now it is taking me to the GUI. This seems strange to me. Can you help me out in this regard??

      ReplyDelete
    10. Thank you!
      This article helped me very much.

      ReplyDelete