Install CentOS Stream 10 booting Remote Desktop (RDP) installer with kexec

Author:

Needing to install a server using the Remote management consoles like IPMI KVM or iLO, or DRAC, someone should consider a different option – installing it using remote desktop installation wizard. The new method of installing CentOS Stream 10 is by using the Remote Desktop protocol to make an attended installation. It’s worth noting that the old remote attended installation used VNC protocol, but from CentOS Stream 10 it is removed (the Anaconda’s boot options, too) and there are new options for initiating RDP installation. Check out the old VNC installation – Install CentOS Stream 9 booting VNC installer with kexec.

main menu
booting

Consider a server (dedicated or not) should be installed in a remote colocation with the help of only the server’s network. The system administrator just receives an administrative shell access and nothing more and the server should be installed with the proper and secured software, in this case, the CentOS Stream 10. Using kexec the user can boot a new kernel from a different Linux Distribution and initiate automated network installation of the system and it is not needed any Remote management consoles. The only thing needed is the ability of the current system/kernel to be able to use kexec, which is pretty standard for 8 to 10 years old Linux systems. There is a good chance the colocations’ rescue CD/DVD/USB flash drives or the PXE rescue images support kexec, because they tend to upgrade their rescue systems, which the user may boot if he has problems.
Still, using kexec to initiate another kernel or Linux Distribution like CentOS Stream 10 with RDP installer, for example, it a powerful tool to safely replace a currently running system with only shell access.
This article has chosen to start the CentOS Stream 10 RDP installer just for demonstration purposes. Booting a downloaded kernel may be used for just anything from booting a system over the network, booting an installer, booting an unattended automation installation, and so on. There are a couple of simple things to check before booting the new kernel.
This article will show just one use case – reinstalling a system with CentOS Stream 10 over the network using the CentOS RDP Install. The purpose is to show how simple, fast, and easy is to install a modern Linux system only by having console access. No scripts are required if manual installation is performed.
To boot a CentOS Stream 10 RDP Installer the kexec command needs the following options.

The kexec commands need the following options:

  • Networkingdevice interface name, IP, netmask, gateway and DNS servers
  • Kernel options – these options will initiate scripts from the initramfs.
  • inst.rdp – a kernel option, which will start a RDP server. If there are no user or password options added, the server will not be started till the admin/user enters a username and a password, when the boot CD reaches this installation point and ask for them. If username and password are supplied by inst.rdp.username=[USERNAME] inst.rdp.password=[PASSWORD] the RDP server will be started automatically with this credentials for login. It’s worth noting, the inst.rdp.username is written in the documentations like “inst.rdp.user“, but with the current release of CentOS Stream 10, 1 Jun 2025, the right option is “inst.rdp.username” despite the documentation stating other.
  • inst.repo=[HTTP/HTTPS://repository] – a kernel option, which sets the CentOS HTTP/HTTPS repository.

Check out for more boot parameters in RHEL 10 documentations.
The kexec command to boot the CentOS Stream 9 VNC Installer is:

kexec --initrd=./initrd.img -l ./vmlinuz --command-line="bootdev=eno1 ip=10.10.10.20::10.10.10.1:24:srv.example.com:eno1:none nameserver=8.8.8.8 inst.rdp inst.rdp.username=instuser inst.rdp.password=cha3hae4 inst.repo=https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/os/"

The kernel (i.e. vmlinuz) and the initramfs (i.e. initrd.img) should be downloaded in the current directory before executing the above command. The above line will order the kernel to load the new kernel, but to boot it another command must be executed:

kexec -e

Read below to see from where to download the CentOS Stream 10 kernel and the initramfs files.

Here is how to prepare and use the kexec command to boot another kernel from a (rescue) boot system.

STEP 2) Check the current network configuration.

Using iproute tool to find out the network configuration and the udevadm to ensure the real network device name.

[root@srv1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
    link/ether 0c:c4:7a:87:d5:d2 brd ff:ff:ff:ff:ff:ff
3: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 0c:c4:7a:87:d5:d1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.67.171/24 brd 192.168.67.255 scope global eno1
       valid_lft forever preferred_lft forever
    inet6 fe80::86a6:a0c2:7e07:eaf8/64 scope link 
       valid_lft forever preferred_lft forever
[root@srv1 ~]# ip ro
default via 192.168.67.1 dev eno1 proto static metric 100 
169.254.0.0/16 dev eno2 scope link metric 1002 
192.168.67.0/24 dev eno1 proto kernel scope link src 192.168.67.171 metric 100 
[root@srv1 ~]# udevadm test-builtin net_id /sys/class/net/eno1
calling: test-builtin
=== trie on-disk ===
tool version:          219
file size:         7477022 bytes
header size             80 bytes
strings            1947422 bytes
nodes              5529520 bytes
Load module index
Created link configuration context.
ID_NET_NAME_MAC=enx0cc47a87d5d0
ID_OUI_FROM_DATABASE=Super Micro Computer, Inc.
ID_NET_NAME_ONBOARD=eno1
ID_NET_NAME_PATH=enp0s31f6
Unload module index
Unloaded link configuration context.

STEP 2) Install KEXEC if unavailable.

