tar マルチボリューム

考えてみれば tar コマンドは 18 年くらい使い続けているコマンドです。
tar のマルチボリュームオプションを始めて使ってみました。

単に DVD に入りきらないデータがあり、2 枚に分割しただけなのですが、
あらためて tar は便利だなぁと思いました 😉

例えば 1MB のファイル data? が 5 つある場合に 2M づつに分割したい時には以下のように行います。
以下のように 1MB のファイルdata1~data5があります。

$ ls -l data?
-rw-r--r--  1 user group 1048576  322 00:29 data1
-rw-r--r--  1 user group 1048576  322 00:30 data2
-rw-r--r--  1 user group 1048576  322 00:30 data3
-rw-r--r--  1 user group 1048576  322 00:30 data4
-rw-r--r--  1 user group 1048576  322 00:30 data5

-M オプションと –tape-length オプションで out1.tar, out2.tar, out3.tar
の 3 ファイルへ出力します。
2048 は 2048KB です。

$ tar -cv -M --tape-length=2048 -f out1.tar -f out2.tar 
-f out3.tar

するとサイズが 2M 以内になった 3 つのファイルが生成されます。

$ ls -l *.tar
-rw-r--r--  1 user group 2099200  322 00:33 out1.tar
-rw-r--r--  1 user group 2099200  322 00:33 out2.tar
-rw-r--r--  1 user group 1054720  322 00:33 out3.tar

元にリストアする場合は以下のように行います。

$ tar xvM -f out1.tar
./data1
./data2
./data3
ボリューム #2 (`out1.tar') を準備します. リターンキーを押してください: n out2.tar
ボリューム #2 (`out2.tar') を準備します. リターンキーを押してください:
./data4
./data5
ボリューム #3 (`out2.tar') を準備します. リターンキーを押してください: n out3.tar
ボリューム #3 (`out3.tar') を準備します. リターンキーを押してください:
 
$ ls -l
-rw-r--r--  1 user group 1048576  322 00:29 data1
-rw-r--r--  1 user group 1048576  322 00:30 data2
-rw-r--r--  1 user group 1048576  322 00:30 data3
-rw-r--r--  1 user group 1048576  322 00:30 data4
-rw-r--r--  1 user group 1048576  322 00:30 data5

Dell Service Tag Number の調べ方

デルコンピュータのサービスタグナンバーの調べ方を発見したのでメモしておきます。

# dmidecode | less
        DMI type 1, 25 bytes.
        System Information
                Manufacturer: Dell Computer Corporation
                Product Name: PowerEdge XXXXX
                Version: Not Specified
                Serial Number: ここに表示されました!
                UUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
                Wake-up Type: Power Switch

試した OS は CentOS 4.7 と CentOS 5.2 です。

以下で発見しました 😛

Getting information about model no. of computer

Postfixキュー削除

たまにしか発生しないけど、必ず起きる事なので毎回やり方を調べてしまいます。

# mailq
# postsuper -d キューのID

DSET Tool

dell のサーバ情報を取得してレポートしてくれるツールがあります。

※実際に行ってみましたが apache がハングアップしたり、勝手に rpm をインストールしたりするのであくまでも自己責任で行ってください。

DSETツール

上記サイトからダウンロードしてきたファイルをサーバ上で実行するだけです。

# chmod 744 delldset_v1.6.0.135_A00.bin
# ./delldset_v1.6.0.135_A00.bin

15分くらい経つと root ユーザのホームディレクトリに以下のような名前のファイルが出来上がります。

DSET_Report_for_[ホスト名]-SvcTag-サービスタグナンバー-モデル名].zip

ファイル名にはサーバのサービスタグナンバーやモデル名が含まれています。
こういう情報もどうにかすると取得できちゃうんですね 🙂

このファイルを Windows 上で解凍すると中に dsetreport.hta というファイルがあります。
そのファイルを実行するとブラウザのようなモノが立ち上がり
さまざまな情報を見る事ができます。
※解凍を行うにはパスワードが必要になりますが、パスワードについては公表できません。すみません<(_ _)>

600

これは便利です。

logwatch File too large

logwatch が以下のメッセージを出力して終了してしまう。

/etc/cron.daily/00-logwatch:
 
postdrop: warning: uid=0: File too large
send-mail: fatal: root(0): Message file too big

文字通り logwatch が出力しているレポートのサイズが
大きすぎて postfix が送信を拒否している。

何が大きいのか調べてみるには logwatch の出力を
ファイルへリダイレクトして内容を確認してみます。

# logwatch --print > /tmp/logwatch.txt

/tmp/logwatch.txt を見たところ、あるログファイルのが
大きく育ってしまったのが原因である事が判明しました。

