about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2015-10-09 15:24:32 +0200
committerChristian Neukirchen <chneukirchen@gmail.com>2015-10-09 15:43:55 +0200
commit44722b79e2f31c0c51bd2fc8c8d43c0009d79529 (patch)
tree5fc9fce8937199de06e2c22ad781e59fa654dfd2
parenta25ced5c198fff963ba7b7e9b613059e756374c0 (diff)
parentcb2510b3791091fb54681cee451eb7ec24e0b266 (diff)
downloadhrmpf-44722b79e2f31c0c51bd2fc8c8d43c0009d79529.tar.gz
hrmpf-44722b79e2f31c0c51bd2fc8c8d43c0009d79529.tar.xz
hrmpf-44722b79e2f31c0c51bd2fc8c8d43c0009d79529.zip
Merge remote-tracking branch 'origin/master'
* origin/master: (136 commits)
  dracut/services: don't autostart dmeventd, lvmetad and mdadm.
  mklive: fix guessing linux kernel pkgname.
  fix set_keymap rc.conf
  installer.sh: fix static IP settings in menu_install
  build-arm-images: PLATFORM can be overrided now.
  build-rootfs: build musl rootfs too; PLATFORMS can be overrided now.
  build-x86-images: added lxqt image.
  dracut/dm-autologin: autostart lxqt if available.
  mkrootfs: add dockstar support
  mklive: install GRUB EFI loader as EFI/BOOT/BOOTX64.EFI.
  build-x86-images: add gnome-keyring to cinnamon/mate/xfce images.
  build-x86-images: add firefox now it's available for musl.
  build-arm-images: respect musl targets.
  mkimage: consistently redirect std{err,out} to /dev/null with dd(1).
  build-arm-images: disable cubietruck for now; does not boot.
  build-arm-images: build all ARM images for glibc and musl.
  mkrootfs: get rid of pixz; fix rpi target arch.
  mkrootfs: set cachedir to $PWD/xbps-cachedir-<arch>; misc tweaks for musl.
  mkrootfs: update for musl support.
  build-x86-images: do not build the kde image; does not work yet.
  ...
-rw-r--r--.gitignore3
-rw-r--r--COPYING2
-rw-r--r--README.md2
-rw-r--r--build-arm-images.sh.in21
-rw-r--r--build-rootfs.sh.in21
-rw-r--r--build-x86-images.sh.in83
-rw-r--r--data/void-vpkgs.conf13
-rw-r--r--dracut/59-mtd.rules8
-rw-r--r--dracut/61-mtd.rules20
-rw-r--r--dracut/adduser.sh8
-rw-r--r--dracut/display-manager-autologin.sh18
-rw-r--r--dracut/module-setup.sh10
-rwxr-xr-xdracut/mtd.sh7
-rw-r--r--dracut/services.sh29
-rw-r--r--grub/grub_void.cfg.in4
-rw-r--r--installer.sh.in86
-rw-r--r--isolinux/isolinux.cfg.in4
-rw-r--r--keys/3d:b9:c0:50:41:a7:68:4c:2e:2c:a9:a2:5a:04:b7:3f.plist12
-rw-r--r--mkimage.sh.in95
-rw-r--r--mklive.sh.in235
-rw-r--r--mkrootfs.sh.in90
21 files changed, 543 insertions, 228 deletions
diff --git a/.gitignore b/.gitignore
index c97f963..20af4c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,4 @@
 *.sh
+*.img
+*.xz
+xbps-cachedir*
diff --git a/COPYING b/COPYING
index 03cf7ef..b87022b 100644
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,4 @@
-# Copyright (c) 2009-2013 Juan Romero Pardines
+# Copyright (c) 2009-2015 Juan RP <xtraeme@gmail.com>
 # Copyright (c) 2012 Dave Elusive <davehome@redthumb.info.tm>
 # All rights reserved.
 #
diff --git a/README.md b/README.md
index b22e00a..9837e96 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ Welcome to the hrmpf rescue system, built on Void Linux.
 
 #### Dependencies
 
- * xbps>=0.35
+ * xbps>=0.45
  * GNU bash
 
 #### Usage
diff --git a/build-arm-images.sh.in b/build-arm-images.sh.in
new file mode 100644
index 0000000..0cf4fa1
--- /dev/null
+++ b/build-arm-images.sh.in
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+TARGET="$1"
+[ -n "$TARGET" ] && shift
+
+: ${PLATFORMS:="beaglebone cubieboard2 odroid-u2 rpi rpi2 usbarmory"}
+DATE=$(date '+%Y%m%d')
+
+for f in ${PLATFORMS} x ${PLATFORMS} ; do
+	if [ "$f" = "x" ]; then
+		musl=1
+		continue
+	fi
+	target=$f
+	if [ -n "$musl" ]; then
+		target=${f}-musl
+	fi
+        if [ -z "$ARGET" -o "$TARGET" = "$target" ]; then
+		./mkrootfs.sh $@ $target && ./mkimage.sh void-${target}-rootfs-${DATE}.tar.xz && xz -T0 -9 void-${target}-${DATE}.img
+	fi
+done
diff --git a/build-rootfs.sh.in b/build-rootfs.sh.in
new file mode 100644
index 0000000..526ae96
--- /dev/null
+++ b/build-rootfs.sh.in
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+TARGET="$1"
+[ -n "$TARGET" ] && shift
+
+: ${PLATFORMS:="beaglebone cubieboard2 odroid-u2 rpi rpi2 usbarmory"}
+DATE=$(date '+%Y%m%d')
+
+for f in ${PLATFORMS} x ${PLATFORMS} ; do
+	if [ "$f" = "x" ]; then
+		musl=1
+		continue
+	fi
+	target=$f
+	if [ -n "$musl" ]; then
+		target=${f}-musl
+	fi
+        if [ -z "$ARGET" -o "$TARGET" = "$target" ]; then
+		./mkrootfs.sh $@ $target
+	fi
+done
diff --git a/build-x86-images.sh.in b/build-x86-images.sh.in
new file mode 100644
index 0000000..0fbf593
--- /dev/null
+++ b/build-x86-images.sh.in
@@ -0,0 +1,83 @@
+#!/bin/sh
+
+ARCH=
+IMAGE=
+
+while getopts "a:b:h" opt; do
+case $opt in
+	a) ARCH="$OPTARG";;
+	b) IMAGE="$OPTARG";;
+	h) echo "${0#/*}: [-a arch] [-b base|e|xfce|mate|cinnamon|kde|lxde]" >&2; exit 1;;
+esac
+done
+shift $((OPTIND - 1))
+
+: ${ARCH:=$(uname -m)}
+
+readonly DATE=$(date +%Y%m%d)
+readonly BASE_IMG=void-live-${ARCH}-${DATE}.iso
+readonly E_IMG=void-live-${ARCH}-${DATE}-enlightenment.iso
+readonly XFCE_IMG=void-live-${ARCH}-${DATE}-xfce.iso
+readonly MATE_IMG=void-live-${ARCH}-${DATE}-mate.iso
+readonly CINNAMON_IMG=void-live-${ARCH}-${DATE}-cinnamon.iso
+readonly KDE_IMG=void-live-${ARCH}-${DATE}-kde.iso
+readonly LXDE_IMG=void-live-${ARCH}-${DATE}-lxde.iso
+readonly LXQT_IMG=void-live-${ARCH}-${DATE}-lxqt.iso
+
+case "$ARCH" in
+	i686*) GRUB="grub";;
+	x86_64*) GRUB="grub-x86_64-efi";;
+esac
+
+readonly BASE_PKGS="dialog cryptsetup lvm2 mdadm $GRUB"
+readonly X_PKGS="$BASE_PKGS xorg-minimal xorg-input-drivers xorg-video-drivers setxkbmap xauth font-misc-misc terminus-font alsa-plugins-pulseaudio"
+readonly E_PKGS="$X_PKGS lxdm enlightenment terminology econnman udisks2 firefox"
+readonly XFCE_PKGS="$X_PKGS lxdm xfce4 gnome-themes-standard gnome-keyring network-manager-applet gvfs-afc gvfs-mtp gvfs-smb udisks2 firefox"
+readonly MATE_PKGS="$X_PKGS lxdm mate mate-extra gnome-keyring network-manager-applet gvfs-afc gvfs-mtp gvfs-smb udisks2 firefox"
+readonly CINNAMON_PKGS="$X_PKGS lxdm cinnamon gnome-keyring colord gnome-terminal gvfs-afc gvfs-mtp gvfs-smb udisks2 firefox"
+readonly KDE_PKGS="$X_PKGS kde"
+readonly LXDE_PKGS="$X_PKGS lxdm lxde gvfs-afc gvfs-mtp gvfs-smb udisks2 firefox"
+readonly LXQT_PKGS="$X_PKGS lxdm lxqt gvfs-afc gvfs-mtp gvfs-smb udisks2 qupzilla"
+
+[ ! -x mklive.sh ] && exit 0
+
+if [ -z "$IMAGE" -o "$IMAGE" = base ]; then
+	if [ ! -e $BASE_IMG ]; then
+		./mklive.sh -a $ARCH -o $BASE_IMG -p "$BASE_PKGS" $@
+	fi
+fi
+if [ -z "$IMAGE" -o "$IMAGE" = e ]; then
+	if [ ! -e $E_IMG ]; then
+		./mklive.sh -a $ARCH -o $E_IMG -p "$E_PKGS" $@
+	fi
+fi
+if [ -z "$IMAGE" -o "$IMAGE" = xfce ]; then
+	if [ ! -e $XFCE_IMG ]; then
+		./mklive.sh -a $ARCH -o $XFCE_IMG -p "$XFCE_PKGS" $@
+	fi
+fi
+if [ -z "$IMAGE" -o "$IMAGE" = mate ]; then
+	if [ ! -e $MATE_IMG ]; then
+		./mklive.sh -a $ARCH -o $MATE_IMG -p "$MATE_PKGS" $@
+	fi
+fi
+if [ -z "$IMAGE" -o "$IMAGE" = cinnamon ]; then
+	if [ ! -e $CINNAMON_IMG ]; then
+		./mklive.sh -a $ARCH -o $CINNAMON_IMG -p "$CINNAMON_PKGS" $@
+	fi
+fi
+if [ -z "$IMAGE" -o "$IMAGE" = lxde ]; then
+	if [ ! -e $LXDE_IMG ]; then
+		./mklive.sh -a $ARCH -o $LXDE_IMG -p "$LXDE_PKGS" $@
+	fi
+fi
+if [ "$IMAGE" = lxqt ]; then
+	if [ ! -e $LXQT_IMG ]; then
+		./mklive.sh -a $ARCH -o $LXQT_IMG -p "$LXQT_PKGS" $@
+	fi
+fi
+if [ "$IMAGE" = kde ]; then
+	if [ ! -e $KDE_IMG ]; then
+		./mklive.sh -a $ARCH -o $KDE_IMG -p "$KDE_PKGS" $@
+	fi
+fi
diff --git a/data/void-vpkgs.conf b/data/void-vpkgs.conf
index c1e8a89..e3cf52a 100644
--- a/data/void-vpkgs.conf
+++ b/data/void-vpkgs.conf
@@ -1,7 +1,10 @@
 # Default void configuration
 # 
