最近 GitHub の脆弱性つかれたとかで、ssh の fingerprint 確認しろというメールがきました。ssh-keygenコマンドで確認できるようです。
# ssh-keygen -l -f ~/.ssh/id_dsa.pub
やってみて 調べてみて 苦労しなけりゃ 箱は動かじ
最近 GitHub の脆弱性つかれたとかで、ssh の fingerprint 確認しろというメールがきました。ssh-keygenコマンドで確認できるようです。
# ssh-keygen -l -f ~/.ssh/id_dsa.pub
ファイルを安全にリモートにコピーしたいとき、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
検証などでネットワーク遅延を発生させたい場合、qdisc を使って簡単に実現できます。遅延を発生させることで、帯域を絞ることも可能です。
# 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の圧縮機能が有効です。maznの環境ではそれなりにレスポンスがよくなりました。
OpenSSH の sshコマンドでは -C オプションをつけます。圧縮レベルは -o Compressionlevel= で1~9 (最も圧縮率が高い) が選択できます。デフォルトは6です。なお、Compressionlevelはsshプロトコルバージョン1でしか意味がないので、2を使う人は必要ありません。
# ssh -C --o CompressionLevel=9
Tera Termの場合は、設定→SSHから圧縮レベルやアルゴリズムを選択することができます。
puttyの場合もsshの項目から選択できます。
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を使いますが、ここでは省略します。
次ページの応用編に備えて、とりあえずファイルシステム作成しておきます。
次は応用編
ロジカルボリュームを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 でサーバにログインしていて、サーバが落ちた時に反応がなくなってイライラしたことありませんか? manにも載っていますが、実は簡単に接続を切る方法があります。
~. (チルダ ドット )
を入力するだけです!
その他にも ~を入力して動作する特殊なコマンドありますので、興味のある人はmanを見てみてください。
アカウント共有型のレンタルサーバならサーバが落ちても、管理者の方が監視してくれていて、再起動なり修理なりしてくれますが、専用サーバやVPSだと、ハード故障以外の管理は基本的に自分でやらなければなりません。
本格的に監視し、ダウンタイムを短くしたいならば、HAクラスタリングや監視ツールなどを入れておく方法が有効ですが、個人でそこまで本格的な物はいらない場合の簡易サーバ監視方法をご紹介します。
今回主に使用する機能は、
の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)の設定です。
最後は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: そのようなファイルやディレクトリはありません
以上簡易的なサーバ監視でした。これで少しは楽ができるのではないでしょうか!?
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
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 を使ってみました。契約完了後、30分程度で設定完了のメールが来ました。
まず真っ先にやったことをメモとして残しておきます。 ※サービス提供する前にいろいろいじってみたいので、本格的なセキュリティ設定はここではまだ行っていません。
# vi /etc/hosts.allow ------------ こうに書く ------------ sshd: localhost .aaaa.net 192.168. -------------------------------------
# vi /etc/hosts.deny ------------ こう書く -------------- sshd: ALL -------------------------------------
# df -h # fdisk -l # cat /proc/cpuinfo # cat /proc/meminfo # lsmod # ethtool eth0
# ifconfig # route # iptables -L # netstat --tcp -lpn # netstat --udp -lpn # cat /etc/resolve.conf
# ps -ef # chkconfig --list # ntpq -p
# yum update # yum clean all
# yum install vim-enhanced screen
# source .bashrc # vi .vimrc # vi .screenrc
# /etc/init.d/sendmail stop # chkconfig sendmail off
# vi /etc/sysconfig/i18n -------------------------------------- LANG="ja_JP.UTF-8" SYSFONT="latarcyrheb-sun16" --------------------------------------一度ログオフする
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'
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 を使用してみたので覚え書き。
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 …
最近の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 等もシミュレーションできるようです。
※ 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
コンソールログインやssh接続などでコマンドラインを使用しているとき、少し席を外す際にセキュリティの為に画面をロックしたくなる時があります。
X Windowを使っているなら、スクリーンロック機能がついていますが、似たような機能でvlockというコマンドがあります。これを使用すると、ログイン画面のようにパスワードを入力しないと戻ることができません。
CentOS 5の場合デフォルトではインストールされませんが、yum install vlockでインストールすればすぐに使えます。
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
※以下からは、上記の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でもみてください。