[linux]rsyslog(messagesなど)にログレベル(severity,重大度)を表示する

rsyslogで出力するシステムログにログレベル(シビリティ・重大度)を表示させる方法。
syslogでは起動オプションを付ける方法であったが、rsyslogでは設定ファイルに定義する。
設定ファイル(/etc/rsyslog.conf)には、ログレベルを追加したログフォーマットを「$template」で始まる行で定義し、出力する定義のアクションにログフォーマットを指定する。

# vi /etc/rsyslog.conf
:(省略)
$template LocalFormat,”%timereported% %hostname% %syslogfacility-text%.%syslogseverity-text%: %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n”
:(省略)
*.info;mail.none;authpriv.none;cron.none /var/log/messages;LocalFormat

出力されるログはこんな感じ

Oct 20 03:21:26 hogehoge kern.warning: kernel: [iptables SYN FLOOD] IN=eth0 OUT= MAC=02:16:3e:4f:39:

「%syslogtag%」やら「%syslogfacility-text%」の意味は

# man rsyslog.conf

の「Available Properties」の項に書いてあるので、そっちを見て。

[linux]rshのタイムアウト

残念ながらRHEL(RedHat)のrshコマンドにはタイムアウトのオプションが実装されていない。
rsh実行中にOSPFなどの動的ルーティングで経路が変わったりネットワークの状態に変化があった場合、
rshコマンドのパケットが戻ってこれずに、いつまで経ってもrshコマンドが終了しないという困った状態になる。
rshコマンドのタイムアウトが実装されていない場合の回避方法。
スクリプト使います。
ポイントは

  • rshをバックグラウンド実行
  • bashの特殊変数SECONDSを使用して、スクリプト開始からの経過時間を取得し、それを利用する

です。

#!/bin/bash
# タイムアウト秒数指定
timeoutsec=120
rsh "リモートコマンド" &
# バックグラウンド実行(rsh)のpidを取得
bpid=$!
startsec=${SECONDS}
while [[ 1 == 1 ]]
do
    # rshコマンド終了チェック
    stdout=$( ps auwwwwx | egrep "^.+[[:space:]]${bpid}[[:space:]]")
    if [[ -z "${stdout}" ]];then
        # 終了している
    	break
    fi
    # 経過分数を取得
    nowsec=${SECONDS}
    # rsh開始からの経過分数取得
    (( divsec=${nowsec}-${startsec} ))
    if (( ${divsec} > ${timeoutsec} ));then
    	# タイムアウト
    	kill -9 ${bpid}
    fi
    sleep 10
done

 

[linux]パケットキャプチャ

linuxでパケットキャプチャ
通信してるか確かめるだけなら

# tcpdump -i <NICデバイス名> port <ポート番号> and host <IPアドレス>

通信している内容も確かめたいときは

# tcpdump -Xx -s 4096 -i <NICデバイス名> dst port <ポート番号>? and? src host? <IPアドレス>

後でwiresharkで確かめたいときは(ファイルに保存)

# tcpdump -w <保存するファイル名> -s 4096 -i <NICデバイス名> dst port <ポート番号>? and? src host? <IPアドレス>

ってか最初からwiresharkでやれよ!
CUIフェチなもんで。

[linux]syslog(messagesなど)にログレベルを表示する

システムログ(syslogで出力するログ)に、ログレベルを出力させる方法。
ログレベル(重大度)でログ監視させたい場合に非常に便利。
rsyslog版はこちら
syslogdの起動オプションに「-SS」を追加する。
RHEL(CentOS)ならこんな感じ。

# vi /etc/sysconfig/syslog
:(省略)
SYSLOGD_OPTIONS=”-m 0 -SS
:(省略)

オプションを追加したらsyslogdを再起動

# service syslog restart

/var/log/messagesにはこんな感じで出力される

Aug 5 01:19:39 <syslog.info> hostname syslogd 1.4.1: restart.
Aug 5 01:19:39 <kern.info> hostname kernel: klogd 1.4.1, log source = /proc/kmsg started.

