トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Solaris10で行こう!

[2006/01/30 更新内容] SNMPエージェント、locate、Postfixなどを加筆。まだ全然体裁が整ってない。

Solaris10で行こう!プロジェクト

kumo.jpは正統派UNIXであるSolaris10で運用されています。この時の構築・運用ノウハウをご紹介していきたいと思います。

Solaris10はアーキテクチャの変更が運用にも大きく影響しています。またLinuxの便利な機能や全部設定してある状態に比べると手を入れなくてはいけない点があります。その辺を中心に、書いていこうと思います。

当初は

  • OSの基本設定、運用
  • インターネットサーバとしての基盤プロトコルサーバ構築・運用

を行い、その後に

  • Solaris10の各種新機能(最小特権やらZFSやらZONEなどなど)の検証
  • 他のOSとの相互接続など

を実施していきたいと思います。

環境
管理人が保有しているSolaris10は以下の三つです。
  1. IBM/Thinkpad X20(x86)
  2. Lepty(x86)
  3. Sun Microsystems/Netra X1(Sparc)
基本方針

このページを作成するに当たっての基本方針は、

  • ただ導入するだけ出はなく「運用」の観点からの構築を行う。
  • 運用の観点から、Solaris10付属のアプリケーションを可能な限り使用する。
  • Solaris10特有部分を中心に紹介する。

ということにしています。

Linuxユーザ、FreeBSDユーザへの諸注意

LinuxやFreeBSDと違い、Solarisはあまり便利なツールは入っていません。例えばtarも、GNU Tarではありませんので-zオプションなどは使えません。このような注意点について、ご紹介します。

tar

SolarisのtarはGNU Tarではありませんので、tar.gzを解凍する時は次のようにするのが一般的です。

gzcat hoge.tar.gz | tar xpvf -

もしくはGNU Tarを入れてしまってください。実際、すんごく長いファイル名や深いディレクトリは対応できなかったことがありました。詳細は忘れましたが。でも基本的に私は余計なものを入れたくないので問題が起きてから対応する予定です。

top

Solarisにはtopコマンドはついていません。が、prstatというコマンドでほぼ同様のことができます。でも実はSolarisはプロセス関係のコマンドが豊富で、かなり詳細なことまで調べられます。それらはたいてい"p"で始まるコマンドですので

p[ctrl+D]

などで気になったコマンドは調べてみてください。

tcpdump

これも、ありません。でもsnoopというコマンドがついています。これで出力したファイルはEhterealで読み込むことができます。よく使うコマンド例を載せておきます。

snoop -o hoge.dat port 80 and host 10.10.10.10

上記で10.10.10.10宛てかつポート80のパケットを取得し、カレントディレクトリのhoge.datとして記録します。or指定をするとポート80番のパケットと、10.10.10.10宛のパケット両方を取得します。ctrl+Cで止めます。

cron

コマンドではないのですが、Solarisのcronでは*/5という表記は使えません。5,10,15...と、書いていく必要があります。ちなみにrootのcronは/var/spool/cron/crontabs/rootにあります。

OSの運用管理

パッチ

パッチの入手
パッチ入手方法は2005年12月現在、二つあります。一つはダウンロード、もう一つはコマンドでの自動アップデートです。

セキュリティ対策、バグ対策のパッチあてはOS運用管理上非常に重要なものです。パッチはライセンスを購入した有償のものと、セキュリティパッチなど最低限のものだけの無償パッチの二種類があります。違いとしては、無償版はセキュリティパッチとハードウェアドライバのアップデートだけ、有償版はそれに通常のバグフィックス(機能追加もか?)を含むということです。

パッチについての方針はここに記載されています。(英語)

ここからSolaris10用のクラスタパッチをダウンロードできます。

コマンドの場合はsmpatchコマンドを使います。ただ、当初はユーザ登録などは不要でしたが現在は一度登録する必要があるようです。詳しくは調べてないのでコマンドだけでできるのか、Webから登録できるのかは知りませんが、一般的な手順としてはXのupdatemanagerを起動して登録します。しかしこれも3/05版には入っていませんので、次の手順を実施することになります。

  1. smpatch updateを実施する。
  2. updatemanagerが入るので、これを起動して登録する。(登録は無料だが、英語)
  3. 登録後はsmpatchコマンドでもupdatemanagerでもパッチのダウンロード、適用が可能。

その後、日常的なパッチあて作業は以下のようになります。

smpatch update

そこそこ時間がかかります。終わったら、コマンド終了後

% smpatch add -x idlist=/var/sadm/spool/disallowed_patch_list

