«前の日記(2008-03-31 [月]) 最新 次の日記(2008-04-07 [月])» 編集

堕落と混迷の日々

見てくれた人:人

Sunaの仲間のヒトビト
Sunaの観測地点
Sunaの聞いてる曲

2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|
2009|01|03|08|09|10|11|
2010|01|04|05|06|07|08|10|
2011|03|08|
2013|08|

2008-04-03 [木] ふぅ。

_ [Debian]NTFSボリューム上のcolinux用ルートイメージファイルを直接起動する

今使っているノートのパーティションのファイルシステムは全てNTFSなのだが、このマシンは友人から譲り受けたこともあって、パーティションを塗り換えたりはあまりしたくない。だから、今まではlinuxが使いたくてもcolinuxやKnoppixのCDイメージインストールで我慢していたのだが、どうも不安定だったり面倒だったりするので、やはり素のDebianを起動したいと思うようになった。…Ubuntuでも良ければ、Wubi使うって手もあるけど。

NTFSのパーティションを弄らずにDebianを起動する方法としては、やはりNTFS上に配置したlinuxのルートイメージファイルをループバックマウントして起動するのが手っ取り早いと思われる。そのイメージとしては、既に入れているcolinuxで使っているDebianのイメージが使えるはずだ。そうすれば、1つのイメージをcolinuxと素のlinuxで共有できて一石二鳥になる。ブートローダとしてはNTFSを読めるGrub4Dosを使うと、Windowsのシステムファイルとしてはboot.iniを少々書き換えるだけで良く、パーティションテーブル等はいじらずに済むので、既存のシステムへの影響も少ないはずだ。

この場合、起動順序としては、ブート時にMBRからNTLDRが呼ばれ、(あらかじめGrub4Dosを入れてboot.iniを書き換えておいて)そこからGRLDRを呼んでもらい、Grub(4Dos)にNTFS上に置いておいたvmlinuzと(手を加えた)initrd.imgを読ませて、initrd.img内のスクリプトでNTFSをマウントして更にNTFS上のlinuxルートイメージファイルをループバックマウントしてrun-initしてやれば、目的のイメージファイルの中のlinuxシステムを起動させることができるはずだ。…ああ、長っ。

で、やってみた。起動実験の結果としては、(kernel panicの山の後で)成功しました。NTFSのマウントにはntfs-3gを使わせて貰いました。

ただし、こうして起動したシステムを終了させようとした時に生じた問題があって、ルートイメージの置かれたNTFSボリュームのマウントにntfs-3gを利用しているので、シャットダウンシーケンスでNTFSボリュームがアンマウントされる前にntfsを管理してるプロセスがkillされてしまうので、結果としてNTFSボリュームはもちろん、ルートイメージファイルの正常なアンマウントもできないのです。これはKnoppixでも使い方によっては生じうる問題なんですよね。理想としては、ntfsのプロセスだけは最後まで生かしておくといいのか。WUBIではどうしてるんだろう。

とりあえず、やった手順を書いとく。

まず、colinuxのルートファイルシステムにdebian backportsからlinux-image-2.6.22-4-686のカーネルを持って来て入れる。/sbin/update-grubから/bin/trueにsymlink貼っとくと吉。最初は2.6.18入れてみたんだけど、ntfs-3gが2.6.20以降にしてくれと云って来たのでこちらにした。そういえばKnoppixも2.6.19だったのにNTFS上に普通にswapイメージファイル置いてガシガシ使ってたから不安定だったのかも。そして、ntfs-3gもbackportsから貰って入れる。

後は、コマンドラインでやった事を書き連ねます。/bin/mountも入れてるのは、元々initrdに入ってたmountは-iオプションに対応してなかったからです。

