2011年4月29日アーカイブ

Macが届いたのでTeraStationにアクセスしたところ、見事に日本語が化けている。FreeBSDのsamba3にアクセスすると化けないので、TeraStationのsamba2とMacの文字コード問題なんだろう。
OpenTeraのsambaはiconv周りの問題で使えないので、自分でsambaをビルドすることにする。
参考にしたのは2010/02/03:TerastationPROのLinuxBox化(下)。先にここを見ておけば文字化けでreflashすることもなかったんだけどね。
私の場合、以前root奪取してgccとか入れてあったので、使えるものは使う方向で行く。(一からやった方が他の人の参考になるんだろうけど、TeraStationのスペック的にコンパイル時間がかかるので)
と言う訳で現在のTeraStationがどう言う状態になっているかと言うと、以下のような感じ。
  • OpenTeraは適用していない
  • ln -s /mnt/array1/opt /opt してある。/mnt/array1/opt は以前Vineのrpmから入れたり、ビルドしたりしたもの。
  • /optに何を入れたかはほとんど覚えていない。
  • とりあえず、/opt/bin:/opt/usr/bin:/opt/usr/local/bin/ にPATHを通すscriptを書いて、sambaビルド時には実行しておく。(rootの.bashrcとかには怖くて入れない)
  • 上記スクリプトで、/opt/usr/lib:/opt/usr/local/libにLD_LIBRARY_PATHを通しておく。(私の環境だと、/opt/lib/libc.soにLD_LIBRARY_PATHを通してしまうと、何もできなくなってしまう)

まずは、sambaのソースを持ってくる。現在の安定板の最新と言うことで samba-3.5.8。(ちなみに、FreeBSDには3.5.6が入っていた)
展開すると、トップにはconfigureとか存在しない。3.0くらいまでは source ってディレクトリがあったけど、何故かsource3とsource4と言うディレクトリがあり、howto4.txtとか言うファイルもあって、「あれ?間違えて samba4 持ってきた?」とか思うが、どうみても3.5.8である。
とりあえず、source3でconfigureを実行してみると、エラーが出るのでいろいろ手を打つ。(元の状態(optに何が入っているか)がわからないので、ちっとも参考にならないと思うけど)
  • まずは、/usr/lib/libc_nonshared.a がないと言って ld がエラーになるので、ln -s /opt/usr/lib/libc_nonshared.a /usr/lib する。
  • 次に、stdio.h がないと言って cpp がエラーになるので、 ln -s /opt/usr/include /usr/include する。
  • 次に、linux/limits.h がないと言って(略)、ln -s /opt/usr/src /usr/src する。
これで、オプションなしのconfigureは通るようになったので、TeraStationのconfigureオプションを考える。
./configure --prefix=/opt/usr/local/samba \ 
   --with-piddir=/var/run \ 
   --with-libiconv=/opt/usr/local
参考にしたサイトと違うのは、prefixと、libiconvの場所。krb5とadsはいらないと思ったので外した。configdirは$PREFIX/etcで良いので指定しない。
途中、headの-lオプションがないとか、dirnameがないとか言ってるが、一応最後までconfigureが実行されて、Makefile-noincludesと言うファイルができる。試しに make -f Makefile-noincludesってやるとビルドが始まったけど、やっぱり dirname がないとか言ってる。
そこで、busyboxにheadとdirnameを追加してリビルド。
しかし、headには-lオプションなんてない。FreeBSDのmanで見てもないので、何かエラーメッセージを読み間違えたか?
dirnameが使えるようにして再度 configureを実行したところ、Makefileができたのでmakeする。
すると、libnetapi.soをビルドするところで __dn_expand が見つからないとか言ってコンパイルエラーになる。
昔sshdをビルドしようとしてはまったときとまったく同じ状況だったので、MakefileのLIBSの行に /lib/libresolv.so.2を追加。
今度は、 /usr/lib/libpthread_nonshared.a がないと言われるので、 ln -s /opt/usr/lib/libpthread_nonshared.a /usr/lib/ で無理矢理回避。
ここまでやってやっとバイナリができたので、make install。
/etc/init.d/smb stop でオリジナルのsamba2を止めて、前回失敗したOpenTeraが作成したsmb.conf を /opt/usr/local/samba/lib にコピーしてみる。
試しに、/opt/usr/local/samba/sbin/smbd -D で起動してみると、libwbclient.so が見つからないと言って起動しないので、LD_LIBRARY_PATH=/opt/usr/local/samba/lib をつけて起動する。
すぐに死んでしまうので、/opt/usr/local/samba/var/log.smbd を確認すると、
smbd/server.c:659(open_sockets_smbd)
  open_sockets_smbd: No sockets available to bind to.
