Provided by: manpages-ja_0.5.0.0.20161015+dfsg-1_all
名前
sfdisk - Linux 用のパーティションテーブル操作ツール
書式
sfdisk [options] device sfdisk -s [partition]
説明
sfdisk には (主に) 4 つの使用法があり、 パーティションサイズの一覧・ デバイス上のパーティ ションの一覧・ デバイス上のパーティションのチェック・ デバイスのパーティション再分割 (これ は非常に危険) ができる。 サイズの一覧 sfdisk -s partition とすると partition のサイズをブロック単位で表示する。 この使用法は mkswap のようなプログラムと共に使う場合に便利である。 ここで、 partition は、普通 /dev/hda1 や /dev/sdb12 のようにするが、 /dev/xda のようにディスク全体でもよい。 % sfdisk -s /dev/hda9 81599 % パーティション引き数が省略された場合、 sfdisk は全てのディスクのサイズと合計をリストする: % 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' のような別の名前で呼ぶのも自由である)。 -Anumber 指定したパーティション (複数でもよい) をアクティブにして、 他のパーティションを非ア クティブにする。 -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 つのフィールドがある: struct partition { 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 は、以下の形式の行を読み込む。 <start> <size> <id> <bootable> <c,h,s> <c,h,s> ここで各行は 1 つのパーティションディスクリプタに対応する。 フィールドは空白・コンマ・セミコロンで区切られる (これらの後に空白を置いてもよい)。 先頭と 末尾の空白は無視される。 数字は 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 は、先に説明したように /dev/hdc を分割する。 コマンド sfdisk /dev/hdb << EOF ,3,L ,60,L ,19,S ,,E ,130,L ,130,L ,130,L ,,L EOF は、/dev/hdb を、3 シリンダと 60 シリンダの 2 つの Linux パーティション、 19 シリンダのス ワップスペース、残りの拡張パーティションに分割する。 拡張パーティションの内部は 4 つの Linux 論理パーティションがあり、 3 つは 130 シリンダで、1 つはその残りの部分である。 -x オプションを使った場合、入力行数は 4 の倍数でなければならない: 使用しない 2 つの空パー ティションを 2 つの空行を使ってリストしなければならない。 -x オプションを使わない場合、 拡 張パーティションの内部のパーティションに対して 4 行ではなく 1 行で指定し、 end-of-file (^D) で終了しなければならない。 (さらに sfdisk は、入力行が 4 つのパーティション中の 第 1 パーティションを表しているものと仮定する。 第 2 パーティションは拡張パーティションで、 第 3,4 は空である。)
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 つのパーティションが 存在しても 他に何も問題は起きない点に気を付けること。」 A. V. Le Blanc は README.efdisk で次のように書いている: 「Dr. DOS 5.0 と 6.0 は Linux と一 緒に使うと問題があると報告されている。 このバージョンの efdisk には特に問題がある。 この efdisk はファイルシステムタイプを 16 進数の 81 に設定する。 Dr. DOS は、これを DOS コード である 16 進数の 1 と勘違いするようだ。 Dr. DOS を使う場合は、efdisk のコマンド 't' を使っ て Linux パーティションのシステムコードを変更し、 16 進数の 80 より小さい値にすること。 さ しあたりは、41 と 42 が良いかと思う。」 A. V. Le Blanc は彼の README.fdisk で次のように書いている: 「DR-DOS 5.0 と 6.0 には 80 以 上のパーティション ID コードに 問題があるとの報告がある。 Linux `fdisk' は新しいパーティ ションのシステムタイプを 16 進数の 81 に設定する。 DR-DOS は、これを DOS コードである 16 進数の 1 と勘違いするようだ。 スワップを表す値 82 とファイルシステムを表す値 83 について は、 DR-DOS では問題は起きないはずだ。 しかし、もし問題が起こるようならば、 fdisk のコマン ド 't' を使って Linux パーティションのシステムコードを変更し、 16 進数の 80 より小さい値に すること。 さしあたりは、42 と 43 が良いかと思う。」 実のところは、DRDOS FDISK は 4 ビットしか見ていないのだろう。 そのため、例えば 11 と 21 が DOS 2.0 としてリストされている。 しかし、DRDOS 自身は 1 バイト全てを使っているように思われ る。 私自身は、DRDOS とその fdisk による破壊を再現できていない。
バグ
今のところ、対応する対話的な (curses インターフェースの) cfdisk がない。 オプションが多すぎる。 non-DOS パーティションタイプがサポートされていない。
関連項目
cfdisk(8), fdisk(8), mkfs(8), parted(8)