SWAP space in Linux VM’s on Windows Azure – Part 2
In a previous post, I discussed how by default the Linux VM’s provisioned in Azure IaaS from the gallery images do not have swap space configured. The post then provided a simple set of steps with which one could configure a file based swap space on the resource disk (/mnt/resource). The key point to note, however, is that the steps described there are for a VM that has already been provisioned and is running. Ideally, one would want to have the swap space configured automatically right at the time of the VM provisioning itself, rather than having to wait for a later time and then running a bunch of commands manually.
The trick to automating the swap space configuration at the time of VM provisioning is to use the Windows Azure Linux Agent (waagent). Most people are somewhat vaguely aware that there is an agent running in the Linux VM, but most people also find it a bit too obscure and ignore it, even though the Azure portal actually has a nice documentation on waagent, here. There is one other point that needs to be mentioned before drilling down into the details of waagent and how it may be used for the task at hand. That point is that this approach works well if you have a customized Linux VM of your own and are exporting it as a reusable image for provisioning of Linux VM’s in future. There is no way of tapping into the capabilities of the waagent when using a raw base image of Linux from the Azure gallery. This is not really a limitation since the use case scenario that I find most useful is one where I start out with a VM that is provisioned using a gallery image, and is then customized for things I like to have; for example, I like to have Standard Java instead of the open-jdk Java; or I may want to install Hadoop binaries on the VM so that the image can then be used later on toward a multi-node cluster. In such a scenario, it is just as easy to configure the waagent to do a few of the additional things that I want done automatically through the provisioning process.
As discussed in the Windows Azure Linux Agent user’s guide, the agent can be configured to do many things, among which are:
- Resource disk management
- Formatting and mounting the resource disk
- Configuring swap space
The waagent is already installed in the VM provisioned from a gallery image and one needs to simply edit its configuration file located at “/etc/waagent.conf” where the configuration looks like the following:
Change the two lines shown above in the configuration file to enable swap, by setting as follows:
- Set ResourceDisk.EnableSwap=y
- Set ResourceDisk.SwapSizeMB=5120
The overall process, therefore, is the following:
- Provision a Linux VM in IaaS as usual using one of the images in the gallery.
- Customize the VM to your liking by installing or removing software components that you need.
- Edit the “/etc/waagent.conf” file to set the swap related lines, as shown above. Adjust the size of the swap file (the above is setting it to 5 GB).
- Capture a reusable image of the VM using instructions described here.
- Provision new Linux VM’s using the image just exported. These VM’s will have the swap space automatically enabled.
While we are on the subject of Windows Azure Linux Agent, it turns out that it provides yet another interesting capability – that of executing an arbitrary, user-specified script through the Role.StateConsumer property in the same configuration file “/etc/waagent.conf”. For example, one can create a shell script “do-cfg.sh” as follows:
#!/bin/bash if [ "$1" = "Ready" ] ; then echo -n "Executing at Ready signal" >> /mnt/resource/pr.log # do some initialization work at Ready else echo -n "Executing at Shutdown signal" >> /mnt/resource/pr.log # do some cleanup work before shutdown fi
|
Then, in the configuration file set Role.StateConsumer=/home/scripts/do-cfg.sh or whatever is the path to your script. The waagent execute the script just before sending a “Ready” signal to Azure fabric when provisioning a VM. It passes a command-line argument “Ready” to the custom script which can be tested within the script, as shown above to do some custom initialization. Likewise, the waagent executes the same script at the time of VM shutdown and passes a command-line argument “Shutdown” to the script which can be tested for and some custom cleanup task can be run in the VM.
Comments
Anonymous
September 15, 2014
Hi, I enabled swap using this method, and I see it worked. But just recently I noticed that the server don't have swap enabled at all. It worked before even after I restarted the server, but just noticed today that my server just lost the swap it has before. Anyone experienced the same issue?Anonymous
April 20, 2015
On a recently created image I see this is not working. I have a new VM created from a captured VM with the changes to the waagent.conf file. The configuration is correct in the image, but no swap is enabled. Any ideas?Anonymous
August 16, 2015
If I do this the way described here on the existing Azure CentOS Server, and restart the server I see that on the drive /mnt/resource is a new file called swapfile. How do I know that the file is working as a swap? When I do command from previous post "cat /proc/swaps" it displays nothing. Thank you.