パーティションを何気なくfdisk /dev/sdb
とかやって作ったとき、に様々な警告について出くわす
1つずつ調べたのでまとめる
- 4Kバイトセクタと512バイトセクタの話
- 共有ディスクにパーティションを切った話
- fdiskが古い
- fdisk vs parted
- MBRとGPT
- ディスク拡張とファイルシステムの拡張、LV拡張
- partition1 does not end on sylinder boundary
- partition1 does not start on physical sector boundary
- WARNING: Re-reading the partition table failed with error 22: Invalid argument
fdiskコマンドは、LBA(論理ブロックアドレッシング、、、だったかな)とCHS(シリンダヘッダセクタ)方式の両方で情報を持っている、、、、かもしれない。
CHS方式はDOSで使うものであり、Linuxでは使っていない。
現在はほとんどがLBA方式を使っている
⇒なので、partition1 does not end on sylinder boundaryは無視でOK
partition1 does not start on sylinder boundaryについては、
fdiskコマンドは、近年デフォルトになりつつある4KBセクタディスク(AFT規格?:Advanced Format Technology)に完全には対応していない
昔のものとの互換性を残しているために、何も考えずにパーティションを作成すると(物理セクタ境界とずれてしまって)ディスク性能が落ちる
(fdiskコマンドの論理セクタは512バイト)
⇒パーティションの開始セクタを8の倍数(第一パーティションは2048セクタ始まりが推奨)にしてあげればよい
⇒これは 4096/512=8 から来てる。つまり論理セクタ境界と物理セクタ境界を合わせてやることが必要
⇒実はfdiskたたいた後に、サブコマンドcを押すと2048始まりになる。確認するにはサブコマンドuでセクタ表示にする
⇒これ実は最初に警告として出てるんだけど誰も言及していない。
⇒とりあえずサブコマンドcとuを押してから作業すればよい
⇒ちなみに別の方法として、fdisk -H 224 -s 56 /dev/sdaとかするとできるらしい
ちなみに、fdiskのバージョン2.18以降なら対応している模様。
これはrhel7系なら使える
6系では2.17が安定板
更にちなみに、物理セクタのバイト数を確認する方法は、
fdiskコマンド実行したときに、Logical/Physical みたいなところに表示されている
もしくは、lsblk -t /dev/○○
とかでも見られる
3つ目のメッセージについては、
fdisk のmanを読むと、
パーティションテーブルが更新されると、「終了する前にsync()とioctl()が実行される、すっごい昔はリブートが必要だったけど今は治っていると思う」って書いてある。
と思うって何ぞ。
なのでリブートしてねみたいなメッセージは実はリブート必要ない、、、かもしれない。
だけど、今回のメッセージ「Re-reading the partition table failed with error 22: Invalid argument」に関してはちょっと注意が必要。
普通に訳すと、引数が間違ってるよ!と言われている。
つまり、fdiskコマンドに渡すデバイス名に誤りがある可能性がある。
このメッセージが出るパターンで確認できたのは、
- 共有ディスクへのパーティション作成
- ディスク名の誤り(/dev/sda1とかしちゃったり。)
- LVへのパーティション作成
このうち、問題ないのが共有ディスクへのパーティション作成
これは、共有ディスクなのでたしかカーネルとは別の何かがロックをかけてるから~みたいな話。
リブートで解決
ディスク名の誤りはともかく、
LVにはパーティション作れない!!ってことっぽい。
おそらくこんなことしようとしたのは、LVがどんなものかわかってなかった自分だけで、他の人はやろうとも思わないから情報が無い
でも多分作れない
fdiskとparted、どちらを使うべきか。
fdiskは最後にwを押して保存するまで実際には書き換えない
partedはサブコマンドを押した瞬間に保存される
また、fdiskはGPT(GUIDパーティションテーブル)に対応していない。
EFI(UEFI)を搭載しているPCならGPTでもブートできる
つまりfdiskはMBR方式でパーティションを切ることになる。
MBR方式は、2TiBまでのパーティションしか作れない。
partedは、GPTを使えるので、2TiBを超えるパーティションを作るならpartedで行うべし。
やり方は、
# parted /dev/sda
(parted) print
(parted) unit s(MBとか、MiBとか%とかもできるみたい)
(parted) mklabel gpt
(parted) mkpart
とかでできる
ちなみに、partedは、パーティションの拡張/作成とかと一緒にファイルシステムの拡張/作成もできるという強みが、、、あった。
現在はファイルシステムをいじるのは非推奨で、mkfs.ext4とかでやれって書いてある
そしてそもそもpartedはext4とか対応していない可能性がある(最新なら対応しているかも)
また、partedは、gpartedという、GUIでグラフィカルにパーティションをいじれるコマンドも仲間
あと、fdiskはGPT対応していないといったけれど、gdiskなるコマンドが出てきて、こちらではfdisk的にgptを扱えるらしい(rhel7系からデフォルトインストールだったかな?)
そしてこのgdisk、かなり優れものらしいので、あればこっちを使うのがいいんでないかな。
ちなみに、2TB以上を認識することと、2TB以上のパーティションを作ることは別の話
4KBセクタにすることで、32ビットでも2TB以上のデバイスを認識することは可能になった
が、fdiskは512セクタで論理的には進めてMBRを使っているので、2TB以上のパーティションは作れない
HDDへのアクセスは、現在LBA(Logical Block Adressing)方式が一般的
この方式は、各セクタにユニークな番号を振っていき、そのセクタ番号を元にアクセスする
(HCSはどのヘッダのどのシリンダのどのセクタ)
どうやらこの方式に制限がかかる理由がある、、、、らしい
一般にHDDの論理セクタは512バイト。
fdiskはMBR(master boot record)という方式でパーティションを管理している。
このMBR方式とは、先頭セクタをMBRと呼び、その中にパーティションの情報や起動用の初期プログラムを書き込む
MBR方式で管理するHDDの場合、パーティションの先頭セクタとセクタ数を32bitで表記するので、2の32乗で4GB×512B=2TB となり、2TBの壁ができる
また、同じ理由で、パーティションを4つしか作れない(パーティション情報に使うビット数の制限から)
この課題を解決したのが、基本パーティションと拡張パーティション
拡張パーティションを1つとして、その中に論理パーティションをつくることで、4つの壁を超えた
しかし、2TBの壁は越えられない。
この壁を超えるために、MBRを64bitにするのは、めんどいので新しいのを作った
それがGPT(GUID Partision Table)。こちらは2番目のセクタから可変長の基本GPTと呼ばれるパーティションテーブルが置かれる
このパーティション情報は64bitで行われるため、2の64乗で1844京セクタまで扱え、×512バイトとすると8ZiBまで対応可能になった。
これにともなって、パーティションが128個まで作られるようになり、MBRのような基本・拡張パーティションという概念が不要になった。
全て基本パーティションである
こちらでは、MBRのUUIDのように、GUIDというものがある。
パーティションを拡張し、それに伴ってファイルシステムも拡張したい場合
partedコマンドを使用すると、サブコマンドでファイルシステムも一緒に拡張してくれるものがある。 が、partedコマンドはどうもファイルシステムをいじらない方向にシフトしたいようで、パーティションだけ広げてファイルシステムは専用コマンド(resize2fs)を使用するのが推奨というニュアンスの記載がある
こうなると結局、partedでもfdiskでもやることは変わらない。
パーティション切りなおすだけ。
一回パーティション削除して、始まりのセクタを同じにして、パーティション作り直す。それだけ。
パーティション作り直したら、マウントして、resize2fs /dev/sda
とかするとファイルシステム拡張できる。
このresize2fsコマンドは、マウント状態に関わらず拡張できる。
多分、始まりのセクタを合わせればデータを残したままパーティションのサイズ変更できるけど、一応バックアップは(当然だけど)とった方が良い。
以上が、固定パーティションの拡張の話。
LVMを使うと、もっと柔軟にできる。
増設した分のパーティション切って、領域タイプ(システムタイプ?)をLinux LVMにしておく。
この増設パーティションに対してpvを作る(pvcreate /dev/sdb2)
↓
pvをボリュームグループに追加(vgextend VolGroup /dev/sdb2)
↓
LVを拡張(lvextend -l +100%FREE lvpath)
↓
ファイルシステム拡張(resize2fs lvpath)
(出来れば拡張前後でファイルシステムのチェックをした方が良い:fsck.ext4 lvpath)
実は、ディスクを丸ごとpvにする場合(複数パーティションが必要ない場合)、パーティションを作らなくても、ディスクをそのままpvにできる。
これの何が問題なのか、問題ではないのかは不明。
ただ、できる。
pvcreate /dev/sdb
ちなみに、拡大時はマウント状態でも(LVMなら)可能だが、縮小時はアンマウント必須
更にちなみに、拡大時は、lv拡張→ファイルシステム拡張の順番だが、縮小時は逆になって、ファイルシステム縮小→LV縮小となる。(考えれば当然か。)
共有ディスクにパーティションを作るときのメッセージ
4KBセクタディスクでLinuxを使用する
4KBセクタディスクでLinuxを使用する2
2TBの壁
ext4ファイルシステムの拡張