しげふみメモ


おもにIT関連について、気になったことや試してみたことをメモしておきます。
Linux, Firefox, Thunderbird, Blog, Google, Amazon, Affiliate, iPod, PC, English ...

2009年02月

リモートホストのファイル等でdiffする方法

Linuxのdiffコマンドで、リモートホストのファイルやコマンド実行結果を比較する方法をメモ。
最近知りました。

$ diff <(ssh host1 cat file1) <(ssh host2 cat file2)
bash系のプロセス置換(process substitution)がサポートされているシェルで可能です。
この場合、公開鍵認証で認証エージェントに鍵を追加してあるか、ホストベース認証を使用するなどして、パスワードやパスフレーズを入力せずに接続できる必要があります。

ちなみに、一方がローカルなら以下でも可能。
$ ssh host1 cat file1 | diff - file2

sshでコマンド実行した結果とか。
$ diff <(ssh host1 "rpm -qa"|sort) <(ssh host2 "rpm -qa"|sort)

同様に、ローカルでもコマンド実行した結果とかも。
$ diff <(sort file1) <(sort file2)

Command-line Fuで、diffを使ったコマンドを投票順に並べると、他にも色々あります。
Commands using diff | Command-line Fu

おまけ。
2つのディレクトリ内のファイルのdiff
$ diff dir1 dir2
3つのファイルのdiff
$ diff3 file1 file2 file3

参考:リモートホストのファイルとdiffを取るシェル関数
リモートホストとdiffる - (ひ)メモ

個人利用、非商用なら高性能なIntelコンパイラが無償で使える

個人利用、非商用に限りますが、Intelコンパイラが無料で使えます。
IntelのCPUを使っているなら、そのCPUに最適化されたIntelコンパイラでコンパイルすると、一般的にパフォーマンスは良くなるようです。
最新のバージョン11.0は Core i7 や Atom プロセッサーもサポートしています。

4年ほど前の記事ですが、関連として以下のような記事もあります。
無料で30%のパフォーマンスUP!! - intel compiler :: Drk7jp

ダウンロードは以下から。
Non-Commercial Software Development - Intel Software Network
同意できれば Accept のリンクから各プロダクトの非商用版の申し込みページに進みます。

非商用版ライセンス (Non-commercial License) の FAQ の日本語版は以下にあります。
XLsoft エクセルソフト : パフォーマンス製品 Intel : アプリケーション・パフォーマンス最適化ツール

Q. 非商用版とは何ですか?
A. 非商用版とは、開発した製品やサービスが営利目的ではなく、いかなる金銭の授受に関与しない活動にのみご利用いただけるインテル ソフトウェア製品です。大学等の学術機関、企業等での利用、研究目的には使用できませんのでご注意ください。

ちなみに、エクセルソフトのページには日本語マニュアル等の情報も充実しています。
XLsoft エクセルソフト : インテル C++ / Fortran コンパイラー マルチコア向けに開発、並列化

CentOS 4.6に C++ Compiler Professional Edition をインストールしてみました。
以下のように tar を展開してインストールスクリプトを実行するだけです。

# tar xzf l_cproc_p_11.0.081_intel64.tgz
# cd l_cproc_p_11.0.081_intel64
# ./install.sh

インストール中のアクティベーションは、メールで送られてくるライセンスファイルを、例えば /opt/intel/license.lic に保存して、それをライセンスファイルとして指定するメニューを選べばOKです。

あと、デフォルトだと C++ Compiler だけでなく、Debugger, Threading Building Blocks (TBB), Integrated Performance Primitives (IPP), Math Kernel Library (MKL) もインストールされるので、必要ない場合は Custom Install を選べばOKです。

インストールが完了すれば、例えば以下のように環境変数を設定するファイルを読み込めば、使用できるようになります。

