Linux: パーティション分割について

Linuxインストール時に/boot、スワップ領域、/home等をパーティション分割する概要について記載します。

1 ブートローダが読めるようにする

/bootはカーネルイメージを格納するディレクトリで、ブートローダがアクセスします。よって、ブートローダがサポートするファイルシステムでフォーマットされている必要があります。

特にGRUB1ではLVM、ext4、ソフトウェアRAIDをサポートしておらず、/bootを分割してext3でフォーマットされていました。

GRUB2ではサポートされており、分割が不要になる傾向にあります。ただし、LinuxとGRUBのそれぞれでファイルシステムを実装するコストやリスクがあります。

1.1 /bootの容量が足りなくてカーネルアップデートできない

カーネルアップデートを繰り返していくと、/bootの容量が枯渇します。これが/bootを分割したくない理由です。

もし/bootの容量が足りなくなった場合は、apt autoremoveやdnf autoremoveを実行して古いカーネルを削除する必要があります。

カーネルのautoremoveに関しては指定された世代数を残して、古いカーネルを削除するように設定されています。

$ sudo apt autoremove -y # or sudo dnf autoremove -y

2 スワップ領域として利用する

スワップ領域を使ってる時点でそのシステムは使い物になりません。メモリアクセスに比べて何十倍も遅くなります。

大容量のメモリが安価になってきており、メモリが枯渇することが少なくなってきている一方で、ストレージの容量はメモリほど大きくなっていません(HDDからSSDへ、SSDからeMMCへとデバイスがシフトしている為)。スワップ領域はメモリサイズの倍が推奨されており、スワップ領域の為に32GB/64GBを使うのは相当きついです。

また、組込み機器ではNANDフラッシュ等の書き込み回数に制限があるデバイスを用いており、そもそもスワップ領域が使われていません。

Ubuntu 17.04では、LVMを使わない場合はスワップ領域のパーティションを作らないようになっています。代わりにスワップファイルを使うようになっています。

$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/vda1 during installation
UUID=009a4083-d35b-4492-afcb-d0d2938da0ea /               ext4
errors=remount-ro 0       1
/swapfile                                 none            swap
sw              0       0

問題はメモリ確保以外の目的でスワップ領域を使うケースがある点です。例えば、ハイバーネーションやkdumpです。ハイバネーションについてはUbuntu 17.04のswapfileで対応しているようですが、kdumpについては対応していないかもしれません(未確認)。

2.1 スワップファイルでスワップ領域を一時的に増やす

ddで作成したファイルをスワップファイルとして利用します。なお、sparseファイルはスワップ領域として使えません。再起動後にも使う場合は/etc/fstabに記述する必要があります。

$ dd if=/dev/zero of=swapfile bs=1M count=4K
$ mkswap swapfile
$ sudo swapon -a swapfile
$ swapon
NAME                   TYPE   SIZE USED PRIO
/swapfile              file 947.2M   0B   -1
/home/hiroom2/swapfile file     4G   0B   -2

3 ファイルシステムを暗号化する

機密データを扱う場合は/home等を暗号化します。暗号化の為には暗号化するディレクトリのパーティション分割が必要です。

4 Linux再インストール時にデータを残す

/home等を分割しておくことで、Linux再インストール時にデータを削除しないようにすることができます。

サーバアプリケーションがデータ保存先としてよく使う/var/libや、サードパーティ製アプリケーションのインストール先としてよく使う/optも分ける候補になると思います。

ただし、利用する予定のサイズの見積もりが必要となります。サイズを見積もらずに/homeを分割したら、/が枯渇してしまったということは起こりえます。

5 まとめ

  • /bootはパーティション分割しなくなる傾向にあります。
  • スワップ領域用のパーティションはメモリ退避としての目的は不要になってきていますが、メモリ退避以外の目的で使わるケースを解決する必要があります。
  • 機密データを扱う場合はパーティション分割して暗号化します。
  • /home等をパーティション分割する場合は利用予定のサイズを見積もっておく必要があります。