で当てられなかったパッチを手動で適用します。たいていの場合再起動が必要なので、日時を調整して再起動を実施します。

不要サービスの停止

  • 遠隔ログイン、情報提供関係
svcadm disable svc:/network/finger:default
svcadm disable svc:/network/telnet:default
svcadm disable svc:/network/login:rlogin
svcadm disable svc:/network/shell:default
  • nscd
svcadm disable  svc:/system/name-service-cache:default
  • RPC 関係
svcadm disable svc:/network/rpc/gss:default
svcadm disable svc:/network/rpc/mdcomm:default
svcadm disable svc:/network/rpc/meta:default
svcadm disable svc:/network/rpc/metamed:default
svcadm disable svc:/network/rpc/metamh:default
svcadm disable svc:/network/rpc/rstat:default
svcadm disable svc:/network/rpc/rusers:default
svcadm disable svc:/network/rpc/smserver:default
svcadm disable svc:/network/rpc-100235_1/rpc_ticotsord:default
svcadm disable svc:/network/rpc-100083_1/rpc_tcp:default
svcadm disable svc:/network/rpc-100068_2-5/rpc_udp:default
  • NFS 関係
svcadm disable svc:/network/nfs/nlockmgr:default
svcadm disable svc:/network/nfs/status:default
svcadm disable svc:/network/nfs/client:default

ログ管理

ログ管理は大きく二つの設計と運用が必要になります。

ログ出力
Solarisでは言うまでもなくログはSyslogが基本です。デフォルトでも外部から受信できるようになっています。

SMFRはsvc:/system/system-log:defaultです。svcadm restart system-logなどでOKです。なお試験やスクリプトでログを書き込む時はLinuxなどと同様、loggerコマンドを使えます。

ログローテーション
Syslogのローテーションは/etc/logadm.confというファイルを編集して行います。例えば毎日ローテートし、14日分圧縮保存する場合は/etc/logadm.confに以下のような行を追加します。
/var/adm/cat2940.log -A 1d -C 14 -z 0 -a 'kill -HUP `cat /var/run/syslog.pid`'

その後syslogを再起動します。/usr/sbin/logadmはcronで定期実行されます。下記はデフォルト値。

10 3 * * * /usr/sbin/logadm

SNMPエージェント

目的・主な機能
Solaris10にはSNMP AgentとしてNet-SNMPが入っています。MRTGやCactiでSNMP情報を取得する際に利用します。
設定方法
起動時に
/usr/sfw/sbin/snmpd

を実行すれば起動します。ただしデフォルトのものはバージョン5.0.9です。そのためsnmpd.confでlinkupdownnotificationsなどのオプションは使えません。設定ファイルは/etc/snmp/conf/snmpd.confです。

ちなみにNet-SNMPの通常コマンドは/usr/sfw/bin/以下にあります。snmpwalkなどを使いたいときにはここ以下を探してください。snmpdやsnmptrapdは/usr/sfw/sbin/以下にあります。

インターフェースの設定変更

関連ファイルを表にしてみます。

修正するファイル ホスト名変更時 IPアドレス変更時 ファイルの説明
/etc/nodename 変更必要 ホスト名が記述される
/etc/hostname.<ifname> 変更必要 NIC に対応したホスト名を定義し、/etc/inet/ipnodes ファイルから IPv6 アドレスを特定する
/etc/hosts 変更必要 変更必要 ホスト名と IPv4 アドレスの対応を定義
/etc/networks 変更必要 ネットワーク名とネットマスク番号を定義
/etc/netmasks 変更必要 ネットワーク番号とネットマスク番号を定義
/etc/defaultrouter 変更必要 デフォルトゲートウェイを定義

ファイル検索

導入アプリケーション
Locate([ダウンロード|])
目的・主な機能
ファイル検索にいちいちfindを使うと遅いので、インデックスを作成してひくようにする。
設定方法
  1. locate(slocate)とupdatedbのバイナリを/usr/local/sbinあたりにコピーする。
  2. mkdir -p /var/db/slocateを作成する。
  3. slocate グループを作成する。

データベースの更新は updatedb で実行する。下記リンクを作成。

ln -s /usr/local/bin/locate /usr/local/bin/updatedb

この後 updatedb を実行すると index ができるので、適当にパスの通ったディレクトリにそれぞれのバイナリをコピーする。

locate のパーミッションとオーナーは

-rwxr-sr-x   1 root     slocate

とする。(2755)

最後に cron に登録する。

0 3 * * * /usr/local/bin/updatedb > /dev/null 2>&1

NTPクライアント・NTPサーバ

