Skip to Content
Technical Articles
Author's profile photo Samuel Davies

Install ABAP Platform 1909 – Dev Edition on an Azure Ubuntu instance using docker – Part 2

Welcome to the second instalment of this tutorial series. In this part, we are going to focus on the installation and access to the ABAP platform.

I will reiterate the process blueprint to help follow the steps we need to achieve to complete this installation. Since we tackled Step 1 of the blueprint in Part 1 of this series, we will continue from step 2 in this part.


Process blueprint

  1. Create and login into an ubuntu instance on Azure.
  2. Prepare the data drive on your ubuntu instance.
  3. Install docker and move docker data directory to the prepared data drive.
  4. Install ABAP Platform 1909 Dev Edition with docker.
  5. Open the necessary ports on Azure.
  6. Access your ABAP instance in SAP GUI and generate a new license.


Step 2: Prepare the data drive on your ubuntu instance.

To render the disk we created in Part 1 usable, we will have to partition, format, and mount this disk on our virtual machine. To start this process, let us first find out which disks are available on our system and their mount points. After you have successfully created an SSH connection to the virtual machine as we did in the last step of Part 1, run the command

lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"

The output should look like the image below. The highlighted line with the 256G size is our line of interest. Take a note of the letters (sdb) as we will need it for the next few commands.


Image 1: List all drives and mount points

Now that we have found our disk of interest, it is now time to partition and format our disk.

Run the following commands and substitute the letters in the command according to what you received in your output. So if your disk had letters sdc on the line of interest, you have to place sdc in place of <letters> in the commands below

sudo parted /dev/<letters> --script mklabel gpt mkpart xfspart xfs 0% 100%
sudo mkfs.xfs /dev/<letters>1
sudo partprobe /dev/<letters>1

This is how it should look in your terminal


Image 2: Partition and format disk

Now that our disk is partitioned and formatted, let us mount the disk on our virtual machine.

To mount the disk, run the following commands.

sudo mkdir /datadrive
sudo mount /dev/<letters>1 /datadrive

The above commands should look like this in your terminal


Image 3: Create and mount datadrive directory

To make our mount permanent so that it persists after subsequent reboots, we will have to edit the fstab with the UUID of our drive. To find out the UUID, we will have to run the command:

sudo blkid

The output should look like the image below. Note down the UUID on the line that matched the letters of your drive as demonstrated.


Image 4: Note down UUID of disk

With the UUID copied, edit the line below with your UUID and keep it in a notepad to be used in the next step.

UUID=<paste_your_UUID_here>   /datadrive   xfs   defaults,nofail   1   2

And example of what should be in your notepad is

UUID=19060fbb-68f1-42b3-9849-90ba57085d89   /datadrive   xfs   defaults,nofail   1   2

Now that you have your UUID line in your notepad, let us move ahead to edit the fstab file.

Type the command below in your terminal

sudo nano /etc/fstab


Image 5: Open fstab file

In the second line of the file that opens in your terminal, paste the line in your notepad as demonstrated in the terminal below.


Image 6: Exit by CTRL+X

You can now exit by hitting the CTRL+X key combination on your keyboard. When asked to “Save the modified buffer?”, hit the ‘y’ key on your keyboard.


Image 7: Save buffer by hitting y key

Finally you can hit the ‘Enter’ key on your keyboard to save the file when you see ‘File Name to write: /etc/fstab’.


Image 8: Write fstab

We have now successfully mounted our drive to persist after reboots. Our next step is to verify if our mount was successful. To ensure this, run the command below in the terminal:

lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"

The output should look like what is shown in the image


Image 9: Check permanent mount point

Finally, let us change the ownership of the datadrive to our current user. You do this by running the command below:

sudo chown -R $USER /datadrive


Image 10: Change datadrive directory owner

Step 3: Install docker and move docker data directory to the prepared data drive.

Since we are installing docker for a test environment and will most likely not be using our system in a production setting, we will be using the official scripts to install docker. To do this, run the commands below in your terminal.

mkdir dockerinstall
cd dockerinstall
curl -fsSL -o
sudo sh

The commands above and their output should look like this.


Image 11: Docker installation

Ending with


Image 12: Ending of output for docker installation

Since we would like to use docker with our current user, let us run the usermod command below

sudo usermod -aG docker $USER


Image 13; Add your current user to the docker group

Let’s switch our attention now to changing the data directory of docker to the datadrive we created earlier. To achieve this, let us first stop the docker service by running the command below and then create a file called daemon.json in the /etc/docker directory.

sudo service docker stop
cd /etc/docker/
sudo nano daemon.json


Image 14: Open daemon.json file

When the file opens up in the nano text editor, copy and paste the following content in the file and save the file by using the key combination CTRL+X followed by the ‘y’ key and finally the ‘Enter’ key on the keyboard.

   "data-root": "/datadrive" 


Image 15: Paste content in daemon.json file

