2018-08-01 Wed

Solaris の IPS パッケージの作り方 はてぶ

以下の記事があったのでメモ。

Solaris 11: High-Level Steps to Create an IPS Package | Oracle Solaris Blog
https://blogs.oracle.com/solaris/solaris-11%3a-high-level-steps-to-create-an-ips-package

pkgsend/pkgmoglify/pkgdepend/pkglint などを使った IPS パッケージの作り方。

普段は pkgbuild 使っていて、このあたりをちゃんと意識していないので、
一度、手を動かしてみた方がよさげ。

2018-05-16 Wed

Serverspec で sudo のかわりに pfexec を使う はてぶ

Solaris 10 な環境に対して Serverspec でテストを行ないたかったので、
以下を spec/spec_helper.rb に書いて、sudo のかわりに pfexec を使うようにしてみた。

module Specinfra
  module Backend
    class Ssh
      def build_command(cmd)
        cmd = super(cmd)
        if sudo?
          cmd = "pfexec #{cmd}"
        end
        cmd
      end
    end
  end
end


テスト対象の Solaris のバージョンによって切替えられるようにした方が便利だけど、
とりあえず、今回の目的は達成できたのでここまでにしておく。

2016-09-21 Wed

ZFS の capacity について はてぶ

メモ。

Current ZFS Pool Capacity Recommendations (Life in the ZFS Lane)
https://blogs.oracle.com/zfs/entry/current_zfs_pool_capacity_recommendationse

使い方にもよるけど、ZFS filesystem version 5 以降は 90% が目安という話。

どういう使い方にしろ、ちゃんとモニタリングして遅くなっていないか確認が必要。

kstat -p unix:0:vopstats_zfs なんかがそれっぽい統計。

0 の部分は zone id なので、0 は global zone。

2016-09-20 Tue

nagios の check_log plugin はてぶ

正確なバージョンまで調べていないが、
nagios-plugins が2.0 系から 2.1 系へ移動するあたりで、
check_log プラグインが egrep ではなく grep を使うようになっている。

このため、grep が gnu grep ではない Solaris では、
'-q query' に正規表現を書くと必ず match しないので、
常に ok が返ってしまう。

[ Read More... ]

2016-06-10 Fri

Solaris 11.3 の mod_rewrite で一部の文字がマッチしない はてぶ

とりあえず、メモだけ。

- Solaris 11.3 の mod_rewrite で、Solaris 11.2 ではマッチしていた文字の内、
  一部の文字が正規表現にマッチしない
- mod_rewrite の正規表現は PCRE
- Solaris 11.2 と Solaris 11.3 では PCRE のバージョンが異なる
- 正規表現の前に '(*UTF8)' をつけて UTF-8 mode にすることで解決する

2016-03-24 Thu

Nagios 4.1.1 を Solaris でビルド はてぶ

Nagios 4.0 系が Solaris でビルドできない件 [2014-02-17-1] から、
Nagios のアップデートをちゃんと確認していなかったが、
4.1.1 が出ていたので Solaris 上でビルドできるか試してみた。

結果としては、spec file のバージョン番号を変えるくらいで、
あっさりとビルドできた。

あとは、パッケージ構成をどうするかとか考えてパッケージ作成。

2015-11-10 Tue

Ruby で RAD を叩く はてぶ

RAD (Remote Administration Daemon) を REST API 経由で使ってみた ([2015-11-09-1]) ので
次はスクリプトから REST API を叩くということで、Ruby でざっと書いてみた

[ Read More... ]

2015-11-09 Mon

RAD (Remote Administration Daemon) を REST API 経由で使ってみる はてぶ

ちょっと RAD (Remote Administration Daemon) を触っておこうということで、
Oracle Solaris 11.3 で触ってみたメモ。

[ Read More... ]

Referrer (Inside):
[2015-11-10-1] Ruby で RAD を叩く

2015-11-06 Fri

pkgbuild による依存関係のチェックを止める はてぶ

pkgbuild はパッケージに含まれるファイルを調べて、
依存するものを見つけてくれるが問題がある。

