Solaris 10 / 11の動作検証環境を仮想マシンKVM上に作成してみた

## はじめに

Solaris 10 と 11 の動作検証環境を仮想マシン KVM 上に作成してみました。

元々 macOS の VirtualBox で Solaris の仮想マシンを動かしていたのですが、遅まきながら macOS 13 (Ventura) にアップデートしたら、VirtualBox 6 系が非対応で、最新の VirtualBox 7 系にアップデートしたら、（Solaris 10 は動くのに）Solaris 11 が動かなくなって、どちらも Oracle 製品のくせになんでやと思いながら、諦めて Ubuntu 22.04 の KVM で Solaris を動かすことにしたという経緯です。ちなみに Ubuntu 23.04 がリリースされてるのに 今更 22.04 なのは LTS だからです（頻繁に物理マシンの OS をアップデートしたくない人）。

Solaris を仮想マシン上で動かすのは難しい印象で Windows 10 の Hyper-V でも Solaris 動かなかったんですよね（Windows もまだ 11 にアップデートしていない）。今思うと最初から KVM で構築していればよかったのですが、検索しても KVM で Solaris が動くのかどうかはっきりせず、試すのが面倒で放置していたのですが、やってみたら思ったよりもすんなり動きました。

## 前提

基本コンセプトは「最小の設定項目で実現する」です。

- ホストOS: Ubuntu Server 22.04.2 LTS
  - `virsh` や `virt-install` コマンドを使い可能な限り CLI で作業を行う
  - ゲスト OS のインストール時は VNC 接続で行う
- ゲストOS: Solaris 10 1/13 と Solaris 11.4.42 CBE
  - ネットワーク内の他のマシンから接続できるようにブリッジ接続にする
  - ゲストOSのIPアドレスはルータのDHCPサーバーから固定のIPアドレスを割り当てる

Ubuntu マシンは以前は Windows マシンが壊れたときに代替のデスクトップマシンとして使えるように Desktop 版をインストールしていたのですが、Mac マシンもあるし使うのはいつも ssh 経由の CLI のみで GUI デスクトップを使うことはほとんどなかったので、少し前に更新を兼ねて Server 版に入れ替えました。

というか Ubuntu 18.04 から普通に `do-release-upgrade` したら起動しなくなったんですよ。 FakeRAID 周りが変更されていて SSD が認識しなくなり・・・、こちらには重要なデータは入ってなかったので再インストールしました。

## ホスト OS (Ubuntu) の設定

Ubuntu 22.04.2 Server を再インストールしているので、ホスト OS の環境設定から行っています。ホスト OS 側の設定は、一般的な仮想マシンサーバーとしての設定で Solaris に関連するものはありません。

### KVM 関連のパッケージのインストール

```console
$ sudo apt install qemu-kvm libvirt-daemon-system # KVM サーバー関連
$ sudo apt install libvirt-clients virtinst libosinfo-bin # CLI ツール
$ sudo apt install virt-top bridge-utils guestfs-tools # 便利ツール（なくても良い）
```

### IPv6 の無効化

IPv6 のアドレスは長くて覚えられず、セキュリティに関する追加の考慮事項が増えてしまうので無効にしています。IPv6 を無効にしない場合はこの設定は不要です。IPv6 を無効にする方法はいくつかありますが、今回は grub の設定で行うことにしました。

```ini:/etc/default/grub への変更項目
GRUB_CMDLINE_LINUX="ipv6.disable=1"
```

設定ファイルの変更を有効にするために以下のコマンドを実行し再起動します。

```console
$ sudo update-grub
```

### ネットワーク（ブリッジ）の設定

