[TOC]
Notes from installing ArchLinux on VirtualBox to use as a development machine at work.
Installation
------------
```bash
parted /dev/sda
# Make a GPT partition table
mklabel msdos
# Create 2GiB swap
mkpart primary linux-swap 1MiB 2GiB
# Use the rest for root
mkpart primary ext4 2GiB 100%
# Make root bootable
set 2 boot on
# Ctrl+D to quit
# Create swap
mkswap /dev/sda1
swapon /dev/sda1
# Create filesystem
mkfs.ext4 /dev/sda2
# Mount
mount /dev/sda2 /mnt
# Boostrap
pacstrap -i /mnt base base-devel
# Generate fstab
genfstab -U /mnt > /mnt/etc/fstab
# Switch to the new filesystem!
arch-chroot /mnt /bin/bash
```
Then do everything else [the wiki asks you to do](https://wiki.archlinux.org/index.php/beginners'_guide#Locale)
Configuration
-------------
### Time and Date
timedatectl set-timezone America/Chicago
### Hostname
hostnamectl set-hostname nikhil.io
### Add a normal user
Who will be able to `sudo` and do things and set a password
useradd -m -g wheel user
passwd user
Can always change the name of this user later with `usermod`. Then use `visudo` to enable the `wheel` group. You'll see [a lot of artifacts](https://bbs.archlinux.org/viewtopic.php?pid=796380#p796380) if you don't set `EDITOR` first
EDITOR=vim visudo
### Yoghurt
Edit `/etc/pacman.conf` and add this
[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch
Then,
pacman -Sy yaourt
### Verbose Boot
Modify `GRUB_CMDLINE_LINUX_DEFAULT` in `/etc/default/grub`
### Framebuffer Resolution
Edit `/etc/default/grub`:
GRUB_GFXMODE=1024x768x32
Then run `grub-mkconfig -o /boot/grub/grub.cfg` and reboot
### Firewall
[Adapted](/assets/archlinux-firewall.txt) an [old project](https://github.com/afreeorange/iptables)
and things work as expected. Don't forget to [enable the service](https://wiki.archlinux.org/index.php/Iptables#Configuration_and_usage)
systemctl enable iptables.service
### Network
The `pacman` update will break networking due [a
bug](https://bugs.archlinux.org/task/41215) that may have been fixed in
`systemd` v228 (as of this writing). Oh well.
For the interface you see in `ip link` (will start with "`en`")
systemctl enable dhcpcd@ens4.network
Then enable the appropriate service and restart the node
systemctl enable systemd-networkd
reboot
### SSH
pacman -S openssh
Change default port in `/etc/ssh/sshd_config` and disable root login. Then
[enable the "spawn on demand" `ssh.socket` service](https://wiki.archlinux.org/index.php/Secure_Shell#Daemon_management)
and change the port to whatever you had earlier
# systemctl edit sshd.socket
[Socket]
ListenStream=12345
Enable the service and reboot to test if you can SSH
systemctl enable sshd.socket
reboot
VirtualBox Notes
----------------
### VirtualBox Guest Additions
pacman -S virtualbox-guest-utils \
virtualbox-guest-modules \
virtualbox-guest-dkms \
linux-headers
This is without an LTS kernel since I couldn't be bothered. After installation, enable the service
systemctl enable vboxservice.service
Edit `/etc/modules-load.d/virtualbox.conf` to add these
vboxguest
vboxsf
vboxvideo
### "virtualbox kernel service is not running"
[Here's the issue](https://bugs.archlinux.org/task/40495). Happened after a system update. Fixed with
sudo pacman -Su linux-headers
### Cannot Initialize Multiple Displays
Made sure that I had the latest versions of `virtualbox-guest-*` packages
[root@orc home]# pacman -Q | grep virtual
virtualbox-guest-modules-arch 5.1.16-1
virtualbox-guest-utils 5.1.16-1
Then made sure that I could see my display in the output of `xrandr`. Then realized that I had to go "View" → "Virtual Screen 2" → "Enable" in the VirtualBox menu and felt a tad silly :flushed:
### Resizing
Can only do this with VDIs and not VMDKs. To convert a VMDK (on Windows)
cd C:\Program Files\Oracle\VirtualBox
VBoxManage.exe clonehd --format vdi
Then can resize
VBoxManage.exe modifyhd --resize 25600
That's 25,000 megabytes (25 x 1,024). Now _resize all snapshots_ with that same size!
VBoxManage.exe modifyhd --resize 25600
Then boot up VM. `parted` above version 2.4 [doesn't allow you to resize](https://www.gnu.org/software/parted/manual/html_node/Command-explanations.html#Command-explanations) although its `man` page lists it as an option :/ I used GParted instead to fill the rest of the partition and was a happy person. `fdisk` works too.
X11
---
### Installation
pacman -S xorg-server xorg-xinit xfce4 xfce4-goodies
At this point, running `startxfce4` should show you a desktop. Reboot.
### Starting
cp /etc/X11/xinit/xinitrc ~/.xinitrc
echo -e "exec startxfce4" >> ~/.xinitrc
Modify `~/.xinitrc` to remove all the `xterm`, `xclock` and `exec` lines and add this
exec startxfce4
Now, `startx` should work!
Install some extras
yaourt -S google-chrome numix-themes numix-circle-icon-theme-git ristretto evince2-light squeeze-git --noconfirm
### Compiz (Maybe)
For Compiz,
yaourt -S compiz
To run compiz,
compiz --replace ccp
To get the [Numix theme](https://wiki.archlinux.org/index.php/Compiz_configuration#Window_decoration_themes),
gsettings set org.gnome.metacity theme theme-name
Add that to "Session and Startup". I had to kill it, _not save the session_, and log out. The default window manager is `xfwm4`.
### The Trash Can
sudo pacman -S gvfs gamin
### Sound
pacman -S alsa-firmware alsa-utils
alsactl init
### Dock
Lots of options, but I like Docky and Plank. Went with Plank. To see preferences,
plank --preferences
Configuration is kept in `~/.config/plank`.
### NetworkManager
A bit 'heavy' compared to `netctl` but I was tired of fighting with the corporate network.
pacman -S networkmanager network-manager-applet xfce4-notifyd
Enable the service (else you'll get D-Bus errors when you run `nm-applet`)
systemctl enable NetworkManager.service
systemctl start NetworkManager.service
Reboot and log back in. You'll find the network manager in Applications -> Settings -> Network Connections
### "AddScreen/ScreenInit failed for driver 0"
Add `iomem=relaxed` to `GRUB_CMDLINE_LINUX_DEFAULT` in `/etc/default/grub`. Then generate a new grub config and initramfs with
grub-mkconfig -o /boot/grub/grub.cfg
### Windows Fonts
From a Windows 7 system. Get them and rename so you can remove later if you'd like (`for f in *; do mv $f "Win7-"$f; done`)
```bash
@ECHO OFF
CLS
SET MYSHARE=%USERPROFILE%\Desktop\TTFONTS-ttf-win7-fonts
MKDIR "%MYSHARE%"
ECHO 1
COPY "%WINDIR%\FONTS\arial.ttf" "%MYSHARE%\arial.ttf"
COPY "%WINDIR%\FONTS\arialbd.ttf" "%MYSHARE%\arialbd.ttf"
COPY "%WINDIR%\FONTS\ariali.ttf" "%MYSHARE%\ariali.ttf"
COPY "%WINDIR%\FONTS\arialbi.ttf" "%MYSHARE%\arialbi.ttf"
COPY "%WINDIR%\FONTS\comic.ttf" "%MYSHARE%\comic.ttf"
COPY "%WINDIR%\FONTS\comicbd.ttf" "%MYSHARE%\comicbd.ttf"
COPY "%WINDIR%\FONTS\cour.ttf" "%MYSHARE%\cour.ttf"
COPY "%WINDIR%\FONTS\courbd.ttf" "%MYSHARE%\courbd.ttf"
COPY "%WINDIR%\FONTS\couri.ttf" "%MYSHARE%\couri.ttf"
COPY "%WINDIR%\FONTS\courbi.ttf" "%MYSHARE%\courbi.ttf"
COPY "%WINDIR%\FONTS\gabriola.ttf" "%MYSHARE%\gabriola.ttf"
COPY "%WINDIR%\FONTS\georgia.ttf" "%MYSHARE%\georgia.ttf"
COPY "%WINDIR%\FONTS\georgiab.ttf" "%MYSHARE%\georgiab.ttf"
COPY "%WINDIR%\FONTS\georgiai.ttf" "%MYSHARE%\georgiai.ttf"
COPY "%WINDIR%\FONTS\georgiaz.ttf" "%MYSHARE%\georgiaz.ttf"
COPY "%WINDIR%\FONTS\impact.ttf" "%MYSHARE%\impact.ttf"
COPY "%WINDIR%\FONTS\times.ttf" "%MYSHARE%\times.ttf"
COPY "%WINDIR%\FONTS\timesbd.ttf" "%MYSHARE%\timesbd.ttf"
COPY "%WINDIR%\FONTS\timesi.ttf" "%MYSHARE%\timesi.ttf"
COPY "%WINDIR%\FONTS\timesbi.ttf" "%MYSHARE%\timesbi.ttf"
COPY "%WINDIR%\FONTS\trebuc.ttf" "%MYSHARE%\trebuc.ttf"
COPY "%WINDIR%\FONTS\trebucbd.ttf" "%MYSHARE%\trebucbd.ttf"
COPY "%WINDIR%\FONTS\trebucit.ttf" "%MYSHARE%\trebucit.ttf"
COPY "%WINDIR%\FONTS\trebucbi.ttf" "%MYSHARE%\trebucbi.ttf"
ECHO 25
COPY "%WINDIR%\FONTS\verdana.ttf" "%MYSHARE%\verdana.ttf"
COPY "%WINDIR%\FONTS\verdanab.ttf" "%MYSHARE%\verdanab.ttf"
COPY "%WINDIR%\FONTS\verdanai.ttf" "%MYSHARE%\verdanai.ttf"
COPY "%WINDIR%\FONTS\verdanaz.ttf" "%MYSHARE%\verdanaz.ttf"
COPY "%WINDIR%\FONTS\webdings.ttf" "%MYSHARE%\webdings.ttf"
COPY "%WINDIR%\FONTS\wingding.ttf" "%MYSHARE%\wingding.ttf"
COPY "%WINDIR%\FONTS\sylfaen.ttf" "%MYSHARE%\sylfaen.ttf"
COPY "%WINDIR%\FONTS\symbol.ttf" "%MYSHARE%\symbol.ttf"
COPY "%WINDIR%\FONTS\calibri.ttf" "%MYSHARE%\calibri.ttf"
COPY "%WINDIR%\FONTS\calibril.ttf" "%MYSHARE%\calibril.ttf"
COPY "%WINDIR%\FONTS\calibrib.ttf" "%MYSHARE%\calibrib.ttf"
COPY "%WINDIR%\FONTS\calibrii.ttf" "%MYSHARE%\calibrii.ttf"
COPY "%WINDIR%\FONTS\calibrili.ttf" "%MYSHARE%\calibrili.ttf"
COPY "%WINDIR%\FONTS\calibriz.ttf" "%MYSHARE%\calibriz.ttf"
COPY "%WINDIR%\FONTS\cambria.ttc" "%MYSHARE%\cambria.ttc"
COPY "%WINDIR%\FONTS\cambriab.ttf" "%MYSHARE%\cambriab.ttf"
COPY "%WINDIR%\FONTS\cambriai.ttf" "%MYSHARE%\cambriai.ttf"
COPY "%WINDIR%\FONTS\cambriaz.ttf" "%MYSHARE%\cambriaz.ttf"
COPY "%WINDIR%\FONTS\candara.ttf" "%MYSHARE%\candara.ttf"
COPY "%WINDIR%\FONTS\candarab.ttf" "%MYSHARE%\candarab.ttf"
COPY "%WINDIR%\FONTS\candarai.ttf" "%MYSHARE%\candarai.ttf"
COPY "%WINDIR%\FONTS\candaraz.ttf" "%MYSHARE%\candaraz.ttf"
COPY "%WINDIR%\FONTS\consola.ttf" "%MYSHARE%\consola.ttf"
COPY "%WINDIR%\FONTS\consolab.ttf" "%MYSHARE%\consolab.ttf"
ECHO 49
COPY "%WINDIR%\FONTS\consolai.ttf" "%MYSHARE%\consolai.ttf"
COPY "%WINDIR%\FONTS\consolaz.ttf" "%MYSHARE%\consolaz.ttf"
COPY "%WINDIR%\FONTS\constan.ttf" "%MYSHARE%\constan.ttf"
COPY "%WINDIR%\FONTS\constanb.ttf" "%MYSHARE%\constanb.ttf"
COPY "%WINDIR%\FONTS\constani.ttf" "%MYSHARE%\constani.ttf"
COPY "%WINDIR%\FONTS\constanz.ttf" "%MYSHARE%\constanz.ttf"
COPY "%WINDIR%\FONTS\corbel.ttf" "%MYSHARE%\corbel.ttf"
COPY "%WINDIR%\FONTS\corbelb.ttf" "%MYSHARE%\corbelb.ttf"
COPY "%WINDIR%\FONTS\corbeli.ttf" "%MYSHARE%\corbeli.ttf"
COPY "%WINDIR%\FONTS\corbelz.ttf" "%MYSHARE%\corbelz.ttf"
COPY "%WINDIR%\FONTS\lucon.ttf" "%MYSHARE%\lucon.ttf"
COPY "%WINDIR%\FONTS\ariblk.ttf" "%MYSHARE%\ariblk.ttf"
COPY "%WINDIR%\FONTS\l_10646.ttf" "%MYSHARE%\l_10646.ttf"
COPY "%WINDIR%\FONTS\micross.ttf" "%MYSHARE%\micross.ttf"
COPY "%WINDIR%\FONTS\pala.ttf" "%MYSHARE%\pala.ttf"
COPY "%WINDIR%\FONTS\palab.ttf" "%MYSHARE%\palab.ttf"
COPY "%WINDIR%\FONTS\palai.ttf" "%MYSHARE%\palai.ttf"
COPY "%WINDIR%\FONTS\palabi.ttf" "%MYSHARE%\palabi.ttf"
COPY "%WINDIR%\FONTS\tahoma.ttf" "%MYSHARE%\tahoma.ttf"
COPY "%WINDIR%\FONTS\tahomabd.ttf" "%MYSHARE%\tahomabd.ttf"
COPY "%WINDIR%\FONTS\framd.ttf" "%MYSHARE%\framd.ttf"
COPY "%WINDIR%\FONTS\framdit.ttf" "%MYSHARE%\framdit.ttf"
COPY "%WINDIR%\FONTS\segoepr.ttf" "%MYSHARE%\segoepr.ttf"
COPY "%WINDIR%\FONTS\segoeprb.ttf" "%MYSHARE%\segoeprb.ttf"
ECHO 73
COPY "%WINDIR%\FONTS\segoesc.ttf" "%MYSHARE%\segoesc.ttf"
COPY "%WINDIR%\FONTS\segoescb.ttf" "%MYSHARE%\segoescb.ttf"
COPY "%WINDIR%\FONTS\segoeui.ttf" "%MYSHARE%\segoeui.ttf"
COPY "%WINDIR%\FONTS\segoeuib.ttf" "%MYSHARE%\segoeuib.ttf"
COPY "%WINDIR%\FONTS\segoeuii.ttf" "%MYSHARE%\segoeuii.ttf"
COPY "%WINDIR%\FONTS\segoeuil.ttf" "%MYSHARE%\segoeuil.ttf"
COPY "%WINDIR%\FONTS\segoeuiz.ttf" "%MYSHARE%\segoeuiz.ttf"
COPY "%WINDIR%\FONTS\seguisb.ttf" "%MYSHARE%\seguisb.ttf"
COPY "%WINDIR%\FONTS\seguisym.ttf" "%MYSHARE%\seguisym.ttf"
PAUSE
```
Other Stuff
-----------
### Compacting VDI Images
You'll need [`zerofree`](https://frippery.org/uml/index.html). It works on ext4 filesystems as well. Install it on the VM, then reboot with an Arch LiveCD. Mount the system some place (e.g. `/mnt/vm`) as _read-only_ and zerofree it
mount -o ro /dev/sda2 /mnt/vm
zerofree /dev/sda2
Now shutdown the VM (and remove the LiveCD). On the VirtualBox host (mine was Windows)
cd "C:\Program Files\Oracle\VirtualBox"
VBoxManage.exe modifyhd c:\path\to\thedisk.vdi --compact
### Dropbox
Install both the `dropbox` and `dropbox-cli` packages with `yaourt`. Some useful commands
```bash
# Get to your folder
cd ~/Dropbox
# See the overall sync status
dropbox-cli status
# See file status
dropbox-cli filestatus
# Set a proxy
dropbox-cli proxy manual http jhproxy1.phibred.com 8080
```
### CA Certificates
Copy certificates in PEM format _and ending with a `.pem` extension_ to `/etc/ssl/certs`. Then, as root, run `update-ca-trust`.
Google Chrome didn't seem to depend on the system store.
### Emoji
Either install `ttf-symbola` or [`emojione-color-font`](https://github.com/eosrei/emojione-color-font)
### Adding Mirrors
`reflector` will fetch the latest mirrors based on some criteria you provide
it (e.g. I want HTTPS and IPv6 only.) You can [do this
online](https://www.archlinux.org/mirrorlist) as well.
### `/tmp` size
This is set to a small, fixed size which is [a good
thing](http://superuser.com/a/619398). To install stuff, read the docs about
some way to set the temporary folder. For example, `pyenv` allows you to
export `$TMPDIR` before installation. I use `/var/tmp`
TMPDIR=/var/tmp pyenv install 3.5.1
However, this can be a little annoying. `systemd` is the one that creates this
mount (since I couldn't find it in `/etc/fstab`... since I *created* it myself
with `genfstab`!) with this
/usr/lib/systemd/system/tmp.mount
One option would be to rename. A better one would be to simply mask it
systemctl mask tmp.mount
Setting `/tmp` to a fixed size is still good. But it seems to use half the
RAM; with my VPS box, this is untenable. Since I get tons of storage (and very
little memory), I resorted to creating a 5-10GiB partition just for `/tmp`.
### Pacman and GPG Proxies
Corporate proxy blocked port 11371 (the default) that Pacman used to get
its keys. Had to modify `/etc/pacman.d/gnupg/gpg.conf` and modify the
`keyserver` to `hkps://hkps.pool.sks-keyservers.net:443`
### Key could not be looked up remotely
```bash
sudo mv -v /etc/pacman.d/gnupg{,.bak}
sudo mv -v /root/.gnupg{,.bak}
sudo gpg --refresh-keys
sudo pacman-key --refresh-keys
```