PXEブートとNFSとメモリ上でOS起動を組み合わせる

題名の通りなのだが、PXEブートとNFSとメモリ上でOS起動を連携させることで、結構なことができるようになる。

例えば、自動インストールを考えてみよう。

上記の3要素をうまく使えば、kickstartにはあまりそぐわないようなインストール方法をとることができる。

どういった場合かというと、

[note]

  • HDDのデータをまるごとバックアップしておいて、壊れた場合はサーバー再起動するだけで自動復旧
  • kickstartでは融通がきかないような作り込まれたシステムでも、サーバー再起動するだけで自動インストール
  • サーバー毎のインストールデータを/からそれぞれ保持しておいて、新しいサーバーを再起動するだけで用途にあったデータをコピーして自動インストール[/note]

などである。

続きを読む

VirtualHost名だけでなくServeAliasもみる

VirtualHost対応のために、アクセス時のホスト名とVirtualHost名をapacheモジュール内で比較させる方法がある。 しかし、これだけでは不十分で、実際にはServerAliasの設定がされているサーバーも多く、Aliasとマッチさせる必要もでてくる。 そのための関数を書いてみた。以下ソース。

static int check_virtualhost_name(request_rec *r) {

    int i;
    const char *header_name;
    const char *alias_name;

    header_name = apr_table_get(r->headers_in, "HOST");

    if (strcmp(header_name, r->server->server_hostname) == 0) {
        vlimit_debug_log_buf = apr_psprintf(r->pool, "Match: access_name=(%s) ServerName=(%s)"
            , header_name
            , r->server->server_hostname
        );
        VLIMIT_DEBUG_SYSLOG("check_virtualhost_name: ", vlimit_debug_log_buf, r->pool);
        return 0;
    }

    for (i = 0; i < r->server->names->nelts; i++) {
        alias_name = (char **)r->server->names->elts + (r->server->names->elt_size * i);
        vlimit_debug_log_buf = apr_psprintf(r->pool, "INFO: access_name=(%s) ServerAlias=(%s)"
            , header_name
            , alias_name
        );
        VLIMIT_DEBUG_SYSLOG("check_virtualhost_name: ", vlimit_debug_log_buf, r->pool);
        if (strcmp(header_name, alias_name) == 0 ) {
            vlimit_debug_log_buf = apr_psprintf(r->pool, "Match: access_name=(%s) ServerAlias=(%s)"
                , header_name
                , alias_name
            );
            VLIMIT_DEBUG_SYSLOG("check_virtualhost_name: ", vlimit_debug_log_buf, r->pool);
            return 0;
        }
    }

    vlimit_debug_log_buf = apr_psprintf(r->pool, "Not Match: access_name=(%s)"
        , header_name
    );
    VLIMIT_DEBUG_SYSLOG("check_virtualhost_name: ", vlimit_debug_log_buf, r->pool);

    return 1;
}

続きを読む

apacheモジュールでmutexを使った排他制御を実装

apacheモジュールでプロセス間通信を行う場合に、共有メモリを使うと色々問題がでてくる。
preforkの性質上、複数のapache子プロセスがフォークされており、それらがそれぞれリクエストに対する処理を行うため、共有メモリ領域の書き込み時に衝突が起きたりして、データに齟齬が発生してくる。

それを防ぐのが排他処理だ。

今回は、aprで実装済みのglobal mutexを使って排他制御する方法を説明する。

続きを読む

apacheモジュールで共有メモリを使ったプロセス間通信

apacheモジュールでプロセス間通信を行う場合、共有メモリを使ってやる手法がある。

apacheモジュールでよく使われるaprで、共有メモリ用の関数が用意されているため、実装に問題が無い以上はaprを使った方が楽だ。

では具体的な使い方を。

続きを読む

Alfresco 文書を自動でPDF化メモ

OpenOffice連携と連携させるとPDF化ができそうだ。
修正ファイルは以下。
/usr/share/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/OOoDirect/default/openoffice-transform-context.xml
  • 変更前
<bean id="openOfficeConnection" class="net.sf.jooreports.openoffice.connection.SocketOpenOfficeConnection" />
  • 変更後
<bean id="openOfficeConnection" >
    <constructor-arg type="java.lang.String" value="127.0.0.1"/>
    <constructor-arg type="int" value="8100"/>
</bean>

OpenOffice連携のためのスクリプトを作成し実行してデーモン化しておく

続きを読む