USB外部メディア(外部ストレージ)の読み込み

外部メディアの読み込み構成

 USBに外付けHDDやフラッシュメモリなど差し込むとUbuntuでは自動的に認識してくれます。(これはWindowsOSやMachintoshOSと殆ど同じです。)GUIで使用しているときには問題がありませんが、コマンドラインから外部ディバイスを認識するには少しばかり困ったことがあります。外部メディア(外部ストレージとか外部ディバイスとかいいますが...)は、読み込むたびに違ったファイル名で認識されるということです。
 システムの説明をすると、USBから認識された外部メディアは、/media/以下にデバイスファイルとして認識します。その他のディレクトリと同様に操作が可能であり、ディレクトリとファイルが通常の構成と同じように並んでいる筈です。しかし、この外部メディアは本来は、/dev/以下に認識され、その仮想ディレクトリとして/media/に認識されているわけです。つまり/media/xxxxというディレクトリを削除しても/dev/以下で認識されていれば「仮想的に削除した」というだけであって本来のデータを根こそぎ削除したことにはなりません。逆に/dev/以下を削除(アンマウント)するとシステムがHDDやフラッシュメモリなどを認識しないことになります。
 USBに外付けHDDやフラッシュメモリを差し込むと自動的に認識しますが、/dev/以下でどのファイルが外部メディアなのかを確認してみます。
# fdisk -lu

ディスク /dev/sda: 250.1 GB, 250059350016 バイト
ヘッド 255, セクタ 63, シリンダ 30401, 合計 488397168 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
Disk identifier: 0xffffffff

デバイス ブート     始点        終点    ブロック   Id システム
/dev/sda1   *          63   482399819   241199878+  83  Linux ←メインのHDD
/dev/sda2       482399820   488392064     2996122+   5  拡張領域
/dev/sda5       482399883   488392064     2996091   82  Linux スワップ / Solaris

ディスク /dev/sdb: 120.1 GB, 120060444672 バイト
ヘッド 255, セクタ 63, シリンダ 14596, 合計 234493056 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
Disk identifier: 0xdc51853a

デバイス ブート     始点        終点    ブロック   Id システム
/dev/sdb1              63   234484739   117242338+  83  Linux ←外付けHDD
 以上の結果はUbuntuのシステムが直接使用しているHDDが/dev/sdaとして読み込まれ、そのパーテンションや同系列のHDDなどが/dev/sda1という風に番号が振られて認識されているのがわかります。外付けのHDDメディアは/dev/sdbとなっていて同様に番号が振られています。これらのファイルはメディアの実体そのもの(というと語弊があるのですが...)なので、開いて見たりすることはできません。これらのを開いてみるには外部メディアの場合は、/media/以下に仮想的に認識されるという具合になっています。
root@lily:/media# ls -l
合計 8
drwxr-xr-x 2 root root 4096 2009-11-13 20:33 b82de5c3-2a78-412e-860e-372279329722
lrwxrwxrwx 1 root root    6 2009-06-24 23:31 cdrom -> cdrom0
drwxr-xr-x 2 root root 4096 2009-06-24 23:31 cdrom0
 何やらわけのわからない名称で認識されています。USBを抜き差ししたりシステムを再起動したりしているうちにこの認識名が変わってしまうことがあります。外付けのHDDに自動的にバックアップなどをとっていたりするとかなり面倒なことになります。


