Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

linux

SSHキーのfingerprint確認

最近 GitHub の脆弱性つかれたとかで、ssh の fingerprint 確認しろというメールがきました。ssh-keygenコマンドで確認できるようです。

# ssh-keygen -l -f ~/.ssh/id_dsa.pub

ハードディスクなどのブロックデバイスを丸ごとscpでリモートにコピーする

ファイルを安全にリモートにコピーしたいとき、scp コマンド使うことはよくあることです。

でも、scpコマンドはファイルが対象なので、ブロックデバイスをこのようにコピーしようとしても怒られます。

# scp /dev/sda1 remotehost:/home/

ブロックデバイスは、ローカルならば、dd コマンドで使ってコピーできますよね?

# dd if=/dev/sda1 of=/home/hoge.img

これを応用してあげるとブロックデバイスもこんな風にscpでコピーできちゃいます。

# ssh remotehost dd of=/home/hoge.img  < /dev/sda1

逆に、リモートのディスクのバックアップをとりたい時はこんな風にすればいけます。

# ssh remotehost dd if=/dev/sdb1 > /home/hoge.img

ネットワークの遅延を発生させる@CentOS 5

検証などでネットワーク遅延を発生させたい場合、qdisc を使って簡単に実現できます。遅延を発生させることで、帯域を絞ることも可能です。

1秒遅延
# tc qdisc add dev eth0 root handle 1:0 netem delay 1s
確認
# tc -s qdisc show dev eth0
解除
# tc qdisc del dev eth0 root handle 1:0 netem delay 1s

遅いネットワークでsshの応答が遅い

遅いネットワーク、特にモバイル端末経由でsshを使ったりする場合、一文字打つのにも応答が遅く、いらいらしてしてしまいます。こういう環境の場合はSSHの圧縮機能が有効です。maznの環境ではそれなりにレスポンスがよくなりました。

 

OpenSSH の sshコマンドでは -C オプションをつけます。圧縮レベルは -o Compressionlevel= で1~9 (最も圧縮率が高い) が選択できます。デフォルトは6です。なお、Compressionlevelはsshプロトコルバージョン1でしか意味がないので、2を使う人は必要ありません。

# ssh -C --o CompressionLevel=9

 

Tera Termの場合は、設定→SSHから圧縮レベルやアルゴリズムを選択することができます。

 

puttyの場合もsshの項目から選択できます。

LVM覚え書き@Fedora14

LVMの使い方をすぐ忘れてしまうので、覚え書き。 LVM用のパーティションを用意しておいてください。ここでは/dev/sda7とします。

基本編

物理ボリューム作成する

# pvcreate /dev/sda7

確認する

# pvdisplay
 --- Physical volume ---
 PV Name               /dev/sda7
 VG Name               vol1
 PV Size               672.28 GiB / not usable 3.13 MiB
 Allocatable           yes
 PE Size               4.00 MiB
 Total PE              172102
 Free PE               171846
 Allocated PE          256
 PV UUID               xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxxxx

 

ボリュームグループを、vg1という名前で作成する。

# vgcreate vg1 /dev/sda7
Volume group "vg1" successfully created

確認する

# vgdisplay
 --- Volume group ---
 VG Name               vg1
 System ID
 Format                lvm2
 Metadata Areas        1
 Metadata Sequence No  2
 VG Access             read/write
 VG Status             resizable
 MAX LV                0
 Cur LV                1
 Open LV               0
 Max PV                0
 Cur PV                1
 Act PV                1
 VG Size               672.27 GiB
 PE Size               4.00 MiB
 Total PE              172102
 Alloc PE / Size       256 / 1.00 GiB
 Free  PE / Size       171846 / 671.27 GiB
 VG UUID               xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-zzzzzz

 

1GBのロジカルボリュームを、lvol1という名前で vol1 から切り出す

# lvcreate -L 1G -n lv1 vg1
Logical volume "lv1" created

確認する

# lvdisplay
 --- Logical volume ---
 LV Name                /dev/vg1/lv1
 VG Name                vg1
 LV UUID                xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-wwwwww
 LV Write Access        read/write
 LV Status              available
 # open                 0
 LV Size                1.00 GiB
 Current LE             256
 Segments               1
 Allocation             inherit
 Read ahead sectors     auto
 - currently set to     256
 Block device           253:0

以上で、/dev/vg1/lv1 を普通のパーティションのように使用できます。

ちなみに、削除は、lvremove, vgremove といったコマンドを使いますし、名前を変更したいならば、vgrenameやlvrenameを使いますが、ここでは省略します。

