Installing Solaris 2.6 under QEMU

I’ve been looking at picking up a used Sun Sparcstation from eBay. It occurred to me that I’ve never installed an early version of Solaris before, so wondered if I could give it a try under QEMU since it’s emulates different hardware, including Sparc.

There’s an awesome step by step guide on Adafruit that takes you precisely each step to get Solairs installed un QEMU. You can follow the steps in their article here, so I won’t repeat all the steps here.

The key steps before you get to the install are creating a disk image:

qemu-img create -f qcow2 sparc.qcow2 9663676416

and then booting with the Solaris iso image as the cdrom and the disk image attached:

qemu-system-sparc -M SS-5 -m 128 -drive file=sparc.qcow2,bus=0,unit=0,media=disk -drive file=solaris_2.6_598_sparc.iso,bus=0,unit=2,media=cdrom,readonly=on

After this point it’s following through the steps in the install.

Here’s qemu booting up for the first time:

Here’s the Solaris installer starting up:

After the install had completed, here’s the rather impressive for it’s time CDE desktop:

Updating my AWS Lambda Sudoku Solver to generate new puzzles (part 1)

Having spent some time in the past building an implementation of Donald Knuth’s Algorithm X in Java to solve Sudoku Puzzles, I recently wondered what it would take to modify it to generate new puzzles.

If you missed my previous posts on this investigation, see:

It turns out having a working solver is part of the way there to implementing a puzzle generator, because you need to be able to check if a puzzle has a single solution, since valid puzzles only have 1 solution.

When I last wrapped my Solver as an AWS Lambda, I had taken the naive approach to call System.exit() in my Solver code if I detected there was more than 1 solution as a quick way to exit and not get stuck in a loop iterating over finding possible thousands of solutions for a grid that’s not a valid puzzle.

I went back and took another look at this and reworked it so I could pass an upper limit for number of puzzles, and changed the return type to return a List of solutions, and a flag indicating if there was a single solution or not. Latest commits on my repo have these changes, and I’m now ready to move on to building the puzzle generator. More updates coming soon.

Adding a Silicon Power 512GB SSD to my Mac Pro 2008

TLDR; here’s the main points:

  • Restore a Time Machine backup using Recovery, not from Disk Utils from the MacOS installer
  • If an uninitialized SSD is not visible to Disk Utils, it may show up under ‘diskutils list’
  • If still not visible, put it in a USB drive enclosure where it should get detected, then initialize it

I picked up a cheap $50 512GB SSD to add to my Mac Pro 2008. I already have Windows 10 on one SSD, but decided it was time to replace the WD Blue 5000rpm drive also with an SSD. Backed up El Capitan to Time Machine, and now ready to add the new drive.

I mounted it in a Sabrent 2.5 to 3.5 caddy, and then attached to one of my drive sleds.

I’ve had good luck with new and even refurb drives over the past couple of years, this Silicon Power SSD is the first drive that’s given me issues, as it’s not visible in Disk Utils or even to ‘diskutils list’ which normally detects and lists an installed drive even though it’s not usable. Not knowing if it was the SATA connectors, I removed all my other disks, and moved it between each of the 4 slots, and no go, it was still not detected in MacOS Recovery Disk Utils, either when booted into El Cap, or in Windows 10.

First attempt to see what was going on, I tried downloading Silicon Power’s SP Toolbox software, and Windows Defender says it has a trojan:

Ok, well that’s not good. Uninstalled.

To double check that the drive could be detected on other machines I uninstalled it and moved it to a USB3 external drive enclosure. Windows 10 Disk Management now sees the disk as uninitialized, and pops up a dialog to initialize it as either MBR or GPT. Ok, picked GPT but haven’t formatted it yet. Going to now book back into MacOS Recovery to see if I can format it, and restore my TimeMachine backup. Back in a few mins.

Ok. So I have a Recovery partition that for some reason does not boot. The other option is to boot from an MacOS El Cap bootable USB flash drive and restore from Disk Utils there. I tried this and when I selected the ‘Restore…’ menu option, selected the Time Machine USB drive and the SSD as the target, I ended up restoring a copy of the content of the Time Machine backup onto the SSD, but it’s not bootable. First clue that this happened should have been from the boot menu screen when I had 2 identical orange Time Machine drive icons, and not a new silver bootable disk.

Since I don’t have a working Recovery partition to boot from where the ‘Restore from Time Machine’ option is, I went the long way round and installed El Cap from USB to the new SSD which got it bootable and with a new Recovery partition, then booted to this Recovery partition, selected the ‘Restore from Time Machine’ option, left it restoring over night, and now I have I my previously El Cap install completely transferred to the new SSD, successfully bootable and all. That took way longer than I expected, but now successfully up and running!

El Cap boot time from SSD on this 2008 Mac Pro is about 4 seconds, whereas before from a 5000rpm WD Blue it was at least a minute to get to the desktop… a HUGE improvement!

Running Oracle 19c in a Docker container: part 2: server up and running

Following on from my first attempt to get Oracle 19c running in a Docker container and running out of disk space in my VM, I increased the disk space to 40GB and restarted the steps to build the image. It took about 1.5hrs to complete building and doing the install into the image. Although building an image is a one time activity, unless you’re making changes to the image that’s still a long time, and not something you can do on a regular basis or on demand.

Next, starting up an container from the image, using the provided docker command from the docs:

docker run --name <container name> \
-p <host port>:1521 -p <host port>:5500 \
-e ORACLE_SID=<your SID> \
-e ORACLE_PDB=<your PDB name> \
-e ORACLE_PWD=<your database passwords> \
-e ORACLE_CHARACTERSET=<your character set> \
-v [<host mount point>:]/opt/oracle/oradata \
oracle/database:19.3.0-se2

It then takes around 30mins before the server is actually up and running. At least it gives you some percentage status outputs as it’s starting up, but again, not really practical for starting a server up ondemand or on a whim. For reference, this is on my HP DL380 G7 server with dual 2.4GHz Xeons, running in an Ubuntu 18.04 VM with 4 vCpus and 8GB RAM.

Up and running:

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 24-MAY-2019 04:55:03
Copyright (c) 1991, 2019, Oracle. All rights reserved.
Starting /opt/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait…
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/8363ae964727/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 24-MAY-2019 04:55:04
Uptime 0 days 0 hr. 0 min. 1 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /opt/oracle/diag/tnslsnr/8363ae964727/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully

Prepare for db operation
8% complete
Copying database files
31% complete
Creating and starting Oracle instance
32% complete
36% complete
40% complete
43% complete
46% complete
Completing Database Creation
51% complete
54% complete
Creating Pluggable Databases
58% complete
77% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
/opt/oracle/cfgtoollogs/dbca/ORADB1.
Database Information:
Global Database Name:ORADB1
System Identifier(SID):ORADB1
Look at the log file "/opt/oracle/cfgtoollogs/dbca/ORADB1/ORADB1.log" for further details.
SQL*Plus: Release 19.0.0.0.0 - Production on Fri May 24 05:17:49 2019
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

Created a connection in SQLDeveloper and can connect!