導入アプリケーション
NTP(Solaris10付属)
目的・主な機能
外部のNTPサーバと時刻同期をすると共に、LANのNTPサーバとして他の機器からのNTPリクエストを受け付ける。
設定ファイル
/etc/inet/ntp.confを/etc/inet/ntp.server を修正して作成する。key関係は使わないのでコメントアウトしておく。コメント文を除いた設定内容は以下の通り。
server ntp.ring.gr.jp prefer
server ntp.ring.gr.jp

server 127.127.1.0
fudge 127.127.1.0 stratum 10

enable auth monitor
driftfile /var/ntp/ntp.drift
statsdir /var/ntp/ntpstats/
filegen peerstats file peerstats type day enable
filegen loopstats file loopstats type day enable
filegen clockstats file clockstats type day enable
設定作業
Driftファイルを作成する。
touch /var/ntp/ntp.drift
サーバの起動・停止・再起動
それぞれSMFで行う。
  • 起動
/usr/sbin/svcadm enable ntp
  • 停止
/usr/sbin/svcadm disable ntp
  • 再起動
/usr/sbin/svcadm restart ntp
動作確認
  • ntpqコマンド
x20% ntpq -pn
    remote           refid      st t when poll reach   delay   offset    disp
==============================================================================
 127.127.1.0     127.127.1.0     10 l    3   64  377     0.00    0.000   10.03
*133.23.250.240  133.243.237.141  2 u  253  512  377    30.56    0.333   41.46
+133.243.3.209   133.243.230.51   2 u  492  512  377    20.14    1.033   66.16
  • /var/adm/messagesログ
Nov 26 00:05:30 x20 ntpdate[12056]: [ID 558275 daemon.notice] adjust time server 133.186.4.15 offset -0.052978 sec
Nov 26 00:05:30 x20 xntpd[12058]: [ID 702911 daemon.notice] xntpd 3-5.93e+sun 03/08/29 16:23:05 (1.4)
Nov 26 00:05:30 x20 xntpd[12058]: [ID 301315 daemon.notice] tickadj = 5, tick = 10000, tvu_maxslew = 495, est. hz = 100
Nov 26 00:05:30 x20 xntpd[12058]: [ID 266339 daemon.notice] using kernel phase-lock loop 0041, drift correction 0.00000
Nov 26 00:05:31 x20 xntpd[12058]: [ID 266339 daemon.notice] using kernel phase-lock loop 0041, drift correction -13662.79297

SSHサーバ

設定ファイル
/etc/ssh/sshd_config
設定変更内容
公開鍵認証のみ許可する。以下の二行を変更する。
PasswordAuthentication no
#PasswordAuthentication yes
PAMAuthenticationViaKBDInt no
#PAMAuthenticationViaKBDInt yes

秘密鍵がない環境からアクセスできないのでパスワード認証を許可した方がよいという人も多いので、その辺はさじ加減で。

起動
svcadm restart ssh

日本語キーボード

106キーボードと指定していてもうまく行かない場合は以下を実行すると、直ります。

eeprom kbd-type=Japanese\(106\)

Postfix

インストール

まずはユーザ・グループの作成です。

% groupadd -g 3002 postfix
% groupadd -g 3003 postdrop
% useradd -g postfix -u 3002 postfix

次にBerkeley DBの最新版をゲット、コンパイル、インストールします。

%wget http://downloads.sleepycat.com/db-4.4.16.tar.gz
%cd db-4.4.16/build_unix
%env CC=gcc ../dist/configure
%/usr/ccs/bin/make
%/usr/ccs/bin/make install
%/usr/ccs/bin/make distclean

続いてcyrus-saslの2系も入れておきます。

%wget ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-2.1.20.tar.gz
%gzcat cyrus-sasl-2.1.20.tar.gz | tar xfpv -
%cd cyrus-sasl-2.1.20
%./configure --enable-login --enable-plain --disable-anon --disable-digest --disable-krb4 --disable-gssapi --disable-otp --disable-sql --with-plugindir=/usr/local/lib/sasl2 --with-saslauthd=/var/cyrus --with-pwcheck=/var/cyrus --with-dblib=none
%/usr/sfw/bin/gmake
%/usr/sfw/bin/gmake install

SASL関係の設定は/usr/local/lib/sasl2/smtpd.confを以下のようにします。

pwcheck_method: saslauthd
allowanonymouslogin: no
allowplaintext: yes
mech_list: plain login

pamで個別に起動する場合は以下のように指定。(特に実施の必要はない)