パッケージに含まれるファイルに '#!/usr/bin/env perl' などとあると、
perl を含むパッケージを

dependency discovered: depend fmri=pkg://solaris/runtime/[email protected],5.11-0.175.3.0.0.30.0 fmri=pkg://solaris/runtime/[email protected],5.11-0.175.3.0.0.30.0 type=require-any


のように見つけて 依存関係を追加する。

この時生成される'~/packages/PKGMAPS/manifests/${IPS_PACKAGE_NAME}.manifest' で、
上記の依存関係部分の書き方がおかしく、publish に失敗する(1.3.105固有の問題?)。

ふと、RPM は依存関係を調べることをやめさせられるし、
pkgbuild でもできるんじゃないかと思って grep かけてたら以下が見つかった。

$ ag %_use_internal_dependency_generator /usr/lib/pkgbuild-1.3.105
/usr/lib/pkgbuild-1.3.105/macros
125:%_use_internal_dependency_generator     1

/usr/lib/pkgbuild-1.3.105/pkgbuild.pl
2057:    if ($package->eval ('%_use_internal_dependency_generator') eq "1") {


とりあえず、'%_use_internal_dependency_generator' を '1' 以外にすればよさそう。

もう少し grep していたら

$ ag _read_macros /usr/lib/pkgbuild-1.3.105
/usr/lib/pkgbuild-1.3.105/rpm_spec.pm
132:    _read_macros ('/usr/lib/pkgbuild-1.3.105/macros');
134: _read_macros ("${_homedir}/.pkgbuildmacros");
215: # fill with values read from the macros file in _read_macros()
251:sub _read_macros ($) {


というのが見つかったので、"${_homedir}/.pkgbuildmacros" に書けばよさそう。

man pkgbuild を見ると

       ~/.pkgbuildmacros
              user defined macros. The format of this file  is  on  definition
              per line in the following format:
              %macro_name value


とあったので間違いなさそう。

~/.pkgbuildmacros に

%_use_internal_dependency_generator 0


と書いてビルドしたところ、internal_dependency_generator が動作せず、
問題なくビルドが終了した。

ちなみに、依存関係の生成は以下のように ips-dependency-generator というコマンドを使っている。

my @autodeps = `/usr/lib/pkgbuild-1.3.105/ips-dependency-generator -R '$buildroot' -f $tmpfile`;


2015-10-25 Sun

OSC 2015 Tokyo/Fall で話してきた はてぶ

日本 OpenSolaris ユーザグループの人として、
OSC 2015 Tokyo/Fall で話してきた。

[ Read More... ]

2015-10-11 Sun

zonecfg delete -F はてぶ

手元の環境で、zone を作ったり壊したりしている時に、
面倒で zonecfg -z testzone delete -F を使ってみた。

zone が 'installed' の状態から 'zonecfg -z testzone delete -F' で testzone を削除するのは、
'zoneadm -z testzone detach && zonecfg -z testzone delete' と同等っぽい。

zonepath の zfs が残っているので、同じ zonepath で zone を設定し、
zoneadm -z testzone install すると、以下のようなエラーになる。

ERROR: The zone you are trying to clone has been detached previously.
You must either re-attach the zone or mark incomplete and uninstall before
trying again.
zoneadm: zone 'testzone': ERROR: cloning failed:  zone switching to configured state


書かれている通り、

# zoneadm -z testzone attach && zoneadm -z testzone uninstall


または

# zoneadm -z testzone mark incomplete && zoneadm -z testzone uninstall


すれば、zoneadm -z test install できるようになる。

zonepath の zfs が既に存在するのが問題なので、
zonepath の zfs を削除してしまってもよい。

ということで、同じ zonepath で zone を作ったり壊したりする時、
'installed' な zone に対して

# zonecfg -z testzone delete -F


すると

# zoneadm -z testzone uninstall && zonecfg -z testzone delete


より、面倒になってしまう。

2015-08-15 Sat

sys/isa_defs.h はてぶ

Solaris 上で h2o をビルドしてみようとしたところ、
libyrmcds のビルドで sys/endian.h がないと怒られる。

[ Read More... ]

2015-08-14 Fri

PHP 5.6.12 を Solaris 11.2 上でビルドする はてぶ

PHP 5.6 系が Solaris 11.2 上で Solaris Studio を使ってビルドできなくなっている。

具体的には、以下に書かれているように、zend_language_scanner のところでエラーになる。

- Installing PHP
  http://comments.gmane.org/gmane.comp.php.install/12380

[ Read More... ]

Referrer (Inside):
[2015-10-27-1] Solaris 上で PHP を --enable-intl 付きでビルドする

2015-07-14 Tue

Oracle Solaris 11.3 Beta はてぶ

バタバタしていてメモするのが遅くなったけど、
[2015-07-08] に Oracle Solaris 11.3 Beta が出てた。

- Oracle Solaris 11.3 Beta
  http://www.oracle.com/technetwork/server-storage/solaris11/overview/beta-2182985.html




2015-06-07 Sun

streem を Solaris でビルドする はてぶ

streem ( https://github.com/matz/streem ) を Solaris 上でビルドできたのでメモ。

とりあえず、以下の diff のように変更して、gmake && gmake test が通るはず。

streem は libgc が必要で、これは Solaris のパッケージだと library/gc になるが、
libgc.so ではなく、libbgc.so となっているため、'-lbgc' を渡す必要がある。

また、socket を見つけられないので、'-lsocket' を指定する必要がある。

src/string.c の方は、readonly_data_p が何をするのかわからないので、
とりあえず、Windows 同様、'return 0;' にするため、

#if defined(NO_READONLY_DATA_CHECK) || defined(_WIN32) || defined(sun)


のように、defined(sun)' を追加した。

defined で check している sun は

$ cpp -E -dM /dev/null


の出力からとってきた。

sun でも以下のように種類があるが、何が違うのか不明。

$ cpp -E -dM /dev/null | grep sun
#define __sun 1
#define sun 1
#define __sun__ 1


このあたりも知っていきたいのだけど、どこから手をつければいいのかがわからない。

2015-05-08 Fri

Solaris の pkgbuild でエラーが出た場合の対処 はてぶ

今回のお題はこれ。

karky7のブログ: Solaris11.2 pkgbuildでエラー
http://blog.karky7.com/2015/05/solaris112-pkgbuild.html

これ、貼られているログにあるように、publisher へ pkgsend しているのが timeout しているだけ。

pkgbuild: pkgsend: \'add\' failed for transaction ID \'1430692081_pkg%3A%2F%2Fiichiko3-spec%2Fdatabase%2Fmysql-cluster-gpl-74%407.4.6%2C5.11-0.11.2%3A20150503T222801Z\': 1: Framework error: code: 28 reason: Operation too slow. Less than 1024 bytes/sec transfered the last 30\\
 seconds
pkgbuild: URL: \'http://iichiko3-spec:80/add/0/1430692081_pkg%3A%2F%2Fiichiko3-spec%2Fdatabase%2Fmysql-cluster-gpl-74%407.4.6%2C5.11-0.11.2%3A20150503T222801Z/file\' (happened 3 times)
pkgbuild: 2: Framework error: code: 28 reason: Connection time-out
pkgbuild: URL: \'http://iichiko3-spec:80/add/0/1430692081_pkg%3A%2F%2Fiichiko3-spec%2Fdatabase%2Fmysql-cluster-gpl-74%407.4.6%2C5.11-0.11.2%3A20150503T222801Z/file\'
pkgbuild:


@karky7 が書いているように、
pkg/server の pkg/socket_timeout プロパティを変更してもよさそうだけど、
以前に試してダメだった(結局、別の方法で対処した)気もするので、
試してください。

(/usr/lib/python2.6/vendor-packages/pkg/server/depot.py で
slow connection 用に response.timeout を 3600 にしているので、
socket_timeout より、こっちの方な気もするけど、
publish に失敗するまでに 1 時間もかかったか覚えていない。)

別解として、publisher が localhost の場合、
パッケージのビルド時に publish に失敗するのは問題にせず、
あとから手で pkgsend する方法がある。
ポイントは publisher に対して pkgsend するのではなく、
PATH に対して pkgsend すること。

ログを見るとわかるとおり、パッケージビルド時のパッケージの publish は
~/packages/PKGMAPS/scripts 以下の script を叩いて行なわれている。

ログだと、この部分

pkgbuild: Calling script /export/home/karky7/packages/PKGMAPS/scripts/database%2Fmysql-cluster-gpl-74_ips.sh


この script はこんな感じのはず。

#!/usr/bin/bash
export PKG_REPO=${PKGBUILD_IPS_SERVER:-http://localhost:10000/} 
pkgsend publish -s "$PKG_REPO" /export/home/karky7/packages/PKGMAPS/manifests/database%2Fmysql-cluster-gpl-74.manifest || exit 1


publisher を指定して、pkgsend に .manifest を渡しているだけなので、

$ PKGBUILD_IPS_SERVER=$(svcprop -p pkg/inst_root pkg/server) \
sh /export/home/karky7/packages/PKGMAPS/scripts/database%2Fmysql-cluster-gpl-74_ips.sh



$ pkgsend publish -s $(svcprop -p pkg/inst_root pkg/server) \
/export/home/karky7/packages/PKGMAPS/manifests/database%2Fmysql-cluster-gpl-74.manifest


という感じで、publisher に対してではなく、
PATH に対して publish してあげればよい。

publisher が localhost でない場合は、
~/packages 以下にできるファイルを publisher に持って行って、
同じように pkgsend を実行すればよい。

ただし、manifest には PATH が書かれているので、
ビルドした環境と同じ PATH にしておいた方がよい。

もちろん、manifest に書かれている PATH を書き換えてしまうことも可能だけど、
面倒くさいので避けた方がよいかと。

(追記)

karky7のブログ: Solaris11.2 pkgbuildでエラーのその後...
http://blog.karky7.com/2015/05/solaris112-pkgbuild_10.html

ということで、@karky7 がさらに調べてた。

2015-03-24 Tue

illumos-sockstat はてぶ

- bahamas10/illumos-sockstat
  https://github.com/bahamas10/illumos-sockstat

Solaris 11.2 で CC=/usr/bin/gcc make でビルドできることを確認。

IPv4 tcp で LISTEN しているものは以下のように表示される。

bash-4.1$ ./sockstat -4 -l -P tcp
USER      COMMAND         PID    PROTO  LOCAL ADDRESS          REMOTE ADDRESS
root      in.mpathd       87     tcp4   127.0.0.1:5999         *.*
daemon    rpcbind         700    tcp4   0.0.0.0:111            *.*
daemon    rpcbind         700    tcp4   0.0.0.0:111            *.*
root      sshd            779    tcp4   0.0.0.0:22             *.*
root      pkg.depotd      901    tcp4   0.0.0.0:10000          *.*
daemon    nfs4cbd         23048  tcp4   0.0.0.0:58433          *.*
daemon    statd           23047  tcp4   0.0.0.0:45760          *.*
daemon    nfs4cbd         23048  tcp4   0.0.0.0:60215          *.*
daemon    statd           23047  tcp4   0.0.0.0:53190          *.*
daemon    lockd           23260  tcp4   0.0.0.0:4045           *.*
daemon    lockd           23260  tcp4   0.0.0.0:4045           *.*
root      sched           0      tcp4   0.0.0.0:1016           *.*


「この port 何が使ってるんだっけ?」ということがよくあるので、非常に便利。

2015-03-24 Tue

Serverspec で service の property のテストに its(:property) が使えるようになった はてぶ

[2015-03-23-1] の Serverspec で zfs の property に its(:property) が使えるようになったのに続き、
Serverspec 2.12.0 から service の property のテストに its(:property) が使えるようになった。

describe service('apache22') do
  its(:property) { should include( 'httpd/enable_64bit' => 'true', 'httpd/server_type' => 'worker' ) }
end


zfs の方と同じように

- have_property のように property の数だけ svcprop command を叩かなくてよい
  - svcprop -a apache22 のように全ての property を取得して hash に詰めてる
- rspec の hash 用 matcher が使える

といったあたりがメリット。

2015-03-23 Mon

Serverspec で zfs allow のテストをしたい はてぶ

ということで、いろいろと考えている。

まずは、どうテストを書けるといいのかが決まらない。

すでにある Serverspec の resource type を参考にすると、
こんな感じに書けるのがよさそう。

describe zfs('rpool/export/home/foo') do
  it { should be_allowed('create,mount,snapshot').to_user('foo') }
  it { should be_allowed('create,mount,snapshot').to_group('staff') }
  it { should be_allowed_at_create_time('destroy') }
end


または its 形式にして、こんな感じ。

its(:user_permission) { should include('foo' => 'create,mount,snapshot' ) }
its(:group_permission) { should include('staff' => 'create,mount,snapshot' ) }
its(:create_time_permission) { should eq 'destroy' }


'create,mount,snapshot' などの permission 部分を文字列にしてしまうと、

describe zfs('rpool/export/home/foo') do
  it { should_not be_allowed('rollback,hold').to_user('foo') }
end


のようなテストができないし、permission の順番も問題になるので、
配列にした方がいいかもしれない。
完全一致のテストでよければ文字列でよい。

次に、zfs allow の出力の問題。

手元で適当に zfs allow で permission を設定してみた後の zfs allow の出力は以下。

tonaka@x230% zfs allow tank/test20150321/test_01/a
---- Permissions on tank/test20150321/test_01/a ----------------------
Local permissions:
        user tonaka destroy,rollback,snapshot
---- Permissions on tank/test20150321/test_01 ------------------------
Create time permissions:
        rollback
Local permissions:
        user tonaka destroy
Local+Descendent permissions:
        user tonaka snapshot
---- Permissions on tank/test20150321 --------------------------------
Create time permissions:
        destroy,snapshot
Local+Descendent permissions:
        user tonaka create,mount
        group staff create,mount


各 zfs の path に対して何が allow されたかが出力されて、
上からの継承分を含めて何が allow されているかは出力されない。

そのため、ある zfs の path の上からの継承分を含めた allow をテストしたい場合は
parse してごにょごにょして求める必要がある。

ある zfs の path の上からの継承分を含めた allow をテストするのではなく、
ある zfs の path に対して zfs allow が実行されているかをテストするなら、
その path の 'Create time permissions' と 'Local+Descendent permissions' を
確認すればよい。

どっちにするか?って話になると、両方できた方がよいということになってしまうが、
『ある zfs の path に対して zfs allow が実行されているかをテストする』の方が、
テストに失敗した時に何をすればいいのかわかりやすい分よい気がする。

別にまとめた方がいいけど、zfs allow で表示される permission の種類は以下。

- Create time permissions:
  zfs allow -c で許可された permission。
  その zfs の下位の zfs を create すると、この permission がつく。
- Local+Descendent permissions:
  zfs allow で許可された permission。
- Local permissions:
  zfs が create された際に Create time permissions でついた permission

2015-03-23 Mon

Serverspec で zfs の property のテストに its(:property) が使えるようになった はてぶ

pull request が merge されて Serverspec 2.11.0 から
zfs の property のテストが以下のように書けるようになった。

describe zfs('rpool') do
  its(:property) { should include( 'mountpoint' => '/rpool', 'atime' => 'on' ) }
end


この場合、テスト対象の zfs である rpool に対して

zfs get -Hp -o property,value all rpool


を実行して、その結果を { 'property' => 'value' } な hash に詰めるので、

- have_property のように property の数だけ zfs command を叩かなくてよい
- rspec の hash 用 matcher が使える

といったあたりがメリット。

Referrer (Inside):
[2015-03-24-1] Serverspec で service の property のテストに its(:property) が使えるようになった
ChangeLog 最新ページ / カテゴリ最新ページ / 1 2 3 4 5 6 / page 1 (6)