HDDをext3でフォーマットする方法

UbuntuOSにUSB経由などで外付けのHDDを接続するとWIndowsやMachintoshと何ら変わりのない感じで自動的にマウントしてくれます。そのHDDにいろいろとファイルを保存していたら結構問題が起きます。なんと、Ubuntu/DebianにはUnix特有のパーミッションとオーナーがあるのでした。WindowsやMac(最近のMacはUnixベースですが...)には、そのような概念がないのでファイルをそのままコピーし保存してくれますが、Ubuntuはきちんとフォーマットしないとファイルが結構むちゃくちゃになります。特にパーミッションとオーナーはおかしなことになります。
 通常電気量販店などからHDDを購入するとFAT32やNTFSでフォーマットされています。これはUbuntu/Debianと相性が悪い。なのでext3にフォーマットしておきます。これだったらコピーしてもパーミッションとオーナーが綺麗にそのままコピーされます。逆にext3フォーマットのHDDはWindowsやMacで認識されるか?というときちんと認識されマウントされるので心配ご無用。

ext3フォーマットの準備

 マシンにフォーマットをかけたい外付けHDDをマウントします。Ubuntuでは/media/以下に自動的にマウントされます。またデスクトップを使用している場合は自動的にアイコンが出てきます。
drwx------ 9 user user 32768 1970-01-01 09:00 HD-HBU2
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 6 root   root    4096 2009-12-02 06:36 disk
目的のHDDがHD-HBU2として認識されているのがわかると思います。しかし通常の作業ではこのパスから作業できるのですが、実体は/dev以下のディバイスファイル内にあります。この実体のファイルからのシンボリックリンクとして/media/以下にマウントされる...という形式をとっています。ですので、本物のパスは、fdiskコマンドで確かめます。(このコマンドは本来、パーテーションを作るコマンドです。)
# fdisk -lu
マウントされているDiskが表示されます。
ディスク /dev/sda: 250.1 GB, 250059350016 バイト ←これがシステムのHDD
ヘッド 255, セクタ 63, シリンダ 30401
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
Disk identifier: 0xffffffff

デバイス ブート     始点        終点    ブロック   Id システム
/dev/sda1   *           1       30028   241199878+  83  Linux
/dev/sda2           30029       30401     2996122+   5  拡張領域
/dev/sda5           30029       30401     2996091   82  Linux スワップ / Solaris

ディスク /dev/sdb: 120.1 GB, 120060444672 バイト ←これがBackUp用のHDD
ヘッド 255, セクタ 63, シリンダ 14596
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
Disk identifier: 0xdc51853a

デバイス ブート     始点        終点    ブロック   Id システム
/dev/sdb1               1       14596   117242338+  83  Linux

ディスク /dev/sdd: 300.1 GB, 300090728448 バイト ←これがext3フォーマットするHDD
ヘッド 255, セクタ 63, シリンダ 36483
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
Disk identifier: 0x338c853f

デバイス ブート     始点        終点    ブロック   Id システム
/dev/sdd1               1       36483   293049666    c  W95 FAT32 (LBA)
このような表示になるので該当のDISKを探します。フォーマットし直すディスクはFAT32となっているのですぐにわかります。/dev/sddがHDDの実体です。
 /dev/sddと/dev/sdd1の関係はいわゆるパーテーションです。Linuxではシリンダというのかもしれません。要するにHDDをいくつかに区切って使うというやり方です。特に必要のない場合はパーテーションがいらないので、/dev/sddに1つのシリンダがある(パーテーションがない)ということになるので、sddに対してsdd1が1つだ存在することになります。用途によってパーテーションを設定するとsdd2というように領域を別途確保できます。ここでは面倒なので特にパーテーションは区切りません。
 先の/media/HD-HBU2の正体は、sddなのか、sdd1なのかというと以下のコマンドで確かめられます。
# df -m /dev/sdd
ファイルシステム           1M-ブロック    使用   使用可 使用% マウント位置
udev                       497         1       497   1% /dev
# df -m /dev/sdd1
ファイルシステム           1M-ブロック    使用   使用可 使用% マウント位置
/dev/sdd1               286112       248    285864   1% /media/HD-HBU2
マウント位置が表示されている方が実体ということになるので/dev/sdd1 => /media/HD-HBU2というわけです。フォーマットの対象はHDD全体なのでsddを対象にします。
 実際にフォーマットをかける前にマウントされている/dev/sdd1をアンマウントしておきます。

