CNK's Blog

Upgrading to Yosemite (OsX 10.10)

Upgrading my laptop to Yosemite

We just got new Macs at work - which came with Yosemite preinstalled. There are a few odds and ends that I am not thrilled with, but overall I have found the transition from Lion to be quite smooth. So guess it is time to upgrade my personal laptop - before any more security issues are announced.

I went to the App Store and downloaded the installer and ran it. All seemed to be going well until the point where the installer thought it had “2 minutes left”. Two hours later, I gave up and went to bed, leaving it running. I have no idea when it actually finished but in the morning, my machine was asleep. When I woke it up, I got the odd gray screen overlay, with the blinking gray startup bars near the bottom - like you get when you have run the battery completely out. I was wondering if either the install had failed (probably not, since the screen behind the gray overlay was the new, flat, Yosemite look) or if the machine had overheated and crashed. It got very hot during the install but I had not heard the fan running. I did what I could to leave the bottom of the machine with good airflow so it could cool off but that was all I could do for that issue.

Anyway, despite the odd gray screen, the machine started up OK, let me log in, and then ran some “setting up your new mac” things. Looks OK. I launched the app store and installed the two security updates that have come out since Yosemite launched. I also downloaded the Mac office apps, pages, keynote, numbers….

XCode

I downloaded the newest XCode (6.1) and installed it. The first time it launched, I was asked to allow it to upgrade the device support - which it did and then promptly crashed. When I tried to launch it again, it crashed again. But third time is the charm. It again asked if it could run some (different) updates, but this time, it then gave me the normal XCcode interface. Until I get around to learning iOS programming, I don’t really have much use for the XCode GUI - except for using the iOS simulator as one of the targets for Karma to run JavaScript tests in a browser. The reason I need XCode is for the compiler. To get the command line tools installed, I ran xcode-select --install and agreed to install the command line tools. Then I ran xcodebuild --license. This was supposedly to accept the Xcode license - but just like when I did it for setting up my work machine, I got xcodebuild: error: invalid option '--license'. That Chris said that indicated that I had already accepted the license; not sure about any of that, but it doesn’t seem to have interfered with compiling stuff at work, so I am not going to worry about it.

X11

X11 no longer comes with OsX, but when I tried to use the X11 icon in my dock, it helpfully redirected me to this page which allowed my to download XQuartz 2.7.7 The installer ran just fine and at the end told me I had to log out and back in again to make this the default X11 for my machine.

Homebrew

I should have done a little checking and preparation before I did my upgrade. At least with Mac Ports, you generally can’t run any of the port commands after you have upgraded the OS. This means that it is really hard to figure out which packages you had installed (in particular, which were installed explicitly and which were installed because they were dependencies for something else you asked for) unless you ask for a list before doing the upgrade. While I was looking for blog posts about updating my homebrew-installed software, I found this blog post which explains why my Yosemite upgrade took FOREVER once it got to the 2 minutes left stages. Something about moving /usr/local and then moving all the files back… one by one. Oh well, at least now I know what that was about.

Fortunately, it looks like Homebrew will still basically work after the upgrade. I can run brew list and get a reasonable list of installed packages: emacs, docbook, graphviz, imagemagick, mongodb, mysql, node, postgresql, python, wget, etc. The blog post above recommended running brew doctor which gave me several sets of advice:

  • some broken symlinks to remove with brew prune
  • warnings about unlinked kegs
  • a keg-only formula for libxml2 that is linked into /usr/local
  • a warning that I should run brew update to get the latest formula info

The last one seemed reasonable, so I started there. The output of that command (and some reading of docs and the install script) explained why brew survived my upgrade. Homebrew just uses the system ruby - which is always there and should always run on the installed OS. And it explains why I don’t see separate ‘upgrade homebrew itself’ and ‘update the package list’ commands. Both are taken care of by running brew update which checks out the latest software and package information from Github:

    $ brew update
    Checking out files: 100% (1668/1668), done.
    Updated Homebrew from ef6d160e to d9a69a40.
    ==> New Formulae
    ==> Updated Formulae
    ==> Deleted Formulae

The first piece of advice also seemed reasonable - clean up dangling symlinks:

    $ brew prune
    Pruned 0 dead formulae
    Tapped 36 formulae
    Pruned 30 symbolic links from /usr/local

