Tag Archives: Linux

Sonerezh Album Covers

Sonerezh is a self-hosted music streaming platform that is still fairly young. It works very well, until I recently updated to PHP7. I had to manually update the CakePHP libraries that came with it to get past a error “String is a built in function”. After I fixed that error, I decided to try and get the album cover images working.

By default Sonerezh pulls the album covers from the mp3 files themselves via the ID3 info, but I don’t keep those tags when I clean my mp3 files up I have the album art stored as ‘folder.jpg’ in the album folder itself. So I started to dig around and came up with a simple solution that works for me.

Edit the file SongsController.php inside the app/Controllers folder. Around line 93 or so it starts with pulling the photos out of the ID3 information. I added a new section and commented out the old, as displayed below:

            if (!empty($songInfo['comments']['genre'])) {
                $genre_array_length = count($songInfo['comments']['genre']);
                $newSong['genre'] = $songInfo['comments']['genre'][$genre_array_length - 1];

            $extension = 'jpg';
            $name = md5($newSong['artist'].$newSong['album']);
            $path = IMAGES.THUMBNAILS_DIR.DS.$name.'.'.$extension;

            if (!file_exists($path)) {
                if (!file_exists(IMAGES.THUMBNAILS_DIR)) {
                    new Folder(IMAGES.THUMBNAILS_DIR, true, 0777);
                if (copy("/...music path here.../".$newSong['artist']."/folder.jpg", $path)) {
                    $newSong['cover'] = $name.'.'.$extension;
            if (isset($songInfo['comments']['picture'])) {
                if (isset($songInfo['comments']['picture'][0]['image_mime'])) {
                    $mime = preg_split('/\//', $songInfo['comments']['picture'][0]['image_mime']);
                    $extension = $mime[1];
                } else {
                    $extension = 'jpg';

                $name = md5($newSong['artist'].$newSong['album']);
                $path = IMAGES.THUMBNAILS_DIR.DS.$name.'.'.$extension;

                if (!file_exists($path)) {
                    if (!file_exists(IMAGES.THUMBNAILS_DIR)) {
                        new Folder(IMAGES.THUMBNAILS_DIR, true, 0777);
                    $file = fopen($path, "w");
                    fwrite($file, $songInfo['comments']['picture'][0]['data']);
                $newSong['cover'] = $name.'.'.$extension;

        if (!isset($newSong['title'])) {

Battle.net fails with error “Qt platform plugin”

If your running or trying to run the Battle.net client and getting the error “This application failed to start because it could not find or load the Qt platform plugin “windows”.” then check your WINE prefixes and be sure you are running them in Windows XP mode. Also check if you are using a -staging version of WINE, I have found it works on a non-staging version of WINE but not a staging version.

Wine bug confirmed: https://bugs.winehq.org/show_bug.cgi?id=39985

ArchLinux + Cinnamon + More

Single Encrypted SSD Install

' Create a boot partition (sda1) (set boot flag) 100MB, data partition (sda2).
$ gdisk /dev/sda
$ mkfs -t ext4 /dev/sda1

' Encryption stuff
$ cryptsetup -y -v luksFormat /dev/sda2
$ cryptsetup open /dev/sda2 cryptroot
$ mkfs -t ext4 /dev/mapper/cryptroot

' Mount the partitions to our future chroot
$ mount -t ext4 /dev/mapper/cryptroot /mnt
$ mkdir /mnt/boot
$ mount -t ext4 /dev/sda1 /mnt/boot

We can now install the base packages and a few other things

' Install base packages
$ pacstrap /mnt base base-devel syslinux gdisk

' Generate our base fstab file
$ genfstab -p /mnt >> /mnt/etc/fstab

' Change into new root directory
$ arch-chroot /mnt

Now we can setup the system before the first reboot without the live cd/usb

' Set the hostname
$ echo computer_name > /etc/hostname

' Set the time zone
$ ln -s /usr/share/zoneinfo/zone/subzone /etc/localtime

' Edit the locale file and uncomment relevant locales
$ nano /etc/locale.gen

' Generate the uncommented locales from above
$ locale-gen

' Set your locale preference
$ echo LANG=your_locale > /etc/locale.conf

' Add encrypt hook to mkinitcpio: HOOKS="... encrypt ... filesystems ..."
$ nano /etc/mkinitcpio.conf

' Generate the initial RAM disk
$ mkinitcpio -p linux

' Set the root password
$ passwd

' Install some more packages
$ pacman -S networkmanager zip unzip unrar patch make openssh gcc fuse nvidia nvidia-utils

' Enable NetworkManager in systemd
$ systemctl enable NetworkManager

' Install the boot loader
$ syslinux-install_update -i -a -m

' Edit the syslinux boot loader (fix root stuff, set noop io scheduler)
' APPEND elevator=noop cryptdevice=/dev/sda2:cryptroot:allow-discards root=/dev/mapper/cryptroot rw
$ nano /boot/syslinux/syslinux.cfg

' Edit the fstab file, change root mount to use noatime and discard options
' Setup /tmp on tempfs add line: tmpfs   /tmp         tmpfs   nodev,nosuid,size=2G          0  0
$ nano /etc/fstab

' Reboot the machine
$ reboot

After a clean reboot you should get the Syslinux Boot Loader and then booted into Archlinux, asking for the encryption key

' Login as root

' Check networking
$ ip addr
$ ping

' Edit pacman configuration uncomment multilib repo
$ nano /etc/pacman.conf

' Update pacman databases
$ pacman -Syu

' Lets get more packages and cinnamon now
$ pacman -S cinnamon playonlinux firefox xorg-xinit vim gvfs gvfs-smb wget lib32-libldap gnome-terminal gnome-keyring

' Edit some files to fix a few things and setup environment
' fuse.conf uncomment only two configuration values
$ nano /etc/fuse.conf

' Edit which users/groups can sudo
$ visudo

' Create a local non-root user
$ useradd -g users -G disk lp wheel games dbus network video audio optical floppy storage power -m zharvek

' Set a password for that user
$ passwd zharvek

Lets reboot again and login as our new user, you probably don’t have to reboot here but I do

' Login as non-root user

' Copy xinitrc to profile
$ cp /etc/X11/xinit/xinitrc ~/.xinitrc

' Edit .xinitrc file to set cinnamon as desktop environment: exec cinnamon-session
$ nano ~/.xinitrc

' I like to change the font engines and stuff before I load the desktop first
$ cd /tmp
$ wget https://aur.archlinux.org/cgit/aur.git/snapshot/freetype2-ubuntu.tar.gz
$ wget https://aur.archlinux.org/cgit/aur.git/snapshot/fontconfig-ubuntu.tar.gz
$ wget https://aur.archlinux.org/cgit/aur.git/snapshot/ttf-ms-fonts.tar.gz

' Lets extract these packages
$ tar zxf freetype2-ubuntu.tar.gz
$ tar zxf fontconfig-ubuntu.tar.gz
$ tar zxf ttf-ms-fonts.tar.gz

' Lets build these packages
$ cd freetype2-ubuntu
$ makepkg
$ sudo pacman -U freetype2-ubuntu...filename
$ cd ../fontconfig-ubuntu
$ makepkg
$ sudo pacman -U fontconfig-ubuntu...filename
$ cd ../ttf-ms-fonts
$ makepkg
$ sudo pacman -U ttf-ms-fonts...filename

' Change back to home
$ cd ~

' Start the desktop environment cinnamon
$ startx

We can then get some games going for instance

' Create a games folder, I like putting it in a root area to be clean and easy
$ sudo mkdir /games

' We need to give file permissions to the folder
$ sudo chmod 775 /games
$ sudo chown root:games /games

' You should be able to write to that folder now (your in the games group right?)
' Copy WoW to the games folder

' Lets setup a wine prefix for WoW
$ playonlinux

' Download latest version of wine and wine-staging both x64 (Battle.net bombs on staging, game runs best on staging)
' Error: "This application failed to start because it could not find or load the Qt platform plugin "windows"."
' You will get this error if your wine prefixes are NOT Windows XP.
' You will get this error if your running the "Battle.net" prefix with a -staging version of WINE!
' Wine bug confirmed: https://bugs.winehq.org/show_bug.cgi?id=39985

' Create two new prefixes, "Battle.net" and "Warcraft"
' Run winecfg on the "Warcraft" prefix
' Set CSMT enabled on "Warcraft" prefix
' Disable the d3d11 library on "Warcraft" prefix
' Run winecfg on "Battle.net" prefix
' Disable the dbghelp library on "Battle.net" prefix (answer yes to important question)

' Run 'World of Warcraft Launcher.exe' in the "Battle.net" prefix to allow updates and such
' Run 'Wow-64.exe' in the "Warcraft" prefix to play game with CSMT enabled.
' Setup scripts to do this for both programs. Using WINEARCH=win64 and WINEPREFIX= to prefixes

--- Game Start Script ---
WINEDEBUG=-all WINEARCH=win64 force_s3tc_enable=true __GL_THREADED_OPTIMIZATIONS=1 WINEPREFIX=~/.PlayOnLinux/wineprefix/Warcraft /home/zharvek/.PlayOnLinux/wine/linux-amd64/-staging/bin/wine /games/World\ of\ Warcraft/Wow-64.exe
--- Game End Script ---

--- Battle.net Start Script ---
WINEDEBUG=-all WINEARCH=win64 WINEPREFIX=~/.PlayOnLinux/wineprefix/Battle.net /home/zharvek/.PlayOnLinux/wine/linux-amd64//bin/wine /games/World\ of\ Warcraft/World\ of\ Warcraft\ Launcher.exe
--- Battle.net End Script ---

I install a few more applications

' Text editor, archive manager, stuff...
$ sudo pacman -S gedit file-roller ttf-liberation quodlibet gimp redshift freerdp remmina gtk-engine-murrine gtk-theme-arc

Tweak some settings

' Firefox first

' Open options from menu button, click Content on left.
' Default Font: Times New Roman; 16
' Proportional: Serif; 16
' Serif: Times New Roman
' Sans-serif: Arial
' Monospace: Courier New; 13

' Add your own addons, uBlock Origin, signin to Sync if you use, config custom sync server if you use

' Tweak the console
' I prefer gray text on black background, size around 100x40.

' Edit bash profile to create tmpfs firefox profile directory
$ nano ~/.bash_profile

' Add line: mkdir -p /tmp/profile
' Make a symbolic link to tmpfs profile directory from current profile
$ cd ~/.cache/mozilla/firefox
$ ln -s /tmp/profile ulw90aed.default (use profile folder)

' Install CK Kernel
' Install CK Repo
' Use http://repo-ck.com/ information
$ sudo nano /etc/pacman.conf

' Update pacman cache
$ sudo pacman -Syy

' Check your board type and install (also choose nvidia driver)
' https://wiki.archlinux.org/index.php/Repo-ck
$ sudo pacman -S ck-ivybridge

' Update syslinux (boot loader)
' LABEL arch-ck
'    MENU LABEL Arch Linux CK
'    LINUX ../vmlinuz-linux-ck
'    APPEND elevator=bfq cryptdevice=/dev/sda2:cryptroot:allow-discards root=/dev/mapper/cryptroot rw
'    INITRD ../initramfs-linux-ck.img

' Check default kernel
' DEFAULT arch-ck

Remove non-CK kernel

' Remove old kernel to save space on /boot
$ sudo pacman -R linux nvidia

Updating Kolab 3.1 or 3.2 to 3.3

I have recently updated my Kolab Groupware install from version 3.2 to version 3.3, there are not a ton of new features but I wanted to see if this would be a huge process or go fairly quickly.

First of all, take a backup. Really take a backup. You never know what your going to blow up with Kolab updates. Sometime they work great, and they are getting better. Just do it. At the very least backup your IMAP store. If you are like me at all and have your IMAP mounted over NFS, stop the Cyrus service and unmount the IMAP store.

Also, I am using CentOS 6 this guide will be based on that, the fixes at the end might apply though if you are not running CentOS 6.

Here is what I did, also I will list a few things I did to fix some issues.

Backup the server. I use VMWare ESX so I made a snapshot.

Stop the Cyrus Server.
service cyrus-imapd stop

I unmounted the IMAP store since I use NFS.
umount /var/spool/imap

Follow this guide (I will copy it’s content below, possibly with some differences).

Update your CentOS Installation

# cd /etc/yum.repos.d/
# rm Kolab*.repo
# wget http://obs.kolabsys.com/repositories/Kolab:/3.3/CentOS_6/Kolab:3.3.repo
# wget http://obs.kolabsys.com/repositories/Kolab:/3.3:/Updates/CentOS_6/Kolab:3.3:Updates.repo
# yum update

FILE TO EDIT: /etc/kolab/kolab.conf
Replace example.org with your LDAP and installation primary domain name.

sharedfolder_acl_entry_attribute = acl
modifytimestamp_format = %Y%m%d%H%M%SZ

delegate_sender_header = True
alias_sender_header = True
sender_header = True
xsender_header = True
cache_uri = 

modules = resources, invitationpolicy, footer
kolab_invitation_policy = ACT_ACCEPT_IF_NO_CONFLICT:example.org, ACT_MANUAL

If you’re planning to make use of wallace please make sure wallace is enabled to start using chkconfig on RHEL/Centos or /etc/default/wallace on debian.

# service kolab-server restart
# service wallace restart

FILE TO EDIT: /etc/kolab-freebusy/config.ini
Instead of editing the configuration by hand it’s easier to just recreate the configuration using the setup-kolab tool. Your choice.
This step did not work for me, but I do not use freebusy!

# cp /etc/kolab-freebusy/config.ini.rpmnew /etc/kolab-freebusy/config.ini
# setup-kolab freebusy

FILE TO EDIT: /etc/roundcubemail/config.inc.php
The plugins where correct on my server excepting adding the new ones, kolab_notes and kolab_tags.

Change the plugin load order the follwing way:

    move kolab_auth to the top position
    move kolab_config after kolab_addressbook
    add kolab_notes after kolab_folders
    add kolab_tags after kolab_notes
$config['use_secure_urls'] = true;
$config['assets_path'] = '/roundcubemail/assets/';

FILE TO EDIT: /etc/roundcubemail/password.inc.php
Change the password driver from ldap to ldap_simple.

$config['password_driver'] = 'ldap_simple';

FILE TO EDIT: /etc/roundcubemail/kolab_files.inc.php
Update the kolab_files_url to /chwala/ to be protocol independent.
This would not work for me, I kept my old setup.

$config['kolab_files_url'] = '/chwala/';

FILE TO EDIT: /etc/iRony/dav.inc.php
The iRony configuration doesn’t have anything special configurations. You might want to consider just to take the new default config file or change it based on the differences between the previous version.
For me, nothing changed from 3.2 to 3.3 but you should check.

# cp /etc/iRony/dav.inc.php.rpmnew /etc/iRony/dav.inc.php

FILE TO EDIT: /etc/postfix/ldap/virtual_alias_maps_sharedfolders.cf
To fix the handling of resource invitations you’ve to adjust your existing virtual alias maps, otherwise you end up with non-delivery-reports.
I just had to add the last part.
query_filter = (&(|(mail=%s)(alias=%s))(objectclass=kolabsharedfolder)(kolabFolderType=mail))

FILE TO EDIT: /etc/postfix/master.cf
This will put wallace as the next content-filter after the mail has been returned from amavis to postfix. If you’re don’t want to make use of iTip processing or resource management you can skip this section.

[...]     inet        n       -       n       -       100     smtpd
    -o cleanup_service_name=cleanup_internal
    -o content_filter=smtp-wallace:[]:10026
    -o local_recipient_maps=

Restart Postfix

# service postfix restart

Update MySQL Database
Connect to MySQL, use the password you use for SQL on that server.

# mysql -u root -p -D kolab
-- Table structure for table `ou_types`

/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `ou_types` (
  `key` text NOT NULL,
  `name` varchar(256) NOT NULL,
  `description` text NOT NULL,
  `attributes` longtext NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
/*!40101 SET character_set_client = @saved_cs_client */;

-- Dumping data for table `ou_types`

/*!40000 ALTER TABLE `ou_types` DISABLE KEYS */;
INSERT INTO `ou_types` VALUES (1,'unit','Standard Organizational Unit','A standard organizational unit definition','{\"auto_form_fields\":[],\"fields\":{\"objectclass\":[\"top\",\"organizationalunit\"]},\"form_fields\":{\"ou\":[],\"description\":[],\"aci\":{\"optional\":true,\"type\":\"aci\"}}}');
/*!40000 ALTER TABLE `ou_types` ENABLE KEYS */;

-- Table structure for table `sharedfolder_types`

DROP TABLE IF EXISTS `sharedfolder_types`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `sharedfolder_types` (
  `key` text NOT NULL,
  `name` varchar(256) NOT NULL,
  `description` text NOT NULL,
  `attributes` longtext NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
/*!40101 SET character_set_client = @saved_cs_client */;

-- Dumping data for table `sharedfolder_types`

LOCK TABLES `sharedfolder_types` WRITE;
/*!40000 ALTER TABLE `sharedfolder_types` DISABLE KEYS */;
INSERT INTO `sharedfolder_types` VALUES (1,'addressbook','Shared Address Book','A shared address book','{\"auto_form_fields\":[],\"fields\":{\"kolabfoldertype\":[\"contact\"],\"objectclass\":[\"top\",\"kolabsharedfolder\"]},\"form_fields\":{\"acl\":{\"type\":\"imap_acl\",\"optional\":true,\"default\":\"anyone, lrs\"},\"cn\":[]}}'),(2,'calendar','Shared Calendar','A shared calendar','{\"auto_form_fields\":[],\"fields\":{\"kolabfoldertype\":[\"event\"],\"objectclass\":[\"top\",\"kolabsharedfolder\"]},\"form_fields\":{\"acl\":{\"type\":\"imap_acl\",\"optional\":true,\"default\":\"anyone, lrs\"},\"cn\":[]}}'),(3,'journal','Shared Journal','A shared journal','{\"auto_form_fields\":[],\"fields\":{\"kolabfoldertype\":[\"journal\"],\"objectclass\":[\"top\",\"kolabsharedfolder\"]},\"form_fields\":{\"acl\":{\"type\":\"imap_acl\",\"optional\":true,\"default\":\"anyone, lrs\"},\"cn\":[]}}'),(4,'task','Shared Tasks','A shared tasks folder','{\"auto_form_fields\":[],\"fields\":{\"kolabfoldertype\":[\"task\"],\"objectclass\":[\"top\",\"kolabsharedfolder\"]},\"form_fields\":{\"acl\":{\"type\":\"imap_acl\",\"optional\":true,\"default\":\"anyone, lrs\"},\"cn\":[]}}'),(5,'note','Shared Notes','A shared Notes folder','{\"auto_form_fields\":[],\"fields\":{\"kolabfoldertype\":[\"note\"],\"objectclass\":[\"top\",\"kolabsharedfolder\"]},\"form_fields\":{\"acl\":{\"type\":\"imap_acl\",\"optional\":true,\"default\":\"anyone, lrs\"},\"cn\":[]}}'),(6,'file','Shared Files','A shared Files folder','{\"auto_form_fields\":[],\"fields\":{\"kolabfoldertype\":[\"file\"],\"objectclass\":[\"top\",\"kolabsharedfolder\"]},\"form_fields\":{\"acl\":{\"type\":\"imap_acl\",\"optional\":true,\"default\":\"anyone, lrs\"},\"cn\":[]}}'),(7,'mail','Shared Mail Folder','A shared mail folder','{\"auto_form_fields\":[],\"fields\":{\"kolabfoldertype\":[\"mail\"],\"objectclass\":[\"top\",\"kolabsharedfolder\",\"mailrecipient\"]},\"form_fields\":{\"acl\":{\"type\":\"imap_acl\",\"optional\":true,\"default\":\"anyone, lrs\"},\"cn\":[],\"alias\":{\"type\":\"list\",\"optional\":true},\"kolabdelegate\":{\"type\":\"list\",\"autocomplete\":true,\"optional\":true},\"kolaballowsmtprecipient\":{\"type\":\"list\",\"optional\":true},\"kolaballowsmtpsender\":{\"type\":\"list\",\"optional\":true},\"kolabtargetfolder\":[],\"mail\":[]}}');
/*!40000 ALTER TABLE `sharedfolder_types` ENABLE KEYS */;

Go ahead and restart the server now to load stuff, you don’t really have to I suppose.

Stuff I fixed/updated/changed to make stuff work….

The assets will not load, images, css and such on roundcube web interface:

Edit /etc/roundcubemail/config.inc.php and change

$config['assets_path'] = '/roundcubemail/assets/';


$config['assets_path'] = '/assets/';

Still no assets, using SSL? No images and stuff? Let’s check your Apache configuration. I had to add an Include line in the ssl.conf

Edit /etc/httpd/conf.d/ssl.conf
I just added the Include line below, your setup may be different as some people use a VHOST some use SSL some use mod_ssl (like me) some use other SSL setups. Some people need to include the roundcubemail.conf and some won’t.

#SSLRequire (    %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
#            and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
#            and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
#            and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
#            and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20       ) \
#           or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/

Include conf.d/roundcubemail.conf

#   SSL Engine Options:

Okay, I also use a custom port number with my setup to access the web, it’s SSL but it’s not on port 443. You need to turn off secure_urls and change a PHP variable.
Edit /etc/roundcubemail/config.inc.php

$config['use_secure_urls'] = false;

Edit /usr/share/roundcubemail/program/include/rcmail_output_html.php
Line ~187. You can see I changed the $_SERVER line to be HTTP_HOST this will catch the custom port.

                $base = implode('/', $_base);

            $path = (rcube_utils::https_check() ? 'https' : 'http') . '://'
                . $_SERVER['HTTP_HOST'] . $base . '/' . $path;

        $this->assets_path = $path;
        $this->set_env('assets_path', $path);

Do you use the files portion of Kolab and it’s not working? Lets check our configuration for Chwala.

Edit /usr/share/roundcubemail/config/kolab_files.inc.php
Here is my file, check the top lines, the URL fields. I at one point needed to specify HTTPS, maybe you do. I no longer need to.

Have an android device or other Exchange client that you know supports sub-folders and user created folders and they never show up? Do the emails all clump together in the inbox? Try this.

Edit /usr/share/kolab-syncroton/lib/kolab_sync_data_email.php
Line ~108. Change the windowsoutlook15 to android

    public function __construct(Syncroton_Model_IDevice $device, DateTime $syncTimeStamp)
        parent::__construct($device, $syncTimeStamp);

        $this->storage = rcube::get_instance()->get_storage();

        // Outlook 2013 support multi-folder
        //$this->ext_devices[] = 'windowsoutlook15';
        $this->ext_devices[] = 'android';

        if ($this->asversion >= 14) {
            $this->tag_categories = true;

Make sure you go into roundcube settings, and then folders. Check the new folders are checked. Then settings and ActiveSync and under your device check the new folders as well.

After everything was good, I was still getting some odd errors with the notes portion. I could make a new Noteboot in Roundcube and add notes there, but I could not add or move notes into the primary notebook ‘Notes’ I kept getting an error. My androids could not add or read notes from it either. Very odd. After poking around I figured it’s probably something with the IMAP storage portion. I was right for my issue, and this is what I did.

Login to kolab server using SSH or console as root and then change user to cyrus.

su - cyrus

If you get an error with that command, then you need to probably check the login shell for cyrus. I changed the users login shell to bash.

usermod -s /bin/bash cyrus

Once you are running as Cyrus we need to reconstruct the IMAP mailbox.

cd /usr/lib/cyrus-imapd
./reconstruct -r user/test.user

For me the user/test.user was user/username@domain.net

While here I also ran

./cyr_expire -E 3 -D 3 -X 3

To remove some deleted crap and clear out stuff.

Elder Scrolls Online on Linux

Got a beta invite for ESO and of course I wanted to get it running in Linux.

Little about my setup: I use PlayOnLinux on ArchLinux to manage my wine versions and to contain the bottles. I do not use it to do anything else honestly.

Here is how I got it running on my install…

I installed the game on a Windows machine at first, as wine has some bugs with the installer. There is a patch available to your wine version if you want to install it directly. This site might help you with that patch http://blog.internetz.me/2014/02/28/eso-install-linux-kali-also-works-ubuntudebian/

I then copied over the entire folder structure to my system to my revodrive I have mounted in /revodrive. (You can skip this. It is for me specifically.)

I told PlayOnLinux to download 1.7.11 x86 version of wine.

I then create the prefix to hold this bottle.

$ WINEARCH=win32 WINEPREFIX=~/.PlayOnLinux/wineprefix/ESO /home/username/.PlayOnLinux/wine/linux-x86/1.7.11/bin/wine winecfg

I then create a link from that bottle to my revodrive. (You can skip this. It is for me specifically.)

$ cd ~/home//.PlayOnLinux/wineprefix/ESO/drive_c/Program\ Files
$ ln -s /revodrive/Zenimax\ Online Zenimax\ Online

You can copy your entire “Zenimax Online” folder to the bottles Program Files directory.

I needed to install a few things.

$ sudo pacman -S lib32-libxml2

We need to install VC Runtimes 2010 into the bottle, you can have PlayOnLinux do this.
We need to install DirectX into the bottle, you can have the Installer do this.

I used PlayOnLinux to install the vcruntime2010 in the bottle.

We should now re-run the ESO installer to set some stuff up.

$ cd ~/Downloads
$ wget https://elderscrolls-a.akamaihd.net/products/BNA_Launcher/Install_ESO_Beta.exe
$ WINEARCH=win32 WINEPREFIX=~/.PlayOnLinux/wineprefix/ESO /home/username/.PlayOnLinux/wine/linux-x86/1.7.11/bin/wine ~/Downloads/Install_ESO_Beta.exe

Tell it to install in the default path, and it will complain that it already exists. This is fine, just continue. Once it’s done installing uncheck the VS2010 runtimes box, uncheck the Play Game box and keep the DirectX box checked. Click finish and let it install DirectX into the bottle for you.

Now we need to create a script file to run the game correctly, just like we did with Skyrim on Linux.

$ nano ~/.PlayOnLinux/wineprefix/ESO/drive_c/eso.cmd

Place this in the eso.cmd file

CD \Program Files\Zenimax Online\The Elder Scrolls Online\game\client

Then we can run the game with (I put this in a shell script to make it easy.)

$ WINEARCH=win32 WINEPREFIX=~/.PlayOnLinux/wineprefix/ESO /home/username/.PlayOnLinux/wine/linux-x86/1.7.11/bin/wine cmd.exe /c C://eso.cmd

Run the command or script, you should get some errors and the game might run. Once you can close the game, do so. It should create a folder in the My Documents called “Elder Scrolls Online” under here we have two folders now “ESO_BUILD_BRANCH” and “live” go into the “live” folder and edit or create a file named “UserSettings.txt”. If it does not exist create it and add one line

SET GraphicsDriver.7 "OPENGL"

If the file does exist open it and find a similar line, change it to the above.

Load up the game and check your resolution settings. I set mine but it did not take effect. Exit the game, edit the “UserSettings.txt” file again and find the resolution lines, change to your preference.

You should be able to run the game now.

I had some trouble after logging in joining the game world, it seems like other games it does not like running through my VPN. I bypassed my VPN and used my direct WAN by allowing to bypass the VPN.

If you get an error similar to the following you need to change to OPENGL mode as it’s trying DirectX mode. Also, the last error is resolved by running with the script above, or another way that changes to the working directory and running the eso.exe

fixme:d3d11:D3D11CreateDevice stub: adapter (nil), driver_type D3D_DRIVER_TYPE_HARDWARE, swrast (nil), flags 0x20, feature_levels 0x33fccc, levels 0x1, sdk_version 7, device 0x28e4dd8, feature_level 0x28e4ddc, context 0x33fcd0
fixme:win:EnumDisplayDevicesW ((null),0,0x33f6d8,0x00000000), stub!
fixme:d3d:swapchain_init The application requested more than one back buffer, this is not properly supported.
Please configure the application to use double buffering (1 back buffer) if possible.
fixme:ole:CoInitializeSecurity ((nil),-1,(nil),(nil),0,3,(nil),0,(nil)) - stub!
fixme:wbemprox:client_security_SetBlanket 0xf3c82318, 0x3934ed8, 10, 0, (null), 3, 3, (nil), 0x00000000
fixme:wbemprox:client_security_Release 0xf3c82318
fixme:win:EnumDisplayDevicesW ((null),0,0x33eec8,0x00000000), stub!
Launching Crash Handler:
EXE : ZoCrashReporter.exe
Args: en \\.\pipe\ZoCrashReport\eso\c06c67ad Local\ZoCrashReport.SyncEvent.eso.c06c67ad "C:/users/username/My Documents/Elder Scrolls Online/live/Errors/"
PID: 22
fixme:heap:HeapSetInformation (nil) 1 (nil) 0
Requesting Dump
Waiting on Child Process
Saving the details of your error...

Some people might have issues with a certificate error. Here is what you do.

$ cd /usr/share/ca-certificates/
$ sudo mkdir custom
$ sudo nano /usr/share/ca-certificates/custom/Thawte_CS_CA_G2.crt

Paste this into the file


Save the file and exit. Then edit

$ sudo nano /etc/ca-certificates.conf

add to the bottom of the file


Then update the certificates store.

$ sudo update-ca-certificates

Post Navigation