miercuri, 9 martie 2016

GUI vs. console - MinShell

When it comes to arguments between linux and windows followers, one of the main items brought to the table mostly by linux fans is the professional look of the linux console, operated by command line, opposed by rich graphics of the windows interface. Of course we are talking here about server flavors and not desktop ones.

The linux console offers a powerful set of commands that (assuming one knows the syntax and area of coverage for most of the common commands very well) will let you do almost anything you want, keep a strict control of what is running and what it does and will keep same strict control over resources like CPU load and memory used, but operating it requires more knowledge and skills.

On the opposite side, a typical Windows Server deployment will offer you a lot of features brought by the Graphic User Interface (GUI), a desktop experience that allows you to easy configure roles and services, even for less seasoned professionals. The easy part is balanced in this case by fewer options and more resource consumption. Basically you instruct the server to play some roles that you want it to but you have no strict control since some so called "next-next-finish" wizards make some decisions on your behalf. And all of this at a higher resource consumption. As a footnote, since I am also using linux on daily basis be sure I will not praise Windows for what it's not worth.

Of course most of the people interested in this matter have heard about the "core" option when installing a Windows Server. But, be serious, how many of you tried to operate a core version of Windows for production purpose ? For a core Windows Server to operate effectively you will need to be a real wizard to replace all the background operations behind the so called "next-next-finish" procedure. Be sure it can be done by using PowerShell but I have seen or known of far more share of linux gurus that PowerShell wizards. The PowerShell part will be covered in another series of posts so, if interested, stay around.

Now what do you think about a flavor of Windows that will be easier to operate than the core version,  but is very close to it, also retaining a minimal graphic interface but have nothing to do with the desktop experience we were used to ? This is called MinShell and I think it's the best compromise between a bare console with absolute control via command line and a full GUI.

What the MinShell brings:
  • fewer resources consumption (no real graphic load)
  • smaller attack surface (fewer running services)
  • smaller patch footprint (no need for extra updates)
  • Server Manager (a minimum graphic shell needed to accomplish any management tasks you need)

Now that we established the reasons why one would decide to favor MinShell over full GUI or console it is time to detail how exactly can we switch between GUI, Core and MinShell states of the operating system.

1. GUI to Core

Most of the times, when we prepare a server for holding certain roles in a production environment we can do all the setup and testing phase easier if we do it using the GUI state of the operating system. After we have it done, stable and no other changes needed, it is time to bring the system to a lower state. If further server management or re-configuration operations will be sparse then Core state will be the best choice.


01_FULL_GUI_START
FULL GUI State
16_CORE_BLACK_CMD
CORE State
 

  • The easy way to do it is using the graphic interface that is still available, by removing the graphic feats using the "Remove Roles and Features Wizard". Be aware that the reverse operation will not be that easy since you are about to remove exactly the feats that are permitting you to work in graphic mode.
So we follow the next steps:
03_FULL_REMOVE_ROLES
Open "Remove Roles and Features" from the Server Manager Dashboard
04_FULL_REMOVE_GRAPHIC_FEATS
Select the graphical features intended for removal...
05_FULL_REMOVE_GRAPHIC_FEATS_DEPENDS
... followed by some other dependant features as you can see above.
05_FULL_RESTART_FEATS
The rest is linear "next-next-finish", followed by a mandatory restart needed to update the operating system with roles and/or features you added or, in this case, removed.


  • The hard way: PowerShell method follows the same principle, identifying the GUI related features and then removing them. In order to do that you need to run powershell.exe, it will open a blue command-line console where we will issue plain text commands.

Discovering the GUI related features is done by using the command bellow:
      Get-WindowsFeature *GUI*

And the result is:
06_FULL_POWERSHELL_GRAPHIC_FEATS
Listing GUI related features
Removing those features is done by running the following commands, one at a time if you want to record and experience what happens at every step:
      Get-WindowsFeature Server-Gui-Mgmt-Infra | Remove-WindowsFeature
      Get-WindowsFeature Server-Gui-Shell | Remove-WindowsFeature
with the shorter alternative:
      Remove-WindowsFeature Server-Gui-Mgmt-Infra
      Remove-WindowsFeature Server-Gui-Shell
or even assembled in one line:
      Remove-WindowsFeature Server-Gui-Mgmt-Infra, Server-Gui-Shell
After you issue one command you will have to wait and actually see the progress:
08_FULL_POWERSHELL_REMOVE_GUI_PROGRESS
Removing feature - progress bar
And then a restart is required.
As a note, you can force a restart after the command completion by placing "- restart" at the end of the previous command line.
09_FULL_POWERSHELL_REMOVE_FINISHED_ASK_RESTART
Restarting computer as required
No matter what way you will choose, all you have on your console monitor after restart will be the pitch black screen of the Core State and a command prompt. Of course, any roles or features configured prior to Core State will still be available and working as good as they were configured to do.

2.  Core State to GUI

Once you are in Core state there is no graphic interface so we must appeal to PowerShell again. We can bring the PowerShell console up by pressing , opening "Task Manager" And then "Run new task" from the File menu, as you can see in the picture below...
17_CORE_TASKMAN_RUN

...and then call in the executable "powershell.exe".
17_CORE_TASKMAN_RUN_POWERSHELL

Once the console is open we can follow the same steps as we did before, so we identify the GUI related features but we re-add instead of removing them.

In order to do that we use the following commands:
      Get-WindowsFeature *GUI*
      Add-WindowsFeature Server-Gui-Mgmt-Infra, Server-Gui-Shell
      Restart-Computer

And have the following result:
19_CORE_ADD_FEATS_RESTART

After restart we are back to full functional GUI.


3. MinShell

As you can already guess, achieving MinShell state is possible:
  • from Full GUI by removing Server-Gui-Shell Feature but keeping Server-Gui-Mgmt-Infra
  • from Core state by adding only the Server-Gui-Mgmt-Infra and leaving Server-Gui-Shell out

>>  Still working on it. Next we will explore the looks, the benefits and setbacks of MinShell. <<