次ページの応用編に備えて、とりあえずファイルシステム作成しておきます。

mke2fs -j /dev/vg1/lv1

 

次は応用編

応用編

ファイルシステムの拡張(ext3の場合)

ロジカルボリュームを1GB増やす

# lvextend -L +1G /dev/vg1/lv1
 Extending logical volume lv1 to 2.00 GiB
 Logical volume lv1 successfully resized

確認

# lvdisplay
 --- Logical volume ---
 LV Name                /dev/vg1/lv1
 VG Name                vg1
 LV UUID                xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-wwwwww
 LV Write Access        read/write
 LV Status              available
 # open                 0
 LV Size                2.00 GiB
 Current LE             512
 Segments               1
 Allocation             inherit
 Read ahead sectors     auto
 - currently set to     256
 Block device           253:0

ファイルシステムチェック

# e2fsck -f /dev/vg1/lv1
e2fsck 1.41.12 (17-May-2010)
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/vg1/lv1: 11/65536 files (0.0% non-contiguous), 12644/262144 blocks

ファイルシステム拡張

# resize2fs /dev/vg1/lv1
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/vg1/lv1 to 524288 (4k) blocks.
The filesystem on /dev/vg1/lv1 is now 524288 blocks long.

スナップショットの作成

lv1のスナップショットをlv1-snapという名前で取得。cow (copy-on-write)領域は100MBとする。つまり、100MB分の書き換えまで大丈夫なスナップショット領域となる。

# lvcreate -L 100M -n lv1-snap --snapshot /dev/vg1/lv1

確認

# lvdisplay
 --- Logical volume ---
 LV Name                /dev/vg1/lv1
 VG Name                vg1
 LV UUID                xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-wwwwww
 LV Write Access        read/write
 LV snapshot status     source of
 /dev/vg1/lv1-snap [active]
 LV Status              available
 # open                 0
 LV Size                2.00 GiB
 Current LE             512
 Segments               1
 Allocation             inherit
 Read ahead sectors     auto
 - currently set to     256
 Block device           253:0

 --- Logical volume ---
 LV Name                /dev/vg1/lv1-snap
 VG Name                vg1
 LV UUID                xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-wwwww1
 LV Write Access        read/write
 LV snapshot status     active destination for /dev/vg1/lv1
 LV Status              available
 # open                 0
 LV Size                2.00 GiB
 Current LE             512
 COW-table size         100.00 MiB
 COW-table LE           25
 Allocated to snapshot  0.01%
 Snapshot chunk size    4.00 KiB
 Segments               1
 Allocation             inherit
 Read ahead sectors     auto
 - currently set to     256
 Block device           253:1

COW領域が少なくなってきた場合、100M増やす。

# lvextend -L +100M -n /dev/vg1/lv1-snap
 Extending logical volume lv1-snap to 200.00 MiB
 Logical volume lv1-snap successfully resized

確認

# lvdisplay
 --- Logical volume ---
 LV Name                /dev/vg1/lv1
 VG Name                vg1
 LV UUID                xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-wwwwww
 LV Write Access        read/write
 LV snapshot status     source of
 /dev/vg1/lv1-snap [active]
 LV Status              available
 # open                 0
 LV Size                2.00 GiB
 Current LE             512
 Segments               1
 Allocation             inherit
 Read ahead sectors     auto
 - currently set to     256
 Block device           253:0

 --- Logical volume ---
 LV Name                /dev/vg1/lv1-snap
 VG Name                vg1
 LV UUID                xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-wwwww1
 LV Write Access        read/write
 LV snapshot status     active destination for /dev/vg1/lv1
 LV Status              available
 # open                 0
 LV Size                2.00 GiB
 Current LE             512
 COW-table size         200.00 MiB
 COW-table LE           50
 Allocated to snapshot  0.00%
 Snapshot chunk size    4.00 KiB
 Segments               1
 Allocation             inherit
 Read ahead sectors     auto
 - currently set to     256
 Block device           253:1

サーバが落ちてsshが応答しない@CentOS 5

ssh でサーバにログインしていて、サーバが落ちた時に反応がなくなってイライラしたことありませんか? manにも載っていますが、実は簡単に接続を切る方法があります。

~. (チルダ ドット )

を入力するだけです!

その他にも ~を入力して動作する特殊なコマンドありますので、興味のある人はmanを見てみてください。

ポート監視やwatchdogで簡易サーバ監視@CentOS 5

