2015年8月29日土曜日

[CentOS7][Rundeck] コマンドを実行する


[CentOS7][Rundeck] ノードを追加する」の続きです

前回までの作業で以下の環境ができました。
  • Rundeckサーバ(ローカル): centos7 [10.1.0.80]
  • ノード1(リモート): pm01 [10.1.0.71]
  • ノード2(リモート): pm01 [10.1.0.73]
  • プロジェクト: sandbox02

今回は、RundeckのGUIを使って、ローカルとリモートでコマンドを実行してみます。


コマンドを実行する


メニューバーの [Commands] をクリックすると下図の画面になります。



[Command:] に 実行したいコマンドを入力します。
今回は、以下のようにユーザと、時間を表示するようにコマンドを入力してみます。
echo "- `id` - `date`"
[Nodes:] でコマンドを実行するサーバを指定します。
今回は、[Filter] をクリックして、メニューから "Show all nodes" を選択し、全サーバを指定してみます。

サーバを指定すると、下図のように緑色の実行ボタンをクリックできるようになります。
[Run on 3 Nodes]をクリックすると、選択したサーバでコマンドが実行されます。

 

下図のように、同じ画面の赤枠部分に実行結果が表示されます。



過去のコマンド実行結果を見る


過去の実行結果を見たい場合は、メニューバーの [Activity] をクリックします。
下図のように、過去の履歴が表示されます。


見たい履歴をクリックして、[Log Output] をクリックすると、実行結果を見ることができます。


使い方の詳細は、「ユーザマニュアル(日本語)」を参照してください。






[CentOS7][Rundeck] ノードを追加する


[CentOS7][Rundeck] プロジェクトを作成する」の続きです。

前回、プロジェクトを作成したので、localhost 上ではコマンドやジョブを実行できるようになっています。

Rundeckは、別のサーバでコマンドやジョブを実行することもできますが、それには、Rundeckにサーバを登録する必要があります。

また、Rundeckをインストールしたサーバから、別のサーバでコマンドやジョブを実行する場合は、ssh とscp が使われ、パスフレーズなしの秘密鍵を使用してリモートサーバに接続するので、接続相手のサーバにも ssh の設定を行う必要があります。

今回は、Rundeckに下記のサーバを登録して、秘密鍵(パスフレーズなし)でssh接続できるように設定します。
接続先のsshユーザは、何でも設定できますが、今回は、root でログインすることにします。 
  • pm01(10.1.0.71)
  • pm02(10.1.0.72)

Rundeck にサーバを登録する


GUIからは登録できないので、設定ファイルにサーバを追加します。

設定ファイルは、プロジェクトごとに違いますが、
下図のプロジェクトの [ congigure ] で確認できます。(赤枠)


今回は、sandbox2 という名称のプロジェクトを使用しているので、下記設定ファイルにサーバを追加します。
  • /var/rundeck/projects/sandbox02/etc/resources.xml

追加した内容は、以下のとおり。
pm01, pm02が今回追加した設定です。
<?xml version="1.0" encoding="UTF-8"?>

<project>
  <node name="localhost" description="Rundeck server node" tags="" hostname="localhost" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.10.0-229.1.2.el7.x86_64" username="rundeck"/>
  <node name="pm01" description="pacemaker01" tags="" hostname="10.1.0.71" osArch="amd64" osFamily="unix" osName="CentOS" osVersion="6.6" username="root" tag="pm">
    <attribute name="system" value="DEMO"/>
    <attribute name="env" value="develop"/>
  </node>
  <node name="pm02" description="pacemaker02" tags="" hostname="10.1.0.72" osArch="amd64" osFamily="unix" osName="CentOS" osVersion="6.6" username="root" tag="pm"/>
</project>
サーバ1台につき、<node>設定を1つ追加します。 hostname に IPアドレスを設定し、usernameに SSH接続するときに使用するユーザを設定しています。
<attribute> で、任意の属性を追加できるので、試しに、system(システム名) と env(環境) を設定しています。
詳細は、ドキュメントを参照してください。

プロジェクトに登録したサーバ(pm01/pm02)は、GUIで下図のように確認できます。
右端に表示されているユーザ とIPアドレスで ( 例: root @ 10.1.0.71 ) で ssh 接続します。




登録したサーバにSSHの公開鍵を登録する


上記で pm01 と pm02 には、root ユーザで接続するように設定したので、pm01 と pm02 の root ユーザに ssh の公開鍵を設定します。

Rundeck がssh接続で使用する秘密鍵(パスフレーズなし)は、下図の画面で確認できます。
今回はデフォルトの秘密鍵を使用しますが、自分で作った秘密鍵も使用できます。



秘密鍵(id_rsa)と同じ場所に、公開鍵(id_rsa.pub)があります。
[root@centos7 ~]# ls -al /var/lib/rundeck/.ssh
合計 16
drwx------  2 rundeck rundeck 4096  8月 23 13:25 .
drwxr-xr-x 13 rundeck rundeck 4096  8月 23 22:12 ..
-rw-------  1 rundeck rundeck 1679  8月 23 13:25 id_rsa
-rw-r--r--  1 rundeck rundeck  382  8月 23 13:25 id_rsa.pub

pm01 に root ユーザでログインして、公開鍵を設置します。
下記のように root ユーザのホームディレクトリに ".ssh" ディレクトリを作成して、パーミションを変更します。
[root@pm01 ~]# mkdir .ssh/
[root@pm01 ~]# chmod 600 .ssh
Rundeckの公開鍵を authorized_keys ファイルに記載して、パーミションを変更します。
vi で authorized_keys を開いて、公開鍵(id_rsa.pub) の内容をコピペすればOKです。
[root@pm01 ~]# cd .ssh
[root@pm01 .ssh]# vi authorized_keys
[root@pm01 .ssh]# cat ./authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDChCt2WADQAj7VwxYx4Q9BT5X17hZWSp+LXSSK9P5K5SoUHR/i6i5dnfsNF97LOShDhmG912qcUfVbsZRDat5ZWoE2S3YmLtpNl2lkMj/vgbpRptPCgF2h8FE2iyns/oYKihWJaGoBj55HoK4QRq6aWesulcckEHhno1VXIjLOUi19fxeClc3taH4uK7imh2IEH9UNXhj16Ggu00+UhmhZuMfmlsGluyrviw6YUePLCq9JujT9K+pcYkzCfmVzftOtgA1ukzcRY09+OEKdpPWF14M4k2DWvFzUSXIi2szbwO2kUZ6ynaps7NqexjpOkRaEQassVVKDednbHp48QFqlF
[root@pm01 .ssh]# chmod 600 ./authorized_keys

pm02 も同様に設定し、Rundeckをインストールしたサーバからパスワードなしで ssh 接続できればOKです。
[rundeck@centos7 ~]$ ssh -i /var/lib/rundeck/.ssh/id_rsa root@10.1.0.71 'hostname'
The authenticity of host '10.1.0.71 (10.1.0.71)' can't be established.
RSA key fingerprint is 81:06:ad:b9:47:1a:a7:4b:06:e6:e0:94:4e:a5:49:98.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.1.0.71' (RSA) to the list of known hosts.
pm01




2015年8月25日火曜日

[CentOS7][Rundeck] プロジェクトを作成する


[CentOS7][Rundeck] Rundeck2.5.3 をインストールする」 の続きです。

Rundeck がインストールできたので、さっそく、使ってみます。
Rundeckで、まず、最初にやることは、プロジェクトの作成です。

Rundeck の主要なUIは、下記の 2 つです。
  • GUI: HTML ベースのグラフィカルなコンソール
  • CUI: Shell ツール
どちらのインターフェイスからも、プロジェクト作成・リソースの閲覧・ディスパッチ(コマンドの発信)・ジョブの保存と実行が可能です。
ユーザマニュアル 参照)

さらに Rundeck にはサーバーのプログラムとやり取りできる WebAPI も用意されていす。
Rundeck API 参照)

今回は、GUI、CUI、WebAPIを使って、プロジェクトの作成と削除をしてみます。


GUIでプロジェクトを作成


ブラウザでコンソールを開いてログインすると、初期状態ではプロジェクトが無いので下図のように表示されます。
[New Project ] をクリックします。



[Project Name] を入力します。
他のパラメータは、とりあえずデフォルトでOKです。後で設定を変えられます。



画面を下方向にスクロールして、[Create] をクリックすると、プロジェクトが作成されます。



プロジェクトの作成が成功すると、下図のように表示されます。
赤枠で示した場所にプロジェクト名が表示され、ここをクリックすると他のプロジェクトを選択したり、新しいプロジェクトを作成するためのメニューが表示されます。



赤枠で示した場所をクリックすると、プロジェクトの一覧が表示されます。
プロジェクトのパラメータ設定や、削除をしたい場合は、[Configure]をクリックします。



[Delete Project]タブをクリックして、[Delete this Project] をクリックすると、プロジェクトを削除できます。





CUIでプロジェクトを作成


Rundeck をインストールしたサーバに root でログインし、 rundeck ユーザにスイッチします。
下記のようにコマンドを実行すると、"sandbox02" という名称のプロジェクトが作成されます。
[rundeck@centos7 ~]$ rd-project -a create -p sandbox02
Project was created: sandbox02

プロジェクトの設定変更や削除は、GUIで行います。

コマンドの詳細は下記URLを参照してください。



WebAPIでプロジェクトを作成


WebAPIを実行するには認証する必要があります。
認証しないでWebAPIを実行すると以下のようなエラーになります。
<result error='true' apiversion='13'><error code='unauthorized'><message>(unauthenticated) is not authorized for: /api/1/projects</message></error></result>
トークンを使用する方法は難しそうなので、今回はパスワード認証を試します。
以下のようにコマンドを実行して admin でログインし、cookie のセッションIDをファイルに保存します。
[rundeck@centos7 rundeck]$ curl -s -L -c /tmp/cookies -b /tmp/cookies -d j_username=admin -d j_password=admin http://localhost:4440/j_security_check > /dev/null
/tmp/cookies を見ると、以下のようにセッションIDが保存されています。
[rundeck@centos7 rundeck]$ cat /tmp/cookies
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

