スワップ領域のサイズが足りなくなった場合等にサイズを追加する方法です。
swap用領域の作成
まずはswap領域として使用するためのファイルを作成します。
ファイルの作成には下記のような方法がありますが、ファイルシステムが「xfs」の場合は「fallocate」を使ってファイルを作成するとswapファイルを追加する際にエラー(Invalid argument)が発生してしまうので、「dd」コマンドでファイルを作成してください。
# dd if=/dev/zero of=作成ファイル bs=ブロックサイズ count=ブロック数 # fallocate -l サイズ 作成ファイル
今回はファイルシステムが「xfs」のCentOS7でswap領域を追加していくので、「dd」コマンドを使用してサイズが2Gの「/swap_ext1」というファイルを作成します。
# cd / # dd if=/dev/zero of=swap_ext1 bs=1M count=2048 2048+0 records in 2048+0 records out 2147483648 bytes (2.1 GB) copied, 1.70512 s, 1.3 GB/s
ファイルが作成されていることを確認します。
# ls -lah swap_ext1 -rw-r--r-- 1 root root 2.0G Nov 24 11:49 swap_ext1
ちなみに「fallocate」コマンドを使用して同様のファイルを作成する場合は下記のようになります。
fallocate -l 2G swap_ext1
パーミッション設定
セキュリティを考慮して作成したファイルのパーミッションを600へ変更します。
# chmod 600 swap_ext1
swap用ファイルに変換
作成したファイルは「mkswap」コマンドでswap領域として使用できるファイルに変換します。
# mkswap スワップファイル
実際に作成したファイルを「mkswap」コマンドでswap用に変換していきます。
# mkswap swap_ext1 Setting up swapspace version 1, size = 2097148 KiB no label, UUID=b65c8b1e-5177-4db6-ae53-f9f98d0bcd67
swap領域の追加
作成したswap領域用のファイルは、「swapon」コマンドでswap領域に追加することが出来ます。
# swapon スワップ領域用ファイル
「mkswap」コマンドでswap領域用ファイルに変換したものを「swapon」でswap領域に追加していきます。
# swapon swap_ext1
swap領域追加の確認
swap領域が追加されたを確認するには下記の方法があります。
- 「free」コマンドを実行
- 「swapon -s」コマンドを実行
- 「/proc/swaps」ファイルを確認
freeコマンド
「free」コマンドを実行すると、物理メモリ(Mem)とswap(Swap)のサイズ(total)と使用量(used)空き容量(free)等が表示されます。
Swapのtotal部分を確認することで、領域が追加されているか確認することができます。
# free total used free shared buff/cache available Mem: 997924 229124 65324 7852 703476 588676 Swap: 4194296 0 4194296
swapon -sコマンド
「swapon -s」コマンドを実行すると、swap領域の名前や種類、サイズ、使用量、優先順位等の情報が表示されますので、追加した領域が表示されていることを確認してください。
# swapon -s Filename Type Size Used Priority /swap_ext1 file 2097148 0 -2 /dev/dm-1 partition 2097148 7872 -1
「/proc/swaps」ファイルを確認
「swapon -s」コマンドと同等の情報が表示されるので、こちらの場合も追加したswap用ファイルが記述されているか確認してください。
# cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 2097148 0 -1 /swap_ext1 file 2097148 0 -2
自動マウント設定
手動でswap領域を追加することができたら、次にサーバを再起動する度に手動で「swapon」コマンドを実行する必要が無いように、「/etc/fstab」を編集して自動でswap領域として追加されるようにしていきます。
# cp -p /etc/fstab /etc/fstab_yyyymmdd # vi /etc/fstab
今回は追加するswap領域のファイル名が「/swap_ext1」なので、下記の内容を「/etc/fstab」に追記します。(ファイル名は環境にあわせて適宜読み替えてください)
/swap_ext1 swap swap defaults 0 0
追加後にサーバを再起動して、スワップ領域が追加されていることを確認しておいてください。
追加したswap領域の無効化方法
何らかの理由で追加したswap領域を無効化したい場合は、「swapoff」コマンドを使用します。
swapoff ファイル名
今回追加した「/swap_ext1」という領域を無効化する場合は、下記のようになります。
# swapoff /swap_ext1
無効化されたかどうかは「swapon -s」や「free」コマンドで確認するか、「/proc/swaps」のファイルを確認してください。
恒久的に無効化するのであれば、「/etc/fstab」からも追加した設定を削除するのを忘れないでください。
fallocateでファイルを作成するとエラーになる
「xfs」なファイルシステム上で「fallocate」を使って、追加swap用ファイルを作成した際にエラーとなった話です。
「df」コマンドでファイルシステムを確認すると、「/」のファイルシステムが「xfs」であることがわります。
# df -T Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/mapper/centos-root xfs 17811456 4019240 13792216 23% / devtmpfs devtmpfs 486924 0 486924 0% /dev tmpfs tmpfs 498960 0 498960 0% /dev/shm tmpfs tmpfs 498960 7844 491116 2% /run tmpfs tmpfs 498960 0 498960 0% /sys/fs/cgroup /dev/sda1 xfs 1038336 193348 844988 19% /boot tmpfs tmpfs 99796 0 99796 0% /run/user/1000 tmpfs tmpfs 99796 0 99796 0% /run/user/0
「fallocate」で「/swap_ext2」というswap領域用ファイルを作成して、「mkswap」の後に「swapon」でswap領域を追加を行ったのですが、「swapon failed: Invalid argument」とエラーになってしまいます。
# fallocate -l 2g /swap_ext2 # ls -lah /swap_ext2 -rw-r--r-- 1 root root 2.0G Nov 25 10:05 /swap_ext2 # chmod 600 /swap_ext2 # mkswap /swap_ext2 Setting up swapspace version 1, size = 2097148 KiB no label, UUID=3e66dde0-ab72-4596-9169-f18339095a5e # swapon /swap_ext2 swapon: /swap_ext2: swapon failed: Invalid argument
ということで、「xfs」なファイルシステムでswap領域用ファイルを作成する場合は「fallocate」コマンドは使用しないようにしましょう。
ですので、「xfs」ファイルシステムの場合は「dd」コマンドを使用してファイルを作成するようにしましょう。
# dd if=/dev/zero of=作成ファイル bs=ブロックサイズ count=ブロック数
作成例としては下記のようになります。
# dd if=/dev/zero of=/swap_ext1 bs=1M count=2048
これでサイズが2GBの「/swap_ext1」というファイルが作成されます。(ファイルのサイズやファイル名は適宜変更してください)
swapfile has holes
「swapon failed: Invalid argument」エラーが発生した際に「/var/log/messges」を確認すると下記のログを見つけることが出来ました。
Nov 25 10:06:27 localhost kernel: swapon: swapfile has holes
xfsファイルシステム上では「fallocate」を使用して作成されたファイルはスパ―スファイルとみなされているようです。
ext4ファイルシステムで確認
検証用に「ext4」フォーマットしたHDDを追加して、そこに「fallocate」でswap領域用ファイルを作成してエラーが発生しないか確認してみました。
ファイルシステムの確認
今回追加したHDD「/dev/sdb1」のファイルシステムが「ext4」であることを確認します。
# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/centos-root xfs 17G 7.9G 9.2G 47% / devtmpfs devtmpfs 476M 0 476M 0% /dev tmpfs tmpfs 488M 0 488M 0% /dev/shm tmpfs tmpfs 488M 7.7M 480M 2% /run tmpfs tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sdb1 ext4 9.8G 2.1G 7.2G 23% /ext_hdd1 /dev/sda1 xfs 1014M 189M 826M 19% /boot tmpfs tmpfs 98M 0 98M 0% /run/user/1000
swap領域の追加
ファイルシステムが「ext4」の場合は「fallocate」コマンドでファイルを作成し、swap領域として追加してみましたが「Invalid argument」なエラーは発生しませんでした。
# fallocate -l 2G /ext_hdd1/swap_ext2 # ls -lh /ext_hdd1/swap_ext2 -rw-r--r-- 1 root root 2.0G Nov 26 16:14 /ext_hdd1/swap_ext2 # mkswap /ext_hdd1/swap_ext2 Setting up swapspace version 1, size = 2097148 KiB no label, UUID=89a19a54-42c9-4847-a482-1971c388fa95 # chmod 600 /ext_hdd1/swap_ext2 # swapon /ext_hdd1/swap_ext2
「swapon -s」コマンドでswapの状況を確認してみましたが、問題なく作成した領域が追加されていることが確認できました。
# swapon -s Filename Type Size Used Priority /dev/dm-1 partition 2097148 0 -1 /ext_hdd1/swap_ext2 file 2097148 0 -2
同じ「fallocate」コマンドで作成しても「ext4」と「xfs」で結果が異なるのは、ファイルシステムの仕様なのですかね。
コメント