/usr/local/sbin/saslauthd -a pam
mkdir /var/cyrus
chmod 700 /var/cyrus
chown postfix /var/cyrus

次にsaslauthdをSMF化します。

cp /var/svc/manifest/application/management/webmin.xml /var/svc/manifest/application/management/saslauthd.xml
% vi /var/svc/manifest/application/management/saslauthd.xml

変更点

% diff /var/svc/manifest/application/management/webmin.xml /var/svc/manifest/application/management/saslauthd.xml
6c6
<       ident   "@(#)webmin.xml 1.1     04/11/11 SMI"
---
>       ident   "@(#)saslauthd.xml      1.1     04/11/11 SMI"
8c8
<       Service manifest for the Webmin service.
---
>       Service manifest for the saslauthd service.
11c11
< <service_bundle type='manifest' name='SUNWwebminr:webmin'>
---
> <service_bundle type='manifest' name='saslauthd'>
14c14
<       name='application/management/webmin'
---
>       name='application/management/saslauthd'
41c41
<               exec='/usr/sfw/lib/webmin/start'
---
>               exec='/usr/local/sbin/saslauthd -a pam'
56c56
< Webmin, a httpd based system administration tool.
---
> saslauthd
60,61c60,61
<                       <manpage title='webmin' section='1M'
<                               manpath='/usr/sfw/man' />
---
>                       <manpage title='saslauthd' section='8'
>                               manpath='/usr/local/man' />

設定内容の確認と取り込み。

% svccfg validate /var/svc/manifest/application/management/saslauthd.xml
% svccfg -v import /var/svc/manifest/application/management/saslauthd.xml

ここで登録確認と起動と動作確認をしましょう。

% svcs -x saslauthd
svc:/application/management/saslauthd:default (saslauthd)
 状態: 2005年11月26日 11時31分41秒 以降disabledです
原因: 管理者が使用不可にしました。
   参照: http://sun.com/msg/SMF-8000-05
   参照: saslauthd(8)
影響: このサービスは動作していません。

まだサービスはありません。

% svcadm enable saslauthd
% svcs -x saslauthd
svc:/application/management/saslauthd:default (saslauthd)
 状態: 2005年11月26日 11時32分21秒 以降onlineです
   参照: saslauthd(8)
   参照: /var/svc/log/application-management-saslauthd:default.log
影響: ありません。

これでsaslauthdはまともに動いていることが確認できました。さていよいよPostfixの最新版をゲット、コンパイル、インストールです。

ftp://ftp.ixp.jp/postfix/official/postfix-2.2.5.tar.gz
wget http://mirror.postfix.jp/postfix-release/official/postfix-2.2.5.tar.gz
gzcat postfix-2.2.5.tar.gz | tar xpvf -
cd postfix-2.2.5
/usr/ccs/bin/make tidy 念のための不要ファイルの削除なので、なくてもいい。
/usr/sfw/bin/gmake -f Makefile.init makefiles CCARGS='-DHAS_DB -I/usr/local/BerkeleyDB.4.4/include -DUSE_SASL_AUTH -I/usr/local/include/sasl' AUXLIBS='-L/usr/local/lib -L/usr/local/BerkeleyDB.4.4/lib -R/usr/local/lib -R/usr/local/BerkeleyDB.4.4/lib -ldb -lsasl2 -lm -lz'
/usr/sfw/bin/gmake install

途中の対話は基本的に全てEnterでOK。/etc/postfix/main.cfで中核の設定をします。

  • main.cf
allow_mail_to_commands = alias,forward,include
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
debug_peer_level = 2
home_mailbox = Maildir/
html_directory = no
mail_owner = postfix
mailq_path = /usr/bin/mailq
manpage_directory = /usr/local/man
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
mydomain = kumo.jp
myhostname = mail.kumo.jp
mynetworks = 192.168.33.0/24, 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/lib/sendmail
setgid_group = postdrop
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
unknown_local_recipient_reject_code = 550

postfix checkで設定を確認します。

以下はおまけ。

  • postconf -n で設定した値のみ出力。
  • postconf -a で全設定値出力。
cd /etc/postfix
newaliases

そしてPostfixをSMF化するために、sendmailのファイルを利用します。