localhost       FALSE   /       FALSE   0       JSESSIONID      bl7b9lk5rwz2lpp9brjte5cy
10.1.0.80       FALSE   /       FALSE   0       JSESSIONID      1vdzooskdoirmee5cube3tvo5
このcookieを指定して、WebAPIを実行します。 プロジェクトの一覧を表示してみます。
[rundeck@centos7 rundeck]$ curl -b /tmp/cookies  http://localhost:4440/api/1/projects
<result apiversion="13" success="true">
  <projects count="1">
    <project>
      <name>sandbox02</name>
      <description></description>
    </project>
  </projects>
</result>
プロジェクトが1つあるのがわかります。
 新規で "sandbox03" プロジェクトを作成してみます。リクエストは XML形式とJSON形式2つありますが、今回は、JSON形式を試します。
[rundeck@centos7 rundeck]$ curl -b /tmp/cookies -H 'Content-Type: applion' -X POST -d '{ "name": "sandbox03" }' http://localhost:4440/api/11/projects
{"url":"http://10.1.0.80:4440/api/13/project/sandbox03","name":"sandbox03","description":"","config":{"project.name":"sandbox03","project.ssh-authentication":"privateKey","service.NodeExecutor.default.provider":"jsch-ssh","resources.source.1.config.includeServerNode":"true","resources.source.1.config.generateFileAutomatically":"true","resources.source.1.config.file":"/var/rundeck/projects/sandbox03/etc/resources.xml","project.ssh-keypath":"/var/lib/rundeck/.ssh/id_rsa","service.FileCopier.default.provider":"jsch-scp","resources.source.1.type":"file"}}
実行結果は、プロジェクトのパラメータがJSON形式で表示されます。
プロジェクト一覧を表示すると、sandbox03 が表示されます。
[rundeck@centos7 rundeck]$ curl -b /tmp/cookies  http://localhost:4440/api/1/projects
<result success='true' apiversion='13'>
  <projects count='2'>
    <project>
      <name>sandbox02</name>
      <description></description>
    </project>
    <project>
      <name>sandbox03</name>
      <description></description>
    </project>
  </projects>
</result>
こんどは、sandbox03 プロジェクトを削除して、一覧表示してみます。
[rundeck@centos7 rundeck]$ curl -b /tmp/cookies -X DELETE http://localhost:4440/api/11/project/sandbox03
[rundeck@centos7 rundeck]$ curl -b /tmp/cookies  http://localhost:4440/api/1/projects
<result success='true' apiversion='13'>
  <projects count='1'>
    <project>
      <name>sandbox02</name>
      <description></description>
    </project>
  </projects>
</result>
sandbox03 プロジェクトが削除されました。




2015年8月23日日曜日

[CentOS7][Rundeck] Rundeck2.5.3 をインストールする


OSSのジョブスケジューラである Rundeck を CentOS7 にインストールします。
rundeck.org の download ページを参考にしました。

サーバのメモリが少ないと rundeck がまともに動かないので、1024MB以上は割り当てたほうが良さそうです。

今回、Rundeck をインストールするサーバは、以下のとおり。

  • ホスト名: centos7
  • IPアドレス: 10.1.0.80
  • OS: CentOS7.0
  • ファイヤーウォール: 無効
  • SElinux: 無効

Rundeck インストール


rpm だと、以下のように簡単にインストールできます。最新版がインストールされます。
[root@centos7 ~]# yum install java-1.7.0 
[root@centos7 ~]# rpm -Uvh http://repo.rundeck.org/latest.rpm 
[root@centos7 ~]# yum install rundeck 
Rundeck を起動します。
[root@centos7 ~]# /etc/init.d/rundeckd start
Starting rundeckd (via systemctl):                         [  OK  ]
[root@centos7 ~]#

管理画面へのアクセス


ブラウザで下記URL アクセスすると、下図の管理画面が表示されます。
デフォルトでは、ローカルからしかアクセスできません。
ユーザ: admin 、パスワード: admin でログインできます。
  • http://localhost:4440



外部から管理画面にアクセスする


サーバにGUI環境をインストールすることが少ないので、ローカルからしかアクセスできないのは困ります。
なので、外部から、IPアドレスを指定してアクセスできるように設定を変更します。

まず、Rundeck起動時に、ログに名前解決のエラーが出ていたので、/etc/hosts にホスト名を登録します。
[root@centos7 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
10.1.0.80   centos7
/etc/rundeck/rundeck-config.properties の下記赤字部分をIPアドレスに書き換えます。
#loglevel.default is the default log level for jobs: ERROR,WARN,INFO,VERBOSE,DEBUG
loglevel.default=INFO
rdeck.base=/var/lib/rundeck

#rss.enabled if set to true enables RSS feeds that are public (non-authenticated)
rss.enabled=false
# change hostname here
grails.serverURL=http://10.1.0.80:4440
dataSource.dbCreate = update
dataSource.url = jdbc:h2:file:/var/lib/rundeck/data/rundeckdb;MVCC=true;TRACE_LEVEL_FILE=4
念のため、/etc/rundeck/framework.properties の下記赤字部分もIPアドレスに書き換えます。
# framework.properties -
#

# ----------------------------------------------------------------
# Rundeck server connection information
# ----------------------------------------------------------------

framework.server.name = localhost
framework.server.hostname = localhost
framework.server.port = 4440
framework.server.url = http://10.1.0.80:4440
# Username/password used by CLI tools.
framework.server.username = admin
framework.server.password = admin

# ----------------------------------------------------------------
# Installation locations
# ----------------------------------------------------------------

rdeck.base=/var/lib/rundeck

framework.projects.dir=/var/rundeck/projects
framework.etc.dir=/etc/rundeck
framework.var.dir=/var/lib/rundeck/var
framework.tmp.dir=/var/lib/rundeck/var/tmp
framework.logs.dir=/var/lib/rundeck/logs
framework.libext.dir=/var/lib/rundeck/libext

# ----------------------------------------------------------------
# SSH defaults for node executor and file copier
# ----------------------------------------------------------------

framework.ssh.keypath = /var/lib/rundeck/.ssh/id_rsa
framework.ssh.user = rundeck

# ssh connection timeout after a specified number of milliseconds.
# "0" value means wait forever.
framework.ssh.timeout = 0
rundeck を再起動します。
[root@centos7 ~]# /etc/init.d/rundeckd restart
Restarting rundeckd (via systemctl):                       [  OK  ]
[root@centos7 ~]#
ログに以下のように表示されれば、起動が完了しているので、ブラウザでアクセスできます。
[root@centos7 ~]# tail /var/log/rundeck/service.log
2015-08-23 14:25:57.620:INFO:oejw.StandardDescriptorProcessor:NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
2015-08-23 14:25:59.333:INFO:/:Initializing Spring root WebApplicationContext
INFO  BootStrap: Starting Rundeck 2.5.3-1...
INFO  BootStrap: using rdeck.base config property: /var/lib/rundeck
INFO  BootStrap: loaded configuration: /etc/rundeck/framework.properties
ERROR BootStrap: NOT importing existing filesystem projects filesystem
INFO  BootStrap: RSS feeds disabled
2015-08-23 14:26:23.765:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/var/lib/rundeck/exp/webapp/},/var/lib/rundeck/exp/webapp
2015-08-23 14:26:24.008:INFO:/:Initializing Spring FrameworkServlet 'grails'
2015-08-23 14:26:24.157:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:4440

ブラウザで下記URL アクセスすると、下図の管理画面が表示されます。
ユーザ: admin 、パスワード: admin でログインできます。
  • http://10.1.0.80:4440


ログインに成功すると、下図のように表示されます。






[VyOS] DNSフォワードを変更する


XenServer にインストールしている VyOS のDNSを変更したときの備忘録です。

VyOSサーバ に vyosユーザ でログインします。

configure コマンドで設定モードに切り替え、show で設定内容を確認します。
vyos@vyos:~$ configure
[edit]
vyos@vyos# show
 interfaces {
     ethernet eth0 {
         address 172.168.1.254/24
         description OUTSIDE
         duplex auto
         hw-id xx:xx:xx:xx:xx:xx
         smp_affinity auto
         speed auto
     }
     ethernet eth1 {
         address 10.1.0.254/24
         description INSIDE01
         duplex auto
         hw-id xx:xx:xx:xx:xx:xx
         smp_affinity auto
         speed auto
     }
     loopback lo {
     }
 }
 service {
     dhcp-server {
         disabled false
         shared-network-name LAN {
             authoritative disable
             subnet 10.1.0.0/24 {
                 default-router 10.1.0.254
                 dns-server 10.1.0.254
                 domain-name internal-network
                 lease 86400
                 start 10.1.0.100 {
                     stop 10.1.0.200
                 }
             }
         }
     }
     dns {
         forwarding {
             cache-size 0
             listen-on eth1
             name-server 172.168.1.110
         }
     }
     ssh {
         port 22
     }
 }
 system {
     config-management {
         commit-revisions 20
     }
     console {
         device hvc0 {
             speed 9600
         }
         device ttyS0 {
             speed 9600
         }
     }
     gateway-address 172.168.1.1
     host-name vyos
     login {
         user vyos {
             authentication {
                 encrypted-password xxxxxxxxxxxxxxxxxxx.
             }
             level admin
         }
     }
     ntp {
         server 0.pool.ntp.org {
         }
         server 1.pool.ntp.org {
         }
         server 2.pool.ntp.org {
         }
     }
     package {
         auto-sync 1
         repository community {
             components main
             distribution helium
             password ""
             url http://packages.vyos.net/vyos
             username ""
         }
     }
     syslog {
         global {
             facility all {
                 level notice
             }
             facility protocols {
                 level debug
             }
         }
     }
     time-zone Asia/Tokyo
 }
[edit]
vyos@vyos#

赤字のDNSフォワード先のIPアドレスを変更します。
新しい転送先(172.168.1.1)を追加して、古い転送先(172.168.1.110)を削除し、commit で変更を確定します。

vyos@vyos# set service dns forwarding name-server 172.168.1.1
[edit]
vyos@vyos# delete service dns forwarding name-server 172.168.1.110
[edit]
vyos@vyos# commit
[edit]
vyos@vyos#


2015年8月22日土曜日

[CentOS5] コマンドラインでTorrentクライアントを使う


Linux環境のコマンドラインで torrent クライアントを実行して、CentOS5.3のインストール用DVDのISOイメージをダウンロードしてみます。

torrentクライアントには、「Enhanced CTorrent」というアプリケーションを使用します。(無料)
Sourceforge で配布しているので、ソースをダウンロードして、コンパイルし、インストールします。

