2007/9/ 2

vfatのUSBディスクをsambaで利用(Linux)

CentOS4.5でFAT32の外付けUSBディスクを接続しました。

使用目的はsambaによるWindowsクライアントからの各種ファイル共有の為です。

FAT32にする理由は、万が一Linuxマシンが故障した場合にも外付けディスクをWindowsに繋げることによりデータはとりあえず引き続き利用可能にするのが主な目的です。

現在は玄人志向のkuro-box/HGにdebianを入れて、ext3のファイルシステム上でsambaのファイルを共有していますが、こちらを移行する方法についてもふれたいと思います。

ディスクのフォーマット

既にUSBディスクがFAT32でフォーマットされている場合は読み飛ばして構いません。

CentOSはデフォルトでhaldaemonという、外部メディア接続時にマウントをよろしくやってくれる機能が動作していますのでまずは一時的に止めます。

# /etc/init.d/haldaemon stop
HAL デーモンを停止中:                                      [  OK  ]

続いてUSBディスクを差し込むと、/var/log/messagesに以下のようなメッセージが出て、/dev/sd?と、SCSIディスクとして認識されます。

Sep  1 22:08:45 rabi kernel: usb 1-3: new high speed USB device using address 12
Sep  1 22:08:45 rabi kernel: scsi5 : SCSI emulation for USB Mass Storage devices
Sep  1 22:08:45 rabi kernel:   Vendor: Maxtor 6  Model: EDKE              Rev: 1BW0
Sep  1 22:08:45 rabi kernel:   Type:   Direct-Access                      ANSI SCSI revision: 02
Sep  1 22:08:45 rabi kernel: SCSI device sda: 160086528 512-byte hdwr sectors (81964 MB)
Sep  1 22:08:45 rabi kernel: sda: assuming drive cache: write through
Sep  1 22:08:45 rabi kernel: SCSI device sda: 160086528 512-byte hdwr sectors (81964 MB)
Sep  1 22:08:45 rabi kernel: sda: assuming drive cache: write through
Sep  1 22:08:45 rabi kernel:  sda: sda1
Sep  1 22:08:45 rabi kernel: Attached scsi disk sda at scsi5, channel 0, id 0, lun 0

上記例では既にパーティションが一つあるのでsda1が認識されています。

前述のhaldaemonを停止しないと、この時点で/media/usbdisk等で自動でマウントされてしまうので、その場合は手動でumountして、haldaemonは停止しておきましょう。

続いてfdiskでvfatのパーティションを作成します。既にあるパーティションを削除してから作成する例を以下に示します。

# fdisk /dev/sda

このディスクのシリンダ数は 9964 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): d(既存のパーティション削除)
Selected partition 1

コマンド (m でヘルプ): n(パーティション新規作成)
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p(基本領域選択)
領域番号 (1-4): 1(最初の領域選択)
最初 シリンダ (1-9964, default 1):(enter空打ち)
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-9964, default 9964):(enter空打ち)
Using default value 9964

コマンド (m でヘルプ): t(パーティションタイプ変更)
Selected partition 1
16進数コード (L コマンドでコードリスト表示): c(FAT32選択)
領域のシステムタイプを 1 から c (W95 FAT32 (LBA)) に変更しました

コマンド (m でヘルプ): p(パーティション一覧表示)

Disk /dev/sda: 81.9 GB, 81964302336 bytes
255 heads, 63 sectors/track, 9964 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sda1               1        9964    80035798+   c  W95 FAT32 (LBA)

コマンド (m でヘルプ): w(パーティション変更適用)
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。

警告: DOS 6.x 領域を作成、または変更してしまった場合は、
fdisk マニュアルの追加情報ページを参照してください。
ディスクを同期させます。

続いてFAT32でフォーマットします。

# mkdosfs /dev/sda1
mkdosfs 2.8 (28 Feb 2001)

マウントオプションの変更

