CentOS6.5 に USB の外付け HDD を接続してみた


## 接続する外付け HDD
今回使ったのは Elecom の USB バスパワータイプの以下の商品。
[商品の公式サイト](http://www.elecom.co.jp/seagate/expansion/)
もちろん CentOS 対応などとは書いてない、一般的に売られている Win/Mac/TV 用。
容量は 1TB のやつ(安くなったもんだ)。

## 前提、備考、そして注意
* **自己責任でお願いします**
* 途中で **データ消去** や **ディスクフォーマット** や **マウント/アンマウント** を行うので、取り扱いには十分気をつける
* OS は CentOS6.5 の 64bit 版で日本語表示
* sudo 実行権限を持ったユーザで行う想定 ( root で作業する場合は sudo を取り除いて実行)
* 組み合わせキーやエンターなどのキーを押す場合は [control + c] などと記述する
* 外付け HDD は、パーティションを分けずに丸ごと使う想定
* フォーマットは ext4 で行う ( ext3 など違うフォーマットにしたい場合は適当に読み替える)
* 実際に流れるログの記載やいちいち細かい確認しながらやるので、冗長な記事構成になってます

## 手順概要
1. 接続
1. フォーマット
1. マウント
1. 取り外し

## 1: 接続編

### デバイスを特定するための仕掛けをセットする
接続する前に、以下のコマンドを叩いておいてどういう名前でカーネルに認識されるか確認する。
`sudo tail -f /var/log/messages`

### USB を挿す
すると以下のようなログが流れる。


```
Nov 16 13:29:02 host-name kernel: usb 2-1.4: new high speed USB device number 3 using ehci_hcd
Nov 16 13:29:02 host-name kernel: usb 2-1.4: New USB device found, idVendor=0bc2, idProduct=2322
Nov 16 13:29:02 host-name kernel: usb 2-1.4: New USB device strings: Mfr=2, Product=3, SerialNumber=1
Nov 16 13:29:02 host-name kernel: usb 2-1.4: Product: Expansion
Nov 16 13:29:02 host-name kernel: usb 2-1.4: Manufacturer: Seagate
Nov 16 13:29:02 host-name kernel: usb 2-1.4: SerialNumber: 000000002AB97702
Nov 16 13:29:02 host-name kernel: usb 2-1.4: configuration #1 chosen from 1 choice
Nov 16 13:29:02 host-name kernel: Initializing USB Mass Storage driver...
Nov 16 13:29:02 host-name kernel: scsi6 : SCSI emulation for USB Mass Storage devices
Nov 16 13:29:02 host-name kernel: usbcore: registered new interface driver usb-storage
Nov 16 13:29:02 host-name kernel: USB Mass Storage support registered.
Nov 16 13:29:03 host-name kernel: scsi 6:0:0:0: Direct-Access     Seagate  Expansion        4B00 PQ: 0 ANSI: 6
Nov 16 13:29:03 host-name kernel: sd 6:0:0:0: Attached scsi generic sg3 type 0
Nov 16 13:29:05 host-name kernel: sd 6:0:0:0: [sdc] Spinning up disk.....ready
Nov 16 13:29:05 host-name kernel: sd 6:0:0:0: [sdc] 1953525167 512-byte logical blocks: (1.00 TB/931 GiB)
Nov 16 13:29:06 host-name kernel: sd 6:0:0:0: [sdc] Write Protect is off
Nov 16 13:29:06 host-name kernel: sd 6:0:0:0: [sdc] Assuming drive cache: write through
Nov 16 13:29:06 host-name kernel: sd 6:0:0:0: [sdc] Assuming drive cache: write through
Nov 16 13:29:06 host-name kernel: sdc: sdc1
Nov 16 13:29:06 host-name kernel: sd 6:0:0:0: [sdc] Assuming drive cache: write through
Nov 16 13:29:06 host-name kernel: sd 6:0:0:0: [sdc] Attached SCSI disk
```

[ ] で囲まれたのがデバイス名。
ここでは **[sdc]** となっているので、 `/dev/sdc/` として認識されている。

### ログ取得を終了する
`[control + c]` でログ垂れ流しモードを抜ける。

## 2: フォーマット編

### ディスクの状態を確認する
`sudo fdisk -l` コマンドを発行する。
以下のようなログが出力される(外付け HDD 以外の情報は割愛)。

```
(外付け HDD 以外の情報)

ディスク /dev/sdc: 1000.2 GB, 1000204885504 バイト
ヘッド 255, セクタ 63, シリンダ 121601
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0xdda28488

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdc1               1      121602   976759808    7  HPFS/NTFS
```

最後の行に書いてある `HPFS/NTFS` はファイルシステムが Win/Mac 向けのものという意味で、ここが Linux と書いてある場合は [3: マウント編](#3-マウント編)まで読み飛ばして構わない。

### HDD の中身を全消去する
もし大事なデータがある場合は事前に別なメディアに保存しておく。
`sudo fdisk /dev/sdc` コマンドを発行すると、以降対話モードで進行する。
押すキーだけ列挙すると、次のようになる。

* d
* w

```
警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): d
選択した領域 1

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```

### 領域を確保
対話モードは抜けているはずなので、もう一度同じコマンドを実行し、再度対話モードに入る。
`sudo fdisk /dev/sdc`
押すキーだけ列挙すると、次のようになる。

* n
* p
* 1
* [Enter]
* [Enter]
* p
* w


```
コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-121601, default 1): 
Using default value 1
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-121601, default 121601): 
Using default value 121601

コマンド (m でヘルプ): p

ディスク /dev/sdc: 1000.2 GB, 1000204885504 バイト
ヘッド 255, セクタ 63, シリンダ 121601
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0xdda28488

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdc1               1      121601   976760001   83  Linux

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```

* `最初 シリンダ (1-121601, default 1): ` となっているところは、　[Enter] もしくは `1` を押す。
* `Last シリンダ, +シリンダ数 or +size{K,M,G} (1-121601, default 121601):` となっているところは、今回はパーティションを分けずに丸ごと使うので、そのまま [Enter] を押す。

### 念のため同期
`sudo sync`

### ext4 でフォーマットする
`sudo mkfs.ext4 /dev/sdc1` コマンドを発行し、しばし待つ(1TB あるので数分程度かかる)。
フォーマット中は進行状況が分数の形式で表示されている。

```
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
61054976 inodes, 244190000 blocks
12209500 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
7453 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000, 214990848

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
```

## 3: マウント編

### マウントポイントとなるディレクトリを作成する
ここではディレクトリ名を `usb-hdd` とします。
`sudo mkdir /mnt/usb-hdd`

### マウントを実行する
`sudo mount -t ext4 /dev/sdc1 /mnt/usb-hdd`

### マウントされていることを確認する
`mount` コマンドを発行すると以下のようなログが出力される(外付け HDD 以外の情報は割愛)。

```
(外付け HDD 以外の情報)

/dev/sdc1 on /mnt/usb-hdd type ext4 (rw)
```

## 4: 取り外し編

### アンマウント
`umount /mnt/usb-hdd` を発行すると、特にログが出ずにアンマウントが実行される。

### 確認
`mount` コマンドを発行し、マウント確認時に出た表示がないことを確認する。

### 外付け HDD の取り外し
基本的にそのまま引っこ抜いて OK だと思う。
心配な人は USB を外すコマンドがあるので適当に調べる。

## 蛇足
実際の業務で外付け HDD にファイルをバックアップしなければならなくて、慎重にやったそのままコピペしてきたので洗練されてはいないと思う (ただの PHP プログラマになんてことをさせるんだ)。
マウントやフォーマットは VirtualBox などの仮想環境でも試せるので、未経験者はそちらで度胸をつけてみるのもアリかと。