1 | <date> |
---|
2 | 2011,03,03 |
---|
3 | |
---|
4 | <author> |
---|
5 | kenta |
---|
6 | |
---|
7 | <title> |
---|
8 | ループバックマウントとchrootで作るなんちゃって仮想マシン |
---|
9 | |
---|
10 | <description> |
---|
11 | 1台のPCで複数のOSを使い分けるソリューションとして、KVM や VMWare, VirtualBoxのような仮想マシンは今や常識となっています。 |
---|
12 | しかし、Linuxの上で別のLinux環境を実現するのであればchrootを使っても簡易仮想マシンの様な環境を作ることができます。 |
---|
13 | Vine 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 |
---|
88 | mount: ファイルシステムタイプを指定する必要があります |
---|
89 | </pre> |
---|
90 | |
---|
91 | <p>ここでは、パーティションの情報を確認し、オフセットを指定しながらディスクのイメージをループバックマウントします。</p> |
---|
92 | <pre class="screen diffUnifiedStyle"> |
---|
93 | # fdisk -lu /opt/Vine42.dd.img |
---|
94 | 設定する必要があります シリンダ数. |
---|
95 | あなたは特別機能メニューからこれを行なうことができます |
---|
96 | |
---|
97 | Disk /opt/Vine42.dd.img: 0 MB, 0 bytes |
---|
98 | 255 heads, 63 sectors/track, 0 cylinders, total 0 sectors |
---|
99 | Units = セクタ数 of 1 * 512 = 512 bytes |
---|
100 | Disk 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/ |
---|
115 | System.map@ initrd-2.6.16-0vl76.27.img vmlinuz@ |
---|
116 | System.map-2.6.16-0vl76.27 initrd.img@ vmlinuz-2.6.16-0vl76.27 |
---|
117 | System.map.old@ initrd.old.img@ vmlinuz.old@ |
---|
118 | config-2.6.16-0vl76.27 kernel.h |
---|
119 | grub/ 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% / |
---|
133 | none 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のディスクを繋いだときに、そっちが "/" となって起動することがあります。 |
---|
146 | grubが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/ |
---|
190 | console 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 |
---|
209 | 13c13 |
---|
210 | < #Port 22 |
---|
211 | --- |
---|
212 | > Port 20022 |
---|
213 | # /etc/init.d/sshd start | nkf -uw |
---|
214 | sshdを起動中: [ 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 |
---|
229 | vine@localhost's password: |
---|
230 | Last 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です。 |
---|
249 | VMWareのイメージをダウンロードしてきてそのまま使えますし、お手持ちの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/ |
---|
257 | Archive: 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 | |
---|
295 | Disk /opt/atde3-20100309.img: 0 MB, 0 bytes |
---|
296 | 255 heads, 63 sectors/track, 0 cylinders, total 0 sectors |
---|
297 | Units = セクタ数 of 1 * 512 = 512 bytes |
---|
298 | Disk 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 |
---|
314 | add map loop2p1 : 0 497952 linear /dev/loop2 63 |
---|
315 | add map loop2p2 : 0 33045705 linear /dev/loop2 498015 |
---|
316 | $ ls /dev/mapper/ |
---|
317 | control 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 |
---|
369 | atmark@localhost's password: atmark |
---|
370 | (初期パスワードはatmark) |
---|
371 | $ whoami |
---|
372 | atmark |
---|
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 |
---|
386 | Initialized empty Git repository in /home/atmark/work/OHA-Android-2.3_r1.0/.git/ |
---|
387 | remote: Counting objects: 191730, done. |
---|
388 | remote: Compressing objects: 100% (133820/133820), done. |
---|
389 | remote: Total 191730 (delta 84118), reused 158374 (delta 50901) |
---|
390 | Receiving objects: 100% (191730/191730), 1019.48 MiB | 2956 KiB/s, done. |
---|
391 | Resolving deltas: 100% (84118/84118), done. |
---|
392 | Checking 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 |
---|
409 | scripts/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> |
---|