ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2011-07-21

tcpdumpの使い方メモ

すぐ忘れるので自分用メモ

例えばmysqlだと以下でselect文がみれる。
sudo /usr/sbin/tcpdump -l -i eth0 -A -n -s 0 dst port 3306 | grep SELECT

unix ドメインソケットにながしてるデータを見る方法がないかあとで調査

2010-04-18

debianの時計を合わせる

普通はOSをインストールした時にちゃんと設定されはずですが、どういう訳かシステムの時計がずれてきていたので設定方法をメモ。

時計を合わせるにはntpdateというパッケージを使います。
debianではntpdate-debianというコマンドが使えます。

$ sudo apt-get install ntpdate
$ sudo ntpdate-debian

これでNTPサーバに問い合わせて時計を合わせてくれます。
/etc/default/ntpdateファイルを編集すればNTPサーバを変更できます。

ついでにcrontabの設定もしておきます。

$ sudo crontab -e
0 0 1 * * ntpdate-debian

  

2010-02-20

Linux(Debian Lenny) KVMの仮想マシン用ネットワーク設定

前回KVMでOpenSolarisをセットアップしましたが、ネットワーク設定については省略していたので一応メモしておきます。

とは言っても基本的にはここに書いてあるとおりにすればOKです。
http://www.howtoforge.com/virtualization-with-kvm-on-a-debian-lenny-server


ネットワーク設定は、Debianの場合は/etc/network/interfaces ファイルを編集して行います。たぶんUbuntuでも同様です。
参考までに設定内容をさらしておきます。

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
auto eth0
iface eth0 inet manual

auto virbr0
iface virbr0 inet static
   address 192.168.1.50
   network 192.168.1.0
   netmask 255.255.255.0
   broadcast 192.168.1.255
   gateway 192.168.1.1
   bridge_ports eth0
   bridge_fd 9
   bridge_hello 2
   bridge_maxage 12
   bridge_stp offk

 仮想マシンを作成する際に、ネットワーク接続設定で共有物理装置を選択してここの設定で作成したブリッジを使用するようにします。
また、親機はLANで192.168.1.50にIP固定してますが、仮想マシンの方でもIPを固定したい場合は仮想マシン側で設定する必要があります。
最近のほとんどのOSではインストール時にデフォルトでDHCPが使われるので、IP固定する必要が無い場合は仮想マシン側で特に設定する必要はありません。

上記の設定をして、
% sudo /etc/init.d/networking restart

として、ifconfigすればvirbr0が追加されているのが確認できます。
% sudo ifconfig
eth0      Link encap:イーサネット  ハードウェアアドレス 00:1b:fc:b5:d7:16
          inet6アドレス: fe80::21b:fcff:feb5:d716/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:2941586 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:4429749 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:783148810 (746.8 MiB)  TXバイト:5767081060 (5.3 GiB)
          割り込み:254 ベースアドレス:0x4000

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1 マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:97752 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:97752 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:0
          RXバイト:131654783 (125.5 MiB)  TXバイト:131654783 (125.5 MiB)

virbr0    Link encap:イーサネット  ハードウェアアドレス 00:1b:fc:b5:d7:16
          inetアドレス:192.168.1.50 ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          inet6アドレス: 2001:c90:1440:3692:21b:fcff:feb5:d716/64 範囲:グローバル
          inet6アドレス: fe80::21b:fcff:feb5:d716/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:2638912 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:4277438 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:0
          RXバイト:271638921 (259.0 MiB)  TXバイト:5737162576 (5.3 GiB)

ここで仮想マシンを立ち上げると、以下のように vnet が追加されていきます。
vnet0     Link encap:イーサネット  ハードウェアアドレス 00:ff:ea:f3:9d:56
          inet6アドレス: fe80::2ff:eaff:fef3:9d56/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:64 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:306 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:500
          RXバイト:7259 (7.0 KiB)  TXバイト:59290 (57.9 KiB)
以上で設定は終わりです。
一応仮想マシン側の方も確認してみます
$ ifconfig -a
lo0: flags=2001000849 mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
rtls0: flags=1004843 mtu 1500 index 2
        inet 192.168.1.15 netmask ffffff00 broadcast 192.168.1.255
lo0: flags=2002000849 mtu 8252 index 1
        inet6 ::1/128
rtls0: flags=2000841 mtu 1500 index 2
        inet6 fe80::5652:ff:fe34:e14/10
rtls0:1: flags=2080841 mtu 1500 index 2
        inet6 2001:c90:1440:3692:5652:ff:fe34:e14/64

