Photon OS 2.0 では、SysRq キーが無効にされているようです。
root@vm06 [ ~ ]# cat /etc/photon-release
VMware Photon OS 2.0
PHOTON_BUILD_NUMBER=304b817
root@vm06 [ ~ ]# grep CONFIG_MAGIC_SYSRQ /boot/config-*-esx
# CONFIG_MAGIC_SYSRQ is not set
Photon OS を マジック SysRq キーでハングさせたいことがあったので、
今回は SRPM を利用して、Kernel の RPM をビルドしてみようと思います。
(vSphere HA の動作確認で使用しようかなと・・・)
Photon OS の Source RPM ファイル(SRPM)は、下記のあたりからダウンロードできます。
※rpm ファイルのリストが表示されるまで時間がかかることがあります。
https://bintray.com/vmware/photon_srpms_2.0_x86_64/packages#files
ビルドで必要な RPM のインストール。
依存関係があったり、ビルドに必要だったりする RPM を、
あらかじめインストールしておきます。今回は Kernel なので特に多いです。
spec ファイルに記載された依存 RPM だけでは不足していて、エラーになります。
※長いので RPM ごとにエスケープで改行していますが、tdnf install は1行で実行できます。
※RPM の記載順序には、特に意味はありません。
tdnf install -y \
rpm-build \
Linux-PAM-devel \
glib-devel \
kbd \
kmod-devel \
libdnet-devel \
libmspack-devel \
openssl-devel \
procps-ng-devel \
xerces-c-devel \
xml-security-c-devel \
tar \
patch \
make \
gcc \
glibc-devel \
linux-api-headers \
binutils \
diffutils \
elfutils
SRPM のダウンロードと展開。
まず SRPM をダウンロードします。
root@vm06 [ ~ ]# curl -L https://bintray.com/vmware/photon_srpms_2.0_x86_64/download_file?file_path=linux-esx-4.9.60-1.ph2.src.rpm -o linux-esx-4.9.60-1.ph2.src.rpm
root@vm06 [ ~ ]# ls -l linux-esx-4.9.60-1.ph2.src.rpm
-rw-r----- 1 root root 93291006 Nov 21 14:20 linux-esx-4.9.60-1.ph2.src.rpm
今回は、Kernel なので この SRPM を使用します。
Photon OS 2.0 GA 同梱の RPM より ひとつ新しいバージョンがリリースされていたので
それを利用します。
root@vm06 [ ~ ]# rpm -qpi linux-esx-4.9.60-1.ph2.src.rpm
Name : linux-esx
Version : 4.9.60
Release : 1.ph2
Architecture: x86_64
Install Date: (not installed)
Group : System Environment/Kernel
Size : 93363301
License : GPLv2
Signature : RSA/SHA1, Thu 09 Nov 2017 05:44:26 AM UTC, Key ID c0b5e0ab66fd4949
Source RPM : (none)
Build Date : Thu 09 Nov 2017 04:00:50 AM UTC
Build Host : photon-d2dd6bc2fb2e
Relocations : (not relocatable)
Vendor : VMware, Inc.
URL : http://www.kernel.org/
Summary : Kernel
Description :
The Linux kernel build for GOS for VMware hypervisor.
RPM をビルドする Photon OS に、SRPM をインストールします。
いろいろ RPM を追加するので、ビルドした Kernel をインストールするゲストとは別に、
ビルド用のゲストを用意したほうがよいと思います。
root@vm06 [ ~ ]# rpm -ivh linux-esx-4.9.60-1.ph2.src.rpm
/usr/src/photon ディレクトリ配下に、ソースと .spec ファイルが展開されます。
root ではない OS ユーザ(今回は gowatana)でビルドしようと思うので、
/usr/src/photon から下のファイルの所有者を変更してしまいます。
root@vm06 [ ~ ]# chown -R gowatana:users /usr/src/photon
root@vm06 [ ~ ]# ls -l /usr/src/photon
total 8
drwxr-x--- 2 gowatana users 4096 Nov 21 14:24 SOURCES
drwxr-x--- 2 gowatana users 4096 Nov 21 14:24 SPECS
root@vm06 [ ~ ]# su - gowatana
gowatana [ ~ ]$
ソースのカスタマイズ。
ファイルを編集して、MAGIC_SYSRQ を有効にします。
今回は、patch などは作成せず、直接ファイルを編集してしまいます。
gowatana [ ~ ]$ cp /usr/src/photon/SOURCES/config-esx config-esx.orig
gowatana [ ~ ]$ vi /usr/src/photon/SOURCES/config-esx
gowatana [ ~ ]$ diff config-esx.orig /usr/src/photon/SOURCES/config-esx
2895c2895,2896
< # CONFIG_MAGIC_SYSRQ is not set
---
> CONFIG_MAGIC_SYSRQ=yes
> CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
gowatana [ ~ ]$
インストールするときに正式な RPM と衝突しないように、
今回はパッケージの名前を linux-esx-custom に変更してしまいます。
gowatana [ ~ ]$ cp /usr/src/photon/SPECS/linux-esx.spec linux-esx.spec.orig
gowatana [ ~ ]$ vi /usr/src/photon/SPECS/linux-esx.spec
gowatana [ ~ ]$ diff linux-esx.spec.orig /usr/src/photon/SPECS/linux-esx.spec
3c3
< Name: linux-esx
---
> Name: linux-esx-custom
gowatana [ ~ ]$
RPM のビルド。
RPM をビルドします。
gowatana [ ~ ]$ rpmbuild -ba /usr/src/photon/SPECS/linux-esx.spec
しばらく待つと、rpm ファイルが生成されます。
gowatana [ ~ ]$ ls -l /usr/src/photon/RPMS/x86_64/
total 231576
-rw-r----- 1 gowatana users 8091691 Nov 21 15:09 linux-esx-custom-4.9.60-1.x86_64.rpm
-rw-r----- 1 gowatana users 210508901 Nov 21 15:14 linux-esx-custom-debuginfo-4.9.60-1.x86_64.rpm
-rw-r----- 1 gowatana users 10952427 Nov 21 15:09 linux-esx-custom-devel-4.9.60-1.x86_64.rpm
-rw-r----- 1 gowatana users 7574551 Nov 21 15:09 linux-esx-custom-docs-4.9.60-1.x86_64.rpm
作成した RPM のインストール。
ビルドした RPM をインストールしてみます。
root@vm02 [ ~ ]# rpm -qa | grep linux-esx
linux-esx-4.9.53-5.ph2.x86_64
root@vm02 [ ~ ]# uname -r
4.9.53-5.ph2-esx
インストールします。
(ビルドで使用したサーバとは別のサーバにインストールしています)
root@vm02 [ ~ ]# ls -lh linux-esx-custom-4.9.60-1.x86_64.rpm
-rw-r----- 1 root root 7.8M Nov 21 15:19 linux-esx-custom-4.9.60-1.x86_64.rpm
root@vm02 [ ~ ]# rpm -ivh linux-esx-custom-4.9.60-1.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:linux-esx-custom-4.9.60-1 ################################# [100%]
root@vm02 [ ~ ]# rpm -qa | grep linux-esx
linux-esx-custom-4.9.60-1.x86_64
linux-esx-4.9.53-5.ph2.x86_64
カーネルパラメータでの sysrq 有効化。
カーネルのオプションだけでは、sysrq キーは有効になっていません。
さらに、sysctl で kernel.sysrq = 1 を設定する必要があります。
root@vm02 [ ~ ]# sysctl -a | grep sysrq
kernel.sysrq = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
root@vm02 [ ~ ]#
これは、systemd の RPM に含まれる
50-security-hardening.conf ファイルの設定で無効化(kernel.sysrq=0)されているので、
root@vm02 [ ~ ]# cat /etc/sysctl.d/50-security-hardening.conf
#Enabling the strongest form of native Linux Address Space Layout Randomization (ASLR).
kernel.randomize_va_space=2
#Restrict revealing kernel addresses
kernel.kptr_restrict=2
#Preventing non-root users from viewing the kernel ring buffer.
kernel.dmesg_restrict = 1
# To avoid potential information disclosure
net.ipv4.tcp_timestamps = 0
# disabling an unused feature
kernel.sysrq=0
root@vm02 [ ~ ]# rpm -qf /etc/sysctl.d/50-security-hardening.conf
systemd-233-9.ph2.x86_64
ファイルを編集してしまいまいます。
root@vm02 [ ~ ]# sed -i "s/kernel.sysrq=0/kernel.sysrq=1/" /etc/sysctl.d/50-security-hardening.conf
root@vm02 [ ~ ]# grep kernel.sysrq /etc/sysctl.d/50-security-hardening.conf
kernel.sysrq=1
sysctl の /etc/sysctl.conf ファイルがデフォルトでは作成されないので、
ファイルが含まれる distrib-compat をインストールしておくと、
sysctl コマンドのエラーがなくなります。
※実際はただファイル作成しても大丈夫です。
root@vm06 [ ~ ]# sysctl -p
sysctl: cannot open "/etc/sysctl.conf": No such file or directory
root@vm06 [ ~ ]# yum install -y distrib-compat
root@vm06 [ ~ ]# sysctl -p
root@vm06 [ ~ ]#
OS を再起動します。
※このあと EFI セキュアブートを無効にするので、シャットダウンでもよいです。
root@vm02 [ ~ ]# reboot
VM での IEF セキュアブート無効化。
OVA 版の Photon OS 2.0 だと、EFI のセキュアブートが有効で、
今回作成したカーネルの RPM がひっかかってしまうはずです。
ということで、今回は VM でセキュアブートを無効にしておきます。
sysrq キー有効化の確認。
OS を再起動すると、新しいカーネルを読み込まれていて、
さらに kernel.sysrq = 1 が設定されています。
root@vm02 [ ~ ]# uname -r
4.9.60-1-esx
root@vm02 [ ~ ]# sysctl -a | grep sysrq
kernel.sysrq = 1
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
root@vm02 [ ~ ]# cat /proc/sys/kernel/sysrq
1
OS をクラッシュさせたりできるようになりました。
root@vm02 [ ~ ]# echo c > /proc/sysrq-trigger
たとえば、vSphere HA の「仮想マシンの監視」の動作確認に使用したりできます。
以上、Photon OS 2.0 で マジック SysRq キーを利用できるようにしてみる話でした。