source: projects/web/trunk/vlmagazine/20110303.dat @ 2829

Revision 2829, 26.9 KB checked in by kenta, 13 years ago (diff)

initial release for the doll festival

Line 
1<date>
22011,03,03
3
4<author>
5kenta
6
7<title>
8ループバックマウントとchrootで作るなんちゃって仮想マシン
9
10<description>
111台のPCで複数のOSを使い分けるソリューションとして、KVM や VMWare, VirtualBoxのような仮想マシンは今や常識となっています。
12しかし、Linuxの上で別のLinux環境を実現するのであればchrootを使っても簡易仮想マシンの様な環境を作ることができます。
13Vine Linuxでは、vbootstrap (Vine Linux の基本システムを作成するためのスクリプト)や debootstrap (Debian GNU/Linux bootstrapper)、rinse (Fedora や CentOS 等の chroot 環境を構築するツール)などの便利なパッケージが用意されており、容易に他ディストリビューションをVine Linuxの上で飼うことができます。
14ですがここでは、既存のOSがインストール済みのディスクをそのまま活かして、Vine Linux 5.2の上にchrootを使ったなんちゃって仮想マシンのLinux環境を実現する方法を紹介していきます。
15<ul>
16<li>ディスクのイメージをループバックマウントする方法
17   <ul>
18   <li>dd でダンプしたディスクのイメージをマウントする</li>
19   <li>VMWare の VMDK ファイル形式ディスクをマウントする</li>
20   </ul></li>
21<li>chrootを使ったなんちゃって仮想マシン環境を構築する方法</li>
22</ul>
23
24<h2 id="benchmark">chrootとVMWare Playerのベンチマーク比較</h2>
25<p>本題に入る前にまず、chrootを使った場合のパフォーマンス面での利点をみていきます。</p>
26<p>chrootの中のプロセスはホストのkernel上で直接実行されます。そのため、VMWare Playerを初めとする仮想マシン環境と較べると次のようなメリットがあります。</p>
27<ul>
28<li>パフォーマンス・ペナルティがない</li>
29<li>VMWareの上限である8CPU以上のSMP環境が使える</li>
30</ul>
31<p>ここでは、試しにVine Linux 5.2 (x86 32bit) をインストールしたPC上にVMWare Playerをインストールして、VMWare Player上のVine Linux 4.2 (i386) と、chrootの上に構築した Vine Linux 4.2 (i386) の環境での性能を比較してみました。</p>
32
33<h3>VMWare Player と chroot 環境でベンチマーク比較:BeeCrypt Benchmark</h3>
34
35<p>まずベンチマークプログラムにBeeCrypt Benchmarkを使って、次のそれぞれの環境で性能を比較してみました。
36<dl>
37<dt>VMWare
38<dd>Vine Linux 5.2にインストールしたVMWare Player 3.1.3上のVine Linux 4.2環境で実行
39<dt>chroot
40<dd>Vine Linux 5.2の上でchrootを使って構築したVine Linux 4.2環境で実行
41<dt>5.2 native
42<dd>Vine Linux 5.2の上でそのまま実行
43</dl>
44</p>
45<img src="http://chart.apis.google.com/chart?chxl=0:|Blowfish+128+-+ECB+decryption|Blowfish+128+-+ECB+encryption|AES+128+-+ECB+decryption|AES+128+-+ECB+encryption|SHA-256|2:|KB%2Fs+%28Longer+is+Faster%29&chxp=2,50&chxr=1,0,120000&chxs=2,676767,11.5,0,_,676767&chxt=y,x,x&chbh=10,3&chs=600x280&cht=bhg&chco=A2C180,3D7930,FF9900&chds=0,120000,0,120000,0,120000&chd=t:101040,90002,76328,95126,97087|107520,95110,78728,99872,100536|108759,96267,79084,101660,101955&chdl=VMWare|chroot|5.2+native&chtt=BeeCrypt+Benchmark" width="600" height="280" alt="BeeCrypt Benchmark" />
46<p>総じてchroot上でのベンチマーク結果はVMWare Playerよりも高速で、Vine Linux 5.2の上での実行結果と遜色がないパフォーマンスを示しています。BeeCryptのベンチマークは演算が中心となっており、ディスクやメモリアクセスの性能差がでにくい傾向にあるのですが、それでも約 5%程度の差が出ました。</p>
47
48<h3>VMWare Player と chroot 環境でベンチマーク比較:カーネルビルド</h3>
49<p>先ほどと同じくVMWare Player上の Vine Linux 4.2環境と、Vine Linux 5.2のchroot上に構築したVine Linux 4.2環境で、それぞれカーネルビルドに掛かった時間を比較した結果が次のグラフです。
50<!-- rpmbuild --rebuild --target i686 kernel-2.6.16-76.55vl4.src.rpm -->
51</p>
52<p>積み重ねグラフはsysとuser時間を、折れ線グラフはreal時間を表しており、4コアのマシン上でビルドしていたためにsysとuser時間の合計よりもreal時間が大幅に短くなるケースが見られます。なお、それぞれ 6回実行しています。特にreal時間にはばらつきが大きいのでどちらが高速かを一概には言えない面もありますが、全体的にchroot環境の方がsys時間が短く、高速であることが見て取れます。</p>
53<img src="https://chart.googleapis.com/chart?cht=bhs&chm=D,FF3300,2,0,5,1&chbh=15,5&chs=450x320&chd=t2:494,474,461,402,508,548,0,176,173,173,176,185,178|1288,1237,1239,1186,1281,1321,0,1248,1221,1227,1247,1267,1249|1651,950,925,674,1661,1883,_,800,742,745,789,1317,792&chco=4D89F9,C6D9FD,FF3300&chds=0,1920&chxt=y,x,x&chxl=0:|chroot+6|chroot+5|chroot+4|chroot+3|chroot+2|chroot+1||VM+6|VM+5|VM+4|VM+3|VM+2|VM+1|1:|0|8+min|16+min|24+min|32+min.|2:|seconds+%28Shorter+is+Faster%29&chxp=2,50&chdl=sys|usr|real&chtt=Kernel+Build" width="450" height="320" alt="Kernel Build" />
54<p>このように、chroot上で構築したなんちゃって仮想マシンはパフォーマンスの面では一般的な仮想マシンより優位性があるとわかると思います。</p>
55
56<h2 id="V42onV52">事例 1:古い Vine Linux 4.2 の環境を Vine Linux 5.2 にお引っ越し</h2>
57<p>Vine Linux 5.2をお使いの方が多いと思います。
58しかし、どうしても以前使っていたVine Linux 4.2の環境で使っていた特定のアプリケーションがVine Linux 5.2で使えないからなかなか移行できないという方もおられるかと思います。
59また、メインではVine Linux 5.2を使っているけど、一部の商用アプリケーションを使用するために別にRed Had ELやSLESのマシンを用意している方もおられるかもしれません。
60ここでは、仮想マシンを使用することなくVine Linux 5.2の上で既存のVine Linux 4.2の実行環境を構築する方法を紹介します。</p>
61<p>
62次の手順で進めていきます。
63<ol>
64<li>古いマシンのディスクをVine Linux 5.2上にマウントしてアクセスできるようにする</li>
65<li>chrootコマンドを使って、古いマシンのディスクを"/"としてアクセスできるようにする</li>
66<li>一般ユーザーがsshでリモート接続できる設定</li>
67</ol>
68なお、途中で詳細な説明を省いているところがあります。不明な点がありましたらご指摘をいただければ可能な範囲で補足説明します。
69</p>
70
71
72<h3>dd したディスクイメージをループバックマウント</h3>
73
74<p>まず、旧マシンのディスクをVine Linux 5.2の環境からアクセスできるようにしておきます。
75ここでは、古いマシンのディスクが /dev/hdX に繋がっているものと想定しています。</p>
76<pre class="screen diffUnifiedStyle">
77# dd if=/dev/hdX of=/opt/Vine42.dd.img
78</pre>
79<p>とddコマンドを使って、ディスクのイメージを丸ごとファイルにダンプし、この以前のディスクの環境をVine Linux 5.2の上で使えるようにします。
80なお、ここではいくつかのコマンドを説明する目的もあるため、若干無駄な操作も入っています。
81「初めからルートパーティションだけddすればいいじゃん」などといった野暮なつっこみは厳に御容赦願います。。。</p>
82
83
84<p>でも、このままループバックマウントのオプション"-o loop"を使ってディスクのイメージをマウントすることはできません。</p>
85<pre class="screen diffUnifiedStyle">
86# mkdir /opt/Vine42
87# mount -o loop /opt/Vine42.dd.img /opt/Vine42
88mount: ファイルシステムタイプを指定する必要があります
89</pre>
90
91<p>ここでは、パーティションの情報を確認し、オフセットを指定しながらディスクのイメージをループバックマウントします。</p>
92<pre class="screen diffUnifiedStyle">
93# fdisk -lu /opt/Vine42.dd.img
94設定する必要があります シリンダ数.
95あなたは特別機能メニューからこれを行なうことができます
96
97Disk /opt/Vine42.dd.img: 0 MB, 0 bytes
98255 heads, 63 sectors/track, 0 cylinders, total 0 sectors
99Units = セクタ数 of 1 * 512 = 512 bytes
100Disk identifier: 0x000a0970
101
102       デバイス Boot      Start         End      Blocks   Id  System
103/opt/Vine42.dd.img1   *          63      208844      104391   83  Linux
104/opt/Vine42.dd.img2          208845    15727634     7759395   83  Linux
105/opt/Vine42.dd.img3        15727635    16771859      522112+  82  Linux swap / Solaris
106領域 3 は異なった物理/論理終点になっています:
107     物理=(1023, 254, 63) 論理=(1043, 254, 63)
108</pre>
109<p>Startセクタ * 512バイト目がパーティションの始まりになるので、1番目のパーティションは 63*512 = 32,256バイト目からのオフセットを指定することでマウントできます。</p>
110
111<pre class="screen diffUnifiedStyle">
112# mkdir /opt/Vine42
113# mount -o loop,offset=`expr 63 \* 512` /opt/Vine42.dd.img /opt/Vine42
114$ ls /opt/Vine42/
115System.map@                 initrd-2.6.16-0vl76.27.img  vmlinuz@
116System.map-2.6.16-0vl76.27  initrd.img@                 vmlinuz-2.6.16-0vl76.27
117System.map.old@             initrd.old.img@             vmlinuz.old@
118config-2.6.16-0vl76.27      kernel.h
119grub/                       lost+found/
120</pre>
121<p>こっちは /boot パーティションですね。
122一旦アンマウントして、/ に対応する 2番目のセクタをマウント。
123ついでに、必要はありませんが/bootもマウントします。</p>
124
125<pre class="screen diffUnifiedStyle">
126# umount /opt/Vine42
127# umount /opt/Vine42
128# mount -o loop,offset=`expr 208845 \* 512` /opt/Vine42.dd.img /opt/Vine42
129# mount -o loop,offset=`expr 63 \* 512` /opt/Vine42.dd.img /opt/Vine42/boot
130$ df
131ファイルシステム     1K-ブロック  使用        空き 使用% マウント位置
132/dev/sda3             38456340  26437676  10065160  73% /
133none                   2021060         0   2021060   0% /dev/shm
134/dev/loop0             7637400   1928112   5321320  27% /opt/Vine42
135/dev/loop1              101086      8908     86959  10% /opt/Vine42/boot
136</pre>
137<p>これで Vine Linux 4.2 のディスクを Vine Linux 5.2 からアクセスできるようになりました。</p>
138
139<p>ちなみに、ここでは従来環境のディスクをdd でディスクイメージのファイルに落としていましたが、ディスクをそのまま mount しても同じことは可能です。
140この場合は、古いディスクを繋ぐ前にあらかじめ e2label コマンドで "/" や "/boot" といったラベルを消しておきましょう。</p>
141<pre class="screen diffUnifiedStyle">
142# e2label /dev/hda1 ""
143# e2label /dev/hda2 ""
144</pre>
145<p>そうしなければ、古いVine Linux 4.2のディスクを繋いだときに、そっちが "/" となって起動することがあります。
146grubがVine Linux 5.2のカーネルをロードしたのに、"/"としてVine Linux 4.2のディスクが参照され、大量のワーニングを吐きながらVine Linux 4.2が起動する姿を見るとやるせない気分になります。</p>
147
148
149<h3>chrootを使って / のパスを変更</h3>
150
151<p>マウントはできましたが、このままではライブラリの依存関係を満たせないので Vine Linux 4.2 のバイナリはほとんどの場合で実行できません。</p>
152
153<pre class="screen diffUnifiedStyle">
154$ /opt/Vine42/usr/bin/gnome-calculator
155/opt/Vine42/usr/bin/gnome-calculator: error while loading shared libraries: libgnomeui-2.so.0: cannot open shared object file: No such file or directory
156$ ldd /opt/Vine42/usr/bin/gnome-calculator
157        linux-gate.so.1 =>  (0xffffe000)
158        libgnomeui-2.so.0 => not found
159        libbonoboui-2.so.0 => not found
160        <snip>
161</pre>
162<p>これは、Vine Linux 4.2のバイナリを実行するのに必要なライブラリ群が/opt/Vine42/usr/lib 以下に配置されている一方、ライブラリは /usr/lib 以下が参照されるため必要なライブラリをリンクできないのが原因です。そこで chroot を使って、/opt/Vine42/usr/lib が /usr/lib として参照できるようパスを変更します。</p>
163
164<pre class="screen diffUnifiedStyle">
165# chroot /opt/Vine42
166</pre>
167<p>これで、/opt/Vine42 が / としてアクセスできるようになります。
168試しに、ldd してみるとライブラリの依存関係が満たされていることが確認できるでしょう。</p>
169
170<pre class="screen diffUnifiedStyle">
171# ldd /usr/bin/gnome-calculator
172        linux-gate.so.1 =>  (0xffffe000)
173        libgnomeui-2.so.0 => /usr/lib/libgnomeui-2.so.0 (0xf7660000)
174        libbonoboui-2.so.0 => /usr/lib/libbonoboui-2.so.0 (0xf7600000)
175        <snip>
176</pre>
177
178
179<h3>なんちゃって仮想マシンとして使うための初期設定</h3>
180<p>chrootを使って、Vine Linux 4.2のバイナリが実行できるようになりました。しかし、chrootを実行するにはroot権が必要なほか、何かと不便が多いのであたかも仮想マシンにsshログインするかのように使えるよういくつかの設定をします。</p>
181<p>まず、古い mtab が残っていると問題になることがあるので、一旦空っぽにしておきます。</p>
182
183<pre class="screen diffUnifiedStyle">
184# echo > /etc/mtab
185</pre>
186
187<p>次に、デバイスファイルがほとんど無いので、必要そうなものをいくつか作ります。</p>
188<pre class="screen diffUnifiedStyle">
189# ls /dev/
190console  null
191# MAKEDEV /dev/null /dev/random /dev/urandom /dev/ptmx
192# mkdir /dev/pts
193# mount /dev/pts
194# mount -n -t proc /proc /proc
195# mount -n -t sysfs /sys /sys
196# mkdir /dev/shm
197# mount /dev/shm
198</pre>
199
200<p>先の 3行の手続きは一度だけ必要な初期設定です。後の4回のmountコマンドは、ホストPCを再起動する度に必要となる設定です。</p>
201
202<h3>sshd を動かしてログイン</h3>
203<p>あとはsshdを動かせば、ログインできるようになります。</p>
204<p>ただし、22番ポートはホストの Vine Linux 5.2 環境で使われているハズですので、ポート番号を適当に変えた上で sshd を起動します。</p>
205
206<pre class="screen diffUnifiedStyle">
207# vim /etc/ssh/sshd_config
208# diff /etc/ssh/sshd_config.orig /etc/ssh/sshd_config
20913c13
210< #Port 22
211---
212> Port 20022
213# /etc/init.d/sshd start | nkf -uw
214sshdを起動中:                                              [  OK  ]
215</pre>
216<p>ちなみに、Vine Linux 4.2 は Vine Linux 5.2とはデフォルトのロケールが異なります。
217(5.2はja_JP.UTF-8、4.2はja_JP.eucJP)
218そのために文字化けすることがあると思います。それぞれ適当に対応してください。</p>
219
220<p>このほか、dbus も動いていないと何かと不便が多いようですので、dbusも起動しておきます。</p>
221<pre class="screen diffUnifiedStyle">
222# /etc/init.d/messagebus start
223</pre>
224<p>これで準備は完了です。chroot したターミナルはもう CTRL+d で閉じて構いません。</p>
225
226<p>それではホストのVine Linuxから chroot上のVine Linux 4.2に一般ユーザーとしてSSHログインしてみましょう。この際、sshのポート番号を変えているので -p オプションで明示的にポート番号を指定することを忘れないで下さい。</p>
227<pre class="screen diffUnifiedStyle">
228$ ssh -p 20022 vine@localhost
229vine@localhost's password:
230Last login: Sun Dec 12 00:21:43 2010 from localhost.localdomain
231$ gnome-calculator &
232</pre>
233
234<p>今度は、ちゃんと電卓が起動できたと思います。きっと他の商用アプリケーションも動かせるでしょう。</p>
235<p>なお、/etc/resolv.confが空っぽだったり正しくない値が書かれている場合に、DNSによる名前解決が出来ないことがあります。Host環境の設定をそのまま cp するので良いでしょう。</p>
236<pre class="screen diffUnifiedStyle">
237$ sudo cp -a /etc/resolv.conf /opt/Vine42/etc/resolv.conf
238</pre>
239
240
241<h2 id="ATDEonV52">事例 2:Debianベースの ARM 開発環境を Vine Linux 5.2 で使う</h2>
242<p>先の事例では、既存のHDDにインストールしたVine Linux 4.2を Vine Linux 5.2上のchrootで使う事例を紹介しましたが、既存の環境がVMWare上にあった場合でも同様のことが可能です。</p>
243<p>ここでは、VMWareのディスクイメージをループバックマウントして、先と同じくchrootのなんちゃって仮想マシンに仕立て上げる方法を紹介します。</p>
244
245<h3>VMWareのディスクイメージを入手</h3>
246<p>ちょっとAndroidをGingerbreadに更新したいなぁなんて思うことは誰でもあると思います。(いや、ないとは思いますが。。)
247そんなときに、クロス開発環境から作り始めるといろんなこだわりもあったりしてそれだけで半日遊んでしまいます。で、僕は今日いったい何をやっていたんだろう?などと後悔するわけです。閑話休題。</p>
248<p>お手軽にARMのクロス開発環境がほしいと思ったときに便利なのが、株式会社アットマークテクノから公開されているATDEです。
249VMWareのイメージをダウンロードしてきてそのまま使えますし、お手持ちのdebian の環境にインストールしても使えます。
250でも、VMWare Playerは諸般の事情で使えないとか、やっぱりVineをメインで使いたいと思ったときに ATDEの環境をchrootの上で使えると便利です。
251ここでは、ATDEのVMWareディスクイメージを例題としてVine Linux 5.2にマウントしてのchrootで使ってみます。</p>
252<p>まず初めに<a href="http://armadillo.atmark-techno.com/atde">ATDEのサイト</a>から VMWare イメージ (atde3-20100309.zip [696.69 MB]) をダウンロードし、zipアーカイブを展開します。</p>
253
254<pre class="screen diffUnifiedStyle">
255$ wget http://armadillo.atmark-techno.com/files/downloads/atde/atde3-20100309.zip
256$ sudo unzip atde3-20100309.zip -d /tmp/
257Archive:  atde3-20100309.zip
258   creating: /tmp/atde3-20100309/
259  inflating: /tmp/atde3-20100309/atde3-s005.vmdk
260  inflating: /tmp/atde3-20100309/atde3-s007.vmdk
261  inflating: /tmp/atde3-20100309/atde3.vmx
262  inflating: /tmp/atde3-20100309/atde3-s009.vmdk
263  inflating: /tmp/atde3-20100309/atde3.vmxf
264  inflating: /tmp/atde3-20100309/atde3.nvram
265 extracting: /tmp/atde3-20100309/atde3.vmsd
266  inflating: /tmp/atde3-20100309/atde3-s002.vmdk
267  inflating: /tmp/atde3-20100309/atde3.vmdk
268  inflating: /tmp/atde3-20100309/atde3-s001.vmdk
269  inflating: /tmp/atde3-20100309/atde3-s003.vmdk
270  inflating: /tmp/atde3-20100309/atde3-s004.vmdk
271  inflating: /tmp/atde3-20100309/atde3-s006.vmdk
272  inflating: /tmp/atde3-20100309/atde3-s008.vmdk
273</pre>
274
275<h3>分割されたvmdkファイルをディスクのイメージに変換</h3>
276<p>vmdk をループバックマウントできるようにできるように、ディスクのファイル形式をqemu-imgでコマンドで変換します。
277もしqemu-imgがインストールされていない場合にはapt-getインストールします。</p>
278<pre class="screen diffUnifiedStyle">
279$ sudo apt-get install qemu
280$ cd /tmp/atde3-20100309
281$ sudo qemu-img convert atde3-s00[1-9].vmdk -O bin /opt/atde3-20100309.img
282(VMDK) image open: flags=0x2 filename=atde3-s001.vmdk
283(VMDK) image open: flags=0x2 filename=atde3-s002.vmdk
284(VMDK) image open: flags=0x2 filename=atde3-s003.vmdk
285(VMDK) image open: flags=0x2 filename=atde3-s004.vmdk
286(VMDK) image open: flags=0x2 filename=atde3-s005.vmdk
287(VMDK) image open: flags=0x2 filename=atde3-s006.vmdk
288(VMDK) image open: flags=0x2 filename=atde3-s007.vmdk
289(VMDK) image open: flags=0x2 filename=atde3-s008.vmdk
290(VMDK) image open: flags=0x2 filename=atde3-s009.vmdk
291$ fdisk -lu /opt/atde3-20100309.img
292設定する必要があります シリンダ数.
293あなたは特別機能メニューからこれを行なうことができます
294
295Disk /opt/atde3-20100309.img: 0 MB, 0 bytes
296255 heads, 63 sectors/track, 0 cylinders, total 0 sectors
297Units = セクタ数 of 1 * 512 = 512 bytes
298Disk identifier: 0x0008bb4c
299
300            デバイス Boot      Start         End      Blocks   Id  System
301/opt/atde3-20100309.img1   *          63      498014      248976   83  Linux
302/opt/atde3-20100309.img2          498015    33543719    16522852+  8e  Linux LVM
303領域 2 は異なった物理/論理終点になっています:
304     物理=(1023, 254, 63) 論理=(2087, 254, 63)
305</pre>
306
307<h3>LVMが使われているディスクイメージをループバックマウント</h3>
308<p>ディスクは参照できる形になりました。</p>
309<p>でも面倒なことにLVMが使われているので、mount offset オプションを使ってマウントできません。(たぶん)</p>
310<p>そこでまず、kpartxを使って各パーティションのデバイスマップを作ります。</p>
311
312<pre class="screen diffUnifiedStyle">
313$ sudo /sbin/kpartx -av /opt/atde3-20100309.img
314add map loop2p1 : 0 497952 linear /dev/loop2 63
315add map loop2p2 : 0 33045705 linear /dev/loop2 498015
316$ ls /dev/mapper/
317control  loop2p1  loop2p2
318</pre>
319
320<p>これでディスクイメージの各物理パーティションに対応したデバイスマップができました。fdiskで見えていたパーティションはそれぞれ、/dev/mapper/loop2p1 /dev/mapper/loop2p2 として参照できるようになっています。</p>
321<p>次にLVM のマウントです。各コマンドについては適宜manなどで調べてください。詳細は割愛します。</p>
322
323<pre class="screen diffUnifiedStyle">
324$ sudo /sbin/pvscan
325  PV /dev/dm-1   VG atde3   lvm2 [15.75 GB / 0    free]
326  Total: 1 [15.75 GB] / in use: 1 [15.75 GB] / in no VG: 0 [0   ]
327$ sudo /sbin/lvscan
328  inactive          '/dev/atde3/root' [14.70 GB] inherit
329  inactive          '/dev/atde3/swap_1' [1.06 GB] inherit
330$ sudo /sbin/vgchange -ay
331  2 logical volume(s) in volume group "atde3" now active
332$ sudo /sbin/lvscan
333  ACTIVE            '/dev/atde3/root' [14.70 GB] inherit
334  ACTIVE            '/dev/atde3/swap_1' [1.06 GB] inherit
335</pre>
336
337<p>LVMのパーティションに対応するデバイスファイルができましたので、あとは普通にマウントできます。</p>
338<pre class="screen diffUnifiedStyle">
339$ sudo mkdir /opt/atde3-20100309
340$ sudo mount -o loop /dev/atde3/root /opt/atde3-20100309
341$ sudo mount -o loop /dev/mapper/loop0p1 /opt/atde3-20100309/boot
342</pre>
343
344<h3>マウント後の初期設定</h3>
345<p>後の手順は事例1 と同様に、sshdを動かしててリモートログインできるように設定します。</p>
346<p>後で使うので /etc/resolv.conf を ATDE側にコピーした上でchrootします。</p>
347
348<pre class="screen diffUnifiedStyle">
349$ sudo cp -a /etc/resolv.conf /opt/atde3-20100309/etc/
350$ sudo chroot /opt/atde3-20100309
351</pre>
352
353<p>デバイスファイルはだいたい揃っているので、MAKDEV と mkdir は不要です。</p>
354<pre class="screen diffUnifiedStyle">
355# echo > /etc/mtab
356# mount /dev/pts
357# mount -n -t proc /proc /proc
358# mount -n -t sysfs /sys /sys
359# mount /dev/shm
360</pre>
361
362<p>sshdがインストールされていないのを追加すると、あとは事例1 と同様にsshログインできるようになります。</p>
363<pre class="screen diffUnifiedStyle">
364# apt-get install openssh-server
365# vim /etc/ssh/sshd_config
366# /etc/init.d/ssh start
367# exit
368$ ssh -p 20022 atmark@localhost
369atmark@localhost's password: atmark
370    (初期パスワードはatmark)
371$ whoami
372atmark
373</pre>
374
375<h3>試しにAndroid kernelをビルド</h3>
376<p><a href="http://armadillo.atmark-techno.com/armadillo-500-fx">Armadillo-500FX</a>用のビルド方法をまとめられている<a href="http://blog.sola-dolphin-1.net/archives/3166656.html">solaさんのblog</a> に沿ってATDEのクロスコンパイラを使ってkernelをビルドしてみました。</p>
377
378<pre class="screen diffUnifiedStyle">
379$ mkdir ~/bin
380$ curl http://android.git.kernel.org/repo > ~/bin/repo
381$ chmod +x ~/bin/repo
382$ export PATH=/home/atmark/bin:$PATH
383$ mkdir ~/work
384$ cd ~/work
385$ git clone git://github.com/sola-dolphin1/OHA-Android-2.3_r1.0.git
386Initialized empty Git repository in /home/atmark/work/OHA-Android-2.3_r1.0/.git/
387remote: Counting objects: 191730, done.
388remote: Compressing objects: 100% (133820/133820), done.
389remote: Total 191730 (delta 84118), reused 158374 (delta 50901)
390Receiving objects: 100% (191730/191730), 1019.48 MiB | 2956 KiB/s, done.
391Resolving deltas: 100% (84118/84118), done.
392Checking out files: 100% (249342/249342), done.
393$ export ANDROID=/home/atmark/work/OHA-Android-2.3_r1.0
394$ cd $ANDROID/kernel/armadillo500fx/
395$ make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- armadillo500fx_dev_android_defconfig
396  HOSTCC  scripts/basic/fixdep
397  HOSTCC  scripts/basic/docproc
398  HOSTCC  scripts/kconfig/conf.o
399  HOSTCC  scripts/kconfig/kxgettext.o
400  SHIPPED scripts/kconfig/zconf.tab.c
401  SHIPPED scripts/kconfig/lex.zconf.c
402  SHIPPED scripts/kconfig/zconf.hash.c
403  HOSTCC  scripts/kconfig/zconf.tab.o
404  HOSTLD  scripts/kconfig/conf
405#
406# configuration written to .config
407#
408$ make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -j4
409scripts/kconfig/conf -s arch/arm/Kconfig
410  CHK     include/linux/version.h
411(中略)
412  AS      .tmp_kallsyms2.o
413  LD      vmlinux
414  SYSMAP  System.map
415  SYSMAP  .tmp_System.map
416  OBJCOPY arch/arm/boot/Image
417  Kernel: arch/arm/boot/Image is ready
418  AS      arch/arm/boot/compressed/head.o
419  GZIP    arch/arm/boot/compressed/piggy.gz
420  CC      arch/arm/boot/compressed/misc.o
421  Building modules, stage 2.
422  MODPOST 1 modules
423  CC      drivers/scsi/scsi_wait_scan.mod.o
424  LD [M]  drivers/scsi/scsi_wait_scan.ko
425  AS      arch/arm/boot/compressed/piggy.o
426  LD      arch/arm/boot/compressed/vmlinux
427  OBJCOPY arch/arm/boot/zImage
428  Kernel: arch/arm/boot/zImage is ready
429</pre>
430<p>このように、ARM用のLinux Kernelをビルド出来る環境が簡単に実現できました。</p>
431<p>ここではDebianベースのATDEを例に取りましたが、他のLinuxでも基本的にここで紹介した方法でchroot上で使えるようにできると思います。VMWareのディスクイメージは他にも様々なところで公開されていますので、いろいろ試してみて下さい。</p>
432
433<h2 id="conclusion">おわりに</h2>
434<p>ここでは、既存のHDDイメージやVMWareのディスクイメージをループバックマウントして、仮想マシンのように使う事例を紹介しました。</p>
435<p>chrootは使い方次第で様々な活用が可能です。今後もchrootを使ってVine Linuxのより幅広い活用事例を紹介していきます。読者の皆様から「こういった内容を詳しく知りたい」や「こんな問題があるけどよい解決方法は?」などのご要望、ご質問があれば前向きにテーマとして取り上げたいと思います。皆様のご意見、ご感想をお待ちしております。</p>
Note: See TracBrowser for help on using the repository browser.