Big Sector 問題とは? †
- 従来のディスクとファイルシステムの関係
- 物理的なディスクの区画である 1 Sector は 512 byte
- アプリケーションは、直にディスクを操作するのではなく、OS によって抽象化された Block 単位のファイルシステムを操作する。
- OS は、他に処理しなければならない処理との優先順位を勘案して、適宜 Block と Sector を同期させている
- Big Sector 問題
- TB 級のディスクが普通になってきた今日、1 Sector が 512 byte のままだと効率が悪い
- Sector数が多すぎて、Sector管理情報やエラー訂正符号だけで馬鹿にならない容量が必要
- そこで、500GB を超えるようなディスクでは、1 Sector が 4 KB (Big Sector) になっている。以下これを物理Sectorと呼ぶことにする
- しかし、今までのディスクとの互換性 (1 Sector = 512 byte) を保つために、HDDコントローラがエミュレーションを行い、OS には、1 Sector = 512 byte と見せかける仕組みが取り入れられている。以下これを論理Sectorと呼ぶことにする
- これで万事上手くいくはずだったが・・・IA(Intel Architecture)マシンの遠いご先祖である IBM-PC (1981) からの慣習により、通常データは HDD の 63 Sector から記録される。
- つまり、何も考えずに Big Sector ディスクを使うと、OS のブロックが、2 つの物理 Sector にまたがる事になる。アプリケーションがファイルシステム上の 1 block 書き換えたとき、2 つの物理セクタの書き換えが必要になる。
- Big Sector 対策
- Big Sector ディスクでは、パーティション境界の論理 Sector 番号を 8 の倍数にしてやらないと性能が出ない
- つまり、パーティション境界を物理 Sector 境界と同じにしてやる必要がある。
- 残念ながら CentOS のインストーラでバーティション分割をするときには Sector 番号を指定できないので、OS のインストール前に USB-Ubuntu でパーティション分割をしておく必要がある
USB-Ubuntu の作成 †
- http://www.ubuntulinux.jp/ よりデスクトップ版の ISO イメージをダウンロードする
- インストール CD を起動する。USB-Ubuntu を作るためには、インストールしてもいいし、インストールせずにお試し起動でもいい。
- [System]-[Administration]-[Startup Disk Creator] で USB 起動イメージを作る。
CentOSのUSBインストーラ作成 †
- USBメモリスティックを Unmount して、MBR を破壊する
$ umount /media/CDEE-AAEE
$ sudo dd if=/dev/zero of=/dev/sdb bs=512 count=64
64+0 records in
64+0 records out
32768 bytes (33 kB) copied, 0.0760476 s, 431 kB/s
- fdisk でパーティションを作る
/media$ sudo fdisk /dev/sdb
- 現在の状態を確認
Command (m for help): p
Disk /dev/sdb: 4040 MB, 4040724480 bytes
125 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 7750 * 512 = 3968000 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd309dcf3
Device Boot Start End Blocks Id System
- 必要があればパーティションを削除
Command (m for help): d
No partition is defined yet!
- パーティションの作成
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1018, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1018, default 1018):
Using default value 1018
- 第1パーティションをブート領域にする
Command (m for help): a
Partition number (1-4): 1
- 現在の設定状況を確認
Command (m for help): p
Disk /dev/sdb: 4040 MB, 4040724480 bytes
125 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 7750 * 512 = 3968000 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd309dcf3
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 1018 3944719 83 Linux
- 変更結果の反映
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
ubuntu:/media$
- FAT32でフォーマット
$ sudo mkfs.vfat /dev/sdb1
mkfs.vfat 3.0.7 (24 Dec 2009)
- SYSLINUX のインストール
$ sudo syslinux /dev/sdb1
- ブートストラップのインストール
$ wget http://prdownloads.sourceforge.net/ms-sys/ms-sys-2.2.0.tar.gz?download
$ sudo apt-get install gettext
$ tar -xzf ms-sys-2.2.0.tar.gz
$ cd ms-sys-2.2.0/
$ make
$ sudo make install
$ sudo ms-sys -s /dev/sdb
Public domain syslinux master boot record successfully written to /dev/sdb
- gettext をインストールしているのは、ms-sys がメッセージを翻訳するときに msgfmt が必要なため。
- Ubuntu にこのパッケージがないのは、著作権がグレーなため (Microsoft の持つ DOS や WindowsNT のブートストラップの権利を侵害している可能性アリ)
- ネットワークインストールイメージの格納
- ISO ファイルの取得
$ wget http://ftp.jaist.ac.jp/pub/Linux/CentOS/5.5/isos/i386/CentOS-5.5-i386-netinstall.iso
- ISO ファイルを USB メモリにコピー
$ sudo cp CentOS-5.5-i386-netinstall.iso /media/30A4-553A/
- インストール CD の /isolinux 以下を USB の / にコピーする (/boot でもいいらしい)
$ sudo mkdir /media/iso
$ sudo mount -t iso9660 -o loop,ro CentOS-5.5-i386-netinstall.iso /media/iso
$ sudo cp /media/iso/isolinux/* /media/30A4-553A/
- isolinux.cfg を syslinux.cfg に変更
$ cd /media/30A4-553A/
$ mv isolinux.cfg syslinux.cfg
パーティション分割 †
- USB Ubuntu でマシンを起動して fdisk でディスクのパーティションを切る
- (下の操作例は VMWare Fusion 上の仮想マシンで行った練習です)
まずは、容量ベースでパーティションを切った場合に、パーティション境界がどうなるのかを試してみる †
- /boot には、128MB
ubuntu@ubuntu:~$ sudo fdisk /dev/sda
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-2610, 初期値 1):
初期値 1 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-2610, 初期値 2610): +128M
- swap に 1GB
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本パーティション (1-4)
p
パーティション番号 (1-4): 2
最初 シリンダ (18-2610, 初期値 18):
初期値 18 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (18-2610, 初期値 2610): +1G
- 残りは / に全部
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本パーティション (1-4)
p
パーティション番号 (1-4): 3
最初 シリンダ (150-2610, 初期値 150):
初期値 150 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (150-2610, 初期値 2610):
初期値 2610 を使います
- エキスパートモードに切り替えてパーティションテーブルを見ると、パーティション境界のセクタ番号は当然のことながら 8 の倍数になってない
コマンド (m でヘルプ): x
上級者コマンド (m でヘルプ): p
ディスク /dev/sda: ヘッド 255, セクタ 63, シリンダ 2610
Nr AF Hd Sec Cyl Hd Sec Cyl 開始 サイズ ID
1 00 1 1 0 254 63 16 63 273042 83
2 00 0 1 17 254 63 148 273105 2120580 83
3 00 0 1 149 254 63 1023 2393685 39535965 83
4 00 0 0 0 0 0 0 0 0 00
- このパーティション境界を参考に、次回セクタ指定でパーティションを切る。fdisk は、w ではなく q で終了する(実際に HDD に変更内容を反映せずに終わる)
上級者コマンド (m でヘルプ): q
セクタ指定でパーティションを分割する †
- パーティションの開始セクタが 8 の倍数になるように、パーティションを分割する。1000 = 8 x 125 なので、下3桁が 000 な数は 8 の倍数。
- uオプション付きで fdisk を起動すると、セクタでパーティションを分割できる
ubuntu@ubuntu:~$ sudo fdisk /dev/sda -u
- /boot 用に 64 セクタ目から、大体 273105 セクタ近辺をパーティション1として確保
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 セクタ (63-41943039, 初期値 63): 64
Last セクタ, +セクタ数 or +size{K,M,G} (64-41943039, 初期値 41943039): 272999
- swap 用に 273000 セクタ目から、大体 2393685 セクタ近辺をパーティション2として確保
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本パーティション (1-4)
p
パーティション番号 (1-4): 2
最初 セクタ (63-41943039, 初期値 63): 273000
Last セクタ, +セクタ数 or +size{K,M,G} (273000-41943039, 初期値 41943039): 2120999
- / 用に 2121000 から最後のセクタまでを確保
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本パーティション (1-4)
p
パーティション番号 (1-4): 3
最初 セクタ (63-41943039, 初期値 63): 2121000
Last セクタ, +セクタ数 or +size{K,M,G} (2121000-41943039, 初期値 41943039):
初期値 41943039 を使います
- 確認
コマンド (m でヘルプ): p
ディスク /dev/sda: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610, 合計 41943040 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0a99868b
デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 64 272999 136468 83 Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sda2 273000 2120999 924000 83 Linux
パーティション 2 は、シリンダ境界で終わっていません。
/dev/sda3 2121000 41943039 19911020 83 Linux
- シリンダ境界云々という警告が出ているけど、CHS(Cylinder/Head/Sector) の三次元的な位置が物理的な円盤(disc)の場所を示していたのははるか昔のことなので無視。(下位互換のために残されている機能。CHS では、512MB までしか表せない)
- ATA規格(SCSIは昔から)で、論理的なセクタ番号 LBA(Logical Block Addressing) で、ディスク上の位置示すようになった
- 今回、BigSector? で、さらに LBA をごまかそうという話になっている。
- パーティションテーブルへ実際に設定内容を書き込む
コマンド (m でヘルプ): w
パーティションテーブルは変更されました!
ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
で、どーなった? †
ubuntu@ubuntu:~$ sudo fdisk -l /dev/sda
ディスク /dev/sda: 21.5 GB, 21474836480 バイト
ヘッド 255, セクタ 63, シリンダ 2610
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0a99868b
デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 1 17 136468 83 Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sda2 17 133 924000 83 Linux
パーティション 2 は、シリンダ境界で終わっていません。
/dev/sda3 133 2611 19911020 83 Linux
ubuntu@ubuntu:~$ sudo fdisk -l /dev/sda1
ディスク /dev/sda1: 139 MB, 139743232 バイト
ヘッド 255, セクタ 63, シリンダ 16
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000
ディスク /dev/sda1 は正常なパーティションテーブルを含んでいません
ubuntu@ubuntu:~$ sudo fdisk -l /dev/sda2
ディスク /dev/sda2: 946 MB, 946176000 バイト
ヘッド 255, セクタ 63, シリンダ 115
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000
ディスク /dev/sda2 は正常なパーティションテーブルを含んでいません
ubuntu@ubuntu:~$ sudo fdisk -l /dev/sda3
ディスク /dev/sda3: 20.4 GB, 20388884480 バイト
ヘッド 255, セクタ 63, シリンダ 2478
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000
ディスク /dev/sda3 は正常なパーティションテーブルを含んでいません
ubuntu@ubuntu:~$
CentOSのインストール †
- USB Ubuntu で本番機のパーティション分割。結局こうしました
パーティション | 開始 | 終了 |
/dev/sda1 | 64 | 255999 |
/dev/sda2 | 256000 | 2559999 |
/dev/sda3 | 2560000 | 最後まで |
- USB Ubuntu をシャットダウンして USB Cent OS に差し替えて起動
- インストール自体は普通の network install
- 最初はテキストモードで立ち上がる
- 配布元を指定してしばらくするとグラフィックインストールに移行
ftp.jaist.ac.jp |
/pub/Linux/CentOS/5.5/os/i386 |
- 注意
なんかメッチャ遅いんですが・・・ †
- 2MB/sec とかありえへん
# /sbin/hdparm -Tt /dev/hda
/dev/hda:
Timing cached reads: 1848 MB in 2.00 seconds = 922.70 MB/sec
Timing buffered disk reads: 8 MB in 3.72 seconds = 2.15 MB/sec
- DMA モードも on にできない・・・
# /sbin/hdparm -d1 /dev/hda
/dev/hda:
setting using_dma to 1 (on)
HDIO_SET_DMA failed: Operation not permitted
using_dma = 0 (off)
- どうやら SATA なのに /dev/sda ではなく /dev/hda として認識されている模様。
- Linux Kernel 2.6.30 にすればいいらしい (Cent OS は、Kernel 2.6.18)
ということで Fedora 13 にする †
- Ubuntu 10.4
- Kernel 2.6.31
- Big Sector 対策済み
- Ubuntu から VM を立ち上げて Cent OS のサーバを立ち上げるという手もあるが・・・さすがに非力なマシン(Atom 1.6GHz / Mem 1GB)なんで無理かな
- Desktopは非常に良くできていて入門書不要。しかし、Server運用の関連書籍がないので今回はパス (たぶん、Debian になれた人ならちょちょいと行くんだろうけど、Redhat 系で育った軟弱者なので・・・)
- Fedora 13
Fedora 13 Server