外部媒体に移動したスワップ領域を起動時にマウントする

以前、「Ubuntu で一時的にスワップをオフにする」で、モバイルPC"VersaPro(VY12M/C-3)"のスワップ領域をUSBメモリに退避させました。
3週間程度使ってみたところ、スワップ領域の消費は最大1.5GB程度で推移しています。

USBメモリでもHDDと比較して効果が実感できたため、SDカード上に移動することにしました。
モバイルPCという性格上、でっぱり部分はできるだけ無くしたいので。

SDカード上にスワップ領域を作成

今回は、Class 4のmicroSDカードを利用しました。
※クラスなどの詳細については「SD規格の簡単まとめ」をご参照ください

ディスクのデバイス名を確認します。

partedコマンドを使います。

$ sudo parted
GNU Parted 3.2
/dev/sda を使用
GNU Parted へようこそ! コマンド一覧を見るには 'help' と入力してください。

(parted) print list
モデル: ATA TOSHIBA MK8032GS (scsi)
ディスク /dev/sda: 80.0GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos


モデル: BUFFALO USB Flash Disk (scsi)
ディスク /dev/sdb: 1007MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1007MB  1006MB  primary  linux-swap(v1)


モデル: BUFFALO USB Flash Disk (scsi)
ディスク /dev/sdc: 1007MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  1007MB  1006MB  primary  linux-swap(v1)


モデル: ATA Hitachi XXM2.1.0 (scsi)
ディスク /dev/sdd: 32.0MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  31.5MB  30.4MB  primary  fat16             lba


モデル: Generic- Multi-Card (scsi)
ディスク /dev/sde: 7948MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:

番号  開始    終了    サイズ  タイプ   ファイルシステム  フラグ
 1    1049kB  7948MB  7947MB  primary  linux-swap(v1)

(parted) quit

上記コマンド[parted]-[print list]で、対象のmicroSDが「/dev/sde」だと分かったので、データ領域とスワップ領域に分割します。

SDカード上にスワップ領域を作成

予定通り、2GBのスワップ領域を作成します。
※全体の容量8GBを2GBと6GBに分割します

partedコマンド簡易説明
n : 領域確保
p : 基本パーティションに指定 ・ e : 論理パーティションに指定
w : 書き込み(変更を適用)

$ sudo fdisk /dev/sde

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


コマンド (m でヘルプ): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
パーティション番号 (1-4, default 1):
First sector (2048-15523839, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-15523839, default 15523839): 3880440

Created a new partition 1 of type 'Linux' and of size 1.9 GiB.

コマンド (m でヘルプ): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
パーティション番号 (2-4, default 2):
First sector (3880441-15523839, default 3880960):
Last sector, +sectors or +size{K,M,G,T,P} (3880960-15523839, default 15523839):

Created a new partition 2 of type 'Linux' and of size 5.6 GiB.

コマンド (m でヘルプ): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

スワップ領域を定義する

上記処理では領域が分割されただけで、ファイルシステムの定義やフォーマットが完了していません。
今回は、GUIアプリケーションのGparted上で"linux swap"で作成しました。
なお、6GBはWindows・Android端末でも使うので、FAT32でフォーマットしました。

起動時に有効になるように設定する

UUIDに対応するパーティションを確認する

blkidコマンドで、スワップパーティションのUUIDを確認します。

$ sudo blkid
[sudo] link のパスワード:
/dev/sda1: UUID="e08a850b-13b9-43f5-a379-a9ad3608cfea" TYPE="ext4" PARTUUID="bef9c299-01"
/dev/sda5: UUID="62475fb4-027c-4623-930d-f9a0b65bd0ce" TYPE="swap" PARTUUID="bef9c299-05"
/dev/mmcblk0p1: UUID="c9bfe5b8-1836-4711-938a-3f7eaa335f24" TYPE="swap" PARTUUID="a1086e1c-01"
/dev/mmcblk0p2: LABEL="mSDc4_8(6)G" UUID="D291-B29C" TYPE="vfat" PARTUUID="a1086e1c-02"
/dev/mmcblk0: PTUUID="a1086e1c" PTTYPE="dos"

TYPE="swap"の行がスワップパーティションです。
※UUID="c9bfe5b8-1836-4711-938a-3f7eaa335f24"

fstabを編集する

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

ベタですが、コピーします。

$ sudo cp /etc/fstab /etc/fstab_org20180309

fstabを編集

ディスクパーティションやブロックデバイス、リモートディレクトリなどを起動時に自動マウントする"fstab"を編集します。

編集例

SDカード上のスワップ領域の有効かに併せて、元々あるHDDスワップ領域"/dev/sda5"も無効化します。

$ diff /etc/fstab_org20180309 /etc/fstab
11c11,13
< UUID=62475fb4-027c-4623-930d-f9a0b65bd0ce none            swap    sw              0       0
---
> #UUID=62475fb4-027c-4623-930d-f9a0b65bd0ce none            swap    sw              0       0
> # swap was on /dev/sde during installation
> UUID=c9bfe5b8-1836-4711-938a-3f7eaa335f24 none            swap    sw   0   0
$ diff -u /etc/fstab_org20180309 /etc/fstab
--- /etc/fstab_org20180309  2018-03-09 20:35:54.127127831 +0900
+++ /etc/fstab  2018-03-09 20:38:08.018826290 +0900
@@ -8,4 +8,6 @@
 # / was on /dev/sda1 during installation
 UUID=e08a850b-13b9-43f5-a379-a9ad3608cfea /               ext4    errors=remount-ro 0       1
 # swap was on /dev/sda5 during installation
-UUID=62475fb4-027c-4623-930d-f9a0b65bd0ce none            swap    sw              0       0
+#UUID=62475fb4-027c-4623-930d-f9a0b65bd0ce none            swap    sw              0       0
+# swap was on /dev/sde during installation
+UUID=c9bfe5b8-1836-4711-938a-3f7eaa335f24 none            swap    sw   0   0

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

おまけ

手動の場合

自動マウントではなく手動でマウントする場合、シェルを用意しておいた方が楽です。

スワップの有効化
$ cat swapon.sh
swapon /dev/mmcblk0p1

$ ls -lh swapon.sh
-rw-rw-r-- 1 link link 16  3月  9 20:43 swapon.sh
$ sudo chmod 0755 swapon.sh

$ sudo sh swapon.sh

※実行権限が必要です

スワップの無効化(開放)
$ cat swapoff.sh
swapoff /dev/mmcblk0p1

$ ls -lh swapoff.sh
-rw-rw-r-- 1 link link 24  3月  9 20:47 swapoff.sh
$ chmod 0755 swapoff.sh

$ sudo sh swapoff.sh

※実行権限が必要です