1.「Enhanced CTorrent」 のダウンロード


以下のようにwgetコマンドを実行して、ソースをダウンロードします。
# wget http://sourceforge.net/projects/dtorrent/files/dtorrent/3.3.2/ctorrent-dnh3.3.2.tar.gz/download

2. 「Enhanced CTorrent」 のコンパイル&インストール


まず、上記1で取得したソースを解凍します。
# tar xvfz ctorrent-dnh3.3.2.tar.gz
コンパイルします。 "c++のコンパイラ" が必要です。なければ "yum install gcc-c++" とすればインストールできます。
# cd ctorrent-dnh3.3.2
# ./configure
# make install
# hash

3.CentOS5.3  の DVDイメージ用 torrent ファイルをダウンロード


以下のようにwgetコマンドを実行して、ダウンロードします。
# wget http://ftp.iij.ad.jp/pub/linux/centos/5.3/isos/i386/CentOS-5.3-i386-bin-DVD.torrent

4.CentOS5.3  の DVDイメージをダウンロード


以下のように torrentクライアントのコマンド( ctorrent )を実行して、ISOイメージダウンロードします。
# ctorrent CentOS-5.3-i386-bin-DVD.torrent




2015年8月20日木曜日

[CentOS6] lsblk でデバイス構成、UUID、ファイルシステムを表示する


lsblk コマンドを以下のように実行すると、ブロックデバイスの構成、UUID、ファイルシステム、マウントポイントを調べることができます。

[root@host01 ~]# lsblk -f
NAME                        FSTYPE      LABEL UUID                                   MOUNTPOINT
xvdc
└─xvdc1                     LVM2_member       VrlQO1-GWSi-Ov3s-crD7-mMYP-ugoI-LCmuSl
  └─VolGroup-lv_home (dm-3) ext4              e4f00df1-ca6d-45ce-bfc6-deefee9d7fdf   /home
xvdb
└─xvdb1                     LVM2_member       229Rtu-MpJ9-u713-693s-xBzu-QUZp-NFJCw4
  └─VolGroup-lv_var (dm-2)  ext4              c3a829c6-a9ee-40f3-a049-61a92b646697   /var
xvda
├─xvda1                     ext4              e597a85d-eece-4e98-93bf-6b39ae87f9f5   /boot
└─xvda2                     LVM2_member       zyhcOd-kD8d-Dass-LMvC-bd0r-XGh2-uFoHlA
  ├─VolGroup-lv_root (dm-0) ext4              bd9826dd-c1cc-4823-a776-613a92ecdc73   /
  └─VolGroup-lv_swap (dm-1) swap              5f6c5e5c-cbe8-4ec0-b9e5-c17b37378fe5   [SWAP]
[root@host01 ~]#


上記は、XenServerの仮想マシンで実行した結果です。





2015年8月15日土曜日

[AWS] インスタンス生成時に 443ポートで ssh接続できるように設定する


AmazonLinux は、EC2インスタンスを起動するときにコマンドを実行できます。
Linux インスタンスでの起動時のコマンドの実行
この機能を使って、AmazonLinuxを作るときに、SSHの設定を変更して、443ポートで接続できるようにできます。

AmazonLinuxで EC2インスタンスを作るときに、下図のように設定します。



ユーザデータの設定内容は、以下のとおり
#!/bin/bash
echo            >> /etc/ssh/sshd_config
echo "Port 443" >> /etc/ssh/sshd_config
これで、443ポートでSSH接続できる AmazonLinux が起動します。

この AmazonLinux を踏み台にすれば、社内からプロキシ経由で AWS 上のサーバにアクセスしたりできます。





[bash] dump コマンドでバックアップ


dumpコマンドを使用した、簡単なバックアップ処理です。
/etc/fstab でバックアップ対象に指定したファイルシステムを、別マシンにバックアップします。
リストアの手順は、こちら を参考にしてください。

1.ソースコード


以下は、bash のスクリプトです。マウントした別マシンの領域に、自ホスト名でディレクトリを作成して、そこにバックアップデータを格納します。
バックアップするのは、dumpコマンドで作成したファイルシステムのバックアップと、ディスクやファイルシステム関連の情報です。
スクリプトの主な変数の意味は以下のとおり。
  • $MOUNT_FROM は、バックアップファイルの格納先です。ここでは Windowsの共有フォルダです。
  • $MOUNT_TOは、マウントポイントです。
  • $MOUNT_TYPEは、mountコマンドで指定するタイプです。ここでは Windowsの共有フォルダをマウントするので "cifs" を指定しています。
  • $MOUNT_OPTは、mountコマンドのオプションです。ここでは Windowsの共有フォルダにアクセスするアカウントを指定しています。

#!/bin/sh
#####################################
#
# バックアップ
#
# [参考にしたWEBサイト]
#   http://thinkit.co.jp/cert/compare/5/5/2.htm
#
#####################################

MOUNT_FROM="//192.168.1.2/backup"
MOUNT_TO="/mnt"
MOUNT_TYPE="cifs"
MOUNT_OPT="-o username=ユーザー名,password=パスワード"

BKUP_DIR=${MOUNT_TO}/`uname -n`
DUMP_LEVEL=0

echo "######################################"
echo "# DUMP START `date '+%Y-%m-%d %H:%M:%S'`"
echo "######################################"

if [ "${MOUNT_FROM}" != "" ]; then

    echo "-------------------------------------"
    echo "- mount"
    echo "-------------------------------------"
    mount -t ${MOUNT_TYPE} ${MOUNT_OPT} ${MOUNT_FROM} ${MOUNT_TO}
    if [ $? -ne 0 ]; then
      echo "ERROR: mount failed."
      exit 1
    fi

    df -h

fi

echo "-------------------------------------"
echo "- backup dir : `uname -n`"
echo "-------------------------------------"
if [ ! -d ${BKUP_DIR} ]; then
    echo "- mkdir ${BKUP_DIR}"
    mkdir -p ${BKUP_DIR}
fi
ls -l `dirname ${BKUP_DIR}`

echo "-------------------------------------"
echo "- dump target"
echo "-------------------------------------"
dump -W

echo "-------------------------------------"
echo "- dump full"
echo "-------------------------------------"
sync
dump -W | egrep '^>' | while read line
do

  dev=`echo $line | cut -d' ' -f2`
  bkname=`basename $dev`
  echo "- dev=${dev} bkname=${bkname} level=${DUMP_LEVEL}"
  dump -${DUMP_LEVEL}f - $dev | gzip -c > ${BKUP_DIR}/${bkname}.${DUMP_LEVEL}.dmp.gz

done


echo "-------------------------------------"
echo "- save filesystem info"
echo "-------------------------------------"
fdisk -l       > ${BKUP_DIR}/fdisk.${DUMP_LEVEL}.txt     2>&1
df -k          > ${BKUP_DIR}/df.${DUMP_LEVEL}.txt        2>&1
cat /etc/fstab > ${BKUP_DIR}/fstab.${DUMP_LEVEL}.txt     2>&1
pvdisplay      > ${BKUP_DIR}/pvdisplay.${DUMP_LEVEL}.txt 2>&1
vgdisplay      > ${BKUP_DIR}/vgdisplay.${DUMP_LEVEL}.txt 2>&1
lvdisplay      > ${BKUP_DIR}/lvdisplay.${DUMP_LEVEL}.txt 2>&1

echo "-------------------------------------"
echo "- dump files"
echo "-------------------------------------"
echo "- 容量(Mbyte)"
du -sbm ${BKUP_DIR}
echo "- 一覧"
ls -l ${BKUP_DIR}

if [ "${MOUNT_FROM}" != "" ]; then

    echo "-------------------------------------"
    echo "- umount"
    echo "-------------------------------------"
    umount ${MOUNT_TO}
    if [ $? -ne 0 ]; then
      echo "ERROR: umount failed."
      exit 1
    fi

    df -h
fi

echo "######################################"
echo "# DUMP END `date '+%Y-%m-%d %H:%M:%S'`"
echo "######################################"

exit 0

2.バックアップ処理の実行


上記のスクリプトを実行してみます。

(1)バックアップ先のマシンの用意

今回は、バックアップ先のマシンとしてWindowsXPを用意しました。
WindowsXPに共有フォルダを作成して、そこにバックアップを格納するようにします。

(2)バックアップ処理の実行

まず、/etc/fstab でバックアップ対象を確認しておきます。5番目のフィールドが "1" のファイルシステムがバックアップ対象になります。以下の例では、"/" と "/boot" がバックアップ対象です。
# cat /etc/fstab
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0 
また、/etc/dumpdates が空ファイルであることを確認します。
# ls -l /etc/dumpdates
-rw-rw-r-- 1 root disk 0 11月 11 13:45 2010 /etc/dumpdates
上記スクリプトは、backup.sh という名前で保存したとします。
rootユーザーで backup.sh を実行すると、実行結果は以下のように表示されます。
# ./backup.sh
######################################
# DUMP START 2011-10-28 16:54:22
######################################
-------------------------------------
- mount
-------------------------------------
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                      7.1G  1.3G  5.5G  19% /
/dev/hda1              99M   18M   76M  20% /boot
tmpfs                 147M     0  147M   0% /dev/shm
//192.168.1.2/backup  112G   69G   44G  61% /mnt
-------------------------------------
- backup dir : bkserv
-------------------------------------
- mkdir /mnt/bkserv
合計 0
drwxrwxrwx 2 root root 0 11月  4  2011 bkserv
-------------------------------------
- dump target
-------------------------------------
Last dump(s) done (Dump '>' file systems):
> /dev/mapper/VolGroup00-LogVol00       (     /) Last dump: never
> /dev/hda1     ( /boot) Last dump: never
-------------------------------------
- dump full
-------------------------------------
- dev=/dev/mapper/VolGroup00-LogVol00 bkname=VolGroup00-LogVol00 level=0
  DUMP: Date of this level 0 dump: Fri Oct 28 16:54:24 2011
  DUMP: Dumping /dev/mapper/VolGroup00-LogVol00 (/) to standard output
  DUMP: Label: none
  DUMP: Writing 10 Kilobyte records
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 1138286 blocks.
  DUMP: Volume 1 started with block 1 at: Fri Oct 28 16:55:06 2011
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: Volume 1 completed at: Fri Oct 28 16:59:49 2011
  DUMP: Volume 1 1325760 blocks (1294.69MB)
  DUMP: Volume 1 took 0:04:43
  DUMP: Volume 1 transfer rate: 4684 kB/s
  DUMP: 1325760 blocks (1294.69MB)
  DUMP: finished in 283 seconds, throughput 4684 kBytes/sec
  DUMP: Date of this level 0 dump: Fri Oct 28 16:54:24 2011
  DUMP: Date this dump completed:  Fri Oct 28 16:59:49 2011
  DUMP: Average transfer rate: 4684 kB/s
  DUMP: DUMP IS DONE