アカウント共有型のレンタルサーバならサーバが落ちても、管理者の方が監視してくれていて、再起動なり修理なりしてくれますが、専用サーバやVPSだと、ハード故障以外の管理は基本的に自分でやらなければなりません。

本格的に監視し、ダウンタイムを短くしたいならば、HAクラスタリングや監視ツールなどを入れておく方法が有効ですが、個人でそこまで本格的な物はいらない場合の簡易サーバ監視方法をご紹介します。

今回主に使用する機能は、

  • カーネル異常寺の再起動
  • サーバのポート定期監視
  • watchdog(softdog) によるサーバ高負荷・無応答寺の再起動

の3つです。もちろん全ての故障は救えないので、ご了承ください。

カーネル異常時の再起動

まずは、カーネル異常時にサーバを自動起動させる設定を行います。これは、カーネルパニックや Ooops時に自動再起動する仕組みを設定します。

設定方法はいたって簡単。以下のようにprocのパラメータを変更してあげます。

echo 60 > /proc/sys/kernel/panic
echo 1 > /proc/sys/kernel/panic_on_oops

上記の場合、カーネルパニックやOops時発生60秒後に、再起動がかかります。Ooopsは除外したい場合は2行目の設定を行わないでください。この設定はサーバ再起動後元に戻ってしまいますので、起動時に自動的に有効にしたい場合は /etc/sysctl.conf に設定を書いてあげます。

kernel.panic = 60
kernel.panic_on_oops = 1

サーバのポート定期監視

次はサーバのポート監視です。ポート監視には、"nc" というコマンドを使います。例えば、Apacheを監視したいならば、80番ポートを定期的にスクリプトで監視し、異常はhttpサーバを再起動してあげます。

・スクリプト例 (/root/check_server.sh)

#!/bin/bash
nc -z localhost 80 > /dev/null
   if [ $? != 0 ]; then
   echo "Restarting httpd"
   /etc/init.d/httpd restart
   echo "done $?"
fi

今回はncでのポート監視でしたが、もっと監視制度を上げたいならば、wgetを使うのもありだと思います。 これを、定期的にcrond で動かしてあげます。今回は5分間隔

# crontab -e
*/5      *       *       *       *       /root/check_server.sh

これでポート監視設置完了です。異常時は、デフォルトだとスクリプト内のechoの文字列などは、rootにメールで送られるはずです。よって、これを外部にメールで知らせたい場合は、メールのエイリアスを送信先のメールに書き換えてあげます。

# vi /etc/aliases
~ 省略 ~
root:           abcd@・・・・     ← root宛をabcd@・・・宛に送る
# newaliases     ← 設定反映

メールサーバも落ちていると、メール送信できないので、ついでに、メールサーバのポートも監視してあげます。

・スクリプト例  : 25番ポート監視追加

#!/bin/bash
nc -z localhost 80 > /dev/null
   if [ $? != 0 ]; then
   echo "Restarting httpd"
   /etc/init.d/httpd restart
   echo "done $?"
fi

nc -z localhost 25 > /dev/null
   if [ $? != 0 ]; then
   echo "Restarting Postfix"
   /etc/init.d/postfix restart
   echo "done $?"
fi

以上で、ポート監視関連の作業はおしまい。

次ページは、watchdog(softdog)の設定です。

watchdog(softdog) によるサーバ高負荷・無応答寺の再起動

最後はsoftdogの設定です。

今まで書いたスクリプトはあくまでcronが動いているのが前提です。しかし、実際にはcronがエラーで動かなくなる可能性もありますし、他のプロセスがCPUを食いつぶして、動けない可能性もあります。こういう時に役に立つのがwatchdogと呼ばれる物です。watchdogはwatchdogタイマーというのをセットし、このタイマーを定期的にリセットできないとサーバを再起動させる機能です。

ハードウェアのwatchdogを使う方が、OSが異常になった場合も動くので信頼性が高いのですが、今回はソフトウェアベースのsoftdogを使います。

まずはwatchdogのモジュールを起動時に自動ロードする設定を書きます。

# vi /etc/modprobe.conf
~ 以下を追記 ~
alias char-major-10-130 softdog
options softdog soft_margin=1800

上記設定では、1800秒、つまり30分間タイマーをリセットできないと再起動されます。 ※この設定を書いただけでは、まだタイマーはセットされていません。

次に定期的にタイマーをリセットする処理を、スクリプトに埋め込みます。

・スクリプト例  : watchdogリセットを追加