こまかい内容はよく分かりませんが、とりあえずDHCPで192.168.1.15が割り当てられているようです。

2010-02-14

Linux(Debian Lenny)のKVMでOpenSolarisを動かすメモ

前回、仮想環境について調査を行った結果(http://taksatou.blogspot.com/2010/02/virtualbox-vs-vmware-vs-kvm-on-linux.html )KVMが良さそうだったので、実際に導入してみました。

当初はCUIだけで行くつもりでしたが、virt-managerを使えば簡単にできそうだったし、仮想環境をインストールしたときの感動が欲しかったのでGUIでやることにしました。

参考:http://wiki.debian.org/KVM#Lenny
http://www.linux-kvm.org/page/HOWTO1
http://www.howtoforge.com/virtualization-with-kvm-on-a-debian-lenny-server

今回利用した環境は以下です。KVMをフルで利用するにはそれなりに新しいバージョンのカーネルが必要なようです。少なくとも2.6.18以上である方が良いようです。(http://www.linux-kvm.org/page/Choose_the_right_kvm_%26_kernel_version)
% uname -a
Linux chameleon 2.6.26-2-amd64 #1 SMP Wed Aug 19 22:33:18 UTC 2009 x86_64 GNU/Linux

また、CPUのハードウェアの仮想化もサポートしている必要があります
egrep '(vmx|svm)' --color=always /proc/cpuinfo
でvmxかsvmが見つかればOKです。

以上問題なければパッケージをインストールします。
sudo aptitude install kvm virt-manager
今回はGUIのマネージャーを使ってみようと思うので、virt-managerをインストールします。硬派にCUIだけで行きたい人は代わりにlibvirt-binをインストールします。(virt-managerをインストールすればlibvirt-binもインストールされます)


バーチャルマシンを一般ユーザ権限で動かすためにユーザグループに追加します。
sudo adduser `id -un` libvirt
(グループを追加したら一旦ログインし直す必要があります。)

ここで、ちゃんとKVMがインストールできたか確認してみます。
% virsh -c qemu:///system list
virsh Id Name State
----------------------------------

うまくできていればこのように表示されるはずです。
ここまでできればあとはGUIでほぼすべてできます。

まずコンソールからvirt-managerを起動します。
% virt-manager

すると仮想マシンマネージャーというウィンドウが立ち上がります。
日本語化されてるので雰囲気で大体分かると思いますが、以下のような手順で設定します。WindowsのVirtualPCとかとほぼ同様なはずです。



新規をクリックします。


名前をつけます。


細かいことはよく分かりませんが、完全仮想化しか選択できないようになってました。
今回はKVMを使いますが、QEMUをつかえばSPARCとかPPCも使えます。


インストール方法を選択します。今回はディスクイメージから入れます。


ディスクイメージのファイルパスを設定するか、インストールメディアを挿入します


ストレージファイルの割り当てサイズと置く場所を決めます。
とりあえず8Gで、「今、仮想ディスク全体を割り当てますか?」というチェッ クは外しておきました。


ネットワーク設定をします


メモリとCPU割り当てを決めます。後からでも変えられるのでとりあえずデフォルトでいきます。


確認して完了を押します


新しくできた仮想マシンを開きます


LinuxでSolarisが動いています。

簡単ですね。

VirtualBox vs VMware vs KVM on Linux

自宅の開発環境を仮想化したくなってきたので仮想化技術について調査を行いました。

まず仮想化技術一般については下を参照。
http://itpro.nikkeibp.co.jp/article/lecture/20061228/258010/
http://www.atmarkit.co.jp/flinux/rensai/kvm01/kvm01a.html

今回仮想化するにあたっての条件は、
  • Linux(Debian Lenny)上で動く
  • 導入が楽
  • デスクトップ環境は不要
です。というわけで主に以下の3つを調べることにしました。
  • VMware Server
  • VirtualBox
  • KVM

検索してみたらこれらについて実際にベンチマークをとった人がいたようです。
http://forum.virtualbox.org/viewtopic.php?f=1&t=21314&sid=627b4d97f3252a9fe8813305c6f072d3
http://ezjd.blogspot.com/2009/08/virtualbox-vs-vmware-server-vs-kvm-part.html

ここらへんにのってるのは半年ほど前の情報ですが、
ざっとまとめると
  • 速さ:KVM>VMware Server≒VirtualBox
  • 安定性:VMware Server≒VirtualBox>KVM
  • ゲストOS上のクロックは高負荷時にずれることがあるので、測定結果はあまり信用しない方がいい
という感じっぽいです。

また、便利さという観点からみると調べた限りでは以下のような感じでした。
  • VirtualBoxのドキュメントはなかなか良いっぽい
  • VMware ServerのDebianパッケージはないけどVirtualBoxとKVMはある

以上を総合的に考えるとVirtualBoxのポイントが若干高いですが、デスクトップ環境は別にいらないし、速いほうがうれしいのでKVMを導入することに決めました。

2009-12-13

Linuxのメモリ管理について

Linuxのメモリ管理について勉強中なので、簡単なまとめをメモ。


仮想アドレスと実アドレス

多くのマルチタスクOSでは仮想アドレス空間を持っています。仮想アドレス空間の仕組みを利用すれば、物理メモリ上では不連続にマッピングされたページでも、プロセスからは連続した領域として扱うことができます。
ここでいうページとは、メモリを一定の大きさに区切って管理するための単位のことで、4Kバイトのことが多いようです。仮想アドレスと実アドレスへの変換はページ変換テーブルを用いて行われます。


実メモリの管理

実メモリはバディシステムと呼ばれる仕組みで管理されています。
バディシステムは空きページを2の冪剰の単位で分割したページフレームのリストで管理します。たとえば、4ページ分の連続メモリを確保したい場合は、まずオーダー2(2の2剰個の連続ページ)のリストから空きを探し、無かった場合は一つ上のオーダーから探します。そこで空きが見つかった場合は、そこを確保して半分に分割し、残った半分をオーダー2の空きリストに追加します。空きが見つからなかった場合は、さらに上のオーダーを再帰的に探索していきます。割り当てられる領域が見つからなかった場合はoom(out of memory) killerが実行されます。

空きページ状況は/proc/buddyinfoから参照できます
各オーダー毎につながっている空きリストの数が表示されます。
% cat /proc/buddyinfo
Node 0, zone      DMA    127    117     23      6      1      0      0      1      0      0      0
Node 0, zone   Normal    427    365     30      4      2      1      0      0      1      0      0


再起動するとフラグメンテーションが解消されていることが確認できます。
% cat /proc/buddyinfo
Node 0, zone      DMA      3      4      4      3      4      2      2      1      1      1      2
Node 0, zone   Normal      5      0      3      1      1      2      2      8      3      4     12

メモリをページ単位だけで扱うのは不便なので、より柔軟な割り当て方法としてスラブアロケータという仕組みがあります。
スラブアロケータはバディシステムから確保したメモリをキャッシュと呼ばれる同じ種類のオブジェクトの集合に分割します。ここでいうキャッシュとは、バディシステムから確保された連続した物理ページのあつまりで、キャッシュに対して割り当てられたオブジェクトの入れ物をスラブといいます。

スラブアロケータの使用状況は/proc/slabinfoを参照することで確認できます。
tunablesの値は変更することも可能です。詳細は以下の参考文献を参照してください。
limit フィールドは、CPU ごとにキャッシュに入れるオブジェクトの最大数を指定します。batchcount フィールドは、CPU 単位のキャッシュが空になったときにそこへ転送するグローバル・キャッシュ・オブジェクトの最大数です。shared パラメーターは、SMP (Symmetric MultiProcessing) システムに対する共有動作を指定します。
http://www.ibm.com/developerworks/jp/linux/library/l-linux-slab-allocator/


 ここまで調べて疲れてきたので、以下の内容はあとで加筆・修正するかもしれません。

プロセス空間の管理

プロセスに仮想アドレスを割り当てる際には様々なテクニックが用いられています。詳細は省きますが、以下のようなテクニックがあります。

スワップ
デマンドページング
コピーオンライト
ファイルマップ


プロセス空間の割り当ては、以下のようなシステムコールを用いて行うことができます。

fork
exec
mmap
brk

ページの回収

回収の対象はプロセス空間とページキャッシュで使用している実ページのうち、最近もっとも使用されていないページです。カーネルで使用しているページは回収の対象にはなりません。

処理の流れとしては以下のようになります。

* 最近参照されたかどうかチェック。
ページキャッシュの場合は、カーネルはPG_refferencedフラグをみることで知ることができます。プロセス空間にマップされたページは、ページテーブルエントリにハードウェアによってアクセスされたことが記録されるため、そこを参照することで知ることができます。
* inactiveキューに移動
* スワップ領域の割り当て
* アンマップ処理
* ダーティページの書き戻し
* ページの解放


Linuxカーネル2.6解読室   [本]
Linuxカーネル2.6解読室   [本]

ZenBackWidget