- dev=/dev/hda1 bkname=hda1 level=0
  DUMP: Date of this level 0 dump: Fri Oct 28 16:59:49 2011
  DUMP: Dumping /dev/hda1 (/boot) to standard output
  DUMP: Label: /boot
  DUMP: Writing 10 Kilobyte records
  DUMP: mapping (Pass I) [regular files]
  DUMP: mapping (Pass II) [directories]
  DUMP: estimated 12705 blocks.
  DUMP: Volume 1 started with block 1 at: Fri Oct 28 16:59:50 2011
  DUMP: dumping (Pass III) [directories]
  DUMP: dumping (Pass IV) [regular files]
  DUMP: Volume 1 completed at: Fri Oct 28 16:59:52 2011
  DUMP: Volume 1 12780 blocks (12.48MB)
  DUMP: Volume 1 took 0:00:02
  DUMP: Volume 1 transfer rate: 6390 kB/s
  DUMP: 12780 blocks (12.48MB)
  DUMP: finished in 2 seconds, throughput 6390 kBytes/sec
  DUMP: Date of this level 0 dump: Fri Oct 28 16:59:49 2011
  DUMP: Date this dump completed:  Fri Oct 28 16:59:52 2011
  DUMP: Average transfer rate: 6390 kB/s
  DUMP: DUMP IS DONE
-------------------------------------
- save filesystem info
-------------------------------------
-------------------------------------
- dump files
-------------------------------------
- 容量(Mbyte)
360     /mnt/bkserv
- 一覧
合計 367991
-rwxrwSrwx 1 root root 365635587 11月  4  2011 VolGroup00-LogVol00.0.dmp.gz
-rwxrwSrwx 1 root root       364 11月  4  2011 df.0.txt
-rwxrwSrwx 1 root root       336 11月  4  2011 fdisk.0.txt
-rwxrwSrwx 1 root root       534 11月  4  2011 fstab.0.txt
-rwxrwSrwx 1 root root  11173373 11月  4  2011 hda1.0.dmp.gz
-rwxrwSrwx 1 root root      1041 11月  4  2011 lvdisplay.0.txt
-rwxrwSrwx 1 root root       429 11月  4  2011 pvdisplay.0.txt
-rwxrwSrwx 1 root root       682 11月  4  2011 vgdisplay.0.txt
-------------------------------------
- umount
-------------------------------------
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                      7.1G  1.3G  5.5G  19% /
/dev/hda1              99M   18M   76M  20% /boot
tmpfs                 147M     0  147M   0% /dev/shm
######################################
# DUMP END 2011-10-28 16:59:55
######################################

Windowsの共有フォルダにあるバックアップファイルを参照したい場合は、以下のようにマウントします。
# mount -t cifs -o username=ユーザー名,password=パスワード //192.168.1.2/backup /mnt




[CentOS6] fstab の UUID からデバイス名を調べる


CentOS6では、fstab の /boot のデバイスがUUIDで記載されるようになりました。
#
# /etc/fstab
# Created by anaconda on Sat Oct 29 07:16:03 2011
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1
UUID=e597a85d-eece-4e98-93bf-6b39ae87f9f5 /boot                   ext4    defaults        1 2
/dev/mapper/VolGroup-lv_swap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
この UUID からデバイス名を調べるには、以下のようにします。
# findfs UUID=e597a85d-eece-4e98-93bf-6b39ae87f9f5
/dev/xvda1
または、以下のようにしてデバイスとUUIDの一覧を表示します。
# blkid
/dev/xvda1: UUID="e597a85d-eece-4e98-93bf-6b39ae87f9f5" TYPE="ext4"
/dev/xvda2: UUID="zyhcOd-kD8d-Dass-LMvC-bd0r-XGh2-uFoHlA" TYPE="LVM2_member"
/dev/mapper/VolGroup-lv_root: UUID="bd9826dd-c1cc-4823-a776-613a92ecdc73" TYPE="ext4"
/dev/mapper/VolGroup-lv_swap: UUID="5f6c5e5c-cbe8-4ec0-b9e5-c17b37378fe5" TYPE="swap"


[CentOS6] NIC の種類を調べる


OS が認識しているNICの種類(名前)以下のようにして調べます。
# lspci
00:00.0 Host bridge: Intel Corporation 82P965/G965 Memory Controller Hub (rev 02)
00:01.0 PCI bridge: Intel Corporation 82P965/G965 PCI Express Root Port (rev 02)
00:1a.0 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #4 (rev 02)
00:1a.1 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #5 (rev 02)
00:1a.7 USB Controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #2 (rev 02)
00:1b.0 Audio device: Intel Corporation 82801H (ICH8 Family) HD Audio Controller (rev 02)
00:1c.0 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 1 (rev 02)
00:1c.3 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 4 (rev 02)
00:1c.4 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 5 (rev 02)
00:1d.0 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #2 (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #3 (rev 02)
00:1d.7 USB Controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev f2)
00:1f.0 ISA bridge: Intel Corporation 82801HB/HR (ICH8/R) LPC Interface Controller (rev 02)
00:1f.2 IDE interface: Intel Corporation 82801H (ICH8 Family) 4 port SATA IDE Controller (rev 02)
00:1f.3 SMBus: Intel Corporation 82801H (ICH8 Family) SMBus Controller (rev 02)
00:1f.5 IDE interface: Intel Corporation 82801H (ICH8 Family) 2 port SATA IDE Controller (rev 02)
01:00.0 VGA compatible controller: nVidia Corporation NV44 [Quadro NVS 285] (rev a1)
02:00.0 SATA controller: JMicron Technology Corp. JMB362/JMB363 Serial ATA Controller (rev 02)
02:00.1 IDE interface: JMicron Technology Corp. JMB362/JMB363 Serial ATA Controller (rev 02)
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
リンク速度などは、以下のようにして調べます。
# ethtool eth0
Settings for eth0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Advertised auto-negotiation: Yes
        Speed: 100Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00000033 (51)
        Link detected: yes
MACアドレスは以下のようにして調べます。
# ifconfig -a
eth0      Link encap:Ethernet  HWaddr C2:82:BD:83:CE:8F
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1765796 errors:0 dropped:0 overruns:0 frame:0
          TX packets:501003 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:105150894 (100.2 MiB)  TX bytes:4135102474 (3.8 GiB)
          Interrupt:15

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3649 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3649 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:603497 (589.3 KiB)  TX bytes:603497 (589.3 KiB)


[CentOS6] sshの鍵で特定のコマンドを実行する


ssh の公開鍵を使って、任意のコマンドを実行することができます。
まず、以下のようにしてパスフレーズなしの鍵を作ります。以下の例は、rootユーザーにRSA暗号方式の鍵を作成しています。
# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
f9:81:b6:c7:8f:b9:aa:3e:0e:c6:bd:35:19:a1:1e:06 root@centos6
これで、/root/.ssh/ディレクトリに秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が作成されます。 続いて、公開鍵のid_rsa.pubをauthorized_keysというファイルに登録して、パーミションを変更します。
# cd /root/.ssh
# cat id_rsa.pub >> authorized_keys
# chmod 600 authorized_keys
今度は、この authorized_key に登録した公開鍵の先頭に、実行させたい任意のコマンドを記述します。 フォーマットは以下のとおり。
command="実行させたいコマンド",sshのオプションをカンマ区切りで書く
command=xxx というのを付け足すことによって、その公開鍵でアクセスがあったときに指定したコマンドを実行させることができます。
以下の例では、/var/log/messages を表示します。
command="cat /var/log/messages" ssh-rsa CCCCAbAFERTWER....(省略)
これを実行すると以下のようになります。ssh 実行時に上記で作成した秘密鍵を指定します。
# ssh -i id_rsa root@centos6
Apr 17 12:11:46 centos6 ntpd[1006]: synchronized to 210.173.160.27, stratum 2
Apr 17 23:17:06 centos6 ntpd[1006]: synchronized to 210.173.160.87, stratum 2
Apr 18 08:40:32 centos6 ntpd[1006]: synchronized to 210.173.160.27, stratum 2
Apr 18 09:31:48 centos6 ntpd[1006]: synchronized to 210.173.160.87, stratum 2




[CentOS6] コマンドラインでSMTPサーバを指定してメール送信(msmtp)


msmtp は、コマンドラインで使用するSMTPクライアントです。

msmtp コマンドを使用すると、コマンドライン引数でSMTPサーバを指定することができます。
msmtp コマンドを実行するサーバ上でpostfixやsendmailなどを動かしたり設定ファイルをいじる必要もありません。

コマンド(プログラム)の実行結果をメール送信するのに便利に使えます。
MSMTPホームページ: http://msmtp.sourceforge.net/

1.msmtp インストール


msmtp は rpmパッケージがないので、ソースをダウンロードしてコンパイルする必要があります。
まず、コンパイルに必要なパッケージをインストールします。
# yum install gcc make
次に msmtp が使用するライブラリをインストールします。
yum の epel レポジトリを使います。
# yum install gnutls-devel
# yum install openssl-devel
# yum --enablerepo=epel install libgsasl-devel
# yum install libidn-devel
sourceforge から msmtp のソースをダウンロードして展開します。
# wget http://sourceforge.net/projects/msmtp/files/latest/download?source=files
# tar xvfh msmtp-1.4.30.tar.bz2
コンパイルしてインストールします。
# cd msmtp-1.4.30
# ./configure
# make
# make install

2.使い方


設定ファイルでSMTPサーバなどを指定する方法もありますが、ここでは、コマンドライン引数で指定する例を紹介します。
使い方の詳細はマニュアルを参照してください
以下の例では、ls コマンドの実行結果をSMTPサーバを指定してメールします。
awkコマンドでメールの題名を定義しています。