#!/bin/bash
nc -z localhost 80 > /dev/null
   if [ $? != 0 ]; then
   echo "Restarting httpd"
   /etc/init.d/httpd restart
   echo "done $?"
fi

nc -z localhost 25 > /dev/null
   if [ $? != 0 ]; then
   echo "Restarting Postfix"
   /etc/init.d/postfix restart
   echo "done $?"
fi
echo "a" > /dev/watchdog

上記のように、/dev/watchdog に "V" 以外の文字列を定期的に書き込むだけです。

最後にwatchtogモジュールをロードします。

# modprobe softdog

これにより、タイマーが起動します。以下のようなログが出力されます。1800秒でセットされているのもわかります。

# cat /var/log/messages
May 10 11:00:02 server1 kernel: Software Watchdog Timer: 0.07 initialized. soft_noboot=0 soft_margin=1800 sec (nowayout= 0)

スクリプトが定期的にcronで実行されていない場合は、30分後に再起動するのでご注意ください。スクリプトが正常に動いている時は、

kernel: SoftDog: Unexpected close, not stopping watchdog!

というログがリセットする度に出力されるようです。(ちょっとうざいな) なお、ソース見たところ、/dev/watchdog に書き込むのではなく、定期的にioctlでWDIOC_KEEPALIVEを使ってリセットしてあげれば、このログは出力されないようです。(未確認) また、設定タイムアウト値はioctlで取得できますが、後何秒で再起動されるかを確認するインタフェースはないようです。

softdo.c 抜粋
switch (cmd) {
        default:
                return -ENOTTY;
        case WDIOC_GETSUPPORT:
                return copy_to_user(argp, &ident,
                        sizeof(ident)) ? -EFAULT : 0;
        case WDIOC_GETSTATUS:
        case WDIOC_GETBOOTSTATUS:
                return put_user(0, p);
        case WDIOC_KEEPALIVE:
                softdog_keepalive();
                return 0;
        case WDIOC_SETTIMEOUT:
                if (get_user(new_margin, p))
                        return -EFAULT;
                if (softdog_set_heartbeat(new_margin))
                        return -EINVAL;
                softdog_keepalive();
                /* Fall */
        case WDIOC_GETTIMEOUT:
                return put_user(soft_margin, p);
}

softdogの手動停止は、"V" を /dev/watchdog に書き込んであげて、rmmod でモジュールをアンロードします。

# echo "V" > /dev/watchdog
# rmmod softdog

アンロード成功すると、watchdogデバイスが消えます。

# ls /dev/watchdog
ls: /dev/watchdog: そのようなファイルやディレクトリはありません

 

以上簡易的なサーバ監視でした。これで少しは楽ができるのではないでしょうか!?

 

echo "a" > /dev/watchdog 2> /dev/null

mysqldump でのバックアップで文字化けする

MySQLのバックアップのため、定期的にmysqldumpでバックアップしているのですが、先日MySQLバージョンアップのため、バックアップ・リストアしたところ、チルダ(~)が文字化けして、"?"になっていることに気づきました。

こういう時は、テキスト形式ではなく、--default-character-set=binaryオプションをつけて、バイナリ形式でバックアップすれば回避可能です。

ダンプ

# mysqldump -u username -p --default-character-set=binary mydatabase > mydatabase_dump.sql

リストアは今までと変わりません

# mysql -u username -p mydatabase < mydatabase_dump.sql

6to4でIPv6を使ってみる+ip6tables設定@Sakura VPS with CentOS 5

Sakura VPS でIPv6を使ってみた。

方法としては 6to4 と 6rd という方法がとれるらしいが、6rdはCentOSだとカーネル入れ替えが必要になるので、今回は6to4というトンネルを選択。接続先はTokyo6to4です。

方法はいたって簡単。

# vi /etc/sysconfig/network
~ 以下を追加 ~
NETWORKING_IPV6=yes
IPV6_DEFAULTDEV=tun6to4
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
~ 以下を追加 ~
IPV6INIT=yes
IPV6TO4INIT=yes
IPV6TO4_RELAY=192.88.99.1

後は一端ネットワークを再起動。

# /etc/init.d/network restart

再起動すると、以下のようなインタフェースが表示されます。

# ifconfig tun6to4
tun6to4   Link encap:IPv6-in-IPv4
          inet6 addr: 2002:xxxx:xxxx::1/16 Scope:Global
          UP RUNNING NOARP  MTU:1480  Metric:1
          RX packets:89 errors:0 dropped:0 overruns:0 frame:0
          TX packets:86 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:13543 (13.2 KiB)  TX bytes:14628 (14.2 KiB)