cp /var/svc/manifest/network/smtp-sendmail.xml /var/svc/manifest/network/postfix.xml
% diff /var/svc/manifest/network/smtp-sendmail.xml /var/svc/manifest/network/postfix.xml
15c15
< <service_bundle type='manifest' name='SUNWsndmr:sendmail'>
---
> <service_bundle type='manifest' name='postfix'>
49,56d48
<           name='identity'
<           grouping='optional_all'
<           restart_on='refresh'
<           type='service'>
<               <service_fmri value='svc:/system/identity:domain' />
<       </dependency>
< 
<       <dependency
64c56
<       <instance name='sendmail' enabled='false'>
---
>       <instance name='postfix' enabled='false'>
72c64
<                           value='file://localhost/etc/mail/sendmail.cf' />
---
>                           value='file://localhost/etc/postfix/main.cf' />
75,110d66
<               <dependency
<                   name='nsswitch'
<                   grouping='require_all'
<                   restart_on='refresh'
<                   type='path'>
<                       <service_fmri
<                           value='file://localhost/etc/nsswitch.conf' />
<               </dependency>
< 
<               <!--
<               If autofs is enabled, wait for it to get users' home
<               directories.
<               -->
<               <dependency
<                   name='autofs'
<                   grouping='optional_all'
<                   restart_on='none'
<                   type='service'>
<                       <service_fmri value='svc:/system/filesystem/autofs' />
<               </dependency>
< 
<               <dependent
<                       name='smtp-sendmail_multi-user'
<                       grouping='optional_all'
<                       restart_on='none'>
<                               <service_fmri
<                                   value='svc:/milestone/multi-user' />
<               </dependent>
< 
<               <!--
<               Sendmail is hard-coded to sleep for 60 seconds if it cannot
<               determine the FQHN, so the timeout for start must be longer
<               than that.  For details, see
<               http://www.sendmail.org/vendor/sun/differences.html#3.2
<               -->
< 
114,115c70,71
<                       exec='/lib/svc/method/smtp-sendmail start'
<                       timeout_seconds='120' />
---
>                       exec='/usr/sbin/postfix start'
>                       timeout_seconds='30' />
120,121c76,77
<                       exec='/lib/svc/method/smtp-sendmail stop %{restarter/contract}'
<                       timeout_seconds='60' />
---
>                       exec='/usr/sbin/postfix stop'
>                       timeout_seconds='120' />
126c82
<                       exec='/lib/svc/method/smtp-sendmail refresh'
---
>                       exec='/usr/sbin/postfix reload'
136c92
<                               value='solaris.smf.manage.sendmail' />
---
>                               value='solaris.smf.manage.postfix' />
142c98
<                               sendmail SMTP mail transfer agent
---
>                               postfix SMTP mail transfer agent
146,147c102,103
<                               <manpage title='sendmail' section='1M'
<                                   manpath='/usr/share/man' />
---
>                               <manpage title='postfix' section='1M'
>                                   manpath='/usr/local/man' /> 

設定をインポートします。

% svccfg -v import /var/svc/manifest/network/postfix.xml

これで、svcadm start postfixなどが使えるようになります。

mailman

昔はfmlを使っていたのですが、やはり今風のWeb管理画面を持つMLの方が何となくよいので、mailmanを導入しました。

  • ユーザ、グループ追加。
groupadd -g 3004 mailman
useradd -g mailman -u 3003 mailman
  • インストールディレクトリ作成
mkdir /usr/local/mailman
chgrp mailman /usr/local/mailman
chmod a+rx,g+ws /usr/local/mailman
  • コンパイル

(パスの確認)

setenv PATH /usr/local/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/ccs/bin:/usr/sfw/bin:/usr/sfw/sbin:.
  • 実行。バージョンアップ時も以下の3コマンドを実施するだけ。
./configure --with-cgi-gid=webservd
/usr/sfw/bin/gmake install
/usr/local/mailman/bin/check_perms -f
  • Webサーバへの設定追加

httpd.conf に下記を追加。

Alias /pipermail/ "/usr/local/archives/public/"
ScriptAlias /mailman/ "/usr/local/mailman/cgi-bin/"
  • アイコンのコピー。
cp /usr/local/mailman/icons/* /var/apache2/icons/
  • Postfixへの設定追加

main.cf に追加。

owner_request_special = no
recipient_delimiter = +
  • Postfix再起動
svcadm restart postfix
  • Mailmanの設定

/usr/local/mailman/Mailman/mm_cfg.py に以下を追加する。

DEFAULT_EMAIL_HOST = 'kumo.jp'
DEFAULT_URL_HOST = 'kumo.jp'
DEFAULT_SERVER_LANGUAGE = 'ja'
MTA = 'Postfix'
add_virtualhost('kumo.jp','kumo.jp')
  • apache2の再起動
/usr/apache2/bin/apachectl configtest
svcadm restart apache2

開始は/etc/init.d/mailman start

ML 作成時は Web での入力後、/usr/local/mailman/data でpostalias hash:aliases aliases