パーテーションを仕切り直す

 前述の通りパーテーションを仕切り直すのではなくパーテーションを無くして1つのHDDにするというのが正しい表現です。fdiskコマンドで/dev/sddに入ります。

1. fdiskコマンドで対象ディバイスに入る
# fdisk /dev/sdd
このディスクのシリンダ数は 36483 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
コマンド (m でヘルプ):
という状態になってfdiskコマンドにログインしたような形になります。(この意味不明なメッセージは歴史的な経緯があって今も尚残っていますが意味がないので無視してください。)

2. 現状を確認する
 ディスクの現在の状況を確認しておきます。続けてpを入力します。
...
コマンド (m でヘルプ):p
ディスク /dev/sdd: 300.1 GB, 300090728448 バイト
ヘッド 255, セクタ 63, シリンダ 36483
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
Disk identifier: 0x338c853f

デバイス ブート     始点        終点    ブロック   Id システム
/dev/sdd1               1       36483   293049666    c  W95 FAT32 (LBA)
※ちなみにこの状態だとパーテーション削除も何もないんですが、一応例としてfdiskで操作します。

3. パーテンションを削除する
 続けてパーテーションを削除します。dを入力します。
...
コマンド (m でヘルプ):p
選択した領域 1
 Linuxのマシンではパーテーションを4つまでしか設定できません。(実際は4つのうちの1つをまた4つに区切ることができるのでほぼ無数にパーテーションを設定できます。)ここではパーテーションを削除したので選択した領域は1となります。

4. 新規でパーテーションを作成する
 続けてnを入力して新しくパーテーションを作ります。
コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
となりますので、基本領域を選ぶためにpを入力します。
p
領域番号 (1-4):
基本領域に1を選びます。

領域番号 (1-4): 1
最初 シリンダ (1-36483, 初期値 1):
シリンダー領域を訊かれるので最初の値1を入力します。
最初 シリンダ (1-36483, 初期値 1): 1
続けてシリンダーの最終値を訊かれるので、最大の値(ここでは36483)を入力します。
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-36483, 初期値 36483):36483


5. 設定の確認

 最後にpコマンドを入力して設定が反映されているかどうかを確認します。
コマンド (m でヘルプ): p

ディスク /dev/sdd: 300.1 GB, 300090728448 バイト
ヘッド 255, セクタ 63, シリンダ 36483
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
Disk identifier: 0x338c853f

デバイス ブート     始点        終点    ブロック   Id システム
/dev/sdd1               1       36483   293049666   83  Linux
sdd1の領域とsddの領域が同じ(つまりパーテーションがない)状態になっているのでこれで大丈夫です。

6. ディスクに書き込む
 最後にこれまでの設定を反映させるためにディスクに書き込みます。wを入力します。
コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
これでパーテーションの初期化は完了です。

稀にですが以下のようなWARNINGがでることがあります。
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

この際は一度再起動すると新しいテーブルが使えるようになるみたいなこと書いてあるので再起動してからフォーマットします。

ext3にフォーマットする

# mkfs.ext3 /dev/sdd1
HDDの容量にもよりますが、やや時間がかかります。完了したらきちんとフォーマットされたか確認してみます。
# fdisk /dev/sdd  ←fdiskコマンドで対象のデバイス選択

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

コマンド (m でヘルプ): p  ←pで現状確認

ディスク /dev/sdd: 300.1 GB, 300090728448 バイト
ヘッド 255, セクタ 63, シリンダ 36483
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
Disk identifier: 0x338c853f

デバイス ブート     始点        終点    ブロック   Id システム
/dev/sdd1               1       36483   293049666   83  Linux ←ext3
システムがLinuxになっていればOKです。
Ubuntuでは、GUIからもWindowsOSのようにフォーマットが可能です。デスクトップに現れたアイコンを右クリックしてからメニュー内の「フォーマット」から可能です。
 またデフォルトではUSB接続のHDDのマウントポジションがその都度変化します。これは複数のデバイスを抜き差しすると固定したポジションでは効率がよくないからです。つけっぱなしの外付けHDDの場合は再起動の度にマウントポジションは固定したままの方がいいので、マウントポジションの固定をした方がいいですよ。