ちなみにLinuxでは、ipv6でpingを打つには、ping6を使います。

# ping6 www.iij.ad.jp
PING www.iij.ad.jp(2001:240:bb42:b000::1:80) 56 data bytes
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=0 ttl=58 time=10.2 ms

さらに、 手元のPCからこのサーバに対して、IPv6通信してみたかったので、Softether社提供の実験を使わせてもらい、手元からも無事接続できました。 Windowsの場合、pingコマンドは、IPv4もIPv6も同じpingコマンドを使います。IPv6で強制的にpingを使いたい場合は、-6オプションを使いましょう。

C:\>ping -6 www.iij.ad.jp
www.iij.ad.jp [2001:240:bb42:b000::1:80]に ping を送信しています 32 バイトのデータ:
2001:240:bb42:b000::1:80 からの応答: 時間 =60ms

ちなみに、IPv6の場合、IPv4のようにarpがありません。iptablesでファイアウォールを設定している場合、最低限pingなどに応答するには以下のように設定するとよいと思います。マルチキャストなども通したい場合は、適宜 --icmpv6-type の定義を増やしてあげてください。全タイプのicmpを通したいならば、--icmpv6-type ○○○ は必要ありません。

# ip6tables -A INPUT -s ::/0 -d ::/0 -i lo -j ACCEPT
# ip6tables -A INPUT -s ::/0 -d ::/0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# ip6tables -A INPUT -s ::/0 -d ::/0 -p ipv6-icmp -m icmp6 --icmpv6-type 128 -j ACCEPT
# ip6tables -A INPUT -s ::/0 -d ::/0 -p ipv6-icmp -m icmp6 --icmpv6-type 129 -j ACCEPT
# ip6tables -A INPUT -s ::/0 -d ::/0 -p ipv6-icmp -m icmp6 --icmpv6-type 133 -j ACCEPT
# ip6tables -A INPUT -s ::/0 -d ::/0 -p ipv6-icmp -m icmp6 --icmpv6-type 134 -j ACCEPT
# ip6tables -A INPUT -s ::/0 -d ::/0 -p ipv6-icmp -m icmp6 --icmpv6-type 135 -j ACCEPT
# ip6tables -A INPUT -s ::/0 -d ::/0 -p ipv6-icmp -m icmp6 --icmpv6-type 136 -j ACCEPT

これで終了と思いきや、これだけではパケットは通らないかもしれません。実は、今回は6to4トンネルを使っているので、IPv4側でファイアウォールが動いている場合は、IPv6がカプセル化されたパケットを許可する必要があります。よって以下のようにipv6パケットは、IPv4側では通過させてあげます。

# iptables -A INPUT -p 41 -j ACCEPT

41というのは、IPv6のプロトコル番号です。これは、/etc/protocols ファイルに記述されていますので、気になる人は覗いてみてください。

Sakura VPS使ってみた&真っ先にやったこと@CentOS 5

Sakura VPS を使ってみました。契約完了後、30分程度で設定完了のメールが来ました。

まず真っ先にやったことをメモとして残しておきます。 ※サービス提供する前にいろいろいじってみたいので、本格的なセキュリティ設定はここではまだ行っていません。

  1. 最低限のセキュリティ確保
    1. rootのパスワード変更 # passwd
    2. sshログインを許可するIPやドメインを制限 ※書き方間違えるとsshログインできなくなるので、ログアウトする前にほかのターミナルでログインできるか試しておきましょう
      # vi /etc/hosts.allow
      ------------  こうに書く ------------
      sshd: localhost .aaaa.net 192.168.
      -------------------------------------
      
      # vi /etc/hosts.deny
      ------------  こう書く --------------
      sshd: ALL
      -------------------------------------
      
  2. 環境調査
    1. ハード情報調査
      # df -h
      # fdisk -l
      # cat /proc/cpuinfo
      # cat /proc/meminfo
      # lsmod
      # ethtool eth0
      
    2. ネット関連情報を調査
      # ifconfig
      # route
      # iptables -L
      # netstat --tcp -lpn
      # netstat --udp -lpn
      # cat /etc/resolve.conf
      
    3. サービスやプロセス情報調査
      # ps -ef
      # chkconfig --list
      # ntpq -p
      
  3. アップデート & ディスクが少ないのでキャッシュ情報は削除
    1. # yum update
      # yum clean all
      
  4. 最低限よく使うソフトウェアのインストール ※screenがないと生きていけません(笑)
    1. # yum install vim-enhanced screen
  5. 設定ファイル編集 # vi  .bashrc ※ いつも使っているalias等を記述
    # source .bashrc
    # vi .vimrc
    # vi .screenrc
    
  6. メールは今の所使わないし、使うとしてもpostfix使いたいので、sendmailを停止
    # /etc/init.d/sendmail stop
    # chkconfig sendmail off
    
  7. 日本語化
    # vi  /etc/sysconfig/i18n
    --------------------------------------
    LANG="ja_JP.UTF-8"
    SYSFONT="latarcyrheb-sun16"
    --------------------------------------
    
    一度ログオフする