[linux]OS再インストールなしにマザーボードを交換してみる

OS再インストールなしに、マザーボードを交換してみる

C7プロセッサを載せた自宅サーバのマザーボードが不安定になったので、マザーボードを交換してみた。面倒なOS再インストールおよびミドルウェア再設定なしで。何も考えずにするとディスク(VG)が見えなくなるので厄介。
▼環境

 OS:CentOS 5.3
 マザーボード:EPIA-LN10000EG(C7) → D945GCLF2(Atom330)

マザーボードのSATAコントローラが交換前後で異なるので、マザーボード交換後は当然ディスク(というよりLVM VG)が見えなくなる。
▼ 以下やったこと。
マザーボード交換後、何も手当てをせずに起動してみる。
initrdを読み込んで、VGを探し始めたところで「No volume groups found」といわれてしまう。
予想通りの結果。initrdの中にICH7用のSATAドライバがないから(現時点で読み込んでいるのはVIAのSATAドライバ)。
念のためディスク自身が使用できることを確認するために、CentOSのインストールDVDのレスキューモードで起動。VGも認識したので、ディスク自身も使用できること(問題ないこと)は確定。
さて、ここでinitrdをICH7用ドライバを読み込むように作り変えることになるのだが、どれがICH7用ドライバかわからない。レスキューモードで起動しているがlsmodをみても判断できない。
ということで・・・
外付けHDDにCentOSをインストールしてみる(再インストールなしと書いているが、データを破壊しないという意味なので・・・)。
※このときGRUBの2段階目は外付けHDDに向くので、後ほど注意!
インストール後、/etc/modprobe.confの内容を確認。
こんな感じ。

