SFDISK(8) | Linux Programmer's Manual | SFDISK(8) |
名前
sfdisk - Linux 用のパーティションテーブル操作ツール書式
sfdisk [options] device説明
sfdisk には (主に) 4 つの使用法があり、パーティションサイズの一覧・デバイス上のパーティションの一覧・デバイス上のパーティションのチェック・デバイスのパーティション再分割 (これは非常に危険) ができる。サイズの一覧
sfdisk -s partition とすると partition のサイズをブロック単位で表示する。この使用法は mkswap のようなプログラムと共に使う場合に便利である。ここで、 partition は、普通 /dev/hda1 や /dev/sdb12 のようにするが、 /dev/xda のようにディスク全体でもよい。% sfdisk -s /dev/hda9
81599
%
% sfdisk -s
/dev/hda: 208896
/dev/hdb: 1025136
/dev/hdc: 1031063
/dev/sda: 8877895
/dev/sdb: 1758927
合計: 12901917 ブロック
%
パーティションの一覧
第 2 の呼び出し形式: sfdisk -l [options] device はデバイス上のパーティションをリストする。デバイス引き数が省略された場合、全てのハードディスク上のパーティションがリストされる。% sfdisk -l /dev/hdc
ディスク /dev/hdc: ヘッド数 16、セクタ数 63、シリンダ数 2045
ユニット = 516096 バイトのシリンダ、1024 バイトのブロック、0 から数えます
デバイスブート始点 終点 #シリンダ #ブロック ID システム
/dev/hdc1 0+ 406 407- 205096+ 83 Linux native
/dev/hdc2 407 813 407 205128 83 Linux native
/dev/hdc3 814 2044 1231 620424 83 Linux native
/dev/hdc4 0 - 0 0 0 空
%
数字の後ろに付いた-と + 符号は、丸めが行われており、本当の値は多少小さい (大きい) ことを示す。正確な値を知るためには、セクタを単位としてリストすればよい。
パーティションのチェック
第 3 の呼び出し形式: sfdisk -V device は device 上のパーティションテーブルに対していろいろな整合性チェックを適用する。 `OK' または問題点が表示される。-V オプションは-l と一緒に使うことができる。シェルスクリプトから使う場合は sfdisk -V -q device とすればステータスのみを返すこともできる。パーティションの作成
第 4 の呼び出し形式: sfdisk device を用いると、 sfdisk は device 用のパーティション分割指定を標準入力から読み込み、そのディスクのパーティションテーブルを変更する。よって、 sfdisk をシェルスクリプトから使うことができる。 sfdisk が標準入力を端末と認識した場合は、対話的な動作に入る。それ以外の場合は、何らかのエラーでアボート (abort) する。特に注意 - 1 つ打ち間違えるだけで全てのデータが失われる
予防措置として、 sfdisk で変更されるセクタを保存することができる:
% sfdisk /dev/hdd -O hdd-partition-sectors.save
...
%
こうすれば、(ディスクに何かを書き込む前なら) 何か馬鹿な間違いに気付いた場合に、以下のようにして以前の状態に戻すことができる。
% sfdisk /dev/hdd -I hdd-partition-sectors.save
%
(これは以前のパーティションテーブルを保存するのとは異なる: 以前のパーティションテーブルは-d オプションを使えば可読な形式で保存できる。しかし、論理パーティションを作成した場合、それを記述するセクタはディスクのどこかにあり、以前のパーティションテーブルの一部ではないセクタに置かれる可能性もある。よって、-O オプションで保存される情報は、-d の出力のバイナリ版ではない。)
多くのオプションがある。
オプション
- -v または --version
- sfdisk のバージョン番号を表示して、すぐに終了する。
- -? または --help
- 使用法のメッセージを表示して、すぐに終了する。
- -T または --list-types
- 認識されたタイプ (システム ID) を表示する。
- -s または --show-size
- パーティションのサイズをリストする。
- -g または --show-geometry
- 指定されたディスクに関するカーネルのジオメトリ情報をリストする。
- -G または --show-pt-geometry
- 指定されたディスクに関するカーネルのジオメトリ情報を、パーティションテーブルを見て推測し、リストする。
- -l または --list
- デバイスのパーティションをリストする。
- -d
-
sfdisk の入力として使えるフォーマットで、デバイスのパーティションをダンプする。例えば、
% sfdisk -d /dev/hda > hda.out
% sfdisk /dev/hda < hda.out
は (OS/2 の fdisk が作った) 不正な最後の拡張パーティションを修正する。
- -V または --verify
- パーティションが正しいかをテストする (上記を参照)。
- -i または --increment
- シリンダ数を 0 ではなく 1 から数える。
- -N number
-
指定された 1 つのパーティションだけを変更する。例えば、
% sfdisk /dev/hdb -N5
,,,*
%
は /dev/hdb の第 5 パーティションをブート可能 (`アクティブ') にして、他は変更しない (多分、この第 5 パーティションは /dev/hdb5 と呼ばれるが、 `/my_equipment/disks/2/5' のような別の名前で呼ぶのも自由である)。
- -A number
- 指定したパーティション (複数でもよい) をアクティブにして、他のパーティションを非アクティブにする。
- -c または --id number [Id]
-
引き数 Id が指定されない場合: 指定されたパーティションの ID を表示する。引き数 Id が指定されている場合: 指定されたパーティションのタイプ (ID) を与えられた値に変更する。このオプションには--print-id と--change-id という非常に長い形式がある。例を示す:
% sfdisk --print-id /dev/hdb 5
6
% sfdisk --change-id /dev/hdb 5 83
OK
最初に /dev/hdb5 が ID 6 であることを表示させ、次に ID を 83 に変更している。
- -uS または -uB または -uC または -uM
- セクタ単位 (ブロック単位・シリンダ単位・メガバイト単位) の数値を受け付け・表示する。少なくともジオメトリが分かる場合、デフォルトはシリンダ単位である。
- -x または --show-extended
- 基本パーティションでない拡張パーティションも出力にリストする。またそれらに対するパーティション設定を入力で受け付ける。
- -C cylinders
- シリンダ数を指定する。カーネルが想定している値を上書きできる。
- -H heads
- ヘッド数を指定する。カーネルが想定している値を上書きできる。
- -S sectors
- セクタ数を指定する。カーネルが想定している値を上書きできる。
- -f または --force
- たとえ馬鹿げたことであっても、指示したことを行わせる。
- -q または --quiet
- 警告メッセージを表示しない。
- -L または --Linux
- Linux に関連しない警告を出さない。
- -D または --DOS
- DOS との互換性のために、いくらかの領域を無駄にする (より正確には: あるパーティションがデバイスの MBR だったり、拡張パーティション用のパーティションテーブルを含んでいたりしてセクタ 0 を持つことができない場合、通常 sfdisk は次のセクタからパーティションを開始する。しかしこのオプションを指定すると、デフォルトで次のトラックにスキップしてからパーティションを開始する。例えば 34 セクタ/トラックの場合なら、 33 セクタが無駄になる。これは、あるバージョンの DOS が行う動作と同じである)。ある種のディスクマネージャとブートローダ (OSBS などのことで、LILO や OS/2 ブートマネージャは含まれない) はこの空き領域に置かれるので、これらを使う場合には、このオプションが必要かもしれない。
- -E または --DOS-extended
- 「内側」の拡張パーティションの開始セクタ番号を、 (Linux のように) 「外側」の拡張パーティションの開始セクタからの相対位置として取得せず、 (DOS のあるバージョンのように) 開始シリンタ境界からの相対位置として取得する。 (ここに違いがあるということは、もし DOS と Linux がパーティションテーブルを同じ方法で解釈していれば、拡張パーティションを常にシリンダ境界から始めなければならない、ということを意味する。もちろん、どこにシリンダ境界があるかは、 DOS がディスクに対してどのようなジオメトリを使うかを知っていなければわからない。)
- --IBM または --leave-last
- IBM のある診断プログラムは、最後のシリンダをディスクチェックの目的で使用する。もし、このようなプログラムを実行することがあるなら、 sfdisk に対して最後のシリンダを割り当てさせないように、このオプションを使うこと。最後のシリンダに不正なセクタテーブルが含まれていることが時々ある。
- -n
- 全ての動作を通して実行するが、実際にはディスクに書き込まない。
- -R
- (カーネルにパーティションテーブルを再び読み込ませるために) BLKRRPART ioctl のみを実行する。最後の BLKRRPART が成功するかを前もってチェックするのに役立つ。また (例えばバックアップから dd を使って) 「手動で」パーティションテーブルを変更した場合などにも役立つ。カーネルが (`device busy for revalidation (usage = 2)') という警告を出した場合は、デバイスがまだ使われており、ファイルシステムをアンマウントすべきである。あるいはスワップパーティションなら swapoff を実行すべきである。
- --no-reread
- ディスクのパーティション再分割を始めると、 sfdisk はディスクがマウントされていないか、またはスワップデバイスとして使われていないかをチェックする。使われている場合には、続行を拒否する。このオプションを指定すると、このチェックを行わない。 (一方で、-f オプションは sfdisk に対してテストが失敗した場合でも強制的に続行させる。)
- -O file
- 新しいパーティションを書き込む直前に、上書きされるセクタを file に出力する ( file は、他のディスクやフロッピーにある方が良い)。
- -I file
-
不適切な
sfdisk コマンドでファイルシステムを壊してしまった後でも以前の状態に回復できる。これは-O フラグを使って以前の状態を保存してある場合にのみ可能である。
理論
ディスクのブロック 0 (マスターブートレコード) には、他に 4 つのパーティションディスクリプタがある。ここで説明するパーティションは 基本 パーティションと呼ばれる。パーティションディスクリプタには 6 つのフィールドがある:
unsigned char bootable; /* 0 または 0x80 */
hsc begin_hsc;
unsigned char id;
hsc end_hsc;
unsigned int starting_sector;
unsigned int nr_of_sectors;
}
2 つの hsc フィールドは、最初と最後のパーティションのヘッド・セクタ・シリンダを示す。各 hsc フィールドは 3 バイトしかないので、 24 ビットしか使用できず、大きなディスク (つまり 8GB より大きいディスク) には十分でない。実際には、(通常は 16 であるヘッド数のために 1 バイトを使う) 無駄の多い表現のために、0.5GB から既に問題が起こる。しかし、Linux はこのフィールドを使わず、 Linux が起動する前のブート時にのみ問題が生じる可能性がある。詳しくは、 lilo のドキュメントを参照すること。
各パーティションにはタイプ `ID' がある。 ID が 5 または f (` 拡張パーティション') の場合、このパーティションの開始セクタにも 4 つのパーティションディスクリプタがある。 MSDOS は最初の 2 つしか使わない: 最初の 1 つは実際のデータパーティションで 2 つめは、次の拡張パーティション (または空) である。このようにして、拡張パーティションの連鎖をつくる。他の OS は少し異なる方法を使う。 Linux は 85 を 5 や f と同じものとして受け付ける - DOS FDISK をハングさせることなく 1024 シリンダを越えたところに Linux の拡張パーティションを作りたい場合に、これが役立つ。 (正当な理由がない場合は、他の OS にも認識される 5 のみを使うべきである。)
基本や拡張でないパーティションは、 論理 パーティションと呼ばれる。大抵、論理パーティションからはブートできない (なぜなら、論理パーティションを見付けるプロセスは、ただ MBR を探すのにくらべて更に複雑なためである)。拡張パーティションでは、ID と開始点しか使われない点に注意すること。他のフィールドに何を書くのかには、いろいろな習慣がある。データの保管やスワップには、拡張パーティションは使うべきではない。
入力フォーマット
sfdisk は、以下の形式の行を読み込む。フィールドは空白・コンマ・セミコロンで区切られる (これらの後に空白を置いてもよい)。先頭と末尾の空白は無視される。数字は 8 進・10 進・16 進を使うことができて、10 進がデフォルトである。フィールドがない場合、または空白の場合、デフォルトの値が使われる。
<c,h,s>の部分は省略できる (たぶん省略すべきである) - これらは、 sfdisk が <start>, <size>, カーネルから与えられるディスクジオメトリを使って計算するか、-H, -S, -C フラグで指定される。
ブート可能とするかどうかは [*|-] で指定する。デフォルトではブート可能でない。 (このフィールドの値は Linux とは関係ない。 - Linux が稼働しているなら、既にブート済みである - しかし、このフィールドはある種のブートローダや他の OS で用いられる。例えば、複数の DOS パーティションがある場合、 DOS はブート可能なものの中から最初のものを C: に割り当てる。)
ID は、プレフィックス 0x を付けない 16 進数か、[E|S|L|X] で指定される。ここで L (LINUX_NATIVE (83)) はデフォルトであり、 S は LINUX_SWAP (82), E は EXTENDED_PARTITION (5), X は LINUX_EXTENDED (85) である。
start のデフォルト値は、割り当てられていない最初のセクタ/シリンダ/... である。
size のデフォルト値は、(次のパーティションまたはディスクの終りまでの) 可能な限り大きな値である。
しかし、拡張パーティションの内側の 4 つのパーティションのデフォルトは、 Linux パーティション・拡張パーティション・空・空である。
ただし、(1 つのパーティションだけを変更する) -N オプションが指定された場合、各フィールドのデフォルトは前の値になる。
例
コマンドsfdisk /dev/hdc << EOF
0,407
,407
;
;
EOF
sfdisk /dev/hdb << EOF
,3,L
,60,L
,19,S
,,E
,130,L
,130,L
,130,L
,,L
EOF
DOS 6.x 向けの警告
DOS 6.x の FORMAT コマンドはパーティションのデータエリアの第一セクタからある種の情報を検索し、これをパーティションテーブルにある情報より信頼できるものとして扱う。 DOS の FORMAT は、容量が変更されたときには最初の 512 バイト分のデータ領域が DOS 版 FDISK によってクリアされていることを仮定している。 DOS の FORMAT はこの拡張情報を /U フラグを指定した場合でも見ようとする-これは DOS FORMAT と DOS FDISK のバグであると我々は考える。結局のところ、 sfdisk を用いて DOS パーティションの容量を変更したときは、 DOS FORMAT を使ってパーティションをフォーマットする前に dd を使って先頭の 512 バイトを 0 で埋めなければならない、というわけである。例えば sfdisk を用いて /dev/hda1 の DOS パーティションのテーブルエントリを作成した場合には、(sfdisk を終了し、 Linux をリブートしてパーティションテーブルの情報を有効にしたあとで) 先頭の 512 バイトを 0 にするために "dd if=/dev/zero of=/dev/hda1 bs=512 count=1"などと実行する必要がある。注意点: dd コマンドを使う場合には 特に注意すること。ちょっとしたタイプミスで、ディスク上のすべてのデータが使えなくなる可能性もある。
できるだけ問題を起こしたくなければ、常に OS 固有のパーティションテーブル用プログラムを用いることである。例えば DOS パーティションは DOS FDISK プログラムで作り、 Linux のパーティションは Linux の sfdisk で作るべきなのである。
DRDOS 向けの警告
Stephen Tweedie は次のように報告している (930515): 「スーパーブロックの破損に関する報告の大部分は、 1 つのファイルシステムが次のファイルシステムの最初にはみ出してスーパーブロックを壊している、といった不正なパーティション分割によるものである。私は、信頼できると思っていた DRDOS でも、この問題に出会った。これは多分 DRDOS-6.0 の FDISK コマンドによるものだろう。 DRDOS パーティションと直後のパーティションの間に空白のトラックやシリンダを作成しない限り、 DRDOS は能天気にも次のパーティションの最初の部分を全て壊してしまった。 DRDOS パーティションの後に小さな空きディスク領域を置く限り、 1 つのドライブに 2 つのパーティションが存在しても他に何も問題は起きない点に気を付けること。」バグ
今のところ、対応する対話的な (curses インターフェースの) cfdisk がない。オプションが多すぎる。
non-DOS パーティションタイプがサポートされていない。
関連項目
cfdisk(8), fdisk(8), mkfs(8), parted(8)1 September 1995 | Linux |