FC2ブログ
2014/04/18

Openindianaを冒険する

Openindianaはコンピューターを達人でなくとも使えるようにするオペレーティングシステムの一つです。
しかし、Windowsとまったく違うし、Linuxより小難しいです。
このブログのOpenindianaカテゴリではそういうものの使い方を紹介しています。
一応使えるようにできたOpenindianaのしくみについて 冒険して行きましょう。

Newbe注意

これはNewbeの冒険なので、Solarisのマニュアル嫁とか言わないでください。小難しいんですほんと。
で、こういうことをするluserがいると認識しないと、有名にならないと思います。
また、UNIX全般の知識が使えるので、Linuxの知識やHowToもある程度有効です。

なんと、一つのアプリケーションが一つのCPUしか使えないようです。
何とデフォルトのスケジューラーがタイムシェアリングではないことが発覚。詳しくは
Openindianaが遅い、重い これで解決

ブロックデバイス

ディスクなどのブロックデバイスのノードは、どこにある?
/dev/dsk/c4t0d0p1
この様な感じになっています。
cがコントローラーでusbのポートとかscsiのカードとかです。
オイラのパソコンでは4番目はすみっこのUSBのポートです。
5番がプライマリハードディスクがついていて
6番は三つ並んだUSBポートの右端です。
tがSCSIのIDとかコントローラーの端子の番号です。
dはディスク、pはパーティションだとわかりますね?
/dev/rdsk以下は同じ名前のデバイスファイルが見えますが ディスク用の制御が入らないキャラクタデバイスとして見えます。
リムーバブルディスクは

$ rmformat -l

でデバイスノードが分かります。
最後に取り出す前に忘れずにumountしないと、シャットダウン時genunix(中核)が盛大にクラッシュして、大量のコアダンプが
ZFSの高度な機能によって変なところに保存され、
起動時に選べるバックアップのカーネルまでご丁寧につきます。
と、どうやら管理者が間違えないことを前提にした設計です。

USBメモリー、USBハードディスクはあまり期待しない方がいい

なんと、USB記憶媒体のサポートがザルで、ehci、つまりUSB2.0のドライバが入っているのに1Mbpsしか速度が出ません。
USBのSSDでも転送速度はまったく期待出来ません。
これではLANが絶対に速いです。
USB記憶媒体のドライバは、scsa2usbですが、/kernel/drv/scsa2usb.confを見ると、
そこの設定でUSBのDVDドライブで非推奨、USBメモリで推奨の設定がコメントアウトされています。これなに?
なおコメントアウトを直さないで、ファイルの最後に新しく追記すべしとも書いてあります。

attribute-override-list = "vid=* reduced-cmd-supprt=true";

これを、追記しておくと、たしかに結構高速です。12Mbpsぐらいになります。USBのSSDのアクセスランプがついたまま消えません。
光学ドライブを使うなど、この設定ができない場合、

maxphys=262144

を/etc/systemに書き込んで再起動がデスクトップの用途ではできます。USBデバイスからの読み込みがかなり速くなります(27Mbps)。他のI/Oも高速になるはずです。
同じようにUSBメモリにOpenindianaをいれても結構動きがトロいです。

/usr以下はどうなっているの

とっ散らかっています。

$ ls /usr/
adm ccs g++ include kernel mysql perl5 sadm spool X11R6
apache2 ddu games j2se kvm net platform sbin src xpg4
apr demo gcc java lib news preserve sfw tmp
apr-util dict gnu java1.2 mail old proc share X
bin dt has jdk man openwin pub snadm X11
こんなにあります。gnuがGNUのプログラム、gccが追加で入れたgcc-4.6、その他色々な区画があるようです。
新しいプログラムをメインに投入させないで別のディレクトリにいれておくという考えなのでしょうか?
しかし、sfeのgcc-4.6を入れるとどのディレクトリのg++も/usr/gcc/4.6/bin/g++にリンクされます。
この様にとっ散らかっているのです。
いったい達人の$PATHはどうなっているのでしょう?

/etcはどうなってるの

普通にUNIXの設定が入っていますが特有のバイナリ形式の設定ファイルや、なんと 実行ファイルが入っている!
これがLinuxerから批判される/etcのバイナリです。うわさでは大障害のときに復旧するためにある。
実際は他のディレクトリにある実行ファイルへのリンクです。
ネットワーク設定が消えるときは

# svcadm disable svc:/network/physical:nwam
# svcadm enable svc:/network/physical:default

でnwamをとめて全部手動で設定する様にするそうです。他のブログでもよく出てくる話題です。
(でも自分がやってみると何かがクラッシュした知らせがくる。オイラのだけおかしい?)

システムログはどこ

/var/admにあります。messagesをよく見ることになると思います。
特定のサービスの開始と停止だけ記録されるファイルも/var/svc/logにあります。でも異常が起きるとそれも記録されます。
Xはやはり/var/log/Xorg.0.logです。

ACLはどうなっている