#mkdir /boot/initrd
#cd /boot/initrd
#zcat ../initrd.img-2.6.22-4-686|cpio -i -d -H newc --no-absolute-filenames
#mkdir lib/modules/2.6.22-4-686/kernel/fs/fuse
#cp /lib/modules/2.6.22-4-686/kernel/fs/fuse/fuse.ko lib/modules/2.6.22-4-686/kernel/fs/fuse/
#cp /lib/modules/2.6.22-4-686/kernel/drivers/block/loop.ko lib/modules/2.6.22-4-686/kernel/drivers/block/
#ldd /sbin/mount.ntfs-3g
linux-gate.so.1 => (0xffffe000)
libntfs-3g.so.2 => /usr/lib/libntfs-3g.so.2 (0xb7fbc000)
libfuse.so.2 => /usr/lib/libfuse.so.2 (0xb7fa3000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7f9a000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7f88000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e57000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7e52000)
/lib/ld-linux.so.2 (0xb7feb000)
#cp -L (上で出てきたライブラリ群) lib
#cp -L /sbin/mount.ntfs-3g sbin
#ldd /bin/mount
linux-gate.so.1 => (0xffffe000)
libblkid.so.1 => /lib/libblkid.so.1 (0xb7fdd000)
libuuid.so.1 => /lib/libuuid.so.1 (0xb7fda000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7ea9000)
libdevmapper.so.1.02 => /lib/libdevmapper.so.1.02 (0xb7e98000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb7e83000)
libsepol.so.1 => /lib/libsepol.so.1 (0xb7e41000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7e2f000)
/lib/ld-linux.so.2 (0xb7feb000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7e2b000)
#cp -L /lib/libblkid.so.1 /lib/libuuid.so.1 /lib/libdevmapper.so.1.02 lib
#cp -L /bin/mount bin

そして、以下の内容を/boot/initrd/scripts/fileinntfsに書き込む。

# NTFS filesystem mounting -*- shell-script -*-

# FIXME This needs error checking

# NTFS mounting
mountroot()
{
[ "$quiet" != "y" ] && log_begin_msg "Now mounting NTFS volume ${NFSROOT}"
mkdir -p /root/mnt/test
/sbin/mount.ntfs-3g -o force ${NFSROOT} /root/mnt/test
[ "$quiet" != "y" ] && log_end_msg

[ "$quiet" != "y" ] && log_begin_msg "Now mounting root image file ${ROOT}"
mknod /dev/loop0 b 7 0
/bin/mount -o loop /root/mnt/test${ROOT} ${rootmnt}
[ "$quiet" != "y" ] && log_end_msg
}

最後に、/boot/initrdにて以下を実行して、/boot/vmlinuz-2.6.22-4-686と/boot/newinitrd.gzをNTFS上のどっかに置く。僕はhda1の/boot以下に置きました。

#find .|cpio -H newc -o|gzip>../newinitrd.gz

参考までに、Grubのmenu.lstの該当エントリは以下のようにしました。
rootにはNTFS上のルートイメージファイルのパス、nfsrootにはNTFSボリュームのデバイスを指定します。nfsrootを使ったのは、問題なさそうだったからです。w

title Debian GNU/Linux
root (hd0,0)
kernel /boot/vmlinuz-2.6.22-4-686 nfsroot=/dev/hda5 root=/colinux/root_fs boot=fileinntfs 2
initrd /boot/newinit.gz

_ initramfs

ディスクイメージを使うinitrdから、initramfsなるものに変わってたのね。

最初はループバックマウントの方がわかりやすいような気もしてたのだけど、ユーザとしてはマウントの手間がなくイメージの残り容量を気にしなくていい点が良くなったかも。

もちろん、カーネルのコードの美しさって問題もあるんだろうけど。

_ 研究室決定

夜に、研究室が決定したとの連絡がありました。

某理論計算機科学の研究室です。僕が今居る課程とは違うのですが、興味のある分野なので頑張ろうと思います。

本日のツッコミ(全3件) [ツッコミを入れる]
_ こたか (2008-04-04 [金] 11:25)

とりあえず一年間関わってみて、違うことがしたかったら院で別のとこに行けばいいよ。<br>何にせよおめでとう!<br>院試勉強頑張れ!

_ いさやん (2008-04-05 [土] 03:16)

仮想PCは?<br>ってスペックがつらいのかもしれませんが。

_ suna (2008-04-05 [土] 23:36)

>こたか<br>興味があったのは本当で、改めて先日お話を聞きに行ったら、合いそうでした。見学にも行ってたしね。きっとここで良かったのだと思います。がんばるよ。<br>>いさやん<br>仮想PCは確かに便利ですね。colinuxも仮想的で好きなのです。<br>今回、initramfsのテストにKnoppixに入ってたQEMUも使ってみました。ただ、やはり僕のマシンには負荷も大きいようでしたし、素で動く環境の速さや軽さや安定性とかは魅力ですね。といっても、この環境はまだ不安定なのですが…。

お名前:
E-mail:
コメント:
[]

サイト構築中…完成はいつの日か。
連絡先:sunasaji+web at gmail dot com