alias scsi_hostadapter ata_piix
alias scsi_hostadapter1 usb-storage
alias snd-card-0 snd-hda-intel
options snd-card-0 index=0
options snd-hda-intel index=0
remove snd-hda-intel { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r –ignore-remove snd-hda-intel
alias eth0 r8169

これをどこかにメモしておいて、こちらのOSはシャットダウン。外付けHDDは外す。
次に、もう一度CentOSのインストールDVDのレスキューモードで起動。
内蔵HDDの(/mnt/sysimage)/etc/modprobe.confの中身を上記メモの内容に置き換えて、initrdを再作成する。

# vi /mnt/sysimage/etc/modprobe.conf
(上記メモ内容に置き換え)
# chroot /mnt/sysimage
# cp -p /boot/initrd-2.6.18-92.1.22.el5.img? /boot/initrd-2.6.18-92.1.22.el5.img.c7
# mkinitrd -f? /boot/initrd-2.6.18-92.1.22.el5.img 2.6.18-92.1.22.el5

作成したinitrdを解凍してみて、ちゃんとICH7用のドライバが組み込まれていることを確認する

# gzip -dc? /boot/initrd-2.6.18-92.1.22.el5.img > /tmp/initrd.cpio
# mkdir /tmp/initrddir
# cd /tmp/initrddir
# cpio -i –file ../initrd.cpio
# less init
(ここで、insmod /lib/ata_piix.koがあることを確認)

確認できたら、GRUB(ブートローダ)の2段目の向き先を内蔵ディスクに戻す

(先ほどのchrootの環境のまま)
# /sbin/grub
grub> root (hd0,0)
grub> setup (hd0)
grub> quit
# sync

これにて完了!
あとはexitして、再起動すれば元通りに起動できる。

[linux]コンパイル時に「ld: cannot find -l」となるときの解決方法

linux(Redhat系)にて、ソフトウェアインストールのコンパイル時に

/usr/bin/ld: cannot find -lXext

というエラーメッセージが表示され、コンパイルが失敗してしまうときの 解決方法。
-lに続くパッケージ?のライブラリがないから上記のようなエラーが発生する。(configureのチェックをすり抜けちゃってるんですね・・・)
つまり、-l<パッケージ名> なら「lib<パッケージ名>-devel」というパッケージを用意すればよいことになる。
具体的には 「ld: cannot find -lXext」なら「libXext-devel」
どのパッケージかわからなければ

yum search lib<パッケージ名>

で表示されたパッケージを全てインストールしてしまえばよい。

[Linux]ネットワークインターフェースの通信モード(全二重/半二重/オートネゴシエーション)確認方法

Linuxでの、ネットワークインターフェース(NIC)の通信モード(全二重/半二重/オートネゴシエーション)確認方法
以下のコマンドを実行

# ethtool? <インターフェース名(eth0など)>
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes:?? 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Supports auto-negotiation: Yes
Advertised link modes:? 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s????????????? ←リンク速度
Duplex: Full ←通信モード(全二重/半二重)
Port: MII
PHYAD: 1
Transceiver: internal
Auto-negotiation: on ←オートネゴシエーションの有効
Supports Wake-on: pumbg
Wake-on: d
Current message level: 0x00000001 (1)
Link detected: yes

オートネゴシエーションを有効にしたいなら

# vi /etc/sysconfig/network-scripts/ifcfg-<インターフェース名>
ETHTOOL_OPTS=”autoneg on”??? ←変更または追加
# service network restart

とある事情で、オートネゴシエーションを無効にして、100Mbps半二重固定で通信させたいなら

# vi /etc/sysconfig/network-scripts/ifcfg-<インターフェース名>
ETHTOOL_OPTS=”speed 100 duplex half autoneg off”??? ←変更または追加
# service network restart

上記(100Mbps半二重固定)を一時的に反映させたいだけなら

# ethtool -s <インターフェース名> speed 100 duplex half autoneg off

Linuxで、ISOイメージからUSBブートLinux CD を作成

Linuxで、ISOイメージからUSBブートLinux CD を作成
CD-ROM(DVD)ドライブがないマシンで、レスキューモードで起動したいときなどに有効。(そのためだけに外付けCD-ROMドライブを買うのがもったいないなど)
USBメモリは、フラッシュメモリーやSDカード、コンパクトフラッシュ(CF)など。
1.USBメモリに領域作成

# fdisk /dev/sda
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります
コマンド (m でヘルプ): p
Disk /dev/sda: 260 MB, 260046848 bytes
8 heads, 62 sectors/track, 1024 cylinders
Units = シリンダ数 of 496 * 512 = 253952 bytes
デバイス Boot Start End Blocks Id System
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-1024, default 1):
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-1024, default 1024):
Using default value 1024
コマンド (m でヘルプ): a
領域番号 (1-4): 1
コマンド (m でヘルプ): p
Disk /dev/sda: 260 MB, 260046848 bytes
8 heads, 62 sectors/track, 1024 cylinders
Units = シリンダ数 of 496 * 512 = 253952 bytes
デバイス Boot Start End Blocks Id System
コマンド (m でヘルプ): w
領域テーブルは交換されました!
ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。

2.USBメモリにext3ファイルシステム作成

# mke2fs -j /dev/sda1

3.Netwide Assembler インストール
後のsyslinuxのコンパイル時に必要

# yum install nasm.i386

4.syslinux インストール
syslinuxのサイトURL
http://syslinux.zytor.com
http://freshmeat.net/projects/syslinux/

# wget http://freshmeat.net/redir/syslinux/10177/url_tgz/syslinux-3.52.tar.gz
# tar zxvf syslinux-3.52.tar.gz
# cd syslinux-3.52
# make

5.extlinuxでUSBメモリにブートローダ(第2段階目)書き込み
extlinuxはsyslinuxのext2/3ファイルシステム用のサブセット

# cd extlinux
# mount /dev/sda1 /mnt/flash
# mkdir -p /mnt/flash/isolinux #・・・・isoイメージのディレクトリ構成にあわせる
# ./extlinux -i /mnt/flash/isolinux
/mnt/flash/isolinux is device /dev/sda1