-# 	- gawk as default awk
-#	- openbsd-man as default man(1)
-#
-virtualpkg=awk-0_1:gawk
-virtualpkg=man-0_1:openbsd-man
+virtualpkg=awk:gawk
+virtualpkg=cron-daemon:dcron
+virtualpkg=editor:nvi
+virtualpkg=man:openbsd-man
+virtualpkg=ntp-daemon:openntpd
+virtualpkg=openssl:libressl-openssl
+virtualpkg=shell:dash
+virtualpkg=smtp-server:opensmtpd
diff --git a/dracut/59-mtd.rules b/dracut/59-mtd.rules
new file mode 100644
index 0000000..d81a6ad
--- /dev/null
+++ b/dracut/59-mtd.rules
@@ -0,0 +1,8 @@
+SUBSYSTEM!="block", GOTO="ps_end"
+ACTION!="add|change", GOTO="ps_end"
+# Also don't process disks that are slated to be a multipath device
+ENV{DM_MULTIPATH_DEVICE_PATH}=="?*", GOTO="ps_end"
+
+KERNEL=="mtdblock[0-9]*", IMPORT BLKID
+
+LABEL="ps_end"
diff --git a/dracut/61-mtd.rules b/dracut/61-mtd.rules
new file mode 100644
index 0000000..0711d3a
--- /dev/null
+++ b/dracut/61-mtd.rules
@@ -0,0 +1,20 @@
+SUBSYSTEM!="block", GOTO="pss_end"
+ACTION!="add|change", GOTO="pss_end"
+# Also don't process disks that are slated to be a multipath device
+ENV{DM_MULTIPATH_DEVICE_PATH}=="?*", GOTO="pss_end"
+
+ACTION=="change", KERNEL=="dm-[0-9]*", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}!="1", GOTO="do_pss"
+KERNEL=="mtdblock*", GOTO="do_pss"
+
+GOTO="pss_end"
+
+LABEL="do_pss"
+# by-path (parent device path)
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="", DEVPATH!="*/virtual/*", IMPORT PATH_ID
+ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}"
+ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part%n"
+
+# by-label/by-uuid links (filesystem metadata)
+ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
+ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}"
+LABEL="pss_end"
diff --git a/dracut/adduser.sh b/dracut/adduser.sh
index 0379690..f06a4ea 100644
--- a/dracut/adduser.sh
+++ b/dracut/adduser.sh
@@ -6,8 +6,10 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
 
 echo hrmpf > ${NEWROOT}/etc/hostname
 
+AUTOLOGIN=$(getarg live.autologin)
 USERNAME=$(getarg live.user)
 USERSHELL=$(getarg live.shell)
+
 [ -z "$USERNAME" ] && USERNAME=anon
 [ -x $NEWROOT/bin/bash -a -z "$USERSHELL" ] && USERSHELL=/bin/bash
 [ -z "$USERSHELL" ] && USERSHELL=/bin/sh
@@ -21,7 +23,7 @@ if ! grep -q ${USERSHELL} ${NEWROOT}/etc/shells ; then
 fi
 
 # Create new user and remove password. We'll use autologin by default.
-chroot ${NEWROOT} useradd -m -c $USERNAME -G wheel -s $USERSHELL $USERNAME
+chroot ${NEWROOT} useradd -m -c $USERNAME -G audio,video,wheel -s $USERSHELL $USERNAME
 chroot ${NEWROOT} passwd -d $USERNAME >/dev/null 2>&1
 
 # Setup default root/user password (voidlinux).
@@ -49,4 +51,8 @@ _EOF
     chroot ${NEWROOT} chown polkitd:polkitd /etc/polkit-1/rules.d/void-live.rules
 fi
 
+if [ -n "$AUTOLOGIN" ]; then
+        sed -i "s,GETTY_ARGS=\"--noclear\",GETTY_ARGS=\"--noclear -a $USERNAME\",g" ${NEWROOT}/etc/sv/agetty-tty1/run
+fi
+
 chroot ${NEWROOT} usermod -s /bin/bash root
diff --git a/dracut/display-manager-autologin.sh b/dracut/display-manager-autologin.sh
index c667e21..4d41164 100644
--- a/dracut/display-manager-autologin.sh
+++ b/dracut/display-manager-autologin.sh
@@ -21,6 +21,12 @@ if [ -d ${NEWROOT}/etc/gdm ]; then
     fi
 fi
 
+# Configure KDM autologin
+if [ -e ${NEWROOT}/etc/kdm/kdmrc ]; then
+    sed -i -e "s|^\#\(AutoLoginEnable=\).*|\1|" ${NEWROOT}/etc/kdm/kdmrc
+    sed -i -e "s|^\#\(AutoLoginUser=\).*|\1$USERNAME|" ${NEWROOT}/etc/kdm/kdmrc
+fi
+
 # Configure lightdm autologin.
 if [ -r ${NEWROOT}/etc/lightdm.conf ]; then
     sed -i -e "s|^\#\(default-user=\).*|\1$USERNAME|" \
@@ -34,5 +40,17 @@ if [ -r ${NEWROOT}/etc/lxdm/lxdm.conf ]; then
     sed -e "s,.*autologin.*=.*,autologin=$USERNAME," -i ${NEWROOT}/etc/lxdm/lxdm.conf
     if [ -x ${NEWROOT}/usr/bin/enlightenment_start ]; then
         sed -e "s,.*session.*=.*,session=/usr/bin/enlightenment_start," -i ${NEWROOT}/etc/lxdm/lxdm.conf
+    elif [ -x ${NEWROOT}/usr/bin/startxfce4 ]; then
+        sed -e "s,.*session.*=.*,session=/usr/bin/startxfce4," -i ${NEWROOT}/etc/lxdm/lxdm.conf
+    elif [ -x ${NEWROOT}/usr/bin/mate-session ]; then
+        sed -e "s,.*session.*=.*,session=/usr/bin/mate-session," -i ${NEWROOT}/etc/lxdm/lxdm.conf
+    elif [ -x ${NEWROOT}/usr/bin/cinnamon-session ]; then
+        sed -e "s,.*session.*=.*,session=/usr/bin/cinnamon-session," -i ${NEWROOT}/etc/lxdm/lxdm.conf
+    elif [ -x ${NEWROOT}/usr/bin/i3 ]; then
+        sed -e "s,.*session.*=.*,session=/usr/bin/i3," -i ${NEWROOT}/etc/lxdm/lxdm.conf
+    elif [ -x ${NEWROOT}/usr/bin/startlxde ]; then
+        sed -e "s,.*session.*=.*,session=/usr/bin/startlxde," -i ${NEWROOT}/etc/lxdm/lxdm.conf
+    elif [ -x ${NEWROOT}/usr/bin/startlxqt ]; then
+        sed -e "s,.*session.*=.*,session=/usr/bin/startlxqt," -i ${NEWROOT}/etc/lxdm/lxdm.conf
     fi
 fi
diff --git a/dracut/module-setup.sh b/dracut/module-setup.sh
index fb4a067..4170620 100644
--- a/dracut/module-setup.sh
+++ b/dracut/module-setup.sh
@@ -14,9 +14,19 @@ install() {
     inst /usr/bin/chroot
     inst /usr/bin/chmod
     inst /usr/bin/sed
+
+    if [ -e /usr/bin/memdiskfind ]; then
+        inst /usr/bin/memdiskfind
+        instmods mtdblock phram
+        inst_rules "$moddir/59-mtd.rules" "$moddir/61-mtd.rules"
+        prepare_udev_rules 59-mtd.rules 61-mtd.rules
+        inst_hook pre-udev 01 "$moddir/mtd.sh"
+    fi
+
     inst_hook pre-pivot 01 "$moddir/adduser.sh"
     inst_hook pre-pivot 02 "$moddir/display-manager-autologin.sh"
     inst_hook pre-pivot 02 "$moddir/getty-autologin.sh"
     inst_hook pre-pivot 03 "$moddir/copy-initramfs.sh"
     inst_hook pre-pivot 04 "$moddir/locale.sh"
+    inst_hook pre-pivot 05 "$moddir/services.sh"
 }
