「SELinux ポリシーを読み込めません。フリーズしています」というエラーメッセージが表示され、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを起動できません。
簡単な説明
Amazon EC2 Linux インスタンスが起動に失敗し、Amazon EC2 Linux コンソールにエラーメッセージが表示されます。このエラーは、インスタンスが Security-Enhanced Linux (SELinux) ポリシーを読み込めなかったことを示しています。エラーの原因には、SELinux 設定のミス、SELinux ポリシーファイルの破損または欠落などがあります。
解決策
SELinux ポリシーのフリーズからインスタンスを回復するには、次のオプションのいずれかを選択します。
- 最新のスナップショットからインスタンスのルートボリュームを復元する。
- レスキューインスタンスを使用して SELinux ポリシー設定を再作成または変更する。
最新のスナップショットからインスタンスのルートボリュームを復元する
Amazon Elastic Block Store (Amazon EBS) のルートボリュームスナップショットがある場合は、ルートボリュームを以前の動作していた状態に復元できます。詳細については、「Amazon EC2 インスタンスのルートボリュームを停止せずに置き換える」を参照してください。注: この方法では、スナップショットの作成後に追加されたデータが失われます。
レスキューインスタンスを使用して SELinux ポリシー設定を再作成または変更する
レスキューインスタンスを使用して SELinux 設定を再作成または変更するには、以下の手順を実行します。
- レスキューインスタンスまたは一時インスタンスを起動します。機能していないインスタンスの Amazon マシンイメージ (AMI) を使用して、仮想プライベートクラウド (VPC) で新しい EC2 Linux インスタンスを起動します。新しいインスタンスは、機能していないインスタンスと同じアベイラビリティーゾーンにある必要があります。新しいインスタンスがレスキューインスタンスになります。機能していないインスタンスと同じアベイラビリティーゾーンにある既存のインスタンスを使用することもできます。
- Amazon Elastic Block Store (Amazon EBS) のルートボリュームを、機能していないインスタンスからデタッチします。後で使用できるように、デバイス名 (/dev/xvda または /dev/sda1) および、ボリューム ID (vol- で始まる) を書き留めておきます。
- EBS ボリュームを /dev/sdf などのセカンダリデバイスとして、レスキューインスタンスにアタッチします。
- Secure Shell (SSH) または AWS Systems Manager (SSM) セッションマネージャーを使用してレスキューインスタンスに接続します。ルートパーティションのデバイス名を特定するには、lsblk コマンドを実行します。
sudo -i
lsblk -o +PARTLABEL,LABEL,SERIAL | sed 's/vol/vol-/'
注: ルートパーティションには / というラベルと、Linux というパーツラベルがあります。複数のエントリがある場合は、ボリューム ID を使用して問題のあるインスタンスのルートボリュームを区別します。
ルートファイルシステムをマウントする
一時的なマウントポイント (たとえば、/mnt/rescue) を作成します。アタッチされたボリュームからルートファイルシステムをマウントするには、次のコマンドを実行します。
mkdir -p /mnt/rescue
mount -o nouuid /dev/device-name /mnt/rescue
注: device-name は、前のステップで特定したルートパーティションのデバイス名に置き換えます。
chroot を使用してルートディレクトリを変更するには、次のコマンドを実行します。
for i in proc sys dev run; do mount --bind /$i /mnt/rescue/$i; done
chroot /mnt/rescue
注: この例では、/dev、/proc、/sys、/run ディレクトリが、元のルートファイルシステムからバインドマウントされています。この設定により、chroot 環境内で実行されるプロセスがこれらのシステムディレクトリにアクセスできるようになります。
SELinux ポリシーの設定を解決する
SELinux ポリシーを再作成するには、次のコマンドを実行します。
semodule -B
SELinux を非アクティブ化するには、次のコマンドを実行します。
sed -i -E 's/^SELINUX=(permissive|enforcing)/SELINUX=disabled/' /etc/selinux/config
レスキューインスタンスからボリュームをマウント解除して再アタッチする
- chroot 環境を終了してボリュームをマウント解除するには、次のコマンドを実行します。
exit
umount /mnt/rescue/{proc,sys,dev,run,}
注: /mnt/rescue: ターゲットがビジー状態の場合は、-l オプション (たとえば、umount -l /mnt/rescue) を使用して強制的にデタッチします。
- レスキューインスタンスからボリュームをデタッチします。次に、そのボリュームをルートボリューム (デバイス名は /dev/xvda または /dev/sda1) として元のインスタンスに再アタッチします。
- 元のインスタンスを起動し、起動の問題が解決したことを確認します。
SELinux ポリシーをバックアップしてテストする
SELinux ポリシーファイルでは、以下の手順を実行するのがベストプラクティスです。
-
変更する前に、動作している SELinux ポリシーをバックアップしてください。
ポリシーをバックアップするには、次の tar コマンドを実行します。
tar -czvf selinux-policy-store-backup.tar.gz /etc/selinux/targeted/policy/
-
本番環境以外で変更をテストします。
関連情報
システムを起動できません: SELinux ポリシーを読み込めません。フリーズしています (Red Hat のウェブサイト)
SELinux ユーザーと管理者向けガイド Red Hat ドキュメンテーション (Red Hat のウェブサイト)