と言うエラーが出てうまく動かない。
smb.conf に interfaces = lo eth0 とか足してもダメなので、libc周りがおかしいせいなんじゃないかと思う。
この辺でお手上げなので、おかしい環境で続けるのはやめて、一度昔入れた /opt は捨てて、冒頭に挙げた参考URLの通りにやってみることにする。
と、言うわけで続く。
再度2010/02/03:TerastationPROのLinuxBox化(下)を見ながらリベンジ。
今までは、FreeBSDでrpm2cpio | cpio -id していたのだが、効率を上げるために記事の通りTeraStationにrpm2cpioとcpioを入れる。
続いて、開発環境関連のrpmをftp.jaist.ac.jpから持ってくる。
持ってきたのは、参考サイトに書いてある以下のもの。
  • autoconf-2.59-2vl3.noarch.rpm
  • automake-1.8.5-0vl1.noarch.rpm
  • binutils-2.14.90.0.7-1vl2.ppc.rpm
  • diffutils-2.8.1-11vl1.ppc.rpm
  • ftp-0.17-15vl2.ppc.rpm
  • gcc-3.3.2-0vl8.ppc.rpm
  • gcc-c++-3.3.2-0vl8.ppc.rpm
  • gcc-cpp-3.3.2-0vl8.ppc.rpm
  • glibc-common-2.3.3-3vl1.ppc.rpm
  • glibc-devel-2.3.3-3vl1.ppc.rpm
  • initscripts-6.51-1vl26.ppc.rpm
  • kernel-headers-2.4.26-0vl17.ppc.rpm
  • less-358-0vl9.ppc.rpm
  • make-3.80-0vl3.ppc.rpm
  • ntp-4.2.0-0vl3.ppc.rpm
  • pkgconfig-0.15.0-0vl2.ppc.rpm
  • popt-1.6.5-1vl8.ppc.rpm
  • sh-utils-2.0.11-9vl6.ppc.rpm
  • textutils-2.0.17-0vl4.ppc.rpm
  • unzip-5.50-5vl2.ppc.rpm
  • vim-6.3.31-0vl1.ppc.rpm
  • こいつらを、参考サイトに従って /mnt/array1/newroot に展開。(参考サイトだと /mnt/disk1だが、RAIDを組んでいると /mnt/array1なので読み替えが必要。そのことも参考サイトには書いてあるけど)
    展開したら、参考サイトにあるスクリプトで既存の / と比較する。
    ./usr/bin/getent
    ./usr/bin/locale
    ./usr/bin/env
    ./usr/bin/expr
    ./usr/bin/id
    ./usr/bin/tty
    ./usr/bin/head
    ./usr/bin/sum
    ./usr/bin/tail
    ./usr/bin/tr
    ./usr/bin/wc
    ./usr/share/locale/locale.alias
    ./usr/share/zoneinfo/America/Buenos_Aires
    ./usr/share/zoneinfo/America/St_Johns
    ./usr/share/zoneinfo/America/Santiago
    ./usr/share/zoneinfo/America/Anchorage
    ./usr/share/zoneinfo/Asia/Baghdad
    ./usr/share/zoneinfo/Asia/Bangkok
    ./usr/share/zoneinfo/Asia/Calcutta
    ./usr/share/zoneinfo/Asia/Dubai
    ./usr/share/zoneinfo/Asia/Kabul
    ./usr/share/zoneinfo/Asia/Katmandu
    ./usr/share/zoneinfo/Asia/Kuwait
    ./usr/share/zoneinfo/Asia/Rangoon
    ./usr/share/zoneinfo/Asia/Tokyo
    ./usr/share/zoneinfo/Asia/Tehran
    ./usr/share/zoneinfo/Asia/Taipei
    ./usr/share/zoneinfo/Asia/Dhaka
    ./usr/share/zoneinfo/Atlantic/Cape_Verde
    ./usr/share/zoneinfo/Australia/North
    ./usr/share/zoneinfo/Australia/Adelaide
    ./usr/share/zoneinfo/Europe/Athens
    ./usr/share/zoneinfo/Europe/Rome
    ./usr/share/zoneinfo/Europe/London
    ./usr/share/zoneinfo/Indian/Maldives
    ./usr/share/zoneinfo/Pacific/Guam
    ./usr/share/zoneinfo/Pacific/Marquesas
    ./usr/share/zoneinfo/Pacific/Midway
    ./usr/share/zoneinfo/Pacific/Ponape
    ./usr/share/zoneinfo/Pacific/Tongatapu
    ./usr/share/zoneinfo/Pacific/Auckland
    ./usr/share/zoneinfo/Pacific/Honolulu
    ./usr/share/zoneinfo/zone.tab
    ./usr/share/zoneinfo/UTC
    ./usr/share/zoneinfo/MST
    ./usr/share/zoneinfo/EST5EDT
    ./usr/share/zoneinfo/PST8PDT
    ./usr/share/zoneinfo/EST
    ./usr/share/zoneinfo/MST7MDT
    ./usr/share/zoneinfo/CST6CDT
    ./usr/lib/libpopt.so.0.0.0
    ./usr/sbin/ntpdate
    ./bin/usleep
    ./bin/date
    ./bin/echo
    ./bin/false
    ./bin/sleep
    ./bin/stty
    ./bin/su
    ./bin/true
    ./bin/uname
    ./bin/cat
    ./etc/inittab
    ./etc/rc.d/init.d/halt
    ./etc/sysctl.conf
    ./etc/pam.d/su
    ./sbin/ifdown
    ./sbin/ifup
    
    ...だいぶ参考サイトよりも多い。
    被ったものはリネームとあるので、泣きながらnewrootの方をリネームしていく。
    手でやるとミスるので、スクリプトが吐いた newfile.dup をエディタで修正しよう。さらに、/usr/share/zoneinfo/* はファイルを一つ一つリネームするのもなんなので、ディレクトリ毎リネームする。(たぶんなくても困らないでしょ?)
    #!/bin/bash
    cd newroot
    
    files=`cat << EOT
    ./usr/bin/getent
    ./usr/bin/locale
    ./usr/bin/env
    ./usr/bin/expr
    ./usr/bin/id
    ./usr/bin/tty
    ./usr/bin/head
    ./usr/bin/sum
    ./usr/bin/tail
    ./usr/bin/tr
    ./usr/bin/wc
    ./usr/share/locale/locale.alias
    ./usr/share/zoneinfo
    ./usr/lib/libpopt.so.0.0.0
    ./usr/sbin/ntpdate
    ./bin/usleep
    ./bin/date
    ./bin/echo
    ./bin/false
    ./bin/sleep
    ./bin/stty
    ./bin/su
    ./bin/true
    ./bin/uname
    ./bin/cat
    ./etc/inittab
    ./etc/rc.d/init.d/halt
    ./etc/sysctl.conf
    ./etc/pam.d/su
    ./sbin/ifdown
    ./sbin/ifup
    EOT
    `
    for i in $files
    do
    echo $i
    mv $i $i.vine
    done
    
    こいつを /mnt/array1 (newrootがあるディレクトリ) で実行する。
    続いて、リンクを張る。参考URLと同じ手順でやったら、
    • mv usr/src/linux-2.4.26/include/* usr/include/ の手順で net と scsi が usr/include に既にあるので mv に失敗する。
    • usr/include で asm → asm-ppc のリンクは既にある
    と言う状態だった。
    この状態で、再度rootと比較するスクリプトを動かして、出力が空であることを確認しておくと、後で既存のファイルを上書きしてしまうことがない。
    この時点で、newrootの du -ah の結果は 147M、df -ha での / の空きは 294M。参考サイトのように / は拡張していないが、入れても深刻なことにはならないだろうと判断して、展開していくことにする。
    # cd /mnt/array1/newroot
    # tar zcvf ../TeraLinuxKit.tar.gz bin/ etc/ usr/
    # tar zxvfk /mnt/disk1/TeraLinuxKit.tar.gz -C /
    

    続いて、sambaの依存ツール/ライブラリのビルド。
    参考サイトと現時点でバージョンが違うので、一応リストアップ。 Berkeley DB(今は Oracleなのね)、openldap、krbはいらないと思ったので入れない。
    上記をひと通りダウンロードして、m4からスタート。
    しかし、2番目のautoconf の時点で perl の Data/Dumper.pmがないと言うエラーで止まる。
    面倒臭くなったので、既に入っているツール類は新しくしなくても良いや〜とlibiconvのコンパイル。
    と思ったらpatchをあてるのにGNU patchが必要だったのでこちらを先にインストール。
    libiconvは無事に入ったので、続いて samba の configure。
    # ./configure --prefix=/opt/samba --with-piddir=/var/run --with-libiconv=/usr/local
    
    としてみたら、またまたMakefile-noincludesができて Makefileができない。
    configureの出力を見ていると、egrepがないとか言ってる。
    またbusyboxにしても良かったんだけど、今回はGNU grep(grep-2.7.tar.gzを持ってくることに。
    libiconvが先に入っていると、オプション無しのconfigureでは libiconv をリンクしてくれないので、以下のオプションでやってみた。
    # ./configure --with-libiconv-prefix=/usr/local
    
    ら失敗するので
    # ./configure --without-libiconv-prefix
    
    にしても駄目なので、大人しくbusyboxを使う。
    しかし、やはり Makefile-noincludes しかできない。
    だいぶくじけてきたので、make -f Make-noincludes でビルドしてみることに。
    何事もなかったかのようにビルドは成功したので、make -f Makefile-noincludes install でインストール。
    smb.conf と lmhosts を/opt/samba/lib にコピーして、smbdを起動しようとすると、libwbclient.so.0が見つからない。
    LD_LIBRARY_PATH=/opt/samba/lib で smbd を起動すると、No sockets available to bind to.で落ちる。 ...昨日とまったく一緒です。本当にありがとうございました。
    config.logを再度見てみると、ipv6関連のテストがyesになっています。
    TeraStationはipv6に対応してないし、libipv6なんて見当たらないのですが、なんでこうなるのか謎です。

    何が悪いのか検討もつかなかったので、試しに参考サイトがいれているsamba3.0系の最新版であるsamba-3.0.36で試してみることにしました。
    とりあえず、3.5でlibwbclient.so.0が見つからないのは、ビルド時にリンカに-Rオプションが渡っていないからだと思うので、参考サイトと同じように configure実行時にLDFLAGSを追加。
    #  CPPFLAGS="-I/usr/local/include" LDFLAGS="-R/usr/local/lib -L/usr/local/lib" \
    ./configure --prefix=/opt/samba --with-piddir=/var/run --with-libiconv=/usr/local
    
    これで、無事にconfigureが終了してMakefileができたので、make, make installであっけなくインストール完了。
    起動してみたら、WindowsからもMacからも日本語のファイル名が文字化けせずに動作するようになりました。
    Macがアクセスすると、各ディレクトリに .DS_Store と言うファイルができてしまうので、Windowsから見るときに気になりそうですが。
    あとは、/etc/init.d/smb ファイルをいじって、/opt/samba のファイルを起動するように直すだけ。
    OpenTeraのsambaをいれている場合は、/etc/init.d/smbの冒頭で定義しているSAMBA3を変えればそのままいけそう。
    私の場合は、OpenTeraのsamba3は適用しなかったので、zipの中身を以下のように配置した。
    • /etc/samba/smb.conf ← TeraStationの管理ファイルが生成する samba2用の設定ファイル
    • /etc/samba/lmhosts ←同上
    • /etc/samba/smb2smb3.pl ← OpenTeraのsamba3から持ってきて、日本語対応に書き換えた物
    • /etc/init.d/smb ← OpenTeraのsamba3から持ってきて、SAMBA3を /opt/samba に書き換えた物
    • /opt/samba/lib/smb.conf ← smb2smb3.pl が変換したsamba3用の設定ファイル。
    • /opt/samba/lib/lmhosts ← /etc/init.d/smb がコピーした samba3用の設定ファイル。
    • と、言うわけで smb2smb3.pl の書き換え。
      *** smb2smb3.pl.orig    Sat Apr 30 07:49:06 2011
      --- smb2smb3.pl Sat Apr 30 07:53:15 2011
      ***************
      *** 50,58 ****
          close(SMB2_CONF);
          
        # Open up the Samba 3 output file
      !   if (!open (SMB3_CONF, ">/usr/local/samba3/lib/smb.conf")) 
          { 
      !       die "File Open Error - /usr/local/samba3/lib/smb.conf\n"; 
          }
        
        
      --- 50,58 ----
          close(SMB2_CONF);
          
        # Open up the Samba 3 output file
      !   if (!open (SMB3_CONF, ">/opt/samba/lib/smb.conf")) 
          { 
      !       die "File Open Error - /opt/samba/lib/smb.conf\n"; 
          }
        
        
      ***************
      *** 119,124 ****
      --- 119,132 ----
              {
                      # Remove line - this is not used by Samba 3
              }
      +       elsif ($line =~ m/coding system/)
      +       {
      +               print SMB3_CONF "    display charset = CP932\n";
      +               print SMB3_CONF "    dos charset = CP932\n";
      +               print SMB3_CONF "    unix charset = CP932\n";
      +               print SMB3_CONF "    load printers = no\n";
      +               print SMB3_CONF "    disable spoolss = yes\n";
      +       }
              elsif ($line =~ m/printer admin/)
              {
                      # Remove line - this is deprecated by Samba 3
      
      参考サイトと違うのは、sambaのインストール先と、dos charset。既存のファイル名がsjisなので。

      ふ〜、これでやっとMacの設定を始められる。
2011年4月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

このアーカイブについて

このページには、2011年4月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2011年4月27日です。

次のアーカイブは2011年4月30日です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1