diff --git a/dracut/mtd.sh b/dracut/mtd.sh
new file mode 100755
index 0000000..1d94a4e
--- /dev/null
+++ b/dracut/mtd.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+MEMDISK=$(memdiskfind)
+if [ "$MEMDISK" ]; then
+	modprobe phram phram=memdisk,$MEMDISK
+	modprobe mtdblock
+	printf 'KERNEL=="mtdblock0", RUN+="/sbin/initqueue --settled --onetime --unique /sbin/dmsquash-live-root /dev/mtdblock0"\n' >> /etc/udev/rules.d/99-live-squash.rules
+fi
diff --git a/dracut/services.sh b/dracut/services.sh
new file mode 100644
index 0000000..50461ff
--- /dev/null
+++ b/dracut/services.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
+
+SERVICEDIR=$NEWROOT/etc/sv
+SERVICES="$(getarg live.services)"
+
+for f in ${SERVICES}; do
+        ln -sf /etc/sv/$f $NEWROOT/etc/runit/runsvdir/default/
+done
+
+dhcpcd=1
+for f in connmand NetworkManager wicd; do
+    if [ -e $SERVICEDIR/$f ]; then
+        unset dhcpcd
+    fi
+done
+
+# Enable all services by default... with some exceptions.
+for f in $SERVICEDIR/*; do
+    _service=${f##*/}
+    case "${_service}" in
+        agetty-console|agetty-generic|agetty-serial|agetty-tty[SAU]*|sulogin|dhcpcd-*|iptables|ip6tables|wpa_supplicant|pulseaudio|lvmetad|dmeventd|mdadm) ;; # ignored
+        dhcpcd) [ -n "$dhcpcd" ] && ln -sf ${f##$NEWROOT} $NEWROOT/etc/runit/runsvdir/default/;;
+        *) ln -sf ${f##$NEWROOT} $NEWROOT/etc/runit/runsvdir/default/;;
+    esac
+done
diff --git a/grub/grub_void.cfg.in b/grub/grub_void.cfg.in
index a6bf89f..a2cda85 100644
--- a/grub/grub_void.cfg.in
+++ b/grub/grub_void.cfg.in
@@ -34,13 +34,13 @@ if [ cpuid -l ]; then
 		locale.LANG=@@LOCALE@@ @@BOOT_CMDLINE@@
         initrd (${voidlive})/boot/initrd
     }
