Hatena::ブログ(Diary)

驟雨のカーネル探検隊(只今遭難中w このページをアンテナに追加 RSSフィード Twitter

2013-05-13

[] bashでソケットプログラミング

exec 5<>/dev/tcp/news.google.co.jp/80
echo -e "GET / HTTP/1.1\nHost: news.google.co.jp\n">&5
cat <&5

よくよく考えたらman bashで以前に見かけていたような気もしないでもないが、きちんと把握してなかった。

OSレベルの機能ではないが、シェルレベルの実装でPlan9風にシェルからソケットが開けるのであった。

(この記事はこちらを参考にしました)

2013-05-11

[][][]NetBSD]Ubuntu 13.04上のvirt-installNetBSD-6.0.1なVMを作る

wget http://ftp.netbsd.org/pub/NetBSD/NetBSD-6.0.1/amd64/installation/cdrom/boot-com.iso
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/netbsd.img 15G
sudo virt-install --connect=qemu:///system -n netbsd --vcpus=4 -r 8192 --serial pty -v \
--disk=/var/lib/libvirt/images/netbsd.img,format=qcow2,bus=virtio --nographics \
-c boot-com.iso --network network=default,model=e1000

FreeBSD場合と異なりCOM対応ISOがあるので、ISOファイルを新たに作る必要はない。

このISOインストールイメージを含まない為、「Install from」の選択画面で必ずFTPHTTPを選んでネットワークインストールを行う必要がある。

理由はよく分からないが、NICモデルがvirtioだとdhcp時にVMが突然死する現象が起きるため(再現性あり)、e1000などを指定して回避する必要がある。

[][][][]Ubuntu 13.04上のvirt-installFreeBSD-CURRENTなVMを作る

前回の記事の続き。

FreeBSD-CURRENTのISOシリアルコンソール用になっていないため、余計な作業が増えて面倒くさい。

よく読まずに作業を飛ばすとログイン手段をすべて失う事になるので注意されたい。

また、このOSは--location引数でのセットアップには対応していないので、ISOによるセットアップになる。

