How to install Arch Linux on a VM VirtualBox (II)
In the last entry we began to see howto install Arch Linux on a VM VirtualBox. We created and setup the virtual machine and installed the Arch Linux. Now we are going to see how to setup Arch Linux for running smoothly on the virtual machine.
So we logon as root and continue our work. The first thing to do is to be sure that you can use the keyboard. If your keyboard layout is English you have to do nothing but if it is not then you need to setup the proper keyboard layout. In my case (Spanish layout) I have to run the command:
# localectl set-keymap --no-convert es
which set the value of the KEYMAP
variable in the /etc/vconsole.conf
file:
KEYMAP=es
This configuration is persistent and also applies to the current session. You can find more information about how to configurate the keyboard in console here.
Next thing is to automatically connect to the Internet when the system boots. We can achieve this goal if we start the DHCP as a service:
# systemctl enable dhcpcd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpcd.service to /usr/lib/systemd/system/dhcpcd.service
# reboot
We logon again and check the network connection using the ping
command:
# ping -c 3 www..google.com
PING www.l.google.com (74.125.224.146) 56(84) bytes of data.
64 bytes from 74.125.224.146: icmp_req=1 ttl=50 time=437 ms
64 bytes from 74.125.224.146: icmp_req=2 ttl=50 time=385 ms
64 bytes from 74.125.224.146: icmp_req=3 ttl=50 time=298 ms
--- www.l.google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 298.107/373.642/437.202/57.415 ms
Now let’s pay attention to the time synchronization. It is an important topic on a virtual machine because the CPU is shared among several systems. For instance you can see time delays on your virtual machine if the host system goes to sleep. There are several options for getting the time synchronized. The following works fine for me:
# pacman -S ntp
# systemctl enable ntpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service
i.e. I install the ntp
package (which contains an NTP server and client) and start it as a service every time the system boots but I don’t setup my system as an NTP server. This setup causes the hardware clock to be re-synchronised every 11 minutes. In theory there are simpler ways to achieve the synchronization goal (like using SNTP) but I’ve not been able to do they work properly. You can get more information about this topic here and here.
After checking that time synchronization works fine we can go to the next task: adding a new user. It is a typical task when administering a Lynux system and can be done easily:
# useradd -m -s /bin/bash vicent
# passwd vicent
Introduzca la nueva contraseña de Unix:
Vuelva a escribir la nueva contraseña de Unix:
passwd: contraseña actualizada correctamente
The above commands create a user called vicent
, create its home directory in /home/vicent
, give it a bash shell and set his password.
Next we’ll add the new user to the sudoers
file. This way vicent
will be able to execute a command with root
privileges temporarily granted to that single command. How privileges are scaled depends on how the sudoers
file is changed. In order to get both the sudo
command and the sudoers
file we install the sudo package:
# pacman -S sudo
Instead of editing the sudoers
file directly we create files under the /etc/sudoers.d
directory. These files will be automatically included in the sudoers
file every time the sudo
command is issued. This way we keep the sudoers
file clean and easy to read. The sudoers
file and the files under /etc/sudoers.d
are edited with the visudo
command which edit the files in a safe fashion (see the man
page of the visudo
command for details):
# visudo -f /etc/sudoers.d/90-vicent
We add the following line to the file:
vicent ALL=(ALL) ALL
It means that, on all hosts where this sudoers
file has been distributed, vicent
can execute any command with root
privileges (after being prompted with vicent
‘s password).
Now it’s time to install the graphical components. We begin installin the X Window System as follows:
# pacman -S xorg-server xorg-server-utils xorg-apps xorg-twm xorg-xinit xterm xorg-xclock ttf-dejavu --noconfirm
The above command will install the main components of the X, including the twm
window manager. The X configuration files are:
- /usr/share/X11/xorg.conf.d
- /etc/X11/xorg.conf.d
None of those files contains the keyboard configuration so in order to keep my non-English layout when the X is running I execute the command:
# localectl --no-convert set-x11-keymap es
which creates the file /etc/X11/xorg.conf.d/00-keyboard.conf
.
Now, before starting the X, we install the VirtualBox Guest Additions package and configure it:
# pacman -S virtualbox-guest-utils --noconfirm
we load the following modules:
# modprobe -a vboxguest vboxsf vboxvideo
and create the virtualbox.conf
configuration file with the following content:
# echo vboxguest >> /etc/modules-load.d/virtualbox.conf
# echo vboxsf >> /etc/modules-load.d/virtualbox.conf
# echo vboxvideo >> /etc/modules-load.d/virtualbox.conf
Now we ensure that the user created before will be able to access with read-write permissions to the shared folder (we created the shared folder in the first part of this tutorial):
# usermod -a -G vboxsf vicent
# chown root.vboxsf /media
# chmod 770 /media
Finally we enable the guest additions service so they will be started et every system boot:
# systemctl enable vboxservice.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vboxservice.service to /usr/lib/systemd/system/vboxservice.service
Now we’are ready to come back to the X Window System. Before to start it we have to create the /root/.xinitrc
file (indeed we need that file in the $HOME of every user starting the X) with the following contents:
# Make sure the root user uses the right keyboard map
setxkbmap -model pc104 -layout es
# Start the VirtualBox Guest Additions
/usr/bin/VBoxClient-all
# Start the window manager
exec twm
Then we issue the startx
command wich in turns sources the .xinitrc
file so the result is a screen like this:
Reboot the system and logon again in a virtual console. We have reached the last step of the process i.e. the installation of a desktop environment. As I adhere to the ‘keep it simple’ philosophy of Arch Linux my choice was the LXDE. In order to install it we have to issue the following commands:
# pacman -S lxde
# systemctl enable lxdm.service
Created symlink from /etc/systemd/system/display-manager.service to /usr/lib/systemd/system/lxdm.service
# vi /etc/lxdm/lxdm.conf
uncomment the line
session=/usr/bin/startlxde
It is important to note that the startx
command is not called and so the .xinitrc
file is not sourced: the display manager (which is started as a service every time the system boots) calls directly to the startlxde
command which is in charge of starting the LXDE desktop environment.
To make sure that the non-English keyboard map will persist between LXDE sessions we edit the file /etc/xdg/lxsession/LXDE/autostart
and append the line:
setxkbmap -model pc104 -layout es
Now reboot, logon and you will get a nice LXDE screen. In my case, after some tweaking it looks like this:
Great article – thanks. I setup Arch using these directions. A couple things didn’t work like the mkfs -F32 step but you can get around those.
How did you get around it? I needed to make the partition /dev/sda1 significantly larger and choose 512Mbyte.
That is really helpful. I struggled a day to setup xorg in Slackware and eventually gave up. Then half day in arch linux and finally spent two minutes only to make it run after I did follow instructions here what to put into .xinitrc.