Then, I ran brew outdated to see what needs updating:

    $ brew outdated
    cairo (1.12.16_1 < 1.14.0)
    cmake (2.8.8, 2.8.12.2, 3.0.2 < 3.1.0)
    emacs (24.1, 24.3 < 24.4)
    ffmpeg (1.2.1, 2.2.3, 2.3.3 < 2.5.2)
    freetype (2.5.3_1 < 2.5.5)
    gettext (0.18.3.2, 0.19.2 < 0.19.4)
    git (1.8.0.2, 1.8.1.4, 2.0.0, 2.1.1 < 2.2.1)
    glib (2.42.0 < 2.42.1)
    gtk+ (2.24.24 < 2.24.25)
    harfbuzz (0.9.35 < 0.9.37)
    icu4c (53.1 < 54.1)
    imagemagick (6.8.0-10, 6.8.9-1, 6.8.9-7 < 6.8.9-8)
    libevent (2.0.21 < 2.0.21_1)
    libgpg-error (1.10, 1.13, 1.16 < 1.17)
    libksba (1.3.0, 1.3.1 < 1.3.2)
    libpng (1.6.10, 1.6.13 < 1.6.16)
    librsvg (2.36.3 < 2.36.3_1)
    libtool (2.4.2 < 2.4.4)
    libxml2 (2.9.1 < 2.9.2)
    mongodb (2.6.1, 2.6.4_1 < 2.6.6)
    mpfr (3.1.2, 3.1.2-p8 < 3.1.2-p10)
    mysql (5.5.25, 5.6.19, 5.6.21 < 5.6.22)
    node (0.10.9, 0.10.28 < 0.10.35)
    openssl (1.0.1e, 1.0.1h, 1.0.1i < 1.0.1j_1)
    postgresql (9.1.4, 9.2.4, 9.3.4, 9.3.5_1 < 9.4.0)
    python (2.7.5, 2.7.7_1, 2.7.8_1 < 2.7.9)
    redis (2.8.9, 2.8.10, 2.8.17 < 2.8.19)
    sqlite (3.7.15.2, 3.7.17, 3.8.4.3, 3.8.6 < 3.8.7.4)
    webp (0.4.0_1 < 0.4.2_1)
    wget (1.13.4, 1.15_1, 1.15_2 < 1.16.1)
    xvid (1.3.2 < 1.3.3)

I think I want to update just about everything. But I am a little concerned about upgrading the databases. Let’s start by pinning them, then upgrading everything else, and then upgrading them one at a time. But first, do they run now?