-    menuentry "@@BOOT_TITLE@@ @@KERNVER@@ (@@ARCH@@) (load to RAM)" {
+    menuentry "@@BOOT_TITLE@@ @@KERNVER@@ (@@ARCH@@) (RAM)" {
         set gfxpayload="keep"
         linux (${voidlive})/boot/vmlinuz \
 		root=live:CDLABEL=VOID_LIVE ro init=/sbin/init \
 		rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 gpt add_efi_memmap \
 		vconsole.unicode=1 vconsole.keymap=@@KEYMAP@@ \
-		locale.LANG=@@LOCALE@@ @@BOOT_CMDLINE@@ rd.live.ram=1
+		locale.LANG=@@LOCALE@@ @@BOOT_CMDLINE@@ rd.live.ram
         initrd (${voidlive})/boot/initrd
     }
 fi
diff --git a/installer.sh.in b/installer.sh.in
index 6f5a00a..84dbcb0 100644
--- a/installer.sh.in
+++ b/installer.sh.in
@@ -39,7 +39,7 @@ FILESYSTEMS_DONE=
 SYSTEMD_INIT=
 
 TARGETDIR=/mnt/target
-LOG=/dev/tty7
+LOG=/dev/tty8
 CONF_FILE=/tmp/.void-installer.conf
 if [ ! -f $CONF_FILE ]; then
     touch -f $CONF_FILE
@@ -134,7 +134,7 @@ show_disks() {
         fi
     done
     # SATA/SCSI and Virtual disks (virtio)
-    for dev in $(ls /sys/block|grep -E '^([sv]|xv)d'); do
+    for dev in $(ls /sys/block|grep -E '^([sv]|xv)d|mmcblk'); do
         echo "/dev/$dev"
         size=$(cat /sys/block/$dev/size)
         sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size)
@@ -163,24 +163,26 @@ show_partitions() {
                 echo "size:${fssize:-unknown};fstype:${fstype:-none}"
             fi
         done
-        # Software raid (md)
-        for p in $(ls -d /dev/md* 2>/dev/null|grep '[0-9]'); do
-            if cat /proc/mdstat|grep -qw $(echo $p|sed -e 's|/dev/||g'); then
-                fstype=$(lsblk -nfr /dev/$part|awk '{print $2}')
-                fssize=$(lsblk -nr /dev/$p|awk '{print $4}')
-                echo "$p"
-                echo "size:${fssize:-unknown};fstype:${fstype:-none}"
-            fi
-        done
-        if [ ! -e /sbin/lvs ]; then
-            continue
+    done
+    # Software raid (md)
+    for p in $(ls -d /dev/md* 2>/dev/null|grep '[0-9]'); do
+        part=$(basename $p)
+        if cat /proc/mdstat|grep -qw $part; then
+            fstype=$(lsblk -nfr /dev/$part|awk '{print $2}')
+            [ "$fstype" = "crypto_LUKS" ] && continue
+            [ "$fstype" = "LVM2_member" ] && continue
+            fssize=$(lsblk -nr /dev/$part|awk '{print $4}')
+            echo "$p"
+            echo "size:${fssize:-unknown};fstype:${fstype:-none}"
         fi
+    done
+    if [ -e /sbin/lvs ]; then
         # LVM
         lvs --noheadings|while read lvname vgname perms size; do
             echo "/dev/mapper/${vgname}-${lvname}"
             echo "size:${size};fstype:lvm"
         done
-    done
+    fi
 }
 
 menu_filesystems() {
@@ -252,13 +254,13 @@ ${BOLD}NOTE: you don't need this on EFI systems.${RESET}\n\n
 For EFI systems GPT is mandatory and a FAT32 partition with at least\n
 100MB must be created with the TOGGLE \`boot', this will be used as\n
 EFI System Partition. This partition must have mountpoint as \`/boot/efi'.\n\n
-At least 2 partitions are required: swap and rootfs (/).\n
+At least 1 partitions is required for the rootfs (/).\n
 For swap, RAM*2 must be really enough. For / 600MB are required.\n\n
 ${BOLD}WARNING: /usr is not supported as a separate partition.${RESET}\n
 ${RESET}\n" 18 80
         if [ $? -eq 0 ]; then
             while true; do
-                clear; cfdisk $device; PARTITIONS_DONE=1; partx -a $device; partx -u $device
+                clear; cfdisk $device; PARTITIONS_DONE=1
                 break
             done
         else
@@ -297,7 +299,7 @@ set_keymap() {
     if [ -f /etc/vconsole.conf ]; then
         sed -i -e "s|KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/vconsole.conf
     else
-        sed -i -e "s|KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/rc.conf
+        sed -i -e "s|#\?KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/rc.conf
     fi
 }
 
@@ -321,13 +323,14 @@ menu_locale() {
 }
 
 set_locale() {
-    local LOCALE=$(get_option LOCALE)
-
-    sed -i -e "s|LANG=.*|LANG=$LOCALE|g" $TARGETDIR/etc/locale.conf
-    # Uncomment locale from /etc/default/libc-locales and regenerate it.
-    sed -e "/${LOCALE}/s/^\#//" -i $TARGETDIR/etc/default/libc-locales
-    echo "Running xbps-reconfigure -f glibc-locales ..." >$LOG
-    chroot $TARGETDIR xbps-reconfigure -f glibc-locales >$LOG 2>&1
+    if [ -f $TARGETDIR/etc/default/libc-locales ]; then
+        local LOCALE=$(get_option LOCALE)
+        sed -i -e "s|LANG=.*|LANG=$LOCALE|g" $TARGETDIR/etc/locale.conf
+        # Uncomment locale from /etc/default/libc-locales and regenerate it.
+        sed -e "/${LOCALE}/s/^\#//" -i $TARGETDIR/etc/default/libc-locales
+        echo "Running xbps-reconfigure -f glibc-locales ..." >$LOG
+        chroot $TARGETDIR xbps-reconfigure -f glibc-locales >$LOG 2>&1
+    fi
 }
 
 menu_timezone() {
@@ -419,7 +422,7 @@ set_rootpassword() {
 menu_bootloader() {
     while true; do
         DIALOG --title " Select the disk to install the bootloader" \
-            --menu "$MENULABEL" ${MENUSIZE} $(show_disks)
+            --menu "$MENULABEL" ${MENUSIZE} $(show_disks) none "Manage bootloader otherwise"
         if [ $? -eq 0 ]; then
             set_option BOOTLOADER "$(cat $ANSWER)"
             BOOTLOADER_DONE=1
@@ -433,6 +436,8 @@ menu_bootloader() {
 set_bootloader() {
     local dev=$(get_option BOOTLOADER) grub_args=
 
+    if [ "$dev" = "none" ]; then return; fi
+
     # Check if it's an EFI system via efivars module.
     if [ -n "$EFI_SYSTEM" ]; then
         grub_args="--target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=void_grub --recheck"
@@ -470,7 +475,7 @@ configure_wifi() {
     DIALOG --form "Wireless configuration for ${dev}\n(encryption type: wep or wpa)" 0 0 0 \
         "SSID:" 1 1 "" 1 16 30 0 \
         "Encryption:" 2 1 "" 2 16 3 0 \
-        "Password:" 3 1 "" 3 16 30 0 || return 1
+        "Password:" 3 1 "" 3 16 50 0 || return 1
     set -- $(cat $ANSWER)
     ssid="$1"; enc="$2"; pass="$3";
 
@@ -598,7 +603,7 @@ menu_network() {
 }
 
 validate_filesystems() {
-    local mnts dev size fstype mntpt mkfs rootfound swapfound fmt
+    local mnts dev size fstype mntpt mkfs rootfound fmt
     local usrfound efi_system_partition
 
     unset TARGETFS
@@ -767,7 +772,7 @@ umount_filesystems() {
 }
 
 copy_rootfs() {
-    DIALOG --title "Check /dev/tty7 for details" \
+    DIALOG --title "Check $LOG for details" \
         --infobox "Copying live image to target rootfs, please wait ..." 4 60
     LANG=C cp -axvnu / $TARGETDIR >$LOG 2>&1
     if [ $? -ne 0 ]; then
@@ -786,16 +791,22 @@ install_packages() {
 
     _syspkg="base-system"
 
-    mkdir -p $TARGETDIR/var/db/xbps/keys $TARGETDIR/usr/share/xbps
-    cp -a /usr/share/xbps/repo.d $TARGETDIR/usr/share/xbps/
+    mkdir -p $TARGETDIR/var/db/xbps/keys $TARGETDIR/usr/share
+    cp -a /usr/share/xbps.d $TARGETDIR/usr/share/
     cp /var/db/xbps/keys/*.plist $TARGETDIR/var/db/xbps/keys
     mkdir -p $TARGETDIR/boot/grub
-    stdbuf -oL xbps-install  -r $TARGETDIR -Sy ${_syspkg} ${_grub} 2>&1 | \
+
+    _arch=$(xbps-uhelper arch)
+
+    stdbuf -oL env XBPS_ARCH=${_arch} \
+        xbps-install  -r $TARGETDIR -SyU ${_syspkg} ${_grub} 2>&1 | \
         DIALOG --title "Installing base system packages..." \
         --programbox 24 80
     if [ $? -ne 0 ]; then
         DIE 1
     fi
+    xbps-reconfigure -r $TARGETDIR -f base-files >/dev/null 2>&1
+    chroot $TARGETDIR xbps-reconfigure -a
 }
 
 enable_dhcpd() {
@@ -843,20 +854,21 @@ ${BOLD}Do you want to continue?${RESET}" 20 80 || return
         . /etc/default/live.conf
         rm -f $TARGETDIR/etc/motd
         rm -f $TARGETDIR/etc/issue
+        rm -f $TARGETDIR/usr/sbin/void-installer
         # Remove live user.
         echo "Removing $USERNAME live user from targetdir ..." >$LOG
         chroot $TARGETDIR userdel -r $USERNAME >$LOG 2>&1
-        DIALOG --title "Check /dev/tty7 for details" \
+        DIALOG --title "Check $LOG for details" \
             --infobox "Rebuilding initramfs for target ..." 4 60
         echo "Rebuilding initramfs for target ..." >$LOG
-        chroot $TARGETDIR dracut --force >>$LOG 2>&1
-        DIALOG --title "Check /dev/tty7 for details" \
+        # mount required fs
+        mount_filesystems
+        chroot $TARGETDIR dracut --no-hostonly --add-drivers "ahci" --force >>$LOG 2>&1
+        DIALOG --title "Check $LOG for details" \
             --infobox "Removing temporary packages from target ..." 4 60
         echo "Removing temporary packages from target ..." >$LOG
         xbps-remove -r $TARGETDIR -Ry dialog >>$LOG 2>&1
         rmdir $TARGETDIR/mnt/target
-        # mount required fs
-        mount_filesystems
     else
         # mount required fs
         mount_filesystems
@@ -901,7 +913,7 @@ ${BOLD}Do you want to continue?${RESET}" 20 80 || return
             else
                 enable_dhcpd
             fi
-        elif [ -n "$dev" -a -n "$type" = "static" ]; then
+        elif [ -n "$_dev" -a "$_type" = "static" ]; then
             # static IP through dhcpcd.
             mv $TARGETDIR/etc/dhcpcd.conf $TARGETDIR/etc/dhdpcd.conf.orig
             echo "# Static IP configuration set by the void-installer for $_dev." \
diff --git a/isolinux/isolinux.cfg.in b/isolinux/isolinux.cfg.in
index 33ea352..5af8bf6 100644
--- a/isolinux/isolinux.cfg.in
+++ b/isolinux/isolinux.cfg.in
@@ -25,9 +25,9 @@ MENU LABEL @@BOOT_TITLE@@ @@KERNVER@@ @@ARCH@@
 KERNEL /boot/vmlinuz
 APPEND initrd=/boot/initrd root=live:CDLABEL=VOID_LIVE init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=@@KEYMAP@@ locale.LANG=@@LOCALE@@ @@BOOT_CMDLINE@@
 LABEL linuxram
-MENU LABEL @@BOOT_TITLE@@ @@KERNVER@@ @@ARCH@@ (load to RAM)
+MENU LABEL @@BOOT_TITLE@@ @@KERNVER@@ @@ARCH@@ (RAM)
 KERNEL /boot/vmlinuz
-APPEND initrd=/boot/initrd root=live:CDLABEL=VOID_LIVE init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=@@KEYMAP@@ locale.LANG=@@LOCALE@@ @@BOOT_CMDLINE@@ rd.live.ram=1
+APPEND initrd=/boot/initrd root=live:CDLABEL=VOID_LIVE init=/sbin/init ro rd.luks=0 rd.md=0 rd.dm=0 loglevel=4 vconsole.unicode=1 vconsole.keymap=@@KEYMAP@@ locale.LANG=@@LOCALE@@ @@BOOT_CMDLINE@@ rd.live.ram
 LABEL memtest86+
 MENU LABEL memtest86+
 KERNEL /boot/memtest86+
diff --git a/keys/3d:b9:c0:50:41:a7:68:4c:2e:2c:a9:a2:5a:04:b7:3f.plist b/keys/3d:b9:c0:50:41:a7:68:4c:2e:2c:a9:a2:5a:04:b7:3f.plist
new file mode 100644
index 0000000..41bc2cb
--- /dev/null
+++ b/keys/3d:b9:c0:50:41:a7:68:4c:2e:2c:a9:a2:5a:04:b7:3f.plist
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>public-key</key>
+	<data>LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFvM1Nrc2p5N01PMmc4UWxsZjdCVQp1aXhFUWlqN3FOSVJrU0hrWWw4SGxxd1hOczFnK1FzbzhGV3dSbDNMbUpTVW5wT1BaOG1sdVdSajd4Y2pLbnVJCnhPRjBtQS8vM0lzTnVId2dYV2RLL0JiT29wNzFLZmt4aEE0WjhwK0hRbmhLMThxUkFPbG9xOGJ6WXZhaGI2NmEKemdWVTVFM1JzRDU4V0M2ZTFOUVdSSGpiMG1TM2h6M1NxVWVWZFVMT20zVzZBRTdYdWlVQVJOSEdyY1ljMXkyKwpxNjBKWHMrVk5sRlMwaGdDdnpqS3phMVg5cWtzQndzTmdaRlhBcXN1MGFKRndYSTEvM2R4ZWxBcUZFbnRMWVFSCjA4NHpaTDFmWDVRMWlacGNEaHVhTWZVREVZQjA4UzdKTTBYKytibkxxVnphVTZzc0RXdGtzbFJaNjNaVStISTUKemk5a0pyc25LcU5Pa3BKSnJTUkRyMGFvRjV2RDRwN20vYWdZKzdTRk5aaDZzOUJ5V0x3NDVFdytwalVVUmp5aQp6T01TSFhEM3YzczhFdzZkV29wbTVQTGUvUEgzZWFiMEVnbG9yVDZhYmRwaCtaVG4zaUxMWVVkSGNmQ1FDN01GCkNmVGl1TWt4SkJpaCtoOEhKaUlBdmpDZjVxdjZiaFpEUHpGRzAwbEpYRUZwNHRpbGp6eTFmbitiMkdLY3BDOWQKUUs4TEc3M0RFaXhacHBmU09IU09MMWYxVlBzZTBRdnl6d2RWc0xzR0dqV0FaZkw4WUdVZDl4Y20yeW5tVzFuNgpKTjl6NE9oZ3lRa21mNUFFUXpYSUxQR0d1MlREUVh5c05IRG0vUnRMMHJPN3cxbFVKSTVYOW1kbEZYd0xUWHI3ClYrU25aK3U5VCtFREg1NTV6WDJDZTgwQ0F3RUFBUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo=</data>
+	<key>public-key-size</key>
+	<integer>4096</integer>
+	<key>signature-by</key>
+	<string>Void Linux</string>
+</dict>
+</plist>
diff --git a/mkimage.sh.in b/mkimage.sh.in
index 493f359..13e9301 100644
--- a/mkimage.sh.in
+++ b/mkimage.sh.in
@@ -1,6 +1,6 @@
 #!/bin/sh
 #-
-# Copyright (c) 2013 Juan Romero Pardines.
+# Copyright (c) 2013-2015 Juan Romero Pardines.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -41,7 +41,7 @@ cleanup() {
 }
 
 info_msg() {
-    printf "\033[1m$@\n\033[m"
+    printf "\033[1m[${PLATFORM}] $@\n\033[m"
 }
 
 die() {
@@ -102,13 +102,7 @@ if [ "$(id -u)" -ne 0 ]; then
     die "need root perms to continue, exiting."
 fi
 
-IMGSIZE="$2"
-if [ -z "$IMGSIZE" ]; then
-    IMGSIZE="2G"
-else
-    IMGSIZE="${2}G"
-fi
-
+: ${IMGSIZE:=2G}
 : ${BOOT_FSTYPE:=vfat}
 : ${BOOT_FSSIZE:=64M}
 : ${ROOT_FSTYPE:=ext4}
@@ -119,7 +113,7 @@ fi
 
 # double check PLATFORM is supported...
 case "$PLATFORM" in
-    cubieboard2|odroid-u2|rpi);;
+    bananapi|beaglebone|cubieboard2|cubietruck|odroid-u2|rpi|rpi2|usbarmory|*-musl);;
     *) die "The $PLATFORM is not supported, exiting..."
 esac
 
@@ -139,54 +133,81 @@ esac
 info_msg "Creating disk image ($IMGSIZE) ..."
 dd if=/dev/zero of=$FILENAME bs=$IMGSIZE count=1 ${DD_SPARSE} >/dev/null 2>&1
 
+ROOTFSDIR=$(mktemp -d)
+
 info_msg "Creating disk image partitions/filesystems ..."
 parted $FILENAME mktable msdos
 if [ "$BOOT_FSTYPE" = "vfat" ]; then
     _btype="fat32"
-    _args="-I"
+    _args="-I -F16"
 fi
-parted $FILENAME mkpart primary ${_btype} 4096s ${BOOT_FSSIZE}
-parted $FILENAME mkpart primary ext2 ${BOOT_FSSIZE} 100%
-parted $FILENAME toggle 1 boot
-LOOPDEV=$(losetup --show --find $FILENAME)
-partx -a $LOOPDEV
-mkfs.${BOOT_FSTYPE} $_args ${LOOPDEV}p1 >/dev/null
-mkfs.${ROOT_FSTYPE} ${LOOPDEV}p2 >/dev/null 2>&1
+case "$PLATFORM" in
+cubieboard2|cubietruck)
+    parted $FILENAME mkpart primary ext2 2048s ${ROOT_FSSIZE} 100%
+    parted $FILENAME toggle 1 boot
+    LOOPDEV=$(losetup --show --find --partscan $FILENAME)
+    mkfs.${ROOT_FSTYPE} $disable_journal ${LOOPDEV}p1 >/dev/null 2>&1
+    mount ${LOOPDEV}p1 $ROOTFSDIR
+    ROOT_UUID=$(blkid -o value -s UUID ${LOOPDEV}p1)
+    ;;
+*)
+    parted $FILENAME mkpart primary ${_btype} 2048s ${BOOT_FSSIZE}
+    parted $FILENAME mkpart primary ext2 ${BOOT_FSSIZE} 100%
+    parted $FILENAME toggle 1 boot
+    LOOPDEV=$(losetup --show --find --partscan $FILENAME)
+    mkfs.${BOOT_FSTYPE} $_args ${LOOPDEV}p1 >/dev/null
+    case "$ROOT_FSTYPE" in
+        ext[34]) disable_journal="-O ^has_journal";;
+    esac
+    mkfs.${ROOT_FSTYPE} $disable_journal ${LOOPDEV}p2 >/dev/null 2>&1
+    mount ${LOOPDEV}p2 $ROOTFSDIR
+    mkdir -p ${ROOTFSDIR}/boot
+    mount ${LOOPDEV}p1 ${ROOTFSDIR}/boot
+    BOOT_UUID=$(blkid -o value -s UUID ${LOOPDEV}p1)
+    ROOT_UUID=$(blkid -o value -s UUID ${LOOPDEV}p2)
+    ;;
+esac
 
 info_msg "Unpacking rootfs tarball ..."
-ROOTFSDIR=$(mktemp -d)
-mount ${LOOPDEV}p2 $ROOTFSDIR
-mkdir -p ${ROOTFSDIR}/boot
-mount ${LOOPDEV}p1 ${ROOTFSDIR}/boot
-
+if [ "$PLATFORM" = "beaglebone" ]; then
+    fstab_args=",noauto"
+    tar xfp $ROOTFS_TARBALL -C $ROOTFSDIR ./boot/MLO
+    tar xfp $ROOTFS_TARBALL -C $ROOTFSDIR ./boot/u-boot.img
+    touch $ROOTFSDIR/boot/uEnv.txt
+    umount $ROOTFSDIR/boot
+fi
 tar xfp $ROOTFS_TARBALL -C $ROOTFSDIR
 
-BOOT_UUID=$(blkid -o value -s UUID ${LOOPDEV}p1)
-ROOT_UUID=$(blkid -o value -s UUID ${LOOPDEV}p2)
-echo "UUID=$BOOT_UUID /boot $BOOT_FSTYPE defaults 0 0" >> ${ROOTFSDIR}/etc/fstab
-echo "UUID=$ROOT_UUID / $ROOT_FSTYPE defaults 0 1" >> ${ROOTFSDIR}/etc/fstab
-
-if [ -s ${ROOTFSDIR}/boot/cmdline.txt ]; then
-   sed -e "s,rootfstype=ext4,rootfstype=${ROOT_FSTYPE}," -i ${ROOTFSDIR}/boot/cmdline.txt
+fspassno="1"
+if [ "$ROOT_FSTYPE" = "f2fs" ]; then
+    fspassno="0"
+fi
+echo "UUID=$ROOT_UUID / $ROOT_FSTYPE defaults 0 ${fspassno}" >> ${ROOTFSDIR}/etc/fstab
+if [ -n "$BOOT_UUID" ]; then
+    echo "UUID=$BOOT_UUID /boot $BOOT_FSTYPE defaults${fstab_args} 0 2" >> ${ROOTFSDIR}/etc/fstab
 fi
 
-# For cubieboard we need to flash u-boot to the image.
-if [ "$PLATFORM" = "cubieboard2" ]; then
+case "$PLATFORM" in
+bananapi|cubieboard2|cubietruck)
     dd if=${ROOTFSDIR}/boot/u-boot-sunxi-with-spl.bin of=${LOOPDEV} bs=1024 seek=8 >/dev/null 2>&1
-elif [ "$PLATFORM" = "odroid-u2" ]; then
+    ;;
+odroid-u2)
     dd if=${ROOTFSDIR}/boot/E4412_S.bl1.HardKernel.bin of=${LOOPDEV} seek=1 >/dev/null 2>&1
     dd if=${ROOTFSDIR}/boot/bl2.signed.bin of=${LOOPDEV} seek=31 >/dev/null 2>&1
     dd if=${ROOTFSDIR}/boot/u-boot.bin of=${LOOPDEV} seek=63 >/dev/null 2>&1
     dd if=${ROOTFSDIR}/boot/E4412_S.tzsw.signed.bin of=${LOOPDEV} seek=2111 >/dev/null 2>&1
-fi
+    ;;
+usbarmory)
+    dd if=${ROOTFSDIR}/boot/u-boot.imx of=${LOOPDEV} bs=512 seek=2 conv=fsync >/dev/null 2>&1
+    ;;
+esac
 
-umount ${ROOTFSDIR}/boot
+mountpoint -q ${ROOTFSDIR}/boot && umount ${ROOTFSDIR}/boot
 umount $ROOTFSDIR
-partx -d $LOOPDEV
 losetup -d $LOOPDEV
 rmdir $ROOTFSDIR
 
 chmod 644 $FILENAME
-info_msg "Successfully created $FILENAME ($PLATFORM) image."
+info_msg "Successfully created $FILENAME image."
 
 # vim: set ts=4 sw=4 et:
diff --git a/mklive.sh.in b/mklive.sh.in
index d794dfc..86b7f9d 100644
--- a/mklive.sh.in
+++ b/mklive.sh.in
@@ -1,9 +1,9 @@
-#!/bin/bash
+#!/bin/sh
 #
 # vim: set ts=4 sw=4 et:
 #
 #-
-# Copyright (c) 2009-2014 Juan Romero Pardines.
+# Copyright (c) 2009-2015 Juan Romero Pardines.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -26,27 +26,39 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #-
-set -E
-trap "echo; error_out $LINENO $?" INT TERM HUP ERR
+trap "error_out $LINENO $?" INT TERM 0
 
-readonly REQUIRED_PKGS="base-files syslinux grub-x86_64-efi squashfs-tools xorriso memtest86+"
+readonly REQUIRED_PKGS="base-files libgcc dash coreutils sed tar gawk syslinux grub-x86_64-efi squashfs-tools xorriso memtest86+"
+readonly INITRAMFS_PKGS="binutils xz device-mapper"
 readonly PROGNAME=$(basename $0)
 
 info_msg() {
     printf "\033[1m$@\n\033[m"
 }
-
+die() {
+    info_msg "ERROR: $@"
+    error_out 1
+}
+mount_pseudofs() {
+    for f in sys dev proc; do
+        mkdir -p $ROOTFS/$f
+        mount --bind /$f $ROOTFS/$f
+    done
+}
+umount_pseudofs() {
+    umount -f $ROOTFS/sys >/dev/null 2>&1
+    umount -f $ROOTFS/dev >/dev/null 2>&1
+    umount -f $ROOTFS/proc >/dev/null 2>&1
+}
 error_out() {
-    info_msg "There was an error in line $1 ... cleaning up $BUILDDIR, exiting."
-
-    [ -d "$BUILDDIR" ] && rm -rf "$BUILDDIR"
-
-    exit 1
+    umount_pseudofs
+    [ -d "$BUILDDIR" -a -z "$KEEP_BUILDDIR" ] && rm -rf "$BUILDDIR"
+    exit ${1:=0}
 }
 
 usage() {
     cat <<_EOF
-Usage: $(basename $0) [options]
+Usage: $PROGNAME [options]
 
 Options:
  -a <xbps-arch>     Set XBPS_ARCH (do not use it unless you know what it is)
@@ -63,8 +75,9 @@ Options:
 
  -C "cmdline args"  Add additional kernel command line arguments.
  -T "title"         Modify the bootloader title.
+ -K                 Do not remove builddir.
 
-The $(basename $0) script generates a live image of the Void Linux distribution.
+The $PROGNAME script generates a live image of the Void Linux distribution.
 This ISO image can be written to a CD/DVD-ROM or any USB stick.
 _EOF
     exit 1
@@ -74,40 +87,44 @@ copy_void_keys() {
     mkdir -p "$1"/var/db/xbps/keys
     cp keys/*.plist "$1"/var/db/xbps/keys
 }
+
 copy_void_conf() {
-    install -Dm644 data/void-vpkgs.conf "$1"/etc/xbps/virtualpkg.d/void.conf
+    install -Dm644 data/void-vpkgs.conf "$1"/usr/share/xbps.d/void-virtualpkgs.conf
+}
+
+copy_dracut_files() {
+    mkdir -p $1/usr/lib/dracut/modules.d/01vmklive
+    cp dracut/* $1/usr/lib/dracut/modules.d/01vmklive/
 }
 
 install_prereqs() {
     copy_void_conf $VOIDHOSTDIR
-    $XBPS_INSTALL_CMD -r $VOIDHOSTDIR $XBPS_REPOSITORY $XBPS_CACHEDIR -y ${REQUIRED_PKGS} >> $LOGFILE 2>&1
-    if [ $? -ne 0 ]; then
-        info_msg "Failed to install required software, exiting..."
-        error_out
-    fi
+    $XBPS_INSTALL_CMD -r $VOIDHOSTDIR $XBPS_REPOSITORY \
+        $XBPS_HOST_CACHEDIR -y ${REQUIRED_PKGS}
+    [ $? -ne 0 ] && die "Failed to install required software, exiting..."
 }
 
 install_packages() {
-    if [ -n "$BASE_ARCH" ]; then
-        export XBPS_ARCH="$BASE_ARCH"
-    fi
     copy_void_conf $ROOTFS
-    # Check that all pkgs are reachable.
-    ${XBPS_INSTALL_CMD} -r $ROOTFS $XBPS_REPOSITORY $XBPS_CACHEDIR -yn ${PACKAGE_LIST} >>$LOGFILE 2>&1
-    if [ $? -ne 0 ]; then
-        info_msg "Missing required binary packages, exiting..."
-        error_out
-    fi
 
-    ${XBPS_INSTALL_CMD} -r $ROOTFS $XBPS_REPOSITORY $XBPS_CACHEDIR -y ${PACKAGE_LIST} >>$LOGFILE 2>&1
-    ${XBPS_INSTALL_CMD} -r $ROOTFS $XBPS_REPOSITORY $XBPS_CACHEDIR  -yu >>$LOGFILE 2>&1
-    ${XBPS_REMOVE_CMD} -r $ROOTFS $XBPS_CACHEDIR -o >>$LOGFILE 2>&1
+    XBPS_ARCH=$BASE_ARCH ${XBPS_INSTALL_CMD} -r $ROOTFS \
+        $XBPS_REPOSITORY $XBPS_CACHEDIR -yn ${PACKAGE_LIST} ${INITRAMFS_PKGS}
+    [ $? -ne 0 ] && die "Missing required binary packages, exiting..."
+
+    mount_pseudofs
+
+    LANG=C XBPS_ARCH=$BASE_ARCH ${XBPS_INSTALL_CMD} -U -r $ROOTFS \
+        $XBPS_REPOSITORY $XBPS_CACHEDIR -y ${PACKAGE_LIST} ${INITRAMFS_PKGS}
+    [ $? -ne 0 ] && die "Failed to install $PACKAGE_LIST"
+
+    xbps-reconfigure -r $ROOTFS -f base-files >/dev/null 2>&1
+    chroot $ROOTFS env -i xbps-reconfigure -f base-files
 
     # Enable choosen UTF-8 locale and generate it into the target rootfs.
     if [ -f $ROOTFS/etc/default/libc-locales ]; then
         sed -e "s/\#\(${LOCALE}.*\)/\1/g" -i $ROOTFS/etc/default/libc-locales
-        xbps-uchroot $ROOTFS xbps-reconfigure -f glibc-locales >>$LOGFILE 2>&1
     fi
+    chroot $ROOTFS env -i xbps-reconfigure -a
 
     if [ -x installer.sh ]; then
         install -Dm755 installer.sh $ROOTFS/usr/sbin/void-installer
@@ -116,33 +133,36 @@ install_packages() {
     fi
     # Cleanup and remove useless stuff.
     rm -rf $ROOTFS/var/cache/* $ROOTFS/run/* $ROOTFS/var/run/*
-
-    unset XBPS_ARCH
-}
-
-copy_dracut_files() {
-    mkdir -p $1/usr/lib/dracut/modules.d/01vmklive
-    cp dracut/*.sh $1/usr/lib/dracut/modules.d/01vmklive/
 }
 
 generate_initramfs() {
-    # Install required pkgs in a temporary rootdir to create
-    # the initramfs and to copy required files.
-    copy_dracut_files $VOIDHOSTDIR
-    copy_void_conf $VOIDHOSTDIR
-    $XBPS_INSTALL_CMD -r $VOIDHOSTDIR $XBPS_REPOSITORY $XBPS_CACHEDIR -y base-system xz lz4 >>$LOGFILE 2>&1
+    local _args
 
+    copy_dracut_files $ROOTFS
     if [ "$BASE_SYSTEM_PKG" = "base-system-systemd" ]; then
         _args="--add systemd"
     else
         _args="--omit systemd"
     fi
-    xbps-uchroot $VOIDHOSTDIR /usr/bin/dracut --${INITRAMFS_COMPRESSION} \
-        --force-add "vmklive" ${_args} "/boot/initrd" $KERNELVERSION >>$LOGFILE 2>&1
+    chroot $ROOTFS env -i /usr/bin/dracut -N --${INITRAMFS_COMPRESSION} \
+        --add-drivers "ahci" --force-add "vmklive" ${_args} "/boot/initrd" $KERNELVERSION
+    [ $? -ne 0 ] && die "Failed to generate the initramfs"
 
-    mv $VOIDHOSTDIR/boot/initrd $BOOT_DIR
-    cp $VOIDHOSTDIR/boot/vmlinuz-$KERNELVERSION $BOOT_DIR/vmlinuz
-    cp $VOIDHOSTDIR/boot/memtest86+ $BOOT_DIR
+    mv $ROOTFS/boot/initrd $BOOT_DIR
+    cp $ROOTFS/boot/vmlinuz-$KERNELVERSION $BOOT_DIR/vmlinuz
+    cp $ROOTFS/boot/memtest86+ $BOOT_DIR
+}
+
+cleanup_rootfs() {
+    for f in ${INITRAMFS_PKGS}; do
+        revdeps=$(xbps-query -r $ROOTFS -X $f)
+        if [ -n "$revdeps" ]; then
+            xbps-pkgdb -r $ROOTFS -m auto $f
+        else
+            xbps-remove -r $ROOTFS -Ry ${f} >/dev/null 2>&1
+        fi
+    done
+    rm -r $ROOTFS/usr/lib/dracut/modules.d/01vmklive
 }
 
 generate_isolinux_boot() {
@@ -158,7 +178,7 @@ generate_isolinux_boot() {
     sed -i  -e "s|@@SPLASHIMAGE@@|$(basename ${SPLASH_IMAGE})|" \
         -e "s|@@KERNVER@@|${KERNELVERSION}|" \
         -e "s|@@KEYMAP@@|${KEYMAP}|" \
-        -e "s|@@ARCH@@|$(uname -m)|" \
+        -e "s|@@ARCH@@|$BASE_ARCH|" \
         -e "s|@@LOCALE@@|${LOCALE}|" \
         -e "s|@@BOOT_TITLE@@|${BOOT_TITLE}|" \
         -e "s|@@BOOT_CMDLINE@@|${BOOT_CMDLINE}|" \
@@ -171,34 +191,44 @@ generate_grub_efi_boot() {
     sed -i  -e "s|@@SPLASHIMAGE@@|$(basename ${SPLASH_IMAGE})|" \
         -e "s|@@KERNVER@@|${KERNELVERSION}|" \
         -e "s|@@KEYMAP@@|${KEYMAP}|" \
-        -e "s|@@ARCH@@|$(uname -m)|" \
+        -e "s|@@ARCH@@|$BASE_ARCH|" \
         -e "s|@@BOOT_TITLE@@|${BOOT_TITLE}|" \
         -e "s|@@BOOT_CMDLINE@@|${BOOT_CMDLINE}|" \
         -e "s|@@LOCALE@@|${LOCALE}|" $GRUB_DIR/grub_void.cfg
+    mkdir -p $GRUB_DIR/fonts
+    cp -f $GRUB_DATADIR/unicode.pf2 $GRUB_DIR/fonts
 
-    modprobe -q loop
+    modprobe -q loop || :
 
     # Create EFI vfat image.
-    dd if=/dev/zero of=$GRUB_DIR/efiboot.img bs=1024 count=4096  >>$LOGFILE 2>&1
-    mkfs.vfat -F12 -S 512 -n "grub_uefi" "$GRUB_DIR/efiboot.img" >>$LOGFILE 2>&1
+    dd if=/dev/zero of=$GRUB_DIR/efiboot.img bs=1024 count=4096  >/dev/null 2>&1
+    mkfs.vfat -F12 -S 512 -n "grub_uefi" "$GRUB_DIR/efiboot.img" >/dev/null 2>&1
 
     GRUB_EFI_TMPDIR="$(mktemp --tmpdir=$HOME -d)"
     LOOP_DEVICE="$(losetup --show --find ${GRUB_DIR}/efiboot.img)"
-    mount -o rw,flush -t vfat "${LOOP_DEVICE}" "${GRUB_EFI_TMPDIR}" >>$LOGFILE 2>&1
+    mount -o rw,flush -t vfat "${LOOP_DEVICE}" "${GRUB_EFI_TMPDIR}" >/dev/null 2>&1
 
     cp -a $IMAGEDIR/boot $VOIDHOSTDIR
-    xbps-uchroot $VOIDHOSTDIR grub-mkstandalone --directory="/usr/lib/grub/x86_64-efi" \
+    xbps-uchroot $VOIDHOSTDIR grub-mkstandalone -- \
+        --directory="/usr/lib/grub/x86_64-efi" \
         --format="x86_64-efi" \
         --compression="xz" --output="/tmp/bootx64.efi" \
-        "boot/grub/grub.cfg" >>$LOGFILE 2>&1
-    mkdir -p ${GRUB_EFI_TMPDIR}/EFI/boot
-    cp -f $VOIDHOSTDIR/tmp/bootx64.efi ${GRUB_EFI_TMPDIR}/EFI/boot/
+        "boot/grub/grub.cfg"
+    if [ $? -ne 0 ]; then
+        umount "$GRUB_EFI_TMPDIR"
+        losetup --detach "${LOOP_DEVICE}"
+        die "Failed to generate EFI loader"
+    fi
+    mkdir -p ${GRUB_EFI_TMPDIR}/EFI/BOOT
+    cp -f $VOIDHOSTDIR/tmp/bootx64.efi ${GRUB_EFI_TMPDIR}/EFI/BOOT/BOOTX64.EFI
     umount "$GRUB_EFI_TMPDIR"
     losetup --detach "${LOOP_DEVICE}"
     rm -rf $GRUB_EFI_TMPDIR
 }
 
 generate_squashfs() {
+    umount_pseudofs
+
     # Find out required size for the rootfs and create an ext3fs image off it.
     ROOTFS_SIZE=$(du -sm "$ROOTFS"|awk '{print $1}')
     if [ -z "$ROOTFS_FREESIZE" ]; then
@@ -206,23 +236,24 @@ generate_squashfs() {
     fi
     mkdir -p "$BUILDDIR/tmp/LiveOS"
     dd if=/dev/zero of="$BUILDDIR/tmp/LiveOS/ext3fs.img" \
-        bs="$((ROOTFS_SIZE+ROOTFS_FREESIZE))M" count=1 >>$LOGFILE 2>&1
+        bs="$((ROOTFS_SIZE+ROOTFS_FREESIZE))M" count=1 >/dev/null 2>&1
     mkdir -p "$BUILDDIR/tmp-rootfs"
-    mkfs.ext3 -F -m1 "$BUILDDIR/tmp/LiveOS/ext3fs.img" >>$LOGFILE 2>&1
+    mkfs.ext3 -F -m1 "$BUILDDIR/tmp/LiveOS/ext3fs.img" >/dev/null 2>&1
     mount -o loop "$BUILDDIR/tmp/LiveOS/ext3fs.img" "$BUILDDIR/tmp-rootfs"
     cp -a $ROOTFS/* $BUILDDIR/tmp-rootfs/
     umount -f "$BUILDDIR/tmp-rootfs"
     mkdir -p "$IMAGEDIR/LiveOS"
 
-    mksquashfs "$BUILDDIR/tmp" "$IMAGEDIR/LiveOS/squashfs.img" \
-        -comp ${SQUASHFS_COMPRESSION} >>$LOGFILE 2>&1
+    $VOIDHOSTDIR/usr/bin/mksquashfs "$BUILDDIR/tmp" "$IMAGEDIR/LiveOS/squashfs.img" \
+        -comp ${SQUASHFS_COMPRESSION} || die "Failed to generate squashfs image"
     chmod 444 "$IMAGEDIR/LiveOS/squashfs.img"
+
     # Remove rootfs and temporary dirs, we don't need them anymore.
     rm -rf "$ROOTFS" "$BUILDDIR/tmp-rootfs" "$BUILDDIR/tmp"
 }
 
 generate_iso_image() {
-    xorriso -as mkisofs \
+    $VOIDHOSTDIR/usr/bin/xorriso -as mkisofs \
         -iso-level 3 -rock -joliet \
         -max-iso9660-filenames -omit-period \
         -omit-version-number -relaxed-filenames -allow-lowercase \
@@ -232,18 +263,20 @@ generate_iso_image() {
         -no-emul-boot -boot-load-size 4 -boot-info-table \
         -eltorito-alt-boot -e boot/grub/efiboot.img -isohybrid-gpt-basdat -no-emul-boot \
         -isohybrid-mbr $SYSLINUX_DATADIR/isohdpfx.bin \
-        -output "$CURDIR/$OUTPUT_FILE" "$IMAGEDIR" >>$LOGFILE 2>&1
+        -output "$CURDIR/$OUTPUT_FILE" "$IMAGEDIR" || die "Failed to generate ISO image"
 }
 
+XBPS_REPOSITORY=
 #
 # main()
 #
-while getopts "a:b:r:c:C:T:k:l:i:s:S:o:p:h" opt; do
+while getopts "a:b:r:c:C:T:Kk:l:i:s:S:o:p:h" opt; do
     case $opt in
         a) BASE_ARCH="$OPTARG";;
         b) BASE_SYSTEM_PKG="$OPTARG";;
-        r) XBPS_REPOSITORY+="--repository=$OPTARG ";;
+        r) XBPS_REPOSITORY="$XBPS_REPOSITORY --repository=$OPTARG ";;
         c) XBPS_CACHEDIR="--cachedir=$OPTARG";;
+        K) readonly KEEP_BUILDDIR=1;;
         k) KEYMAP="$OPTARG";;
         l) LOCALE="$OPTARG";;
         i) INITRAMFS_COMPRESSION="$OPTARG";;
@@ -256,10 +289,14 @@ while getopts "a:b:r:c:C:T:k:l:i:s:S:o:p:h" opt; do
         h) usage;;
     esac
 done
-shift $(($OPTIND - 1))
+shift $((OPTIND - 1))
+
+ARCH=$(uname -m)
 
 # Set defaults
-: ${XBPS_CACHEDIR:=--cachedir=/var/cache/xbps}
+: ${BASE_ARCH:=$(uname -m)}
+: ${XBPS_CACHEDIR:=-c $(pwd -P)/xbps-cachedir-${BASE_ARCH}}
+: ${XBPS_HOST_CACHEDIR:=-c $(pwd -P)/xbps-cachedir-${ARCH}}
 : ${KEYMAP:=us}
 : ${LOCALE:=en_US.UTF-8}
 : ${INITRAMFS_COMPRESSION:=xz}
@@ -270,12 +307,9 @@ shift $(($OPTIND - 1))
 # Required packages in the image for a working system.
 PACKAGE_LIST="$BASE_SYSTEM_PKG $PACKAGE_LIST"
 
-LOGFILE="$(mktemp -t vmklive-XXXXXXXXXX.log)"
-
 # Check for root permissions.
 if [ "$(id -u)" -ne 0 ]; then
-    echo "Must be run as root, exiting..."
-    exit 1
+    die "Must be run as root, exiting..."
 fi
 
 readonly CURDIR="$PWD"
@@ -295,8 +329,9 @@ ISOLINUX_DIR="$BOOT_DIR/isolinux"
 GRUB_DIR="$BOOT_DIR/grub"
 ISOLINUX_CFG="$ISOLINUX_DIR/isolinux.cfg"
 
-: ${XBPS_REPOSITORY:=--repository=http://repo.voidlinux.eu/current}
+: ${XBPS_REPOSITORY:=--repository=http://repo.voidlinux.eu/current --repository=http://muslrepo.voidlinux.eu/current}
 : ${SYSLINUX_DATADIR:=$VOIDHOSTDIR/usr/share/syslinux}
+: ${GRUB_DATADIR:=$VOIDHOSTDIR/usr/share/grub}
 : ${SPLASH_IMAGE:=data/splash.png}
 : ${XBPS_INSTALL_CMD:=xbps-install}
 : ${XBPS_REMOVE_CMD:=xbps-remove}
@@ -307,28 +342,21 @@ ISOLINUX_CFG="$ISOLINUX_DIR/isolinux.cfg"
 
 mkdir -p $ROOTFS $VOIDHOSTDIR $ISOLINUX_DIR $GRUB_DIR
 
-info_msg "Redirecting stdout/stderr to $LOGFILE ..."
-info_msg "[1/9] Synchronizing XBPS repository data..."
-# Sync index for remote repos first.
+info_msg "[1/8] Synchronizing XBPS repository data..."
 copy_void_keys $ROOTFS
-$XBPS_INSTALL_CMD -r $ROOTFS ${XBPS_REPOSITORY} -S
-cp -a $ROOTFS/* $VOIDHOSTDIR
+copy_void_keys $VOIDHOSTDIR
+XBPS_ARCH=$BASE_ARCH $XBPS_INSTALL_CMD -r $ROOTFS ${XBPS_REPOSITORY} -S
+$XBPS_INSTALL_CMD -r $VOIDHOSTDIR $XBPS_REPOSITORY -S
 
-_linux_series=$($XBPS_QUERY_CMD -r $ROOTFS ${XBPS_REPOSITORY:=-R} -x linux)
-KERNELVERSION=$($XBPS_QUERY_CMD -r $ROOTFS ${XBPS_REPOSITORY:=-R} -p pkgver ${_linux_series})
-KERNELVERSION=$($XBPS_UHELPER_CMD getpkgversion $KERNELVERSION)
+_linux_series=$(XBPS_ARCH=$BASE_ARCH $XBPS_QUERY_CMD -r $ROOTFS ${XBPS_REPOSITORY:=-R} -x linux|head -1)
+_kver=$(XBPS_ARCH=$BASE_ARCH $XBPS_QUERY_CMD -r $ROOTFS ${XBPS_REPOSITORY:=-R} -p pkgver ${_linux_series})
+KERNELVERSION=$($XBPS_UHELPER_CMD getpkgversion ${_kver})
 
-: ${OUTPUT_FILE="hrmpf-$(uname -m)-${KERNELVERSION}-$(date +%Y%m%d).iso"}
+: ${OUTPUT_FILE="hrmpf-${BASE_ARCH}-${KERNELVERSION}-$(date +%Y%m%d).iso"}
 
-#
-# Install required packages to generate the image.
-#
 info_msg "[2/9] Installing software to generate the image: ${REQUIRED_PKGS} ..."
 install_prereqs
 
-#
-# Install live system and specified packages.
-#
 mkdir -p "$ROOTFS"/etc
 [ -s data/motd ] && cp data/motd $ROOTFS/etc
 [ -s data/issue ] && cp data/issue $ROOTFS/etc
@@ -336,42 +364,23 @@ mkdir -p "$ROOTFS"/etc
 info_msg "[3/9] Installing void pkgs into the rootfs: ${PACKAGE_LIST} ..."
 install_packages
 
-export PATH=$VOIDHOSTDIR/usr/bin:$VOIDHOSTDIR/usr/sbin:$PATH
-export LD_LIBRARY_PATH=$VOIDHOSTDIR/usr/lib
-#
-# Generate the initramfs.
-#
 info_msg "[4/9] Generating initramfs image ($INITRAMFS_COMPRESSION)..."
 generate_initramfs
 
-#
-# Generate the isolinux boot.
-#
 info_msg "[5/9] Generating isolinux support for PC-BIOS systems..."
 generate_isolinux_boot
 
-#
-# Generate the GRUB EFI boot.
-#
 info_msg "[6/9] Generating GRUB support for EFI systems..."
 generate_grub_efi_boot
 
-#
-# Generate the squashfs image from rootfs.
-#
-info_msg "[7/9] Generating squashfs image ($SQUASHFS_COMPRESSION) from rootfs..."
+info_msg "[7/9] Cleaning up rootfs..."
+cleanup_rootfs
+
+info_msg "[8/9] Generating squashfs image ($SQUASHFS_COMPRESSION) from rootfs..."
 generate_squashfs
 
-#
-# Generate the ISO image.
-#
-info_msg "[8/9] Generating ISO image..."
+info_msg "[9/9] Generating ISO image..."
 generate_iso_image
 
-info_msg "[9/9] Removing build directory..."
-rm -rf "$BUILDDIR"
-
 hsize=$(du -sh "$CURDIR/$OUTPUT_FILE"|awk '{print $1}')
 info_msg "Created $(readlink -f $CURDIR/$OUTPUT_FILE) ($hsize) successfully."
-
-exit 0
diff --git a/mkrootfs.sh.in b/mkrootfs.sh.in
index acfb58f..bedcb0c 100644
--- a/mkrootfs.sh.in
+++ b/mkrootfs.sh.in
@@ -1,6 +1,6 @@
 #!/bin/sh
 #-
-# Copyright (c) 2013-2014 Juan Romero Pardines.
+# Copyright (c) 2013-2015 Juan Romero Pardines.
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -45,11 +45,13 @@ usage() {
     cat <<_EOF
 Usage: $PROGNAME [options] <platform>
 
-Supported platforms: cubieboard2, odroid-u2, rpi
+Supported platforms: i686, i686-musl, x86_64, x86_64-musl,
+                     dockstar, bananapi, beaglebone, cubieboard2, cubietruck,
+                     odroid-u2, rpi, rpi2 (armv7), usbarmory
 
 Options
     -b <syspkg> Set an alternative base-system package (defaults to base-system)
-    -c <dir>    Set XBPS cache directory (defaults to /var/cache/xbps)
+    -c <dir>    Set XBPS cache directory (defaults to \$PWD/xbps-cachedir-<arch>)
     -C <file>   Full path to the XBPS configuration file
     -h          Show this help
     -p <pkgs>   Additional packages to install into the rootfs (separated by blanks)
@@ -73,7 +75,7 @@ umount_pseudofs() {
 
 run_cmd_target() {
     info_msg "Running $@ for target $_ARCH ..."
-    eval XBPS_TARGET_ARCH=${_ARCH} "$@"
+    eval XBPS_TARGET_ARCH=${_TARGET_ARCH:=${_ARCH}} "$@"
     [ $? -ne 0 ] && die "Failed to run $@"
 }
 
@@ -87,8 +89,9 @@ register_binfmt() {
     if [ "$ARCH" = "${_ARCH}" ]; then
         return 0
     fi
+    mountpoint -q /proc/sys/fs/binfmt_misc || modprobe -q binfmt_misc; mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
     case "${_ARCH}" in
-        armv?l)
+        armv*)
             echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register
             cp -f $(which qemu-arm-static) $rootfs/usr/bin || die "failed to copy qemu-arm-static to the rootfs"
             ;;
@@ -98,9 +101,6 @@ register_binfmt() {
     esac
 }
 
-: ${XBPS_REPOSITORY:=--repository=http://repo.voidlinux.eu/current}
-: ${XBPS_CACHEDIR:=--cachedir=/var/cache/xbps}
-: ${PKGBASE:=base-system}
 #
 # main()
 #
@@ -111,23 +111,48 @@ while getopts "b:C:c:hp:r:V" opt; do
         c) XBPS_CACHEDIR="--cachedir=$OPTARG";;
         h) usage; exit 0;;
         p) EXTRA_PKGS="$OPTARG";;
-        r) XBPS_REPOSITORY="--repository=$OPTARG $XBPS_REPOSITORY";;
+        r) XBPS_REPOSITORY="$XBPS_REPOSITORY --repository=$OPTARG";;
         V) echo "$PROGNAME @@MKLIVE_VERSION@@"; exit 0;;
     esac
 done
 shift $(($OPTIND - 1))
 
 PLATFORM="$1"
+SUBPLATFORM=$PLATFORM
+
+case "$PLATFORM" in
+    i686-musl) _TARGET_ARCH="$PLATFORM"; _ARCH="i386";;
+    i686) _TARGET_ARCH="$PLATFORM"; _ARCH="i386";;
+    x86_64-musl) _TARGET_ARCH="$PLATFORM"; _ARCH="x86_64";;
+    x86_64) _TARGET_ARCH="$PLATFORM"; _ARCH="x86_64";;
+    dockstar) _TARGET_ARCH="armv5tel"; _ARCH="armv5tel";;
+    rpi-musl) _TARGET_ARCH="armv6l-musl"; _ARCH="armv6l";;
+    rpi) _TARGET_ARCH="armv6l"; _ARCH="armv6l";;
+    *-musl) _TARGET_ARCH="armv7l-musl"; _ARCH="armv7l";;
+    *) _TARGET_ARCH="armv7l"; _ARCH="armv7l";;
+esac
+
+: ${XBPS_REPOSITORY:=--repository=http://repo.voidlinux.eu/current --repository=http://muslrepo.voidlinux.eu/current}
+: ${XBPS_CACHEDIR:=--cachedir=$PWD/xbps-cachedir-${_TARGET_ARCH}}
+: ${PKGBASE:=base-system}
 
 if [ -z "$PLATFORM" ]; then
     echo "$PROGNAME: platform was not set!"
     usage; exit 1
 fi
 
+
 case "$PLATFORM" in
-    cubieboard2) _ARCH="armv7l"; QEMU_BIN=qemu-arm-static;;
-    odroid-u2) _ARCH="armv7l"; QEMU_BIN=qemu-arm-static;;
-    rpi) _ARCH="armv6l"; QEMU_BIN=qemu-arm-static;;
+    bananapi*) SUBPLATFORM=${PLATFORM%-*}; QEMU_BIN=qemu-arm-static;;
+    beaglebone*) SUBPLATFORM=${PLATFORM%-*}; QEMU_BIN=qemu-arm-static;;
+    cubieboard2*|cubietruck*) SUBPLATFORM=${PLATFORM%-*}; QEMU_BIN=qemu-arm-static;;
+    dockstar*) SUBPLATFORM=${PLATFORM%-*}; QEMU_BIN=qemu-arm-static;;
+    odroid-u2*) SUBPLATFORM=${PLATFORM%-*}; QEMU_BIN=qemu-arm-static;;
+    rpi2*) SUBPLATFORM=rpi; QEMU_BIN=qemu-arm-static;;
+    rpi*) SUBPLATFORM=${PLATFORM%-*}; QEMU_BIN=qemu-arm-static;;
+    usbarmory*) SUBPLATFORM=${PLATFORM%-*}; QEMU_BIN=qemu-arm-static;;
+    i686*) QEMU_BIN=qemu-i386-static;;
+    x86_64*) QEMU_BIN=qemu-x86_64-static;;
     *) die "$PROGNAME: invalid platform!";;
 esac
 
@@ -143,7 +168,9 @@ for f in chroot tar xbps-install xbps-reconfigure xbps-query; do
         die "$f binary is missing in your system, exiting."
     fi
 done
-
+if ! $QEMU_BIN -version >/dev/null 2>&1; then
+    die "$QEMU_BIN binary is missing in your system, exiting."
+fi
 #
 # Check if package base-system is available.
 #
@@ -156,7 +183,10 @@ run_cmd_target "xbps-query -R -r $rootfs $XBPS_CONFFILE $XBPS_CACHEDIR $XBPS_REP
 
 chmod 755 $rootfs
 
-PKGS="${PKGBASE} ${PLATFORM}-base"
+case "$PLATFORM" in
+    i686*|x86_64*) PKGS="${PKGBASE} grub" ;;
+    *) PKGS="${PKGBASE} ${SUBPLATFORM}-base" ;;
+esac
 [ -n "$EXTRA_PKGS" ] && PKGS="${PKGS} ${EXTRA_PKGS}"
 
 mount_pseudofs
@@ -166,8 +196,10 @@ mount_pseudofs
 run_cmd_target "xbps-install -S $XBPS_CONFFILE $XBPS_CACHEDIR $XBPS_REPOSITORY -r $rootfs -y ${PKGS}"
 
 # Enable en_US.UTF-8 locale and generate it into the target rootfs.
-LOCALE=en_US.UTF-8
-sed -e "s/\#\(${LOCALE}.*\)/\1/g" -i $rootfs/etc/default/libc-locales
+if [ -e $rootfs/etc/default/libc-locales ]; then
+    LOCALE=en_US.UTF-8
+    sed -e "s/\#\(${LOCALE}.*\)/\1/g" -i $rootfs/etc/default/libc-locales
+fi
 
 #
 # Reconfigure packages for target architecture: must be reconfigured
@@ -175,19 +207,19 @@ sed -e "s/\#\(${LOCALE}.*\)/\1/g" -i $rootfs/etc/default/libc-locales
 #
 if [ -n "${_ARCH}" ]; then
     info_msg "Reconfiguring packages for ${_ARCH} ..."
-    register_binfmt
-    run_cmd "xbps-reconfigure -r $rootfs base-directories"
-    run_cmd "chroot $rootfs xbps-reconfigure shadow"
-    if [ "$PKGBASE" = "base-system-systemd" ]; then
-        run_cmd "chroot $rootfs xbps-reconfigure systemd"
-    fi
+    case "$PLATFORM" in
+        i686*|x86_64*)
+            run_cmd "XBPS_ARCH=$_ARCH xbps-reconfigure -r $rootfs base-files"
+            ;;
+        *)
+            register_binfmt
+            run_cmd "xbps-reconfigure -r $rootfs base-files"
+            run_cmd "chroot $rootfs env -i xbps-reconfigure -f base-files"
+            rmdir $rootfs/usr/lib32
+            rm -f $rootfs/lib32 $rootfs/lib64 $rootfs/usr/lib64
+            ;;
+    esac
     run_cmd "chroot $rootfs xbps-reconfigure -a"
-    rmdir $rootfs/usr/lib32
-    rm -f $rootfs/lib32 $rootfs/lib64 $rootfs/usr/lib64
-else
-    if [ "$PKGBASE" = "base-system-systemd" ]; then
-        run_cmd "chroot $rootfs xbps-reconfigure systemd"
-    fi
 fi
 
 #
@@ -211,8 +243,8 @@ if [ -n "${_ARCH}" ]; then
 fi
 
 tarball=void-${PLATFORM}-rootfs-$(date '+%Y%m%d').tar.xz
+run_cmd "tar -cp --posix -C $rootfs . | xz -T0 -9 > $tarball "
 
-run_cmd "tar cp -C $rootfs . | xz -9 > $tarball"
 rm -rf $rootfs
 
 info_msg "Successfully created $tarball ($PLATFORM)"