6.USBメモリのマスターブートレコード(MBR)にブートローダ(第1段階目)書き込み
これを書き込まないと起動できない!

# cat ../mbr/mbr.bin > /dev/sda

7.isoイメージの内容のコピー

# mkdir /mnt/isoimg
# mount -o loop INSERT-1.3.9b_en.iso /mnt/isoimg
# cp -pR /mnt/isoimg/* /mnt/flash
# sync

8.USBメモリに書き込んだブートローダーの設定ファイルの名前変更

# mv /mnt/flash/isolinux/isolinux.cfg /mnt/flash/isolinux/extlinux.conf

9. ブート検証
USBメモリをさしたままマシンを再起動する
BIOS設定画面を起動し、ブートデバイスを「USB-HDD」に。「USB-HDD」が選択できない場合、BIOSがUSBメモリブートに対応していない・・・

(linux)LVM2の操作方法

いまさらながらLVM2の操作方法
○検証環境作成

# dd if=/dev/zero of=/var/tmp/mounttest1 count=128 bs=1024k
# ls -l /var/tmp/mounttest1
-rw-r–r– 1 root root 134217728 7月 12 09:29 /var/tmp/mounttest1

空いてるループバックデバイスの確認

# losetup /dev/loop0
loop: デバイス /dev/loop0 の情報を取得できません: そのようなデバイスやアドレスはありません

ループバックデバイスとループバックファイルを設定

# losetup /dev/loop0 /var/tmp/mounttest1
# losetup /dev/loop0
/dev/loop0: [fd00]:146028 (/var/tmp/mounttest1)

○ lvm用パーティション作成
fdisk でパーティションを作成。システムタイプをlinux LVMにする

# fdisk /dev/loop0
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-16, default 1):
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-16, default 16):
Using default value 16

こんな感じで作成
/dev/loop0p1 128M

システムタイプの番号を確認
コマンド (m でヘルプ):l
8e Linux LVM
システムタイプを変更
コマンド (m でヘルプ): t
Selected partition 1
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました
コマンド (m でヘルプ): p
Disk /dev/loop0: 134 MB, 134217728 bytes
255 heads, 63 sectors/track, 16 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
デバイス Boot Start End Blocks Id System
/dev/loop0p1 1 16 128488+ 8e Linux LVM

書き込み

コマンド (m でヘルプ): w
領域テーブルは交換されました!
ioctl() を呼び出して領域テーブルを再読込みします。
警告: 領域テーブルの再読込みがエラー 22 で失敗しました: 無効な引数です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。

ということで、ループバックデバイスにはパーティションが設定できない模様。
そのまま/dev/loop0を使うことに。
本来ならここで、再起動

# shutdown -r now

○ 物理ボリューム(PV)作成

# lvm pvcreate /dev/loop0
Physical volume “/dev/loop0” successfully created# lvm pvdisplay /dev/loop0
— NEW Physical volume —
PV Name /dev/loop0
VG Name
PV Size 127.81 MB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID WqwiNW-FB83-Cjup-iMQt-YDgp-MSZm-z7py2I

○ ボリュームグループ(VG)作成

# lvm vgcreate testvg /dev/loop0 (-s サイズ でエクステントサイズ指定 エクステント数は最大65535個)
Volume group “testvg” successfully created
# lvm vgdisplay testvg
— Volume group —
VG Name testvg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 124.00 MB
PE Size 4.00 MB
Total PE 31
Alloc PE / Size 0 / 0
Free PE / Size 31 / 124.00 MB
VG UUID txlZBT-9tGO-OHcH-eev4-1j8n-gdEa-0f8VVN

○ 論理ボリューム(LV)の作成