そのログファイルを mv してみたところ解決しました。

ログファイルを logrotate でローテーションするようにして解決です。

logwatch がローテーション設定忘れを教えてくれるとは 🙂

Ethna 携帯サイト用 validate

Ethna で携帯サイトを開発していて、キャリアによってフォームから

入力される文字列の文字コードが SJIS の場合と UTF-8 の場合があり、

max(文字列の長さ) の validate で、それぞれの文字コードの strlen()

の結果が違うのでうまくいきませんでした。

文字コードを統一してから validate すれば良いのですが、

そうもできない事情があり、validate plugin を作成してみました。

SJIS か UTF-8 が入力される $nickname の validate の場合に

ActionForm で以下のように定義します。

validate の条件は半角で8文字、全角で4文字以下の場合。

 
var $form = array(
 
'nickname' => array(
 
'type' => VAR_TYPE_STRING,
 
'form_type' => FORM_TYPE_TEXT,
 
'name' => 'ニックネーム',
 
'required' => true,
 
'utf8max' => array(
 
'utf8max' => true,
 
'max' => 8),
 
),
 
);

そして、以下のような Validate Plugin を作成しました。

example/app/plugin/Validate/Example_Plugin_Validator_Utf8max.php

 
<?php
 
class Example_Plugin_Validator_Utf8max extends Ethna_Plugin_Validator
{
function &validate($name, $var, $params)
{
$true = true;
$type = $this->getFormType($name);
if (isset($params['utf8max']) == false || $this->isEmpty($var, $type)) 
{
return $true;
}
$encode に文字列の文字コードが入っている
if ($encode == 'UTF-8') {
if (mb_strwidth($var, 'UTF-8') > $params['max']) {
$msg = "{form}は全角%d文字以下(半角%d文字以下)で入力して下さい";
return Ethna::raiseNotice($msg, E_FORM_MAX_STRING,
array(intval($params['max']/2), $params['max']));
}
} else {
if (strlen($var) > $params['max']) {
$msg = "{form}は全角%d文字以下(半角%d文字以下)で入力して下さい";
return Ethna::raiseNotice($msg, E_FORM_MAX_STRING,
array(intval($params['max']/2), $params['max']));
}
}
}
}
?>

意図する validate ができましたが、もっともっと良い方法があると思います。
皆さんはどうやっているのでしょうか…?

leap second

今朝サーバーのログを見ていたら閏秒がカウントされていた事に気がつきました。

# grep leap /var/log/messages
Jan  1 08:59:59 ns1 kernel: Clock: inserting leap second 23:59:60 UTC

今年は一秒長いんですね。

2009年もよろしくお願いいたします。

dovecot passwd-file の設定

認証用に MySQL などを使うケースが多いようですが、dovecot のみでお手軽に済ませたかったので passwd-file でセットアップしました。
OS は CentOS 4.7
postfix も dovecot も rpm 版です。

  1. 予め postfix で virtual domain の設定を行っておきました。
  2. postfix の設定で dovecot と関係があったのは以下。

    virtual_mailbox_maps
    ディレクトリ構造が dovecot の設定で必要になります。

    foo@example.com example/foo/Maildir/

    virtual_uid_maps, virtual_gid_maps

    virtual_uid_maps = static:5000
    virtual_gid_maps = static:5000
  3. /etc/dovecot.conf
  4. 必要なのは pop3 のみだったので imap はセットアップしませんでした。
    以下は設定した部分のみ。

    protocols = pop3
    #imap_listen = [::]
    #pop3_listen = [::]
    pop3_listen = *
    default_mail_env = maildir:/var/mail/vhosts/%d/%n/Maildir
    #auth_userdb = passwd
    auth_userdb = static uid=5000 gid=5000 home=/var/mail/vhosts/%d/%n
    #auth_passdb = pam
    auth_passdb = passwd-file /etc/dovecot.passwd
  5. passwd-file 作成
  6. PLAIN-MD5パスワードで作成します。
    以下は foo@example.com という pop3 ユーザで、

    パスワードが password の場合の例です。

    $ perl -MDigest::MD5 -e 'printf "{PLAIN-MD5}%sn", Digest::MD5::md5_
    hex("password")'
    {PLAIN-MD5}5f4dcc3b5aa765d61d8327deb882cf99

    /etc/dovecot.passwd を作成します。

    # vi /etc/dovecot.passwd
    foo@example.com:{PLAIN-MD5}5f4dcc3b5aa765d61d8327deb882cf99:5000:5000:::::/var/mail/vhosts/%d/%n
  7. dovecot 起動
  8. # chkconfig dovecot on
    # service dovecot start