CentOSのデフォルト設定でvfatのファイルシステムをマウントすると、日本語や8.3形式のファイルの大文字・小文字の扱いに問題があるため、以下のマウントオプションを追加します。

  • shortname=winnt
    8.3形式のファイル名で大文字・小文字を正しく表示する
  • codepage=932
    実際に保存されるファイル名の文字コードを設定する
  • utf8
    Linux上で表示するファイル名の文字コードを設定する
  • umask=000
    root以外のユーザも読み書きが可能とする(samba対応)

/etc/fstabにはまだ、/dev/sda1のマウント設定は書かれていないと思います。この設定はhaldaemonが自動で書き込んでくれるので、先に上記のマウントオプションをhaldaemonに教えてあげます。

以下のファイルを作成します。

[/usr/share/hal/fdi/95userpolicy/storage-policy.fdi]

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- -->
<!-- /usr/share/hal/fdi/95userpolicy/storage-policy.fdi -->

<deviceinfo version="0.2">

<device>

<match key="block.is_volume" bool="true">
<match key="volume.fsusage" string="filesystem">
<match key="volume.fstype" string="vfat">
<merge key="volume.policy.mount_option.user" type="bool">true</merge>
<merge key="volume.policy.mount_option.umask=000" type="bool">true</merge>
<match key="@block.storage_device:storage.bus" string="usb">
<merge key="volume.policy.mount_option.utf8" type="bool">true</merge>
<merge key="volume.policy.mount_option.codepage=932" type="bool">true</merge>
<merge key="volume.policy.mount_option.shortname=winnt" type="bool">true</merge>
</match>
</match>
</match>
</match>

</device>

このファイルを作成後にhaldaemonを起動する事により、/media/usbstorageが自動でマウントされます。

# /etc/init.d/haldaemon start
HAL デーモンを起動中:                                      [  OK  ]
# df /dev/sda1
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda1             80016224        32  80016192   1% /media/usbdisk

sambaのファイルをコピー

他のサーバで動作しているsambaの共有名毎にファイルを全てコピーしましょう。ポイントは単純なコピーではなく、タイムスタンプを元のファイルの時刻のままコピーするために、smbtarを利用します。

コピー元が\\kuro\degicameの場合以下のようにしてコピーを行います。

# cd /media/usbdisk
# mkdir degicame
# cd degicame
# smbtar -s kuro -x degicame -t -|tar xvf -

コピー中は「uid 0 gid 0 に所有者を変更できません: 許可されていない操作です」といったエラーがでますが、これはvfatのファイルシステムにuid,gidに対する操作が行えない為であり、特に気にしなくて大丈夫です。

sambaの具体的な設定は割愛しますが、これでLinux上からもWindows上からも正しく日本語が表示できるファイル名で保存が出来るようになります。

vfatファイルシステムの注意点

8.3形式のファイル名をリネーム(mv)するときに、大文字小文字を変更するだけの操作はエラーになります。ちょっとわかりにくいので具体例を以下に示します。

【通常のファイルシステムの場合】
# touch aaa.txt
# mv aaa.txt AAA.txt

【vfatのファイルシステムの場合】
# touch aaa.txt
# mv aaa.txt AAA.txt
mv: cannot move `aaa.txt' to `AAA.txt': ファイルが存在します

回避策としては、一旦aaa.txtをaaa_.txt等別の名前に変更後、AAA.txtに変更するしか無さそうです。

Linuxのコマンドラインでは上記のエラーがmv時に出ますが、sambaで共有した際にWindowsから名前を変更した場合は特にエラーにはなりませんが、ファイル名は変更されません。

自動マウントについて

自動マウントは本エントリではコンソールでgnomeが動作しているため、gnome-volume-managerがhaldからのイベントを受けて自動でマウントしてくれています。

完全にコンソールしか使わない人(init level 3の人)はUSBディスクを刺しても、haldaemonをrestartしても自動マウントはしてくれませんので、その場合は手動でマウントしてください。

投稿者 yotan : 2007年9月 2日 19:58| トラックバック(0)
アンケート
このエントリは・・・
とても役に立った
役に立った
どちらとも言えない
あまり役に立たなかった
全く役に立たなかった
コメント
コメントする

※コメント内にURLを書くとSPAM扱いとなります。2ch風に表記はOKです










名前、アドレスを登録しますか?