setfaclやgetfaclは入っているものの使えません。NFS4の拡張されたACLが使えます。
新しい Solaris ACL モデル
純正のchmodやlsから使えます。それらは/usr/binに入っていますが、ここまで当たり前、
Openindiana 151a9では/usr/gnu/binの方が優先されてしまいます。
一例をあげると…

Anthyの変換精度が悪いが、パッチを当てるのはいやだ

■Anthyの変換精度を上げる方法のやり方をSolaris系でするには:

cd ~/.anthy
/usr/bin/chmod A0=owner@:read_data/append_data/read_xattr/write_xattr/read_attributes/write_attributes/write_owner/synchronize:allow last-record2_default.utf8

よく見てください、/write_data/がありません。
この様にすると 辞書のデータが削除されず追記のみされて、頭がよくなるかテストしてみていますが、効果が出ているようです。
なお、anthyはこの設定を戻しませんが、vimでひらくなど何かの拍子でせっかくのこの設定が無くなってしまうようです。

サービスの起動と停止

svcadmで行います。これはupstartやsystemdに先駆けて高速な起動と柔軟な管理をできるようにしたものです。
設定ファイルはバイナリのデータベースで、
サービスの環境変数の設定などはsvcpropやsvccfgとか別のコマンドで行う様です。
本当はここで扱うサービス名はFMRIというURLのようなもので指定します。略式でnwamとかだけでもいいです。
FMRIではあらゆるSolarisの内部情報を指定できるらしく、なぜここまで統一するのか?

Boot Environment

ZFSのバックアップ機能 スナップショットを使って起動時にカーネルまわりだけ違うバージョンに付け替えられます。
これがBoot Environment=BEです。
grubで起動するカーネルを指定できます。何もしなくとも起動時に指定されているのが最新です。
何かカーネルにアップデートがくるとgrubのメニューが増えます。
何かクラッシュや重大なことがあるとバックアップのメニューも増えます。
beadmで管理できます。
# beadm list でBEのリストを出力
# beadm mount BE で/tmpに一時ディレクトリを作ってマウント 読み書きできるので非常時に書き換えできる
# beadm umount BE
# beadm destroy BEでBEを破壊します。これをやると起動メニューの項目が減ってすっきりします。

パッケージの整合性チェック

