OpenIndiana の導入
OpenIndiana とは OpenSolaris からフォークした SVR4[1] Solaris 系 OS である。
OpenIndiana インストール
の前に Oracle VirtualBox
個人利用なら無償で使える VM
Windows版VirtualBoxをインストールするときに、Python Core / win32api がないとかいう警告が出るので、Python を入れたのちに pywin32 パッケージを追加する。
admin権限も path も両方チェックを入れてインストールする。
インストール後:
> pip install pywin32
> pip list
Package Version
------- -------
pip 24.3.1
pywin32 308
>
- Extension Pack (Guest Addition CD)
これをいれて autorun.sh しないと便利機能が使えないのだが、
入れてもなんかおかしなまま。解決しようがないので放置。
最大の問題は Host-Guest間共有フォルダ機能とかが使えないこと。
ファイルをやり取りしようと思うと、
ネットワークを NAT から Bridge に変更して、proftpd [2] を有効にして
Host 側から ftp でやりとりする (もしくは同様に samba 等) くらいしか思いつかない。
面倒くさい…
$ sudo svcadm enable proftpd
$ ifconfig # IP address 確認
(略)
OpenIndiana インストール
LiveDVD イメージから起動すると、Default User での GUI 環境が立ち上がり、そこにインストールアイコンがあるのでそこからインストール実行。
油断すると時間で画面ロック(スクリーンセーバ)をかけられてしまうので、あらかじめパスワードが何なのかを公式ページで調べておくなどする。
OpenIndiana ことはじめ
/bin/sh
なんということだ、sh が Korn-shell(93u+) ではないか。Bourne Shell はもうないらしい。[3]
もとになった OpenSolaris は Solaris 10 時代だった気がするので Bourne shell かもしれない期待をしたのだが(何の期待だ?)。uname -a
すると 5.11 という返事が返ってくるので、Solaris 11 ベースになっているみたいだ。本家も Solaris 11 ではデフォルトが Bourne Shell ではなくなっているんだったか。本家はどこかに旧バージョン互換物を隠し持ってた気はするが。
BSD 由来の SunOS [4] は遠くなりにけり。
もはや今なら Bash を sh にしてくれてもいいんだけど。[5]
IPS パッケージシステム
- rootでなくても
pfexec
で使えるようにする。sudo
だとパスワードを打つ必要があるがそれを省略できる効果がある。username は自分のログイン ID
$ sudo usermod -P "Software Installation" username
- パッケージリスト
$ pkg list -a
- インストール
$ pfexec pkg install XXXXX
なんだが、依存関係のある諸々が全然存在しなくなって(リストも壊れだす) reject されてしまう。
色々調べたところ、先に pkg update
をしないとハマってこうなるらしい。
バグじゃないのか。
- パッケージ更新
$ pfexec pkg update
これでインストールできると思ったら。
32GB も Disk space をあげたはずなのに容量が足りない、
残り2.5GBだと?
デフォルトのパーティション割り付けが何をしてくれたんだ?
ZFS という FileSystem の管理基礎知識
... swap が 18.3GB も確保されてるってどういうことよ。
$ df -k
Filesystem 1024-blocks Used Available Capacity Mounted on
rpool/ROOT/openindiana-2024:12:13
31997952 9643010 2530507 80% /
/devices 0 0 0 0% /devices
/dev 0 0 0 0% /dev
ctfs 0 0 0 0% /system/contract
proc 0 0 0 0% /proc
mnttab 0 0 0 0% /etc/mnttab
swap 18319300 412 18318888 1% /etc/svc/volatile
objfs 0 0 0 0% /system/object
bootfs 0 0 0 0% /system/boot
sharefs 0 0 0 0% /etc/dfs/sharetab
/usr/lib/libc/libc_hwcap2.so.1
12173517 9643010 2530507 80% /lib/libc.so.1
fd 0 0 0 0% /dev/fd
swap 18515520 196632 18318888 2% /tmp
swap 18319004 116 18318888 1% /var/run
rpool/export 31997952 24 2530507 1% /export
rpool 31997952 34 2530507 1% /rpool
rpool/export/home 31997952 24 2530507 1% /export/home
format
/ fdisk
コマンドを使っても丸ごと ZFS pool になっていることしかわからない。ZFS の知識が必要。
$ zpool status
pool: rpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
c5t0d0s0 ONLINE 0 0 0
errors: No known data errors
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 28.1G 2.41G 34K /rpool
rpool/ROOT 14.4G 2.41G 24K legacy
rpool/ROOT/openindiana 12.2M 2.41G 8.69G /
rpool/ROOT/openindiana-2024:12:13 14.4G 2.41G 9.20G /
rpool/dump 4.62G 2.41G 4.62G -
rpool/export 543M 2.41G 24K /export
rpool/export/home 543M 2.41G 24K /export/home
rpool/export/home/pkpk3 543M 2.41G 543M /export/home/pkpk3
rpool/swap 8.50G 10.7G 240M -
確かに swap が 8.5+10.7(-2.41?) GB[6] ということになっている。
$ zfs get volsize rpool/swap
NAME PROPERTY VALUE SOURCE
rpool/swap volsize 8.00G local
ん? 8GB しかない。よくわからんがとりあえず小さくしてしまえ。
swap という名前ではあるが tmpfs で使うものでもあり、
つまり /tmp
のサイズにもなるので 0 にはしない。
どうやら dump のほうも swap の一部になっているようなので、
swap は 0 にしてもよかったらしいけれど。
Swap のサイズ縮小。以下 root 作業。
以下では 8GB だったものを 2GB に減らしている。
# swap -d /dev/zvol/dsk/rpool/swap
# zfs volsize=2G rpool/swap
# swap -a /dev/zvol/dsk/rpool/swap
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 21.7G 8.79G 34K /rpool
rpool/ROOT 14.4G 8.79G 24K legacy
rpool/ROOT/openindiana 12.2M 8.79G 8.69G /
rpool/ROOT/openindiana-2024:12:13 14.4G 8.79G 9.20G /
rpool/dump 4.62G 8.79G 4.62G -
rpool/export 543M 8.79G 24K /export
rpool/export/home 543M 8.79G 24K /export/home
rpool/export/home/pkpk3 543M 8.79G 543M /export/home/pkpk3
rpool/swap 2.13G 10.7G 240M -
減らした6GB分プールの余裕が増えた。
にしても df で見る分には 9.6GB しか使ってないはずなのに ROOT で 14.4G 使っているのが謎。
dump の USED 4.62GB は zfs get volsize rpool/dump
で見えるサイズと同じ。保守サービス契約がないんだから自力でクラッシュダンプを解析できるわけでもないので dump はいらないと思うがひとまず放置。
swap の avail 10.7GB は全く変わってないから swap の AVAIL は pool の AVAIL に swap サイズそのものを加算しているということになる。つまり pool 全体の空きは 8.79GB。
問題は、OS 9.6GB, dump 4.62GB, swap 2GB, 空き 8.79GB では 32GB にならず 5GB くらいの謎消費があるところ。
どうも ZFS Boot Environment (BE) に 5GB くらい持ってかれてるみたい (update に失敗して起動不可になったときのロールバック手段らしい)。この余計なサイズ分を知る方法がわからない。 beadm
コマンドでもそれらしいサイズが出てこない。
ともかく、つまり、ディスクスペースは 32GB では不足する。
ZFS はディスクスペースが枯渇するような使い方をしてはならないという話もあるし。
地獄のファイル共有
結論を先に書けば、NFS(v4) で OpenIndiana 側をサーバ、Windows 側をクライアントにするのが一番簡単。
思いつく他の選択肢とその地獄:
- VirtualBox の Guest Addition CD による拡張機能を用いた共有フォルダ
- OpenIndiana ではこの機能も含め拡張機能はロクに動かないようだ
- SAMBA
- そもそも SMB は昔から地雷の多いプロトコルである。そのうえ OpenIndiana では samba 周りの設定がどこにあるのかもわからない (なお
svcadm
の指定パスは network/smb/[client/server] である)。さらに Windows11 では旧版 Samba を打ち切る動きをしているのでそのあたりでも地雷を踏みぬく。NAS とか使っているのであれば避けられない地獄である。
- そもそも SMB は昔から地雷の多いプロトコルである。そのうえ OpenIndiana では samba 周りの設定がどこにあるのかもわからない (なお
- FTP
- これはファイル共有ではなくファイル交換であるが最低限であれば代替になる。OpenIndiana 側をサーバにする分にはそれほど面倒くさくはない。ftpd の名前が OpenIndiana では proftpd であることにだけたどり着ければ解決できる。つまり /etc/proftpd.conf の設定をして
svcadm
で network/proftpd を有効にする。
- これはファイル共有ではなくファイル交換であるが最低限であれば代替になる。OpenIndiana 側をサーバにする分にはそれほど面倒くさくはない。ftpd の名前が OpenIndiana では proftpd であることにだけたどり着ければ解決できる。つまり /etc/proftpd.conf の設定をして
NFS による共有: OpenIndiana (Server) 側
NFS server を有効にしてから root で share
コマンドを使う。Solaris10 までは dfs 関係だったものが Solaris11 で管理体系が変わっているので古い Solaris 知識は全く使えない。設定によっては NFS でない共有になったりするかもしれないのでその場合は -F
あたりで明示する必要がある。
# svcadm enable network/nfs/server
# mkdir /share-dir
# chmod 777 /share-dir
# share /share-dir
共有状況の確認は引数なしで share
コマンドを使えばよい。
NFS による共有: Windows11 (Client) 側
Homeにもあるのかどうかは知らない。Windows11 Pro ならば
設定のシステムかアプリの中に「オプション機能(デバイス向け追加機能)」というのがある。さらにその中に「Windowsのそのほかの機能」をつつく。
そこに NFS用サービス - NFSクライアント があるのでそのチェックボックスをつついて有効にする。
すると mount
コマンドが解禁されるので、コマンドプロンプトで実行する。
アスタリスクのかわりに明示的に未使用ドライブレター(Z:
とか)を指定してもよい。アスタリスクにするとドライブレターを適当に選んでくれる。
> mount \\openindiana-vm\share-dir *
ただし、OpenIndiana のファイル名エンコーディングは UTF-8、Windows では Shift-JIS なので日本語等のファイル名は文字化けを起こす。
OpenIndiana側のファイル名エンコーディングを Shift-JIS にはできないが、Windows 側を UTF-8 に変更することは可能。
なのだが、Windows 側のファイル名エンコーディングを UTF-8 にすると USB ストレージへのコピーでハマる。
いわく「0x800700ea データがさらにあります」というエラーが出る(ことがある)。
発動条件がよくわからないがエラーになるのはどうにもならない。
Trademark
- Solaris, Oracle, Oracle VM VirtualBox, VirtualBox は、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標または商標です。
- AIX は International Business Machines Corporation の米国およびその他の国における商標です。
- Linux は Linus Torvalds 氏の日本およびその他の国における登録商標または商標です。
- Python は Python Software Foundation の日本およびその他の国における登録商標または商標です。
- Windows は 米国Microsoft Corporation の米国およびそのほかの国における登録商標です。
そのほか不注意で商標を書いているかもしれませんがそれぞれの会社の商標です。
BSD は区分09に限れば日本の登録商標ではないようですが中国の企業が申請しています。
初版公開日: 2024/12/14
最終更新日: 2025/5/6 (ファイル共有の節を追加)
-
えすぶいあーるふぉー。System V Release 4 (しすてむふぁいぶりりーすふぉー)の略。つまり2文字目はローマ数字なのだが、なぜか略したときはファイブと読まない。 ↩︎
-
たいていの情報は Solaris 11 公式情報に共通するので Oracle サイトの情報は有用なのだけど、こういうところで Solaris と OpenIndiana で差異がある。Solaris だと ftpd だが OpenIndiana だと ftpd は存在せず proftpd に差し替えられているのだ。そういう対応表どこかにないかな? ↩︎
-
ほかの shell はコマンド名やらなにやら由来の略称が存在するが Bourne shell は適切な略称がない。長らく
/bin/sh
= Bourne shell だったので Bourne shell を指して「びんしぇ」と呼ぶ人はいた。Bourne shell以前の歴史は知らない。なお「Bシェル」という呼び方は不適 (せいぜい csh 系列ではないという「Cシェル」からの対義語の意味でしかないので Bourne shell を指して呼ぶと教育的指導を受けるぞ)。AIX だとbsh
で Bourne shell が使えるらしいので IBM 界隈だけはBシェル呼びも許されるかもしれない。 ↩︎ -
OpenIndiana も
uname
すると SunOS と名乗るが、ここでいう BSD 由来とは SunOS 4系までのもの ↩︎ -
その昔はパッケージシステムなんぞなかったり、あっても商用OSだと GNU ツールはパッケージ管理範囲外だったりした。ゆえに当時は Bash は存在しても野良ビルドであるために元環境を壊さない配慮から歴史的に
/usr/local/bin
に配置されることになる。一方 GNU/Linux は最初から Bash が sh の立ち位置なわけで/bin
とか/usr/bin
にあり/usr/local
以下にあるわけがないので、複数環境を相手にするスクリプトだと Bash では shebang が両立しないという事態に陥る。当時/bin
あるいは/usr/bin
に確実に存在するのは sh (正体が Bourne shell か Ksh か Bash かそのほかの何かかはともかく)か csh しかなく、csh スクリプトを書くことは選択肢に存在しないので/bin/sh
で可搬性のあるスクリプトを書くという黒魔術が発達したという。 ↩︎ -
GB (
) なのか GiB (=10^9 ) なのかどちらでもない何かなのかわからないので細かい数字は検算できない。=2^{30} df
のほうは計算できて約18.3GB = 約17.5GiB だがzfs list
で見える数字からはどういう解釈をしても計算が合わない ↩︎
Discussion