次の方法で共有


Linux VM の再起動後にスワップ ファイルが再作成されない

適用対象: ✔️ Linux VM

元の KB 番号: 4577868

Note

この記事で参照されている CentOS は Linux ディストリビューションであり、EOL (End Of Life) に到達します。 適宜、使用と計画を検討してください。 詳細については、「 CentOS End Of Life ガイダンスを参照してください。

この記事では、Linux 仮想マシンの再起動後にスワップ ファイルを再作成できない問題を解決します。

現象

cloud-init によってプロビジョニングされ、Microsoft Azure Linux Agent (waagent)がインストールされている Linux 仮想マシン (VM) では、再起動後にスワップ ファイルが再作成されないことがあります。

原因

この問題は、Azure Linux エージェントと cloud-init の両方がスワップ ファイルの構成を試みる原因となる構成が間違っているために発生します。 cloud-init がプロビジョニングを担当する場合は、スワップ ファイルを cloud-init によって構成して、プロビジョニング用に 1 つのエージェント (cloud-init または waagent) のみを有効にする必要があります。 waagent デーモンが起動するタイミングが原因で、この問題が断続的に発生する可能性があります。

解決方法

この問題を解決するには、次の手順に従ってください。

  1. このタスクは Cloud-Init によって処理されるようになったため、waagent 構成 /etc/waagent.conf 内でリソース ディスクの書式設定とスワップ構成を無効にします。 パラメーターを次のように編集します。

    # Format if unformatted. If 'n', resource disk will not be mounted.
    ResourceDisk.Format=n
    
    # Create and use swapfile on resource disk.
    ResourceDisk.EnableSwap=n
    
    #Mount point for the resource disk
    ResourceDisk.MountPoint=/mnt
    
    #Size of the swapfile.
    ResourceDisk.SwapSizeMB=0
    
  2. Azure Linux エージェントを再起動します。 さまざまな Linux ディストリビューションの再起動コマンドについては、「 VM 上の Azure Linux エージェントを更新する方法 」を参照してください。

  3. cloud-init を使用してスワップ ファイルを作成するように VM が構成されていることを確認します。

    1. 次のコマンドを使用してスクリプト /var/lib/cloud/scripts/per-boot/create_swapfile.sh を作成します。

      #!/bin/sh
      if [ ! -f '/mnt/swapfile' ]; then
      fallocate --length 2GiB /mnt/swapfile
      chmod 600 /mnt/swapfile
      mkswap /mnt/swapfile
      swapon /mnt/swapfile
      swapon -a 
      else
      swapon /mnt/swapfile; fi
      

      場合によっては、 fallocate コマンドでスワップ ファイルが正しく作成されない場合があります。 スワップ ファイルが正しく作成されていない場合は、次の代替スクリプトを使用できます。

      dd if=/dev/zero of=/mnt/swapfile bs=1M count=2048
      
    2. # chmod +x create_swapfile.sh コマンドを使用して、ファイルを実行可能にします。

    3. VM を停止して起動するか、ポータルから再デプロイし、スワップの有効化を確認します。 スワップ機能を有効にする方法の例を次に示します。

      root@ub1804-ephemeral:/var/lib/cloud/scripts/per-boot# free -m 
      total used free shared buff/cache available 
      Mem: 7953 296 7384 0 272 7412 
      Swap: 2047 0 2047
      

問題を特定するには、再起動の時間枠の /var/log/waagent.log/var/log/cloud-init.log からログを比較します。

この状況を完全に回避するには、プロビジョニング中にスワップ構成のカスタム データを使用して VM をデプロイします。

cloud-init を使用して Linux VM 上のスワップ パーティションを構成する

この記事では、cloud-init を使用してさまざまな Linux ディストリビューションのスワップ パーティションを構成する方法を示します。 従来、スワップ パーティションはそれを必要とするディストリビューションに基づいて Linux エージェント (WALA) によって構成されました。 このドキュメントでは、cloud-init を使用したプロビジョニング時にスワップ パーティションをオンデマンドで構築するプロセスを概説します。 cloud-init が Azure およびサポートされている Linux ディストリビューションでネイティブに動作する方法の詳細については、cloud-init の概要に関するページをご覧ください

Ubuntu ベースのイメージ用のスワップ パーティションを作成する

既定では、Azure では Ubuntu ギャラリー イメージはスワップ パーティションを作成しません。 cloud-init を使用して VM のプロビジョニング中にスワップ パーティション構成を有効にするには、Ubuntu wiki 上の AzureSwapPartitions に関するドキュメントをご覧ください。

Red Hat および CentOS ベースのイメージ用のスワップ パーティションを作成する

現在のシェルで、cloud_init_swappart.txt という名前のファイルを作成し、次の構成を貼り付けます。 この例では、ローカル コンピューター上にない Cloud Shell でファイルを作成します。 任意のエディターを使用することができます。 sensible-editor cloud_init_swappart.txt を入力し、ファイルを作成して使用可能なエディターの一覧を確認します。 nano エディターを使用するには #1 を選びます。 cloud-init ファイル全体 (特に最初の行) が正しくコピーされたことを確認してください。

#cloud-config
disk_setup:
  ephemeral0:
    table_type: gpt
    layout: [66, [33,82]]
    overwrite: true
fs_setup:
  - device: ephemeral0.1
    filesystem: ext4
  - device: ephemeral0.2
    filesystem: swap
mounts:
  - ["ephemeral0.1", "/mnt"]
  - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]

マウントが正常に完了しなかった場合でもブートが続行されるように、 nofail オプションを使用してマウントが作成されます。

このイメージをデプロイする前に、az group create コマンドを使用してリソース グループを作成する必要があります。 Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。 次の例では、myResourceGroup という名前のリソース グループを eastus に作成します。

az group create --name myResourceGroup --location eastus

ここで、az vm create で VM を作成し、次のように --custom-data cloud_init_swappart.txt で cloud-init ファイルを指定します。

az vm create \
  --resource-group myResourceGroup \
  --name centos74 \
  --image OpenLogic:CentOS:7-CI:latest \
  --custom-data cloud_init_swappart.txt \
  --generate-ssh-keys 

スワップ パーティションが作成されたことを確認する

前述のコマンドからの出力に示すように、VM のパブリック IP アドレスに SSH 接続します。 実際の publicIpAddress を次のように入力します。

ssh <publicIpAddress>

VM に SSH 接続したら、スワップ パーティションが作成されたかどうかを確認します

swapon -s

このコマンドからの出力は、次のようになります。

Filename                Type        Size    Used    Priority
/dev/sdb2  partition   2494440 0   -1

注意

スワップ パーティションが構成された既存の Azure イメージがあり、新しいイメージのスワップ パーティション構成を変更する場合は、既存のスワップ パーティションを削除する必要があります。 詳細については、「 customize Images to provision by cloud-init」を参照してください。

次のステップ

構成変更の cloud-init の他の例については、以下をご覧ください。

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。