# pkg fix /system/*/*
このようなコマンドで、/systemカテゴリのパッケージのファイルが正しいかチェック、修正できます。
本当はpkg:/system/*/*としたほうがいいのでしょうか?
これで修正されるパッケージにはカーネルなどが含まれます。
無駄と思われる*/*はじつは必要です。
ZFSのスナップショットが取られ、このコマンドは最後にパッケージの発行元からファイルを取り寄せて修正します。
なお、自分はこのコマンドで、なんとgrubのエラーを発見、修正しました。
それでもいつもどおりの起動をしますが、たぶん何かが正しくなっています。
いったいエンタープライズむけといいながらこのざまは何なんだろう?
また
pkg:/locale/* pkg:/text/* pkg:/library* pkg:/x11/* pkg:/web/* pkg:/gnome/* などもあります。
じゃあpkg:/*は出来るのかというと、エラーになります。できます。
たんに/*が出来ません 済みませんでした。

ZFSの扱い

ZFSは普通のmountが使えません。手入れは必ずzfsコマンドやzpoolコマンドから使います。
ZFSはあまりに進化している為に豊富な知識が必要で、
よくよくmanページやブログ記事のノウハウを吸収することになるでしょう。
RAID、バックアップ、チェックディスク、クォータ、solaris zone、自由自在なのだそうです。
普通のデスクトップでZFSのメリットは定期スナップショットをとって過去のファイルシステムを保存できることです。ゴミ箱いらず。
しかし、本当は十分な性能のサーバーでRAIDを組んで使わないと、遅くて重たいのだそうです。

CoWとは

Openindianaの話題でよくでてくるCoWは牛のことではなくZFSの特性、Copy On Writeです。
使っている人は皆当たり前にしっています。
Wikipediaによるとファイルをコピーする指示を行っても実際は一つのファイルにたどり着く道が増えただけで、
どちらかのファイルの書き換えを指示されるとその前に本当にコピーする。
この挙動には利点や欠点があり他のサイトが詳しいです。
で、dedupという、ファイルの共通バイト列を探し出して一つにまとめるさらにすごい機能もあるが、副作用もすごいのだそうです。

チェックディスク

チェックディスクは随時データを読むときにちょいちょいやってくれるらしいですが、スクラブと言います。
自分の指示で全部のファイルをスクラブするには、
# zpool scrub rpool
です。
チェックディスク中でもシステムは停止せず使えます。しかもWindowsのCHKDSKよりよほど早いので、お気軽です。
しかしデフラグの機能はまだついてないようなので、zfs sendで別のディスクに移動して再フォーマットしてzfs importで戻すといいのだそうです。

fc-cache

新しいフォントを入れたときの作業として、rootで fc-cache -f を実行するのがお決まりですが、
なんと/usr/bin/amd64/fc-cacheがある。
これも実行しないと、64ビットのアプリが遅くなります。しかもそれはヨリによってパッケージマネージャが含まれます。

CPUのマイクロコードのアップデート

マイクロコードを更新した方が、より信頼性が高くなるはずですが、
ucodeadmというツールでそれをインストールするのですが、なんとintelのマイクロコードで最新版は入れられません。
ucodeadmで入れられるものはバージョンが20130222が最新です。
マイクロコードのファイルのフォーマットが変わったのですが、それに対応するとまた問題が出ると、躊躇しているようです。かなり保守的です。

ハードディスクのS.M.A.R.Tを見たい


smartmontoolsが入っていますが、SATAのハードディスクには ただ使っただけではほとんど情報がでない。
これはOpenindiana公式Wikiにはほとんどの環境ではsmartctlに

-d sat,12

も付け足して呼び出すことがかかれています。これはSCSI to ATA の12bit呼び出しだそうです。
これはsmartdの定期健診のコンフィグにも書かないといけないのかもしれません。

パッケージ管理

別にGUIでできるので最初はpkgコマンド使わなくともいいです。かゆいところに手が届くのはコマンドの方ですが。
ただしhipsterにはGUIの管理アプリがありません。
新しいカーネルがアップデートで入るとそれに名前をつけてと言われます。既に入っているopenindiana-? でいいとおもいます。
あと非公式リポジトリを発見。
Openindianaのイギリスのユーザー会があるらしい。
www.openindiana.co.ukのはずだがサーバーが落ちている、もしくはリポジトリが前から使えなかったのでもう閉鎖か??
もう一つはhttp://sfe.opencsw.org/に説明のあるリポジトリで、
新しめのパッケージが揃っています。
ffmpegの新しいバージョンがありますが、注意してほしいのはコーデックにx264が必要で、それはこのリポジトリのソースパッケージからビルドしたものしか受け付けません。
他のリポジトリのバージョンが新しいx264が入っていてもインストールは出来てしまっても使えません。
pkgbuildの使い方が分からないので普通にコンパイルして、libx264.so.138だけ/usr/libに入れました。
この様なケースと前の記事のexfatがまるで使えないことから、http://sfe.opencsw.org/のパッケージは不十分なところがあり、おそらくユーザーからのフィードバックが全くないと思われるので、英会話ができる人はフィードバックを送るといいでしょう。

コンパイルの準備

メタパッケージでも入れれば一発なのだろうけれど、
gccとsystem-headersとlintというパッケージを入れます。え?lint?と言うかもしれないけれどソースコード解析ではありません。
このlintは実行ファイルの部品のパッケージで、これがないとcrt1.oが存在しないエラーになります。
gccの入っているパスが/usr/gcc/4.3/binとか/usr/gcc/4.6/binとかであることもあります。
gccはSFEリポジトリのバージョン4.6が新しいです。
autoconfやautomakeやaclocal、libtool、gettext、cmake、scons、色々必要なものがありますが、hipsterのほうがいいでしょう。
本当はSunStudioと言うのを入れてそれでコンパイルするのが正しいらしいのですが、gccで間に合います。
すごく長い表示とともに、コンパイルエラーが起こることがよくあります。
これはSolarisのリンカーが起こしていることで、再配置可能バイナリにしないと、異常になります。
./configureに--with-picを渡すとすっきり解決します。
環境変数PKG_CONFIG_PATHを設定しておきます。
Linuxだと設定されていますが、これがないとpkgconfigというプログラムが必要なライブラリを認識しません。だいたい/usr/lib/pkgconfig:/usr/*/lib/pkgconfigになります。

一部のライブラリに難あり


確かに入っているのだけれど、ややこしいことがあります。
iconvはSolarisカーネルのと、GNUのiconvが/usr/gnuにあり、機能が少ないもののカーネルのを選ぶべきです。無理にGNUのを指定すると使えません。
libgmpも/usr/gnu/includeにあるが、pkg-configの登録がなく、使えないことがあります。
export GMP_INCLUDE=-I/usr/gnu/include
とはいえ、UNIX界隈はGNUの影響力はバカにできないので、かなり入り込まれています。
SDLはpkg-configの登録が間違っています。この様にするべきです。
export SDL_CFLAGS='-D_GNU_SOURCE=1 -I/usr/include/SDL'
export SDL_LIBS='-lSDL -lpthread -lposix4'

64ビットを扱いたい


_FILE_OFFSET_BITはコンパイルで勝手に64に#defineすれば4GB越えるファイルを扱える。
64ビットバイナリーは/lib/amd64:/usr/lib/amd64:/usr/*/lib/amd64にあります。
どうも、Qtは32ビットのしかないかも。GTK2は64ビットバイナリーがある。
gccはLinuxとちがい、デフォルトで32ビット! -m64をつけると、64ビットバイナリーが出てくる。
CC='gcc -m64' この様な環境変数をセットすると便利。
スポンサーサイト

コメント

非公開コメント