Looks like mysql is running - I see processes for mysqld_safe and mysqld in ps and I can log in as root and poke around. The postgresql server is not running at the moment and I mostly have not been using it. So I am just going to pin those two packages and upgrade everything else:

    $ brew pin mysql
    $ brew pin posgresql
    $ brew upgrade

    ==> Upgrading 29 outdated packages, with result:
    cairo 1.14.0, cmake 3.1.0, emacs 24.4, ffmpeg 2.5.2, freetype 2.5.5,
    gettext 0.19.4, git 2.2.1, glib 2.42.1, gtk+ 2.24.25, harfbuzz 0.9.37,
    icu4c 54.1, imagemagick 6.8.9-8, libevent 2.0.21_1, libgpg-error 1.17,
    libksba 1.3.2, libpng 1.6.16, librsvg 2.36.3_1, libtool 2.4.4, libxml2
    2.9.2, mongodb 2.6.6, mpfr 3.1.2-p10, node 0.10.35, openssl 1.0.1j_1,
    python 2.7.9, redis 2.8.19, sqlite 3.8.7.4, webp 0.4.2_1, wget 1.16.1,
    xvid 1.3.3

    ==> Not upgrading 2 pinned packages:
    mysql 5.6.22, postgresql 9.4.0

    Error: You must `brew link fontconfig pixman' before cairo can be installed

Then the updates all ran - some giving messages, mostly about how to launch daemons or warning you not to link certain libraries because they would conflict with the OsX versions. To pick up the last few upgrades, I did as suggested and ran brew link fontconfig pixman and then reran brew upgrade. I will save the output of all of these upgrades in case I need to go back to it.

MySQL

The MySQL upgrade is only one minor version different, so I think I’ll try to do that upgrade. About the only database I care about in the current one might be the cardsharp_dev database, so I am not too worried about the data even if there is some strange incompatibility.

    $ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
    $ brew unpin mysql
    $ brew update mysql
    $ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

Logged in and looked around. Seems fine at least at a glance.

Starting and stoping services

While I was looking around for how to stop MySQL before the upgrade, I found two useful resources, this launchctl tutorial and this blog post on a brew command to replace all this: brew services

    $ brew tap homebrew/boneyard
    brew tap homebrew/boneyard
    Cloning into '/usr/local/Library/Taps/homebrew/homebrew-boneyard'...
    remote: Counting objects: 714, done.
    remote: Compressing objects: 100% (4/4), done.
    remote: Total 714 (delta 1), reused 0 (delta 0)
    Receiving objects: 100% (714/714), 171.26 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (335/335), done.
    Checking connectivity... done.
    Tapped 65 formulae

    [08:51 PM] (brazen:~) $ brew services stop mysql
    brew services stop mysql
    Warning: brew services is unsupported and will be removed soon.
    You should use launchctl instead.
    Please feel free volunteer to support it in a tap.

    Stopping `mysql`... (might take a while)
    ==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)

    [08:52 PM] (brazen:~) $ brew services start mysql
    brew services start mysql
    Warning: brew services is unsupported and will be removed soon.
    You should use launchctl instead.
    Please feel free volunteer to support it in a tap.

    ==> Successfully started `mysql` (label: homebrew.mxcl.mysql)

Postgres

Perpahs I should leave it but I would really like to have everything upgraded for the start of the new year. I had trouble getting to old databases after a previous postgres upgrade. So first I want to take a backup. And to do that, I need to start the database server…..

    $ postgres -D /usr/local/var/postgres
    postgres -D /usr/local/var/postgres
    FATAL:  could not open directory "pg_tblspc": No such file or directory

It looks like the [Yosemite upgrade removed a few empty directories] (http://stackoverflow.com/questions/25970132/pg-tblspc-missing-after-installation-of-os-x-yosemite) that we need:

    $ mkdir /usr/local/var/postgres/pg_tblspc
    $ mkdir /usr/local/var/postgres/pg_twophase
    $ mkdir /usr/local/var/postgres/pg_stat_tmp
    $ postgres -D /usr/local/var/postgres
      LOG:  database system was shut down at 2014-10-02 22:09:43 PDT
      LOG:  creating missing WAL directory "pg_xlog/archive_status"
      LOG:  database system is ready to accept connections
      LOG:  autovacuum launcher started

I logged in and looked around. Looks like there are 2 tablespaces (\db) both owned by me - and a single schema (\dn) - also owned by me. What I missed, was how to list the databases: \l. So I missed doing the pg_dump before I upgraded the database. Fortunately there is an upgrade command which I found detailed at https://kkob.us/2014/12/20/homebrew-and-postgresql-9-4/.

    $ mv /usr/local/var/postgres /usr/local/var/postgres9.3
    $ brew unpin postgresql
    $ brew upgrade postgresql
    $ initdb /usr/local/var/postgres -E utf8
    $ pg_ctl -D /usr/local/var/postgres -l logfile start
    server starting
    $ psql
    psql: FATAL:  database "cnk" does not exist
    $ psql
    psql (9.4.0)
    cnk=#

    $ pg_ctl stop
    waiting for server to shut down.... done
    server stopped

    $ pg_upgrade -d /usr/local/var/postgres9.3 -D /usr/local/var/postgres \
     -b /usr/local/Cellar/postgresql/9.3.5_1/bin/ -B /usr/local/Cellar/postgresql/9.4.0/bin/ -v

    ... This did some checks then dumped the old databases:
        alensonline
        cms_dev
        cms_test
        cnk
        marysplace_dev
        marysplace_test
        postgres
        rails_rumble_13_development
        template1

There was a lot more output - and eventually the upgrade failed because I had already created the database ‘cnk’. So let’s remove the new stuff and try again:

    $ rm -rf /usr/local/var/postgres
    $ rm /usr/local/var/pg_upgrade_*
    $ initdb /usr/local/var/postgres -E utf8
    $ pg_upgrade -d /usr/local/var/postgres9.3 -D /usr/local/var/postgres \
     -b /usr/local/Cellar/postgresql/9.3.5_1/bin/ -B /usr/local/Cellar/postgresql/9.4.0/bin/ -v
    ......
    Upgrade Complete
    ----------------
    Optimizer statistics are not transferred by pg_upgrade so,
    once you start the new server, consider running:
        analyze_new_cluster.sh

    Running this script will delete the old cluster's data files:
        delete_old_cluster.sh

The end of the initdb output mentioned it was enabling ‘trust authentication’ for all local connections. I only want my user to be able to log into postgres. So before starting up the database, I edited /usr/local/var/postgres/pg_hba.conf to change the user from ‘all’ to ‘cnk’.

    $ pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/logfile start
    $ psql
    psql (9.4.0)
    Type "help" for help.

    cnk=# \l
                                           List of databases
                Name             | Owner | Encoding |   Collate   |    Ctype    | Access privileges
    -----------------------------+-------+----------+-------------+-------------+-------------------
     alensonline                 | cnk   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
     cms_dev                     | cnk   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
     cms_test                    | cnk   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
     cnk                         | cnk   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
     marysplace_dev              | cnk   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
     marysplace_test             | cnk   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
     postgres                    | cnk   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
     rails_rumble_13_development | Mac   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
     template0                   | cnk   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/cnk           +
                                 |       |          |             |             | cnk=CTc/cnk
     template1                   | cnk   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | cnk=CTc/cnk      +
                                 |       |          |             |             | =c/cnk
    (10 rows)

    cnk=# \c alensonline
    You are now connected to database "alensonline" as user "cnk".
    alensonline=# \d
                      List of relations
     Schema |          Name           |   Type   | Owner
    --------+-------------------------+----------+-------
     public | assets                  | table    | cnk
     public | assets_id_seq           | sequence | cnk

Looks like everything made it.