# lvm lvcreate -L 32M -n testlv1 testvg # 32MBの大きさのLVを作成
Logical volume “testlv1” created
# lvm lvcreate -l 8 -n testlv2 testvg # 4MBのエクステント8個分の大きさ(32MB)のLVを作成
Logical volume “testlv2” created
# lvm lvdisplay testvg
— Logical volume —
LV Name /dev/testvg/testlv1
VG Name testvg
LV UUID t67uqN-Pfua-RHd9-wDT4-S4wq-HbL9-faBLRU
LV Write Access read/write
LV Status available
# open 0
LV Size 32.00 MB
Current LE 8
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:2— Logical volume —
LV Name /dev/testvg/testlv2
VG Name testvg
LV UUID jwFWPR-Jb0k-K0BC-lwBf-rD4L-Wuw8-R252GB
LV Write Access read/write
LV Status available
# open 0
LV Size 32.00 MB
Current LE 8
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:3

○ ファイルシステム作成

# mke2fs -j /dev/testvg/testlv1
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
8192 inodes, 32768 blocks
1638 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33554432
4 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

○ マウント

# mkdir /mnt/test
# mount /dev/testvg/testlv1 /mnt/test
# df
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/mapper/testvg-testlv1
31729 4509 25582 15% /mnt/test
# ls -l /dev/testvg/testlv1
lrwxrwxrwx 1 root root 26 7月 12 10:33 /dev/testvg/testlv1 -> /dev/mapper/testvg-testlv1

○ 論理ボリュームの削除

# lvm lvremove /dev/testvg/testlv2
Do you really want to remove active logical volume “testlv2”? [y/n]: y
Logical volume “testlv2” successfully removed

○ 論理ボリュームの拡張
書式
# lvm lvextend [ -l +エクステント数 | -L +バイト数 ] 論理ボリュームのパス
サイズの前に+をつけないと絶対的なサイズ指定になる(現在のサイズからの足し算にならない)

# lvm lvextend -l +1 /dev/testvg/testlv1
Extending logical volume testlv1 to 36.00 MB
Logical volume testlv1 successfully resized
# df
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/mapper/testvg-testlv1
31729 4509 25582 15% /mnt/test

※lvのサイズが大きくなるだけで、ファイルシステムのサイズは大きくならない
○ ファイルシステムの拡張
書式
# resize2fs -p 論理ボリュームのパス [新しい全体のサイズ]

# resize2fs -p /dev/testvg/testlv1 #サイズを指定しない場合論理ボリュームのサイズが自動指定される
resize2fs 1.35 (28-Feb-2004)
/dev/testvg/testlv1 is mounted; can’t resize a mounted filesystem!

※アンマウントしろ!と怒られる
※最近のLinuxでは、ファイルシステムの拡張はマウントしたまま resize2fsコマンドが実行できる。なので以降は不要。その影響で後に出てくるext2onlineコマンドもなくなっている。

# umount /mnt/test
# resize2fs -p /dev/testvg/testlv1
resize2fs 1.35 (28-Feb-2004)
Please run ‘e2fsck -f /dev/testvg/testlv1’ first.

※ファイルシステムのチェックをしてねとお願いされる

# e2fsck -f /dev/testvg/testlv1
e2fsck 1.35 (28-Feb-2004)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/testvg/testlv1: 11/8192 files (9.1% non-contiguous), 5548/32768 blocks
# resize2fs -p /dev/testvg/testlv1
resize2fs 1.35 (28-Feb-2004)
Resizing the filesystem on /dev/testvg/testlv1 to 36864 (1k) blocks.
Begin pass 1 (max = 1)
Extending the inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/testvg/testlv1 is now 36864 blocks long.
# mount /dev/testvg/testlv1 /mnt/test
# df
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/mapper/testvg-testlv1
35567 4509 29584 14% /mnt/test

※ファイルシステムのサイズが大きくなっていることを確認
※ext3の場合はext2onlineコマンドでマウントしたまま(オンライン)でできる(最近のLinuxではこのコマンドはなくなっています。理由はresize2fsコマンドがマウントしたまま実行可能だからです。)

○ ボリュームグループの削除

# lvm vgremove testvg