After successfully saving the daemon.json file, we now have to copy everything from the old docker data directory to our new data directory which is /datadrive. To achieve this, run the command

sudo rsync -aP /var/lib/docker/ /datadrive


Image 16: Copy files to datadrive directory

After the copy is completed, we can now safely rename the old docker data directory by running the command and then finally restart the docker service.

sudo mv /var/lib/docker /var/lib/docker.old
sudo service docker start


Image 17: Start docker service

With this step complete, we have officially installed docker and changed the default data directory to our own drive. Let us now reboot our virtual machine to ensure all the services will run completely after a reboot.

sudo reboot


Image 18: Reboot virtual machine

The connection will be closed and you will be returned to your terminal. Wait for about 30 seconds to a minute for your virtual machine to reboot and SSH into the virtual machine again as shown below.


Image 19: SSH into virtual machine again

After logging in successfully into the virtual machine, we can now try to login into docker to ensure our installation is still working correctly. To do this, use the command below and enter your dockerhub username and password when it is requested.

docker login


Image 20: Login into dockerhub

If you are presented Login Succeeded in the terminal, that’s a good sign which means you are on the final stretch to getting your ABAP Platform up and running.

Step 4: Install ABAP Platform 1909 Dev Edition with docker.

After our successful login, we are going to define some limits for our docker installation to prevent us from running into the Cannot continue because of insufficient system limits configuration! Error. To do this, copy and paste the following into your terminal. It is recommended you do this step just once to prevent duplication of the lines in the sysctl configuration file.

echo 'fs.file-max=20000000' | sudo tee -a sudo /etc/sysctl.conf
echo 'fs.aio-max-nr=18446744073709551615' | sudo tee -a sudo /etc/sysctl.conf
echo 'vm.max_map_count=2147483647' | sudo tee -a sudo /etc/sysctl.conf
sudo sysctl -p


Image 21: Configure sysctl

We are now ready to start the actual ABAP platform installation with docker. We will do that by running the command below. It is worth noting that the system expects the host name to be vhcala4hci, all other host names will prevent the system from starting. 

docker run \
      --stop-timeout 3600 \
      --sysctl kernel.shmmax=21474836480 \
      --sysctl kernel.shmmni=32768 \
      --sysctl kernel.shmall=5242880 \
      --sysctl kernel.msgmni=1024 \
      --sysctl kernel.sem="1250 256000 100 8192" \
      --ulimit nofile=1048576:1048576 \
      -i --name a4h -h vhcala4hci \
      -p 3200:3200 \
      -p 3300:3300 \
      -p 8443:8443 \
      -p 30213:30213 \
      -p 30215:30215 \
      -p 50000:50000 \
      -p 50001:50001 store/saplabs/abaptrial:1909 -agree-to-sap-license


Image 22: Run docker to install ABAP

The command above will take about an hour to complete and when it’s done, the output will look like the image below. Once the command is complete, the output will look like below.


Image 23: End of output for docker run

While we wait for the installation to see the output below, let us head on to Azure once again to open the ports necessary to access our system.


Step 5: Open the necessary ports on Azure.

Since we are now waiting for the installation to complete in the terminal, let us switch to the browser and open the azure portal to our virtual machine. Once we are on the virtual machine overview page of azure portal, click on the Networking link as highlighted below.


Image 24: Click Networking link

On the Networking detail page, click the Add inbound port rule button.


Image 25: Add inbound port rules

A side window will open up and you will have to enter the values pelow both in Destination port ranges and the Name text boxes as shown below. You have to repeat this process for all the ports listed below.

Destination port range 3200       Name: Port_3200 
Destination port range 3300       Name: Port_3300 
Destination port range 8443       Name: Port_8443 
Destination port range 30213      Name: Port_30213
Destination port range 30215      Name: Port_30215 
Destination port range 50000      Name: Port_50000 
Destination port range 50001      Name: Port_50001


Image 26: Fill in details for port rules


After the process is done for all the ports listed above the final output should look like


Image 27: All inbound ports added

It cannot be stressed enough that for a production system, the Source of the requests should be limited to prevent unwanted accesses to the system but for our test system. It is fine to play ‘fast and loose’ with it in the spirit of experimentation. 

Now that we have successfully opened up our ports, let us head back to the terminal to check up on the progress of the installation.


Step 6: Generate a new license for your installation.

If you can see Have fun! In the terminal as shown above at the end of Step 4, and you have your ports open as shown in step 5, let us now try to create a connection to our ABAP instance. To achieve this, open SAP GUI and click the Create button as highlighted below.


Image 28: Click on create connection

After clicking the create button, give the description a4h, choose the Advanced tab and select the Expert Settings checkbox. You can then fill in the connection parameters textarea. The format is


The IP address to be used here is the same IP address you use to SSH into your virtual machine and this can also be found as the Public IP address in Azure. Finally you can click Save after filling in the connection parameters.


