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 でセキュアブートを無効にしておきます。

esxi-vm-secureboot-off.png

 

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 の「仮想マシンの監視」の動作確認に使用したりできます。

guest-sysrq-crash.png

 

以上、Photon OS 2.0 で マジック SysRq キーを利用できるようにしてみる話でした。