wget http://ftp.jaist.ac.jp/pub/FreeBSD/snapshots/amd64/amd64/ISO-IMAGES/10.0/FreeBSD-10.0-CURRENT-amd64-20130505-r250260-release.iso
mkdir fbsd10-iso
sudo mount -o loop,ro ./FreeBSD-10.0-CURRENT-amd64-20130505-r250260-release.iso /mnt/
cp -av /mnt/* fbsd10-iso/
sudo umount /mnt

まずはISOダウンロードし、中身を作業用ディレクトリへ展開する必要がある。

cd fbsd10-iso/
echo 'console="comconsole"' > boot/loader.conf

ブートローダコンソールモードをCOMへ設定する。

sudo apt-get install genisoimage
mkisofs -v -b boot/cdboot -no-emul-boot -r -J -V "FREEBSD_INSTALL" -o ~/Headless-FreeBSD.iso ./
cd ~
rm -rf fbsd10-iso
rm FreeBSD-10.0-CURRENT-amd64-20130505-r250260-release.iso

設定変更を反映した新しいISO作成する。古いISOや作業用ディレクトリISO作成後に捨ててしまって構わない。

sudo qemu-img create -f qcow2 /var/lib/libvirt/images/freebsd.img 15G
sudo virt-install --connect=qemu:///system -n freebsd --vcpus=4 -r 8192 --serial pty -v \
--disk=/var/lib/libvirt/images/freebsd.img,format=qcow2,bus=virtio --nographics \
-c Headless-FreeBSD.iso  --network network=default,model=virtio

ディスクイメージ作成し、virt-installを実行する。

最近FreeBSDはvirtio-blk,virtio-net対応しているので、ここではLinuxゲストの時と同じくvirtioで設定を行う。

インストーラが起動するので通常どおりインストールを実行する。

ifconfig
exit

但し、最後シェルを起動するか聞かれるので「Yes」とし、exitで終了する前に必ずifconfigを実行、DHCPから取得されたIPアドレスメモしておくこと。

或いは、固定IPでセットアップを行うこと。

初回起動時にこのVMコンソールログインする方法が、SSH以外無いため、IPアドレスが分からないとログイン手段がなくなってしまう。

IPメモしたらexitシェルを終了し、VM再起動を行う。

この時、virshのコンソールシリアル)には何も表示されないので、1分程度起動を待ってから別のシェルからsshコマンドVMログインする必要がある。

echo 'console="comconsole"' > /boot/loader.conf
vi /etc/ttys
reboot

ログインできたら、/boot/loader.confへconsole=comconsoleを書き込み、/ety/ttysのttyu0の行を'ttyu0 "/usr/libexec/getty std.9600" vt100 on secure'に変更する。

できたら再起動すれば今度はvirshのコンソールに表示が行われるようになる。

インストーラデフォルト対応してくれないのかなぁ、シリアルコンソール

2013-05-08

[][][]Ubuntu 13.04上のvirt-installUbuntu 13.04なVMを作る

$ sudo apt-get install libvirt-bin virtinst qemu-kvm
$ sudo invoke-rc.d libvirt-bin start

とりあえず必要なモノを入れてlibvirtdを立ち上げる。

$ sudo qemu-img create -f qcow2 /var/lib/libvirt/images/vm0.img 16G

16GBなVMイメージファイル作成(容量は適時調整)。

$ sudo virt-install --connect=qemu:///system -n vm0 --vcpus=4 -r 8192 --serial pty -v \
--disk=/var/lib/libvirt/images/vm0.img,format=qcow2,bus=virtio --nographics \
-l http://ftp.jaist.ac.jp/pub/Linux/ubuntu/dists/raring/main/installer-amd64/ \
--extra-args "console=ttyS0,9600" --network network=default,model=virtio

virt-installを実行し、VM作成インストールを開始(vCPU数は4/RAMは8192MB、パラメータは適時調整)。

[][][]Ubuntu 13.04上のvirt-installでCentOS6.4なVMを作る

おもしろいことに、Ubuntuゲストインストール時virt-install引数のうち、locationのみCentOSのものに変更するとCentOSインストーラがきちんと起動した(os-variantすら指定していない。URLからディストリを検出している?)。

Ubuntuは仮想シリアルコンソールでいけたが、CentOSも行けそうにみえる。

sudo virt-install --connect=qemu:///system -n centos --vcpus=4 -r 8192 --serial pty -v \
--disk=/var/lib/libvirt/images/centos.img,format=qcow2,bus=virtio --nographics \
-l http://ftp.riken.jp/Linux/centos/6.4/os/x86_64/ \
--extra-args "console=ttyS0,9600" --network network=default,model=virtio

2013-05-01

[]Linux kernel名物よくわからないけど便利なforeachマクロCPU番号編)

Linux kernelと言えばlist_for_eachみたいな謎のマクロでよくわからないがforeachできる事はよく知られているが、他にも色々あるのだなぁと知ったのでメモ

#define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask)
#define for_each_online_cpu(cpu)   for_each_cpu((cpu), cpu_online_mask)
#define for_each_present_cpu(cpu)  for_each_cpu((cpu), cpu_present_mask)

for_each_possible_cpuはシステム存在可能なCPU番号をイテレート、for_each_online_cpuはシステムで今オンラインCPU番号をイテレート、for_each_present_cpuはオフラインも含めて今存在しているCPU番号をイテレート、だと思われる。

実装としてはそれぞれグローバル定義されたstruct cpumaskをfor_each_cpuへ与えている。

#define for_each_cpu(cpu, mask)                         \
        for ((cpu) = -1;                                \
                (cpu) = cpumask_next((cpu), (mask)),    \
                (cpu) < nr_cpu_ids;)
static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
{
        /* -1 is a legal arg here. */
        if (n != -1)
                cpumask_check(n);
        return find_next_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1);
}

for_each_cpuはcpumask_nextで実装されており、cpumask_nextはfind_next_bitで実装されている。

CPUごとに構造体をアロケートするpercpuフレームワークと一緒に使われていることが多そう。

ポイントは、定義されたMAXCPUSみたいな変数でfor文を組むとCPU番号が飛び飛びになっているような状態に対応できないが、CPU番号のビットマスクを用意してその辺に対応しているという事だろう。

2013-04-25

[]「Linuxで3万(10万)プロセスを同時に起動させてみた」の再現実験

Linuxで3万プロセス起動するとMCE(Machine Check Excepution)を食らうというよく分からない噂を聞いたので、興味を持ち試してみている。

但し、元実験は恐らくDebian stableでカーネルが2.6.32と古めだが、再現実験環境最近入れたUbuntu Serverなので3.5.0-26-generic

こんなにバージョン違うともう別物だろう。

ハード構成も違うし、同じ状況を再現するのは困難かも…。

取り敢えず、今のところ何も起きていない。しばらく放置してみる。

追記:

何もエラーが出ないので、最終的に7万プロセスを投入して1日間放置したが、dmesgにもmcelogにもエラーは表示されなかったのでこれにて実験終了とする。

@naota344氏によると、「CPU温度の上昇」などのイベントでもMCEは発生していて、その場合ログは行われるがMCEによるpanicは発生しないものらしいので、そういう致命的ではないイベントが発生していたのではないかという気がしている。