◆ 認証なしのSMTPサーバを指定して送信
# ls | awk 'BEGIN{print "Subject: TestMail\n";}{print $0;}' | msmtp --host=<SMTPサーバ> --from=<FROMメールアドレス> <宛先メールアドレス> 

◆ 認証あり(パスワード暗号化なし)のSMTPサーバを指定して送信
# ls | awk 'BEGIN{print "Subject: TestMail\n";}{print $0;}' | msmtp --host=<SMTPサーバ> --auth=plain --user=<SMTPユーザ> --passwordeval="echo <SMTPパスワード>" --from=<FROMメールアドレス> <宛先メールアドレス> 

"--debug" オプションをつけると、以下のようにSMTPサーバとのやり取りを見ることができます。
メール送信がうまくいかないときには、原因を探るのに使えます。
以下は認証ありのSMTPサーバを使用したメール送信の成功例です。
# ls | awk 'BEGIN{print "Subject: TestMail\n";}{print $0;}' | msmtp --host=smtp.example.jp --auth=plain --user=smtpuser --passwordeval="echo smtppass" --from=admin@example.jp --debug ope@example.jp
using account specified on command line
host                  = smtp.example.jp
port                  = 25
timeout               = off
protocol              = smtp
domain                = localhost
auth                  = PLAIN
user                  = smtpuser
password              = *
passwordeval          = echo smtppass
ntlmdomain            = (not set)
tls                   = off
tls_starttls          = on
tls_trust_file        = (not set)
tls_crl_file          = (not set)
tls_fingerprint       = (not set)
tls_key_file          = (not set)
tls_cert_file         = (not set)
tls_certcheck         = on
tls_force_sslv3       = off
tls_min_dh_prime_bits = (not set)
tls_priorities        = (not set)
auto_from             = off
maildomain            = (not set)
from                  = admin@example.jp
dsn_notify            = (not set)
dsn_return            = (not set)
keepbcc               = off
logfile               = (not set)
syslog                = (not set)
aliases               = (not set)
reading recipients from the command line
<-- 220 example.jp ESMTP Sendmail; Thu, 24 Jan 2013 09:33:28 +0900
--> EHLO localhost
<-- 250-example.jp Hello smtp.example.jp [111.222.333.444], pleased to meet you
<-- 250-ENHANCEDSTATUSCODES
<-- 250-PIPELINING
<-- 250-8BITMIME
<-- 250-SIZE 11534336
<-- 250-AUTH PLAIN LOGIN
<-- 250 HELP
--> AUTH PLAIN xxxxxx==
<-- 235 2.0.0 OK Authenticated
--> MAIL FROM:<admin@example.jp>
--> RCPT TO:<ope@example.jp>
--> DATA
<-- 250 2.1.0 <admin@example.jp>... Sender ok
<-- 250 2.1.5 <ope@example.jp>... Recipient ok
<-- 354 Enter mail, end with "." on a line by itself
--> Subject: TestMail
-->
--> anaconda-ks.cfg
--> install.log
--> install.log.syslog
--> msmtp-1.4.30
--> msmtp-1.4.30.tar.bz2
--> .
<-- 250 2.0.0 r0O0XScF018310 Message accepted for delivery
--> QUIT
<-- 221 2.0.0 example.jp closing connection


実際に使用するときは、mail コマンドと組み合わせたほうが使いやすいと思います。




[CentOS5] Emacs の初期設定ファイル