screenを起動するとウィンドウの幅が変わる@RHEL6

Windows上からsshログインしたRHEL6でscreenを使うと、ウィンドウの幅が強制的に80文字ぐらいになってしまいます。これは/etc/screenrcの設定を以下のように朱書きの部分のコメントアウトをはずせば、幅が変わることを防ぐことができます。

# Long time I had this in my private screenrc file. But many people
# seem to want it (jw):
# we do not want the width to change to 80 characters on startup:
# on suns, /etc/termcap has :is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l:
termcap xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
terminfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'

NICのデバイス名が変わった時の対処 @ RHEL6

RHEL6のKVMイメージをコピーして、同じ環境を作ろうとしたところ、eth? の番号が変わってしまいました。詳しくは、eth0 ~  eth3 が eth4 ~ eth7 に変わりました。

RHEL5までは、/etc/init.d/sysconfig/network-script/ifcfg-eth0.bak といったように、設定ファイルがバックアップされるので、これを元のファイル名 ifcfg-eth0 などに戻し、新しい環境のMACアドレスに書き換えてあげれば大丈夫だったのですが、RHEL6では上記のようにデバイス名が変わってしまうため動きません。

これを解決するには、/etc/udev/rules.d/70-persistent-net.rules を書き換えてあげる必要があります。 ファイルの中身は以下のようになっていて、ATTR(address) にMACの値と、NAMEの値にデバイス名がありますので、ここを新しい環境のものに書き換えて、再起動するだけです。

# net device () (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:aa:00:12",
ATTR{type}=="1", KERNEL=="eth*", NAME="eth4"

Systemtapを使ってみる@RHEL 5.5 x86_64

Systemtap を使用してみたので覚え書き。

Systemtapでは、動的にカーネルモジュールをカーネルに入れ込んで、OSの様々な状態を監視したり、変更したりすることができる仕組みを提供しています。よって、本当に使いこなすにはカーネルの仕組みを知っている必要がありますが、Systemtapをインストールするとサンプルコードが一緒にインストールされるので、まずはこれを使用してみます。

Systemtapを使用するには、systemtap や systemtap-runtime というパッケージ以外に、kernel-debuginfo や kernel-debuginfo-common といったパッケージが必要になります。前者二つはインストールメディアにありますが、後者二つのdebuginfo関連のパッケージはインストールメディアには含まれていないので、別途RedHat社のWebページからダウンロードしてくる必要があります。

RHEL5.5 (x86_64) の場合、debuginfo ダウンロード先は ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/x86_64/Debuginfo/ となり、現在使用しているカーネルと同じバージョン(RHEL 5.5 のデフォルトは2.6.18-194.el5) のkernel-debuginfoとkernel-debuginfo-commonをダウンロードし、インストールします。 ※kernel-debug-debuginfo パッケージはkernel-debug の debuginfo で違うので注意

# rpm -ivh  kernel-debuginfo-2.6.18-194.el5.x86_64.rpm kernel-debuginfo-common-2.6.18-194.el5.x86_64.rpm

これで準備完了です。あとは、サンプルを動かしてみます。サンプルは、/usr/share/doc/systemtap-1.1/examples/ ディレクトリにありますが、全部がそのまま動くわけではないようで、今回は動きそうなサンプルの profiling/sched_switch.stp を使用してみます。ファイル名より、プロセスのスケジューリングのスイッチを監視することができそうです。

実行は以下のように行います。

# stap  sched_switch.stp

