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….
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
compiler. To get the command line tools installed, I ran
--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,
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 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.
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
brew doctor which gave me several sets of
* some broken symlinks to remove with
* 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, 184.108.40.206, 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 (220.127.116.11, 18.104.22.168, 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 (22.214.171.124, 3.7.17, 126.96.36.199, 3.8.6 < 188.8.131.52) 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 184.108.40.206, 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
brew upgrade. I will save the output of all of these
upgrades in case I need to go back to it.
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
$ 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)
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
/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.