$ . /opt/intel/Compiler/11.0/081/bin/intel64/iccvars_intel64.sh
$ icc -V
Intel(R) C Intel(R) 64 Compiler Professional for applications running on Intel(R) 64, Version 11.0    Build 20090131 Package ID: l_cproc_p_11.0.081
Copyright (C) 1985-2009 Intel Corporation.  All rights reserved.
FOR NON-COMMERCIAL USE ONLY

$ 

[2009年 3/2追記]
ちょうど以下のような記事も公開されました。
「インテル コンパイラー」で高速に動作するバイナリを作成しよう - SourceForge.JP Magazine

このブログの関連記事

Linuxのrevコマンドで文字を逆に並べる

Linuxの rev というコマンドを最近知りました。
各行ごとに、入力された文字を逆に並べたものを出力します。
via Four Completely Useless Linux Commands

shigefumi@node01:~> cat /etc/SuSE-release 
SUSE Linux Enterprise Server 10 (x86_64)
VERSION = 10
PATCHLEVEL = 2
shigefumi@node01:~> rev /etc/SuSE-release
)46_68x( 01 revreS esirpretnE xuniL ESUS
01 = NOISREV
2 = LEVELHCTAP
shigefumi@node01:~> 

上記Blogのコメントで以下のような使い方がありました。
パッケージの名前とバージョン番号だけを表示できます。

rpm -qa | rev | cut -f 2- -d \- | rev | sort

ちなみに、これはrpmのqueryformatオプションでも可能。

rpm -qa --qf "%{NAME}-%{VERSION}\n" | sort

あと思いついたものとして、bannerコマンドのネタ。
bannerの出力をパイプして tac と rev すると、以下のように180度回転できます。

shigefumi@node01:~> banner linux

#        ###  #     #  #     #  #     #  
#         #   ##    #  #     #   #   #   
#         #   # #   #  #     #    # #    
#         #   #  #  #  #     #     #     
#         #   #   # #  #     #    # #    
#         #   #    ##  #     #   #   #   
#######  ###  #     #   #####   #     #  

shigefumi@node01:~> banner linux | tac | rev

  #     #   #####   #     #  ###  #######
   #   #   #     #  ##    #   #         #
    # #    #     #  # #   #   #         #
     #     #     #  #  #  #   #         #
    # #    #     #  #   # #   #         #
   #   #   #     #  #    ##   #         #
  #     #  #     #  #     #  ###        #

shigefumi@node01:~> 

本当は、有名な ipod! を回転させたかったのですが、今回インストールしたbannerコマンドでは大文字になるので、ipod!になりませんでした。

ちなみに、Command-line Fu < The best UNIX commands on the webをgrepしてみましたが、この記事投稿時点では、revを使ったものはありませんでした。

他に何か使い道があれば教えていただけると嬉しいです。

conserverで複数台のサーバのコンソールを管理

以前に書いた記事、しげふみメモ : Conserverでコンソールを管理で試したConserverをopenSUSE 10.3で使う場合のメモ。

今回は、8台のサーバのコンソールを管理します。
サーバは全てBMC(Baseboard Management Controller)が装備されていて、SOL(Serial Over LAN)でコンソールにアクセスできるように設定されています。
ということで、シリアルケーブルではなくて、ネットワーク経由で IPMItool でコンソールが取得できます。

今回はopenSUSE 10.3にインストールするので、パッケージはとりあえずSoftware.openSUSE.orgで探しました。
10.3用は無かったのですが、11.0用があったので、そのソースパッケージ conserver-8.1.16-2.1.src.rpm からビルドすることにしました。

console01:~ # rpmbuild --rebuild conserver-8.1.16-2.1.src.rpm
console01:~ # rpm -i /usr/src/packages/RPMS/i586/conserver-8.1.16-2.1.i586.rpm 

ipmitoolはSoftware.openSUSE.orgにあったので、それをインストールして動作確認。

console01:~ # rpm -i ipmitool-1.8.9-37.i586.rpm 
console01:~ # ipmitool -I lanplus -H node01-bmc -U XXXX -P XXXX power status
Chassis Power is on
console01:~ # 

/etc/conserver.cf は以下のようなもの。
ipmitoolのオプションは機種によっても違う場合があるので参考程度に。
細かい部分は以前の記事などを参考に。

access * {
        trusted localhost;
}

break 1 {
        string "~B";
}

default * {
        rw root;
        logfile /var/consoles/&;
        timestamp 1hab;
        logfilemax 1m;
        master localhost;
        type exec;
}

console node01 {
        exec ipmitool -I lanplus -H node01-bmc -U XXXX -P XXXX sol activate;
}
(中略)
console node08 {
        exec ipmitool -I lanplus -H node08-bmc -U XXXX -P XXXX sol activate;
}

今回管理するサーバ側(SLES10 SP2)の設定変更点は以下。(OSや機種によっても違うので参考程度に)

  • BIOSで Console Redirection を設定。BMCにIPアドレス等を設定。
  • GRUBメニューをコンソールにテキスト形式で表示させるために、/boot/grub/menu.lst に gfxmenu の行があればコメントアウト。
  • OS起動時のメッセージをコンソールに表示させるために、/boot/grub/menu.lst の kernel 行に console=ttyS1,38400n8 を追加。
  • コンソールからログインできるように /etc/inittab に以下を追加。
    ちなみに、38400は無くても smart_agetty が自動判別してくれる。
    cons:12345:respawn:/sbin/smart_agetty -L 38400 console
    
  • コンソールからrootで直接ログインできるように /etc/securetty に console を追加。

以上で、複数台のサーバのコンソールを管理できます。
BMC搭載のサーバを追加したらconsoleの行を増やせばいいだけです。

このブログの関連記事

ルノーの衝突試験の動画がすごい

会社の同僚に教えてもらったネタ。
フランス車のルノーの衝突試験の動画が面白いです。
ルノー:安全の取り組み(音が出るので注意)

ドイツ車
ドイツ車

日本車
日本車

フランス車
フランス車

別の動画の「バレエ」はもっとかっこいいです。
YouTube - Renault Ballettには少し長いバージョンがあります。

xfsdump,xfsrestoreでXFSのディスクコピー

LinuxでXFSファイルシステムのOSのディスクを別のディスクにコピーする場合のメモ。

ミラーリングをしたくない場合でバックアップ用ディスクを作りたい場合や、ディスクの内容をまるごと別のディスクに移したい場合などに。

以下のログは SLES10 SP1 で試した時のもので、1本目のディスクは、swap と / の2パーティション構成の場合とします。

node01:~ # df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              74G  4.6G   69G   7% /
udev                  501M  124K  501M   1% /dev
node01:~ # 
fdisk や parted で2本目のディスクにパーティションを作成。
今回はまったく同じ構成にしてみました。
(サイズやパーティション構成を変更したい場合にも使えます)
node01:~ # fdisk -l /dev/sd[ab]

Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         131     1052226   82  Linux swap / Solaris
/dev/sda2             132        9729    77095935   83  Linux

Disk /dev/sdb: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         131     1052226   82  Linux swap / Solaris
/dev/sdb2             132        9729    77095935   83  Linux
node01:~ # 
mkfsでファイルシステム作成。
ext3と違って一瞬で完了するのが嬉しい。
node01:~ # mkfs.xfs /dev/sdb2
meta-data=/dev/sdb2              isize=256    agcount=16, agsize=1204623 blks
         =                       sectsz=512   attr=0
data     =                       bsize=4096   blocks=19273968, imaxpct=25
         =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096  
log      =internal log           bsize=4096   blocks=9411, version=1
         =                       sectsz=512   sunit=0 blks
realtime =none                   extsz=4096   blocks=0, rtextents=0
node01:~ # 
swap作成。
node01:~ # mkswap /dev/sdb1
Setting up swapspace version 1, size = 1077473 kB
node01:~ # 
2本目のディスクの / パーティションを /new にマウント。
node01:~ # mount /dev/sdb2 /new
node01:~ # df -h / /new
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              74G  4.6G   69G   7% /
/dev/sdb2              74G  544K   74G   1% /new
node01:~ # 
あと、OSのDVD等に含まれるxfsdumpパッケージが必要。
これでdump/restoreの準備完了です。
/ から /new ファイルシステムへのコピーは、manページにあるように、基本的に以下で可能。
# xfsdump -J - / | xfsrestore -J - /new
この -J はdump inventory databaseを更新しないというオプション。
xfsdumpはインクリメンタルバックアップなどのために、databaseとして /var/lib/xfsdump/inventory を使用するが、今回のようなコピーの場合には必要がないため。

あと、私は -p 60 といったオプションを付けたりします。
指定秒毎に進捗を表示してくれます。

実際のログは以下。
node01:~ # xfsdump -J - / | xfsrestore -J -p 60 - /new
xfsrestore: using file dump (drive_simple) strategy
xfsdump: xfsrestore: version 2.2.43 (dump format 3.0) - Running single-threaded
using file dump (drive_simple) strategy
xfsdump: version 2.2.43 (dump format 3.0) - Running single-threaded
xfsdump: level 0 dump of node01:/
xfsdump: dump date: Thu Jan  8 19:17:11 2009
xfsdump: session id: b52423b6-bc30-4859-89cb-c1b6b478fdbc
xfsdump: session label: ""
xfsrestore: media label: ""
xfsrestore: file system id: cf274d72-c6f4-41ff-9f17-38b6fbc281dc
xfsrestore: session id: b52423b6-bc30-4859-89cb-c1b6b478fdbc
xfsrestore: media id: 59d1444a-04c8-4cac-a425-7b57f0ad1689
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsdump: dumping non-directory files
xfsrestore: 8796 directories and 101172 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: status at 19:18:11: 9955/89299 files restored, 5.7% complete, 60 seconds elapsed
xfsrestore: status at 19:19:11: 19612/89299 files restored, 11.5% complete, 120 seconds elapsed
(中略)
xfsrestore: status at 19:26:11: 75234/89299 files restored, 98.1% complete, 540 seconds elapsed
xfsdump: ending media file
xfsdump: media file size 4674038560 bytes
xfsdump: dump size (non-dir files) : 4641927160 bytes
xfsdump: dump complete: 564 seconds elapsed
xfsdump: Dump Status: SUCCESS
xfsrestore: restore complete: 573 seconds elapsed
xfsrestore: Restore Status: SUCCESS
node01:~ # 
dfなどで確認。
node01:~ # df -h / /new
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              74G  4.6G   69G   7% /
/dev/sdb2              74G  4.6G   69G   7% /new
node01:~ # 
/etc/fstab , /boot/grub/menu.lst を確認。
/dev/sda1などのデバイス名で指定してあれば問題ないが、LABELやUUIDで指定してある場合には変更などが必要。

最後に、このままでは、2本目のディスクには GRUB がインストールされていないので手動でインストールする必要がある。
今回、2本目のディスクの /boot はこの時点では /dev/sdb2 にあるので、grub で root (hd1,1) を指定して setup すればインストールされる。
node01:~ # grub

grub> root (hd1,1)
 Filesystem type is xfs, partition type 0x83

grub> setup (hd1)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/xfs_stage1_5" exists... yes
 Running "embed /boot/grub/xfs_stage1_5 (hd1)"...  18 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd1) (hd1)1+18 p (hd1,1)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.

grub> 

以上で、2本目のディスクに入れ替えれば、同じOSで起動するはずです。

ちなみに、どのファイルシステムが好きかと言えば、やはりXFSですね。
サポートされていれば、XFSを使いたいです。

エンジニア転職情報
このBlog内を検索
プロフィール

しげふみ

連絡先
連絡先
RSSリーダーに登録
Subscribe with livedoor Reader

あわせて読みたい
人気blogランキング

  • ライブドアブログ