ja_JP.UTF-8環境のCentOS5.0 は、デフォルト設定のままでは emacs  で日本語入力できなかった。なので初期設定ファイルの .emacs を作成した。以下はサンプル。
;;
;;
;; ja_JP.UTF-8 用
;;
;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 日本語
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;; Dired
(setq dired-use-gzip-instead-of-compress t)
(setq dired-shrink-to-fit t)
;(setq dired-listing-switches "-Alg")
(setq dired-dwim-target t)
(setq default-file-name-coding-system 'utf-8-unix)


;;; 日本語の設定
;;(set-language-environment "Japanese")
(set-default-coding-systems 'utf-8-unix)
(set-keyboard-coding-system 'utf-8-unix)
(set-buffer-file-coding-system 'utf-8-unix)
(if (not window-system) (set-terminal-coding-system 'utf-8-unix))
(setq process-coding-system-alist
      (cons
       '(".*" utf-8-unix . utf-8-unix)
       process-coding-system-alist))

;;; シェルモード用の日本語の設定
(add-hook 'shell-mode-hook
          (function
           (lambda ()
             (set-buffer-process-coding-system 'utf-8-unix 'utf-8-unix))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; C プログラムの書式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;(defun my-c-mode-common-hook ()
;   (c-set-style "linux") (setq indent-tabs-mode t) ;linux 式がいいとき
;   (c-set-style "k&r")                             ;k&r式がいいときはこれを有効にする
;   (c-set-style "gnu")                             ;デフォルトの設定
; )
;(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

;; cc-mode: タブのサイズを4にする
(setq c-site-default-style "bsd")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; キーマップ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Deleteキーでカーソル位置の文字が消えるようにする
(global-set-key [delete] 'delete-char)

;; C-h キーでカーソルの左の文字が消えるようにする。
;; ただし、もともと C-h はヘルプなので、
;; これを有効にすると、ヘルプを使うときには
;; M-x help や F1 を使う必要があります。
;(global-set-key "\C-h" 'backward-delete-char)

;; C-h は Backspace でないと押し間違えてしまうらしい
(define-key global-map "\C-h"      'backward-delete-char)

;; 行番号指定ジャンプ
(define-key global-map "\C-x\C-\j" 'goto-line)

;; C-t でスクロールダウン
(define-key global-map "\C-t" 'scroll-down)

;; コンパイル
(define-key global-map "\C-xc" 'compile)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 見栄え
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; メニューバーを表示しない
(menu-bar-mode -1)

;; スクロールバーを表示しない
(set-scroll-bar-mode nil)

;;; 対応する括弧を光らせる。
(show-paren-mode 1)

;;; タイトルバーにファイル名を表示する
(setq frame-title-format (format "emacs@%s : %%f" (system-name)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; いろいろ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;; 一行が 80 字以上になった時には自動改行する
;;;(setq fill-column 80)
;;;(setq text-mode-hook 'turn-on-auto-fill)
;;;(setq default-major-mode 'text-mode)

;;;バッファの最後でnewlineで新規行を追加するのを禁止する
(setq next-line-add-newlines nil)

;;; 最終更新日の自動挿入
;;;   ファイルの先頭から 8 行以内に Time-stamp: <> または
;;;   Time-stamp: " " と書いてあれば、セーブ時に自動的に日付が挿入されます
(if (not (memq 'time-stamp write-file-hooks))
    (setq write-file-hooks
          (cons 'time-stamp write-file-hooks)))

;; Perl-mode: #!/usr/bin/jperl 等も Perl-mode にする
(setq interpreter-mode-alist
      (append '(("jperl" . perl-mode))
              interpreter-mode-alist))

;;php-mode
;;(load-library "php-mode")
;;(require 'php-mode)


;; 自動モード選択の設定
;; .perl, .pl, .pm, .ph のファイルは Perl-mode とし,
;; .tcl および .tk のファイルは Tcl-mode にする
;; .psh のファイルは sh-mode にする
(setq auto-mode-alist
      (append '(("\\.perl$\\|\\.p[hlm]$\\|\\.cgi$\\|/perl/" . perl-mode)
                ("\\.tcl$\\|\\.tk$" . tcl-mode)
                ("\\.psh$" . sh-mode))
              auto-mode-alist))

;;; 圧縮されたファイルも編集できるようにする
(auto-compression-mode t)

;;;ホイールマウス
(mouse-wheel-mode)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; CVSの設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;(setq load-path (append (list "/usr/share/emacs/site-lisp/") load-path))
;(setq load-path (append (list "/usr/share/emacs/site-lisp/elib-1.0") load-path))
;(setq load-path (append (list "/usr/share/emacs/site-lisp/pcl-cvs-2.9.9") load-path))
;(load "pcl-cvs-startup")


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; このファイルに間違いがあった場合に全てを無効にします
(put 'eval-expression 'disabled nil)

; ---- language-env end DON'T MODIFY THIS LINE!


[CentOS5] viエディタの文字コード自動判別


vi エディタで、各文字コードに対応させるには、ホームディレクトリの .vimrc ファイルを編集します。
set encoding=euc-jp
set fileencodings=iso-2022-jp,sjis,utf-8
※Fedora Core の場合は、euc-jp と utf-8 の部分を入れ替え


[CentOS5] 一般ユーザーは root にスイッチ(su)できないように制限する


一般ユーザーが、root にスイッチ(su) できないように制限するには、/etc/pam.d/su ファイルを修正します。デフォルトでは、下記赤字部分がコメントアウトされているので、行先頭のコメント(#)を削除して"wheel"グループに所属し ていないユーザーは root にスイッチできないようにします。
"wheel"グループは、rootにスイッチできるユーザーを所属させるためのグループでデフォルトで用意されています。
#%PAM-1.0
 auth            sufficient      pam_rootok.so
 # Uncomment the following line to implicitly trust users in the "wheel" group.
 #auth           sufficient      pam_wheel.so trust use_uid
 # Uncomment the following line to require a user to be in the "wheel" group.
 #auth           required        pam_wheel.so use_uid
 auth            include         system-auth
 account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet
 account         include         system-auth
 password        include         system-auth
 session         include         system-auth
 session         optional        pam_xauth.so

この設定後、rootへのスイッチ(su)を許可したいユーザーがある場合は、"wheel"グループに所属させます。
例えば、既存の"admin"ユーザーを"wheel" グループに所属させるには、以下のように "usermod"コマンドを使用します。
usermod -G wheel admin


[CentOS5] CDからレスキューモード起動した後、LVMをマウントする


CentOS5のインストールメディアを使って、マシンをレスキューモードで起動した後、
LVMをマウントする方法です。XenServerの仮想マシン(PV)を使用して試してます。
DISKは以下のようにパーティション、LVMを設定しています。
# fdisk -l

Disk /dev/xvda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/xvda1   *           1          13      104391   83  Linux
/dev/xvda2              14        1044     8281507+  8e  Linux LVM
# pvscan
  PV /dev/xvda2   VG VolGroup00   lvm2 [7.88 GB / 0    free]
  Total: 1 [7.88 GB] / in use: 1 [7.88 GB] / in no VG: 0 [0   ]
# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "VolGroup00" using metadata type lvm2
# lvscan
  ACTIVE            '/dev/VolGroup00/LogVol00' [7.34 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [544.00 MB] inherit
# df -k
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       7459216   1520664   5553528  22% /
/dev/xvda1              101086     18388     77479  20% /boot
tmpfs                   131160         0    131160   0% /dev/shm

CentOS5のインストールメディア(CD/DVD)からレスキューモードでマシンを起動すると、デフォルトではディスクのVGが無効になっているので、LVの "/dev/VolGroup00/LogVol00" をマウントできません。
VGを有効にするには、下記のようにコマンドを実行します
# lvm vgchange -ay
  2 logical volume(s) in volume group "VolGroup00" now active

LVのデバイスを確認するには以下のようにします
# lvm lvscan
  ACTIVE            '/dev/VolGroup00/LogVol00' [7.34 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [544.00 MB] inherit

これで、以下のように mount コマンドを実行すれば、/mntで参照できるようになります。
# mount /dev/VolGroup00/LogVol00 /mnt


[CentOS5] rshを使えるようにする


rshのサービスをセットアップして、rsh を使用できるようにします。
ファイヤーウォールは無効であることとします。(ファイヤーウォールに rsh の穴を開ける設定は、ここでは扱いません)

「ホストA(192.168.1.12)」で以下のようにrshコマンドを実行して、「ホストB(192.168.1.13)」の uptime を取得してみます。
# rsh -l canopus 192.168.1.13 "uptime"
connect to address 192.168.1.13 port 544: Connection refused
Trying krb4 rsh...
connect to address 192.168.1.13 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)
上記のようなエラーがでて止まる場合は、ホストBで rshサービスが動いてません。上記コマンドはCtl+C で強制終了させます。

CentOS5 を最小構成でインストールした場合、rshサービスはインストールされません。まず、ホストBに rshサービスをインストールします。
# yum install rsh-server
次に、rshサービスの自動起動設定をして、xinetd を再起動します。
# chkconfig rsh on
# service xinetd restart
ホストBの rshサービスの設定が完了したので、上記のrshコマンドをホストAで実行してみます
# rsh -l canopus 192.168.1.13 "uptime"
connect to address 192.168.1.13 port 544: Connection refused
Trying krb4 rsh...
connect to address 192.168.1.13 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)
Permission denied.
権限なし(Permission denied) とエラーがでます。
この例では rsh コマンドの引数に "-l canopus" と指定して ホストBのcanopus ユーザーで uptime を実行しようとしています。
なので、ホストBのcanopusユーザーのホームディレクトリに ".rhosts" ファイルを作成して、rshでの実行許可を与えます。
".rhosts" は以下のように、実行許可を与えるホストとユーザーのペアを記述します。
192.168.1.12 root
192.168.1.12 taro
この例では、ホストA(192.168.1.12)の root と taro が、ホストBのcanopusユーザーでコマンドを実行できるようになります。なお、".rhosts"のパーミションは、"600" にします。
# chmod 600 .rhosts
これでもう一度、ホストAの root ユーザーで rsh を実行してみます
# rsh -l canopus 192.168.1.13 "uptime"
connect to address 192.168.1.13 port 544: Connection refused
Trying krb4 rsh...
connect to address 192.168.1.13 port 544: Connection refused
trying normal rsh (/usr/bin/rsh)
 12:09:10 up 11 days, 14:04,  2 users,  load average: 0.16, 0.03, 0.01
これで、ホストBの canopus ユーザーで rsh を実行できるようになりました。
ちなみに、実行時に"544: Connection refused"とメッセージがでるのは、ホストAで、ケルベロス設定が必要な"/usr/kerberos/bin/rsh"を実行しているからで す。(これはCentOS5のデフォルトです)
# which rsh
/usr/kerberos/bin/rsh
"544: Connection refused" というメッセージを出したくなければ、以下のように "/usr/bin/rsh" を使用します。
# /usr/bin/rsh -l canopus 192.168.1.13 "uptime"
 12:08:49 up 11 days, 14:03,  2 users,  load average: 0.00, 0.00, 0.00


[CentOS5] device is busy などの競合リソースを調べる


”device is busy”(デバイスは使用中です)メッセージが出てしまった時に、掴んでいるプロセスを調べたい場合は fuser コマンドを使います。
fuserというコマンドを使えば、特定のファイルやソケットを現在どのプロセスが使用中であるかも確認できます。「デバイスは使用中です」という意味不明なメッセージでたら、まずは、以下のページを参考にして、fuser コマンドで調べてみましょう。


[XenServer 6.1] OpenXenManager(Linux用のXenCenter)のインストール


OpenXenManagerは、XenCenterと同等の機能をもったLinux用のGUIです。
Sourceforge で公開しています。
Ubuntu にインストールしたい場合は、以下の記事が参考になります。
CentOS6 にインストールしたい場合は、以下のとおり。
まず、OpenXenManager が使用するパッケージをインストールします。
# yum install pygtk2 glade3 pygtk2-libglade gtk-vnc-pyton
次に、OpenXenManagerのアーカイブをダウンロードして、/opt に解凍します。
# wget http://downloads.sourceforge.net/project/openxenmanager/openxenmanager_rev48.tar.gz
# tar xvfvz openxenmanager_rev48.tar.gz -C /opt
起動用のコマンドとして、/usr/bin/xenmanagerを以下の内容で作成します。
#!/bin/sh
python /opt/openxenmanager/window.py &
このファイルに実行権限を付与します。
# chmod 755 /usr/bin/xenmanager
これで、/usr/bin/xenmanager を実行すると、下図のような画面が表示されます。






[XenServer 6.0] hotfix をインストールしようとするとエラーになる


PXEブートでネットワークインストールした XenServer6.0 に Hotfix をインストールしようとしたら下図のようなエラーになりました。



XenCenter を使わずに xe コマンドでインストールしようとすると以下のようなエラーになります。
# xe -s localhost -u root -pw xxxx patch-upload file-name=./XS60E001.xsupdate
95ac709c-e408-423f-8d22-84b8134a149e
# xe -s localhost -u root -pw xxxx patch-pool-apply uuid=95ac709c-e408-423f-8d22-84b8134a149e
The uploaded patch file is invalid.  See attached log for more details.
log: Could not find element %s

ネットで色々と調べてみると /etc/xensource-inventory が正しく生成されていないようです。
CDからクリーンインストールしたマシンと比べてみると、以下の2行が不足しています。
PRODUCT_BRAND='XenServer'
PRODUCT_VERSION='6.0.0'

/etc/xensource-inventory を以下のように修正(赤字部分)しました。
BUILD_NUMBER='50762p'
CURRENT_INTERFACES='xenbr0'
DOM0_MEM='752'
INSTALLATION_UUID='82a896d8-7a0d-4c52-b450-1e33f43f7c33'
COMPANY_NAME_SHORT='Citrix'
PLATFORM_NAME='XCP'
PLATFORM_VERSION='1.0.99'
KERNEL_VERSION='2.6.32.12-0.7.1.xs6.0.0.529.170661xen'
BRAND_CONSOLE='XenCenter'
DEFAULT_SR_PHYSDEVS=''
COMPANY_NAME='Citrix Systems, Inc.'
XEN_VERSION='4.1.1'
PRIMARY_DISK='/dev/disk/by-id/scsi-SATA_ST3250620AS_9QF0R3DN'
CONTROL_DOMAIN_UUID='bc545474-b395-4ee4-812d-e92dad81c145'
PRODUCT_NAME='xenenterprise'
BACKUP_PARTITION='/dev/disk/by-id/scsi-SATA_ST3250620AS_9QF0R3DN-part2'
INSTALLATION_DATE='2011-10-02 19:39:09.161196'
MANAGEMENT_INTERFACE='xenbr0'
PRODUCT_BRAND='XenServer'
PRODUCT_VERSION='6.0.0'
Hotfix をインストールすると、今度はうまくいきました。






[XenServer 6.2] Dom0 にUSBの外付けHDDを増設して、新規SRを作る


XenServer をインストールした物理マシンに外付けHDD(USB)を増設して、新規SR(Storage Repositories)を作成したときの手順を紹介します。

詳細な手順や、SRの説明は、以下のサイトを参照してください。

まず、外付けHDDを初期化します。
赤字で示したのが外付けHDDです。
# fdisk -l

WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.


Disk /dev/sda: 250.0 GB, 250059350016 bytes
256 heads, 63 sectors/track, 30282 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1       30283   244198583+  ee  EFI GPT

Disk /dev/sdb: 120.0 GB, 120060444160 bytes
255 heads, 63 sectors/track, 14596 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       14596   117242338+  8e  Linux LVM
次に、SRを作成します。
Dom0 で 以下のようにxe コマンドを実行します。
# xe sr-create type=lvm content-type=user device-config:device=/dev/sdb1 name-label="Local storage 2"
以上で、新規SRの "Local storage 2"が作成できました。
これで、仮想マシンを "Local storage 2"に格納できるようになります。





[XenServer 5.0] USB外付けディスクを仮想マシンに接続する方法


XenServerホスト(物理マシン)に、USBの外付けディスクを取り付けて、仮想マシンに接続する方法です。

USB外付けディスクが、仮想マシンのディスクとして使用できるようになります。

XenCenterでも設定できるのですが、ここには、コマンドで設定する手順を記述します。
作業は、XenServerホスト(Dom0)のrootユーザーで行います。
USBの外付けディスクは、XenServerホストに接続して、使用可能状態にあることが前提です。

1.仮想マシンのUUIDと使用しているデバイスを確認する


USB外付けディスクを使用する仮想マシンのUUID(vm-uuid)とデバイスを確認し、新しいディスク用のデバイス名を決めます。以下のようにxeコマンドを実行して、現在のデバイスを表示します。"+LUPUS"といのは仮想マシンの名前です。
# xe vbd-list vm-name-label=+LUPUS
uuid ( RO)             : f8a9386b-d321-2b54-a855-3217b7043a7c
          vm-uuid ( RO): a84d44ed-92ac-0ebd-7124-696bfff5b5ee
    vm-name-label ( RO): +LUPUS
         vdi-uuid ( RO): 24a02d8b-e692-43b3-91bd-daef3146553d
            empty ( RO): false
           device ( RO): xvda


uuid ( RO)             : c3530368-ca76-eb52-8692-76d9377f81a3
          vm-uuid ( RO): a84d44ed-92ac-0ebd-7124-696bfff5b5ee
    vm-name-label ( RO): +LUPUS
         vdi-uuid ( RO): <not in database>
            empty ( RO): true
           device ( RO): hdd
現在は、"xvda" と "hdd" の2つのデバイスがあります。これから、新しく作成するデバイスは、"hdb" にすることにします。

2.USB外付けディスクの各種UUIDを確認する


XenServerでは、ホストに接続したUSB外付けディスクは、"Removable storage" として扱われます。以下のようにxeコマンドを実行して、ストレージ・レポジトリUUID(sr-uuid)を確認します。
# xe sr-list name-label="Removable storage"
uuid ( RO)                : b2e035e6-7854-b6fd-351f-43a49720d332
          name-label ( RW): Removable storage
    name-description ( RW):
                host ( RO): manta
                type ( RO): udev
        content-type ( RO): disk
次に、仮想ブロックデバイスUUID(vbd-uuid)を確認します。xeコマンドに "--minimal"をつけると値だけ表示します。
# xe vdi-list sr-uuid=b2e035e6-7854-b6fd-351f-43a49720d332 params=vbd-uuids --minimal
ここで、何も表示されなければ、USBディスクを誰も使用していないということです。UUIDが表示されたら、既に他の仮想マシンで使用しています。
最後に、仮想ディスクイメージUUID(vdi-uuid)を確認します
# xe vdi-list sr-uuid=b2e035e6-7854-b6fd-351f-43a49720d332 params=uuid --minimal
6d45ebe1-29f5-4ae2-afa6-f6943f2a359b

3.仮想マシンに接続する


仮想マシン用に新しい仮想ブロックデバイスを作成します。
# xe vbd-create vm-uuid=a84d44ed-92ac-0ebd-7124-696bfff5b5ee device=hdb vdi-uuid=6d45ebe1-29f5-4ae2-afa6-f6943f2a359b
6013e017-f8fc-e9d7-74c6-c854e4848206
XenCenterで仮想マシンの「Storage」タブを見ると以下のようにUSBディスクが追加されています。



次に、このVBDを接続します。uuidには、上記コマンド(vbd-create)の実行結果で表示された値を指定します。
# xe vbd-plug uuid=6013e017-f8fc-e9d7-74c6-c854e4848206
XenCenterで見ると、「Active」欄が"Yes"になり、「DevicePath」が表示されました。






[XenServer 5.0] USB外付けディスクを仮想マシンから削除する方法



仮想マシンに接続した、USB外付けディスクをとりはずす方法です。
XenCenterで出来るのですが、ここには、コマンドで設定する手順を記述します。

1.仮想ブロックデバイスのUUIDを確認する


xeコマンドを以下のように実行します。USB外付けディスクのsr-uuidの調べ方は、上記TIPSを参照してください。
# xe vdi-list sr-uuid=b2e035e6-7854-b6fd-351f-43a49720d332 params=vbd-uuids --minimal
6013e017-f8fc-e9d7-74c6-c854e4848206

2.USB外付けディスクを仮想マシンからはずす。


xeコマンドを以下のように実行します。uuidには、上記1で確認したUUIDを指定します。
# xe vbd-unplug uuid=6013e017-f8fc-e9d7-74c6-c854e4848206

3.USB外付けディスクの仮想ブロックデバイスを破棄する。


xeコマンドを以下のように実行します。uuidには、上記1で確認したUUIDを指定します。
# xe vbd-destroy uuid=6013e017-f8fc-e9d7-74c6-c854e4848206



2015年8月14日金曜日

[XenServer 6.1] Linux仮想マシン内での時間の処理



以下、「仮想マシンユーザーガイド」からの引用です。

よく忘れるので



デフォルトでは、Linux仮想マシン内の時計はコントロールドメイン上で実行している時計に同期しており、個 別に変更することはできません。このデフォルト設定では、NTPサービスをコントロールドメインでのみ実行すれば、すべての仮想マシンの時計が正確に維持されます。新しいLinux仮想マシンをインストールしたら、必ず タイムゾーンをデフォルトのUTCからローカルの値に変更してください。


Linux仮想マシンで時計を個別に設定するには
  1. 仮想マシン上のルートプロンプトで、次のコマンドを実行します。
    echo 1 > /proc/sys/xen/independent_wallclock
  2. 再起動後も個別設定の時計が使用されるようにするには、/etc/sysctl.conf設定ファイルに次の行を追加します。
    # Set independent wall clock time
    xen.independent_wallclock=1
  3. また、3つ目の方法として、仮想マシンの起動パラメータとしてindependent_wallclock=1を追加することもできます。




2015年8月13日木曜日

[SOS JobScheduler] start_time_function を使って自分のアプリでジョブをスケジューリングする


<run_time> の start_time_function を使用すると、自分のアプリケーションで設定した日時にジョブをスケジューリングできます。

start_time_function ではアプリケーションを指定し、指定されたアプリケーションは、ISO8601(UTC)形式 で日時を返します。
すると、アプリケーションが返した日時にジョブが起動するようにスケジューリングされます。

特別な条件の日時にジョブを実行したい場合などに利用できます。

下記URLでサンプルを紹介しています。


2015年8月12日水曜日

Rundeck を試してみたい


Rundeck はデータセンターやクラウド環境におけるその場限りの作業やルーチンワークを自動化してくれる OSS です。(Javaのアプリケーションみたい)

これまで時間を浪費してきた単純作業を軽減したり、スクリプト化したものを簡単にスケールするための沢山の機能があります。

Rundeck は WebUI, CUI から多くのノードにタスクを実行させることができます。他に ACL やワークフロー設計, スケジューリング, ロギング, 外部データの統合といった機能もあります。

サーバAでジョブを実行後、サーバBのジョブ実行に移るなんてこともできたり、cronで動かしてるジョブを、ほとんどそのまま移行できるらしい。

日本語のマニュアルは下記URL参照

http://rundeck.org/docs/jp/manual/index.html




2015年8月11日火曜日

[SOS JobScheduler] 日本語環境について




現時点で、JobScheduler は、日本語を正しく扱えません。

JobSchedule 内部は ISO-8859-1 encoding (Latin1)で動作しているそうです。

ログに日本語を表示したり、WebServiceへのリクエストで utf-8 を使用することはできません。

ただし、Ver1.11から UTF-8 に対応するそうなので、リリースされれば、ログに日本語を表示したりできるようになると思います。

JOCとJOEについては、UI を日本語で表示できます。

下記のサイトで日本語化の手順を紹介しています。





2015年8月10日月曜日

[CentOS7] サービスの一覧を見たり、起動・停止したい


CentOS7のサービスは、systemctl コマンドで管理します。

全てのサービスの設定ファイルは、/usr/lib/systemd/system ディレクトリにあります。
ランレベルに応じた個別のサービスの設定ファイルは、ランレベルごとのディレクトリに格納されて、/usr/lib/systemd/system ディレクトリのファイルにシンボリック・リンクされています。

ランレベルに応じたディレクトリは、/etc/systemd/system にあります。
# ls -l /etc/systemd/system/
合計 4
drwxr-xr-x. 2 root root   30  9月 17 09:18 basic.target.wants
lrwxrwxrwx. 1 root root   44  9月 16 22:16 dbus-org.freedesktop.Avahi.service -> /usr/lib/systemd/system/avahi-daemon.service
lrwxrwxrwx. 1 root root   46  9月 16 22:16 dbus-org.freedesktop.NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service
lrwxrwxrwx. 1 root root   57  9月 16 22:16 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx. 1 root root   41  9月 17 11:13 default.target -> /usr/lib/systemd/system/multi-user.target
drwxr-xr-x. 2 root root   85  9月 16 22:16 default.target.wants
drwxr-xr-x. 2 root root   31  9月 16 22:16 getty.target.wants
drwxr-xr-x. 2 root root 4096  9月 16 22:17 multi-user.target.wants
drwxr-xr-x. 2 root root   80  9月 16 22:17 sockets.target.wants
drwxr-xr-x. 2 root root   33  9月 16 22:17 sysinit.target.wants
drwxr-xr-x. 2 root root   43  9月 16 22:16 system-update.target.wants

ランレベル3のディレクトリは以下のとおり。
# ls -l /etc/systemd/system/multi-user.target.wants
合計 0
lrwxrwxrwx. 1 root root 46  9月 16 22:16 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service
lrwxrwxrwx. 1 root root 38  9月 16 22:17 auditd.service -> /usr/lib/systemd/system/auditd.service
lrwxrwxrwx. 1 root root 44  9月 16 22:16 avahi-daemon.service -> /usr/lib/systemd/system/avahi-daemon.service
lrwxrwxrwx. 1 root root 37  9月 16 22:16 crond.service -> /usr/lib/systemd/system/crond.service
lrwxrwxrwx. 1 root root 42  9月 16 22:17 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service
lrwxrwxrwx. 1 root root 37  9月 16 22:16 kdump.service -> /usr/lib/systemd/system/kdump.service
lrwxrwxrwx. 1 root root 39  9月 16 22:17 postfix.service -> /usr/lib/systemd/system/postfix.service
lrwxrwxrwx. 1 root root 40  9月 16 22:16 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target
lrwxrwxrwx. 1 root root 39  9月 16 22:16 rsyslog.service -> /usr/lib/systemd/system/rsyslog.service
lrwxrwxrwx. 1 root root 36  9月 16 22:17 sshd.service -> /usr/lib/systemd/system/sshd.service
lrwxrwxrwx. 1 root root 37  9月 16 22:17 tuned.service -> /usr/lib/systemd/system/tuned.service

サービスの設定ファイルの内容は以下のとおりです。
# cat /etc/systemd/system/multi-user.target.wants/sshd.service
[Unit]
Description=OpenSSH server daemon
After=syslog.target network.target auditd.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStartPre=/usr/sbin/sshd-keygen
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target


起動中のサービス一覧を見たい場合は、以下のようにコマンドを実行します。
# systemctl list-units --type=service
定義されているサービスを全部見たい場合は、以下のようにコマンドを実行します。
# systemctl list-unit-files --type=service
サービスの状態を見たい場合は、以下のようにコマンドを実行します。
# systemctl status sshd
サービスを起動したい場合は、以下のようにコマンドを実行します。
# systemctl start sshd
サービスを停止したい場合は、以下のようにコマンドを実行します。
# systemctl stop sshd
サービスの自動起動を無効にしたい場合は、以下のようにコマンドを実行します。
# systemctl disable sshd
サービスの自動起動を有効にしたい場合は、以下のようにコマンドを実行します。
# systemctl enable sshd

詳しくは、以下のサイトを参照してください。



[CentOS7] ランレベルを変更したい


CentOS6 でランレベルを変更する場合は、/etc/inittab を編集すればよかったのですが、CentOS7 では inittab を使用しません。
CentOS7 の inittab は以下の内容になっています。
# cat /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /etc/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To set a default target, run:
#
# ln -sf /lib/systemd/system/<target name>.target /etc/systemd/system/default.target
#

CentOS7 では、/etc/systemd/system/default.target のシンボリック・リンク先を切り替えてランレベルを変更します。
使用可能なターゲットを確認します。
# systemctl list-units --type=target
UNIT                LOAD   ACTIVE SUB    DESCRIPTION
basic.target        loaded active active Basic System
cryptsetup.target   loaded active active Encrypted Volumes
getty.target        loaded active active Login Prompts
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target     loaded active active Local File Systems
multi-user.target   loaded active active Multi-User System
network.target      loaded active active Network
paths.target        loaded active active Paths
remote-fs.target    loaded active active Remote File Systems
slices.target       loaded active active Slices
sockets.target      loaded active active Sockets
swap.target         loaded active active Swap
sysinit.target      loaded active active System Initialization
timers.target       loaded active active Timers

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

14 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

現在の設定を確認します。
# systemctl get-default
multi-user.target
# ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37  9月 16 22:21 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target
multi-user.target は、ランレベル3 (マルチユーザ・コンソールログイン) に該当します。
ランレベルを、5 (グラフィカルログイン)に変更します。
# systemctl set-default graphical.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/graphical.target' '/etc/systemd/system/default.target'

設定を確認します。
# systemctl get-default
graphical.target

あとは、リブートすれば、設定変更が有効になります。

■ 補足
root のパスワードを忘れた場合に、シングルユーザモードになって、rootユーザのパスワードを再設定したいときは、以下のサイトが参考になります。





[CentOS7] タイムゾーンを 「東京(Asia/Tokyo)」 変更したい


使用できるタイムゾーンを確認します。
# timedatectl list-timezones | head
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
~省略~
現在の設定を確認します。
# timedatectl
      Local time: 火 2014-09-16 21:19:26 EDT
  Universal time: 水 2014-09-17 01:19:26 UTC
        RTC time: 水 2014-09-17 01:19:25
        Timezone: America/New_York (EDT, -0400)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  日 2014-03-09 01:59:59 EST
                  日 2014-03-09 03:00:00 EDT
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  日 2014-11-02 01:59:59 EDT
                  日 2014-11-02 01:00:00 EST

設定を変更します。以下の例では、Asia/Tokyo に変更しています。
# timedatectl set-timezone Asia/Tokyo
設定を確認します。
# timedatectl
      Local time: 水 2014-09-17 10:20:33 JST
  Universal time: 水 2014-09-17 01:20:33 UTC
        RTC time: 水 2014-09-17 01:20:32
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
タイムゾーンを変更すると、/etc/localtime のシンボリック・リンク先が切り替わります。

timedatectl コマンドでは、時刻設定や、ntp 同期の有効化などできるようです。
詳しくは、以下のサイトを参照してください。

ちなみに、CentOS7 では、ntp のかわりに、chrony が標準になったようです。
詳しくは、以下のサイトを参照してください。






[CentOS7] キーボードを日本語(jp106)にしたい


使用可能なキーマップを確認します。
# localectl list-keymaps
ANSI-dvorak
amiga-de
amiga-us
applkey
atari-de
atari-se
atari-uk-falcon
atari-us
azerty
backspace
~省略~
現在の設定を確認します。
# localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: us
      X11 Layout: us
       X11 Model: pc105+inet
     X11 Options: terminate:ctrl_alt_bksp

設定を変更します。以下の例では、 jp106(日本語キーボード) に変更しています。
# localectl set-keymap jp106
設定を確認します。
# localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp

設定は、/etc/vconsole.conf に保存されます。





[CentOS7] システム言語を日本語(UTF8)にしたい


設定できる文字コードを確認します。
# localectl list-locales
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER.utf8
aa_ER.utf8@saaho
~省略~
現在の設定を確認します。
# localectl
   System Locale: LANG=en_US.utf8
       VC Keymap: jp106
      X11 Layout: jp

設定を変更します。以下の例では ja_JP.UTF-8 に変更しています。
# localectl set-locale LANG=ja_JP.UTF-8
設定を確認します。
# localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp

設定は、/etc/locale.conf に保存されます。




[CentOS7] ファイヤーウォールを無効にしたい


CentOS7 の最小構成では、iptables の代わりに、FirewallD が動いてます。
以下のようにコマンドを実行すると確認できます。
# systemctl list-unit-files -t service | grep iptables
# systemctl list-unit-files -t service | grep ip6tables
# systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since 火 2014-09-16 22:40:20 JST; 10h ago
 Main PID: 572 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─572 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

 9月 16 22:40:20 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
 9月 17 00:01:16 localhost.localdomain firewalld[572]: 2014-09-17 00:01:16 ERROR: ZONE_ALREADY_SET
ファイヤーウォールを無効にしたい場合は、まず、iptables の設定をクリアします。
# iptables -F
次に、FirewallD を停止して、自動起動を無効にします。
# systemctl stop firewalld.service
# systemctl disable firewalld.service
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
rm '/etc/systemd/system/basic.target.wants/firewalld.service'
iptables を確認すると、以下のとおり。設定がクリアされているのでアクセスに制限はありません。
# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

FirewallD サービスの状態を確認すると以下のとおり。自動起動は無効になり、サービスも停止しています。
# systemctl list-unit-files -t service | grep firewalld
firewalld.service                           disabled
# systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled)
   Active: inactive (dead)

 9月 16 22:40:15 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
 9月 16 22:40:20 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
 9月 17 00:01:16 localhost.localdomain firewalld[572]: 2014-09-17 00:01:16 ERROR: ZONE_ALREADY_SET
 9月 17 09:17:17 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon...
 9月 17 09:17:19 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon.
 9月 17 09:18:08 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon.


ファイヤーウォールについては、以下のサイトが参考になります。





[CentOS7] ネットワーク情報(IPアドレスなど)を参照・変更したい


CentOS7 では、ネットワーク関連の設定は NetworkManager を使用することを推奨しているようです。また、最小構成でインストールすると ifconfig、netstat、route などのコマンドがありません。代りに iproute2 パッケージのip、ss などのコマンドを使うことを推奨しているようです。

どうしても ifconfig など使用したい場合は、net-tools パッケージをyum でインストールすれば、使用できるようになります。
ただし、net-tools パッケージは、将来、廃止予定のようです。

ネットワーク関連の設定ファイルは、CentOS6 と同じく /etc/sysconfig/network-scripts にあります。
CentOS6のときと同じように、ファイルを直接修正しても設定変更できそうですが、推奨している NetworkManager を利用して設定変更したほうがいいかもしれません。

NetworkManagerのテキストベースのUI(画面)を使用して設定変更する場合は、nmtui コマンドを使います。
以下のように root ユーザの英語環境で nmtui コマンドを実行します。
# env LANG=C nmtui
下図の画面が表示されます。
固定IPアドレスを設定したい場合は、矢印キーで [Edit a connection] を選択し、TABキーで [OK]に移動して、ENTERキーを押下します。



下図の画面が表示され、NICデバイスが表示されます。
私の環境が、XenServerの仮想マシンなのでデバイスが eth0 と表示されていますが、デバイス名は環境によって異なります。
矢印キーでIPアドレスを変更したいデバイスを選択してENTERキーを押下します。



下図の画面が表示されます。
まず、DHCPから固定IPに変更します。[IPv4 ConFIGURATION] にTABキーで移動し、ENTERキーを押下します。



メニューが表示されたら、矢印キーで[Manual]を選択して、ENTERキーを押下します。



今度は、IPアドレスとデフォルトゲートウェイのIPアドレスを設定します。
TABキーで [Show]へ移動し、ENTERキーを押下します。



固定IPアドレスを入力するフィールドを追加します。
TABキーで [Add...] に移動し、ENTERキーを押下します。



[Addresses] にサーバのIPアドレスを入力し、[Gateway]にデフォルトゲートウェイのIPアドレスを入力します。
必要に応じて、DNS、静的ルーティングの設定も、ここでできます。



設定が終了したら、TABキーで [OK] に移動して、ENTERキーを押下します。



TABキーで [OK] に移動して、ENTERキーを押下します。



以上で設定完了です。
設定変更の終了後は、以下のコマンドを実行すると設定変更が有効になります。
# systemctl restart NetworkManager
# systemctl restart network
nmtui で設定したIPアドレスやDNSなどの情報は、/etc/sysconfig/network-scripts/ifcfg-eth0 ファイルに保存され、/etc/resolv.conf は NetworkManager が自動生成します。
ifcfg-eth0 の内容は、以下のとおり。
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=eth0
UUID=08b36bd7-ae4f-4490-b43f-686b2b7f7ba5
ONBOOT=yes
HWADDR=B6:11:AF:D3:23:0B
IPADDR0=192.168.1.10
PREFIX0=24
GATEWAY0=192.168.1.1
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
 
resolv.conf の内容は、以下のとおり。
# cat /etc/resolv.conf
# Generated by NetworkManager


# No nameservers found; try putting DNS servers into your
# ifcfg files in /etc/sysconfig/network-scripts like so:
#
# DNS1=xxx.xxx.xxx.xxx
# DNS2=xxx.xxx.xxx.xxx
# DOMAIN=lab.foo.com bar.foo.com

IPアドレスは、以下の ip コマンドで確認できます。
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b6:11:af:d3:23:0b brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::b411:afff:fed3:230b/64 scope link
       valid_lft forever preferred_lft forever

ルーティング情報は、以下の ip コマンドで確認できます。
# ip r
default via 192.168.1.1 dev eth0  proto static  metric 1024
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.10



■ 補足

コマンドラインでネットワークの設定変更や参照したい場合は nmcui 、ip、ss を使用します。
詳しい使用方法は、以下のサイトが参考になります。