Let's say you've just downloaded your free copy of Red Hat Enterprise Linux (RHEL) 8 and created a virtual machine (VM) using Microsoft's Hyper-V virtual environment in Windows. So far, so good. But now you find yourself presented with an old-school 1024x768 screen resolution.
I don't know about you, but I prefer to run my VM in full-screen mode. When I'm using multiple monitors, it's a great convenience (and a powerful feeling) to have one screen running Windows 10 and the other running RHEL.
If you click the right mouse button on the RHEL desktop and look at available screen resolutions, only the default will appear, as shown in Figure 1.
Hunting around in my Hyper-V settings didn't turn up any options, so I thought I might be stuck with a tiny portal into my powerful VM. But then I found a way to change the default.
How to change the default screen resolution
Fortunately, there's a simple command in your RHEL VM to improve the screen resolution. In my case, I wanted to run full-screen at a 1920x1080 resolution. The following example shows how to enter a
grubby command as superuser (root), after which you should reboot:
$ su # grubby --update-kernel=ALL --args="video=hyperv_fb:1920x1080" # reboot
hyperv_fb stands for frame buffer, the memory used by the virtual screen driver.
When the machine rebooted, there was my 1920x1080 resolution, in all its screen-hogging glory, as shown in Figure 2.
Did we just hack the kernel?
No, not exactly.
When RHEL boots, it uses a boot loader called grub2. Grub2 reads information from a configuration file, which in turn refers to a key environment variable. The configuration file is located in the
/boot/loader/entries/ directory. Here's that directory on my Red Hat Enterprise Linux 8 VM:
$ sudo ls /boot/loader/entries/ a7eef0f4eafb43ae806ac4597d9c4ad8-0-rescue.conf a7eef0f4eafb43ae806ac4597d9c4ad8-4.18.0-305.el8.x86_64.conf
As the listing shows, there are two entries. One is the rescue mode, while the other is the kernel boot option I normally choose. Here are the contents of that file:
sudo cat /boot/loader/entries/a7eef0f4eafb43ae806ac4597d9c4ad8-4.18.0-305.el8.x86_64.conf title Red Hat Enterprise Linux (4.18.0-305.el8.x86_64) 8.4 (Ootpa) version 4.18.0-305.el8.x86_64 linux /vmlinuz-4.18.0-305.el8.x86_64 initrd /initramfs-4.18.0-305.el8.x86_64.img $tuned_initrd options $kernelopts $tuned_params id rhel-20210429130346-4.18.0-305.el8.x86_64 grub_users $grub_users grub_arg --unrestricted grub_class kernel
Notice the reference to
$kernelopts. This is an environment variable that refers to yet another file,
/boot/grub2/grubenv. The contents of that file follow:
sudo cat /boot/grub2/grubenv # GRUB Environment Block saved_entry=a7eef0f4eafb43ae806ac4597d9c4ad8-4.18.0-305.el8.x86_64 kernelopts=root=/dev/mapper/rhel-root ... video=hyperv_fb:1920x1080 boot_success=1 boot_indeterminate=0
This is the file that was modified when we ran the
grubby command. Notice the end of the line that starts with
kernelopts. There's our
hyperv_fb value. (I removed some of that line from the example in order to show the trailing entry.)
And voilà, we have our screen resolution set to 1920x1080.
Food for thought: Can you use a different setting?
It's often said that, in Unix and Linux, "everything is a file." The procedure in this article only helps to underscore that claim. In this case, one file tweak can change your environment from bothersome to awesome.