Linuxを学び、楽しみたい人々のために
HDDパーティショニング

パーティショニング

ページ作成日 2016/5/4
ページ更新日 2020/4/14

パーティション設計

0. Linuxのパーティション作成の基本

まず基本のパーティショニングは、ディスク領域を/(ルート)とスワップ用の2つに分けます。
スワップ用のパーティションは必ず用意します。

Chris Down氏の「スワップの弁護:よくある誤解を解く」から要約を引用します。

  • スワップを持つことは正しく機能するシステムのかなり重要なポイントです。 スワップが無ければ、まともなメモリ管理を実現することは難しくなります。
  • スワップは一般的に緊急事態用のメモリを取得するためのものではなく、メモリの回収を平等に効率的に行うためのものです。 実のところ「緊急事態用のメモリ」は一般的に盛大に悪影響を及ぼします。
  • スワップを無効にすることはメモリ争奪の状況下においてディスクI/Oが問題になることを回避してくれるわけではありません。 単にディスクI/Oスラッシングの対象をanonymousページからfileページにシフトさせるだけです。 これは効率が悪くなるだけでなく、回収元の選択対象となるページのプールが小さくなり、発端となっているメモリ争奪の状況をより悪化させることに寄与してしまいます。
  • 4.0以前のカーネルのスワップ機構はたくさんの落とし穴がありました。そして、必要以上にやたらとページをスワップアウトしたがるせいでスワップについてネガティブな認識を多くの人が持つようになりました。4.0以降のカーネルでは状況ははるかに良くなっています。
  • SSDではanonymousページをスワップアウトするのとfileページを回収するのはパフォーマンスとレイテンシの観点では実質的には同じです。より古い回転ディスクではスワップからの読み込みはランダムリードになるためより遅くなります。 ですので vm.swappiness をより低い値に設定することが理にかなっています(vm.swappiness については後述)。
  • スワップを無効にすることはOOMが近いときにを病的な挙動を防いでくれるわけではありません。 一方、スワップがあればOOMの発動を引き延ばせる可能性があるのは事実です。 スワップありあるいはなしでシステムグローバルの OOM キラーが実行されるか、また実行される時期が早いか遅いか、に関わらず結果は同じです。 つまりあなたには挙動が予測できないシステムが残されることになります。 スワップを持たないことでこれを回避することはできません。
  • cgroup v2 の memory.low などを使うことでメモリ逼迫の状況下でスワップの挙動を改善しスラッシングを防ぐことができます。

1. /homeを別パーティションにする

これでインストールを進めても良いですが、利便性を考えると、もう幾つかに分けた方が良いです。
次に分けるとしたら、/homeを別パーティションにしましょう。
そうすると、Slackwareを再インストールしたとしても、ユーザのデータはフォーマットせずに残すことが出来ます。

2. /varを別パーティションにする

更にパーティションを分けるなら、/varを分けるといいでしょう。
サーバ用途で使う場合にお勧めです。
/varを分ける事で、ログファイルがディスク領域を消費するのをパーティションで設定した領域までに食い止めることができます。

3. /etcを別パーティションにする

更にパーティションを分けるなら、/etcを別パーティションを分けておくと良いでしょう。
Slacwareを再インストールする際に、設定ファイルをフォーマットして消さずに済み、再利用する事ができます。

gdisk

gdiskとは

UEFI用のパーティショニングでは、gdiskを使います。 gdiskとは、GPT fdiskの略です。

GTPは、従来のMBRに代わる、ハードディスク上のパーティションテーブルの配置に関する標準規格です。

従来、MBRパーティションでは、32bitでセクタ情報を管理するため、1セクタ512Byteで定義すると、512Byte×2^32=2TiBまでしか管理できませんでした。
セクタ情報の管理を64bit化することで、8ZiBまで拡張できるようにしたのが、GUID Partion tableです。
GTPにすると、以下の利点があります。

  1. 容量が2TiB以上のディスクを取り扱える。
  2. パーティションが128個作成できる。MBRの時のプライマリパーティション4個の制限から解放される。プライマリパーティション、拡張パーティションという枠組みから解放される。
  3. プライマリGPTの内容に不整合が生じた時のために、最終論理セクターにバックアップGPTが作成される。チェックサムエラーが生じた際は、バックアップからGPTをコピーしてくれる。

gdiskのコマンド

次にhelpを表示させてみましょう。?を入力します。


b           backup GPT data to a file
c           change a partition's name
d           delete a partition
i           show detailed information on a partition
l           list known partition types
n           add a new partition
o           create a new empty GUID partition table (GPT)
p           print the partition talbe
q           quit without saving changes
r           recovery and transformation option (experts only)
s           sort partitions
t           change a partition's type code
v           verify disk
w           write table to disk and exit
x           extra functionality (experts only)
?           pritn this menu

Command (? for help): _

ターゲットデバイスの確認

gdiskと入力して、ディスクのパーティショニングを行います。
ここで、デバイスファイル名が出てきます。
1番目に登録されたSerial ATAのSSDやHDDを対象に操作するのであれば、/dev/sdaとなります。

gdisk /dev/sdaと入力してみましょう。


root@slackware:/# gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.5

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): _

自分が正しいデバイスファイルを指定したか、確認しましょう。
pを入力すると、以下のような出力が表示されます。