Ubuntu では 17.10 から Netplan を使ったネットワーク設定が行われています。Ubuntu のインストール時にインストーラー(subiquity) によって `00-installer-config.yaml` が生成されているのでそれを書き換えます。新たに別のファイルを追加しても良いのですが、内容がそれほど多くもなく頻繁に変更するようなものでもないので、今回は生成された設定ファイルを以下のように変更しました。Netplan の設定項目については [Netplan documentation](https://netplan.readthedocs.io/en/stable/) を参照してください。

```yaml:/etc/netplan/00-installer-config.yaml
network:
  version: 2
  ethernets:
    eno1:
      dhcp4: true          # IP アドレスは DHCP サーバー側で設定する
      optional: true       # ネットワーク未接続時に起動が遅くなることの回避
  bridges:
    br0:
      interfaces:
        - eno1
      dhcp4: true
      optional: true
```

設定ファイルに IP アドレスをごちゃごちゃ書きたくないので、DHCP サーバーで一元管理しており IPアドレスを MAC アドレスから静的に割り当てています。`optional` はマシン起動時にネットワークケーブルが抜けていたりすると、ネットワーク設定のタイムアウトで起動が遅くなるために入れています。上記の設定ファイルには省略していますが、実はこのマシンはネットワークアダプタが二つ付いていて、片方はケーブルを接続していないので必ずタイムアウトで起動が遅くなってしまうのです。eno1 は通常はケーブルが接続されているからなくてもよいのですが、マシンのメンテナンスでケーブルを外した状態で起動したりする場合に備えています。

ブリッジの設定に関する注意点ですが、デフォルトでは元のネットワークインターフェース (eno1) とは異なる IP アドレスがブリッジ (br0) に割り当てられてしまいます。これはブリッジに元のネットワークインターフェースとは異なる MAC アドレスが割り当てられてしまうからです。対策の一つは br0 の MAC アドレスを元のネットワークインターフェースの MAC アドレスと同じに設定することですが、設定ファイルに MAC アドレスを書きたくなかったので、元のネットワークインターフェースの MAC アドレスをブリッジに継承させることにしました。

ブリッジに新しい MAC アドレスを割り当てる動作は systemd で行われています。この動作に関するデフォルトの設定ファイルは `/usr/lib/systemd/network/99-default.link` ですが、このファイルはパッケージに含まれているファイルなので直接編集してはいけません。パッケージの更新時などで置き換えられてしまう場合があります。正しいやり方は `/etc` 以下に上書き用の設定ファイルを作成します。今回は設定ファイル全体を変更するのではなく、一部の項目のみを変更するので差分のドロップインファイルを新規作成しています。元の設定ファイルの名前に `.d/任意の名前.conf` をつけた名前が、元の設定ファイルのドロップインファイルとして扱われます。

```ini:/etc/systemd/network/99-default.link.d/mac-address-policy.conf
[Link]
MACAddressPolicy=none
```

元の設定ファイルと合わせて正しくファイルが認識されているかは、`systemd-analyze cat-config` で確認することができます。

```console
$ systemd-analyze cat-config systemd/network/99-default.link
# /usr/lib/systemd/network/99-default.link
（内容は省略）

# /etc/systemd/network/99-default.link.d/mac-address-policy.conf
[Link]
MACAddressPolicy=none
```

正しくブリッジが作成されていれば以下のような出力が得られるはずです。今回作成したブリッジは `br0` です。`virbr0` は KVM がデフォルトで作成する NAT 用のブリッジでそのまま残していますが、おそらく私は使用しないでしょう。

```console
$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.e840f20bbcb1       no              eno1
virbr0          8000.525400b29734       yes
```

### ゲスト OS 用の VNC サーバーの設定 （qemu.conf)

ゲスト OS の通常利用には ssh を利用しますが、最初のインストール時となにかのメンテナンスで使用するための VNC の標準設定を `/etc/libvirt/qemu.conf` に以下の設定を加えました。この内容は私が必要だったので設定したもので必要ない人には不要です。またここに設定を加えなくても仮想マシン側の設定で行うこともできます。

```awk:/etc/libvirt/qemu.conf への変更項目
# メンテナンス用に使う仮想マシンではVNC接続用のデフォルトのパスワード
# 動作検証用の仮想マシンで自分しか使わないので共通のパスワードで十分
vnc_password = "password" # 実際には自分が決めたパスワード

# VNCで使用するポート番号をデフォルトの 5900 ではなく 5901 以上に変更
# 5900 は別の用途で使用しているのでスキップする
remote_display_port_min = 5901
```

`qemu.conf` を変更した後に再起動する

```console
$ sudo systemctl restart libvirtd
```

なお VNC を使うのはメンテナンス時のみなのでポート番号は自動割当にし、必要なときにその都度調べることにします。ゲスト OS に割り当てられた VNC サーバーのポート番号を調べるには `virsh vncdisplay` を使います。以下の場合、VNC サーバーのポート番号が 5900 を加えた 5902 になります。

```console
$ virsh vncdisplay solaris11
:2
```

### ホストOS再起動時のゲストOSの停止と起動の設定 (libvirt-guests)

ホスト OS を再起動する時にゲスト OS の起動状態を考えたくないので、ホスト OS の停止時に自動的にゲスト OS をサスペンドし、ホスト OS の起動時にゲスト OS を復旧するように変更しました。設定ファイル `/etc/default/libvirt-guests` に以下の項目を追加（修正）しています。

```ini:/etc/default/libvirt-guests への変更項目
ON_BOOT=start
ON_SHUTDOWN=suspend
```

## 仮想マシンの作成とゲストOSのインストール

仮想マシンは `virt-install` コマンドを使って作成します。ゲスト OS は `--cdrom` 指定してをISO イメージからインストールし、インストール作業は VNC で接続して行います。これが Linux であれば `--location` を指定してディレクトリツリーや URL からシリアルコンソール経由でインストールできるのですが、Linux 以外だと頑張ればできるのかもしれませんが大変そうです。VNC を使うのはインストール時と想定外の問題が出た時のメンテナンスのときぐらいなので諦めます。

まずゲスト OS の ISO イメージを置くディレクトリを決めます。場所はどこでも良いのですが libvert のプロセスがアクセスできる必要があります。 Ubuntu では以前はホームディレクトリのデフォルトのパーミッションが 755 だったのが、Ubuntu 21.04 から 750 に変更されており、ホームディレクトリ以下に置いた ISO イメージを libvert のプロセスが読み取ることができません。`/tmp` 以下に置いたりすればよいのですが、この際 ISO イメージを置くディレクトリを作成することにします。というのも ISO イメージを置くディレクトリは libvert のストレージプールとして管理対象になってしまうからです。さすがに `/tmp` ディレクトリをストレージプールとして扱いたくはないなあと言った所です。ISO イメージを置く場所は `/var/isos` にしました。もちろんパーミッションは 755 です。あとは Solaris の ISO イメージを `/var/isos` ディレクトリにおいて `virt-install` コマンドを実行するだけです。

### Solaris 11.4 のインストール

最新版である Solaris 11.4 のインストールは実に簡単です。

#### 仮想マシンの作成

まず Oracle のサイトから [Oracle Solaris 11.4](https://www.oracle.com/jp/solaris/solaris11/downloads/solaris-downloads.html) の ISO イメージをダウンロードます。現時点で 2018年8月にリリースされた 11.4.0 GA と、2022年2月に更新された 11.4.42 CBE の二つのバージョンが配布されています。バージョンについての詳細は「[Solaris 10の延長サポート終了が2025年に伸びていた話とSolarisのバージョンのまとめ](https://qiita.com/ko1nksm/items/ca55d725a588ad99afdb)」を参照してください。インストールに必要なファイルは以下のとおりです。 Oracle Solaris 11.4.42 CBE のファイル名は分かりづらいのでダウンロードした後に変更しています。

- <strong>Oracle Solaris 11.4.0 GA （2018年8月版）</strong>
  - x86 Text Installer (742 MB)
  - ファイル名: `sol-11_4-text-x86.iso`
  - solaris パブリッシャーのロケーションの初期値
    - `http://pkg.oracle.com/solaris/release/`
- <strong>Oracle Solaris 11.4.42 CBE （2022年2月版）</strong>
  - Oracle Solaris 11.4.42.111.0 Interactive Text Install ISO (x86)<br>　for (Oracle Solaris on x86-64 (64-bit)), 890.5 MB
  - ファイル名  `V1019840-01.iso`
    - → わかりやすく `sol-11_4_42-text-x86-V1019840-01.iso` に変更する
  - solaris パブリッシャーのロケーションの初期値
    - `https://pkg.oracle.com/solaris/support/` (SRU用）
    - パッケージをインストールするにはサポート契約が必要

Solaris 11 は 11.3 まで Live イメージとテキストインストーラーがあったのですが、11.4 ではテキストインストーラーのみに変更されています。テキストインストーラーには GUI デスクトップは含まれておらず、必要な場合は OS のインストール後に `pkg install solaris-desktop` でネットワークからインストールします。

通常は 11.4.42 CBE をインストールすると良いと思うのですが、solaris パブリッシャーのロケーションのデフォルトが support になっているので注意が必要です。これは SRU 用のロケーションでパッケージをインストールするのにサポート契約が必要になるので、無償で使う場合は release に切り替える必要があります（11.4.0 GA では最初から release です）。また 11.4.42 CBE はインストール時に 4GB ではメモリ不足になったので、多めのメモリを割り当てて（必要なければ）後から減らす必要があります。時間がかかりますが 11.4.0 GA をインストールしてからアップデートする方法もあります。具体的な方法については後述しています。

以下の方法でインストールします。11.4.0 GA、11.4.42 CBE どちらか好きな方を選んでください。もちろん両方インストールしても構いません。その場合は `--name` を別々のものに変更してください。

```sh
# Solaris 11.4.0 GA の場合
virt-install --name sol11 --osinfo solaris11 \
  --vcpus 1 --memory 4096 --disk size=20 --network bridge=br0 \
  --cdrom /var/isos/sol-11_4-text-x86.iso \
  --graphics vnc,listen=0.0.0.0,keymap=ja --noautoconsole

# Solaris 11.4.42 CBE の場合
virt-install --name sol11 --osinfo solaris11 \
  --vcpus 1 --memory 6144 --disk size=20 --network bridge=br0 \
  --cdrom /var/isos/sol-11_4_42-text-x86-V1019840-01.iso \
  --graphics vnc,listen=0.0.0.0,keymap=ja --noautoconsole

# 参考 Solaris 11.3 の場合（ISO ファイル以外同じ）
virt-install --name sol11.3 --osinfo solaris11 \
  --vcpus 1 --memory 4096 --disk size=20 --network bridge=br0 \
  --cdrom /var/isos/sol-11_3-text-x86.iso \
  --graphics vnc,listen=0.0.0.0,keymap=ja --noautoconsole
```

もし作成途中で失敗したり作り直したいときには、次のコマンドで削除できます。

```sh
# 起動している仮想マシンの強制停止と仮想マシン（データ含む）の削除
virsh destroy sol11; virsh undefine sol11 --remove-all-storage
```

#### インストール開始

Solaris 11.4 のインストーラーは簡素で簡単な説明に答えていくだけです。パーティションはデフォルトで、すべて `/` に割り当ててくれるので、それでよければ何もする必要はありません。動作検証環境としては十分です。

#### インストール完了後

インストールが完了した時点で `sshd` が起動しており、インストール時に一般ユーザーを作成したならば、`ssh` でログインでき `sudo` コマンドも使える状態になっています。Solaris に割り当てられた IP アドレスは `ifconfig` コマンドで調べることができます（IP アドレスは下記の `10.0.0.131`。私は覚えやすくグループを作りやすいのでクラスAのプライベートIPアドレスを使用しています）。

```console:Solaris に割り当てられた IP アドレスの確認方法
$ ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
net0: flags=100001004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4,PHYSRUNNING> mtu 1500 index 2
        inet 10.0.0.131 netmask ffff0000 broadcast 10.0.255.255
lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
        inet6 ::1/128
net0: flags=120002004841<UP,RUNNING,MULTICAST,DHCP,IPv6,PHYSRUNNING> mtu 1500 index 2
        inet6 fe80::5045:ff:fe61:3ce1/10
```

11.4.42 CBE をインストールした場合は、パッケージをインストールできるように solaris パブリッシャーのロケーションを release に変更します。11.4.0 GA をインストールした場合は、必要なら 11.4.42 CBE にアップデートします。

```sh
# パブリッシャーの確認
$ sudo pkg publisher
PUBLISHER         TYPE     STATUS P LOCATION
solaris           origin   online F https://pkg.oracle.com/solaris/support/

# 11.4.42 CBE の solaris のパブリッシャーをreleaseに変更する
$ sudo pkg set-publisher -G '*' -g http://pkg.oracle.com/solaris/release/ solaris

# パッケージをインストールする方法
$ sudo pkg install git

# 11.4.0 GA から 11.4.42 CBE にアップデートする方法
$ sudo pkg update --accept
```

### Solaris 10 1/13のインストール

Solaris 10 系がリリースされたのは 2005年1月31日です。最終バージョンの Solaris 10 1/13 でも 2013年2月と 10 年前なので今更インストールする意味はあまりないのでしょうが、現時点でまだサポートが切れておらず（[延長サポートは 2025年まで](https://qiita.com/ko1nksm/items/ca55d725a588ad99afdb)）、今も Bourne シェルが `/bin/sh` として使われている数少ない OS の一つで、POSIX シェルのベースとなった ksh88 が使える環境であるため、私にとってはシェルスクリプトの最も古い動作検証環境という点で重要な意味があります。

#### 仮想マシンの作成

まず Oracle のサイトから [Oracle Solaris 10 1/13](https://www.oracle.com/solaris/solaris10/downloads/solaris10-get-jsp-downloads.html) の ISO イメージをダウンロードし、`/var/isos/sol-10-u11-ga-x86-dvd.iso` に保存します。そして次のコマンドでインストールを開始します。

```sh
virt-install --name sol10 --osinfo solaris10 \
  --vcpus 1 --memory 4096 --disk size=20 --network bridge=br0 --video=qxl \
  --cdrom /var/isos/sol-10-u11-ga-x86-dvd.iso \
  --graphics vnc,listen=0.0.0.0,keymap=ja --noautoconsole
```

もし作成途中で失敗したり作り直したいときには、次のコマンドで削除できます。

```sh
# 起動している仮想マシンの強制停止と仮想マシン（データ含む）の削除
virsh destroy sol10; virsh undefine sol10 --remove-all-storage
```

`--video`（ビデオデバイス）に関して少し注意点があります。Solaris 10 のデフォルトの `vga` の場合、マウスカーソルの位置が VNC と仮想マシンの中の画面とでズレてしまいます。その結果画面の左上以外をクリックするのが困難になってしまいます。タブレットを追加すれば直るみたいな話をみたのですが、標準で追加されている状態で問題が発生しています。実際の所、私は GUI を使うことはほぼ無いのですが、このようなことを調べる人も少なそうなのでついでに回避方法を調べました。結論を言うと `qxl` か `virtio` を使えば良さそうです。それぞれ調べた結果を以下にまとめておきます。

| video model     | 症状        |   | video model          | 症状                 |
| --------------- | ----------- | - |--------------------- | -------------------- |
| `vga`, `vmvga`  | ずれる       |   | `xen`, `vbox`, `gop` | 指定できない          |
| `qxl`, `virtio` | **問題なし** |   | `bochs`, `ramfb`     | 起動しない、画面が広い |
| `cirrus`        | 実行時エラー |   | `none`               | `vga` として扱われる？ |

~~`qxl` でも `virtio` でも時々一時的に画面が固まる症状が出ているのですが、これは私の環境の問題の可能性があり~ます（熱？で時々ネットワークが不調になるので）。~~ LAN ケーブルに問題があったようです。

#### インストール開始

インストールを開始すると次のような画面になるので、一番上の「Oracle Solaris」を選択します。

```
GNU GRUB version 0.97 (639K lower 7 3144576K upper memory)

Oracle Solaris
Oracle Solaris Serial Console ttya
Oracle Solaris Serial Console ttyb (for 1x50, v6Ox and v65x)

Use the ↑ and ↓ keys to select which entry is highlighted.
Press enter to boot the selected 0S, ’e’ to edit the
commands before booting, or ’c’ for a command-line.
```

次の画面で 1 を選ぶと GUI（日本語可）によるインストールが可能です。ZFS を使いたい場合は 3 または 4 になるようです。3 を選ぶと GUI が起動した上でターミナル上でテキストインストーラー（日本語可）が動作し、4 を選ぶとテキストでのインストールになります。私は一番軽そうな 4 を選びましたが、どうもパーティションの設定メニューがおかしな挙動をしているような感じがするので 1 を使うのが簡単でしょう。1 の方が細かいカスタマイズもできるようです。

```sh
SunOS Release 5.10 Version Gener ic_147148-26 64-bit
Copyright (c) 1963, 2013, Oracle and/or its affiliates. All rights reserved.
Configuring devices.

1. Oracle Solaris Interactive (default)
2. Custom JumpStart
3. Oracle Solaris Interactive Text (Desktop session)
4. Oracle Solaris Interactive Text (Console session)
   (Select option 3 or 4 to install a ZFS root file system)
5. Apply driver updates
6. Single user shell

Enter the number of your choice.
```

インストーラーの設定内容はありきたりなものですし、探せば他に解説しているところもあるので詳細は省略します。以下を参照してください。

- [Solaris 10 10/09インストール ガイド(基本編)](https://docs.oracle.com/cd/E19253-01/821-0609/821-0609.pdf)
- [Oracle Solaris 10を使ってみよう（インストール手順書）](https://www.fujitsu.com/jp/documents/products/computing/servers/unix/sparc/technical/document/00_solaris_operation.pdf)

簡単な注意点のみを羅列します。

- ネームサービスはおそらく「None」で良いと思います。
- 日本語設定のデフォルトは「EUC (ja_JP.eucJP)」です。「C.UTF-8」は無いようです。
- 日本語 UTF-8 を使う場合は明示的に「ja_JP.UTF-8」を追加する必要があります。

#### インストールパッケージの選択

インストールするパッケージは予め用意された構成から選びます。以下のインストール構成が用意されています（文章は「[Solaris 10 10/09インストール ガイド(基本編)](https://docs.oracle.com/cd/E19253-01/821-0609/821-0609.pdf)」からの引用です）。GUI インストールの場合はこの構成を元に細かいカスタマイズができるようです。

<dl>
  <dt>全体ディストリビューションと OEM サポート（推奨 6.8G バイト）</dt>
  <dd>全体ディストリビューションのパッケージに加え、追加のハードウェアドライバが含まれています。これには、インストール時にシステムに存在していないハードウェアのドライバも含まれます。</dd>
  <dt>全体ディストリビューション（推奨 6.7G バイト）</dt>
  <dd>開発者システムサポートのパッケージに加え、サーバーに必要な追加のソフトウェアが含まれています。</dd>
  <dt>開発者システムサポート（推奨 6.6G バイト）</dt>
  <dd>エンドユーザーシステムサポートのパッケージに加え、ソフトウェア開発用の追加のサポートが含まれています。ソフトウェア開発のサポートとして、ライブラリ、インクルードファイル、マニュアルページ、プログラミングツールなどが追加されています。ただし、コンパイラは含まれていません。
  <dt>エンドユーザーシステムサポート（推奨 5.3G バイト）</dt>
  <dd>ネットワークに接続された Solaris システムと共通デスクトップ環境 (CDE) の起動と実行に必要な最小限のコードを提供するパッケージが含まれています。</dd>
  <dt>コアシステムサポート（推奨 2.0G バイト）</dt>
  <dd>ネットワークに接続された Solaris システムの起動と実行に必要な最小限のコードを提供するパッケージが含まれています。</dd>
  <dt>限定ネットワークシステムサポート（推奨 2.0G バイト）</dt>
  <dd>ネットワークサービスのサポートが限定された Solaris システムを起動および実行するために必要な最小限の
コードを提供するパッケージが含まれています。Reduced Networking サポートは、テキストベースのマルチユーザーコンソールと、システム管理ユーティリティーを提供します。このソフトウェアグループを使用すると、システムでネットワークインタフェースを認識できますが、ネットワークサービスがアクティブになることはありません。</dd>
</dl>

「全体ディストリビューション（と OEM サポート）」をインストールするのがお手軽だと思いますが、CLI だけが必要な場合、GUI が起動して無駄にメモリを消費してしまいます。CLI のみにしたい場合は「コアシステムサポート」以下ですが、sshd などを自分でインストールして設定する必要があります。私はコアシステムサポートを選んでみました（あとで挫折して入れ替えるかもしれませんが）。C 言語開発などで Oracle Developer Studio が必要な場合はインストーラーが要求するため GUI デスクトップ環境が必要になるかもしれません。

#### パーティションサイズの再設定

自動レイアウトだとルートパーティションのサイズは選択したインストール構成が入るちょうどぐらいのサイズに調整され、残りをすべて `/export/home` に割り当てるようです。そのため後からパッケージを追加する余裕がないので自分で設定する必要があります。動作検証用なので `/export/home` を削除し、20 GB のディスクのうち、`/` に 16GB、`swap` に 4GB 割り当てました。`overlap` はよくわかっていませんが、自動レイアウトで配置され、これを消したら インストール中に「cannot install bootblock」とか言われてエラーになったのでなにかの管理のために必要なのだと思います（サイズと名前から全体をラップしてるパーティションでこの先頭に見えないbootパーティションを作ってる？）。

| Slice | Mount Point | Size (MB) |
| :---: | ----------- | --------: |
| 0     | /           |     16323 |
| 1     | swap        |      4102 |
| 2     | overlap     |     20449 |

#### インストール完了後のbashとsshdの設定

インストールが完了したら最低限の設定として、bash と sshd のインストールと設定を行います。この作業は「開発者システムサポート」以上の構成であれば不要です。

まずログインしてすぐに気づくのが、Backspace キーを押すと `^H` という文字が出力され文字が消せないということです。代わりに Delete キーを使えば削除することができます。この動作は bash を使えば解消するのですが、気になる場合は `stty erase '^H'` を実行すれば文字を消せるようになります。`.profile` に書いておくと良いでしょう。

パッケージのインストールは [OpenCSW project](https://www.opencsw.org/) から最新のオープンソース版をインストールする方法もありますが、今回は Solaris 10 標準のパッケージをインストールすることにします。

- OpenCSW project からインストールする場合
  - [Install bash on Solaris 10 and 11](https://www.opencsw.org/packages/bash/)
  - [Install openssh on Solaris 10 and 11](https://www.opencsw.org/packages/openssh/)

標準のパッケージはインストールに使用した DVD に含まれているので、それを仮想マシンに接続して使うことにします。インストールが完了したらおそらく DVD は排出されているはずなので再挿入します。

```console:ホストOS での作業
$ virsh attach-disk sol10 /var/isos/sol-10-u11-ga-x86-dvd.iso hdb --type cdrom
```

DVD をマウントする必要がありますが、そのためには DVD のデバイスを調べる必要があります。これには `iostat` コマンドを使用します。

```
# iostat —En
c0d0             Soft Errors: 0 Hard Errors: 0 Transport Errors: 0
Model: QEMU HARDDISK Revision: Serial No: QM00001 Size: 21.476B <21474754560 bytes>
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0
Illegal Request: 0
c0t1d0           Soft Errors: 0 Hard Errors: 0 Transport Errors: 0
Vendor: QENU     Product: QEMU DVD-ROM     Revision: 2.5+ Serial No:
Size: 2.25GB <2254110720 bytes>
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0
Illegal Request: 2 Predictive Failure Analysis: 0
```

真ん中あたりに `c0t1d0` という文字が見えますが、これが DVD のデバイス名です。DVD をマウントするにはデバイス名の後ろに `s0` をつけた `/dev/dsk/cOt1d0s0` を次のようにマウントします。

```conosole
# mount -F hsfs -o ro /dev/dsk/c0t1d0s0 /mnt
```

マウントした後はディレクトリからパッケージをインストールすることができます。bash をインストールするした後は bash を使用すると良いでしょう。標準の Bourne シェルはものすごく使いづらいです。ksh88 も標準でインストールされているのですが同様に使いづらいです。

```console
# cd /mnt/Solaris_10/Product/
# pkgadd -d . SUNWbash SUNWsshcu SUNWsshdr SUNWsshdu SUNWsshr SUNWsshu
```

インストールが完了したら、`sshd_config` を変更して root のログインを許可し公開鍵認証を使えるようにします。動作検証用マシンなので root でのログインを許可していますが、気になる人はあとで削除してください。

```config:/etc/ssh/sshd_config に以下を追加
PermitRootLogin yes       # root でのログインを許可
PubkeyAuthentication yes  # 公開鍵認証を使えるようにする
```

「コアシステムサポート」で構成した場合、sshd の HostKey が生成されておらず、以下のようなエラーが出てログインできません。

```txt:外部から接続しようとしてもエラーになる
Unable to negotiate with x.x.x.x port 22: no matching key exchange method found.
Their offer: gss-group1-sha1-toWM5Slw5Ew8Mqkay+al2g==
```

以下の方法で HostKey を生成します。

```console
# ls /etc/ssh             # HostKey がない
moduli                ssh_host_dsa_key      ssh_config

# /lib/svc/method/sshd -c # HostKey の生成

# ls /etc/ssh             # HostKey の生成の確認
moduli                ssh_host_dsa_key      ssh_host_rsa_key      sshd_config
ssh_config            ssh_host_dsa_key.pub  ssh_host_rsa_key.pub
```

最後に sshd サーバーを再起動します。

```console
# svcadm enable ssh
# svcadm restart ssh
```

#### ssh クライアント側の設定

比較的最近の Ubuntu や macOSからだと SSH 経由で Solaris 10 に接続できません。これはセキュリティが強化され、古いプロトコルのサポートが無効になっているためです。そこで有効にするための設定を `~/.ssh/config` に追加します。この設定は `ssh` コマンドを実行するクライアント側の設定です。

```txt:~/.ssh/config に以下を追加する（クライアントマシン側の設定）
Host <Solaris 10のホスト名またはIPアドレス>
  KexAlgorithms +diffie-hellman-group1-sha1
  HostkeyAlgorithms +ssh-rsa
  PubkeyAcceptedAlgorithms +ssh-rsa
```

以上で、SSH 経由で Solaris 10 を使うことができるようなりました。`authorized_keys` をコピーすれば公開鍵認証でのログインでもできます。ただし `/bin/sh` が Bourne シェルのためか `ssh-copy-id` が使えないので手動でコピーする必要があります。その他のパッケージの追加も bash や ssh などと同じ方法でインストールできるので、あとは普通の Unix マシンです。

#### おまけ Oracle Developer Studio のインストール

Oracle 標準の開発環境（`cc` コンパイラなど）が必要な場合、Oracle Developer Studio をインストールする必要があります。もしかしたら Oracle Developer Studio をインストールするには GUI デスクトップ環境が必要かもしれません。まず [Oracle Developer Studio](https://www.oracle.com/jp/tools/developerstudio/downloads/developer-studio-jsp.html) をダウンロードし、以下のコマンドを実行して任意の場所に展開します。

```sh
Verify checksum:
digest -a sha256 /OracleDeveloperStudio12.6-solaris-x86-pkg.tar.bz2

Unpack distribution:
cd <installation_directory>
bzcat <download_directory> /OracleDeveloperStudio12.6-solaris-x86-pkg.tar.bz2 | /bin/tar -xf -
```

展開したディレクトリの中に `install_patches.sh` があるのでまずそれを実行し再起動します。次に（GUI デスクトップ環境から）`developerstudio.sh` を実行するとインストールが開始されます。インストールが完了すると `cc` コマンドなどが使えるようになっているはずです。ただしなぜか私の環境では GUI の IDE が起動しませんでした。コンパイラは使うかもしれませんが、Solaris 10 で IDE を使うことはないのでこれ以上追求しません。

## さいごに

この記事を書く前に再度調べましたが、やっぱり KVM で Solaris を動かすという情報は少ないですね。いや Solaris 全体の情報が少ないか。パッケージをインストールする方法まで調べたのでこれで一応の動作検証はできると思います。