2013-05-13
2013-05-11
■[linux][Ubuntu][VM]NetBSD]Ubuntu 13.04上のvirt-installでNetBSD-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」の選択画面で必ずFTPかHTTPを選んでネットワークインストールを行う必要がある。
理由はよく分からないが、NICのモデルがvirtioだとdhcp時にVMが突然死する現象が起きるため(再現性あり)、e1000などを指定して回避する必要がある。
■[linux][Ubuntu][VM][FreeBSD]Ubuntu 13.04上のvirt-installでFreeBSD-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
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'に変更する。
2013-05-08
■[linux][Ubuntu][VM]Ubuntu 13.04上のvirt-installでUbuntu 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
$ 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、パラメータは適時調整)。
■[linux][Ubuntu][VM]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]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]「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は発生しないものらしいので、そういう致命的ではないイベントが発生していたのではないかという気がしている。
- Twitter / @bfield_ex
- Twitter / @iorivur
- Twitter / @syuu1228
- Twitter / @Yuichiro_S
- Twitter / @func_hs
- Twitter / @kotatsu_mi
- Twitter / @spark6251
- Twitter / @koizuka
- Twitter / @Tailchaser
- Twitter / @osapon
- Twitter / @y_shiki
- Twitter / @kazu1049jp
- Twitter / @d6rkaiz
- Twitter / @meijik
- Twitter / @hogew
- Twitter / @UTiCd
- Twitter / @nakajmg