Command (? for help): p
Disk /dev/sda: 1000215216 sectors, 476.9 GiB
Model: INTEL SSDSC2KW51
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 2152F182-D7FA-4B4E-8250-309151B25A07
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 1000215182
Partitions will be aligned on 2048-sector boundaries
Total free space is 1000215149 sectors (476.9 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name

Command (? for help): _

新しいGPTを作成する

まず最初にGUIDのパーティションテーブルを作成します。
この領域に、これから作成するパーティション情報が保存されます。
oを入力して、Enterキーを押します。


Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y

「全てのパーティションを削除し、新しい保護用MBRを作成しますか?」と質問されるので、Yを入力し、全てのパーティションを削除し、新しい保護用MBRを作成します。

EFIシステムパーティション

まず最初にEFIシステムパーティションを100MBで作成します。


Command (? for help): n <- nを入力して、Enterキーを押す
Partition number (1-128, default 1): <- 何も入力せず、Enterキーを押す
First sector (34-1000215182, default = 2048) or {+-}size{KMGTP}: <- 何も入力せず、Enterキーを押す
Last sector (2048-1000215182, default = 1000215182) or {+-}size{KMGTP}: +100M <- 100MBをEFIシステム領域として確保
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF00 <- EF00を入力して、Enterキーを押す
Change type of partition to 'EFI System'

Command (? for help): _

スワップ用パーティションの作成

スワップ領域は必ず作成します。
物理メモリの倍ぐらいで作りましょうというのが昔からの目安でしたが、現在は、もう少し計算式が複雑です。

"How Much Swap Should You Use in Linux?"では、RedHatやCentOSの推奨計算式を紹介しつつ、以下のようにまとめています。

物理メモリとOSの用途によるスワップサイズの目安
RAMの容量スワップのサイズ(ハイバネーションを使わないサーバ用途の場合)スワップのサイズ(ハイバネーションを使うデスクトップ用途の場合)
256MB256MB512MB
512MB512MB1GB
1GB1GB2GB
2GB1GB3GB
3GB2GB5GB
4GB2GB6GB
6GB2GB8GB
8GB3GB11GB
12GB3GB15GB
16GB4GB20GB
24GB5GB29GB
32GB6GB38GB
64GB8GB72GB
128GB11GB139GB

以下の例では、物理メモリ32GBのPCをデスクトップ用途で使うために、38GBのディスク領域をパーティションで切り、スワップ領域として作成しています。


Command (? for help): n <- nを入力して、Enterキーを押す
Partition number (2-128, default 2): <- 何も入力せず、Enterキーを押す
First sector (34-1000215182, default = 206848) or {+-}size{KMGTP}: <- 何も入力せず、Enterキーを押す
Last sector (206848-1000215182, default = 1000215182) or {+-}size{KMGTP}: +38G <- この例では38GBをスワップ領域として確保
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8200 <- 8200を入力して、Enterキーを押す
Change type of partition to 'Linux swap'

Command (? for help): _

スワップ領域用パーティションは、8200というコードになります。

/(ルート)用パーティションの作成

次に/(ルート)の領域を確保します。
30GBあれば十分ですが、余裕があるのであれば、100GBぐらいまで増やしても良いでしょう。
/varの領域は、ログを記録に、/tmpは一時的なファイルの書き込みやパッケージ作成などに使うので、ある程度余裕があった方が良いです。

以下の例では、残りの全領域をルート用パーティションとして作成しています。


Command (? for help): n <- nを入力して、Enterキーを押す
Partition number (3-128, default 3): <- 何も入力せず、Enterキーを押す
First sector (34-1000215182, default = 20973568) or {+-}size{KMGTP}: <- 何も入力せず、Enterキーを押す
Last sector (33761280-1000215182, default = 1000215182) or {+-}size{KMGTP}: +30G <- 何も入力せず、Enterキーを押す
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): <- 何も入力せず、Enterキーを押す
Change type of partition to 'Linux filesystems'

Command (? for help): _

作成したパーティションの確認と確定

最後にpを押して、作ったパーティションを確認します。


Command (? for help): p
Disk /dev/sda: 1000215216 sectors, 476.9 GiB
Model: INTEL SSDSC2KW51
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 2152F182-D7FA-4B4E-8250-309151B25A07
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 1000215182
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          206847   100.0 MiB   EF00  EFI system partition
   2          206848        79898623   38.0 GiB    8200  Linux swap
   3        79898624      1000215182   438.8 GiB    8300  Linux filesystem

Command (? for help): 

これでパーティションを確定させます。
wを入力して、パーティションテーブルをディスクに書き込み、gdiskを終了させます。


Command (? for help): w

Final checks complete. Abount to write GPT data. THIS WILL OVERWRITE EXISTING  
PARTITIONS!!

Do you want to proceed? (Y/N): Y <- Yを入力して、Enterキーを押す
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.
root@slackware:/# _

複数台の記憶装置を使う場合

もしも、複数台のSSDやHDD、M.2 SSDを搭載したPCを使い、別のデバイスに/homeや/varなどを割り当てるのであれば、gdisk /dev/sdbのように入力して、同じような作業を行います。
2台目以降はブート用デバイスではなく、データ保存専用デバイスとなるため、EFIシステムパーティションを作る必要はありません。

次は、パッケージの選択とインストールに進みます。