起動時に追加マウント【優先順位付け】

自動マウントする際に、swaponコマンドのように優先度をつけたいと思い調べてみたら簡単に出来ました。

目次

準備

スワップ用にフォーマットする

追加したいパーティションをSwap用にフォーマットします。

CUIベース

以前の記事「SDカード上にスワップ領域を作成」をご参照ください。

GUIベース

GUIツール"gnome-disk-utility"の場合は、以下で設定可能です。

事前準備

フォーマット済みの場合は「ディスクを初期化」した後に、パーティションを作成することをお勧めします。
未フォーマットの場合は、そのままパーティションを作成します。

パーティション作成

[+]ボタン(パーティションを作成)ボタンをクリックし、

  • タイプを「カスタム」
  • ファイルシステムを「swap」

に設定した後、[作成]ボタンを押して完了です。

指定するパーティションを確認

デバイス名の確認

パーティションテーブルの一覧から、デバイス名を確認します。

$ sudo fdisk -l
Disk /dev/sda: 74.5 GiB, 80026361856 bytes, 156301488 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x09c11832

デバイス   起動     Start 最後から セクタ  Size Id タイプ
/dev/sda1  *         2048 139704319 139702272 66.6G 83 Linux
/dev/sda2       139706366 156301311  16594946  7.9G  5 拡張領域
/dev/sda5       139706368 156301311  16594944  7.9G 82 Linux スワップ / Solaris


Disk /dev/sdb: 960 MiB, 1006632960 bytes, 1966080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf39d6cf5

デバイス   起動 Start 最後から セクタ  Size Id タイプ
/dev/sdb1        2048  1966079 1964032  959M 82 Linux スワップ / Solaris


Disk /dev/sdc: 960 MiB, 1006632960 bytes, 1966080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6f00a6f8

デバイス   起動 Start 最後から セクタ  Size Id タイプ
/dev/sdc1        2048  1966079 1964032  959M 82 Linux スワップ / Solaris

内蔵HDD(80GB)から、メインメモリと同容量(8GB, /dev/sda5)のスワップが割り当てられています。
今回、追加で割り当てるのはUSBメモリ(1GB × 2本, /dev/sdb1, /dev/sdc1)です。

UUIDを確認

blkidコマンドで、スワップパーティションのUUIDの一覧を取得します。
その後、fdiskコマンドで確認したデバイス名に対応するUUIDを確認します。

$ sudo blkid
/dev/sda1: UUID="e24c61cc-77a9-4380-b7c5-68b2a9f13089" TYPE="ext4" PARTUUID="09c11832-01"
/dev/sda5: UUID="2cf484e8-5a3b-4b4b-a10d-b88d2abc10c7" TYPE="swap" PARTUUID="09c11832-05"
/dev/sdb1: LABEL="USB1GB" UUID="489f037a-3dad-49c0-bc61-68f0685c62a6" TYPE="swap" PARTUUID="f39d6cf5-01"
/dev/sdc1: LABEL="USB1GB" UUID="0978b50c-ddab-42cb-8210-2fada3e50d58" TYPE="swap" PARTUUID="6f00a6f8-01"

UUIDとは

UUID(Universally Unique Identifier)は、ソフトウェア上でオブジェクトを一意に識別するためのIDを指します。
さらに、当記事でのUUIDは狭義(パーティションを識別するためのID文字列)として用いられています。
従来からあるデバイス名(ex. /dev/sdb1)が使われていましたが、デバイス名は"a"から順番に割り当てられるため再起動によりデバイス名が変わってしまうことがあります。
そのため、UUIDという一意の識別子を割り当てて、固定IDで利用できるようにしたわけです。
また、パーティション識別子としてのUUIDは32bitの16進数で表されるため、単純計算で"340,282,366,920,938,000,000,000,000,000,000,000,000"という莫大なパターンから乱数生成されます。
これが、重複を意識せずに使用することができる秘密です。

設定

設定ファイルの編集

OSの起動時に読み込まれるマウント情報ファイルを編集します。
これにより、ディスクパーティションやブロックデバイス、リモートディレクトリなどを起動時に自動マウントします。

$ file /etc/fstab
/etc/fstab: ASCII text

変更前にバックアップを取得

念の為、コピーします。
※不要であれば、後で削除します。

$ sudo cp /etc/fstab /etc/fstab_org

fstabを編集

編集例

マウント時オプションに「defaults,pri={9}」を指定することで、優先度を指定できます。

base on スワップ - ArchWiki

複数のスワップファイルやスワップパーティションを使っている場合、priority 値 (0 から 32767) をそれぞれのスワップ領域に割り当てることを考えて下さい。
システムは優先度が低いスワップ領域を使う前に高い優先度が付けられたスワップ領域を使います。
priority は fstab で pri パラメータを使って設定できます:

もし2つ以上の領域が同じ priority を持ち、それが一番高い priority の場合、その領域間ではラウンド・ロビン方式でページが配分されます。

$ diff -u /etc/fstab_bk20180611 /etc/fstab
--- /etc/fstab_bk20180611   2018-06-11 21:00:15.448806400 +0900
+++ /etc/fstab  2018-06-11 21:16:04.812333219 +0900
@@ -9,3 +9,6 @@
 UUID=e24c61cc-77a9-4380-b7c5-68b2a9f13089 /               ext4    errors=remount-ro 0       1
 # swap was on /dev/sda5 during installation
 UUID=2cf484e8-5a3b-4b4b-a10d-b88d2abc10c7 none            swap    sw              0       0
+# swap was on USB-Memory during installation
+UUID=0978b50c-ddab-42cb-8210-2fada3e50d58 none            swap    defaults,pri=0              0       0
+UUID=489f037a-3dad-49c0-bc61-68f0685c62a6 none            swap    defaults,pri=0              0       0

fstab記述について
1列目:デバイス名・スワップファイル名
2列目:マウントポイント(スワップにはマウントポイントが無い)
3列目:ファイルシステム
4列目:マウント時のオプション
5列目:dumpの有無(0:不要)
6列目:fsckチェックの有無(0:無し)
※diffコマンドについては、過去記事「diff コマンド」をご参照ください

※swaponコマンドで優先度を指定する場合は「Fedora でスワップを設定する:CUI編」をご参照ください。

再起動

設定後、再起動すると起動時にマウントされます。

確認

$ swapon -s
Filename                Type        Size    Used    Priority
/dev/sdc1                               partition   982012  0   0
/dev/sdb1                               partition   982012  0   0
/dev/sda5                               partition   8297468 0   -1

割り当てルール

スワップは優先度の高いもの(数値の大きい方)から消費されていきます。
以下は、2本のUSBメモリの優先度が同じなので、ラウンドロビンで均等に割り当てられます。
なお、数値の高いものから消費されていきます。

例1

USBメモリを均等に消費(0 > -1)。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.7G        6.2G        201M        595M        1.3G        653M
Swap:          9.8G        7.3M        9.8G
$ swapon -s
Filename                Type        Size    Used    Priority
/dev/sdc1                               partition   982012  3852    0
/dev/sdb1                               partition   982012  3596    0
/dev/sda5                               partition   8297468 0   -1

例2

優先度の高いUSBメモリから消費(1 > 0 > -1)。

$ swapon -s
Filename                Type        Size    Used    Priority
/dev/sdc1                               partition   982012  284168  0
/dev/sdb1                               partition   982012  978896  1
/dev/sda5                               partition   8297468 0   -1
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.7G        5.8G        756M        526M        1.2G        1.1G
Swap:          9.8G        1.2G        8.6G