Install the kexec-tools if they are not available. The name kexec-tools is universal for Ubuntu and CentOS world, so it might be the same for the rest Linux Distros.

[root@srv1 ~]# yum install -y kexec-tools
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * epel: d2lzkl7pfhq30w.cloudfront.net
Resolving Dependencies
--> Running transaction check
---> Package kexec-tools.x86_64 0:2.0.15-51.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===============================================================================================
 Package                 Arch               Version                     Repository        Size
===============================================================================================
Installing:
 kexec-tools             x86_64             2.0.15-51.el7               base             350 k

Transaction Summary
===============================================================================================
Install  1 Package

Total download size: 350 k
Installed size: 765 k
Downloading packages:
kexec-tools-2.0.15-51.el7.x86_64.rpm                                    | 350 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : kexec-tools-2.0.15-51.el7.x86_64                                            1/1 
  Verifying  : kexec-tools-2.0.15-51.el7.x86_64                                            1/1 

Installed:
  kexec-tools.x86_64 0:2.0.15-51.el7                                                           

Complete!

STEP 3) Use the KEXEC to boot the CentOS Stream 10 RDP Installer.

First, download the kernel and initramfs. They are part of the installation disk and of the repository. The kernel is https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/os/images/pxeboot/vmlinuz and the initramfs is https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/os/images/pxeboot/initrd.img.

[root@srv1 ~]# wget https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/os/images/pxeboot/vmlinuz
--2025-06-30 08:24:21--  https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/os/images/pxeboot/vmlinuz
Resolving mirror.stream.centos.org (mirror.stream.centos.org)... 18.165.72.91, 18.165.72.119, 18.165.72.99, ...
Connecting to mirror.stream.centos.org (mirror.stream.centos.org)|18.165.72.91|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 15919144 (15M)
Saving to: ‘vmlinuz’

100%[=====================================================>] 15,919,144  10.8MB/s   in 1.4s   

2025-06-30 08:24:22 (10.8 MB/s) - ‘vmlinuz’ saved [15919144/15919144
[root@srv1 ~]# wget https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/os/images/pxeboot/initrd.img
--2025-06-30 08:24:09--  https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/os/images/pxeboot/initrd.img
Resolving mirror.stream.centos.org (mirror.stream.centos.org)... 18.165.72.119, 18.165.72.99, 18.165.72.91, ...
Connecting to mirror.stream.centos.org (mirror.stream.centos.org)|18.165.72.119|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 153038968 (146M) [application/octet-stream]
Saving to: ‘initrd.img’

100%[=====================================================>] 153,038,968 29.3MB/s   in 5.8s   

2025-06-30 08:24:15 (25.1 MB/s) - ‘initrd.img’ saved [153038968/153038968]

Then use the networking information and replace it with the user’s current one and boot up the new kernel:

[root@srv1 ~]# kexec --initrd=./initrd.img -l ./vmlinuz --command-line="bootdev=eno1 ip=192.168.67.171::192.168.67.1:24:srv.example.com:eno1:none nameserver=8.8.8.8 inst.rdp inst.rdp.username=instuser inst.rdp.password=cha3hae4 inst.repo=https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/os/"
[root@srv1 ~]# kexec -e
Read from remote host srv1.example.com: Connection reset by peer
Connection to srv1.example.com closed.
client_loop: send disconnect: Broken pipe
myuser@mydesktop ~ $ 

The ssh session breaks after a couple of seconds, right after the new kernel boots and the network is initialized. There is ping to the 192.168.67.171.

Using the VNC viewer of the user’s choice will show the first step of the CentOS Stream 10 network installer. Use KDE‘s remote desktop viewer KRDC or some other RDP viewer to access the installation process on port 3389 (the default RDP port).

SCREENSHOT 1) The CentOS Stream 10 kernel is booting and the installation wizard is loading.

IPMI KVM is used to monitor the process only for demonstration reason, no need to interact with the installation wizard.

main menu
booting pxeboot vmlinuz

SCREENSHOT 2) The CentOS Stream 10 kernel is booting and the installation wizard is loading.

main menu
systemd loading

SCREENSHOT 3) The CentOS Stream 10 kernel is booting and the installation wizard is loading.

main menu
systemd loading 2

SCREENSHOT 4) The installation scripts successfully strated the RDP server.

main menu
remote desktop loaded

SCREENSHOT 5) KRDC view connecting the CentOS Stream 10 instllation RDP server.

Self-signed certificate is used.

main menu
KRDC verify certificate

SCREENSHOT 6) Credentials to login to the CentOS Stream 10 instllation RDP server.

main menu
KRDC username and password login

SCREENSHOT 7) Welcome CentOS Stream 10 installation screen.

main menu
welcome installation screen

SCREENSHOT 8) After configuring the installation, click on Begin Installation to install the CentOS Stream 10.

main menu
Begin installation

Leave a Reply

Your email address will not be published. Required fields are marked *