前々回 MacFUSE + sshfs はテラ便利ってエントリを書いたのですが、あれは Mac OS でのこと。人間自分の使っている他の環境でも便利性を求めてしまうものです。っと言うことで今回は coLinux に sshfs をっと思ったのですが、どうにも sshfs のインストールが上手くいかないんです。モジュールコンパイルの作業にエラーは出ていないのですが、なぜか動かない。
試行錯誤した末、結局 sshfs は諦めました。でも安心してください。ほぼ同じようなことが出来る shfs をインストールし使うことに成功しました。こちらも作業工程はほぼ sshfs と同じで、カーネルモジュールのコンパイルが必要になるのですがそんなに難しくありません。使用時のイメージは下の図のようになると思います。
今回の作業環境
- coLinux : 0.6.4
- OS : Debian 4.0 Etch
- Kernel : 2.6.11
- gcc : Var 3.3
※ たぶん root で作業したほうが良い、っと言うか root の方が作業しやすい。
必要なものをダウンロード & インストール
% apt-get install kernel-package
% apt-get install module-init-tools
% apt-get install libncurses-dev
% apt-get install module-assistant #使わなかったけど
% apt-get install ssh #coLinux 使っているなら入れているはず
% apt-get install shfs-source shfs-utils #/usr/scr にソースが入る
apt-get で入れられるのならその方が楽なので必要そうな物は入れておいた。それからカーネルと coLinux のソースもダウンロードしておく。
% cd /usr/src
% wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.11.tar.gz #colinux0.6.4 はこれのはず
% wget http://nchc.dl.sourceforge.net/sourceforge/colinux/coLinux-0.6.4-src.tar.gz
% tar xvfz linux-2.6.11.tar.gz
% tar xvfz coLinux-0.6.4-src.tar.gz
% tar jxf shfs.tar.bz2
それと gcc は kernel 2.6.11 当時のものを使わないとモジュールメイクの時にエラーを出すらしいので gcc-3.3 に変えておくと吉。
モジュールコンパイルの作業開始
% ln -s linux-2.6.11 linux
% cd linux
% patch -p1 < ../coLinux-0.6.4/patch/linux
% cp ../coLinux-0.6.4/conf/linux-config .config
# version.h とかないから作る、これしないと make-kpkg 出来ないんだけど...合ってるのかなぁ
% make moduls
このあたりは良くわかってなかったりするんだけど、make の時にエラーで version が合ってないよって言われたので無理やり書き換えたりしている。
--- version.h.org 2007-03-06 23:59:04.000000000 +0900
+++ version.h 2007-03-07 00:00:09.000000000 +0900
@@ -1,3 +1,3 @@
-#define UTS_RELEASE "2.6.11"
+#define UTS_RELEASE "2.6.11-co-0.6.4"
#define LINUX_VERSION_CODE 132619
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
inculd/linux/version.h を 2.6.11-co-0.6.4 に書き換える(ここは他にやりようがある気がするけど、とりあえずごり押しでw)
--- dcache.c.org 2007-02-02 04:42:02.000000000 +0900
+++ dcache.c 2007-03-06 23:09:17.000000000 +0900
@@ -68,7 +68,7 @@
spin_lock(&dcache_lock);
next = parent->d_subdirs.next;
while (next != &parent->d_subdirs) {
- dentry = list_entry(next, struct dentry, d_u.d_child);
+ dentry = list_entry(next, struct dentry, d_child);
dentry->d_fsdata = NULL;
shfs_age_dentry(info, dentry);
next = next->next;
@@ -101,7 +101,7 @@
spin_lock(&dcache_lock);
next = parent->d_subdirs.next;
while (next != &parent->d_subdirs) {
- dent = list_entry(next, struct dentry, d_u.d_child);
+ dent = list_entry(next, struct dentry, d_child);
if ((unsigned long)dent->d_fsdata == fpos) {
if (dent->d_inode)
dget_locked(dent);
を ../modules/shfs/linux2.6/dcache.c に当てる。どうもこれは必要なことらしい。ここを書き換えないとモジュールをビルド出来ないので、やっておかないといけない。ここまでくるとあとはモジュールをインストールするだけになる。
% make-kpkg --append-to-version '-co-0.6.4' modules_image
% cd ..
% dpkg -i shfs-module-2.6.11-co-0.6.4_0.35-6.2+2.6.11-co-0.6.2-10.00.Custom_i386.deb
そしてどこか間違ってるっぽい名前のファイルが出来上がったw でもこれでインストールできたよ。カーネル周りはもう少し基礎を勉強しないといけないなぁ、最近切実に思う。
使い方
% shfsmount username@hostname:/path/to mountopoint
% shfsumount mountopoint
これで shfsmount を使えば、Windows の方からでも Samba 経由でリモートホストを覗く事が出来るようになる。もちろん画像のアップやファイルの編集も出来る。リモート側では sshd さえ起動していれば、特に設定もいらずに接続できる。
雑記
autofs, samba 周りで preexec と rootexec などを調べて設定すれば、coLinux 起動時に shfs でマウント、Windowsがスリープから復旧した時でも、自動で接続出来そうだけど、まだよく試していない。
だけど、毎回 Perl の事を書こうと思っているのに別のことを書いてしまうなぁ。性格上、調べたり、まとめたりすることの方が向いているのかもw やってみたい事がいっぱいありすぎて困るなぁ。
追記
カーネルコンパイルやらの知識はないので方法が間違っている可能性があります。ですので、それ違うよって箇所があったらコメント欄で教えてくれると助かります。ブクマコメントでもいいんですけど。
コメントする