実行すると、以下のように(おそらく)プロセスのスケジューリングが実行される度にログが出力されました。(ssh経由で実行しているので、sshd プロセスがよく働いているようです。

stapio              012851431516428483873650:115:S ==> 2578:116:R             sshd
sshd                012851431516429846632578:16:R + 3650:15:S           stapio
sshd                012851431516429908652578:116:R ==> 3650:115:R           stapio
stapio              012851431516430375163650:115:S ==> 2578:116:R             sshd
…

ネットワーク遅延のシミュレーション@CentOS 5

最近のLinux では、簡単にネットワーク遅延をシミュレーションできるようです。

eth0 のネットワーク遅延を設定したい場合以下のようにするだけです。

# tc qdisc add dev eth0 root handle 1:0 netem delay 1s

設定の確認は

# tc qdisc ls

設定解除は

# tc qdisc del dev eth0 root handle 1:0 netem delay 1s

パケットのドロップやduplicate 等もシミュレーションできるようです。

ディスクイメージをデバイスファイルとして扱う@CentOS5.4 + Xen

※ 2015/4/30追記 : mountオプションで直接マウントする方法を書きました

Xenの仮想マシンのディスクは、パーティションやファイルを使用できますが、これらのパーティションやファイルを、仮想マシンを起動せずに中身を覗きたい場合があります。こういうときは、パーティションやファイルをLinuxのデバイスファイルとして扱ってあげることで、ディスクイメージをマウントすることができます。

デバイスファイルにするには、losetupコマンド、さらに作ったデバイスファイルをディスクと見立ててパーティションを読み取るのがkpartxコマンドです。

まずはlosetupコマンドで、パーティションやファイルをループバックデバイスとして設定していきます。ループバックデバイスは/dev/loop0や/dev/loop1などですが、使われていないループバックデバイスを探します。

# losetup -f
/dev/loop1

ディスクイメージを/dev/loop1にマッピングします。ここではファイルを指定していますが、パーティションでもOKです。

# losetup /dev/loop1 /root/xen.img

設定できたかを確認します。下の例ではloop1にxen.imgが設定されています。

# losetup -a
/dev/loop0: [0803]:41058319 (/root/cent5.4.iso)
/dev/loop1: [0803]:42238103 (/root/xen.img)

これで/dev/loop1は、通常のディスクでいう/dev/hdaなどに相当します。しかし実際のディスクの場合、パーティションをつくると、/dev/hda1とか/dev/hda2とかいった風に番号がついていきますが、losetupだけではこれらのパーティション毎のデバイスファイルが作られません。そこで使用するのがkpartxコマンドです。

kpartxでloop1上のパーティションを見てみます。ここでは3っつのパーティションを確認できます。

# kpartx -l /dev/loop1 
loop1p1 : 0 208782 /dev/loop1 63
loop1p2 : 0 4192965 /dev/loop1 208845
loop1p3 : 0 20980890 /dev/loop1 4401810

パーティションテーブルから、パーティションのデバイスファイルを作成します。

# kpartx -a /dev/loop1

確認します。/dev/mapperやfdiskコマンドで確認します。

# ls /dev/mapper/
# fdisk -lu /dev/loop1 
~省略~
/dev/loop1p1   *          63      208844      104391   83  Linux
/dev/loop1p2          208845     4401809     2096482+  82  Linux swap / Solaris
/dev/loop1p3         4401810    25382699    10490445   83  Linux

ext3フォーマットのパーティションなどはそのままマウント可能です。

# mount /dev/mapper/loop1p3 /mnt/tmp

元に戻すには、アンマウント後、以下のようにコマンドを実行するだけです。

# umount /mnt/tmp
# kpartx -d /dev/loop1
# losetup -d /dev/loop1

コマンドラインのロック@CentOS 5

コンソールログインやssh接続などでコマンドラインを使用しているとき、少し席を外す際にセキュリティの為に画面をロックしたくなる時があります。

X Windowを使っているなら、スクリーンロック機能がついていますが、似たような機能でvlockというコマンドがあります。これを使用すると、ログイン画面のようにパスワードを入力しないと戻ることができません。

CentOS 5の場合デフォルトではインストールされませんが、yum install vlockでインストールすればすぐに使えます。

screenコマンド覚え書き@Linux

ssh接続が切れても作業環境を保てたり、複数画面を切り替えられたり、画面上の文字列をコピペできたりと、かなり便利なscreenコマンドですが、少し使わないでいると使い方をすぐに忘れてしまうので、覚え書き。

まずは最低限の設定

screenへ何かコマンドを送りたいとき Ctrl+aを使うのがデフォルトなのですが、Ctrl+aはコマンドラインでは行の先頭にカーソルを移動させる命令でよく使うので、Ctrl+oに変更してみます。

~/.screenrc以下を記述するだけです。

escape "^Oo"

さらに、screenで複数の画面を使っていると、今使っている画面が何番かわからなくなるので、コマンドのプロンプトに画面の番号を表示するように変更。~/.bashrcに以下を追記。screenコマンドを立ち上げると、$TERMにscreenがセットされるようです。

if [ "$TERM" == "screen" ]; then
    export PS1='\h:$WINDOW:\w\$ '
fi

さらに、Puttyのようなターミナルのタイトルバーに出てくる文字列も変えたい場合は~/.screenrcにこう書く。

defhstatus "$USER@^EH_^En ^Et -- ^EW"

”user名@host名_スクリーン番号 スクリーン名 -- 非アクティブなスクリーン名一覧”が表示されます。

以下のように設定を入れると、画面最終行にスクリーンのステータスが表示されます。

hardstatus string '%{gk}[%{G}%H%{g}][%= %{wk}%?%-Lw%?%{=b kR}(%{W}%n*%f %t%?(%u)%?%{=b kR})%{= kw}%?%+Lw%?%?%= %{g}]%{=b C}[%m/%d/%y %C %A]%{W}'
hardstatus alwayslastline

screen操作基本

※以下からは、上記のCtrl+oへの変更はしておらず、screenへの命令はデフォルトのCtrl+aを使っていると仮定しています。

screenを立ち上げて、hogeと表示してみる。

$ screen
$ echo hoge
hoge

screenから一時的に抜ける (デタッチという)

Ctrl+a d を入力

現在のスクリーン一覧表示。上で一時的に抜けたscreenが表示されます。

$ screen -list
There is a screen on:
        10230.pts-0.pc01 (Detached)
1 Socket in /var/run/screen/S-mazn.

デタッチしているスクリーンに再度繋ぐ(アタッチという)。上で打ったecho hogeが残っているのが確認できます。

$ screen -r 10230
$ echo hoge
hoge
$

画面上の文字列をコピー

Ctrl+a ESC を入力してコピーモードにする

矢印キーでカーソルを自由に動かせるので、コピーしたい文字の先頭に移動しスペースを入力。ここでは echo hogeをコピーします。

$ echo hoge
hoge
$

さらに矢印キー(viのようにhjklキーでもOK)でコピーしたい文字列の最後に移動。(環境によってはこのように色が変わらないかもしれません

$ echo hoge
hoge
$

スペース入力でコピー完了。 その後、Ctrl+a ] で貼り付け。

$ echo hoge
hoge
$ echo hoge      ← echo hogeがコマンドラインに貼り付けられる

リターンを押せばもちろんecho hogeが実行されます。

仮想の新しい画面を作る。

Ctrl+a c を入力
$               ← 新しいシェルが立ち上がります

この時、最初に書いたようなコマンドプロンプトの設定をしていると、以下のように新しいウィンドウ番号になります。

mazn@localhost:1:~/ $

今立ち上がっている画面一覧を表示。

Ctrl+a w  を入力

ターミナルの一番下に以下のように立ち上げている画面一覧が表示されます。

0-$ notitle  1*$ notitle

screen立ち上げた直後の画面番号が0、Ctrl+a cで作った画面番号が1で、"*"がついているのが今見ている画面です。

試しにgehoと表示

$ echo geho
geho
$

画面0に戻る

Ctrl+a 0 を入力
$ echo hoge
hoge
$

画面1に戻る

Ctrl+a 1  と入力
$ echo geho
geho
$

直前の画面(ここでは画面0)に戻る

Ctrl+a Ctrl+a と入力
$ echo hoge
hoge
$

まだ、いろいろできますが、書くのが大変なので、後はコマンドと意味だけ紹介します。

次の番号の画面へ   Ctrl+a n または Ctrl+a Ctrl+n
前の番号の画面へ   Ctrl+a p または Ctrl+a Ctrl+p
現在の画面破棄      Ctrl+a Ctrl+k
bashにCtrl+a(カーソルを先頭に)を送る  Ctrl+a a
ウィンドウを分割する                   Ctrl+a S
分割したウィンドウを閉じる              Ctrl+a Q
分割したウィンドウで他のウィンドウへ移る Ctrl+a TAB

できることはこんなもんじゃないです。詳細はmanでもみてください。

このブログについて
プライバシーポリシー・お問い合わせ等
購読する(RSS)
記事検索
アーカイブ
カテゴリー
  • ライブドアブログ