外部メディアのマウントポジションを固定する

 そんなわけで外部メディアのマウントポジション(読み込み先)を固定することができます。つまり、実体として読み込まれたディバイス(/dev/sdb1)を自分の読み込みたい場所に仮想的に配置するということです。上記の通り自動認識においては/media/以下に配置されますが、そのディレクトリを自由に設定できるわけです。ディバイス名もb82de5c3-2a78-412e-8...と意味不明なものになってしまっている(意味はあって、これは認識のIDなのですが...)ので、この名称も固定できます。ディバイスの読み込みを固定するには/etc/fstabがファイルに読み込んだディバイスを指定のディレクトリにマウントします。/etc/fstabを開いて編集します。
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
# /dev/sda1
UUID=84dbafa1-4963-4375-a31e-c597f3f5b7e4 /               ext3    relatime,errors=remount-ro 0       1
# /dev/sda5
UUID=f2f81b8c-824a-68b3-89db-5c3506bd47f0 none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0
 デフォルトではこんな状態になっています。順番に<マウントするブロックディバイスやラベル>、<マウントポイント>、<ファイルシステムの種類>、<マウント時のオプション>、<dumpの必要性>、<fsckでシステム起動時にチャックを行うかどうか>をタブで区切って記述してあります。インストールの方法やHDDのマウントの状態によって皆様それぞれ違うと思いますが、このフォーマットにしたがって外部メディアのマウントポジションを指定すればよいわけです。
...(省略)
# /dev/sda5
UUID=f2f81b8c-824a-68b3-89db-5c3506bd47f0 none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0

# 外付けHDDのmount pointを指定する
/dev/sdb1    /media/disk    ext3    defaults    0    0

 先の/dev/sdb1を/media/diskとして認識するように記述します。UbuntuではHDDなどのメディアのフォーマットはext3がよいのでそれを指定します。(あらかじめフォーマットしておくとよいです。)その他の設定は上記の例と同様で構いません。記述してから保存してファイルを閉じます。
 このファイルの設定を反映させるには、
# mount -a
という風にaオプションをつけて実行します。/media/を開いて見てみると、
drwxr-xr-x 3 root root 4096 2009-11-30 15:54 b82de5c3-2a78-412e-860e-372279329722
lrwxrwxrwx 1 root root    6 2009-06-24 23:31 cdrom -> cdrom0
drwxr-xr-x 2 root root 4096 2009-06-24 23:31 cdrom0
drwxr-xr-x 3 root root 4096 2009-11-30 15:54 disk
となっていて/media/diskで認識されているのがわかります。これでこの指定のポジションからいつでも外部メディアへ読み書きができます。(ちなみにb82de5c3-2a7...というメディアは実態が/dev/sdb1ので/media/sdb1と全く同じものになります。しかしその都度名称が変わってしまう可能性があるので無視して構いません。)

※後日確認してみたら、b82de5c3-2a7..は読み込まれなくなっていました。

うまくマウントできない場合

 USBデバイスの抜き差しのタイミングによってはうまくマウントポジションを固定できない場合があります。さもすればroot権限のみでマウントが可能でその他のユーザーでは不可能になっている可能性もあります。以下のことをやってみてください。

USBを差したままRebootをかける。
起動後に自動的に認識していなかったら、mount -aコマンドで現在接続されているデバイスを一括マウントしてみる。
それでも駄目で、「マウントポジションがありません。」と叱られたら、
マウントポジションにディレクトリを手動で作ってみてください。
再びmount -aでマウントしてみます。

Rebootすると自動的に認識(乃至、不認識)してくれるので、その状況を確かめてみます。たいていはマウントポジションがどういうわけか自動的に作成されないというのが原因だったります。

fstabを設定後に全く認識されない(自動的にマウントされない)ということがありましたら、マウントポジションにディレクトリを作成しているかどうかを確かめてください。(私自身がこれに一度ハマリました!)例えば、/dev/sdb1を/media/usb_hddに固定マウントさせたい場合は、あらかじめ/media/usb_hddというディレクトリを作成しておく必要があります。(当たり前といえば当たり前。)fstabで指定したディレクトリはディレクトリを作成してくれませんのでご注意。またそこで作成したディレクトリは所有者とパーミッションを的確に指定しておく必要があります。root:root [755]などで作成すると当然のことながらroot権限でないと書き込みができなくなります。通常の所有者とパーミッションと同様なのでご注意。








プロフィール



  • Name :: 山上オサム ♂(37)
  • Hobby :: 武術
  • Work :: Web Designer