Image 29: Add connection parameters

The connection you created should now be visible in your connections page in SAP GUI. Double click the a4h to open the logon screen for the connection.


Image 30: Double click a4h

When the connection opens up in SAP GUI, try to logon with the  developer account. The username for the developer account is DEVELOPER  and the password is Ldtf5432 you can leave the Client as is: 001. If you try to logon with these credentials you will see an error in the status bar “Logon not possible (error in license check)”. This is no cause for alarm as we will go through the steps to generate and install a license.


Image 31: License check error

We can still logon to our installation with the SAP* user. To do this use the credentials: username SAP* and password Ldtf5432 as shown below.


Image 32: Login with SAP*

Once you are logged in successfully, enter the transaction slicense as shown in the image below and execute.


Image 33: Enter slicense transaction.

You will see two expired licenses and an Active Hardware Key which is very important for generating our license keys. So go ahead and write down the hardware key in any notepad application available.


Image 34: Copy hardware key

To generate a new license for your installation let us head on over to the minisap license website. Select the license in the Available SAP Systems that matches our installation which is A4H – SAP NetWeaver AS ABAP 7.4 and above (Linux / SAP HANA) in our case.


Image 35: Choose a4h SAP system

Scroll down to the bottom of the page and you will see a section asking for your personal information and hardware key. Fill in the personal information and supply the hardware key we copied earlier. Agree to the license agreement and then click the Generate button.


Image 36: Agree to and generate license

A license text file will automatically be downloaded to your downloads folder. Open your downloads folder and find the download text file most likely named A4H_Multiple.txt. Once you find the file, open the folder side by side to the SAP GUI as we will be dragging and dropping the license file. After opening the folder containing the license file side by side, click the Install License button in SAP GUI, denoted by 1in the image below. When the dialog File dialog opens up, drag the license file from the and drop it in the file dialog, denoted by 2 in the image below. Finally click the Open button to install the license.


Image 37: Drag and drop license file

If everything went smoothly, you should receive a prompt that says “2 SAP license key(s) successfully installed.”


Image 38: License installed

We now have a valid license and can try logging in with the DEVELOPER account again. To do this, we must first log of from the SAP* user. To log off, select System in SAP GUI and choose Log Off in the drop down menu as shown in the image below and choose Yes when asked to confirm.


Image 39: Log off system

Finally login in with the developer credentials provided earlier, username: DEVELOPER, password: Ldtf5432  as shown below.


Image 40: Login with developer account

You should now have access to your ABAP Platform 1909 Developer Edition and a long journey of experimentation ahead of you.


Image 41: Successful login into ABAP Platform 1909 Dev Edition

This brings us to the end of the tutorial series. I had a great time putting this post together and hope to help a reader get up and running in ABAP in little or no time. To find more information regarding logging into SAP HANA Studio or using the SAP Cloud Connector your ABAP instance please visit the dockerhub page and search for the specific term. 

If you run into any issues while following this blog or have any edits or additions please drop a message in the comment section and I will get back to you.

Hope you had a great time following this post.

Happy Coding!!!

Assigned Tags

      You must be Logged on to comment or reply to a post.
      Author's profile photo Marc Bernard
      Marc Bernard

      Thank you, Samuel, for this exceptional blog! #Excellent

      I was able to follow it all and get it up an running on my Azure environment.

      A couple corrections:

      • Port 30215 must be open as well to connect with HANA studio
      • It should say "client 001" instead of "instance number 001"


      It looks like 256 GB disk is much more than required. Only 38% used within docker. Any particular reason why you made it so big?


      Using Azure makes the environment much more open to threats. Anyone who knows the IP address, will be able to logon to the system since everything else is known. I strongly recommend making changes like

      • Limiting ports to certain IP addresses (instead of "any")
      • Changing passwords of DEVELOPER, SAP*, and DDIC users in ABAP or disabling those and using your own ID
      • Similarly, changing passwords for SYSTEM and SAPA4H users in HANA

      These security topics should definitely be mentioned on the dockerhub as well (cc Julie Plummer)

      Author's profile photo Samuel Davies
      Samuel Davies
      Blog Post Author

      Hi Marc Bernard thank you very much for your input. I will make the necessary changes you suggested.

      With regards to the storage, I believe 64GB would have been a squeeze but 128GB should be perfectly fine.

      You're absolutely right, to make the blog very beginner friendly, I took a very relaxed approach with regards to the security in this blog post and only briefly mentioned restricting the IP Addresses in a production Azure environment.

      I am putting together a follow up blogpost to discuss the security measures to be implemented if the user is planning on using the system on a long term basis.

      Your input is very much appreciated.

      Author's profile photo Julie Plummer
      Julie Plummer

      Hi Samuel,

      Thanks a lot for this.

      I will try to incorporate it into a forthcoming Tips and Troubleshooting Guide.

      BR Julie.