<?sphp $this->text('pagetitle') ?>
 
Home of the Squeezebox™ & Transporter® network music players.

Opensolaris

From SqueezeboxWiki

Revision as of 13:50, 18 January 2011 by Coutud (Talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Contents

SqueezeCenter Installation on OpenSolaris

The steps to follow to install SqueezeCenter on the latest release of OpenSolaris are a little different from those listed in the more generic Solaris_Installation_Guide. The good news is that mostly they are simpler. You do not need to download any "non-standard" packages from Blastwave: the stock Perl and MySQL delivered by the [OpenSolaris Web Stack project] work just fine. Below are the detailed steps to follow to install SqueezeCenter 7.1 on OpenSolaris.

Specific Version Information

If you are running OpenSolaris 2008.05 and have not updated, you should. It's easy! You can still run SqueezeCenter, but you will need to deal with a couple of OpenSolaris 2008.05 specific things.

Commands in this Guide

Rather than type pfexec all the time, for the rest of the instructions we're going to assume you have assumed the root role. You can do that with pfexec by running a shell under pfexec. You may want to verify your user can assume the root role first with the roles command. You should be able to if this is the user you created during install or you added permissions when creating the user:

jack@opensolaris:~$ roles
root
jack@opensolaris:~$ pfexec bash
jack@opensolaris:~# 

Note the prompt has changed to reflect your new role.

Configure DHCP client

Although OpenSolaris has DHCP turned on when you install it, by default, the OS does not supply its host name to the DHCP router from which it obtains its IP address. This means that other machines on the network can’t contact it by name alone. A couple of config changes can fix this though.

You first need to know the name of your network interface. This varies from machine to machine as the interfaces are named after their drivers, but can easily be seen from the output of the ifconfig command. (Just ignore the loopback interfaces.) Eg:

jack@opensolaris:~#  ifconfig -a 
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
 	inet 127.0.0.1 netmask ff000000  
e1000g0: flags=201004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4,CoS> mtu 1500 index 2
 	inet 172.16.0.51 netmask ffffff00 broadcast 172.16.0.255 
lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
 	inet6 ::1/128  
jack@opensolaris:~#

Next step is to edit the file /etc/default/dhcpagent (which you need to be root to do). Find the following block:

# By default, the DHCP agent does not send out a client identifier 
# (and hence, the chaddr field is used by the DHCP server as the 
# client identifier.)  To make the DHCP agent send a client 
# identifier, set and uncomment the following parameter-value pair. 
# Note that by default this is treated as an NVT ASCII string.  To 
# specify a binary value, prepend "0x" to a sequence of hexadecimal 
# digits (for example, the value 0xAABBCC11 would set the client 
# identifier to the 4-byte binary sequence 0xAA 0xBB 0xCC 0x11). 
# 
# CLIENT_ID=

# By default, the DHCP agent will try to request the hostname currently 
# associated with the interface performing DHCP.  If this option is 
# enabled, the agent will attempt to find a host name in /etc/hostname.<if>, 
# which must contain a line of the form 
# 
#       inet name 
# 
# where "name" is a single RFC 1101-compliant token.  If found, the token 
# will be used to request that host name from the DHCP server.  To prevent 
# this, uncomment the following line.
# 
# REQUEST_HOSTNAME=no

Then uncomment and edit the two lines marked bold above to say:

CLIENT_ID=<hostname>
.
.
.
REQUEST_HOSTNAME=yes

Where <hostname> is the name of the machine.

Then follow the instructions in the comment above the REQUEST_HOSTNAME directive. This is where you need the interface name obtained from ifconfig. (Note that, after the su command below, we stay as root to do the rest of the configuration/install.) Eg:

jack@opensolaris:~# vi /etc/default/dhcpagent 
jack@opensolaris:~# ls /etc/hostname* 
/etc/hostname*: No such file or directory 
jack@opensolaris:~# echo "inet $(hostname)" >> /etc/hostname.e1000g0
jack@opensolaris:~#

Since DHCP configuration changes have been made, you need to get the server to re-request its DHCP info from the DHCP server. This involves running the following commands as root on the console or desktop of the system itself (rather than being remotely logged in).

jack@opensolaris:~# svcadm restart nwam

Finally, check that the /etc/nsswitch.conf file is correctly configured to use DNS (rather than just /etc/hosts) for host lookups. You should see something similar to the following if the OpenSolaris Network Automagic is working as expected:

jack@opensolaris:~# grep ^host /etc/nsswitch.conf 
hosts: files dns # Added by DHCP

The word "dns" should appear there.

Add Unix Groups/Users

The user and group for mysql will be created when you install the MySQL package from OpenSolaris's package repository but you may wish to add a slimsrv group and user. You can either do this through the GUI or create a user account which can't actually log in at the command line.

jack@opensolaris:~# groupadd slimsrv
jack@opensolaris:~# useradd -s /bin/false -g slimsrv -c "SqueezeCenter User" slimsrv
jack@opensolaris:~#

Install and configure MySQL

Now could be a good time to capture your system state in case you want to return to this configuration later. If so, you may wish to create a new boot environment and reboot to it. You can do this with the beadm(1M) command.

Either install MySQL through the Package Manager GUI (System -> Administration -> Package Manager) or from the command line.

jack@opensolaris:~# pkg install SUNWmysql51 SUNWmysql51lib
...
jack@opensolaris:~#

Assume the id of the MySQL user and initialize the database tables:


jack@opensolaris:~# su - mysql
$ bash
bash-3.2$ id
uid=70(mysql) gid=70(mysql)
bash-3.2$ /usr/mysql/5.1/bin/mysql_install_db                            
Installing MySQL system tables...
090822 10:13:44 [Warning] option 'thread_stack': unsigned value 65536 adjusted to 131072
090822 10:13:44 [Warning] option 'thread_stack': unsigned value 65536 adjusted  to 131072
OK
Filling help tables...
090822 10:13:44 [Warning] option 'thread_stack': unsigned value 65536 adjusted to 131072
090822 10:13:44 [Warning] option 'thread_stack': unsigned value 65536 adjusted  to 131072
OK
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/mysql/5.1/bin/mysqladmin -u root password 'new-password'
/usr/mysql/5.1/bin/mysqladmin -u root -h shorter password 'new-password'
Alternatively you can run:
/usr/mysql/5.1/bin/mysql_secure_installation
which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.
See the manual for more instructions.
You can start the MySQL daemon with: 
cd /usr/mysql/5.1 ; /usr/mysql/5.1/bin/mysqld_safe &
You can test the MySQL daemon with mysql-test-run.pl
cd /usr/mysql/5.1/mysql-test ; perl mysql-test-run.pl
Please report any problems with the /usr/mysql/5.1/bin/mysqlbug script!
The latest information about MySQL is available at http://www.mysql.com/
Support MySQL by buying support/licenses from http://shop.mysql.com/


Exit out of the mysql user ID and as your user who has assumed the root role enable the OpenSolaris MySQL service through SMF so we can configure the users and database for use with SqueezeCenter:

bash-3.2$ exit
exit
$ exit
jack@opensolaris:# svcs -a | grep mysql

disabled Jun_13 svc:/application/database/mysql:version_51 disabled 10:12:20 svc:/application/database/mysql:version_50

jack@opensolaris:~# svcadm enable database/mysql:version_51

Now that the daemon is running configure the user and database (substituting a password of your own choosing for "<MysqlAdminPassword>"):

jack@opensolaris:~# /usr/mysql/5.1/bin/mysqladmin -u root password '<MySqlAdminPassword>'
jack@opensolaris:~# /usr/mysql/5.1/bin/mysqladmin -u root -p -h $(hostname) password '<MySqlAdminPassword>'
Enter password: <MySqlAdminPassword>
jack@opensolaris:~#

Now login to the MySQL monitor to create the Squeezecenter database (substituting a password of your own choosing for "<MySqueezePassword>"):

jack@opensolaris:~# /usr/mysql/5.1/bin/mysql -u root -p
Enter password: <MySqlAdminPassword>
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 39
Server version: 5.0.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database squeezecenter;
Query OK, 1 row affected (0.01 sec)

mysql> grant all on squeezecenter.* to squeezecenter identified by '<MySqueezePassword>';
Query OK, 0 rows affected (0.04 sec)

mysql> grant all on squeezecenter.* to 'squeezecenter'@'localhost' identified by '<MySqueezePassword>';
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye
jack@opensolaris:~#

Install other packages (Sun compilers, GCC, LibGD, FreeType, FLAC, etc)

Enter the following:

jack@opensolaris:~# pkg install SUNWgcc sunstudioexpress SUNWtoo SUNWgd2 SUNWfreetype2 SUNWgnu-libiconv SUNWflac
jack@opensolaris:~# ln -s /usr/gnu/lib/libiconv.so.2 /usr/lib/libiconv.so.2
jack@opensolaris:~#

Install Additional Perl Packages

By default, Perl 5 is installed on OpenSolaris. We just need to install some additional packages. Some of the packages won't install without the "force" option and one needs its "make" parameters changed, but they all seem to work well enough for SqueezeCenter to run. Type the following. If this is the first time invoking CPAN, you will need to configure it or go with autoconfigure. You should be able to follow the prompts.

You may wish to try to carry out these instructions without modifying the perl CPAN compilation settings, but if you encounter compilation errors that look like this:

cc: unrecognized option `-KPIC'
cc: language ildoff not recognized
cc: ReadKey.c: linker input file unused because linking not done

You'll need to tell cpan to run make with compiler options that are understood by the Sun compiler (cc). edit /usr/perl5/5.8.4/lib/i86pc-solaris-64int/Config.pm and change the optimize and cccdlflags lines to:

optimize='-O3'
cccdlflags=' '

We will put the MySQL binaries in the path and change the path so the default cc is the Sun Studio compiler. Note that the CPAN script may run assuming the userid you've assumed the root role from, and during it's make test it will try to connect to the test database. Follow the instructions given during the install of DBD::mysql to set up the test access to the database. Note that with 4.010, it says it will use a password during test but actually does not use the password when testing.

Also, note that GD requires some special handling to get the right includes and linking with libiconv.so.2. It also seems to require a particular version, giving an error message of "GD (loaded 2.35, need 2.35)", when using a newer version of GD.

Carry out the CPAN installation as follows:

jack@opensolaris:~# export PATH=/opt/SunStudioExpress/bin:/usr/mysql/5.1/bin:$PATH
jack@opensolaris:~# /usr/perl5/bin/perl -MCPAN -e 'shell'
...
cpan> install Bundle::CPAN
...  (accept many, many dependencies)
cpan> reload cpan
.................................................................
.................................................................
.................................................................
....
199 subroutines redefined
cpan> install Term::ReadKey
...
cpan> install Scalar::Util
...
cpan> install DBI::DBD
...
cpan> install Bundle::DBI
...
cpan> install AppConfig
...
cpan> install DBI
...
cpan> install DBD::mysql
...
cpan> install Compress::Zlib
...
cpan> look L/LD/LDS/GD-2.44.tar.gz
...

Edit the Makefile.PL to remove the "-Wformat=0"

bash-3.2# perl Makefile.PL 
...
bash-3.2# make
...
bash-3.2# make install
...
bash-3.2# exit
...
cpan> q
Lockfile removed.
jack@opensolaris:~#

Install SqueezeCenter

Go to a directory where you store downloads and run the following commands (note, you should always check downloads.slimdevices.com for the most recent version (though new workarounds or issues may present themselves):

jack@opensolaris:~# wget http://downloads.slimdevices.com/SqueezeCenter_v7.3.3/squeezecenter-7.3.3.tgz
...
10:25:59 (112.23 KB/s) - `squeezecenter-7.3.3.tgz' saved [34703870/34703870]

jack@opensolaris:~# gzcat squeezecenter-7.3.3.tgz | tar xvf -
...
jack@opensolaris:~# mkdir /usr/local 2>/dev/null
jack@opensolaris:~# mv squeezecenter-7.3.3 /usr/local
jack@opensolaris:~# ln -s /usr/local/squeezecenter-7.3.3 /usr/local/squeezecenter
jack@opensolaris:~# ln -s /usr/local/squeezecenter /usr/local/slimserver
jack@opensolaris:~# cd /usr/local/squeezecenter
jack@opensolaris:~# export PATH=$PATH:/usr/mysql/5.0/bin
jack@opensolaris:~# cd Slim/Utils/
jack@opensolaris:~# cp Unicode.pm Unicode.pm.bak
jack@opensolaris:~# cat Unicode.pm.bak | sed 's/use Encode::Detect/#use Encode::Detect/g' > Unicode.pm
jack@opensolaris:~# diff Unicode.pm Unicode.pm.bak
40c40
< #use Encode::Detect::Detector;
---
> use Encode::Detect::Detector;
jack@opensolaris:~# cd -
/usr/local/squeezecenter
jack@opensolaris:~# cd Bin
jack@opensolaris:~# cp build-perl-modules.pl build-perl-modules.pl.bak
jack@opensolaris:~# cat build-perl-modules.pl.bak | grep -v Encode::Detect > build-perl-modules.pl
jack@opensolaris:~# diff build-perl-modules.pl build-perl-modules.pl.bak
32a33
>       'Encode::Detect'     => 'Encode-Detect-1.00.tar.gz',
jack@opensolaris:~# cd -
/usr/local/squeezecenter
jack@opensolaris:~# ./Bin/build-perl-modules.pl
...
Please enter a perl binary to use (defaults to /usr/bin/perl)
This must be the same perl binary that you ran this program with -->
Please enter a directory to download files to --> /var/tmp
Downloads will use lwp to fetch tarballs.
...
All done!

jack@opensolaris:~# mkdir cache
jack@opensolaris:~# mkdir Logs
jack@opensolaris:~# mkdir -p prefs/plugin
jack@opensolaris:~# cd MySQL/
jack@opensolaris:~# mv errmsg.sys errmsg.sys.bak
jack@opensolaris:~# cp /usr/mysql/5.0/share/mysql/english/errmsg.sys .
jack@opensolaris:~# cd -
/usr/local/squeezecenter
jack@opensolaris:~# touch slimrun
jack@opensolaris:~# chmod a+x slimrun
jack@opensolaris:~# chown -R slimsrv:slimsrv /usr/local/squeezecenter* /usr/local/slimserver
jack@opensolaris:~# 

Now edit /usr/local/squeezecenter/slimrun to contain the following (with /path/to/music changed as appropriate):

#!/bin/sh

PATH=/usr/sbin:/usr/bin:/usr/ccs/bin:/usr/local/bin:/opt/bin:/usr/mysql/5.0/bin
export PATH

/usr/local/squeezecenter/slimserver.pl --cachedir=/usr/local/squeezecenter/cache --user=slimsrv --group=slimsrv --audiodir=/path/to/music --pidfile=/usr/local/squeezecenter/cache/squeezecenter.pid $*

This script now needs to be run once to generate the default preferences file, which then needs to be edited:

jack@opensolaris:~# ./slimrun
...
jack@opensolaris:~# cp prefs/server.prefs prefs/server.prefs.default
jack@opensolaris:~# grep ^db prefs/server.prefs
dbpassword: 
dbsource: dbi:mysql:hostname=127.0.0.1;port=9092;database=%s
dbusername: slimserver
jack@opensolaris:~#

We now need to edit this to put the actual database connection parameters in. First check the actual MySQL port and socket values:

jack@opensolaris:~# /usr/mysql/5.0/bin/mysql_config --port --socket
3306
/tmp/mysql.sock
jack@opensolaris:~#

Now edit the prefs/server.prefs file to change the lines beginning db to the following (substituting the password your chose above for "<MySqueezePassword>" and the actual port and socket values if they differ from the sample output immediately above):

dbpassword: '<MySqueezePassword>'
dbsource: dbi:mysql:hostname=localhost;port=3306;database=squeezecenter;mysql_socket=/tmp/mysql.sock
dbusername: squeezecenter

Autostart with Service Management Facility (SMF)

(The following comes from [1] and Solaris_Installation_Guide.) Create a manifest for SqueezeCenter:

jack@opensolaris:~# cat <<EOF > /var/svc/manifest/application/squeezecenter.xml
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='squeezecenter'>
  <service name='application/squeezecenter' 
           type='service' 
           version='1'>
    <create_default_instance enabled='false'/>
    <single_instance/>
    <dependency name='name-services' 
                grouping='require_all' 
                restart_on='none' 
                type='service'>
      <service_fmri value='svc:/milestone/name-services' />
    </dependency>
    <dependency name='network' 
                grouping='require_all' 
                restart_on='none' 
                type='service'>
      <service_fmri value='svc:/milestone/network' />
    </dependency>
    <dependency name='local-filesystems' 
                grouping='require_all' 
                type='service' 
                restart_on='none'>
      <service_fmri value='svc:/system/filesystem/local' />
    </dependency>
    <exec_method type='method' 
                 name='start'
                 exec='/usr/local/squeezecenter/slimrun --daemon'
                 timeout_seconds='30' />
    <exec_method type='method' 
                 name='stop'
                 exec=':kill'
                 timeout_seconds='30' />
    <stability value='Unstable' />
    <template>
      <common_name>
        <loctext xml:lang='C'>SqueezeCenter</loctext>
      </common_name>
      <documentation>
        <doc_link name='SlimDevices Home' uri='http://www.slimdevices.com/'/>
      </documentation>
    </template>
  </service>
</service_bundle>
EOF
jack@opensolaris:~#

Finally, import the new manifests:

jack@opensolaris:~# svccfg import /var/svc/manifest/application/squeezecenter.xml
jack@opensolaris:~# svcadm enable application/database/mysql
jack@opensolaris:~# svcadm enable squeezecenter
jack@opensolaris:~#

New Boot Environment post-install

If everything is tested and working fine, this may be another good time to create a new boot environment you can recover to. The command for this is beadm(1M).